<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Microsoft | AkitaOnRails.com</title><link>https://akitaonrails.github.io/tags/microsoft/</link><description>Blog do Fabio Akita do Canal do YouTube 'Akitando' falando sobre tecnologia, carreira e coisas geek.</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Mon, 19 Oct 2026 23:20:48 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/tags/microsoft/index.xml" rel="self" type="application/rss+xml"/><item><title>Seu Windows pode estar Capado sem Você Saber. Cheque isto!!</title><link>https://akitaonrails.github.io/2025/05/21/seu-windows-pode-estar-capado-sem-voce-saber-cheque-isto/</link><guid isPermaLink="true">https://akitaonrails.github.io/2025/05/21/seu-windows-pode-estar-capado-sem-voce-saber-cheque-isto/</guid><pubDate>Wed, 21 May 2025 17:15:00 -0300</pubDate><description>&lt;p&gt;Eu normalmente não ligo de documentar sobre problemas bobos de Windows, mas este em particular me deixou irritado, então vou relatar a sequência de eventos. Mas já deixo o spoiler do final: abra Control Panel e Power Options no seu Windows e cheque se ele não está em &amp;ldquo;Power saver&amp;rdquo; mode. Tire desse lixo, deixe no mínimo em Balanced, mas se for PC Desktop suba pra &amp;ldquo;High Performance&amp;rdquo; ou &amp;ldquo;Ultimate Performance&amp;rdquo;. Depois me agradeça.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Eu normalmente não ligo de documentar sobre problemas bobos de Windows, mas este em particular me deixou irritado, então vou relatar a sequência de eventos. Mas já deixo o spoiler do final: abra Control Panel e Power Options no seu Windows e cheque se ele não está em &ldquo;Power saver&rdquo; mode. Tire desse lixo, deixe no mínimo em Balanced, mas se for PC Desktop suba pra &ldquo;High Performance&rdquo; ou &ldquo;Ultimate Performance&rdquo;. Depois me agradeça.</p>
<p>Agora senta que lá vem história.</p>
<p>Eu montei um PC até que razoável pra minha namorada: Intel i7 12th Gen de 8 cores, 32GB DDR4-2400, NVIDIA RTX 3090, placa-mãe MSI Edge z790, NVME e até coloquei um NAS Synology DS1621+ em rede 2.5Gbps - porque ela é criadora de conteúdo e tem MUITO video pra editar. Modéstia a parte, ficou bonito:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/a8c82k3ocnpu1jamxb9w0z1fx2cf" alt="pc branco"  loading="lazy" /></p>
<p>Tudo funcionou muito bem por bastante tempo, mas eventualmente, sem nenhum motivo aparente, tudo começou a parecer meio lento. Não totalmente lento, mas às vezes páginas web pareciam engasgar pra carregar. Clicava no menu Start do Windows e ele parecia dar umas travadas. Às vezes o Explorer travava e precisava ir no Task Manager e dar restart no processo manualmente. Várias coisas super inconvenientes mas que não dava nenhum &ldquo;erro&rdquo; explícito aparente. Só parecia &ldquo;estranho&rdquo;.</p>
<p>Eu sou usuário de Linux. Meu PC principal é Manjaro Linux. Só uso Windows nos meus mini-PC de games, exclusivamente pra rodar Steam e alguns emuladores. Eu evito ao máximo instalar qualquer coisa neles. Porque sei como é um saco diagnosticar Windows depois que algum programa estranho invade.</p>
<p>Fui olhar os suspeitos de sempre. Ela tinha instalado jogos pra fazer streaming, tipo Valorant, Genshin Impact e coisas assim. Eu sempre suspeito de anti-cheats, as porcarias do Riot Vanguard ou Easy ou VAC. Comecei desinstalando todos os games. Mas eu sempre acho que anti-cheat é que nem malware: uma vez instalado, nunca mais vai sair do sistema. Desinstalei tudo, mas continuou essa sensação de meio travando, meio lento, às vezes, intermitente.</p>
<p>Tentei os próximos suspeitos: software de periféricos, como os da Elgato, Logitech, Razr que instalam um monte de porcaria nas máquinas, e recentemente estava lendo sobre o malware que vinha em todos eles. Assistam este video do GamerNexus pra entender a casa de cartas que é toda a indústria de periféricos com RGB:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/H_O5JtBqODA"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Mesmo desinstalando todos, ainda mesmo comportamento: meio lento, meio travando, instável.</p>
<p>Vamos tentar ir mais a fundo, pra isso tem que instalar ferramentas como da <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns"target="_blank" rel="noopener">Sysinternals Autoruns</a> pra ver se tem alguma coisa iniciando (coisas escondidas no Registry por exemplo). Tentei desligar tudo que eu achava suspeito.</p>
<p>Nada. A essa altura também já tinha garantido que firmware de BIOS mais nova da MSI estava instalado. Chequei se nada tinha desligado na BIOS, XMP profile tava ok, nada de fast-boot e coisas assim.</p>
<h3>Será a Internet?<span class="hx:absolute hx:-mt-20" id="será-a-internet"></span>
    <a href="#ser%c3%a1-a-internet" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Como o uso maior é internet e ela parecia &ldquo;lenta&rdquo;, pensei que poderia ser problemas de rede. Roteador da Vivo? Plano? Wifi com interferência?</p>
<p>Ficando sem paciência resolvi ir nuclear na idéia de internet. De fato, abrindo a página da <a href="https://speed.cloudflare.com/"target="_blank" rel="noopener">Cloudflare Speed Test</a> eu via que a velocidade em si estava ok, mas a latência estava MUITO alta, jitter alto e, principalmente PACKET LOSS estava em mais de 15%. Não é normal isso, tem que ser 0%.</p>
<p>Aproveitei que fui pra Miami e já trouxe um roteador TP-LINK BE9300 pra Wi-fi 7, comprei uma placa PCIe de Wi-fi 7 compatível também. Desliguei o roteador de Wi-fi da Vivo e mandei subir o plano pra 800Mbps. E de fato, melhorou muito a internet:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/ogesvmtex2ek825hel7d4l0f5i30" alt="vivo internet"  loading="lazy" /></p>
<p>Latência caiu, jitter caiu, packet loss foi pra 0%.</p>
<p>Mas isso não resolveu o problema. Do nada o navegador dava umas pausas na hora de carregar alguma página. Aquela sensação meio de lento, meio travando. E sim, tentei trocar de Edge pra Chrome, pra Firefox, pra tudo. Nada fazia diferença. A internet ficou mais rápida mesmo, mas o Windows em si não pareceu que melhorou muito e navegando, começava a ficar mais e mais lento. Então o problema não era internet.</p>
<p>Estava ficando sem opções. Tudo que poderia ser manualmente limpo no Windows, eu limpei. Já não tinha quase mais nada pra apagar - e eu apago as coisas sem dó. Mas eu sempre fico na cabeça que é algum malware, alguma coisa que carrega antes do boot, algum &ldquo;ROOTKIT&rdquo;. Anti-cheats são Rootkits por definição. Eles carregam antes até da kernel e a partir desse ponto, o sistema comprometido não pode ser mais confiado, porque nenhuma ferramenta vai conseguir achar ele.</p>
<p>Assumindo que nesse ponto deve ser um sistema comprometido, resolvi ir na opção nuclear: reinstalar tudo do zero. Fizemos backup dos dados e lá fui eu reinstalar do zero.</p>
<h3>Reinstalar NÃO FUNCIONOU<span class="hx:absolute hx:-mt-20" id="reinstalar-não-funcionou"></span>
    <a href="#reinstalar-n%c3%a3o-funcionou" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Agora ficou pior.</p>
<p>Com o Windows 11 Pro, recém-instalado, garantidamente sem nenhum software de terceiros instalado, ainda assim estava com o mesmo comportamento de meio lento, meio travando. O menu de start não me deixava clicar em nada. Precisava abrir o task manager e matar o Explorer manualmente pra fazer ele voltar a funcionar.</p>
<p>Fiquei um tempo olhando pro Task Manager, mas não tinha nenhum processo rodando que eu poderia suspeitar mais: era Windows bare-bones. Eu até tinha rodado um <a href="https://github.com/Raphire/Win11Debloat"target="_blank" rel="noopener">Debloater</a> pra desinstalar os apps desnecessários da Microsoft como Teams.</p>
<p>Mas eis que, de tanto olhar o task manager, eu vi que estava ignorando um dado importante. Veja se acham:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/pky39kkwcbuyqocwpj15n36i9gai" alt="cpu low"  loading="lazy" /></p>
<p>A imagem tá meio zoada porque eu tirei foto do monitor com meu celular. O refresh rate conflita com da câmera e fica essa &ldquo;grade&rdquo;, mas acho que dá pra ler.</p>
<p>Mesmo quando você não tem quase nenhum programa rodando, não é natural a CPU estar com clock tão baixo assim, 0.50Ghz - MEIO GIGAHERTZ. Esse Intel i7 é capaz de ir acima de 4Ghz e o clock-base é de 2Ghz.</p>
<p>Abri navegadores, abri abas, fiquei monitorando, e nunca subia pra mais de 1.5Ghz. Um ocasional pico de 2Ghz por 1 segundo e depois caía pra abaixo de 1Ghz de novo. Daí pensei: será que o AIO está falhando??</p>
<p>Olhando o Event Viewer dava pra ver quando o menu Start (que faz parte do Explorer.exe) parava de funcionar e travava: ele registra no log como &ldquo;Hanging Events&rdquo; código 1002.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/dtugk013p4decud6zo1dzg3rjhxr" alt="event viewer"  loading="lazy" /></p>
<p>Tá vendo esse monte de Error? Tudo Hanging Events, e &ldquo;hanging&rdquo; é justamente o comportamento: alguma coisa parece &ldquo;segurar&rdquo;, &ldquo;travar&rdquo; e só matando o processo pra ele voltar a funcionar.</p>
<p>E isso acontecia antes e também DEPOIS de resinstalar tudo do zero. Alguma coisa parecia fundamentalmente errada no hardware em si. Com o clock super baixo, esse comportamento começa a fazer sentido: está tão lento que ele não está conseguindo processar coisas básicas. Clique várias vezes no Start Menu (que vai ficar fuçando documentos recentes, atualizando lista de aplicativos, abrindo search bar, etc) e não tem clock pra processar isso enquanto ainda tem Windows Defender em background, abas de navegador processando.</p>
<h3>Será Thermal Throttle??<span class="hx:absolute hx:-mt-20" id="será-thermal-throttle"></span>
    <a href="#ser%c3%a1-thermal-throttle" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Como o Windows está zerado, não pode mais ser anti-cheat, não pode ser anti-virus esquisito, não pode ser malware, não é a internet, é alguma coisa FORA, era o que fazia sentido.</p>
<p>Abri o PC e deixei aberto pra poder sentir se o dissipador estava ficando absurdamente quente. Se estiver, iria significar que meu AIO (Watercooler da Coolermaster) começou a falhar.</p>
<p>É normal quando a CPU super-aquece, ele derrubar o clock pra evitar queimar o chip. Isso se chama &ldquo;THEMAL THROTTLING&rdquo;.</p>
<p>E de novo esquisito: estava FRIO ao toque!!!</p>
<p>Não é possível. Abri a BIOS pra re-checar perfis de ventoinha, mas tudo normal:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/yl02sk0dug6zj9d1gen877d22gnw" alt="cpu fans"  loading="lazy" /></p>
<p>Eis que finalmente me ocorreu:</p>
<pre><code>**DEIXA EU CHECAR CONFIGURAÇÃO DE POWER**
</code></pre>
<p>Num PC/notebook normal, deveria aparecer algo parecido com isto:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/a5dkm6eag4ebma6ye1i1mnzphy3s" alt="Power Settings"  loading="lazy" /></p>
<p>Por default, Windows sempre sobe em &ldquo;Balanced Mode&rdquo;.</p>
<p>Mas no PC da minha namorada, <strong>não sei por que</strong>, não tinha opção de Power Mode!!! E eu estou num Windows 11 pro com licença paga!!</p>
<p>Isso é esquisito, mas eu sei que no antigo Control Panel, tem opção de Power Options:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/70ymku67f5ufp0pd76jp0b2hqjx2" alt="control panel"  loading="lazy" /></p>
<p>E EIS O PROBLEMA:</p>
<p>Estava em &ldquo;Power saver&rdquo;!!!</p>
<p>Como isso aconteceu? Não tenho a mínima idéia. LEMBREM-SE: eu re-instalei o Windows do zero. Isso é logo depois de reinstalar!!</p>
<p>Em notebook faz sentido ter esse perfil, pra economizar bateria quando você não tem tomada. Mas em PC desktop, como é meu caso, não faz nenhum sentido!! Mudei pra &ldquo;Ultimate Performance&rdquo; e olha o task manager agora:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/5hg5d85ivuxv9tw5si21wcb3hm5p" alt="cpu high"  loading="lazy" /></p>
<p>AGORA SIM!! Acima de 4Ghz!!!</p>
<p>O NORMAL desta CPU é estar na faixa de 4Ghz, com Turbo Boost de 5Ghz. Mas em Power saver mode, ele NUNCA sobe acima de 2Ghz e fica idling em 500Mhz. Ou seja, estava tudo <strong>DEZ VEZES MAIS LENTO</strong>, às vezes tentava dar boost e ficava ainda <strong>CINCO A DUAS VEZES MAIS LENTO</strong>. E é intermitente!!!</p>
<p>Testando instalar apps, navegar, etc, tudo agora está funcionando normalmente, sem travar, sem sensação de lentidão. Start menu não trava mais - porque agora tem CPU suficiente pra processar as porcarias que ele precisa em background.</p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>CHEQUE POWER OPTIONS NO CONTROL PANEL!!!!</p>
<p>Repetindo: eu tinha ACABADO DE REINSTALAR O WINDOWS. Estava zerado e, por default, ele subiu em Power Saver mode.</p>
<p>Não tenho idéia de porque ele fez isso, não sei se ele sempre faz isso, não sei se ele não reconheceu a placa-mãe da MSI, não sei que combinação de fatores de hardware podem fazer o Windows dar fallback pra isso.</p>
<p>Mas é ALARMANTE que ele faça isso sem avisar. Não tem mensagem de erro. Não tem notificação. Não aparece no Event Viewer. Ou seja, mesmo um Power User como eu eu, precisa aleatoriamente suspeitar &ldquo;hum, deixa eu ver o perfil de energia&rdquo;.</p>
<p>Muita gente com Windows deve estar sentindo essa lentidão e travamentos e achando &ldquo;hm, meu PC é porcaria mesmo, preciso juntar dinheiro pra comprar outro&rdquo;, sem saber que talvez ele só esteja capado por esse perfil de energia e na verdade o PC dele é de 2x a 5x, até 10x mais rápido e ele não sabe disso! Não é uma diferença pequena!</p>
<p>POWER SAVER MODE é uma grande porcaria, não tem nenhuma utilidade prática e nem deveria existir.  É uma das coisas legadas que fazem o Windows ter uma péssima experiência - porque ele não avisa.</p>
<p>Lembra os códigos de erros 1002 de hanging events? Se sair procurando no Google, todo fórum vai te dizer pra rodar programas de diagnósticos, desinstalar coisas, ou reinstalar o Windows. Nenhum cita nada sobre perfil de energia.</p>
<p>Espero que isso ajude mais alguém!</p>
]]></content:encoded><category>microsoft</category><category>performance</category><category>hardware</category></item><item><title>[Akitando] #114 - O Melhor Setup Dev com Arch e WSL2</title><link>https://akitaonrails.github.io/2022/02/15/akitando-114-o-melhor-setup-dev-com-arch-e-wsl2/</link><guid isPermaLink="true">https://akitaonrails.github.io/2022/02/15/akitando-114-o-melhor-setup-dev-com-arch-e-wsl2/</guid><pubDate>Tue, 15 Feb 2022 12:52:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/sjrW74Hx5Po"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2&gt;DESCRIPTION&lt;span class="hx:absolute hx:-mt-20" id="description"&gt;&lt;/span&gt;
&lt;a href="#description" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Vale a pena usar WSL2? Por que Arch Linux?&lt;/p&gt;
&lt;p&gt;Se quiser conhecer a fascinante de como Linux veio parar dentro do Windows, assistam meu video original sobre WSL2 onde eu conto todos os detalhes da história do Windows que você nunca conheceu: &lt;a href="https://www.youtube.com/watch?v=28jHuWBi72w"target="_blank" rel="noopener"&gt;https://www.youtube.com/watch?v=28jHuWBi72w&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Porém, a parte sobre a configuraçâo do Linux no WSL2 estão defasadas e pra corrigir isso fiz o video de hoje.&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/sjrW74Hx5Po"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<h2>DESCRIPTION<span class="hx:absolute hx:-mt-20" id="description"></span>
    <a href="#description" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Vale a pena usar WSL2? Por que Arch Linux?</p>
<p>Se quiser conhecer a fascinante de como Linux veio parar dentro do Windows, assistam meu video original sobre WSL2 onde eu conto todos os detalhes da história do Windows que você nunca conheceu: <a href="https://www.youtube.com/watch?v=28jHuWBi72w"target="_blank" rel="noopener">https://www.youtube.com/watch?v=28jHuWBi72w</a></p>
<p>Porém, a parte sobre a configuraçâo do Linux no WSL2 estão defasadas e pra corrigir isso fiz o video de hoje.</p>
<p>O Guia Definitivo de Ubuntu é um dos videos que vocês mais gostaram e continua válido, assistam se ainda não viram. O de hoje vai complementar aquele video com um novo setup mais moderno pra quem usa Windows e tem máquina suficiente pra instalar Linux em cima com WSL2. E não qualquer Linux, mas o venerado Arch Linux. Vamos ver um setup para desenvolvedores web que é enxuto e poderoso!</p>
<p>E pra quem conhece WSL2 já, vá até o fim pra uma dica de como organizar seu arquivo de projetos entre diferentes máquinas virtuais ao mesmo tempo com performance máxima!</p>
<p>== Conteúdo</p>
<ul>
<li>00:00:00 - intro</li>
<li>00:01:03 - motivação: cuidado com Insider</li>
<li>00:02:46 - recapitulando WSL2</li>
<li>00:03:13 - máquina recomendada</li>
<li>00:06:01 - instalando WSL2</li>
<li>00:07:16 - qual distribuição Linux?</li>
<li>00:10:26 - meu problema com APT</li>
<li>00:12:52 - instalando ArchWSL</li>
<li>00:17:08 - temas do Windows Terminal</li>
<li>00:18:59 - Vim antigo e Vim moderno</li>
<li>00:22:56 - instalando NeoVim e LunarVim</li>
<li>00:26:38 - apresentando LunarVim</li>
<li>00:30:48 - porque não oh-my-zsh? starship?</li>
<li>00:32:02 - instalando YAY</li>
<li>00:33:08 - instalando ZSH, Nerd Fonts e Powerlevel10k</li>
<li>00:38:28 - instalando plugins (zsh-autosuggestions)</li>
<li>00:40:05 - instalando alternativas em Rust</li>
<li>00:42:17 - instalando e mostrando ASDF de novo</li>
<li>00:46:47 - instalando e mostrando Docker</li>
<li>00:49:48 - apps gráficas de Linux funcionam bem?</li>
<li>00:53:02 - WSL, mounts P9 e HDs virtuais</li>
<li>00:56:43 - usando HDs externos do jeito certo</li>
<li>01:00:04 - criando HDs virtuais</li>
<li>01:01:32 - habilitando Hyper-V (parte avançada)</li>
<li>01:02:15 - montando e formatando HDs virtuais</li>
<li>01:03:49 - montando HDs virtuais automaticamente</li>
<li>01:08:37 - bônus: não esqueça das chaves ssh</li>
<li>01:09:16 - repetindo: o que você deve fazer?</li>
</ul>
<p>== Links</p>
<ul>
<li>Windows Insider (<a href="https://insider.windows.com/en-us/about-windows-insider-program"target="_blank" rel="noopener">https://insider.windows.com/en-us/about-windows-insider-program</a>)</li>
<li>WSL Config (<a href="https://github.com/MicrosoftDocs/WSL/blob/main/WSL/wsl-config.md"target="_blank" rel="noopener">https://github.com/MicrosoftDocs/WSL/blob/main/WSL/wsl-config.md</a>)</li>
<li>Win10 Smart Debloat (<a href="https://github.com/LeDragoX/Win10SmartDebloat"target="_blank" rel="noopener">https://github.com/LeDragoX/Win10SmartDebloat</a>)</li>
<li>Get Windows Terminal (<a href="https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701"target="_blank" rel="noopener">https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701</a>)</li>
<li>Windows Terminal Themes (<a href="https://windowsterminalthemes.dev/"target="_blank" rel="noopener">https://windowsterminalthemes.dev/</a>)</li>
<li>Arch Wiki (<a href="https://wiki.archlinux.org/"target="_blank" rel="noopener">https://wiki.archlinux.org/</a>)</li>
<li>ArchWSL (<a href="https://github.com/yuk7/ArchWSL"target="_blank" rel="noopener">https://github.com/yuk7/ArchWSL</a>)</li>
<li>VSCodium (<a href="https://vscodium.com/"target="_blank" rel="noopener">https://vscodium.com/</a>)</li>
<li>Chris@Machine (<a href="https://www.chrisatmachine.com/"target="_blank" rel="noopener">https://www.chrisatmachine.com/</a>)</li>
<li>LunarVim (<a href="https://www.lunarvim.org/#opinionated"target="_blank" rel="noopener">https://www.lunarvim.org/#opinionated</a>)</li>
<li>Powerlevel10k (<a href="https://github.com/romkatv/powerlevel10k"target="_blank" rel="noopener">https://github.com/romkatv/powerlevel10k</a>)</li>
<li>zsh-autosuggestions (<a href="https://github.com/zsh-users/zsh-autosuggestions"target="_blank" rel="noopener">https://github.com/zsh-users/zsh-autosuggestions</a>)</li>
<li>oh-my-zsh (<a href="https://ohmyz.sh/"target="_blank" rel="noopener">https://ohmyz.sh/</a>)</li>
<li>How to install Yay (<a href="https://www.tecmint.com/install-yay-aur-helper-in-arch-linux-and-manjaro/"target="_blank" rel="noopener">https://www.tecmint.com/install-yay-aur-helper-in-arch-linux-and-manjaro/</a>)</li>
<li>ASDF (<a href="https://asdf-vm.com/guide/getting-started.html#_1-install-dependencies"target="_blank" rel="noopener">https://asdf-vm.com/guide/getting-started.html#_1-install-dependencies</a>)</li>
<li>Nerd Fonts (<a href="https://github.com/ryanoasis/nerd-fonts"target="_blank" rel="noopener">https://github.com/ryanoasis/nerd-fonts</a>)</li>
<li>Rewritten in Rust: Modern Alternatives of Command-Line Tools (<a href="https://zaiste.net/posts/shell-commands-rust/"target="_blank" rel="noopener">https://zaiste.net/posts/shell-commands-rust/</a>)</li>
<li>Docker Desktop (<a href="https://docs.docker.com/desktop/windows/wsl/"target="_blank" rel="noopener">https://docs.docker.com/desktop/windows/wsl/</a>)</li>
<li>Mount a Linux disk in WSL 2 (<a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-mount-disk"target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows/wsl/wsl2-mount-disk</a>)</li>
<li>How to create advanced tasks with the Task Scheduler (<a href="https://www.digitalcitizen.life/advanced-users-task-creation-task-scheduler/"target="_blank" rel="noopener">https://www.digitalcitizen.life/advanced-users-task-creation-task-scheduler/</a>)</li>
<li>How to Shrink a WSL2 Virtual Disk (<a href="https://stephenreescarter.net/how-to-shrink-a-wsl2-virtual-disk/"target="_blank" rel="noopener">https://stephenreescarter.net/how-to-shrink-a-wsl2-virtual-disk/</a>)</li>
</ul>
<h2>SCRIPT<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Olá pessoal, Fabio Akita</p>
<p>Um dos videos que vocês mais gostaram foi o meu Guia Definitivo de Ubuntu. A palavra &ldquo;definitivo&rdquo; nunca é definitivo de verdade, especialmente no mundo Linux onde as coisas mudam rápido. Faz muito tempo que fiz aquele video então hoje vou dar uma atualizada. Se você é iniciante em Linux, assista o video de Ubuntu porque tem coisas básicas que ensino lá que não vou repetir mais aqui.</p>
<p>Quero aproveitar e falar rapidinho de WSL 2, o Windows Subsystem for Linux, que também já fiz video algum tempo atrás. Então o de hoje vai ser configurar um bom ambiente de desenvolvimento web de Linux, que independe se está no WSL ou num Linux nativo, mas vou focar um pouco mais em WSL. Se quiser pular pra configuração específica de Linux, vá direto pra este tempo aqui embaixo e se já usa WSL2 ainda assim eu ainda tenho uma dica avançada no final. Consulte os capítulos do video e os links que complementam o conteúdo na descrição abaixo.</p>
<p>(&hellip;)</p>
<p>A motivação desse video é que recentemente eu reinstalei meu notebook do zero. O que aconteceu foi o seguinte: antes do Windows 11 ser lançado obviamente eu fiquei coçando pra experimentar. A Microsoft tem um programa chamado Insider. Se você se registra nele, vai habilitar o Windows Update pra baixar versões não-oficiais do Windows, versões beta ou mais instáveis ainda, em desenvolvimento. Eu fortemente recomendo contra fazer isso numa máquina de trabalho porque a chance de dar ruim é muito alta.</p>
<p>E justamente deu ruim comigo. As últimas versões Insider Preview quebram alguma coisa no suporte a Docker que ele sequer consegue inicializar o serviço. Dá um erro de timeout e crasheia. E não tá errado porque o povo do Docker ainda não teve tempo de corrigir seja lá o que a Microsoft mudou no Windows na versão em desenvolvimento. Não é culpa de ninguém. Esse é o propósito do programa Insider. O desenvolvedor do Docker pode ver o que o povo dentro da Microsoft tá mexendo e ir atualizando o Docker antes da próxima atualização oficial do Windows ser lançado, que pode ser daqui algumas semanas, pode ser daqui alguns meses. Eu que tava adiantado demais. É o mesmo motivo de porque em Linux recomenda-se sempre usar uma distribuição LTS, que é Long Term Support.</p>
<p>O problema é que a versão Insider Preview de desenvolvimento não tem como dar rollback pra versão estável anterior. Precisa fazer um clean install, instalar tudo do zero. Como o Windows 11 já foi oficialmente lançado, não tem porque eu ficar tendo dor de cabeça na versão Insider mais, então fiz o de sempre. Baixei o ISO da versão estável do Windows, queimei um pendrive, bootei e reinstalei tudo do zero. Agora estou com um Windows 11 limpo. Já que ia ter que instalar o WSL tudo de novo, aproveitei pra registrar tudo e mostrar pra vocês.</p>
<p>Vamos recapitular esse tal de WSL2. É uma camada de suporte pra facilitar e integrar uma máquina virtual Linux rodando sobre o hypervisor da própria Microsoft chamado Hyper-V. Máquinas virtuais e containers como Docker são coisas diferentes, por isso eu já tinha feito videos antes explicando a diferença entre os dois e recomendo que assista caso não saiba a diferença. Na prática é uma máquina virtual, só mais conveniente do que rodar dentro de um Virtual Box ou Virt Manager.</p>
<p>Por ser virtualização, significa que na mesma máquina estamos bootando um Windows e em cima dele bootando um Linux. Os recursos da sua máquina como disco, memória RAM, núcleos da CPU e GPU vão ser compartilhados entre os dois sistemas operacionais e por isso é mais pesado do que rodar só um dos dois sozinho. Não é recomendado rodar um WSL ou qualquer máquina virtual se tiver menos que 4 núcleos de CPU e menos de 8Gb de RAM.</p>
<p>Vai rodar se tiver menos? Vai, mas vai ser mais lento porque se faltar CPU vai ficar bem lento, se faltar RAM vai fazer swap em disco e isso vai deixar bem lento. O ideal é pelo menos, pelo menos, 8 núcleos de CPU e pelo menos 16Gb de RAM. Isso dito, não fiquem mandando nos comentários &ldquo;ah, e minha máquina com 4Gb?&rdquo;, faça a conta, 4 é menos que 8 que eu acabei de falar, vai ser lento. Se você não for fizer nada pesado, não tem problema, mas pra trabalhar vai ser super sofrido.</p>
<p>Se tiver máquina mais fraca, recomendo não usar WSL nem nenhum tipo de máquina virtual e sim instalar uma distribuição Linux mais leve como Puppy Linux ou Lubuntu. Não vai ser uma experiência bonita porque a intenção dessas distros é ser leve. Mas mesmo com uma distro que faça boot usando poucos recursos, se abrir um monte de abas no Chrome ou se começar a tentar subir muitos containers de Docker, super rápido vai faltar RAM e CPU e, de novo, vai ser uma experiência bem lenta.</p>
<p>Então pro resto do video vou assumir que você tem uma máquina com pelo menos um Intel Core i5 de 9a geração pra cima ou um Ryzen 5 de 3a geração pra cima e pelo menos 16 Gb de RAM com pelo menos SSD como armazenamento. Aliás, se tem uma máquina fraca e não tem dinheiro pra atualizar tudo, no mínimo do mínimo tente trocar seu HD mecânico por um SSD, é o que mais vai fazer diferença na performance geral. Em segundo lugar é aumentar RAM.</p>
<p>Meu notebook de trabalho que uso pra viajar é um Asus ROG Zephyrus G14. Ele tem um Ryzen 9 5900 HS com 8 núcleos e 16 threads, mais 40Gb de memória DDR4 e um NVME de 4 terabytes, portanto tem recursos mais que sobrando pra rodar um WSL2. Como falei antes, tá com Windows 11 recém instalado. E a primeira coisa que recomendo toda vez que se acaba de instalar Windows é rodar algum script de debloating, ou seja, um script que desabilita inutilidades como a telemetria que fica mandando dados pros servidores da Microsoft sem você saber. Também desabilita Cortana que ninguém usa e coisas assim que ficam roubando recursos da sua máquina.</p>
<p>Um dos scripts mais conhecidos é do LeDragoX. Não vou mostrar como rodar aqui porque tá explicado na página do projeto no GitHub. Se não conseguir seguir essas instruções, também não vai conseguir entender quase nada do video então sugiro que gaste 1 minuto pra tentar abrir a interface gráfica da ferramenta dele. Precisa saber o que é PowerShell, coisa que explico no meu video original sobre WSL2. Assiste lá depois.</p>
<p>Uma vez que desabilitamos o grosso de coisas que um Windows sobe automaticamente, mesmo assim ainda vai consumir quase 5Gb logo depois do boot. Por isso falei que com menos de 8Gb, no Windows, as coisas vão ficar lentas. Vamos começar instalando o tal WSL e se estiver nas versões mais recentes de Windows pode só abrir uma janela de PowerShell com permissões de administrador e digitar <code>wsl --install</code>. Agora vai tomar um café até baixar tudo e instalar os pacotes que precisa.</p>
<p>Não esqueça de instalar o Windows Terminal da loja da Microsoft ou usando algum instalador como o Chocolatey. Se você não é de Linux talvez não entenda ainda a importância de um bom emulador de terminal. No Mac temos o iTerm2, em distros Linux temos o Alacritty que é o melhor ultimamente, mas o Windows Terminal devo dizer que tá muito bem feito e na mesma categoria dos que acabei de falar. Obviamente use o WSL nesse terminal. Depois disso precisamos reiniciar o Windows, como sempre.</p>
<p>A instalação padrão de WSL já vai instalar o Ubuntu mais novo automaticamente e quando reiniciar vai pedir pra criar um usuário Linux. Esse passo é opcional, mas como não custa nada, vamos criar. Colocamos uma senha forte e pronto, estamos dentro de um Ubuntu, dentro do Windows. Se é sua primeira vez instalando WSL, essa visão deve ser bizarra.</p>
<p>Qualquer outro tutorial ia continuar configurando o Ubuntu, mas como sou eu, vou ignorar totalmente porque pessoalmente prefiro distros baseadas em ArchLinux. Sem me alongar demais, hoje em dia você tem 3 grandes famílias de distribuições Linux. Primeiro as baseadas em Debian, com pacotes formato DEB e o gerenciador APT como o Ubuntu, Elementary, Mint, Deepin, Pop OS.</p>
<p>Em segundo tem as baseadas no antigo RedHat, como o Fedora, CentOS, SuSe, com pacotes formato RPM e o gerenciador DNF. O mundo mais enterprise comercial tende a suportar o ecossistema RedHat, então a gente vê marcas como Oracle rodando seus sistemas num CentOS.</p>
<p>O Ubuntu meio que dominou os derivados de Debian. Debian era considerado uma das distribuições mais estáveis, mas pra isso ela sempre vinha com programas em versões um pouco mais defasadas. Lembra o que eu falei sobre o programa Insider do Windows? O Debian é como se fosse o Windows 10 quando já temos o Windows 11. Ele prefere estar mais atrasado pra não comprometer estabilidade.</p>
<p>Pra gerenciar isso o mundo Ubuntu tem o conceito de LTS. Por exemplo, no momento que estou gravando este episódio a versão mais nova do Ubuntu é a 21.10, mas a versão que eles recomendam como mais estável, e que vão dar suporte por alguns anos é a 20.04 que foi lançada 1 ano atrás. A esta altura a maioria dos principais software de Linux tem suporte ao Ubuntu 20.04 mas nem todos suportam a 21.10 ainda.</p>
<p>Ainda existem diversas outras famílias de distribuições que não são nem baseadas em Debian e nem em RedHat, como Slackware ou Gentoo. Mas essas são pra usuários mais avançados. Não recomendo pra iniciantes que ainda não tem costume de fuçar muito documentação e fóruns. Pra mim o melhor meio do caminho entre facilidade e coisas novas é a família Arch Linux que incluem distribuições como Manjaro, Endeavor, Garuda e outras.</p>
<p>Na dúvida eu sempre falo: escolha o Manjaro e seja feliz. O padrão no Manjaro é instalar com GNOME que é meio pesado, mas tem versão com KDE ou XFCE que são gerenciadores de janela mais leves e customizáveis. E você sempre pode instalar outras interfaces gráficas como o Cinnamon ou LXQT. Enfim, tem bastante coisa pra se divertir.</p>
<p>Uma das grandes vantagens do Arch é o gerenciador de pacotes Pacman e o AUR que é o Arch User Repository. Aqui vale uma explicação. Todo tutorial de Ubuntu por aí vai fazer você digitar um comando como <code>apt install</code> pra instalar algum pacote. Esse comando mantém um banco de dados com nomes e versões de pacotes que é atualizado sempre que se faz <code>apt update</code>. Ele faz isso se conectando nos diversos servidores oficiais da Canonical, que faz o Ubuntu, e atualiza os bancos de dados. Daí quando fazemos <code>apt install</code> vai em algum servidor e baixa o pacote do programa que quer instalar. Tudo costuma ser muito simples.</p>
<p>Mas isso implica que todo software do mundo precisaria estar registrado nesses servidores da Canonical, incluindo a versão mais nova e todas as antigas. É muita coisa pra uma empresa só conseguir catalogar e manter atualizado. Por isso é possível outras empresas terem repositórios próprios só com o arquivo de pacotes dos seus software em particular. Por exemplo, se quiser instalar o Docker, os pacotes não estão nos servidores da Canonical. Vamos abrir o tutorial de instalação oficial do Docker.</p>
<p>Tá vendo? Não é só um simples <code>apt install docker</code>, tem vários passos. Em resumo, primeiro precisa instalar alguns pacotes de infraestrutura do Ubuntu no passo 1. No passo 2 precisamos baixar a chave pública em formato GPG do Docker. Se não sabe o que é assinatura e chaves assimétricas, assista meus videos explicando o básico sobre criptografia. Mas em resumo, todo gerenciador de pacotes que se preza vai tentar garantir que você não instale malware de servidores falsos de hackers tentando se passar pelo Docker ou outra empresa.</p>
<p>Pra fazer isso eles assinam os pacotes e os dados transmitidos dos seus servidores usando chaves assimétricas. Eles assinam os pacotes com uma chave privada que ninguém nunca vai ter acesso. Daí instalamos essa chave GPG que é a chave pública. Tudo que a chave privada assina, só a chave pública consegue acessar e vice-versa. Um hacker não tem acesso à chave privada, então não vai conseguir assinar malwares.</p>
<p>No passo 3 precisamos indicar pra ferramenta APT onde está a listagem de pacotes nas mais diversas versões. Nessa lista tem coisas como versão mas também quais pacotes tem pra quais arquiteturas como x64 da Intel, ARM de Mac e assim por diante. Essa linha estranha é um comando pra adicionar um arquivo no diretório de sources do apt, que lista de onde que é pra baixar.</p>
<p>Finalmente no passo 4 fazemos primeiro um <code>apt update</code> pra baixar a listagem desse novo source e atualizar o banco de dados local e só agora podemos fazer o <code>apt install</code>. Quando fizer isso várias vezes, vai ficar meio automático, mas viu quantos passos precisamos fazer pra instalar um pacote que a Canonical não controla?</p>
<p>Como é instalar o mesmo Docker num Arch? Pra começar, a documentação existe no próprio wiki do Arch. E temos dois pacotes, ou o <code>docker</code> ou o <code>docker-git</code> que provavelmente é uma versão mais nova e potencialmente mais instável. Mas por padrão podemos fazer só <code>pacman install docker</code>. Pronto, só isso.</p>
<p>Pacman, assim como Apt ou DNF é um gerenciador e instalador de pacotes. E os repositórios do Arch costumam ter mais pacotes do que os equivalente de Ubuntu ou Fedora. E o que não tem, não precisamos fazer toda a burocracia de procurar um repositório de terceiros, instalar chaves e bla bla como fizemos no caso do Docker. A comunidade mantém um repositório de usuários que é o Arch User Repository ou AUR. A gente pode baixar um script de lá, que serve pra construir um pacote do zero e usamos pacman pra instalar. Mas tem um jeito ainda mais fácil que já vou mostrar.</p>
<p>Isso tudo dito, a Microsoft ainda não tem suporte oficial pra distros Arch no WSL, mas existe um projeto no GitHub chamado ArchWSL. Eu uso acho que desde 2018 e nunca tive problemas. É um Arch mínimo, mais leve que um Manjaro, mais leve que um Ubuntu. E a instalação é bem trivial. Pra isso vamos na página de GitHub do projeto baixar um zip que tem tudo que precisamos. Descompacte onde quiser mas eu costumo deixar na raíz do C: mesmo.</p>
<p>Agora abra um command prompt ou powershell no Windows Terminal, dê <code>cd</code> pro diretório onde descompactou o Arch e execute. Em dois segundos ele vai se registrar no WSL. Como o Windows Terminal já tava aberto ele ainda não detecta o novo Arch, mas basta reiniciar e voilá, já apareceu. O que eu gosto de fazer primeiro é configurar o Terminal pra sempre abrir o Arch primeiro.</p>
<p>Da primeira vez que entramos nele, estamos logados como usuário <code>root</code> que, como já expliquei no guia de Ubuntu, não se deve fazer. Lembra quando o Ubuntu oficial que o WSL instalou nos forçou a criar um usuário não-root? No caso do Arch vamos fazer isso manualmente. Uma das coisas que afasta muitos iniciantes do Arch é que ele nos obriga um pouco a saber o que estamos fazendo e não faz tanta coisa automaticamente. Por isso que é bom pra aprender.</p>
<p>No próprio GitHub do ArchWSL tem um link pra documentação. Vamos seguir e olha só. Daqui você não precisa de talento tampouco habilidade. Basta saber fazer copy e paste e saber ler. Vamos copiar esta primeira linha e colar no terminal com o Arch aberto. Isso vai configurar o arquivo sudoers pra permitir que comandos com <code>sudo</code> possam ser executados pra elevar privilégio a partir de qualquer usuário. O ideal não é abrir tudo pra <code>ALL</code> como fala aqui, mas como é máquina de desenvolvedor, não tem tanto problema. Depois estude sobre sudoers se não conhecia.</p>
<p>Em seguida são comandos básicos de <code>useradd</code> pra criar um novo usuário. Faça copy e paste mas obviamente digite um usuário com seu nome, né. Daí usamos o comando <code>passwd</code> passando o usuário que acabamos de criar pra configurar uma senha segura. Abrimos outra aba com um command prompt, e podemos fechar a que estava com o Arch aberto, porque precisamos configurar o WSL pra quando abrir o Arch de novo use o usuário que acabamos de criar em vez de `root. Então mais um copy e paste.</p>
<p>Pronto, se abrir o Arch no terminal de novo e dermos o comando <code>whoami</code> diz que é o novo usuário. A partir daqui, se precisarmos fazer alguma coisa que exija permissão de root é só começar o comando com <code>sudo</code>. E a primeira coisa que se deve fazer logo que se instala uma distro linux é atualizar todos os pacotes. No caso deste Arch, precisa fazer algumas coisas antes. De novo, a documentação já diz tudo. Só copiar e colar esses comandos de <code>pacman</code> que vai inicializar e popular as chaves que o Arch usa pra checar os pacotes.</p>
<p>O pacman é um pouco chatinho pra quem nunca viu porque não tem comandos fáceis como <code>install</code>, em vez disso o equivalente é <code>-S</code> maiúsculo que significa &ldquo;sync&rdquo;. Daí adicionamos a opção <code>y</code> que se não me engano é pra atualizar o banco de dados com as listagens do servidor oficial do arch. E a opção <code>u</code> é pra atualizar os pacotes. E eu faço <code>yyuu</code> duplicado pra forçar mesmo se já estiver tudo atualizado. O normal é fazer só <code>-Syu</code> sem duplicar, mas quando alguma coisa dá problema ou agora, que é primeira vez, acabo fazendo assim.</p>
<p>E esqueci de fazer uma coisa, então vamos dar <code>control-C</code> pra cancelar e abrir o arquivo <code>/etc/pacman.conf</code> com o editor <code>nano</code>. Procurar a palavra <code>Verbose</code> e adicionar uma nova linha embaixo dizendo <code>ParallelDownloads = 5</code>. Por padrão o pacman baixa um arquivo de cada vez e isso é bem demorado. Se você tem uma boa internet banda larga, pode testar, mas por volta de 5 downloads simultâneos ou até mais, aguenta. Agora sim, vamos repetir o comando do pacman pra atualizar tudo, e agora vai ser mais rápido.</p>
<p>Ele vai checar tudo que precisa ser atualizado, mostrar a lista de pacotes que vai baixar e pedir pra ir confirmando. Olha só como mostra 5 pacotes sendo baixados simultaneamente. Bem mais rápido, mas aí temos esse problema aqui. Um erro de chaves que ele não reconheceu. E isso porque eu fui burro e a documentação do ArchWSL tá incompleta. Faltou fazer <code>pacman -S archlinux-keyring</code> que instala as chaves mais novas que precisa pra instalar os pacotes. Então vamos instalar e repetir o comando de atualizar tudo.</p>
<p>Agora sim, foi até o fim. E é isso. Temos um Arch Linux rodando no WSL 2. Fim do video! Brincadeira. Antes de continuar, vamos deixar nosso terminal um pouco menos feio. Tá tudo com fundo preto. Pra mudar isso podemos ir no site windows terminal themes .dev. Dêem uma fuçada. Eu pessoalmente gosto do &ldquo;Moonlight II&rdquo; ou variações de &ldquo;Monokai&rdquo;. Clique em &ldquo;Get Theme&rdquo; e ele vai copiar pro clipboard.</p>
<p>No Windows Terminal faça &ldquo;ctrl-virgula&rdquo; ou na setinha na barra de título escolha &ldquo;Settings&rdquo;. Lá embaixo tem a opção de abrir o arquivo de configurações que é em formato JSON. Abre no Notepad mesmo por enquanto e vai lá pro fim. Logo embaixo do último tema, garante que tem uma vírgula e cole o novo tema. Cuidado pra não quebrar o JSON. Não precisa reiniciar, só salvar o arquivo. Agora seleciono o &ldquo;Arch&rdquo; no menu e vamos pra &ldquo;Appearance&rdquo;. Pronto, posso selecionar o &ldquo;Moonlight II&rdquo; e embaixo posso aumentar a fonte pra 16 só pra ficar mais fácil de ver aqui no video.</p>
<p>Falando em editor, o próximo passo é instalar um bom editor de textos. Na prática, basta instalar o Visual Studio Code que ele se integra plug and play com o WSL. Vamos ver? Vai na loja do Windows mesmo, procura por Visual Studio, seleciona e instala. Pra ter a integração com o terminal precisa fechar e abrir de novo. Pronto, basta ir pra algum diretório e digitar <code>code .</code> e olha só como abre o Visual Studio listando os arquivos de Linux.</p>
<p>O VSCode funciona super bem e se você prefere uma versão mais light e com mais privacidade, procure pela alternativa chamada VSCodium, que é a mesma proposta do Chromium em relação ao Chrome. VSCode e Chrome tem a péssima mania de se comunicar com servidores da Microsoft ou do Google, respectivamente, e ficar comunicando coisas que não sabemos. O VSCodium e Chromium desligam essas comunicações desnecessárias. Se você é do tipo mais paranóico com privacidade, instale essas alternativas.</p>
<p>Mas de vez em quando ainda prefiro ficar só no terminal mesmo. E hoje em dia ainda não tem nada melhor do que Vim na minha humilde opinião. Esse nosso ArchWSL já vem com vim pré-instalado. O básico que você tem que saber é que ele tem um modo de edição e um modo de navegação. Dá pra ficar horas falando de vim e no video de Ubuntu já mostrei o básico. Se nunca tentou, recomendo que dê uma chance de verdade. Acho importante conhecer o básico de Vim pra mudar a perspectiva do que um editor de textos realmente deveria fazer.</p>
<p>O Vim foi criado numa época onde se usava terminais remotos em redes super lentas. Por isso não existia o conceito de IDEs como um Visual Studio. Seria pesado demais. Quando conversei com o Uncle Bob a gente falou disso, recomendo que assistam nossa live que está gravada no canal. Mas por isso o Vim padrão parece tão espartano, com comandos super curtos, pra minimizar ao máximo os comandos enviados ao servidor a partir do terminal remoto.</p>
<p>Aliás, é por isso que este programa que estamos usando, esta janela do Windows Terminal se chama terminal ou, mais corretamente, emulador de terminal. É um terminal remoto que se conecta com o servidor de terminal rodando por baixo dos panos, localmente. O &ldquo;Linux&rdquo; em si não roda &ldquo;dentro&rdquo; desse programa, por isso podemos fechar o Terminal mas o Linux em si continua rodando por baixo. E quando abrimos um novo Windows Terminal, ele conecta de novo no servidor por baixo. Pense no Linux como se fosse um servidor web e o terminal como se fosse um navegador web, é o mesmo conceito.</p>
<p>Enfim, o Vim na verdade é a evolução do editor original que se chamava só &ldquo;Vi&rdquo;, do Bill Joy, que era da Sun Microsystems. Já o Vim é um fork do Brian Moolenar. Depois do Vim versão 8 surgiu um fork dele chamado de NeoVim que tem a proposta de modernizar o Vim, em particular modernizar o código-fonte, que tem coisa de décadas atrás que nem precisamos mais e funcionalidades que hoje são possíveis. Uma das coisas que adicionaram faz poucos meses foi suporte à linguagem Lua.</p>
<p>O Vim sempre teve plugins escritos numa linguagem própria chamada VimScript, que é uma linguagem bem feia e chata de trabalhar, meio como scripts em Bash. É super antiquado, super fácil de criar bugs acidentais. Por isso pouca gente tem paciência pra escrever plugins nessa linguagem. Já Lua é uma linguagem mais moderna e madura, muito mais difundida, especialmente pra quem programa games. Além de ser uma linguagem super leve e fácil de embutir em qualquer programa.</p>
<p>Tem um canal no YouTube que recomendo que assinem, do Chris at Machine. Ele veio acompanhando essa nova integração e criou um projeto no GitHub chamado LunarVim, que é uma coleção de plugins escritos em Vim e uma configuração super completa que transforma o NeoVim praticamente num Visual Studio Code, só que mais leve e mais produtivo. E &ldquo;praticamente&rdquo; porque uma das características mais importantes do VSCode são seus servidores de linguagens.</p>
<p>Explicando bem curto e porcamente, o VSCode foi inteligente em fazer um editor que por si só é leve e não tem suporte a nenhuma linguagem. É um editor neutro se não configurar nada. Mas quando instala um plugin pra linguagem Ruby, por baixo ele instala um SolarGraph como servidor. Daí o VSCode passa a ser um cliente desse servidor que vai analizar o código Ruby que estamos digitando e dar suporte a coisas como autocomplete, debug, e mais. E cada servidor de linguagens diferentes vai implementar o Language Server Protocol ou LSP que é a API que o VSCode entende.</p>
<p>Agora, se eu pegar outro editor e fazer ele entender o protocolo LSP, dá pra usar os mesmos servidores. Por isso consigo trocar o cliente VSCode e substituir por NeoVim. LSP é como se fosse HTML, o VSCode é como se fosse o navegador Chrome ou Edge e o NeoVim poderia ser como o Firefox, sacaram? E o tal LunarVim que o Chris fez já pré-instala todos os plugins necessários pra integrar com LSP. Então vamos instalar pra ver.</p>
<p>Primeiro, precisamos do NeoVim. E hoje a versão que tem no repositório oficial já serve. Meses atrás precisava compilar o NeoVim manualmente porque não estava disponível esse suporte na versão oficial, só na beta. Pra instalar no Arch é fácil, só fazer <code>sudo pacman -S neovim</code> e veja como lista pacotes de Lua. Sabemos que é a versão que precisamos.</p>
<p>Quando terminar de instalar, vamos pra página no GitHub do LunarVim e tem um script instalador pra facilitar nossa vida. Só copiar essa linha e colar no terminal. E de cara já começa reclamando que não temos Git instalado. Bora instalar <code>pacman -S git</code> como ele manda.</p>
<p>Esse script vai ajudar a instalar as dependências que precisamos. A primeira coisa são pacotes de javascript, daí reclama que não tem nodejs instalado então vamos fazer <code>sudo pacman -S yarn npm</code> pra instalar&hellip; Agora com a seta pra cima repetimos o instalador do LunarVim e damos yes e pronto, tá usando o <code>yarn</code> pra instalar o que precisa.</p>
<p>No próximo passo pede pra instalar dependências de Python e como já temos <code>pip</code> instalado, prossegue instalando o que precisa&hellip; Essa foi fácil, e no passo seguinte ele quer instalar dependências de Rust, mas não temos Rust então o instalador pára de novo. Vamos fazer <code>sudo pacman -S rust</code> pra poder usar o <code>cargo</code> pra instalar as ferramentas de Rust.</p>
<p>Assim como <code>yarn</code> é instalador de dependências de Javascript, <code>pip</code> é instalador de dependências de Python, o <code>cargo</code> é instalador de dependências de Rust. O Rust é uma linguagem compilada que gera binários nativos super otimizados e com segurança superior à de C puro. E no meio da instalação ele deu um erro. Parece que não conseguiu compilar o jemalloc-sys ou pam.</p>
<p>Eu já tinha ido no Google antes e o que aconteceu é que o Rust se integra com binários compilados em C também e nesse ponto ele precisou compilar alguma coisa de C só que não instalamos o ferramental pra isso ainda. Num Ubuntu isso seria o pacote <code>build-essential</code>, mas não existe no Arch. O equivalente é <code>sudo pacman -S base-devel</code>. Só ir dando <code>yes</code> no que tá perguntando, mas sempre leia antes, lógico.</p>
<p>Pronto. Seta pra cima, vamos repetir os mesmos passos tudo de novo. Ele sempre passa pelos passos de javascript e python mas agora é mais rápido porque já instalou esses passos. O Rust volta a compilar o que falta e agora &hellip;. vai até o fim. Mas atenção que fala que precisa colocar o diretório <code>$HOME/.cargo/bin</code> no PATH senão não vai achar as ferramentas que acabou de compilar. E no final o instalador também avisa que não vamos usar o comando <code>nvim</code> que inicia o NeoVim normalmente mas sim o <code>lvim</code> e pra isso precisamos adicionar o <code>$HOME/.local/bin</code> no PATH. Eu explico o que é PATH no episódio do guia de Ubuntu.</p>
<p>Só pra agora podermos ver o LunarVim, vamos exportar o PATH manualmente adicionando esses dois diretórios&hellip; Pronto. Agora podemos abrir <code>lvim</code> e olha só que diferença. No LunarVim apertamos &ldquo;espaço&rdquo; pra abrir esse menu e com a opção &ldquo;e&rdquo; de &ldquo;explorer&rdquo; temos um painel com o projeto organizado como árvore, todo configurado com ícones e bem bonito. Podemos navegar pra cima e pra baixo com as teclas &ldquo;j&rdquo; e &ldquo;k&rdquo; e com a tecla &ldquo;o&rdquo; podemos abrir o arquivo embaixo do cursor.</p>
<p>Vamos abrir o arquivo &ldquo;config.lua&rdquo; pra adicionar uma configuração pra corrigir um pequeno bugzinho que essa versão ainda tem com esse negócio de abrir menu com &ldquo;espaço&rdquo;. Ele é rápido demais e pode dar conflito com outras combinações de teclas então colocamos <code>vim.opt.timeoutlen = 500</code> milissegundos como gambiarra pra contornar e pronto.</p>
<p>O video de hoje não é sobre Vim então não quero me alongar demais nele, mas acho que vale a pena fazer uma pequena tangente pra mostrar um pouquinho de porque instalei o LunarVim. Então vou me adiantar um pouco e abrir um projetinho besta em Rails antigo meu só pra dar exemplo. Primeira coisa é que posso fazer ele ficar parecido com uma IDE apertando espaço, que abre esse menu principal, e com &ldquo;e&rdquo; eu abro o explorer do lado, que é o plugin NvimTree. A partir dele posso usar o mouse normalmente pra abrir arquivos.</p>
<p>Por acaso abri um arquivo de Ruby. Lá embaixo dá pra ver a mensagem de &ldquo;LSP inactive&rdquo;, ou seja, não tem nenhum servidor de linguagem analisando este arquivo. Mas se esperar alguns segundos, olha só, assim como o VSCode, o LunarVim achou um LSP de Ruby, no caso o Solargraph, e instalou sozinho e a partir daqui todo arquivo de Ruby que eu abrir ele vai analizar.</p>
<p>Pra abrir mais arquivos, posso voltar pro painel do explorer com o mouse, ou como eu prefiro, com o teclado fazendo ctrl+h pra ir pro painel da esquerda ou ctrl+l pro painel da direita, e os mesmos comandos de navegação como &ldquo;j&rdquo; pra ir uma linha pra baixo ou &ldquo;k&rdquo; pra uma linha pra cima funcionam igual. E com &ldquo;o&rdquo; posso abrir o arquivo embaixo do cursor.</p>
<p>Mas esse explorer usa muito espaço, então posso fechar ele. Em vez de usar o explorer posso abrir o menu principal com &ldquo;espaço&rdquo; e apertar &ldquo;f&rdquo;, que vai abrir o plugin Telescope que usa a ferramenta &ldquo;fd&rdquo; que é uma das que ele instalou de Rust no começo, lembram? E posso fazer um fuzzy find direto do nome de algum arquivo, como &ldquo;archives&rdquo; e abro o controller.</p>
<p>Notem que o editor parece meio poluído à primeira vista, mas isso é o solargraph que analizou o código e fica dando dicas e avisos de coisas que podem melhorar ou bugs óbvios que precisam ser corrigidos. Toda linguagem moderna hoje tem um LSP que faz essas coisas. Por exemplo, nesse trecho ele fala pra evitar usar chaves num bloco de múltiplas linhas, em Ruby é mais bonito usar &ldquo;do-end&rdquo; em vez disso, e pronto, o aviso sumiu.</p>
<p>Outro exemplo é a sintaxe de atoms em hash que mudou desde a versão 1.9 do Ruby, antes era usando um fat arrow, hoje é usando dois pontos que nem um JSON. E mesma coisa, substituir chaves por &ldquo;do-end&rdquo;. E aqui embaixo ele fala pra não fazer comparação com zero e sim usar o método &ldquo;empty?&rdquo; pra checar se a variável está vazia ou é zero.</p>
<p>Além disso, ele nos ajuda quando temos dúvida numa função. Aqui eu digito ponto e ele já me dá uma lista de métodos que a String aceita. E se eu sair navegando, ele até me dá a documentação da função caso eu não me lembre ou tenha dúvidas. E se for digitando, ele vai filtrando na lista até eu achar o método que eu estava precisando. Tudo coisa básica que se você já usou uma IDE moderna já tinha, mas agora disponível dentro do terminal no vim.</p>
<p>E só como último exemplo de coisas avançadas, alguns LSPs tem recursos de refactoring. Vamos procurar o arquivo do model chamado Post. E se eu quisesse renomear essa classe de Post pra Article e não ter que ir abrindo arquivo a arquivo de todo lugar que a classe Post é usado? Posso abrir o menu principal com espaço, apertar &ldquo;l&rdquo; pra abrir o sub-menu do LSP e olha que ele tem &ldquo;rename&rdquo;. Lá embaixo eu mudo de Post pra Article e deixo o LSP trabalhar.</p>
<p>Notem que lá em cima apareceu um monte de aba de arquivos que ele abriu. Ele ainda não salvou nada. Só abriu todo arquivo onde aparece a classe Post e substituiu por Article. Abrindo aquele mesmo arquivo do ArchivesController, olha como onde tava Post agora tem Article no lugar direitinho. Mesma coisa no PostsController e assim por diante. Eu devo ir checando e salvando um a um pra garantir que fez tudo certo e, lógico, no final eu teria testes automatizados pra garantir que nada quebrou. Mas é uma das coisas que uma IDE como o LunarVim consegue fazer. E isso foram só 2 minutos de demonstração, tem bem mais coisas por baixo pra facilitar nossa vida.</p>
<p>Se você se animar a dar uma chance pro jeito Vim de navegar, em breve vai conseguir programar sem precisar ficar tirando a mão pro mouse toda hora. É muito mais confortável e até mais ergonômico de trabalhar. Além disso ele renderiza tudo em modo texto dentro do Terminal, o que usa muito menos recursos do seu sistema do que o VSCode que, por baixo, é tão pesado quanto um navegador web, como programas feitos em Electron. O VSCode, recém instalado, logo que abre já consome de 250 a 300 mega de RAM. O LunarVim fica na faixa de menos de 150 mega. É quase metade de recursos. Mas claro, hoje em dia depende mais dos LSP que rodam por trás analisando seu código.</p>
<p>Voltando pra nossa instalação, precisamos configurar o PATH de forma permanente e pra isso é só adicionar o mesmo comando de export que fizemos no arquivo <code>.bashrc</code>. Mas eu pessoalmente prefiro o shell ZSH. Eu sei, tem alguns que vão comentar sobre o Fish, mas eu ainda gosto do ZSH mesmo. Pra quem não sabe, além de Bash existem outras linhas de comando ou shells e suporte a scripts diferentes. O Bash é meio antiquado pra hoje, mas não tem nenhum problema de ficar nele.</p>
<p>No video do guia de Ubuntu eu baixei um conjunto de dotfiles de um usuário chamado skwp pra customizar meu prompt, vim e tudo mais, mas ele é muito pouco suportado e hoje em dia existem opções muito melhores. Essa é a parte do video antigo que ficou desfasado. Mesmo na época já existia o Oh-my-zsh que eu testei por um tempo, mas nenhum dos plugins foi muito importante pra mim e acho um pouco pesado. Muita gente gosta de usar só o starship, que faz um prompt até que minimalista e bonitinho de ver.</p>
<p>Meu preferido e o que achei mais fácil de instalar e configurar é o Powerlevel10k. Antes precisamos instalar uma outra ferramenta de Arch Linux pra facilitar nossa vida. Lembra dos pacotes que a comunidade mantém no AUR que mencionei? Pra instalar direto de lá não dá pra usar Pacman. Tem vários gerenciadores de AUR mas o que mais gosto é o Yay. E muitos tutoriais mais novos já assumem que você tem yay. Dá pra saber que um artigo aleatório é mais antigo se em vez de yay ele manda usar yaourt, que é desafado. Então vamos lá.</p>
<p>Na página de GitHub do Yay vamos descer pras instruções. A primeira coisa é instalar os pacotes de git e base-devel, mas acabamos de instalar então pula. Próxima linha é fazer <code>git clone</code> do projeto. Eu prefiro dar <code>cd</code> pro diretório temporário do sistema porque não vamos usar esse clone pra mais nada depois de instalar. Feito o clone damos <code>cd</code> pra ele e &ldquo;make package&rdquo; com opção pra instalar logo depois de construir o pacote. Lembram o que eu expliquei? O AUR não tem os binários nos servidores, só a receita de como montar o pacote de determinado programa. Uma ferramenta com o Yay vai automatizar o que acabamos de fazer manualmente, que é dar clone do projeto, montar o pacote e instalar com pacman localmente.</p>
<p>Pronto, com o Yay instalado praticamente não precisamos usar mais o pacman porque ele serve pra instalar tanto pacotes oficiais dos repositórios do Arch quanto do AUR, usando a mesma sintaxe do pacman. De exemplo, vamos instalar o shell ZSH, que vamos usar no lugar no Bash. Basta fazer <code>yay -S zsh</code>, nem precisa de <code>sudo</code>, ele se vira.</p>
<p>Agora vamos pra página de GitHub do PowerLevel10K. Mesma coisa, pulamos pra seção de Instalação e veja como tem instruções pra várias distros. Queremos do Arch. Simples, duas linhas e ele já assume que temos o <code>yay</code> instalado, então copiamos a primeira linha e colamos no terminal&hellip; pronto. No final ele recomenda instalar algumas fontes. Acho que não faz diferença dentro do terminal, mas pode instalar como fiz aqui. Vai fazer diferença se usar aplicativos gráficos de Linux iniciados de dentro do WSL, como o VSCode de Linux. Mas falo disso depois.</p>
<p>Seguindo as instruções é só executar essa linha de comando que vai inserir a inicialização do powerlevel10k no script <code>.zshrc</code> que é o equivalente <code>.bashrc</code> só que pra zsh, obviamente. Podemos fechar essa aba, abrir outra e &hellip; nada acontece. Isso porque por padrão sempre inicia o Bash, precisamos usar o comando de Linux de &ldquo;change shell&rdquo; que é <code>chsh -s /usr/bin/zsh</code> pra da próxima vez executar direto o zsh em vez do bash&hellip;</p>
<p>Pronto, agora fechamos a aba, reabrimos e como é a primeira vez, o powerlevel10k abre esse wizard de configuração. E a primeira coisa que ele pede pra gente confirmar é se estamos vendo um ícone com formato de diamante. Mas em vez disso estamos vendo um quadradinho, que nem quando vemos fontes quebradas numa página.</p>
<p>Isso porque ele espera encontrar uma família de fontes que tenham gráficos além de só letras. Chamamos essas famílias de Nerd Fonts. Se você é web designer ou desenvolvedor front-end sabe disso. Acho que foi o GitHub que inventou isso de embutir gráficos como fonte. Isso porque sites como o próprio GitHub usam dezenas de pequenos ícones em todo lugar. Em vez de fazer dúzias de PNGs que além de ser um saco de gerenciar também prejudica a performance do download de assets da página, eles tiveram a idéia de embutir todos os ícones em uma família de fonte, que a gente baixa tudo de uma vez só, como a Font Awesome e fica muito mais fácil de usar em qualquer lugar, não só em sites, porque os emuladores de terminais modernos são capazes de renderizar essas fontes também.</p>
<p>Além disso foi a época que Emojis começaram a popularizar, que nada mais são que um padrão onde imagens são associadas com códigos Unicode dentro da família de fontes. Então o mesmo código sempre vai devolver o mesmo emoji independente da família de fontes que estamos usando. Mas a fonte que o Windows Terminal usa por padrão que é a Microsoft Consolas, não tem nenhum desses ícones, por isso devolve um quadradinho pra indicar que não encontrou. Existem várias fontes que você pode pesquisar depois que tem esses ícones com o Fira Code mas eu pessoalmente gosto do Meslo LGS.</p>
<p>Na própria página de instruções do Powerlevel10k tem links pra baixar os arquivos de fonte, então vamos lá baixar uma a uma&hellip; Pronto, agora vamos no explorer no diretório de downloads, selecionamos todos os arquivos que acabamos de baixar, e escolhemos pra instalar as fontes no sistema&hellip; E pronto, agora podemos ir no Windows Terminal, abrir de novo a aba de configurações, escolhemos o Arch, escolhemos a aba de aparência e finalmente podemos trocar o Consolas pelo Meslo LGS.</p>
<p>Agora sim, abrimos uma nova aba. Vai carregar o ZSH que, por sua vez, vai carregar o Powerlevel10k. Como não prosseguimos a configuração da última vez, vai pedir pra começar de novo e desta vez veja como aparece o ícone de diamante. Nos próximos passos ele pede pra confirmar que estamos vendo os outros ícones e daí podemos continuar o passo a passo. E aqui vai do gosto de cada um. Vou passar rapidinho o que eu costumo escolher, mas recomendo que vocês experimentem opções diferentes. No final vai gravar tudo que escolheu no arquivo de configuração <code>.p10k.zsh</code>.</p>
<p>Se não gostou do que escolheu basta digitar <code>p10k configure</code> na linha de comando pra chamar esse passo a passo tudo de novo ou editar manualmente o arquivo <code>.p10k.zsh</code>. Mas no final, olha só como ficou o meu prompt. Com ícones aqui na esquerda, mostrando o diretório onde estou. Se eu estiver num projeto de Git vai mostrar a branch também. Lá na direita mostrando a hora, mas quando entrar num projeto de código ele mostra outros ícones indicando a linguagem do projeto, a versão dessa linguagem e coisas assim.</p>
<p>Agora não podemos esquecer de configurar o PATH no arquivo <code>.zshrc</code>, assim podemos ter acesso ao LunarVim e qualquer nova ferramenta instalada pelo Cargo do Rust. Pode abrir com qualquer editor como o VSCode mas neste video sempre vou usar o NeoVim. Só adicionar o export no final do arquivo e não esquecer que a variável <code>$HOME</code> é um atalho pro diretório padrão do seu usuário e no final anexar o que já tinha no $PATH antes&hellip; Pronto, veja que neste instante se chamarmos <code>lvim</code> não vai achar. Mas agora abrimos outro terminal e boom, abriu o LunarVim como deveria.</p>
<p>O powerlevel10k é bem flexível pra customizar o visual como quiser, e eu gosto do passo a passo do que ter que ficar ajustando arquivo de configuração manualmente. Só tem que fazer isso uma vez e esquecer. Mas como eu disse dá pra customizar o zsh pra ficar bem mais complexo com um oh-my-zsh e colocar vários plugins. Depende de que tipo de trabalhos mais faz no terminal, então não deixe de fuçar que plugins existem. Mas tem um que eu acho útil e por isso vou instalar manualmente agora. Quem usa a shell Fish já tem isso automaticamente.</p>
<p>Vamos instalar que eu mostro pra que serve. No diretório do seu usuário, que você sempre volta fazendo <code>cd</code> sozinho, vamos criar um diretório chamado <code>.zsh</code> pra instalar o plugin. Agora vamos na página de GitHub dele. Tem link pra outra página com instruções de instalação. Olha como tem instrução pro Oh-my-zsh, mas queremos a forma manual. O primeiro passo é clonar o projeto pro diretório que criamos, então é só copiar essa linha de <code>git clone</code> e colar no terminal.</p>
<p>Queremos que toda vez que o zsh carregue, também carregue o plugin então temos que editar o arquivo <code>.zshrc</code> de novo. Copiamos a segunda linha das instruções e podemos colar no script. Salvamos e pronto. Mas pra carregar agora mesmo, é só executar a linha que copiamos que ele carrega o script do plugin. Pra que serve isso? Vamos fazer um comando idiota de <code>echo</code>. E se eu quiser repetir o mesmo comando?</p>
<p>Posso copiar o que acabei de digitar e colar ou, começo a digitar <code>e</code> e ele consulta no histórico e vai tentando auto completar. Olha como já apareceu aqui. Agora é só dar <code>tab</code> ou seta pra direita e vai completar tudo. Isso é super útil porque o tempo todo estamos repetindo os mesmos comandos e eles ficam no histórico da sessão. Isso é um bom exemplo de plugin útil.</p>
<p>Como o LunarVim já pediu pra instalar algumas ferramentas feitas em Rust e já colocamos no PATH onde o Cargo instala os binários, podemos aproveitar e instalar mais algumas ferramentas modernas. Se procurar no Google vai achar vários artigos a respeito mas vou usar este entitulado Rewritten in Rust junto com os outros links na descrição do video. Depois leiam com calma, ele lista diversas novas ferramentas feitas em Rust.</p>
<p>Por exemplo, logo de cara tem os que eu mais gosto, por exemplo o <code>bat</code>, que é um substituto do <code>cat</code> que usamos pra listar o conteúdo de arquivos texto. Ou o <code>exa</code> que é substituto pro <code>ls</code> que usamos toda hora pra listar arquivos de diretórios. Em seguida ele fala do <code>fd</code> que é uma alternativa mais performática pro <code>find</code> e que o LunarVim já instalou porque o plugin Telescope usa. Além do <code>fd</code> o LunarVim também instalou o <code>rg</code> ou RipGrep que é um grep mais performático.</p>
<p>Podemos instalar usando o pacman ou o yay mas vamos instalar usando o Cargo mesmo. Basta fazer <code>cargo install</code> e passar todas as ferramentas que queremos. Olha só o cargo baixando, compilando e instalando&hellip; e no final deu alguns problemas. Ele não conseguiu instalar o ytop, dust e delta. Pode ter algum bug nos repositórios mas não me incomodei pra procurar porque não são essenciais. Os principais que eu queria eram o bat e exa.</p>
<p>Vamos testar. Primeiro, olha como é a saída do <code>ls</code> normal de Linux. Uma listagem normal de arquivos e diretórios, nada demais. Agora vamos usar o <code>exa</code> com as mesmas opções de <code>-la</code>. Ele não aceita todas as opções iguais do <code>ls</code> só as mais comuns e veja só como ficou BEM mais bonito. E pra cereja no bolo tem a opção <code>--icons</code>, e olha só como ficou ainda MAIS bonito. Depois que a gente vê assim, não dá vontade de usar o <code>ls</code> padrão mais. Eu não testei, mas tudo tem trade-off, não sei se um diretório com milhares de arquivos vai ficar mais lento de listar. E também se quiser capturar a listagem num arquivo texto pra trabalhar depois, daí é melhor não usar o exa.</p>
<p>Mesma coisa com o cat. Vamos listar o conteúdo do script <code>.zshrc</code>. E como sempre, listado, nada demais. Mas e com o <code>bat</code>? Olha só como ficou BEM mais bonito. Mas mesma coisa: se precisar trabalhar com o conteúdo do arquivo num script é melhor usar o cat normal. O bat é só pra visualizar mais bonito.</p>
<p>Mas como eu uso <code>ls</code> e <code>cat</code> só pra visualizar no terminal mesmo, prefiro até substituir eles com aliases, e pra isso vamos abrir o <code>.zshrc</code>. Só quero adicionar <code>alias</code> pra dizer que quando eu digitar <code>ls</code> no terminal o zsh vai na verdade chamar o <code>exa</code> e mesma coisa pro <code>cat</code> sempre chamar o <code>bat</code>. Isso é opcional, mas só pra saber que dá pra fazer isso.</p>
<p>Agora que nosso terminal tá bonitão, hora de instalar o ASDF. Não vou me alongar nessa parte porque já expliquei em detalhes sobre isso no guia de ubuntu e vai ser exatamente a mesma coisa agora. Pra quem não lembra, no dia a dia de programador a gente nunca usa uma única versão de alguma linguagem ou framework em todos os projetos. Podemos estar programando um projeto em Node.js versão 16, mas aí alguém me reporta um bug num projeto mais antigo que tava no Node.js 14. Eu preciso ter os dois instalados na minha máquina.</p>
<p>Pra isso existem ferramentas como o NVM pra poder ficar trocando de versão de Node. Mas e se eu precisar mexer também num projeto de Python? Daí vou precisar instalar e configurar o VirtualEnv. Mas amanhã talvez eu tenha que ajudar no front-end de um projetinho em Rails, aí preciso instalar também o RVM ou Rbenv. E assim vai. Cada linguagem tem um gerenciador de versões diferente. Em vez de ter que lidar com essa zona toda, posso instalar o asdf, que tem plugins pra dezenas de linguagens e nunca mais usar outro.</p>
<p>No Arch é fácil, basta fazer <code>yay -S asdf-vm</code>&hellip; Ele vai instalar no diretório <code>/opt/asdf-vm</code> e pra ativar precisamos fazer <code>source /opt/asdf-vm/asdf.sh</code>. Pronto, tá ativado e precisamos colocar essa linha no <code>.zshrc</code> pra toda ver que abrirmos o terminal ter o asdf carregado. A partir daqui é como já mostrei no video de ubuntu. Com <code>asdf list</code> podemos ver todas as linguagens e versões instaladas. Como ainda não instalamos nenhuma, tá vazio. Então vamos instalar o plugin de node com <code>asdf plugin add nodejs</code>.</p>
<p>Pronto, agora podemos fazer <code>asdf list-all nodejs</code> e ver que a versão mais recente hoje é a 17.4.0 então vamos fazer <code>asdf install nodejs 17.4.0</code> e boom, instalado. Só pra fazer graça, podemos instalar uma versão mais antiga também, por exemplo com <code>asdf install nodejs 16.13.2</code>. E depois que instalar rodamos <code>asdf list</code> e ele mostra que temos as duas instaladas direitinho.</p>
<p>Pra escolher uma delas configuramos uma como versão global mas o certo é configurar por projeto. Pra dar exemplo, vamos pro diretório tmp criar um diretório falso de projeto chamado de <code>teste</code>. Dentro podemos fazer <code>asdf local nodejs 16.13.2</code>. Vamos listar o que tem no diretório e achamos o <code>.tool-versions</code> que acabou de ser criado. Dando um <code>cat</code> vemos que está declarada a versão que pedimos. Toda vez que entrarmos nesse diretório o asdf vai usar essa versão específica de Node.js independente do que for a versão global. E fazendo isso em todos os projetos, sempre vai mudar pra correta que cada projeto precisa.</p>
<p>Pra complementar, vamos adicionar Ruby agora. Só adicionar o plugin com <code>asdf plugin add ruby</code>. Mesma coisa de antes, vamos listar todas as versões disponíveis de Ruby e é uma lista gigante porque no meio tem versões não oficiais como o truffleruby, rubinius, jruby mas lá em cima vemos que tem a versão de desenvolvimento do 3.2.0 que ainda não é estável então vamos fazer <code>asdf install ruby 3.1.0</code>. Ruby costuma demorar um pouco mais pra instalar, acho que baixa o código fonte e compila. Boa hora pra ir pegar um café.</p>
<p>Agora que tá instalado, se der <code>asdf list</code> mostra o Ruby também. E assim você pode ir instalando plugins de diversas outras linguagens como Rust, Kotlin, Python, Clojure e tudo mais e instalar versões específicas de cada uma. E como disse antes posso dizer que quero que essa versão 3.1 seja o global com <code>asdf global ruby 3.1.0</code>. Agora todas as ferramentas de ruby que usarmos, a partir de qualquer diretório, vai estar apontando pra essa versão.</p>
<p>Por exemplo, vamos usar o comando <code>gem</code> que vem com todo Ruby e instalar o framework Ruby on Rails fazendo <code>gem install rails</code>. No final ele vai instalar o comando <code>rails</code>, então vamos de novo pro diretório temporário do sistema e executar <code>rails new teste_rails</code> pra criar um novo projeto. Vai demorar um pouquinho pra instalar todas as dependências, mas no final podemos dar <code>cd</code> pro novo diretório. Olha só, tudo funcionando e se quisermos perguntar a versão do ruby ativo, ainda é o 3.1.0.</p>
<p>Como eu não declarei o arquivo <code>.tool-versions</code> se amanhã eu atualizar o ruby global pra 3.2, esse projeto vai pegar 3.2. Se eu quiser travar pra versão específica o certo é rodar o <code>asdf local</code> pra criar o arquivo <code>.tool-versions</code>. Estou me alongando nisso porque é comum você atualizar o sistema, vem versão nova da sua linguagem, e de repente seu projeto começa a dar problema porque você não se tocou que tá rodando uma versão diferente. Por isso é boa prática ter declarada a versão correta em todo projeto mesmo se não usar asdf.</p>
<p>Bom, agora que temos o ASDF e acesso a instalar linguagens, o último grande passo é instalar Docker. Antigamente eu preferia instalar banco de dados como postgres ou redis nativamente no sistema operacional, mas era mais por hábito mesmo. O ideal é não instalar esse tipo de serviço localmente, mesmo porque o WSL não tem um systemd pra controlar boot de serviços. Melhor usar Docker e configurar Docker Compose em todo projeto pra subir versões específicas de tudo que precisa.</p>
<p>Assim como várias coisas podem quebrar quando você pula de Node 16 pra Node 17, um banco como Postgres tem funcionalidades diferentes por versão. A versão mais nova do Postgres no momento que estou fazendo este video é a 14, mas ainda tem muito projeto rodando na versão 9. Você não pode desenvolver na versão mais nova porque pode acabar dependendo de funcionalidades que não existem na 9, daí quando subir em produção, vai dar pau. Repetindo, declare a versão correta de cada coisa no manifesto de um Docker Compose.</p>
<p>Se fosse um Arch Linux nativo fora do WSL, a instalação não seria muito mais do que um <code>yay -S docker</code>, mas no caso do WSL tem um passo extra que é baixar e instalar o Docker Desktop antes. Então vamos no site oficial, baixar o instalador e instalar&hellip; Não precisa mudar nada na instalação, vai só prosseguindo &hellip; ele vai baixar os componentes, vai configurar o WSL pra ter os grupos e permissões direitinho e no final vai pedir pra deslogar e logar de novo. Então vamos fazer isso.</p>
<p>Toda vez que se logar no Windows, o Docker Desktop vai ficar carregado aqui embaixo na barra da tarefas. Certifique-se que ele tá carregado antes de usar. Mas da primeira vez vai abrir essa janela aqui pra aceitar os termos de serviço e só depois inicia. Não tem nenhuma configuração muito importante que precisa mudar, do jeito que veio já tá bom, com exceção de uma coisa que vou mostrar já já.</p>
<p>Agora podemos abrir o terminal e fazer o <code>yay -S docker</code> pra mandar comandos pro servidor que acabamos de instalar. Mas se tentarmos rodar <code>docker ps</code> vai dizer que não conseguiu se conectar. Vamos abrir o Docker Desktop de novo e ir nas configurações. Aqui no item de Resources e WSL Integration tá marcado pra dar suporte pra minha distro default de WSL que vai ser aquele Ubuntu que instalou automaticamente primeiro. Então precisamos habilitar aqui embaixo pro Arch. Pronto.</p>
<p>Se tentar rodar o mesmo comando, vai dar outro erro mas agora é de permissão. Isso porque quando mudamos aquela configuração, por baixo dos panos ele criou o grupo de docker e adicionou meu usuário nele, mas pra termos a permissão precisamos sair e entrar de novo. Então fazemos isso e veja só, o <code>docker ps</code> agora roda sem problemas e listou que não tem nenhum container rodando. Então vamos seguir o exemplo que o Docker Desktop sugere na primeira tela. Só copie essa linha e cole no terminal.</p>
<p>Demora alguns minutos mas ele vai baixar a imagem de um site que vai carregar na porta 80. Deixa baixar e executar. Agora podemos ir no navegador e digitar <code>localhost</code> pra conectar na porta 80 e voilá, ele baixou um site com documentação pra iniciantes. Se você ainda é novo no Docker, é um bom lugar pra começar a estudar. Leia tudo que tem aqui.</p>
<p>Por último, o novo WSL2 tem um novo recurso que vai facilitar muito sua vida quando for rodar testes automatizados com coisas como Selenium ou Cypress, que abrem um navegador de verdade com o Chromium pra testar sua aplicação. Antes já tinha como rodar aplicações gráficas manualmente instalando um cliente de X no Windows como o X410 mas agora o WSL2 já tem suporte nativo.</p>
<p>Só instalar a aplicação que quiser e executar que vai abrir de boa. Infelizmente ainda não tem suporte estável pra fazer pass thru pra GPU da sua máquina então tudo vai rodar 100% via CPU e isso certamente vai ser mais lento do que o navegador nativo no Windows. Mas como é pra cenários como de testes automatizados que falei, tá mais que bom.</p>
<p>Pra instalar é normal, só ir no terminal e fazer <code>yay -S chromium</code>, vai demorar porque o pacote é grandinho, mas é só isso. Vamo lá, vamo lá, acelerar um pouco aqui, e pronto. Agora é só digitar <code>chromium</code> no terminal e olha só, abre bonitinho como qualquer aplicação gráfica. Podemos carregar o YouTube e carrega rápido. Se abrir um video toca sem problemas no meu notebook inclusive com som. Tá sem som aqui porque eu tirei na edição mas pode acreditar que tem som.</p>
<p>Tem um site que costumam usar pra fazer benchmark de navegador, o Speedometer, mas do que já usei dele sei que é bem pouco confiável. Já rodei o teste múltiplas vezes no mesmo navegador e dava resultados bem diferentes, mas só por diversão vamos rodar nesse Chromium. Isso é o cenário que falei de testes automatizados. Ele vai circular por dezenas de aplicações de todo list feitos em diversos frameworks como Angular, React, Ember e outros. Acelerando um pouco o resultado final foi 172 pontos.</p>
<p>Agora vou abrir o Microsoft Edge aqui do lado e carregar o mesmo teste. Vamos ver. Vamos acelerar um pouco aqui com um pouco de mágica de edição e boom. Olha só que bizarro, o Chromium rodando virtualizado ganhou. Mas lógico, meu Edge tá cheio de extensions, cheio de abas abertas, e o Chromium tá recém instalado, totalmente vazio. De qualquer forma, na prática, a performance dentro do WSL tá muito boa. Daria até pra usar como segundo navegador.</p>
<p>Só pra mostrar onde o Chromium via WSL chora é se tentar rodar qualquer coisa 3D nele, por exemplo, um aplicativo em WebAssembly como o Google Earth. Olha só como fica lento, absurdamente lento, é literalmente inusável. E não tinha como ser diferente porque o WSL ainda não tem integração com aceleração 3D da máquina, é tudo renderizado pelo CPU. Mas se eu abrir o Edge que perdeu no Speedometer e carregar o mesmo Google Earth, olha a diferença. Roda liso, praticamente sem perder frames. Essa é a diferença de ter aceleração via GPU. Mas de novo, se você não estiver mexendo com games ou modelagem 3D, pra sites normais, não faz tanta diferença assim.</p>
<p>As novas versões do WSL tem suporte experimental a drivers de paravirtualização de GPU da Nvidia e Amd pra rodar projetos de machine learning em containers de Docker, como Tensorflow ou PyTorch. Eu mesmo não brinquei com isso ainda, não é estável nem garantido que vai funcionar, mas se alguém aí tiver inclinação pra escovar bit pra ver se funciona, vou deixar o link nas descrições também. Mas pra maioria de nós significa que se tiver aplicações gráficas de Linux que você precisa rodar no Windows, agora tem mais uma opção também, só não precisar de aceleração 3D.</p>
<p>E já que estou falando de coisas que foram adicionadas recentemente no WSL, tem uma que gostei muito. Pra mostrar, tem duas últimas coisas que eu faço sempre que reconfiguro um novo Linux. A primeira é copiar minhas chaves privadas que ficam no diretório <code>.ssh</code>, pra ter acesso às minhas contas de Heroku, AWS, GitHub, GitLab e tudo mais. Eu expliquei sobre chaves no episódio de Ubuntu e nos de criptografia. Você precisa tomar muito cuidado pra nunca ninguém pegar essas chaves. De qualquer forma, quando configuro máquina nova, eu zipo as chaves e copio.</p>
<p>A segunda coisa é copiar minha pasta de projetos. Normalmente você não precisa ter tudo, projetos que nem mexe mais. Com as chaves no lugar, é só dar <code>git clone</code> dos projetos que precisa pra agora e tá ótimo. Mas eu quero dar um exemplo do que é possível fazer com o novo WSL. Vamos dar contexto. Lembram lá no começo do video que instalei o Arch no diretório <code>C:\arch</code>? Pois é. Vamos abrir o explorer de novo e temos um arquivo chamado <code>ext4.vhdx</code>. Esse é o &ldquo;HD virtual&rdquo; do Arch Linux que instalamos e estamos usando agora. Olhem como o Arch é levinho, com tudo que instalamos tá ocupando menos de 7 giga.</p>
<p>Esse é o melhor jeito de lidar com HDs virtuais, eles são arquivões binários. E eis porque eu fiz uns 4 videos explicando tudo que um programador deveria saber sobre dispositivos de armazenamento, particionamento, formatação e tipos de filesystems diferentes, porque agora vou assumir você entende o que é um HD virtual. Caso não saiba definir o que é uma partição ou qual a diferença de um filesystem ntfs ou ext4, recomendo que assistam os videos. Mas vamos lá.</p>
<p>Voltando pro terminal, o WSL automaticamente monta seus HDs de verdade, como o seu C:, dentro do diretório <code>/mnt</code>. Então se navegarmos pra <code>cd /mnt/c</code> e dermos um ls, vai listar exatamente o que tem no seu C:. E aí você pode ficar com a idéia errada de deixar seus diretórios de projetos no Windows e trabalhar neles de dentro do WSL. E isso seria uma péssima idéia. Isso porque esse mount que ele fez é parecido com conectar com um servidor de arquivos via rede, mais especificamente usando o protocolo P9 em vez de CIFS. Toda operação de arquivos nesse mount vai ser lenta, porque tem um overhead a mais por cima.</p>
<p>O lado oposto também dá. Do Windows acessar os arquivos dentro do Linux. Só abrir o explorer e digitar &ldquo;\wsl$&rdquo; e pronto, podemos ficar copiando arquivos do Windows pro Linux e vice versa, tanto via terminal quanto via explorer. Mas como eu disse, é como se fosse uma pasta compartilhada na rede, mesmo sendo local, ainda vai ser uma ordem de grandeza mais lento. Especialmente projetos web que tem centenas de arquivos pequenos. O melhor sempre é transferir um zip grandão via rede do que centenas de arquivos pequenos.</p>
<p>A melhor performance é dentro do HD virtual montado diretamente, aquele arquivão VHDX. Lá dentro a velocidade é quase a mesma que nativa, tem muito pouco overhead. Tanto que ficamos aqui instalando pacotes, editando arquivos e tudo mais e a sensação era que estava rodando tudo nativo. Então o mais prático é fazer git clone dos seus projetos lá dentro mesmo e nunca jogar pra fora a partir no <code>/mnt/c</code>. Mesmo se conectar um HD externo que vai montar como <code>/mnt/d</code>, é a mesma coisa, vai ter overhead.</p>
<p>Em 90% dos casos você nunca vai ter nenhum problema se ficar dentro do hd virtual. Mas se for que nem eu que vira e mexe quer mudar de distribuição Linux, mover tudo pra outra máquina ou coisas assim, se tiver muitos arquivos pra ficar movendo, vai ser super lento e demorado, pode levar horas ou mais. O ideal seria alguma coisa tipo um HD externo montado direto. Mantém tudo fora, daí se quiser reinstalar a máquina não tem problema e não demora porque tudo que não era instalação de aplicativos já tava fora.</p>
<p>E se quiser usar um HD externo, o WSL agora suporta montar direto. Vamos ver esse cenário primeiro. Eu tenho um SSD com um adaptador pra USB. Quando conecta no notebook, o Windows detecta e monta como drive D:. Normal, todo mundo já viu isso quinhentas vezes. O que a maioria de vocês não sabe é como o Windows controla isso por baixo. Vamos abrir um Powershell com privilégios de administrador primeiro, alguns comandos que vamos usar a partir de agora vai precisar.</p>
<p>Desde a época do Windows 2000 existe a ferramenta <code>wmic</code> que é o Windows Management Instrumentation Command. É uma forma de instrumentar o Windows sem precisar usar aplicativos gráficos. Quando estamos vendo o drive D: isso é um mount point, um ponto de montagem como no Linux que monta dispositivos como diretórios como no <code>/mnt/c</code>. No Linux os dispositivos de verdade ficam declarados no diretório <code>/dev</code> e seu HD poderia ser um <code>/dev/sda</code> que montamos como a raíz <code>/</code>. Ficou confuso? Eu avisei, é porque você não assistiu meus videos sobre sistemas de arquivos.</p>
<p>Enfim, no Windows tem o mesmo conceito. Os dispositivos podem existir ligados sem ter um ponto de montagem como &ldquo;D:&rdquo; ou eu posso mudar o ponto de montagem pra outra letra se eu quiser, mas o dispositivo em si tem um identificador único que foi dado quando foi conectado. Pra ver isso, no Powershell que acabamos de abrir podemos digitar <code>wmic diskdrive list brief</code> e olha só, nesse notebook temos dois dispositivos de armazenamento, o NVME Sabrent Rocket de 4 terabytes que é o C: e o Kingston conectado via USB de 480 gigas. E os nomes dos dispositivos são esses <code>\\.\PHYSICALDRIVE0</code> e 1. São os equivalente no Linux a um <code>/dev/sda</code> e <code>sdb</code>.</p>
<p>O WSL2 mais novo ganhou a habilidade de montar um HD externo e acessar direto sem ter aquele overhead de rede do protocolo P9 que falei antes, ele monta direto o filesystem. Pra isso, aqui no Powershell mesmo é só fazer <code>wsl --mount \\.\PHYSICALDRIVE1</code>. Ele avisa que o disco foi anexado na máquina virtual mas falhou em criar um ponto de montagem. Notem que quando fiz isso, o Windows desmontou o drive D:, que era só um ponto de montagem. O ideal é não ter dois sistemas operacionais diferentes mexendo no mesmo HD ao mesmo tempo direto, obviamente.</p>
<p>De dentro do WSL, por padrão ele vai montar drives externos em <code>/mnt/wsl</code>, olha só, apareceu um novo diretório chamado &ldquo;PHYSICALDRIVE1&rdquo;, mas se entrarmos nele não tem nada. O comando de mount do WSL tinha avisado que falhou e se consultarmos o <code>dmesg</code> que registra o log global do sistema operacional, tem de fato um erro do VFS que é o subsistema de file system virtual que falhou em tentar montar com filesystem ext4. E ia falhar mesmo porque esse SSD está formatado com NTFS, que o Linux não entende por padrão. Mesmo assim o dispositivo foi registrado dentro do Linux como <code>/dev/sdg</code> e se eu quiser poderia formatar usando o comando <code>mkfs.ext4</code> como qualquer outro drive.</p>
<p>Isso é legal porque posso ter um drive externo com partição formatada em ext4 e toda vez que reiniciar meu note, é só eu dar o comando <code>wsl --mount</code> que vai aparecer dentro do WSL e ter excelente performance, basicamente performance de um drive nativo, sem overhead nenhum. E eu posso compartilhar esse drive com meu Linux em casa e com outro Linux no escritório por exemplo. Super conveniente.</p>
<p>Mas eu gosto de complicar um pouco mais. Eu não quero usar um drive externo, quero usar um outro HD virtual só pra projetos, pra ficar separado do HD virtual de sistema operacional. Assim, posso compartilhar esse drive virtual com mais de um WSL na mesma máquina, que nem agora que eu já tenho um Ubuntu e um Arch Linux instalados no WSL. Ambos poderiam acessar os mesmos projetos sem duplicar nada. Como fazemos isso?</p>
<p>Pra criar um HD virtual é simples. Basta abrir o Disk Management e criar um VHD. Vou criar um arquivo chamado <code>test.vhdx</code> de 150 giga, formato VHDX que é mais moderno e com tamanho dinâmico, ou seja, quando montarmos esse disco virtual, o sistema operacional vai achar que ocupa 150 giga mas na verdade vai ter o tamanho dos arquivos que colocarmos dentro dele, então não desperdiça espaço do seu HD de verdade. Olha no Explorer o arquivo que criamos e como não tá ocupando praticamente nada de espaço porque ainda tá vazio.</p>
<p>De volta ao mesmo Powershell, o que precisamos agora é que esse arquivo seja reconhecido como um disco de verdade e pra isso precisa aparecer como um PHYSICALDRIVE no Windows primeiro, que nem quando espetamos o SSD via USB. E pra fazer isso usamos o comando <code>Mount-VHD</code> passando o caminho completo pro arquivo de disco virtual e &hellip; deu pau. Isso porque esse comando só existe se você instalou as ferramentas do Hyper-V que é a plataforma de hypervisor da Microsoft. E isso só existe se estiver usando Windows 10 ou 11 versão Pro ou versão Server.</p>
<p>Tudo que fizemos até este ponto do video funciona na versão Home do Windows. Eu sei disso porque quando reinstalei o Windows 11 do zero ele instalou como Home sei lá porque. Mas é só ir na loja do Windows e fazer o upgrade pra versão Pro. Custa um pouco caro, mas se sua profissão é ser programador, é um custo necessário. O upgrade hoje em dia é super rápido, leva alguns minutos e um reboot e já era. Se não gosta da idéia de pagar pelo Windows, é pra isso que existe Linux.</p>
<p>Estando no Windows Pro, agora eu procuro a opção de Turn On Features que é o instalador de funcionalidades opcionais do Windows e boom, ta aí a opção de Hyper-V que só tem na versão Pro. Leva mais alguns poucos minutos pra instalar, mais um reboot e pronto. Agora temos suporte às ferramentas do Hyper-V. Então podemos abrir o Powershell com privilégios de administrador de novo e repetir o mesmo comando de antes de <code>Mount-VHD</code>.</p>
<p>Desta vez foi com sucesso. A partir deste ponto, pro sistema operacional, esse disco virtual se comporta igual a um SSD de verdade. Vamos rodar aquele mesmo comando <code>wmic diskdrive list brief</code> e olha só, entrou como Microsoft Virtual Disk e se registrou como <code>\\.\PHYSICALDRIVE1</code> igual meu SSD Kingston via USB antes. E finalmente, podemos repetir o mesmo comando <code>wsl --mount</code>. Isso vai anexar o disco no WSL mas vai falhar a montagem de novo porque acabamos de criar esse disco virtual e ele tá vazio e nunca foi formatado.</p>
<p>Abrindo o terminal e olhando os logs no <code>dmesg</code>, mesmo erro de antes, não achou uma partição formatada com ext4. Mas ele tá bonitinho anexado como <code>/dev/sdg</code>. Como é um drive zerado, podemos formatar fazendo <code>sudo mkfs.ext4</code> que é o comando de &lsquo;make filesystem&rsquo;. Pronto, agora que tá formatado, podemos dar <code>cd</code> pro ponto de montagem que é <code>/mnt/wsl/PHYSICALDRIVE1</code>. Mas note que ele tá com permissão pro usuário root então não vamos conseguir criar nada aqui.</p>
<p>Só falta dar um <code>sudo chown</code> pro meu usuário nesse Linux que é &ldquo;akitaonrails&rdquo; e pronto. Agora eu posso criar um arquivo aqui dentro com o comando <code>touch</code> e sucesso! Arquivo criado. Pro Linux isso é um SSD normal, montado diretamente sem nenhum tipo de gambiarra de rede, com velocidade máxima. Tem a mesma performance do disco virtual principal onde o sistema operacional tá instalado. Você pode criar quantos discos virtuais quiser e montar dessa forma.</p>
<p>Por acaso, eu tenho meu PC de casa que uso pra editar meus videos com WSL instalado e fiz um disco virtual com todos os projetos pessoais e da empresa. Virou um arquivão de mais de 20 gigas de coisas. Transferi pro notebook e agora coloquei no mesmo diretório C:\Arch. Tem que tomar cuidado se deixar em diretórios como Documents, caso Dropbox ou OneDrive estejam configurados pra fazer backup automático. Como é um arquivão gigante, toda vez pode tentar fazer upload de tudo, o que vai ser hiper lento. Faça backup mas tome cuidado de como vai fazer.</p>
<p>E pro último truque, eu queria que esse disco virtual de projetos fosse montado e anexado automaticamente no WSL toda vez que eu bootar a máquina pra não ter que toda vez abrir o Powershell e ficar fazendo <code>Mount-VHD</code> e <code>wsl --mount</code> todos os dias. Já vimos que se quisermos que algo rode toda vez que inicio o Terminal, no Linux foi fácil, foi só adicionar os comandos no nosso script <code>.zshrc</code>, aí ele inicia automaticamente o prompt powerlevel10k, o asdf. Mas no Windows não tem o equivalente fácil assim pra scripts.</p>
<p>Vamos ter que usar o bom e velho Task Scheduler que é o agendador de tarefas do Windows, que fica no aplicativo Computer Management e só tem opção gráfica. Então, botão direito menu de Start, selecionar Computer Management e na lista tem o Task Scheduler. Botão direito nele pra Criar Nova Tarefa. Colocamos um nome descritivo como &ldquo;Auto Mount VHD&rdquo; e configuramos pra rodar independente se eu estiver logado, marcamos pra não salvar senha e pra rodar com Privilégios de Administrador.</p>
<p>Na aba de Trigger criamos um novo que é &ldquo;At Startup&rdquo; que é pra rodar logo que o Windows carregar. Na aba seguinte de Actions é onde dizemos o que vai rodar no boot. O tipo de programa vai ser PowerShell e o argumento vai ser o comando de <code>Mount-VHD</code> só que agora o PATH vai ser pra &ldquo;C:\Arch\projects-disk.vhd&rdquo; que é meu disco virtual de projetos. Coloque o nome do disco que você criou. Pronto, e na última aba de condições é tirar a opção dele rodar de novo se o notebook entrar em modo de economia de energia e acordar. Não tem que rodar de novo.</p>
<p>Agora vamos fazer exatamente a mesma coisa só que pra outro comando. O nome vai ser Auto Mount VHD in WSL. Esses nomes são arbitrários, descreva como quiser. Mesma configuração. Depois o mesmo trigger at startup, mas diferente da última vez vamos colocar a opção de &ldquo;Delay&rdquo;, ou seja, eu quero um pequeno atraso. 1 minuto pra garantir. Isso porque queremos rodar este comando só depois que o anterior tiver já rodado. O Mount VHD tem que anexar o disco virtual e só depois podemos montar no WSL. Se não for nessa ordem, não vai funcionar.</p>
<p>Agora a action vai ser de novo tipo PowerShell e o argumento vai ser o comando <code>wsl --mount</code> e vai estar hardcoded aqui que é pra montar o PHYSICALDRIVE1. Lembrando que se eu bootar a máquina com um pendrive ou algo assim pré-conectado, quando montar o disco virtual provavelmente vai cair pra PHYSICALDRIVE2 e aí esse mount no WSL vai montar o disco errado. Mas normalmente vai ser sempre PHYSICALDRIVE1. E finalmente mesma coisa, não precisa rodar de novo se acordar de sleep.</p>
<p>Feito isso, podemos bootar a máquina e quando voltar, esperamos 1 minuto e quando abrimos o Terminal podemos checar com o comando <code>lsblk</code> que lista dispositivos de bloco e lá está nosso <code>/dev/sdg</code> devidamente montado em <code>/mnt/wsl/PHYSICALDRIVE1</code> como a gente queria. Se listarmos os arquivos lá podemos ver que tem todo meu material. Mas convenhamos que digitar esse PATH enorme toda vez é um saco, mas pra isso que todo Linux suporta links simbólicos.</p>
<p>Vamos voltar pro meu diretório de casa com <code>cd</code> e vamos usar o comando <code>ln -s</code> pra mapear o link simbólico &ldquo;Projects&rdquo; apontando pro <code>/mnt/wsl/PHYSICALDRIVE1</code>. Pronto, agora podemos fazer <code>cd Projects</code> e ele entra no lugar certo. E agora sim, posso continuar dando <code>git clone</code> e <code>git pull</code> dos meus projetos pra cá e tudo vai funcionar com velocidade máxima. E tudo separado do disco virtual do sistema operacional.</p>
<p>E mais do que isso. Lembra do Ubuntu que o WSL instalou lá no começo e eu não mexi mais? Vamos abrir uma aba pra ele e vamos pro diretório <code>/mnt/wsl</code> e olha só, aqui também tá montado. Tanto do Arch quanto do Ubuntu, o comando <code>wsl --mount</code> monta em todas as máquinas virtuais e eu posso acessar de qualquer uma a qualquer momento. Obviamente não recomendo abrir o mesmo arquivo dos dois lugares ao mesmo tempo, mas isso abre diversas possibilidades diferentes. Eu não preciso ficar copiando arquivos entre os dois, posso compartilhar o mesmo drive virtual. E isso só funciona porque o Arch e o Ubuntu compartilham o mesmo Kernel do Linux e esse kernel único tem acesso ao drive e por isso aparece no container dos dois sistemas operacionais diferentes. Eles não sabem que estão compartilhando a mesma kernel.</p>
<p>E por último, eu tinha falado que faltava transferir as chaves privadas de SSH e nesse disco virtual eu tinha copiado o arquivo <code>ssh.tgz</code>. Aqui vai depender de como você compactou mas eu preciso ir pra raíz do drive e fazer <code>tar xvfz /mnt/wsl/PHYSICALDRIVE1/ssh.tgz</code> e vai descompactar no lugar certo e já com as permissões corretas. Se tivesse copiado de um pendrive formatado em FAT por exemplo, as permissões não teriam sido mantidas então precisaria fazer <code>chmod -R 600 .ssh</code> que significa permissão 6 pro meu usuário que é leitura e escrita e permissão 0 pra todos os outros usuários, que é não conseguir nem ler e nem mesmo listar os arquivos desse diretório.</p>
<p>Com isso o WSL do meu notebook está configurado e pronto pra eu poder voltar a mexer em código. Tenho o <code>yay</code> pra poder instalar qualquer programa do repositório AUR, tenho o Cargo do Rust pra instalar programas feitos em Rust, tenho o ASDF pra conseguir instalar qualquer linguagem de programação em qualquer versão e tenho o Docker pra poder rodar qualquer projeto. Além disso tenho meu prompt bonitão com o Powerlevel10K e posso editar código tanto no VSCode quanto no meu LunarVim fodão. E isso é tudo que um programador web precisa. Se eu fosse lidar com devops precisaria instalar outras ferramentas como do google cloud, kubernetes e coisas assim, mas aí é de projeto a projeto e com o que tenho configurado aqui, é só instalar com o <code>yay</code>.</p>
<p>Eu mencionei muito rápido no começo, mas uma das grandes vantagens de usar o Arch é a documentação da comunidade. Como no exemplo de instalar Docker, pra Ubuntu, eu precisei achar no site do próprio Docker e não no site do Ubuntu. Mas no caso do Arch tem um Wiki de Docker feito pela comunidade com um monte de informação e dicas muito úteis, seja pra quem é iniciante ou quem é avançado tentando resolver problemas mais complexos. Em vez de sair fuçando em fóruns ou lugares como o site stackexchange, normalmente você acha o que precisa no Wiki do Arch. Gaste tempo estudando tudo que não conhecia que mostrei nesse video a partir desse Wiki. Tenho certeza que vai aprender muito.</p>
<p>Tenho certeza também que muitos vão ficar mandando nos comentários ou mensagens diretas pra mim perguntando qual distro usar. Se tem dúvida, instale Ubuntu. Por isso eu fiz o guia definitivo de Ubuntu pra iniciantes. É a resposta padrão. De novo, se você tem dúvidas e veio perguntar é porque não tá com muita disposição de pesquisar, então é Ubuntu. Quem se importa já instalou um VirtualBox ou Virt Manager e criou máquinas virtuais pra baixar os ISOs das distribuições que tem interesse pra ver com os próprios olhos.</p>
<p>Hoje em dia é muito fácil. As ISOs você baixa de graça no site de cada distro. Daí é só bootar numa máquina virtual e usar alguns dias pra ver se gosta. Se ficou confortável, daí reserva um fim de semana, faz backup de tudo, queima a ISO num pendrive e instala como sistema operacional nativo. Não gostou? Muda pra outro. É assim que se faz. Perguntar pros outros não faz nenhuma diferença porque cada um usa pra coisas diferentes.</p>
<p>Eu pessoalmente gosto de distros baseados em Arch como o Manjaro, mas acho o Manjaro meio feinho. Prefiro a cara de um Deepin, mas acho Deepin muito pesado e não confio muito nele. Kali Linux é seguro, mas não foi feito pra usar no dia a dia, só rodaria numa máquina virtual se precisasse fuçar coisas de segurança. E assim por diante.</p>
<p>A parte ruim é instalar em notebooks super novos. Meu Zephyrus G14 comprei acho que lá por julho do ano passado, tinha acabado de lançar. Significa que o suporte de Linux pra ele ainda era muito insipiente. Eu achei alguns scripts, alguns hacks pra tentar fazer tudo funcionar, mas coisas como bluetooth não ia de jeito nenhum, perfil de economia de energia ainda não tava adequado. No final das contas não tive muita confiança, daí voltei pra Windows com WSL que todos os periféricos iam funcionar direitinho.</p>
<p>Agora que já passou 1 ano, talvez já tenha mais gente que gastou tempo ajustando e talvez agora já funcione melhor, não sei. Mas no meu caso, realmente não vejo tanta vantagem. O Windows me atende bem, tenho zero problemas com coisas como Steam, e tudo que preciso pra programar roda no WSL. Como é uma máquina parruda, com CPU e RAM sobrando, mesmo numa máquina virtual como o WSL funciona tudo zero bala. Se fosse um notebook mais antigo e menos potente, daí já justifica deixar Linux nativo, porque quanto mais antigo for o hardware, maiores as chances de drivers e coisas assim já existirem e serem estáveis.</p>
<p>Por isso que a resposta é sempre, depende. E por isso que se você é programador ou quer ser, precisa saber ir atrás da documentação e todos os componentes da sua própria máquina, pra saber quais distros são mais compatíveis, que tipos de gambiarra vai precisar fazer ou não. Este video, não tem nada que eu inventei, tudo tem na web, só saber procurar. E de novo, expliquei coisas mais básicas no meu video de Ubuntu e assistam os videos sobre máquina virtual e containers, os videos sobre sistemas de arquivos e dispositivos de armazenamento e tudo mais.</p>
<p>Se importe um pouco mais com sua própria máquina e seu ambiente de desenvolvimento. Se ficaram com outras dúvidas, mandem nos comentários abaixo. Se curtiram o video deixem um joinha, não deixem de assinar o canal e compartilhar o video com seus amigos. A gente se vê, até mais.</p>
]]></content:encoded><category>linux</category><category>ferramentas-de-desenvolvimento</category><category>microsoft</category><category>akitando</category></item><item><title>[Akitando] #60 - Entendendo WSL 2 | E uma curta história sobre Windows NT</title><link>https://akitaonrails.github.io/2019/09/04/akitando-60-entendendo-wsl-2-e-uma-curta-historia-sobre-windows-nt/</link><guid isPermaLink="true">https://akitaonrails.github.io/2019/09/04/akitando-60-entendendo-wsl-2-e-uma-curta-historia-sobre-windows-nt/</guid><pubDate>Wed, 04 Sep 2019 11:00:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/28jHuWBi72w"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;(obs: este script depende muito dos demos no video em si, pode ser difícil de ler só o texto)&lt;/p&gt;
&lt;h2&gt;DESCRIPTION&lt;span class="hx:absolute hx:-mt-20" id="description"&gt;&lt;/span&gt;
&lt;a href="#description" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Eu vinha prometendo esse tema já faz algum tempo e finalmente resolvi explicar esse tal de WSL ou Windows Subsystem for Linux, a solução que permite rodar programas de Linux diretamente em cima do Windows.&lt;/p&gt;
&lt;p&gt;Mas desde que eu comecei a acompanhar esse projeto em 2016 muita coisa mudou. O WSL evoluiu do então chamado &amp;ldquo;Bash on Ubuntu&amp;rdquo; para &amp;ldquo;WSL 1&amp;rdquo; e agora migrando pra &amp;ldquo;WSL 2&amp;rdquo;.&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/28jHuWBi72w"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>(obs: este script depende muito dos demos no video em si, pode ser difícil de ler só o texto)</p>
<h2>DESCRIPTION<span class="hx:absolute hx:-mt-20" id="description"></span>
    <a href="#description" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Eu vinha prometendo esse tema já faz algum tempo e finalmente resolvi explicar esse tal de WSL ou Windows Subsystem for Linux, a solução que permite rodar programas de Linux diretamente em cima do Windows.</p>
<p>Mas desde que eu comecei a acompanhar esse projeto em 2016 muita coisa mudou. O WSL evoluiu do então chamado &ldquo;Bash on Ubuntu&rdquo; para &ldquo;WSL 1&rdquo; e agora migrando pra &ldquo;WSL 2&rdquo;.</p>
<p>Quais as diferenças? Como funciona? Como instalo e configuro na minha máquina?</p>
<p>Além de responder essas perguntas eu achei adequado aproveitar o gancho pra contar a história do UNIX/Linux sobre o Windows e como essa história remete até o anos 80! Então vamos entender a história de como a Microsoft sempre flertou e de fato dormiu na cama do UNIX muito antes do que você pensa!</p>
<p>Se já sabe de tudo isso e só quer saber sobre o WSL especificamente, pode pular direto pro tempo 32:12.</p>
<p>Errata:</p>
<p>Eu disse que o VHD é limitado em 256GB e não havia como redimensionar, mas na verdade tem sim. Este link tem mais informações: <a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-ux-changes"target="_blank" rel="noopener">https://docs.microsoft.com/en-us/windows/wsl/wsl2-ux-changes</a></p>
<p>Eu disse que 8086/8088 eram processadores de 8-bits, mas esses já eram 16-bits! Sempre confundi isso.</p>
<p>Pré-requisitos:</p>
<ul>
<li>Playlist: Começando aos 40 (<a href="https://www.youtube.com/playlist?list=PLdsnXVqbHDUc7htGFobbZoNen3r_wm3ki"target="_blank" rel="noopener">https://www.youtube.com/playlist?list=PLdsnXVqbHDUc7htGFobbZoNen3r_wm3ki</a>)</li>
<li>Concorrência e Paralelismo Parte 1 (<a href="https://www.youtube.com/watch?v=cx1ULv4wYxM"target="_blank" rel="noopener">https://www.youtube.com/watch?v=cx1ULv4wYxM</a>)</li>
<li>Concorrência e Paralelismo Parte 2 (<a href="https://www.youtube.com/watch?v=gYJSWs-gp1g"target="_blank" rel="noopener">https://www.youtube.com/watch?v=gYJSWs-gp1g</a>)</li>
<li>Gerenciamento de Memória Parte 1 (<a href="https://www.youtube.com/watch?v=9AK_1gqEfkQ"target="_blank" rel="noopener">https://www.youtube.com/watch?v=9AK_1gqEfkQ</a>)</li>
<li>Gerenciamento de Memória Parte 2 (<a href="https://www.youtube.com/watch?v=DGU1awKrNiA"target="_blank" rel="noopener">https://www.youtube.com/watch?v=DGU1awKrNiA</a>)</li>
<li>Virtualização Parte 1 (<a href="https://www.youtube.com/watch?v=bwO8EZf0gLI"target="_blank" rel="noopener">https://www.youtube.com/watch?v=bwO8EZf0gLI</a>)</li>
<li>Virtualização Parte 2 (<a href="https://www.youtube.com/watch?v=mcwnQVAn0pw"target="_blank" rel="noopener">https://www.youtube.com/watch?v=mcwnQVAn0pw</a>)</li>
<li>Apple, GPL e compiladores (<a href="https://www.youtube.com/watch?v=suSvMnNwV-8"target="_blank" rel="noopener">https://www.youtube.com/watch?v=suSvMnNwV-8</a>)</li>
</ul>
<p>Links:</p>
<ul>
<li>
<p>Announcing WSL 2 (<a href="https://devblogs.microsoft.com/commandline/announcing-wsl-2/"target="_blank" rel="noopener">https://devblogs.microsoft.com/commandline/announcing-wsl-2/</a>)</p>
</li>
<li>
<p>Awesome-WSL (<a href="https://github.com/sirredbeard/Awesome-WSL"target="_blank" rel="noopener">https://github.com/sirredbeard/Awesome-WSL</a>)</p>
</li>
<li>
<p>Xfce4 Desktop Environment and X Server for Ubuntu on WSL 2 (<a href="https://autoize.com/xfce4-desktop-environment-and-x-server-for-ubuntu-on-wsl-2/"target="_blank" rel="noopener">https://autoize.com/xfce4-desktop-environment-and-x-server-for-ubuntu-on-wsl-2/</a>)</p>
</li>
<li>
<p>HOWTO: Enable WSL2 and Convert Existing Pengwin Installations (<a href="https://www.pengwin.dev/blog/2019/6/12/enable-wsl2-and-convert-existing-pengwin-installations"target="_blank" rel="noopener">https://www.pengwin.dev/blog/2019/6/12/enable-wsl2-and-convert-existing-pengwin-installations</a>)</p>
</li>
<li>
<p>Plan 9 rides again; WSL file access (<a href="https://nelsonslog.wordpress.com/2019/02/16/plan-9-rides-again-wsl-file-access/"target="_blank" rel="noopener">https://nelsonslog.wordpress.com/2019/02/16/plan-9-rides-again-wsl-file-access/</a>)</p>
</li>
<li>
<p>WSL Distro Launcher Reference Implementation (<a href="https://github.com/Microsoft/WSL-DistroLauncher"target="_blank" rel="noopener">https://github.com/Microsoft/WSL-DistroLauncher</a>)</p>
</li>
<li>
<p>Shipping a Linux Kernel with Windows (<a href="https://devblogs.microsoft.com/commandline/shipping-a-linux-kernel-with-windows/"target="_blank" rel="noopener">https://devblogs.microsoft.com/commandline/shipping-a-linux-kernel-with-windows/</a>)</p>
</li>
<li>
<p>Awesome Powershell (<a href="https://github.com/janikvonrotz/awesome-powershell"target="_blank" rel="noopener">https://github.com/janikvonrotz/awesome-powershell</a>)</p>
</li>
<li>
<p>WSL2-Linux-Kernel (<a href="https://github.com/microsoft/WSL2-Linux-Kernel"target="_blank" rel="noopener">https://github.com/microsoft/WSL2-Linux-Kernel</a>)</p>
</li>
<li>
<p>ArchWSL (<a href="https://github.com/yuk7/ArchWSL"target="_blank" rel="noopener">https://github.com/yuk7/ArchWSL</a>)</p>
</li>
<li>
<p>XMing (<a href="https://sourceforge.net/projects/xming/"target="_blank" rel="noopener">https://sourceforge.net/projects/xming/</a>)</p>
</li>
<li>
<p>VcXSrv (<a href="https://sourceforge.net/projects/vcxsrv/"target="_blank" rel="noopener">https://sourceforge.net/projects/vcxsrv/</a>)</p>
</li>
<li>
<p>Project Drawbridge (<a href="https://www.microsoft.com/en-us/research/project/drawbridge/"target="_blank" rel="noopener">https://www.microsoft.com/en-us/research/project/drawbridge/</a>)</p>
</li>
<li>
<p>How to install Flat-Remix Theme on Any Linux Distribution? (<a href="https://www.osradar.com/install-flat-remix-theme-ubuntu/"target="_blank" rel="noopener">https://www.osradar.com/install-flat-remix-theme-ubuntu/</a>)</p>
</li>
<li>
<p>2016 - Bash on Ubuntu on Windows (<a href="https://devblogs.microsoft.com/commandline/bash-on-ubuntu-on-windows-download-now-3/"target="_blank" rel="noopener">https://devblogs.microsoft.com/commandline/bash-on-ubuntu-on-windows-download-now-3/</a>)</p>
</li>
<li>
<p>Installing PowerShell Core on Linux (<a href="https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-6"target="_blank" rel="noopener">https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-6</a>)</p>
</li>
<li>
<p>Install .NET Core SDK on Linux Ubuntu 18.04 (<a href="https://dotnet.microsoft.com/download/linux-package-manager/ubuntu18-04/sdk-current"target="_blank" rel="noopener">https://dotnet.microsoft.com/download/linux-package-manager/ubuntu18-04/sdk-current</a>)</p>
</li>
<li>
<p>coLinux (não-suportado mais) (<a href="http://www.colinux.org"target="_blank" rel="noopener">http://www.colinux.org</a>)</p>
</li>
<li>
<p>Cygwin (<a href="https://cygwin.com/install.html"target="_blank" rel="noopener">https://cygwin.com/install.html</a>)</p>
</li>
<li>
<p>AkitaOnRails: Windows Subsystem for Linux is good, but not enough yet (<a href="https://www.akitaonrails.com/2017/09/20/windows-subsystem-for-linux-e-bom-mas-ainda-nao-suficiente"target="_blank" rel="noopener">https://www.akitaonrails.com/2017/09/20/windows-subsystem-for-linux-e-bom-mas-ainda-nao-suficiente</a>)</p>
</li>
<li>
<p>AkitaOnRails: Running Arch Linux over Windows 10! (<a href="https://www.akitaonrails.com/2018/04/29/rodando-arch-linux-sobre-o-windows-10"target="_blank" rel="noopener">https://www.akitaonrails.com/2018/04/29/rodando-arch-linux-sobre-o-windows-10</a>)</p>
</li>
</ul>
<h2>SCRIPT<span class="hx:absolute hx:-mt-20" id="script"></span>
    <a href="#script" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Olá pessoal, Fabio Akita</p>
<p>O próximo grande upgrade de Windows 10 está próximo, não sei ainda se vai ser agora já em setembro ou outubro, mas quando vier ele vai trazer a funcionalidade que todo desenvolvedor estava precisando: conseguir rodar aplicações de Linux quase nativamente em Windows 10.</p>
<p>Acho que a esta altura quase todo mundo já ouviu falar do tal WSL ou Windows Subsystem for Linux. Porém muita gente ainda não entendeu direito o que é isso. Na real é super simples. E se você é iniciante e já assistiu meus vídeos da série Começando aos 40, muito do que eu expliquei na parte de virtualização e containers vai ser usado hoje então, se ainda não assistiu, recomendo assistir antes, especialmente os que explicam sobre virtualização e containers.</p>
<p>Rodar um ambiente Unix ou Linux em cima do Windows, com suporte oficial da Microsoft, é um elo perdido que muitos de nós viemos perseguindo nas últimas décadas, eu mesmo venho acompanhando isso faz algum tempo. E pra sua surpresa essa nem é a primeira vez que a Microsoft oferece algo assim. Se você está interessado só na parte prática do WSL pode pular direto pra este tempo aqui embaixo, mas como sempre eu vou fazer uma tangente pela história, então vamos lá.</p>
<p>Essa história se inicia nos primórdios dos anos 80. Se você não sabe disso a Microsoft cresceu graças à IBM que licenciou seu MS-DOS para ser instalado nos IBM PC, fruto da amizade da mãe de Bill, Mary Gates com o CEO da IBM na época, John Opel. Todo mundo relaciona Microsoft com MS-DOS e depois Windows. Todo mundo relaciona interface gráfica com o Macintosh original ou no máximo com o Apple Lisa e a Xerox Parc. Em termos de interfaces gráficas, existiram diversas tentativas como o GEM dos Atari ST, o famoso Amiga Workbench no AmigaOS, o DeskMate do TRS-80.</p>
<p>Mas em processadores de 8-bits que, com muito esforço, dava pra mapear 64 kilobytes de RAM, desperdiçar espaço com interfaces gráficas era demais. O AmigaOS, por exemplo, precisava do processador Motorola 68000 de 16 ou 32-bits. De qualquer forma pouca gente relaciona que a Microsoft teve outros sistemas operacionais e outras interfaces gráficas muito antes do Windows.</p>
<p>Por exemplo, vocês sabiam que a Microsoft já teve um UNIX de verdade? Sim, muito antes da Apple comprar a Next e transformar o NextStep no OS X. Aliás, vale relembrar: Linux não é um UNIX, ele é mais ou menos compatível, mas na prática é um sistema operacional totalmente diferente. O UNIX original vem da Bell Labs e sua herança hoje vive nos derivados de BSD como FreeBSD ou NetBSD e no Darwin do MacOS. A maioria dos UNIX de verdade vieram desaparecendo ou diminuindo consideravelmente com o tempo como o Solaris da Sun ou o Irix da Silicon Graphics que, de curiosidade, se você assistiu Jurassic Park, já viu o Irix funcionando.</p>
<p>Em 1980 a Microsoft se uniu à SCO ou Santa Cruz Operation e eles desenvolveram o Xenix que era outro UNIX de verdade, e estamos falando mais de uma década antes do surgimento do Linux. Segundo a Microsoft era um UNIX muito próximo do UNIX original versão 7 que rodava nos minicomputadores PDP-11. Aliás, de curiosidade também, antigamente a gente chamava os mainframes de computadores, coisas como o PDP são os minicomputadores, e os Commodore, TRS-80, Sinclair, MSX, e mesmo os IBM PC eram os microcomputadores. Por isso falamos em &ldquo;micros&rdquo;.</p>
<p>Enfim, uma das idéias era evoluir o MS-DOS 2 pra se aproximar do XENIX em single-user, que iria virar o XEDOS, mas foi mais um vaporware que nunca saiu do papel. Aliás, foi daí que o termo &ldquo;vaporware&rdquo; nasceu, em 1982 por causa do XENIX. A SCO seguiu sozinha com seu SCO UNIX depois e a Microsoft desistiu da idéia e se uniu à IBM pro projeto OS/2 em 1987.</p>
<p>Esse período foi especialmente conturbado porque estamos falando da transição dos processadores de 8-bits como os antigos Z80 ou Intel 8086 e 8088 e indo pra 16-bits com o 80286, que inclusive foi onde eu ganhei meu primeiro computador, um clone de IBM PC XT em 1989. Porém o 286 era um processador complicado, pra dizer o mínimo. Estávamos migrando do modo real de execução pro modo protegido, que hoje é o padrão. Nessa transição apareceu a necessidade de emular o 8086 no modo protegido. Mas o modo protegido e emulado do 8086 nos 286 era falho. Além disso existia o problema do endereçamento segmentado de memória, diferente do modelo flat que você está acostumado hoje, onde pode endereçar toda a memória de 32 ou 64-bits.</p>
<p>Pense que em 16-bits você só consegue endereçar 64kb de RAM, pra ter acesso a mais RAM você precisa apontar pra espaços secundários, ou segmentados, de RAM. Como um índice apontando pra uma página em outro livro. Em termos simples você tinha um índice de 24-bits com endereços de 16-bits em múltiplos segmentos. No frigir dos ovos, com os problemas de hardware não seria possível rodar múltiplos ambientes paralelos de MS-DOS como deveriam. E a Microsoft obviamente não gostou muito disso.</p>
<p>Na parceria da IBM com a Microsoft eles desenvolveram o OS/2. A primeira versão era só modo texto, e a primeira interface gráfica tinha a cara do Windows 2, que saiu mais ou menos na mesma época. Porém a IBM insistiu no suporte ao 286 e esse foi um dos motivos da quebra da parceria porque o MS-DOS e o Windows tinham problemas com o 286. A Microsoft queria ir direto pro 386 de 32-bits que era muito melhor. Aliás, no caso do 286, imagine um processador que tinha máximo de 16MB de RAM. Claro, estamos falando de 1988. Os 386, em comparação, sendo de 32-bits, tinha máximo teórico de infinitos 4GB de RAM. Mas mais importante, rodava DOS em modo protegido perfeitamente.</p>
<p>Por outro lado, a IBM queria privilegiar a sua linha de hardware, claro, e eles tinham se comprometido com os 286 e sua linha de PCs PS/2 (entenderam? PS/2, OS/2 &hellip;) e por isso insistiram no OS/2 ser especializado nesse processador. Então em 1992 a IBM e a Microsoft se separaram, a IBM se manteve com o OS/2 e a Microsoft estava muito bem, obrigado, com seu Windows 3, a interface gráfica de maior sucesso da época.</p>
<p>Em paralelo a isso a Microsoft começou a criar um sistema operacional portável pra múltiplas arquiteturas de computador como processadores RISC da MIPS, PowerPC, Itanium, Intel e contratou Dave Cutler que trabalhava na VMS, que fazia o VAX/VMS mas não estava interessado em muitas de suas idéias. Daí ele foi pra Microsoft e caiu no projeto NT onde ele pôde aplicar muitas dessas idéias. Aliás, o nome Windows NT tem alguma controvérsia no seu significado, muitos talvez ainda pensem em NT como sendo New Technology.</p>
<p>O Dave Cutler vai dizer que WNT seria uma brincadeira em cima do nome da VMS de onde ele veio. Assim como muita gente gosta de brincar que IBM é uma brincadeira em cima do nome HAL, a inteligência artificial do filme 2001 do Stanley Kubrick. Se você pegar HAL e dar shift de uma letra pra frente, o H vira i, o a vira b e o l vira m. Mesma coisa com VMS se você der shift uma letra pra frente o v vira w o M vira N e o S vira T e daí WNT ou Windows NT. Tem outras teorias mas eu pessoalmente gosto mais dessa. Hoje em dia na real não significa nada, só um nome mesmo.</p>
<p>Com o objetivo de ser portável o Windows NT implementa uma camada de abstração do hardware, chamado convenientemente de HAL também, ou Hardware Abstration Layer. Vocês veem que nós de programação não somos exatamente muito criativos com nomenclatura das coisas. Além disso o NT começou tentando implementar um micro-kernel, inspirado nas idéias da kernel Mach de Carnegie Mellon. Hoje em dia nós usamos kernels monolíticos ou kernels híbridos. A idéia de um microkernel é ser um kernel o mais minimalista, leve e estável possível rodando no modo de supervisão ou Ring-0 que é o anel de maior privilégio. Eu expliquei isso em outro vídeo. Daí todos os serviços que compõe o sistema rodam em user mode ou Ring-3. O problema disso é que você acaba com um overhead muito grande de IPC ou interprocess communication pois os programas rodando no anel de menor privilégio precisam ficar constantemente se comunicando com o kernel que roda no anel de maior privilégio.</p>
<p>Essa controvérsia de micro-kernels versus kernels monolíticos ou macro-kernels foi tema de grande discussão na comunidade Linux no começo, inclusive é um episódio histórico a discussão de Linus Torvalds defendendo o design monolítico da kernel do Linux contra a visão acadêmica de micro-kernels do professor Andrew Tanenbaum, autor de um dos livros sobre sistemas operacionais mais famosos e que você provavelmente teve que estudar se cursou ciências da computação. Na prática, apesar do design de micro-kernels ser o mais elegante, macro-kernels funcionam melhor como o sucesso do Linux já comprovou.</p>
<p>No caso do NT, por exemplo, subsistemas de drivers de I/O, como video ou mesmo impressão rodavam tudo em Ring-3, em user-mode, como deveriam. Mas no Windows NT 4 eles foram movidos pro Ring-0, dentro do espaço do kernel. Eu costumo dizer que o Windows NT mais estável e robusto era o Windows NT 3.5 justamente porque ele tinha o menor kernel, mas pro hardware da época acho que não tinha muita alternativa. No Windows 2000 ou XP se não me engano eles moveram uma parte do IIS na versão 6.0, pro Ring-0 na forma do driver HTTP.sys. Isso substituiu o Winsock que rodava em user-mode, e eu acho que isso foi um erro. Imagine parte do seu servidor web embutido na kernel incluindo coisas como cache e fila de requests. De qualquer forma isso garantiu melhor performance pro IIS se comparado ao Apache que rodava exclusivamente em user mode, mas ao custo de bugs na stack de HTTP potencialmente causarem problemas no nível do kernel, que poderia levar desde um crash do sistema até a buracos sérios de segurança.</p>
<p>A equipe do Windows NT era formada por muita gente da DEC ou Digital Equipment Corporation, liderada pelo Cutler, e uma das tais idéias que ele trouxe da VMS foi a noção de um sistema operacional orientado a objetos e por isso na arquitetura do NT você tem um Object Manager na camada privilegiada do Windows Executive, abstraindo todos os recursos do sistema na forma de objetos lógicos. Além deles alguns membros da equipe vieram do time do OS/2 que também queria integrar noções de orientação a objetos. Uma das coisas que eu achava fascinante na interface do OS/2, o Workplace Shell, é que tudo eram objetos. Infelizmente isso não foi implementado no Windows. Mas por exemplo, em vez de abrir um programa e clicar no menu em Novo Arquivo, você abria uma pasta de templates e arrastava o template pro desktop pra criar um novo arquivo, como uma instância de uma classe. A idéia de orientação a objetos foi embutido em todos os sistemas operacionais dos anos 90 e por isso coisas como a API de um NextStep sendo orientados a objetos, e você tem abstrações e encapsulamento de comportamento criando coisas como o Hardware Abstration Layer do NT.</p>
<p>Pra todos os efeitos e propósitos, do fim dos anos 80 pro início dos anos 90 eu diria que os sistemas operacionais desktop mais avançados eram o OS/2, o AmigaOS, o NextStep e o Solaris. Eles inspiraram diversos outros como o BeOS ou o Irix. Mas os mais populares eram sem dúvida o MS-DOS, o Windows 3.1 e o System 7. O Windows NT apareceu pela primeira vez em 1993 com o nome de Windows NT 3.1 pra ser paralelo ao nome Windows 3.1 que era completamente diferente e ainda rodava por cima do DOS. De comum eles tinham basicamente a mesma interface gráfica.</p>
<p>Daí em 1995 tudo mudou com o advento do Windows 95, trazendo a era de 32-bits pros desktops populares. Comparado com hoje em dia, eu lembro como a gente achava o Windows 95 pesado, precisando de 4MB de RAM sendo que o Windows 3.1 rodava tranquilamente com 2MB de RAM. No ano seguinte saiu o Windows NT 4.0 com a interface mais parecida com do Windows 95. Os NT, pela natureza da sua arquitetura mais robusta também precisava de mais recursos pra rodar, eu acho que com menos de 8MB ou 16MB de RAM não dava pra rodar decentemente, e por isso eles eram mais usados em servidores.</p>
<p>Nos anos 90 fomos evoluindo do Windows 95 pro 98 até o famigerado Windows ME ou Millenium Edition. E no lado do NT que era mais voltado a servidor fomos do NT 4 pro 2000. Passamos os anos 90 surfando na Lei de Moore e processadores mais rápidos iam saindo o tempo todo, do 486 pros Pentium pro Pentium II, Pentium III, no servidor tínhamos os Itanium. RAM foi ficando mais barato. A grande virada veio em 2001 com a unificação dos Windows no famigerado XP e finalmente nos livramos do legado do MS-DOS por baixo do Windows. Desde então sempre tivemos uma versão de NT pra desktop e outro pra servidor.</p>
<p>Então na era do XP tivemos o Windows Server 2003 e 2003 R2. Com o Windows Vista sucedendo o XP tivemos o Windows Server 2008. Depois o Windows 7 e o Windows 2008 R2. Depois disso o Windows 8 e o Windows Server 2012 e 2012 R2 e na geração do Windows 10 a partir de 2015, que teoricamente vai ter só upgrades sem mudar o nome, tivemos o Windows Server 2016 e Server 2019. O Windows 10 hoje está na oitava edição estável build 1903 de maio de 2019. Essas edições costumam sair entre abril e maio e depois outubro, por isso eu acho que a próxima edição importante vai sair em outubro de 2019.</p>
<p>Eu falei que o NT desde o começo veio com a mentalidade de ser portável, ele não rodava só em Intel. Mas aos poucos o suporte de hardware foi diminuindo à medida que essas arquiteturas foram caindo em desuso. Por exemplo, no Windows 2000 caiu o suporte a MIPS, Alpha e PowerPC. Mas além do lado hardware o NT implementou a idéia de &ldquo;personalidades&rdquo; ou subsistemas. Você tinha a Win32 que é o suporte a API moderna do Windows. Hoje em dia programas 32-bits rodam emulado sobre o WoW64 ou Windows 32 on Windows 64. Mas desde o começo ele foi lançado com suporte a subsistemas como OS/2 que permitia um grau de compatibilidade com a API do OS/2, já que a Microsoft tinha interesse no nicho que eles ajudaram a criar com a IBM.</p>
<p>Claro que eles precisavam manter compatibilidade com o MS-DOS e pra isso eles já embutiam uma virtual machine pra DOS. Sim, um tipo de máquina virtual. E pra conseguir atender contratos de governo que requeriam UNIX eles também tinham um subsistema compatível com POSIX, que como eu já expliquei em outro episódio, é a superfície de compatibilidade com os UNIX da época.</p>
<p>Ou seja, seria possível pegar o código fonte de aplicativos feitos pra UNIX e teoricamente compilar num Windows NT e rodar nativamente! Ele era compatível com o padrão POSIX.1 por isso não tinha um shell ou ambiente de uso e comandos de usuários, coisas como um mísero &rsquo;ls&rsquo;, que só passaria a existir como padrão no POSIX.2. Por isso pra usuários normais de Linux como nós, esse ambiente é basicamente inútil. Só serve se você tinha código fonte em C compatível com POSIX.1 e precisava de um compilador C compatível.</p>
<p>Com a evolução rápida das distros Linux nos anos 90 e igualmente rápido desuso dos UNIX, esse subsistema no Windows era meio inútil. Nesse vácuo, projetos open source como o Cygwin apareceram. Cygwin se chama assim porque foi criado pela empresa Cygnus Solutions que depois foi adquirida pela RedHat. Era um ambiente em user-mode compatível com POSIX e com Linux em particular. E diferente do subsistema POSIX original da Microsoft, eles portaram boa parte do toolchain do GNU no pacote, trazendo shells como bash e além das ferramentas pro compilador, também trouxe diversas outras coisas úteis como awk, sed, tar, ssh, servidores como Apache, Postgres, linguagens como Perl, Python, Ruby, Prolog e muito mais.</p>
<p>Era como uma distro baseada em Linux rodando sobre uma camada que tentava abstrair o NT por baixo na forma de DLLs. Muita gente ainda usa Cygwin até hoje e sempre foi a melhor ou mesmo a única forma de rodar muitas ferramentas de Linux de forma nativa no Windows. Mas Cygwin não se encaixa na categoria de distro de Linux porque ele tem uma semi compatibilidade em nível de código fonte, mas os binários de Linux não rodam no Cygwin nativamente, precisa recompilar sempre.</p>
<p>Com o passar dos anos o subsistema POSIX original foi removido no Windows XP e Windows Server 2003 sendo substituído por outro subsistema que foi originalmente desenvolvido por uma empresa chamada Interix, adquirida pela Microsoft, e sua solução foi renomeada como Windows Services for UNIX ou SFU e você podia instalar opcionalmente. O suporte ao SFU veio gradativamente diminuindo, tendo muitos de seus componentes removidos do instalador até o Windows 8 e Windows Server 2012. Mas pra todos os efeitos e propósitos ele é muito similar ao Cygwin só que o Cygwin é compatível com GNU/Linux e o SFU é compatível com UNIX. Novamente, se você tinha código fonte de UNIX podia compilar no SFU e rodar no Windows.</p>
<p>Em 2004 surgiu a primeira forma de rodar Linux sobre o Windows de verdade, sem virtualização. Foi o Cooperative Linux ou coLinux. Infelizmente a última versão estável dele é de 2011 então não espere que ele funcione hoje em dia. Mas em vez de ser um subsistema ou uma máquina virtual, ele era uma kernel linux modificada que era carregado no Ring-0 do lado do kernel do NT. E ele compartilhava os recursos da máquina com o kernel NT, por isso cooperativo. Isso era possível através de um driver, e drivers rodam em Ring-0 junto com ferramentas como um Windows Service pra dar acesso. Daí em user-land você podia rodar os binários originais de uma distro como Ubuntu ou Arch. Dava pra acessar o terminal via SSH ou mesmo a interface gráfica do X via um VNC. Pra todos os efeitos era quase como rodar um Virtualbox mas sem o overhead de virtualização. Eu imagino que manter suporte de algo assim deve ser bem complicado porque você meio que está lobotomizando o kernel do NT por um hack via um driver.</p>
<p>Como podem ver, rodar Linux ou UNIX sobre o Windows é uma coisa que muita gente já tentou fazer de diversas formas. Com hardware moderno, a opção mais estável é abrir um Virtualbox ou VMWare e rodar virtualizado. Graças à evolução do suporte de virtualização dos processadores, na minha experiência não só é viável mas serve muito bem como máquina principal de desenvolvimento. E quando eu digo hardware moderno estou falando no mínimo de um Core i5 de 4 cores com no mínimo 8GB de RAM, preferencialmente 16GB. O problema de virtualização normal é que normalmente você precisa pré-reservar quantos cores e quanto de RAM vai ser dedicado pra máquina virtual.</p>
<p>Vejam o problema. Com soluções como o subsistema POSIX, o Cygwin ou o SFU tudo roda nativo, não é virtualização. Mas pra funcionar você precisa ter o código fonte de tudo, talvez modificar alguma coisa, compilar e gerar um binário nativo de Windows NT. Se conseguir fazer isso o binário vai rodar como qualquer outro binário de Windows. Por outro lado, é muito difícil conseguir compatibilidade com tudo e muita coisa simplesmente não vai nem compilar sem modificações significativas. Pelo simples fato que as primitivas do kernel do NT são diferentes do kernel do Linux. Já expliquei em detalhes em outros vídeos como o Windows, o Mac e o Linux gerenciam coisas como estrutura de processos, scheduler de threads, memória, I/O de formas diferentes.</p>
<p>Por exemplo, num SFU não adianta eu compilar alguma coisa como o programa &lsquo;ip&rsquo; ou o antigo &lsquo;ifconfig&rsquo;, eles vão tentar mexer em coisas como o /etc/network/interfaces que o Windows NT não usa pra expor suas interfaces de rede. Isso sem contar que coisas como &lsquo;fork&rsquo; funcionam diferente no Windows, como já expliquei no vídeo de gerenciamento de memória. Não adianta eu compilar um programa que gerencia processos via o diretório /proc porque o Windows não expõe os metadados dos processos lá. O sistema de autenticação e permissão são completamente diferentes, então nenhum programa que gerencia usuários e permissões como &lsquo;useradd&rsquo; ou &lsquo;chown&rsquo; vai conseguir modificar nada no Windows. Essas diferenças tornam complicado rodar programas de UNIX ou Linux lado a lado de programas Windows porque existe uma dissociação semântica enorme.</p>
<p>Por outro lado, rodar dentro de uma virtual machine traz a vantagem de isolar completamente os comportamentos de Linux e Windows. De dentro da máquina virtual tudo funciona perfeitamente como se fosse uma máquina de verdade isolada. Daí você controla coisas do host Windows via ferramentas de Windows e coisas de Linux separadamente com coisas de Linux e cada um vive feliz separado.</p>
<p>Vamos ver o caso do macOS rapidamente. Como ele foi construído sobre uma fundação UNIX, todo o sistema operacional obedece às leis do UNIX. Todo programa de Mac é de fato um processo UNIX e pode ser controlado com coisas que todo mundo de Linux conhece. Se eu usar o comando <code>ps</code> no terminal, vai listar processos como o Chrome ou Final Cut. Se eu usar o comando <code>kill</code> no terminal, vai matar de fato os programas todos. Se eu usar comandos como <code>ip</code> eu de fato gerencio as interfaces de rede da máquina, e assim por diante. A API do Mac é construído sobre as APIs do UNIX por baixo. Então a integração é praticamente 100%. Um serviço de UNIX é um serviço de Mac e assim coisas como servidor de SSH ou Postgres rodam lado a lado de serviços do Mac. Usuário de Mac são usuários do UNIX. Permissões de arquivos feitos via o Finder ou feitos via Terminal com comandos como &lsquo;chown&rsquo; ou &lsquo;chmod&rsquo; são a mesma coisa. Por isso existe coerência semântica entre os aplicativos gráficos e os de linha de comando. E a Apple trouxe muito do toolchain GNU pra dentro, então o MacOS é como se fosse um FreeBSD mais bonito, na prática.</p>
<p>Por outro lado, assim como no subsistema POSIX, Cygwin ou SFU no Windows, o macOS tem compatibilidade de código-fonte mas não de binário. Binários formato ELF de Linux não são compatíveis com binários de BSD ou macOS ou Cygwin ou SFU. Por isso no Mac você precisa compilar programas de Linux especificamente pra rodar no Mac e por isso a gente não pode usar pacotes pré-compilados que já existem em distros como Ubuntu ou Arch. Por outro lado, ao contrário de Cygwin ou SFU, o comportamento do macOS, que é parecido com o comportamento do BSD e tem a mesma semântica do Linux, garante que quase todo o código-fonte seja compatível porque coisas como interfaces de I/O, gerenciamento de memória e de threads é significativamente parecido.</p>
<p>Então existe algum trabalho que precisa ser feito no código-fonte de alguns programas, mas no geral, basta recompilar no Mac e tudo magicamente funciona. O mesmo não pode ser dito em ambientes como o antigo subsistema POSIX ou SFU ou Cygwin. E mesmo quando compilam, eles não tem acesso ao resto do sistema Windows.</p>
<p>A grande reclamação do povo de Linux quanto a gerenciar os recursos de um Windows é que tudo precisa ser feito via ambiente gráfico. Por isso gerenciar um servidor remoto sempre exigiu coisas como um Remote Desktop ou VNC pra podermos ter a tela gráfica remotamente. É um puta pé no saco quando em servidores Linux podemos conectar via terminal com um cliente de SSH e gerenciar todos os recursos da máquina via linha de comando. Pra resolver parte disso a Microsoft criou o Powershell.</p>
<p>Em resumo, a história remete ao fim dos anos 90 de novo, quando a Microsoft iniciou o projeto .NET. Com o tempo boa parte, se não toda a API do Windows, foi mapeada em classes dos frameworks disponíveis no .NET, além de componentes COM e WMI. Porém o antigo programa de linha de comando do Windows, o Command, que herda as características do antigo MS-DOS, é um lixo. As linguagens de script que ele traz como o BATCH ou REXX, oriundo da antiga herança do OS/2, são muito fracos e quase nada do sistema operacional é exposto pra linha de comando, você é obrigado a programar coisas como scripts em visual basic pra acessar o WMI ou componentes COM que tem algum acesso a algumas coisas do sistema como gerenciar usuários. Esquece fazer scripts complicados como os que fazemos em Bash pra Linux.</p>
<p>Porém, uma idéia interessante é um console de linha de comando com acesso ao framework do .NET. E é basicamente isso que é o Powershell. Ele trás uma linguagem de script mais poderoso e com muitas coisas que encontramos num Bash. Ele tem inclusive um pipe! E eu argumentaria que um pipe superior ao do Linux. No Linux todo script ou comando aceita argumentos e um stream de bytes que chamamos de standard input e tem uma saída de bytes na forma do standard output, que eu também já expliquei nos vídeos sobre concorrência e paralelismo. E por isso você precisa de comandos como awk ou sed ou grep pra tratar o texto que os scripts devolvem. No caso do Powershell os comandos devolvem estruturas de .NET, ou seja, são dados estruturados.</p>
<p>O episódio nem é de Powershell mas obviamente agora eu empolguei. Eu também acho interessante que muita gente que usa Linux nunca viu Powershell. Pense num script de Bash pra selecionar processos que estão usando mais que 100MB de RAM, como você faria. Num bash provavelmente algo parecido com este script aqui:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>ps -eo rss=,pid=,user=,comm= k -rss |
  while read size pid user comm
  do
    if [ &#34;$size&#34; -gt 102400 ]
    then
      echo &#34;$pid $size $user $comm&#34;
    else
      break
    fi
  done</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Ou seja, precisamos ir linha a linha da saída do comando <code>ps</code> e checar o tamanho em kilobytes até achar o que queremos. Em Powershell podemos fazer assim:</p>
<p><code>Get-Process | Where-Object WorkingSet -gt 104857600</code></p>
<p>E como o Powershell suporta aliases e ele já vem com muitos aliases pré-programados, a mesma linha poderia ser escrita assim:</p>
<p><code>ps | ? WorkingSet -gt 104857600</code></p>
<p>Do ponto de vista de usabilidade pra novatos, a sintaxe do Powershell é muito mais fácil de ler. E pra veteranos de shell existem formas de simplificar pra comandos mais familiares. E veja como estamos usando o pipe pra passar os objetos do ps pro where-object fazer um filtro na propriedade do objeto. E isso é universal pra todos os comandos.</p>
<p>Tecnicamente eu diria que o Powershell pode ser considerado superior em muitos aspectos a Bash ou outros shells de Linux. Eu acho que não é 100% do Windows que pode ser controlado via Powershell mas uma parte considerável pode, e ele pode ser estendido via .NET, então seja via C# ou F# você pode expor o que quiser pra esse shell. E mesmo se você for de Linux pode usar Powershell, porque a Microsoft abriu não só o .NET na forma do .NET Core como open source como também o Powershell na forma do Powershell Core. Aqui o problema é o inverso, ainda não sei quanto do Powershell se integra aos recursos do Linux mas ele pode ser uma opção interessante pra fazer scripts de automação numa linguagem menos cheia de truques se comparado a um Bash, especialmente se estiver rodando coisas como SQL Server pra Linux e outros programas .NET. Ele é particularmente bom pra lidar com dados estruturados como JSON.</p>
<p>Essa tangente pro Powershell foi primeiro pra introduzir vocês ao tema, mas segundo pra dizer que apesar dele ser muito bem feito e eu pessoalmente achar elegante e um passo grande pra Microsoft, ele ainda não resolve o problema de quem quer usar o Bash de verdade e está acostumado com o ferramental GNU. Mesmo o Powershell sendo bacana, a gente ainda quer usar ferramentas antiquadas mas funcionais como awk, sed, grep e tudo mais. A única saída nesses casos é instalar Cygwin ou rodar num Virtualbox já que o subsistema POSIX já morreu, o SFU já morreu, e o coLinux não tem suporte desde 2011.</p>
<p>Até aqui eu expliquei como era possível rodar alguma coisa de UNIX ou Linux no Windows mas e o oposto? Ou seja, rodar programas de Windows no Linux? Se você já brincou de Linux por algum tempo já deve ter ouvido falar ou mesmo usado o projeto Wine ou Wine is not an Emulador que é um acrônimo recursivo, coisa de programador, como eu já disse a gente é ruim de nomenclatura. O Wine é um projeto capaz de carregar um binário feito pra Windows, sem precisar recompilar, e executar no Linux. Pra fazer isso ele mapeia as chamadas de API pra Kernel do NT em chamadas pra kernel do Linux e faz engenharia reversa de dezenas de DLLs que compõe o Windows e com isso ele consegue executar muitos aplicativos de Windows rodando com performance quase nativa em ambiente Linux. Claro, engenharia reversa significa que 100% de compatibilidade é extremamente difícil. Muitos aplicativos abrem e rodam bem, mas algumas partes deles podem precisar de APIs que não foram reimplementados ainda e crashear ou simplesmente não funcionar.</p>
<p>Lembram como no video sobre Ubuntu eu falo como não dava pra rodar todos os games do Windows no Linux? Muitos me lembraram depois que a Steam tem o projeto Proton que permite rodar muitos jogos, mas não todos. Você precisa consultar o site da comunidade, o ProtonDB pra ver se seu jogo roda. Na realidade o Proton usa Wine por baixo. Ele é mais um de uma família de aplicativos que usam Wine e tentam facilitar a instalação de dependências pra programas específicos, como o antigo CrossOver. Por isso o Proton consegue rodar jogos que originalmente foram feitos pra Windows, mas em Linux. O Wine é como se um fosse uma camada de Windows dentro do Linux.</p>
<p>O maior problema é que como os binários do Windows não são código aberto, é preciso fazer engenharia reversa dos binários e reimplementar do zero no Linux. É um processo black-box de desenvolvimento, ou mais corretamente, um grande cornojob de tentar executar o binário do Windows, ver ele crasheando, ver que chamada de sistema ele tentou fazer que ainda não existe e implementar essa função no Linux. Função a função. Wine existe já faz muitos anos e com o tempo ele evoluiu bastante, mas o Windows não parou no tempo também, então cada vez que sai uma versão nova, o Wine ganha mais trabalho pra suportar as coisas novas. É um trabalho insano que me deixa fascinado pelo fato de até hoje ainda existir.</p>
<p>Muito bem, vamos resumir agora. Vocês lembram o que eu já expliquei em outros vídeos. Um sistema operacional é composto de pelo menos duas partes principais, o kernel e drivers e outros subsistemas que rodam no Ring-0 de maior privilégio do sistema. E a outra parte são outros subsistemas e aplicativos que rodam em user-land ou Ring-3 de menor privilégio. Pra rodar os programas de outro sistema operacional você precisa ter as dependências, talvez fazer algumas modificações no código-fonte, recompilar o programa. É o processo que chamamos de &ldquo;portar&rdquo;. É pra isso que serviam ambientes como o subsistema POSIX, o SFU e o Cygwin. É como funciona no macOS hoje ou mesmo nos BSDs. Compatibilidade de nível de código-fonte. Quer rodar programas de Linux fora do Linux, precisa recompilar em todos esses ambientes: Windows, macOS ou outros UNIX.</p>
<p>Pra rodar um binário de outro sistema operacional, sem recompilar, você precisa ter o kernel e dependências rodando lado a lado do seu sistema principal e um mecanismo pra carregar os binários não modificados. O coLinux conseguiu executar a kernel do Linux cooperativamente, compartilhando os recursos da máquina, do lado da kernel do NT, ele conseguia montar um filesystem de Linux e executar os programas de Linux em user-land sem precisar recompilar nada. Você podia rodar os binários de um Ubuntu ou Arch por cima desse ambiente.</p>
<p>Fora isso você tem a opção de virtualização, seja com VirtualBox, VMWare ou Hyper-V, daí você roda tudo em user-land mas com as instruções da VT-X da Intel que permite o kernel virtualizado conseguir acessar o hardware por baixo com menor overhead possível. Você perde 20% ou mais de performance virtualizando, dependendo da configuração do seu hardware, mas no geral tudo funciona perfeitamente. Virtualização é uma opção quase plug-and-play hoje em dia.</p>
<p>Eis que do nada a Microsoft anunciou o projeto Windows Subsystem for Linux ou WSL 1 como podemos chamar hoje. Ele começou a aparecer no Fast Ring do Windows Insider lá pelo Anniversary Edition acho que pelo começo de 2016, e foi lançado de verdade no Creators Update uns 3 meses depois. Hoje em dia temos o WSL 2 que é completamente diferente e já vou explicar porque. Mas o WSL 1 do ponto de vista técnico é muito mais interessante, mas eu entendo porque eles desistiram dessa forma.</p>
<p>Antes de mais nada, a Microsoft faz muita pesquisa, e eventualmente muitos dos resultados dessas pesquisas realmente acabam no Windows de verdade. Um desses projetos foi o Drawbridge que estava pesquisando formas de rodar processos isolados, como em containers, sem precisar de virtualização. Um dos resultados foi permitir o kernel de criar processos com o mínimo ou zero de interferências. Lembram nos episódios de gerenciamento de memória que eu expliquei que dentro do espaço de endereços virtuais do processo o Windows mapeia suas DLLs de sistema e outras coisas pra compartilhar seus recursos com os processos e por isso um processo de 32-bits no Windows de 32-bits nunca tinha os 4GB totais disponíveis pra ele? O resultado desse projeto Drawbridge foi permitir o kernel NT de criar o que eles chamaram de Minimal Process e Pico Process que são processos sem interferência do OS, com o espaço de memória limpo. A diferença de um processo Minimal e Pico é que no caso do Pico existe um driver associado a ele que permite a comunicação desse processo pra fazer syscalls.</p>
<p>Isso existe desde 2013 e o time do WSL resolveu usar esse recurso pra carregar o binário não-modificado de um programa Linux que tem o formato ELF64 pra dentro de um Pico process. Agora pra executar, esse programa vai querer fazer coisas como syscalls pra kernel do Linux. E aí entra a parte do driver. Esse driver vai converter as chamadas pra kernel do Linux em chamadas pra kernel do NT. Então na prática não existe um kernel de Linux rodando. Quando o programa de Linux chamar um fork ele vai ser traduzido pro equivalente NtCreateProcess, ou se chamar fopen ele vai ser traduzido pro NtOpenFile e assim por diante. Na realidade a tradução acontece no nível do assembly, mas a idéia é a mesma.</p>
<p>Como já expliquei, o Windows trata todos os recursos do sistema como objetos, incluindo arquivos e o file system, tudo é roteado pelo Object Manager. E ele sempre teve essa idéia do HAL de abstrair o hardware. E de fato, por cima do NTFS temos o VFS ou Virtual File System. Se vocês já usaram Windows e Linux sabem que existem diferenças em como o filesystem NTFS do Windows e o EXT4 do Linux se comportam. Por exemplo, no Windows não tem como deletar um arquivo que está em uso por algum programa, no Linux podemos renomear ou deletar o arquivo mesmo que ele esteja em uso. São comportamentos diferentes e não defeitos na operação, prova disso é que o WSL 1 replica o comportamento de um EXT4 por cima do NTFS removendo algumas validações e checagens que no NTFS são ligadas por padrão. Inclusive o WSL consegue replicar o comportamento do ProcFS e SysFS pra expor partes do sistema operacional como arquivos, como no diretório /proc que lista processos do sistema como expliquei no episódio de Ubuntu.</p>
<p>Então esse novo subsistema que seria o herdeiro do antigo subsistema POSIX e do SFU emula o comportamento da kernel do Linux, sem de fato ter o kernel do Linux e sim traduzir tudo pro kernel NT, com a vantagem de carregar binários não modificados. Como eu já expliquei antes, tirando a kernel o que muda de uma distro pra outra são os binários de user-land. E como o WSL consegue carregar os programas de Linux diretamente nos processos Pico, sem precisar modificar ou recompilar esses binários, você pode literalmente pegar todos os binários de um Ubuntu ou Arch ou Fedora e rodar em cima desse subsistema.</p>
<p>Uma grande vantagem dessa forma é que ao abrir um Bash e usar comandos como ps ou kill podemos não só manipular programas Linux como programas Windows também. Muitos comandos que num Cygwin seriam inúteis como programas pra configurar interfaces de rede e muito mais passam a funcionar minimamente. Programas que manipulam arquivos podem manipular alguns arquivos do lado Windows também. Foi a primeira vez que programas Linux não modificados puderam rodar lado a lado de programas Windows. Era bizarro porque eu podia abrir o Task Manager do lado do Windows e ver cada programa de Linux individualmente listado. A integração era muito bem feita embora ainda incompleta.</p>
<p>Eu rodei esse ambiente por algum tempo, e apesar de não ser tudo que funcionava, era possível rodar tudo que eu precisava pra desenvolver projetos de Ruby on Rails ou Node.js incluindo bancos de dados como Postgres ou Redis e carregar servidores que corretamente faziam binds nas portas nativas do Windows, e conseguir testar do Chrome do Windows. Seria esse o ambiente perfeito?</p>
<p>Infelizmente havia ainda vários problemas. O maior ofensor eu diria que era a virtualização do file system. Essa virtualização em cima do VFS funciona, mas o VFS é interligado com o Windows Defender e outros antivírus e antimalware. Toda operação de disco no Windows dá trigger pro Defender avaliar se não tem perigo ler o arquivo. Obviamente isso adiciona um overhead gigantesco. Some a isso operações altamente custosas de I/O como um <code>npm install</code> em um projeto de Node e você pode ir tomar um café enquanto espera ele terminar. Isso poderia ser resolvido se a equipe do WSL mudasse a estratégia de tentar manter o file system aberto em cima do NTFS e simplesmente montasse um disco virtual dentro de um arquivão como no formato VHD que Virtualbox ou VMWare usam. Máquinas virtuais costumam montar o filesystem do sistema Guest na forma de arquivos esparsos, ou seja, digamos que você configure um HD de 1 TB dentro do Linux virtualizado mas seu HD de verdade só tem 500GB. Claro que não cabe, mas você não precisa pré-alocar esse espaço, pode só mentir pro sistema virtualizado e só alocar o que ele realmente for usar e ir adicionando novos blocos nesse disco virtual sob demanda.</p>
<p>Mas o problema principal não é esse. O conceito original é mapear syscalls do Linux pra syscalls do kernel NT. Eles esbarraram no mesmo problema que a equipe do Wine tem até hoje: toda vez que sai uma atualização pro Windows, alguma coisa vai quebrar no Wine porque as syscalls e outras dependências mudaram. Então manter essa camada de compatibilidade entre as duas kernels vai ser sempre instável. Toda vez que sai uma versão nova da kernel do Linux, alguém na equipe do WSL vai precisar ajustar essa camada de tradução. Então nunca vai ser possível ter um sistema totalmente estável porque essa é a natureza de wrappers e adapters, eles são alvos móveis.</p>
<p>Ficar fazendo isso desde 2016 demonstrou que como prova de conceito, de fato tudo funciona, mas muitas syscalls de Linux não tem equivalente em NT e davam trabalho de manter. E toda vez que a kernel atualizava tanto do lado Linux quanto do lado NT, precisava ajustar a camada de adaptação. É uma bola de neve sem fim. Por fim eles decidiram mudar a estratégia toda e recomeçar do zero.</p>
<p>É uma pena, porque como eu disse, eu gostava muito dessa estratégia porque uma das vantagens era ter os recursos do Windows como processos em execução, expostos numa camada Linux onde era possível usar as ferramentas de Linux pra mexer em partes do Windows. Se eles conseguissem abstrair coisas mais complicadas como o Registry em alguma forma que pudesse ser gerenciada pelo Bash, ia começar a ficar mais útil ainda, mas aí já era pedir demais mesmo. Pra isso existem coisas como o Powershell. Se a intenção é gerenciar os recursos do Windows pela linha de comando, ainda é muito melhor, mais estável e mais completo usar o Powershell.</p>
<p>Em vez de tentar fazer de tudo, melhor fazer menos mas fazer direito. Já que é muito difícil emular a kernel do Linux como um adaptador em cima da kernel do NT e se simplesmente rodássemos o kernel do Linux de verdade? Seria a estratégia do coLinux, mas em vez de um hack, podemos usar o Hyper-V que nesta altura evoluiu bastante e é muito bom. O problema com programas de virtualização, como expliquei antes é que você normalmente precisa reservar quantos cores e quanta RAM vai ficar travado pra máquina virtual.</p>
<p>Mas durante a evolução do Windows Server pra atender os requerimentos de serviços como o Azure, eles conseguiram evoluir o Hyper-V pra criar máquinas virtuais mais leves e mais flexíveis. Existe a opção de lightweight utility VMs onde ele consegue pedir mais recursos à medida que for precisando. Daí não precisamos desperdiçar 4GB do sistema deixando reservado pra máquina virtual se logo no boot ele só precisa de 500Mb, por exemplo. Além disso existe a opção de não exigir um cold boot, ou seja, um boot do zero. Ele dá a opção de você conseguir carregar o equivalente a um dump da RAM, como no processo de hibernate. Dessa forma você consegue boots quase instantâneos, que levam segundos em vez de minutos.</p>
<p>E como também expliquei no video de virtualização, existe a opção de paravirtualização. Numa virtualização completa o kernel dentro da máquina virtual não sabe que está numa máquina virtual, é um Inception. Numa paravirtualização você modifica o kernel de dentro pra ele estar ciente de estar num ambiente virtualizado e conseguir um comportamento melhor cooperando com o sistema operacional do lado de fora.</p>
<p>Um último componente um pouco inusitado foi a inclusão de uma parte do antigo projeto Plan9, no caso o protocolo 9P que era usado pra file system em rede. Pense assim, como a partir do Windows eu poderia acessar o filesystem do Linux e vice versa se agora o Linux vai rodar de dentro de uma máquina virtual? Existem várias opções como o próprio protocolo SMB e o serviço SAMBA ou mesmo SFTP que é FTP em cima de SSH. A própria Microsoft não se manifestou do porque dessa escolha oficialmente, mas algumas teorias dizem que talvez seja porque o protocolo 9P é mais simples e mais fácil de implementar do que os disponíveis hoje.</p>
<p>De curiosidade o Plan9 é outro projeto da antiga Bell Labs que inventou a linguagem C e o UNIX, na realidade parte das mesmas equipes criaram o Plan9 que era um sistema operacional distribuído em rede. Com o tempo o Plan9 caiu em desuso e a Bell Labs criou o projeto Inferno que tinha como objetivo virar concorrente do então novo Java da Sun, e nas pesquisas de sistemas distribuídos tanto a Sun quanto a Bell Labs chegaram à conclusão que precisariam de uma máquina virtual pra lidar com tantas configurações de rede diferentes disponíveis na época. Vocês podem ver que a história da virtualização vem de longa data, e só nesse episódio vocês viram que nos anos 70, 80, 90 até os 2000 tinha alguma coisa de virtualização em cada solução da época. Virtualização e containerização não são tecnologias novas, são décadas e décadas de pesquisas e experimentação.</p>
<p>De qualquer forma, somando os lightweight utility VM do Hyper-V com a capacidade de boot rápido, mais uma kernel de Linux de verdade customizada pela Microsoft, mais a implementação do protocolo 9P pra exposição do filesystem em rede, e agora temos o Windows Subsystem for Linux versão 2 ou WSL 2. Ela nunca vai ter as mesmas possibilidades de integração com o resto do Windows como o WSL 1 tinha, mas por outro lado ela oferece 100% de compatibilidade binária com Linux, coisa que o WSL 1 nunca ia ter. E como agora o filesystem se tornou virtualizado, ele parou de ter os problemas de performance por causa do Windows Defender também. Por outro lado o WSL2 não oferece ainda opções pra configurar o filesystem virtual, se não me engano ele tem um limite máximo pra 256GB, o que é suficiente pra maioria dos cenários, mas seria bom ter futuramente a opção de expandir esse drive.</p>
<p>Do ponto de vista de performance, sem rodar nenhum benchmark nem nada, eu diria que é a mesma performance que eu já sentia rodando num VMWare, porém reservando menos recursos da máquina no geral. Usando todos os dias tudo vem funcionando exatamente igual funcionaria num Linux em Virtualbox ou Vmware. É um linux virtualizado. E como bônus se de dentro do WSL2 você subir um servidor, digamos um servidor de Rails que se liga na porta 3000, você pode abrir o Chrome do Windows e acessar localhost:3000 e vai abrir normalmente, porque ele faz automaticamente o NAT interno de mapeamento de portas. Isso é ao mesmo tempo bom e ruim, porque se você tiver serviços no Linux com portas que conflitam com portas no lado do Windows, vai ter problemas que podem ser difíceis de diagnosticar.</p>
<p>Do ponto de vista de ecossistema é um passo gigantesco porque se você acompanhou pessoalmente a história que eu contei até agora, como foi o meu caso, se no ano 2000 alguém me dissesse que um dia a Microsoft embutiria o binário da kernel do Linux dentro do Windows, eu diria que a pessoa era louca e devia se tratar. Diferente de alguma coisa como Cygwin, sendo suportado pela própria Microsoft, mais e mais pessoas podem depender dessa opção como algo estável e que vai estar disponível mesmo em futuros upgrades do Windows.</p>
<p>A história foi longa, mas instalar o WSL 2 é super easy, barely an inconvenience&hellip; Quando sair a versão oficial no próximo upgrade do Windows 10 você pode pular o primeiro passo, mas se ainda for setembro de 2019, você vai precisar se cadastrar no programa Windows Insider. Ah sim, só funciona no Windows 10 Pro, o Windows 10 Home não tem suporte a Hyper-V se não me engano. Uma vez cadastrado, você vai precisar habilitar o Fast Ring que vai trazer os builds mais recentes do Windows mas também tem o risco de vir binários instáveis. Habilitar o Fast Ring é concordar que você está baixando versões alfa de muita coisa e instabilidades fazem parte do contrato. Eu venho usando o Fast Ring faz meses e tirando uma ou duas vezes que tive telas azuis, no geral tudo tem funcionado sem problemas graves.</p>
<p>No caso até a data onde estou gravando este episódio está na build 18970. Com o Fast Ring ativado é só deixar o Windows Update baixar as últimas versões. Vai demorar bastante pra baixar e instalar a última versão, vamos esperar um pouco &hellip; só mais um pouco &hellip;. só mais um pouco &hellip;. ah sim, em uma das vezes que fui instalar ele reclamou que eu tinha o VMWare instalado, precisei baixar a versão mais nova pra ele parar de reclamar, mas cuidado com isso: com o Hyper-V ativado, não dá pra usar Virtualbox nem VMWare até eles aderirem às APIs de virtualização da Microsoft. Enfim, uma vez atualizado daí é restartar. Agora você precisa abrir um Powershell como Administrador e digitar o seguinte comando:</p>
<p><code>Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform</code></p>
<p>Isso vai exigir um restart e pronto, agora você já tem WSL. Abra um command prompt ou powershell e garanta que está com o WSL 2 como padrão executando o comando</p>
<p><code>wsl --set-default-version 2</code></p>
<p>E pra instalar o Ubuntu você pode ir na Windows Store, procurar por Ubuntu e instalar. É gratuito. Daí você espera um pouco … configura seu usuário e senha  e &hellip;. Instalado. Primeira coisa que eu sempre faço quando instalo é rodar o apt update e upgrade pra atualizar todos os pacotes. Daqui você pode seguir meu video de Ubuntu e praticamente tudo deve funcionar.</p>
<p>Eu digo praticamente porque o WSL é feito primariamente pra aplicativos de linha de comando como o próprio Bash, coisas como ssh, git e tudo mais. Mas sempre existe a opção de instalar um cliente X no Windows e rotear o DISPLAY do X no Linux pra ser fora dele. Se você não sabia disso, o X é outro capítulo conturbado na história do UNIX e Linux. Nós tivemos o XFree86, depois o X.org e finalmente muitos estão migrando pro Wayland.</p>
<p>Em termos simples, o X é feito pra aplicativos gráficos. A intenção original é que um servidor UNIX com um servidor X poderia servir múltiplos terminais burros, incluindo terminais gráficos, que seriam clientes de X. Pense em servidor web e navegador web, é basicamente a mesma coisa só que em vez de trafegar um protocolo primitivo como o HTTP ele usa um protocolo próprio do X pra enviar comandos como &ldquo;desenhe um botão na tela&rdquo; e quando o botão é clicado essa ação trafega pro servidor X decidir o que fazer e devolver outro comando pra redesenhar alguma parte da tela. Isso até que funciona, o que o povo de desenvolvimento não gosta é da implementação, é um código difícil de dar manutenção.</p>
<p>E as coisas ficaram mais difíceis depois que a Apple mostrou o que era possível fazer com um sistema de composite e aceleração via hardware como o Quartz e a interface Aqua. Como você faz pros clientes X terem os mesmos recursos? Dificulta muito que o X era um monolito, que os drivers das principais GPUs como NVIDIA é proprietário e distribuído só como binário, e as versões open source tem qualidades variadas, e no final o que acaba acontecendo é que você raramente usa o X de forma distribuída e tanto o cliente quanto o servidor ficam na mesma máquina desktop de qualquer jeito. Por causa disso o X tem dois modos de renderização acelerada, a direta onde o próprio servidor X acessa a GPU e o indireto onde ele manda os comandos de OpenGL pro cliente rodar.</p>
<p>No caso do WSL, ele não tem acesso direto a algumas coisas incluindo o hardware de vídeo. Portanto ele depende de um rasterizador via software. Você não tem como rodar o cliente de X dentro do WSL porém você pode rodar o cliente de X de Windows e rotear os comandos de X do WSL via rede pra fora. E vai funcionar perfeitamente bem. Existem duas opções gratuitas e open source que são o VcXSrv e o XMing e uma versão paga que eu pessoalmente acho melhor que é o X410, que eu costumo usar, mas na prática tanto faz. Se eu não estou enganado todos devem suportar o modo de aceleração indireta, basta configurar dentro do WSL uma variável de ambiente dizendo isso, o libgl_always_indirect e adicionar num bashrc pra sempre ter a variável quando se logar.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>export LIBGL_ALWAYS_INDIRECT=1</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Pra rotear os comandos o WSL precisa do endereço IP do host Windows. No WSL 1 ficava tudo em localhost porque pra todos os efeitos e propósitos o WSL 1 rodava lado a lado do Windows e não virtualizado. No WSL 2 como ele é uma máquina virtual, do lado de dentro ele tem também uma rede virtual e o Windows do lado de fora é mapeado pra um endereço local dentro, é um tipo de ponte de rede que traduz o roteamento de pacotes do lado de dentro pro lado de fora. Se fosse localhost bastava fazer a variável Display ser igual a dois pontos e zero. Porém toda vez que a máquina reinicia pode ser que esse endereço virtual mude. Precisamos configurar uma variável de ambiente que aponte pra esse endereço e pra isso podemos fazer o seguinte one-liner, adicionar no bashrc e agora configurar a variável display pra usar o valor</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>export WSL_HOST=$(tail -1 /etc/resolv.conf | cut -d &#39; &#39; -f2)
export DISPLAY=$WSL_HOST:0</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Colocando essas variáveis de ambiente no arquivo .bashrc, toda vez que o bash iniciar ele vai ter essas variáveis. E agora podemos instalar alguns programas gráficos que eles vão aparecer do lado de fora, no Windows mesmo. Vamos instalar o gvim que eu gosto, o terminal Tilix que é o mesmo que eu instalei no tutorial de Ubuntu e o pacote dbus-x11 que programas gnome precisam.</p>
<p>Agora, precisamos instalar o tal cliente X, que como eu disse antes tem opções gratuitas mas eu pessoalmente gosto do X410 que eu já tinha comprado então vamos instalar pela Windows Store. Quando terminar e ele carregar, não esquecer de habilitar pra poder receber conexões da rede pública, se for a primeira vez o Windows Firewall vai apitar pra liberar acesso, libere e pronto. De volta ao bash, como só editamos o script bashrc precisamos ou deslogar e logar de novo ou só recarregar o bashrc com o comando source. Agora podemos abrir o gvim e olha só, abriu fora da máquina virtual, como um programa normal de Windows. Mesma coisa o Tilix e nele podemos configurar a aparência, escolhemos o tema Material … melhor o Monokai Dark … pronto, e agora podemos configurar o tamanho das fontes.</p>
<p>Mas pra mudar o tema geral, das bordas e tudo mais não vamos poder usar o gnome-tweaks. Como não estamos carregando todos os serviços que o gnome precisa pra rodar, se gastar algum tempo em tentativa e erro uma hora o gnome tweaks deve funcionar, mas por agora podemos simplesmente editar manualmente o arquivo de configurações em .config, gtk-3 settings.ini. Dentro dele habilitamos o modo dark, depois declaramos o nome do tema que é o Flat Remix GTK Blue Darker e finalmente o nome do pacote de ícones que é o Flat Remix Blue Dark.</p>
<p>Agora precisamos de fato baixar esses temas e ícones e aqui é a mesma coisa que já fizemos no episódio de Ubuntu, vou seguir exatamente o mesmo tutorial de antes. E como é a mesma coisa, vamos acelerar isso aqui.</p>
<p>Pronto, agora podemos chamar o Tilix de novo boom, tá bem mais bonito não acham? O Gvim também ficou um pouco melhor mas ele ainda está mais cru porque não carreguei nenhum dotfiles que configura ele como o Yadr que mostrei no episódio de Ubuntu.</p>
<p>Até agora eu estava usando o programa Command que vem com todo Windows. A Microsoft veio modernizando o antigo Command pra aceitar comandos de VT100, ANSI e tudo mais e com isso ele hoje é capaz de renderizar corretamente, vocês podem ver que as cores ANSI funcionam perfeitamente. Ele ainda tem cheiro de coisa velha mas comparado a como era até as primeiras edições do Windows 10, foi uma evolução considerável. Mas terminais mais maduros como o Tilix que acabamos de instalar ou mesmo o terminal padrão de um MacOS ainda são melhores.</p>
<p>Em vez de mexer demais no código velho do antigo Command, eles resolveram codificar um novo e com isso existe o programa simplesmente chamado de Terminal que você pode instalar via o Windows Store. Ele ainda está em desenvolvimento e por isso se chama Preview, mas mesmo no estágio atual ele já é muito melhor que o Command, inclusive ele é acelerado via DirectX então coisas como scrolls longos renderiza muito rápido. Vamos abrir e veja como ele é mais moderno com suporte a tabs. A configuração ainda é toda em texto, o que eu não acho ruim. Por exemplo, podemos mudar o tamanho das fontes de todos os perfis. Vale a pena brincar nesse arquivo um pouco pra customizar como você quiser.</p>
<p>Você pode usar esse novo Terminal pro WSL 2 até pra rodar o antigo CMD se precisar de scripts de batch antigos ou também rodar Powershell em outra aba. Ele é totalmente configurável e customizável, suporta abas e pode ser uma boa opção. Eu particularmente prefiro carregar o próprio Tilix e usar um terminal de verdade que suporta split de tela. Tem gente que prefere usar o TMux pra splits mas pro meu workflow um simples split do próprio terminal é suficiente. Se quiser ver o Tmux em funcionamento, veja meu vídeo de Ubuntu onde eu mostro como instalar e usar.</p>
<p>Mas só instalar o Ubuntu é muito fácil. Agora é uma boa hora de mostrar algo diferente. Hoje a Microsoft suporta o Ubuntu, o Fedora e o OpenSuse além de uma distro paga feita especialmente pro WSL 2 que é Pengwin, que se não me engano é uma derivação de Debian. Mas eles tem receitas no GitHub de como você pode empacotar qualquer outra distro de Linux. Desde o WSL 1 havia uma versão de Arch que você podia instalar e eu testei e vi que eles deram suporte pro WSL 2 também, então porque não testar? Mas, aviso que essa demo é meio experimental, ele não tem suporte da Microsoft e muitas coisas não funcionam perfeitamente ainda. Se você for experiente em Linux talvez consiga achar os workarounds, mas se for iniciante, por agora é melhor ficar no Ubuntu mesmo.</p>
<p>Vamos no Google, pesquise por ArchWSL e o primeiro link deve ser a página de GitHub do projeto. Lá tem todas as instruções que você precisa. Baixe o zip, descompacte em algum lugar como no seu diretório de usuário do Windows. Dentro vai ter um executável de Arch, dê duplo clique ou abra o novo Terminal, navegue até o diretório, digite arch e execute. Esse instalador faz menos coisas que o de Ubuntu, o que é esperado pra filosofia Arch de fazer você configurar tudo. Ele vai te logar como root direto. A primeira coisa a fazer é colocar uma senha pro root. Agora vamos criar um novo usuário não-root, configurar a senha, e abrir o visudo pra dar permissão de sudoer pra esse novo usuário. Dessa forma você vai poder logar como esse usuário em vez de root e ter acesso a sudo. … Feito isso podemos sair da sessão do Arch de volta ao Command do Windows e configurar o arch pra carregar com esse novo usuário.</p>
<p>Feito isso precisamos inicializar o pacman que é o gerenciador de pacotes, isso só precisa ser feito uma vez. Uma vez inicializado, mesma coisa de antes, eu gosto de atualizar os pacotes todos e fazemos isso com o comando pacman traço Syu. No Ubuntu começamos instalando pacotes como o build-essential pra ter o toolchain de desenvolvimento. Com o pacman instalamos pacotes como o base, base-devel e vamos aproveitar pra instalar também o gvim, tilix e git.</p>
<p>Seguindo os mesmos passos, vamos exportar as mesmas variáveis de ambiente pra rotear o X….
Pronto, podemos carregar o Tilix. Porém aqui já vemos um problema dessa versão. Programas gnome precisam do dbus pra comunicação interprocessos, incluindo gerenciar configurações. Mas veja as mensagens de aviso dizendo que não encontra o dbus-launch. Um workaround pra isso é chamar o dbus-launch manualmente. De novo, eu não parei pra investigar a fundo quais dependências estão faltando ou serviços que não estão carregando. Se você souber como corrigir isso, não deixe de mandar nos comentários abaixo.</p>
<p>Aliás, uma coisa que notei é que tanto o Ubuntu como esse Arch de WSL não bootam com o systemd, ou qualquer outro init system então nenhum serviço carrega e comandos como systemctl pra iniciar ou parar serviços não vão funcionar. Você precisa carregar serviços manualmente se precisar.</p>
<p>De qualquer forma, só pra mostrar como as coisas são muito parecidas, vou acelerar de novo pela parte que eu baixo os temas Flat Remix, editar o arquivo settings.ini manualmente e … pronto, tilix carregado com o novo tema, igualzinho antes.</p>
<p>E com isso temos um Arch instalado, você pode seguir qualquer tutorial normal de como configurar seu Arch como ambiente de desenvolvimento ou seguir as mesmas instruções que eu mostrei pro Ubuntu.</p>
<p>Agora, vamos voltar pro Ubuntu. Pra demonstrar que tudo funciona, vamos seguir meu tutorial e instalar o bom e velho ASDF como já mostrei antes. …</p>
<p>Não esqueça de colocar os scripts de asdf no bashrc ou equivalente do seu shell pra iniciar sempre que se logar. …</p>
<p>Feito isso podemos instalar o plugin de ruby ….</p>
<p>Agora podemos listar as versões de Ruby disponíveis …</p>
<p>Vamos escolher a mais recente, a 2.6.4 e instalar ….</p>
<p>Oops faltou instalar mais dependências de desenvolvimento do sistema, então vamos começar pelo pacote build-essential.</p>
<p>Ainda temos mais dependências, então vamos instalar …
Oops ele não acha o libgdbm3 então vamos tentar libgdbm
Oops ele não acha libgdbm também, ok deixa ele pra lá, não vamos precisar disso agora mesmo</p>
<p>Pronto, pacotes instalador, então vamos instalar o Ruby 2.6.4. Demora um pouco mas uma hora ele termina.</p>
<p>Não esquecer de configurar essa versão pra ser a padrão do sistema
Ruby instalado, vamos instalar a gem do Bundler</p>
<p>E finalmente, vamos instalar as gems do ruby on rails</p>
<p>Como o Rails hoje usa muito javascript também, inclusive ele integra com o yarn e com webpack, melhor instalar o plugin de nodejs do asdf. …</p>
<p>Pronto, mesma coisa, vamos listar as versões disponíveis e &hellip;
escolher a mais recente, a 12.9.1</p>
<p>Oops faltou configurar as chaves gpg dos repositórios,
então vamos na página de github do plugin</p>
<p>Basta copiar esta linha e executar pra instalar as chaves
Pronto, chaves configuradas, agora podemos tentar instalar a última versão de novo</p>
<p>Quando terminar, não esquecer de configurar essa versão como a global do sistema
Esse passo nem precisa na real, mas eu tenho costume forçar a atualização do npm pra garantir que estou com a versão mais nova.</p>
<p>Vamos instalar o yarn também</p>
<p>Agora, vamos brincar um pouco e criar um novo projeto Rails do zero com seu gerador.</p>
<p>Oops falhou porque faltou instalar o sqlite3. Isso é opcional mas como eu não indiquei nada no gerador ele por padrão espera ter o sqlite3 então vamos instalar.</p>
<p>Como parou o gerador no meio, então vamos entrar no diretório do projeto e rodar manualmente o comando bundle install pra terminar de instalar as dependências.</p>
<p>Agora vamos carregar o rails server pra testar a página de Bem Vindo e oops, como o gerador tinha parado aquela hora ele não inicializou o webpack, então vamos fazer isso manualmente com a task webpacker dois pontos install.</p>
<p>Pronto, agora sim vamos carregar o rails server.</p>
<p>E com meu navegador Opera de Windows, podemos carregar o localhost porta 3000 e veja que funcionou! O WSL mapeou corretamente a porta 3000 de dentro da máquina virtual pra estar acessível do lado de fora no Windows.</p>
<p>Como última parte desse demo, vamos continuar o projeto gerando um controller de rails pra testar mais um pouco. Mas e agora, como vamos editar esses novos arquivos? A partir daqui eu abriria meu gVim devidamente configurado mas eu sei que muita gente migrou pra Visual Studio Code hoje, que eu também concordo que é um editor de textos e uma IDE excepcional. Altamente recomendado então vamos na página dele e baixar o instalador. E sim, vamos baixar o instalador de Windows e instalar do lado de fora no Windows.</p>
<p>Mas e agora? Como o VS Code de Windows vai editar os arquivos do meu projeto que está dentro do WSL? Aqui começa uma das vantagens do WSL ser desenvolvido pela Microsoft, o VS Code automaticamente detecta a existência do WSL, detecta que o Ubuntu é a distro padrão, instala os plugins adequados e agora podemos abrir uma nova janela do VS Code que vai estar conectado no WSL, olha a barra de status, no canto inferior esquerdo, e veja que ele está abrindo o WSL.</p>
<p>Com isso quando mandamos abrir uma pasta ele vai explorar o filesystem de dentro do WSL automaticamente apontando a partir do diretório do meu usuário e de lá podemos abrir o projeto Rails que acabamos de criar.</p>
<p>Então vamos procurar nosso arquivo de index html e editar alguma coisa.</p>
<p>Vamos também editar o arquivo de rotas pra colocar esse controller como raiz.</p>
<p>Agora vamos reiniciar o servidor e recarregar a página no navegador e boom, olha só, funciona de boas. Apesar do WSL 2 ainda não ser tão completo quanto rodar uma máquina virtual de verdade, ele é leve e simples o suficiente pra ser tipo um runtime que roda em background, você pode usar o Terminal no Windows e o VS Code no Windows mesmo e desenvolver quase como se estivesse num Linux de verdade. Pra muitos casos de uso isso pode ser exatamente o que as pessoas precisam.</p>
<p>A última questão que todo mundo tem é, mas e o Docker? Funciona? Vamos no google de novo procurar um tutorial de docker pra ubuntu, os da digital ocean costumam ser bons então vamos nele.</p>
<p>Vamos seguir passo a passo como ele manda, primeiro instalar a chave gpg dos repositórios oficiais do docker.</p>
<p>Adicionar os repositórios como fontes pro apt</p>
<p>Rodar o apt update pra atualizar</p>
<p>Garantir que vamos instalar dos repositórios do docker</p>
<p>Finalmente instalar o docker propriamente dito</p>
<p>E iniciar o serviço com o systemctl e oops</p>
<p>Como eu disse antes, o WSL não boota com o systemd então não existe suporte ao init system e o comando systemctl não vai funcionar.</p>
<p>Mas, podemos executar os daemons do Docker manualmente, e pronto, é meio chato ter que fazer isso toda vez que o WSL reiniciar, mas é melhor que nada.</p>
<p>Continuando o tutorial, vamos adicionar o grupo docker ao nosso usuário. Agora a gente ou desloga fechando o terminal ou só fazemos <code>su</code> pra abrir uma nova sessão direto.</p>
<p>Pronto, checando se tá tudo ok e agora podemos rodar o famoso hello world e ver que tudo funciona.</p>
<p>E pra garantir vamos um passo além e instalar o Postgres no Docker. E mesma coisa, primeiro vamos no Google procurar um tutorial qualquer.</p>
<p>Primeiro, puxamos a imagem do docker</p>
<p>Agora criamos diretórios pra guardar os bancos de dados</p>
<p>Finalmente podemos subir o Postgres dentro do Docker com esse comandão aqui, que vai configurar coisas como o mapeamento de portas.</p>
<p>Pra demonstrar que é o docker nativo de verdade rodando, se rodarmos o comando <code>ps aux</code> podemos ver todos os processos rodando dentro da máquina virtual e temos o postgres aparecendo como deveria. Se você assistiu meus episódios sobre virtualização e containers já entendeu que Docker não é virtualização. Na prática tudo que você roda via Docker roda normalmente como um processo no seu sistema, mas o Docker usa recursos da Kernel do Linux como cgroups pra fazer o sistema operacional mentir pro processo, fazendo esse processo acreditar que está rodando sozinho na máquina.</p>
<p>Como eu já tinha mostrado no episódio de Ubuntu, podemos navegar pro diretório /proc no subdiretório que é o pid do processo e oops, pid errado, vamos listar de novo e pegar o pid certo e navegar de novo</p>
<p>Pronto, agora podemos listar o conteúdo do meta arquivo cgroups e ver como ele está sendo mascarado pelo docker.</p>
<p>Pra todos os efeitos e propósitos, o processo do postgres acredita que está rodando sozinho na máquina, e pra gente do lado de “fora” é só mais um processo rodando como se tivesse sido instalado fora do Docker. Por isso containers de Docker são ordens de grandeza mais leves e performáticos do que uma máquina virtual, porque na prática não existe um hypervisor envolvido, é só uma casquinha muito leve do próprio kernel. O kernel precisa ter esse suporte e por isso não funcionava no WSL 1 porque é difícil recriar isso só com um wrapper em cima da kernel do NT e eles nem chegaram a tentar eu acho. Então o Docker de Windows, pra rodar containers de Linux precisava de fato executar um Linux no Hyper-V pra criar os containers dentro. Aqui é a mesma coisa já que o WSL 2 é uma máquina virtual rodando uma kernel de Linux de verdade, entenderam?</p>
<p>Agora podemos conectar nesse postgres dentro do container através da porta que o Docker mapeou pra fora. Vamos seguir o tutorial e oops ainda não temos o cliente de postgres instalado então vamos seguir o que ele manda instalar.</p>
<p>Oops, ainda falta mais um pacote, vamos seguir a instrução e instalar e agora sim, cliente instalado, vamos rodar o comando de novo.</p>
<p>Pronto! Estamos conectados no postgres, rodando dentro do container do Docker.</p>
<p>Podemos rodar docker ps pra ver quais containers estão sendo executados e podemos pegar o pid do container e com ele rodar comandos como o docker stop pra parar o container e assim derrubar esse postgres.</p>
<p>Eu até acho que nesse ambiente de WSL 2, onde ele não sobe o systemd no boot e por isso não sobe daemons automaticamente</p>
<p>E é isso, o WSL 2 é basicamente um Hyper-V customizado pra rodar um kernel de Linux modificado pela Microsoft. E como a licença GPL obriga qualquer empresa a abrir o código fonte se for modificado, a Microsoft mantém o fork com as modificações no GitHub, e eu vou deixar o link nas descrições abaixo também. Eles vão sempre manter a versão estável mais nova e não devem ficar dando suporte pra kernels antigas, então você sempre vai ter a opção de rodar as distros mais novas. Se precisar rodar Linux velhos, você mesmo vai ter que instalar e configurar tudo manualmente numa máquina virtual Hyper-V do jeito antigo. O WSL 2 é um facilitador pro Hyper-V com um Linux melhor integrado.</p>
<p>Na prática, o WSL 1 era algo parecido com o Wine só que ao inverso. O WSL 2 é mais parecido em conceito com o coLinux, mas na prática é um Linux rodando dentro de uma máquina virtual. Então se você já usava Linux em Virtualbox ou VMWare na prática não tem grandes vantagens, especialmente porque o WSL não expõe tantas opções de configuração como um VMware.  Por outro lado a grande vantagem é o suporte oficial da Microsoft, ou seja, pela primeira vez é uma opção padrão. Veja a integração do Visual Studio Code com o WSL por exemplo. Uma vez que o WSL é um componente oficial no Windows, outras soluções podem começar a se integrar e criar um ecossistema</p>
<p>Eu gostava bastante do conceito do WSL 1, que seria o único caminho pra ter uma camada Linux integrada de verdade na fundação do Windows, o mais próximo que já se chegou do que se tem um macOS sem precisar reescrever todo o sistema operacional. Mas, eu entendo que era bem pouco prático dar suporte. Então o WSL 2 é um bom meio do caminho. Muita gente precisa estar no Windows seja pra usar programas corporativos que só existem em Windows, ou rodar pacotes como os da Adobe que não existem pra Linux ou mesmo fazer desenvolvimento em .NET pra Windows. Agora existe uma opção oficial pra rodar ferramental Linux lado a lado, com uma boa integração. Ele é mais limitado, ainda existem alguns bugs, mas com o tempo isso deve melhorar.</p>
<p>Na prática, se você já usa Virtualbox ou Vmware pra desenvolver em ambiente Linux, não existe de fato muita vantagem em usar o WSL 2. Mas se você quer integrar desenvolvimento de projetos em Node ou Python dentro do Linux junto com outros projetos no Windows usando o mesmo Visual Studio Code, por exemplo, é uma ótima opção. Aliás, apesar de existir um certo suporte nativo a rodar coisas como Node, PHP e Python no próprio Windows, eu altamente não recomendo, o certo é rodar dentro do Linux e ter acesso a tudo que esses ecossistemas oferecem. Toda versão de uma ferramenta Linux no Windows tem limitações, e rodando no WSL 2 ou numa máquina virtual elimina essas restrições. Evite ao máximo rodar ferramentas de Linux compiladas pra Windows, você sempre vai estar usando menos do que as ferramentas oferecem. Nesses casos o WSL 2 interessante pra desmotivar a existência dessas alternativas e simplesmente rodar o original num Linux de verdade, agora suportado pela própria Microsoft.</p>
<p>O único cenário onde eu ainda recomendaria Linux instalado nativo é se você está brincando de machine learning com ferramentas que precisam de acesso direto à GPU. Isso nem o WSL 2 e nem muitas máquinas virtuais vai conseguir te dar. Você precisa de acesso direto ao hardware. O WSL 2 hoje não tem como expor a GPU pra dentro da máquina virtual. Esse é um dos casos que é melhor uma configuração de dual boot se você também precisa de Windows, e se manter num Linux instalado nativamente na sua máquina.</p>
<p>No caso de desenvolvimento Web normal, onde você quer ter um postgres, redis, nginx, nodejs, rails, elixir, o WSL 2 é uma opção excelente e com a integração do Visual Studio, eu acho que se torna um pacote bastante atraente. Eu estou usando os dois, numa máquina tenho um WSL 2 e em outra tenho o VMWare. Como meu dia a dia não é mais ocupado por programação na maior parte do tempo, então pra mim o impacto é muito menor. Se você já testou essas opções, compartilhe sua experiência com o pessoal nos comentários abaixo. Se curtiu o video deixe um joinha, assine o canal e não deixe de clicar no sininho pra não perder os próximos episódios. Por hoje é só, a gente se vê, até mais!</p>
]]></content:encoded><category>linux</category><category>microsoft</category><category>ferramentas-de-desenvolvimento</category><category>akitando</category></item><item><title>[Akitando] #56 - Falando um pouco de MAC, LINUX e WINDOWS | Qual eu devo escolher?</title><link>https://akitaonrails.github.io/2019/07/24/akitando-56-falando-um-pouco-de-mac-linux-e-windows-qual-eu-devo-escolher/</link><guid isPermaLink="true">https://akitaonrails.github.io/2019/07/24/akitando-56-falando-um-pouco-de-mac-linux-e-windows-qual-eu-devo-escolher/</guid><pubDate>Wed, 24 Jul 2019 17:00:00 -0300</pubDate><description>&lt;div class="embed-container"&gt;
&lt;iframe
src="https://www.youtube.com/embed/brIQSA8FtDo"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen&gt;
&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;No episódio de hoje, pegando carona que eu fiz um vídeo sobre instalar ambiente de desenvolvimento em Ubuntu (&lt;a href="https://www.youtube.com/watch?v=epiyExCyb2s"target="_blank" rel="noopener"&gt;https://www.youtube.com/watch?v=epiyExCyb2s&lt;/a&gt;) eu queria aproveitar pra contar vários pequenos momentos e conceitos sobre sistemas operacionais que eu gosto de ficar discutindo.&lt;/p&gt;
&lt;p&gt;No geral eu poderia dizer que é um vídeo “comparando” Linux, Mac e Windows mas a idéia não é escolher um no final mas sim delinear o que aconteceu nos últimos 20 e tantos anos que me fez ficar mudando de sistemas e hardware ao longo do tempo e porque existem algumas opiniões formadas hoje que quem está só começando não consegue entender porque as recomendações são extremas em muitos casos.&lt;/p&gt;</description><content:encoded><![CDATA[

<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/brIQSA8FtDo"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>No episódio de hoje, pegando carona que eu fiz um vídeo sobre instalar ambiente de desenvolvimento em Ubuntu (<a href="https://www.youtube.com/watch?v=epiyExCyb2s"target="_blank" rel="noopener">https://www.youtube.com/watch?v=epiyExCyb2s</a>) eu queria aproveitar pra contar vários pequenos momentos e conceitos sobre sistemas operacionais que eu gosto de ficar discutindo.</p>
<p>No geral eu poderia dizer que é um vídeo “comparando” Linux, Mac e Windows mas a idéia não é escolher um no final mas sim delinear o que aconteceu nos últimos 20 e tantos anos que me fez ficar mudando de sistemas e hardware ao longo do tempo e porque existem algumas opiniões formadas hoje que quem está só começando não consegue entender porque as recomendações são extremas em muitos casos.</p>
<p>Antigamente a gente pedia “pelamor” pros desenvolvedores darem uma chance pros Macs. Hoje em dia o povo não entende porque tem tanta gente ainda recomendando Macs tão veementemente. E no fim, qual é a melhor escolha pra desenvolvedores de software? Vamos descobrir isso hoje.</p>
<p>== Errata</p>
<p>Eu falei que Fedora usa Yum, mas não é verdade, eu esqueci que agora ele usam DNF.</p>
<p>== Seções:</p>
<p>03:03 - Linux
14:00 - Mac
32:45 - Windows</p>
<p>== Links:</p>
<ul>
<li>
<p>How eSports became mainstream (<a href="https://www.diggitmagazine.com/papers/esports-mainstream"target="_blank" rel="noopener">https://www.diggitmagazine.com/papers/esports-mainstream</a>)</p>
</li>
<li>
<p>Why the 64-bit Version of Windows is More Secure (<a href="https://www.howtogeek.com/165535/why-the-64-bit-version-of-windows-is-more-secure/"target="_blank" rel="noopener">https://www.howtogeek.com/165535/why-the-64-bit-version-of-windows-is-more-secure/</a>)</p>
</li>
<li>
<p>Steve Jobs changed the future of laptops 10 years ago today (<a href="https://www.theverge.com/2018/1/15/16892792/apple-macbook-air-steve-jobs-anniversary"target="_blank" rel="noopener">https://www.theverge.com/2018/1/15/16892792/apple-macbook-air-steve-jobs-anniversary</a>)</p>
</li>
<li>
<p>WWDC 2005 Keynote (<a href="https://www.youtube.com/watch?v=B6iF6yTiNlw"target="_blank" rel="noopener">https://www.youtube.com/watch?v=B6iF6yTiNlw</a>)</p>
</li>
<li>
<p>Steam Proton (<a href="https://www.protondb.com"target="_blank" rel="noopener">https://www.protondb.com</a>)</p>
</li>
<li>
<p>Puppy Linux (<a href="http://puppylinux.com"target="_blank" rel="noopener">http://puppylinux.com</a>)</p>
</li>
<li>
<p>DDR5 | O que sabemos desse novo padrão de memória até agora (<a href="https://canaltech.com.br/hardware/tudo-sobre-memoria-ddr5-134725/"target="_blank" rel="noopener">https://canaltech.com.br/hardware/tudo-sobre-memoria-ddr5-134725/</a>)</p>
</li>
<li>
<p>What Is PCIe? (<a href="https://www.lifewire.com/pci-express-pcie-2625962"target="_blank" rel="noopener">https://www.lifewire.com/pci-express-pcie-2625962</a>)</p>
</li>
<li>
<p>NVMe SSDs: Everything you need to know about this insanely fast storage (<a href="https://www.pcworld.com/article/2899351/everything-you-need-to-know-about-nvme.html"target="_blank" rel="noopener">https://www.pcworld.com/article/2899351/everything-you-need-to-know-about-nvme.html</a>)</p>
</li>
<li>
<p>A ZFS developer’s analysis of the good and bad in Apple’s new APFS file system (<a href="https://arstechnica.com/gadgets/2016/06/a-zfs-developers-analysis-of-the-good-and-bad-in-apples-new-apfs-file-system/"target="_blank" rel="noopener">https://arstechnica.com/gadgets/2016/06/a-zfs-developers-analysis-of-the-good-and-bad-in-apples-new-apfs-file-system/</a>)</p>
</li>
<li>
<p>Why John Carmack Chose NeXT For Developing &lsquo;Doom&rsquo; And Other Favorites (<a href="https://www.forbes.com/sites/quora/2016/09/01/why-john-carmack-chose-next-for-developing-doom-and-other-favorites/#6fb22dbb14d1"target="_blank" rel="noopener">https://www.forbes.com/sites/quora/2016/09/01/why-john-carmack-chose-next-for-developing-doom-and-other-favorites/#6fb22dbb14d1</a>)</p>
</li>
<li>
<p>Picking up the pieces: John Siracusa mourns the Power PC (<a href="https://arstechnica.com/gadgets/2005/06/mac-20050607/"target="_blank" rel="noopener">https://arstechnica.com/gadgets/2005/06/mac-20050607/</a>)</p>
</li>
<li>
<p>NextSpace (<a href="https://trunkmaster.github.io"target="_blank" rel="noopener">https://trunkmaster.github.io</a>)</p>
</li>
<li>
<p>Scaling from 2,000 to 25,000 engineers on GitHub at Microsoft (<a href="https://jeffwilcox.blog/2019/06/scaling-25k/"target="_blank" rel="noopener">https://jeffwilcox.blog/2019/06/scaling-25k/</a>)</p>
</li>
<li>
<p>Rocketz Workstations (<a href="https://rocketz.com.br/workstation"target="_blank" rel="noopener">https://rocketz.com.br/workstation</a>)</p>
</li>
<li>
<p>AkitaOnRails - Optimizing Linux for Slow Computers (<a href="https://www.akitaonrails.com/2017/01/17/otimizando-o-linux-para-computadores-lentos"target="_blank" rel="noopener">https://www.akitaonrails.com/2017/01/17/otimizando-o-linux-para-computadores-lentos</a>)</p>
</li>
</ul>
<p>=== Script</p>
<p>Olá pessoal, Fabio Akita</p>
<p>Seguindo na discussão sobre instalação de ambiente de desenvolvimento de software, eu acho que preciso responder, por que diabos eu uso Windows 10? E na realidade a resposta é bem menos interessante do que parece.</p>
<p>A resposta mais simples é porque na prática não faz quase nenhuma diferença se você estiver usando hardwares como o meu. O episódio de hoje vai ser longo, porque eu comecei a escrever e fui jogando vários assuntos aleatórios na mistura. Quando começamos a falar de sistemas operacionais eu tenho vários conceitos e histórias que acho importante dar contexto. A idéia foi trazer vários pontos que eu considero interessantes e falar tudo de uma vez do que tentar diluir em múltiplos episódios. Mas no final eu acredito que vocês vão sair com um entendimento maior do que simplesmente diferenciar um sistema de outro pelo visual, então tenham um pouco de paciência hoje.</p>
<p>(&hellip;)</p>
<p>Desde pelo menos 2013 eu não uso computadores com menos de 16GB de RAM. E recentemente meus dois computadores principais, um Lenovo Thinkpad Extreme e um PC torre que comprei da Rocketz ano passado, tem 32GB de RAM. Ambos tem placas NVIDIA, o primeiro com um GTX 1050 que é mais que suficiente pra um notebook, e o segundo com um bom GTX 1070Ti do ano passado que não é topo de linha, mas até pra gaming 1080p a mais de 100fps é bem suficiente.</p>
<p>Meu primeiro Mac foi um Mac Mini G4 de 2003 com processador Power PC G4 de 1.25Ghz, não lembro se tinha 2GB de RAM, HD mecânico de 40GB, mas praquela época já tinha USB-2 e Firewire 400. Eu lembro que brinquei muito de editar vídeos com iMovie e gravar em DVD. Eu tive depois o primeiro Macbook branco de 13&quot; com processador Intel Core Duo. E meu último Mac foi um Macbook Pro 15&quot; de 2014 com tela retina display, Core i7, 16GB de DDR3, 512GB de SSD e vinha com a GeForce GT 750M com 2GB de GDDR5. Na minha opinião a última série de Macbook Pro ainda à frente do seu tempo, quando o teclado ainda era bom, quando não tinha touchbar, quando havia Magsafe pro cabo de força.</p>
<p>Mas, eu acho que a grande maioria das pessoas assistindo não está muito disposto a gastar mais que 1000 dólares numa máquina, de preferência menos. E eu concordo com vocês, especialmente se eu tivesse 25 anos eu não poderia comprar nada muito mais caro que 500 dólares, e parcelado, claro. Como eu já disse no episódio de Ubuntu, vocês não precisam de uma máquina tão topo de linha assim. Em desenvolvimento de software, a menos que você esteja programando apps Android e precisa subir aquele emulador lento, uma máquina Core i3 Skylake, com 4GB de RAM, e até com HD mecânico deve ser suficiente pra maioria dos casos. Daí com o tempo você troca o HD mecânico por um SSD de 256GB, um HD externo via USB-3, e mais 4 GB de RAM pra ficar com 8.</p>
<p>A idéia não é ser uma divisão perfeita, mas vamos começar essa conversa de hoje falando um pouco sobre Linux primeiro, depois vou falar de Mac e depois de Windows. Se você viu meus episódios da série de Back-end onde eu explico sobre threads e schedulers, já sabe que existem diferentes formas de estratégia pra threads. E os 3 sistemas operacionais principais: Windows 10, macOS e as várias distros Linux usam estratégias de schedulers diferentes. O melhor sendo o CFS do Linux. O MacOS e o Windows implementam multilevel feedback queue, pense em múltiplas filas com prioridades, mas por alguma razão a implementação do Windows continua sendo a piorzinha. É aquele momento que tudo dá uma engasgada, fica um pouco lento, daí volta. Ou você tá assistindo youtube ou netflix, deixa outra coisa rodando por trás e em algum momento seu vídeo perde frames, dá uma engasgada. É o tipo de coisa que acontece com frequência em máquinas fracas. Eu raramente vejo porque tenho máquina sobrando. Mas é uma coisa que em Linux e Mac não acontece nem de longe com tanta frequência mesmo em máquinas mais antigas.</p>
<p>Lembram a metáfora de threads tendo que esperar a vez e o scheduler mudando a thread de mesa às vezes e o custo relacionado a mover os dados de uma core pra outra? Até algumas versões atrás o Windows fazia algo muito burro, não lembro se já corrigiram. Se você tinha cores sem fazer muita coisa, ele pegava a thread em execução e mudava pra outro core. Do nada, em vez de simplesmente manter na core que ele tava. Ele tentava ser preemptivamente mais esperto e isso causava overhead desnecessário. É exatamente o tipo de coisa que raramente acontece no macOS ou Linux. Sendo honesto, eu não tenho visto acontecer no Windows também, mas ainda não sei o quanto é porque meu hardware tá compensando isso.</p>
<p>Falando em schedulers, além de schedulers de threads como o Completely Fair Scheduler ou CFS, também temos schedulers pra I/O como o Completely Fair Queue ou CFQ. Se você usa HD mecânico e muitos processos querem fazer coisas no disco ao mesmo tempo, dá pra imaginar que não dá, então você vai também precisar de algum tipo de queue ou fila pra gerenciar isso. E no Linux você pode trocar os schedulers de threads e os schedulers de I/O.</p>
<p>Numa máquina parruda, com muitos cores sobrando e SSD veloz, você sempre mantém o default que é CFS com CFQ ou noop pra não precisa gastar computação gerenciando filas pro I/O, já que SSDs são ordens de grandeza mais rápidos que HD mecânicos e conseguem lidar com muita concorrência. Se por outro lado você está numa máquina mais devagar, pode mudar do CFS pro MuQSS e do CFQ pro BFQ ou o Budget Fair Queue, além de configurar o swapiness da kernel pra evitar ao máximo usar swap de disco e criar mais gargalo no seu HD lento. São as coisas que explico no meu artigo sobre configurar Linux pra máquinas lentas que vou deixar de novo nas descrições abaixo.</p>
<p>Além disso você pode somar configurações assim com distros preparadas pra instalar componentes mais leves do que os Ubuntu da vida, e evitar que você precise manualmente ficar instalando vários pacotes. Exemplo disso seria um Lubuntu, ou Light Ubuntu, ou também um Puppy Linux que é baseado em Debian. Como parêntese alguns me falaram do Pop OS mas eu não gostei muito dele, é basicamente um Ubuntu pré-configurado e com repositórios extras pra facilitar instalar algumas coisas como tensorflow. Mas não vi grandes vantagens não. Primeiro quero ver se ele dura, já que foi criado e é mantido por uma pequena empresa tentando vender hardware customizado. Já vi isso acontecer antes com distros como Lindows, mas que sumiram. Um Mint ou Elementary pelo menos já existem faz alguns anos e continuam sendo suportados. Pra eu instalar como daily driver, precisa ter mais tempo de existência. Prefira escolher distros que já tem alguns anos de estrada.</p>
<p>Dentre as dezenas de distros que existem, eu acabo preferindo os mais maduros e com ecossistemas maiores, aqueles que todo tutorial que você abre tendem a ser os primeiros.  Nessa categoria você tem principalmente os derivados de Debian. Ubuntu é um fork de Debian. Mint e Elementary são customizações em cima do Ubuntu, todos usam pacotes DEB com gerenciador APT. Você tem os derivados de RedHat como Fedora pra desktop ou CentOS pra servidor, e tem o Suse que é meio primo deles também, todos usam pacotes RPM com gerenciador YUM. Você tem os derivados de Arch como o Manjaro que usam Pacman. E tem os mais de nicho antigos como Slackware e Gentoo.</p>
<p>Uma característica que pode ou não ser um problema pra você no caso de Debian é que a intenção dele é ser sempre uma distro estável e confiável, e isso significa que ele demora bem mais pra oferecer versões mais novas de softwares mais novos. E faz sentido, tudo que é novo e ainda não foi testado o suficiente sempre deve ser considerado potencialmente bugado ou instável. Mas como desenvolvedores a gente muitas vezes precisa das coisas instáveis também, e por isso tem forks como um Ubuntu da vida, que oferece versão um pouco mais estável que são os LTS ou Long Term Support como o atual 18.04, que a Canonical deve fornecer suporte por uns 5 anos pelo menos, e versões mais bleeding edge, ou instáveis com coisas mais novas pra testar, que é a versão ímpar 19.04, que vai ter suporte bem menor. Mais ou menos o mesmo princípio você tem com CentOS sendo mais estável do que Fedora que tem pacotes mais recentes. Arch é sempre mais instável porque ele vai atualizando pra frente como se não houvesse amanhã. Não quer dizer que ele tem problemas, só que tem mais chances de ter, ele é uma bicicleta sem rodinhas, você tem que saber andar sozinho sem apoio.</p>
<p>Eu disse que Arch você vai sofrer se for iniciante, mas minha recomendação teve um pingo de compaixão. Arch pode parecer um pouco complicado no começo, mas ele é um sistema moderno, com gerenciador de pacotes e dependências bem competente, e com um dos melhores Wikis disponíveis em qualquer distro. Tem ampla documentação e suporte. Agora se você quiser ir pra um nível mais hardcore, precisa tentar Slackware. É a distro mais antiga ainda sendo mantida, desde 1993. Ele é um dos mais simples e mais parecido com o UNIX original e sua filosofia de KISS (keep it simple, stupid). Ele nem tem um gerenciador de dependências propriamente dito. Seus pacotes são meros tarballs, tipo zip se você não sabe o que é um tarball.</p>
<p>Em algum momento acho interessante tentar Slackware, mesmo hoje em dia. O Slack foi minha primeira distro em 1995. Não vou dizer que tenho boas memórias dele. Mas se quiser ir ainda mais um nível hardcore, você precisa experimentar o Gentoo cuja filosofia é baixar só código fonte e compilar tudo, literalmente tudo, na sua própria máquina. O sistema Portage dele é meio inspirado no Ports do BSD. Essa é uma distro pra você que tem muita curiosidade, muito tempo e principalmente muita paciência.</p>
<p>A maioria das distros mais novas por alguma razão acabam derivando de Ubuntu, caso do Pop OS. Um dos mais promissores na linha de Mint ou Elementary hoje seria o Deepin, que eu acho que é um dos mais bonitos e mais próximos da usabilidade de um MacOS sem tentar ser um clone exato. E de bônus, pra quem gosta de Arch e Manjaro, também tem a versão Manjaro Deepin que você pode usar em vez do Manjaro GNOME. Aliás, tem isso também, muitas distros já trazem versões pré-configuradas com diferentes desktop managers, como GNOME, KDE, Cinnamon, XFCE, o do Deepin que usa kwin, que é derivado do KDE Plasma, e outros mais exóticos com o i3 que muitos adeptos de teclado estão adotando.</p>
<p>Isso tudo dito, em PCs mais fracos não tem o que pensar, eu definitivamente recomendo instalar um Linux pra tirar o máximo da máquina. Em PC mid-range ou topos de linha eu acabo ficando no Windows puramente pelo suporte. Veja bem, minha situação é diferente da maioria das pessoas: meu dia a dia hoje não é mais ser programador tempo integral. Independente dos meus motivos pessoais, a recomendação ainda é tentar se manter no Linux como máquina primária. No meu caso, na maior parte do tempo eu vou acabar ficando em web apps, gmail, twitter, reddit, calendar, dashboards de AWS ou Google Cloud, e é tudo web. Coisas que tem clientes nativos como Dropbox, Zoom, Skype, tudo funciona bem em todos os sistemas operacionais. Apesar de eu não me incomodar com Google Docs ou Google Spreadsheet, eu ainda não gosto do Slides e mesmo a versão online do PowerPoint eu não me vejo usando. Ainda prefiro as versões nativas de apps do Office. De novo, é um gosto pessoal.</p>
<p>E mesmo o PowerPoint, tem várias coisas que ele faz até melhor que todo mundo mas em termos de usabilidade e produtividade ainda não supera o lendário Keynote da Apple. Mas tudo bem, em termos de pacotes de produção de conteúdo, eu gosto de ter acesso ao Adobe Creative Cloud, que só tem pra Windows e Mac. Mesmo em Mac eu ainda não trocaria Photoshop por qualquer outro produto. De novo, tudo gosto pessoal aqui. Entenda que metade da minha preferência pessoal é o fato de eu ter anos de experiência em ferramentas Adobe ou Apple. Se você nunca usou essas ferramentas, não vai sentir falta, então se começar com LibreOffice Impress, Google Slides, Da Vinci Resolve, Gimp, Inkspace, vai se acostumar. Em trabalhos criativos a ferramenta tem menos importância do que o treino artístico do profissional.</p>
<p>Se você não precisa de pacotes Microsoft, ou Adobe, ou não tem necessidade de desenvolver pra iOS, qualquer PC com qualquer boa distro Linux deve mesmo ser a primeira escolha. Você não está perdendo nada. Como muitos me lembraram depois, o Steam tem a opção do Proton e com isso a maioria dos games roda bem hoje em dia em Linux também. Dota 2, CS Go, Rocket League, Skyrim, Fallout, vai rodar. Se você joga Pubg vai ter problemas. Por baixo dos panos ele usar Wine e DXVK mas você não precisa ficar configurando manualmente jogo por jogo, por isso tá bem mais viável com o suporte da Valve hoje em dia.</p>
<p>Ou seja, numa máquina boa, o Windows funciona bem o suficiente pra eu esquecer que estou usando ele. E se você precisa de produtividade, realmente não quer ficar deixando sua máquina principal com risco de ficar instável, e nesse sentido não há nenhum grande problema em ficar no Windows. Mas na realidade, enquanto estou escrevendo este script eu estou muito tentado a voltar pro Linux como sistema primário. Entrei no Arch Wiki e vi que meu Lenovo Thinkpad X1 Extreme funciona perfeitamente com exceção do leitor de impressão digital, que não faço tanta questão de usar. Então eu acho que depois de editar este video vou instalar o bom e velho Manjaro, talvez o Deepin. Acompanhem minhas redes sociais pra ver como vai ficar.</p>
<p>Agora vamos pra parte 2, sobre Mac, o que eu realmente gosto é a consistência. Em Linux você tem diferentes desktop managers como GNOME, KDE, e por aí vai. Com diferentes toolkits gráficos como GTK, Qt, Tcl/tk, e isso faz com que cada aplicativo fique com sensação de &ldquo;fora do lugar&rdquo; se rodar misturado. Pegue um Kdenlive, que é feito com o toolkit Qt pra KDE,  ele fica fora do lugar rodando num GNOME. Ou um Gimp rodando num KDE. A interface gráfica de Linux é uma zona. Aliás, parece que estou falando mal, mas calma, a nova interface do Gimp, por exemplo, ficou sensacional se comparado como era antes, e inclusive recomendo que dêem uma olhada. Isoladamente, cada aplicativo é muito bom, especialmente com os refinamentos de hoje em dia, mas como um conjunto eles são muito inconsistentes em usabilidade.</p>
<p>No mundo Windows é um pouco parecido porque a Microsoft não se compromete numa única linguagem de design. Desde o Windows Vista eles vem tentando modernizar a interface, mas aí mesmo entre os aplicativos da própria Microsoft você tem aberrações como o aplicativo principal de Settings pra maioria das configurações da máquina, mas ainda tem o antigo Control Panel pras coisas que ele ainda não modernizou. Coisas simples como botões, tem o estilo pseudo-3D em apps velhas, tem botão cinza, tem botão translúcido. Cada hora é de um jeito. Coisas bestas como o console ou o Notepad, só começaram a ser modernizados agora. Olha como o Notepad contrasta ao lado da Calculadora. Eu abro muitas coisas e parece que voltei pro Windows XP. Especialmente se pegar programas mais antigos de terceiros que não se atualizaram.</p>
<p>A Apple iniciou a idéia de um Human Interface Guideline ou HIG décadas atrás, literalmente um guia de usabilidade e design visual de todos os elementos do sistema operacional. A forma com que eles conseguiram manter esse HIG consistente e sempre se atualizando é que os aplicativos que a própria Apple desenvolve usam o HIG e os aplicativos feitos pela própria Apple tendem a ser muito bem feitos, e todos os usuários querem os mesmos elementos em todos os outros aplicativos. Eles são tão bem feitos, que até usuários de fora do Mac gostariam que seus apps em Linux e Windows ficassem parecidos. Olha esse dialog box pra escolhe arquivos do MacOS e veja o do Deepin que falei antes, ou o Finder no Mac e o file manager do Deepin. Está bem claro que o Deepin gosta da estética do MacOS também. Então sempre existiu tentativas assim de se criar temas e skins pra Linux e Windows ficarem mais parecidos com Macs. Quando você viu um usuário de Mac tentando tematizar o Mac pra ficar com cara de Linux ou Windows?</p>
<p>No Mac é tudo mais consistente. Manter consistente foi um risco que se pagou. Eles determinaram e cumpriram linhas de corte drásticos que na época deixou muita gente descontente, mas hoje o resultado se paga. Quando Steve Jobs voltou pra Apple ele trouxe o lendário NEXTStep que é o desktop manager e os frameworks de desenvolvimento de aplicações feitos em Objective-C. Quando eles evoluíram o NEXTStep pra virar o OS X eles fizeram uma camada de compatibilidade binária com o Mac classic. Então se você executasse um binário de Mac antigo ele conseguia rodar. Facilitou que o OS X rodava no mesmo processador dos Macs antigos, o IBM Power PC e foi assim de 2000 até 2006.</p>
<p>O NextStep foi a parte da Next que sobreviveu. Muitos talvez reconheçam a Next por causa da workstation Cube onde Tim Berners Lee desenvolveu o primeiro protótipo de um navegador web e o protocolo HTTP. Ou onde John Carmack desenvolveu o lendário Doom. As capacidades de desenvolvimento num Next eram reconhecidas como de fato as melhores da época. Se você abrir um Interface Builder do Xcode de hoje, é algo muito parecido com que eles usavam no fim dos anos 80 num Next.</p>
<p>Enquanto a linha de hardware morreu, o NextStep foi padronizado como OpenStep junto com a Sun. No mundo Linux surgiu o desktop manager chamado WindowMaker que tinha o look and feel do NextStep mas na verdade foi feito em C. E teve o GNU Step que era uma tentativa de implementação dos frameworks em Objective-C. A idéia é que um dia um app de NextStep podia ser compilado em GNU Step e rodar em Linux. Recentemente descobri um projeto que está incompleto e eu não testei ainda mas que se chama NextSpace e é uma tentativa mais moderna de ter um ambiente NextStep em Linux. Ele tem a cara do antigo WindowMaker mas implementando da forma certa os frameworks todos em Objective-C. Se ele for bem sucedido, seria até possível pegar códigos fonte de aplicativos simples feitos pra Mac e recompilar em Linux usando esse framework. Ele está fazendo o caminho certo: em vez de tentar reimplementar os frameworks e o visual de um Mac moderno, ele está fazendo o mesmo caminho que a Next fez pra dentro da Apple em 1998.</p>
<p>Voltando pra história, quando anunciaram o beta do novo sistema operacional, codenome Rhapsody, a idéia era um NextStep onde você podia rodar só aplicativos novos feitos em Objective-C e os apps antigos do Mac classic rodariam num Yellow Box que era basicamente uma camada de emulação. Claro, os desenvolvedores ficaram muito bravos. Eles queriam que os aplicativos deles funcionassem nativamente no novo sistema operacional, mas ninguém estava muito a fim de reescrever tudo que se tinha antes em Object Pascal ou C pra Objective-C. Por isso a Apple resolveu desenvolver um framework intermediário, mais compatível com a API do Mac classic. Esse conjunto de APIs intermediários foi chamado de Carbon. Você precisava modificar algumas partes do seu código antigo e recompilar usando o framework novo que dava acesso aos recursos modernos do OS X, como permitir multi tarefa preemptiva e modo de memória protegido. Era o processo de carbonização.</p>
<p>Daí em 2006 eles fizeram um dos movimentos mais interessantes que eu vi no mundo de tecnologia até então: mudar os Macs dos processadores Power PC pra Intel. Eu lembro quando assisti o Keynote e fiquei muito impressionado com a estratégia. Mais ainda porque desde 2001 nós ouvíamos mesmo rumores de que o OS X, por ter a estrutura UNIX e tudo mais, não deveria ser tão difícil de recompilar em Intel. E Jobs anunciou exatamente assim, foi sensacional. Na prática, a IBM provavelmente estava mais interessada nos processadores que estava vendendo simultaneamente pra Sony nos PS2, pra Microsoft nos Xbox originais e pra Nintendo nos GameCubes. A promessa que eles fizeram de um processador G5 de 3Ghz passou 2 anos e eles não entregaram pra Apple, e isso obviamente fez Steve Jobs ficar com cara de bobo por ter prometido isso 2 anos atrás. E um Jobs bravo não é exatamente fácil de negociar.</p>
<p>Frigir dos ovos, fora IBM, olá Intel. Alguém na IBM deve ter pensado pfff foda-se, duvido que eles nos abandonem, vão fazer o que, ter a dor de cabeça de migrar tudo pra Intel? É exatamente o que um Jobs bravo faria, e fez. Pra isso funcionar eles fizeram uma estratégia em etapas. Binários antigos de Power PC rodariam sobre uma camada de emulação chamada Rosetta, de uma pequena empresa que a Apple comprou. Essa camada traduzia as instruções RISC de PowerPC em instruções x86 em tempo real. Óbvio que era mais lento, mas era muito impressionante.</p>
<p>Toda aplicação mais nova, já desenvolvida no framework derivado do NextStep, que a essa altura tinha sido renomeado de Cocoa, só precisava assinalar um checkbox na IDE XCode. Fizeram uma apresentação de como pediram o código fonte do lendário Mathematica que rodava em Power PC e com algumas horas de tweaks no código e assinalando o tal checkbox, já se tinha um binário pronto pra rodar nativo em Intel. Aliás, esse keynote inteiro é de longe uma das melhores apresentações de transição de roadmap de produto que eu já vi, é uma aula que eu recomendo que vocês assistam. Vou deixar linkado o keynote nas descrições abaixo.</p>
<p>Até esse ponto muita gente preferia desenvolver no antigo CodeWarrior da MetroWerks, que era o que se usava pra escrever código pra Mac classic. Pra migrar pra Intel era preciso compilar via o novo XCode 2 e foi assim que o CodeWarrior morreu e todo mundo passou a adotar XCode. Ironicamente o CodeWarrior ganhou notoriedade quando a Apple migrou dos processadores Motorola 68000 pra PowerPC, e agora perdeu o bonde na segunda transição.</p>
<p>Todo aplicativo antigo que já tinha sido carbonizado também era praticamente só recompilar. Ao recompilar eles trouxeram outra tecnologia do NextStep: os Fat Binaries que foram renomeados como Universal Binaries. Um dos recursos mais interessantes pra mim no OS X e NextStep era o conceito de bundles. Tecnicamente em vez de você dar duplo clique em cima de um binário executável, você manda executar um bundle, que é simplesmente uma pasta especial com um arquivo de manifesto e algumas convenções de subpastas e nomes. Daí o OS X procura dentro dessa pasta o binário pra Power PC ou pra Intel dependendo de onde está rodando e executa o certo. Daí quando precisou migrar de 32-bits pra 64-bits foi a mesma coisa: recompilar e gerar os binários e fica tudo no mesmo bundle. Esse conceito de universal binary foi outra coisa inteligente na época que me deixou impressionado, porque eu estava vendo no Windows começar a aparecer coisas como o diretório Program Files (x86) ao lado do diretório Program Files, que é um troço que ainda existe no Windows até hoje. Isso sem contar o buraco negro radioativo que são os diretórios System32 e WOW64.</p>
<p>A Apple só conseguiu fazer isso porque a quantidade de pessoas usando Macs era muito pequena, só alguns poucos milhões. Então não tinha tanto problema se uma porcentagem pequena dos usuários ficasse alienada sem conseguir atualizar por conta de aplicativos legados que não iriam mais rodar. O ideal era todo novo aplicativo ser feito já usando os frameworks do Cocoa, em Objective-C, com XCode. E pra facilitar mais ainda, 2 anos depois desse anúncio eles lançam o iPhone, e nem 2 anos depois o Xcode passa a suportar compilar pra processadores ARM, usando frameworks derivados de Cocoa, em Objective-C, então mesmo se a maioria das pessoas não fosse adotar XCode e Objective-C, a urgência de querer desenvolver pra iPhone automaticamente criou essa necessidade e foi assim que Objective-C passou de uma linguagem obscura que quase ninguém usava além de desenvolvedor de Mac pra uma das linguagens mais reconhecidas nos anos 2010. E aqui eles demonstraram novamente, que não importa se você acha que uma linguagem é bonita ou feia, o que trás adoção pra linguagem é um killer app, no caso o iPhone e sua App Store. Sem um killer app, uma boa linguagem está morta.</p>
<p>Nesse sentido, acabou dando tudo certo pra Apple. Eles tiveram a possibilidade de começar praticamente do zero com o OS X, migrar os principais aplicativos aos poucos via carbonização ou reescrever direto em Cocoa. Ajudou que a fundação era baseada em UNIX então havia muito código aberto que podia ser reusado no processo, vindo tanto dos ecossistemas de BSD e de Linux. Vocês podem ver que esse processo de nascimento e evolução do OS X foi extremamente fascinante de se ver, e com os novos hardwares, qualquer programador antenado queria muito entrar nesse ecossistema o quanto antes, e por isso eu migrei pra Mac em 2004 e me senti ainda mais justificado com tudo isso que aconteceu.</p>
<p>Quando a adoção de iPhone aumentou a adoção de Macs, ao mesmo tempo comunidades web como Ruby on Rails já haviam entrado nesse vagão. O fato de Ruby vir pré-instalado em Macs ajudou muito. O fato de muitos aplicativos de Linux serem compatíveis no nível do código fonte também ajudou. Daí nasceram muitas ferramentas que são usadas até hoje e são parte fundamental do desenvolvimento tanto Web como Mobile. No começo era muito chato usar ferramentas open source no OS X porque a gente precisava baixar os fontes e compilar tudo na mão e torcer pra compilar. Aos poucos surgiram ferramentas automatizadas como o antigo Fink que tentava imitar o apt-get do Debian pra ser um repositório pra baixar pacotes em formato DEB, mas teve muito pouca adoção e suporte e morreu. Outra tentativa foi o MacPorts que tentava simular o Ports do BSD pra baixar pacotes de código fonte e compilar toda vez que baixava. Esse até durou alguns anos mas morreu também.</p>
<p>O que sobreviveu e existe até hoje é o Homebrew que é o gerenciador de pacotes que todo desenvolvedor de Mac usa e é feito em Ruby. No mundo mobile mesma coisa, a gente precisava organizar dependências ou manualmente usando coisas como submódulos de git, ou baixando as bibliotecas manualmente e jogando em pastas no projeto. Mas então surgiu o CocoaPods pra gerenciar dependência de projetos pra iOS, e ele também foi feito em Ruby. Outro dia vou falar mais de Ruby, mas os rubistas foram os que começaram a ajeitar o Mac pra ficar boa pra ser usada por qualquer desenvolvedor. O pacote Oh-my-ZSH pra trocar Bash por ZSH, de novo, foi feita por outro rubista.</p>
<p>Eu falei no começo que no mundo Linux e Windows a linguagem visual dos aplicativos é toda misturada. No mundo Mac, essas transições meio que forçaram o desenvolvimento de novos aplicativos usando os frameworks mais modernos e os guias HIG da Apple. E com a adoção de parte do mundo open source, e o desenvolvimento acelerado de apps iOS, a gente tinha um app bom atrás do outro surgindo. Editores de texto como o TextMate 2 que nós da comunidade Ruby começamos a usar dita a linguagem de todo novo editor de texto até hoje. A idéia de um editor rápido e simples que pode ser extendido via plugins, com recursos pra fazer pesquisa fuzzy em nome de arquivos, diversos shortcuts e macros pra expandir templates de código.</p>
<p>Se você usa Sublime Text, ou Atom ou Visual Studio Code e abrir o TextMate 2 com os diversos plugins instalados, vai ver como a gente tinha exatamente a mesma coisa que se tem hoje só que em 2004. Nenhum outro sistema operacional tinha um TextMate. E foi assim que surgiu a nova geração de plugins de Vim e Emacs que elevaram esses editores ao que eles são hoje também. O renascimento de vim como editor mais moderno veio muito dos plugins feitos pra Rails por outro rubista, o Tim Pope. Pela primeira vez as tendências principais de desenvolvimento de software estavam iniciando primeiro nos Macs e sendo levados pra Linux e Windows depois. Só considere que quase toda ferramenta que você usa hoje, de GitHub a Heroku, foi feito por desenvolvedores usando Macs.</p>
<p>A estética da Apple influenciou a web moderna, começando com o visual do Aqua original com seus elementos parecendo plástico translúcido, como os iMacs antigos, e depois se tornando mais metalizado como os PowerMac Titanium, e finalmente se tornando mais minimalista seguindo a identidade de aplicativos de iPhone. Hoje eu diria que o design e estrutura de apps e sites meio que convergiu e está mais estável, mas não havia lugar melhor pra estar entre 2006 a 2010 se você fosse desenvolvedor de software. E se você assistiu meu video da Apple e GPL que vou deixar linkado aqui em cima, também sabe que nesse período foi quando eles contrataram o Chris Lattner que evoluiu o LLVM até o clang substituir o GCC e desenhou a nova linguagem Swift. Desenvolvimento de software no mundo Apple era realmente empolgante com tudo isso.</p>
<p>Você tinha um pacote muito atraente: na época os Macs tinham preços até que competitivos mesmo se comparado aos PCs. Com a vantagem que os PCs eram objetivamente piores. O design industrial era desastroso pra dizer o mínimo. As configurações padrão eram fracas. Iniciativas como netbooks foram um fracasso. O Windows Vista da época não estava exatamente atraindo novos usuários. Pensa que o Windows 7 só veio a sair em 2009, ano que todo mundo queria Mac pra desenvolver apps pra iPhone. E pensa que só um ano antes tinha acabado de sair o Macbook Air que obliterou a imagem que a gente tinha de notebooks e iniciou a categoria de ultrabooks.</p>
<p>Sério, os PCs de antes de 2011 eram ruinzinhos, e muito feios. Os da Apple por outro lado, era um modelo melhor que o outro saindo frequentemente. Dava vergonha abrir um notebook PC do lado de um Macbook. Mas foi a partir de 2012 que as coisas começaram a virar. Steve Jobs estava mais ou menos certo: as tecnologias da Apple estavam uma média de 5 anos à frente do mercado. Incluindo I/O mais veloz com coisas como Lightning e Thunderbolt, o conceito de unibody enclosure, tecnologia de baterias, as telas Retina num mundo que ainda vendia monitores 720p todas descalibradas, o melhor trackpad até hoje ainda, e os melhores teclados em notebooks.</p>
<p>Mas, Steve Jobs morreu em 2011, e com ele foi enterrado também a visão e estratégia da Apple. O Mac Pro trashcan em 2013 iniciou um período de idade média dos hardwares Pro da Apple. A bolha de apps pra iPhone já estava estabilizando por 2014, então isso não ia mais acelerar venda de novos Macs. E pra piorar a partir de 2015 eles começaram a errar a mão nos Macbooks. Os teclados com switches butterfly são a pior construção que eu já vi, além de na prática serem rasos e desagradáveis pra longos períodos de digitação. O touchbar removendo teclas que são úteis pra desenvolvedores não ajudou em nada. Manter o mesmo unibody enclosure e ir entuxando CPUs que esquentam mais e mais como os Core i7 e os Core i9 causando thermal throttling não ajudou também. Eles esqueceram como em 2005 eles decidiram até mudar de CPU porque os G5 esquentavam demais pros produtos que a Apple queria fazer.</p>
<p>A Apple foi aumentando os preços e entregando menos. E nesse vácuo todos os outros fabricantes foram ficando melhores, em todos os segmentos, tanto em smartphones, como notebooks, como desktops. A Dell veio lançando um XPS melhor que outro faz uns 4 ou 5 anos já. A Lenovo veio lançando Thinkpads cada vez melhores e retornando à antiga glória. Mesma coisa com HP, Acer e outras marcas tradicionais. As marcas chinesas começaram a aparecer mais e mais com Xioami, Huawei e novas marcas começaram a pegar nichos mais premium com os notebooks da Razer. Chegou a hora de explorar a 3a parte deste episódio e pisar no mundo PC um pouco.</p>
<p>O mundo gamer explodiu por conta das iniciativas do governo da Coréia do Sul desde o ano 2000. Os torneios de eSports foram crescendo de meros 10 torneios no início do século pra 260 em 2010 a quase 700 em 2012. O Twitch foi lançado em 2011 e em 2015 já tinha mais de 4.5 milhões de visualizações únicas. Foi quando começou a sair as principais franquias de hoje como LOL, Dota 2, CS:Go, cada um atraindo milhões de novas pessoas a eSports. A Nvidia estava com placas ficando cada vez melhores como a GeForce 600 na arquitetura Kepler. A AMD que a Apple adotou como padrão entrou num vácuo até recentemente. A Apple perdeu o bonde do mundo gamer.</p>
<p>Se você não for gamer pode não parecer, mas a profissionalização de eSports ajudou em muito a evoluir mais rápido todos os componentes de PC. Antigamente era de fato fácil montar um PC equivalente mais barato que um Mac, mas eu sempre tive a sensação de que o resultado final não chegava perto. Por exemplo, não era comum montar PCs com porta Firewire 800. Mas hoje é comum PCs com Thunderbolt 3. Hoje eu diria que existem configurações de hardware superiores e não parece mais que eu estou perdendo alguma coisa. Pelo contrário, agora parece que ficando no Mac eu estou perdendo muita coisa boa no mundo PC.</p>
<p>Pra facilitar, o Windows 10 apareceu pra limpar a zona que foi do Vista até o 8. Conseguiram consertar o start menu, tiraram a porcaria da barra de Charms, otimizaram o suficiente pra não ficar pesado em máquinas mais fracas. E pra completar a partir de 2012 a própria Microsoft começou a entrar no nicho de tablets e ultrabooks com a linha Surface. E aqui eles acertaram bastante. E de fato, fazer o próprio hardware definitivamente ajuda a Microsoft tanto a ter uma linha de referência pros parceiros quanto a otimizar melhor o sistema pra um hardware de verdade em vez de depender só do feedback dos OEMs.</p>
<p>Uma nova geração de desenvolvedores começou a entrar na Microsoft. Foi recente que eles pularam de um headcount de aproximadamente 2 mil desenvolvedores pra 20 mil. Isso trouxe um exército de jovens programadores que cresceram sem o viés de achar que tudo que não é Windows é inimigo. Ajudou muito que eles resolveram se aventurar no mercado de infraestrutura como serviço pra competir com a AWS e fizeram o Azure. O Azure expôs todas as fraquezas do Windows como servidor. E eles se viram na necessidade de aprender com o que o Linux já tinha conquistado até então. Tecnologias como Hyper-V evoluíram muito desde então, o suficiente pra se tornar úteis no mundo desktop também.</p>
<p>A migração de 32-bits pra 64-bits ajudou a Microsoft porque muitos novos dispositivos de segurança se tornaram possíveis com essa mudança, como ASLR ou Address Space Layout Randomization. Explicando de forma simples, eu ensinei no meu episódio sobre gerenciamento de memória sobre endereçamento. Se um hacker sabe em que endereço determinada função com bug de segurança é sempre carregado, fica fácil de atacar. Em 32-bits eu posso mudar de lugar, mas você lembra como tem poucos endereços no final pra aplicação. Então mesmo mudando de lugar, via força bruta, dá pra achar ainda. Em 64-bits a dificuldade aumentou exponencialmente. Esse é um dos recursos habilitados em Windows de 64-bits dentre outras e isso ajudou a diminuir muito a superfície de ataque dos hackers. Apesar de ainda existir centenas de vetores de ataque você pode ver como não é mais tão frequente ouvir falar de Windows 10 em 64-bits sendo atacado de forma tão vergonhosa como foi Windows XP.</p>
<p>E com Hyper-V se tornando componente padrão pra segurança criando coisas como secure enclosures em hypervisor, por exemplo, no novo Windows Defender. Não é difícil ver que as coisas realmente mudaram dentro da Microsoft. Hoje em dia eu tenho um Malwarebytes instalado mas me dá a impressão que só o Windows Defender é suficiente pra maioria dos casos. E pros casos mais exóticos eu ainda tenho a opção de abrir o Windows Sandbox, que é um Windows virtualizado em Hyper-V pra rodar coisas inseguras. Ele sobe um Windows vazio, eu posso instalar até um virus ali, e ele não tem acesso à máquina hospedeira. E quando eu fecho o sandbox, tudo dentro dele morre.</p>
<p>Esse tipo de uso de tecnologia me empolga bastante e, claro, eu posso fazer tudo isso num Mac ou Linux também. Mas de novo, eu gosto de coisas que vêm por padrão, oferecendo consistência. E falando nisso, uma coisa que o Windows nunca pôde fazer, foi começar do zero. Ele ainda é obrigado a trazer diversos binários antigos pra manter compatibilidade com programas velhos. Em seu mérito, é possível pegar um programa binário que rodava até em Windows 98, e provavelmente vai executar no Windows 10. Nenhum outro sistema operacional tem esse nível de retrocompatibilidade binária.</p>
<p>Porém isso também significa que existem muitos vetores inseguros pré-instalados. Muitos aplicativos que obviamente tem cara de que foram feitos nos anos 90. Claro que eu preferia que eles parassem de suportar e forçassem todo mundo a escrever em frameworks mais novos. Mas do tamanho que Windows já era no ano 2000 e o tamanho que é hoje, não seria realista. Ironicamente antigamente todo mundo só fazia apps pra Windows, mas hoje a Microsoft tem mais dificuldade em convencer desenvolvedores a fazer novos apps pra Windows. O Windows Store parece um deserto se comparado à Apple App Store. Mas dentro dessas restrições, eu diria que o Windows 10 está andando numa velocidade até razoável.</p>
<p>No caso do Mac, logo quando o OS X surgiu, eles fizeram três coisas muito importantes. Primeiro foi manter as parcerias originais. Trazer a Microsoft pra dentro pra eles fazerem uma versão do Office e do então Internet Explorer 5 foi muito importante. Com a demora da entrada da Adobe, a própria Apple se viu obrigada a cobrir o buraco. Primeiro com produtos da linha profissional como Final Cut e Logic Pro. Mas depois com o conceito de hub multimídia e os produtos da suíte iLife como iPhoto, iMovie e iDVD. Esses produtos ainda são bons hoje nas novas versões, mas naquela época eles eram imbatíveis. Sem exageros, muita gente comprava iMacs pra ter o iLife.</p>
<p>Muitos dos primeiros YouTubers aprenderam a lidar com multimídia via iMovie. No Windows tínhamos uma zona chamada Windows Movie Maker, um Windows Player que não decidia o que queria ser, se um jukebox ou um tocador. As tecnologias multimídia dos Mac sempre foram superiores. Nessa época os desktop managers do Linux também estavam babando pra interface Aqua dos novos OS X.</p>
<p>E isso foi outro fator que me interessava. Trazer o NextStep pra dentro da Apple como OS X trouxe outras tecnologias que ninguém mais tinha. Na década de 80 ex-funcionários da Apple fundaram a Adobe e inventaram o Postscript. Pense em Postscript como um HTML, com a intenção de possibilitar o famoso WYSIWYG ou What you see is what you get, ou seja, o que está aparecendo na tela ser igual o que vai aparecer quando mandar pra impressora. Isso foi revolucionário porque criou o mercado de desktop publishing.</p>
<p>Essa tecnologia evoluiria pra Display Postscript e depois Display PDF que virou o Quartz no OS X. O desktop manager do novo OS X, em vez de seguir a zona que é o X no mundo UNIX, foi criado do zero pra ser um monolítico que desenha todas as janelas de todos os programas como elementos de composição num PDF. Tudo que poderia ser acelerado via OpenGL em placa gráfica, que era novidade na época. Isso possibilita adicionar elementos de pós-produção, como transparências, sombras e animações fluidas. Em 2000 isso funcionava bem no iMacs, apesar de um pouco lento. Mas os processadores G3 da época conseguiam suportar.</p>
<p>Isso se pagaria poucos anos depois, quando processar esse tipo de coisa passou a ser barato pras novas placas gráficas. Eles tomaram a decisão de ser um pouco mais lentos no começo mas sabendo que em 1 ou 2 gerações estaria na velocidade correta, tanto por otimizações de software quanto pela própria evolução do hardware. Em 2000 qualquer um diria &ldquo;isso é desnecessário&rdquo;. Eu acho que o fato deles estarem no fundo do poço e desesperadamente precisando se recuperar fez a Apple de 1998 tomar muitos riscos que nenhuma empresa tomaria hoje em dia.</p>
<p>Se você não sabe o que é compositing. Pense num sistema primitivo. Você tem janelas de vários programas. Eles vão sendo desenhados por cada programa numa certa área de um buffer, tipo uma matrix, que chamamos de frame buffer. Em 1/60 avos de tempo o sistema operacional pega o que está nesse buffer e manda pro monitor mostrar. Se eu mexo uma janela na frente da outra, as duas precisam redesenhar tudo. E pra ficar fazendo sombra de uma janela na frente da outra, 60 vezes por segundo, custa muito tempo. Em vez disso pense agora organizar uma nova abstração, tipo um canvas virtual, onde cada janela fica em layers e a janela de cima não sobrescreve a imagem da janela de baixo. E como num photoshop podemos ir aplicando efeitos como sombra num layer de cima e dinamicamente ele vai aplicar a sombra nos layers de baixo. Mas tudo isso feito via OpenGL na época, falando com a GPU, que foi feito pra aplicar efeitos em quadros muito rápido, o suficiente pra renderizar 60 quadros por segundo, e sem precisar que a CPU se meta. Com isso ganhamos animação fluida usando a GPU em vez da CPU.</p>
<p>Fazer um desktop manager com compositing não é trivial, especialmente se você já tem um jeito legado de fazer e agora ter que mudar. A Apple teve a visão de implementar isso em 2000. Foi mais uma daquelas coisas que você não sabia que precisava até ter visto. Só que depois de ver as animações fluidas, sem engasgos, sem fritar sua CPU, você olhava pro seu Linux e Windows que ainda desenhavam do frame buffer direto pra tela via CPU, e não tinha como ter aqueles efeitos e animações sem fritar sua CPU que ia precisar processar 30 quadros por segundo pelo menos.</p>
<p>Eles precisavam delegar isso pra GPU como a Apple estava fazendo. Mas levou até 2005 pra surgir o Compiz e Kwin no Linux, depois de muita experimentação, e mesmo assim ainda não 100%. E levou até 2007 pra lançar o Windows Vista com o mesmo sistema de compositing, que só ficaria completo e passou a ser obrigatório no Windows 8. Ou seja, na prática, nessa primeira década, só num Mac você tinha visuais agradáveis e lisos. Hoje em dia felizmente tanto os novos Linux quanto Windows 10 já usam sistemas de compositing e até High DPI que é pra monitores com alta densidade de pixels escalar os elementos da tela da forma correta, coisa que a Apple até hoje ainda é a única que faz 100% direito.</p>
<p>O que a Apple fez entre 2000 e 2009 nenhuma outra conseguiu fazer. Eles conseguiram rebootar o ecossistema inteiro, começar do zero com uma plataforma realmente à frente do seu tempo, criando um novo ecossistema consistente de ponta a ponta, incluindo ao lançar novos produtos como o iPhone que manteve a programação muito consistente mesmo que os binários fossem executar em arquiteturas tão diferentes quanto ARM e x86.</p>
<p>Eles evoluíram o LLVM ao ponto de conseguir se desvincular do GCC como compilador, coisa que em Linux ainda não está 100%. E com isso mudar de linguagens de Objective-C pra Swift, sem perder compatibilidade binária. Como eles conseguiram manter uma API unificada com os frameworks Cocoa, fica muito mais fácil de manter as coisas. Do lado da Microsoft eles foram fazendo tentativa em cima de tentativa e cada tentativa errada foi gerando mais dependências que hoje estão todas acumuladas no Windows 10 ainda. A Apple foi cortando fora as coisas velhas. Por exemplo, o suporte a 32-bits no MacOS já acabou em 2017. No Windows isso ainda vai durar alguns bons anos porque tem milhões de pessoas ainda presas em máquinas velhas só de 32-bits.</p>
<p>Então dos anos 2000 até 2005 a Apple estava se recuperando, reconstruindo as fundações quase do zero. OS X novo, novos iMac e a sorte grande de terem conseguido fazer o iPod dar certo. De 2005 a 2007 eles tiveram o trabalho de migrar tudo de PowerPC pra Intel. E de 2009 a 2012 foi a consolidação graças ao boom do iPhone. De 2013 em diante foi sentar nos louros e seguir a receita.</p>
<p>Dos anos 2000 até 2010 o mundo PC ficou correndo atrás sem saber muito pra onde ir. Todo mundo foi afetado com o crash da bolha da internet em 2001. Mas com a presença da Apple tão claramente demonstrando porque tudo que eles faziam estava errado, demorou uma geração inteira até finalmente eles começarem a copiar e finalmente ultrapassar a Apple de novo. Em 2019 as diferenças são mais do tipo: a caixinha de som do Macbook ainda é melhor. O SSD da Apple realmente ainda é um pouco mais rápido. E a integração do sistema operacional com o hardware ainda é muito bom. Tirando isso, qualquer combinação de hardware PC com Windows ou Linux está praticamente igual pra todos os efeitos práticos.</p>
<p>A grande virada pra desenvolvedores eu acho que vai ser o lançamento do Windows Subsystem for Linux versão 2 daqui alguns meses. Eu estou usando hoje em versão alfa. Em resumo é uma máquina virtual Hyper-V mais leve do que o normal porque ele não vai precisar pré-reservar CPU ou RAM e parece que consegue gerenciar recursos sob demanda. Então o custo inicial é razoavelmente barato e com start rápido, especialmente pra rodar tudo em linha de comando. Então se você sobe Docker pra Windows hoje, que também usa Hyper-V por baixo, vai ficar melhor.</p>
<p>Na prática o Windows 10 com WSL2 vai se tornar um sistema operacional com duas cabeças. Mas a cabeça Linux ainda vai rodar isolado. No MacOS a fundação inteira foi trocada pra UNIX e ele vem colhendo os benefícios disso até hoje. Isso não vai acontecer no Windows, eu diria talvez nunca. Então rodar oficialmente virtualizado é a segunda melhor coisa. Por outro lado, como o MacOS é um UNIX não compatível com Linux, não tem como baixar um binário de Linux e rodar direto no Mac. Isso vai ser possível no WSL que é literalmente um kernel de Linux rodando virtualizado, então em termos práticos, o mundo Windows vai ter acesso a muito mais do mundo Linux do que o Mac tem hoje.</p>
<p>Graças à Apple hoje temos PCs e notebook muito melhores. São mais leves, construídos com materiais muito mais elegantes e sofisticados do que só plástico e ferro. A Apple introduziu alumínio ao mundo e todo mundo vem experimentando com novos materiais como magnésio ou fibra de carbono. Os fabricantes aprenderam que a gente paga mais pra não ter que ter plástico. Os componentes hoje funcionam muito melhor integrados. Os firmwares das placas mães ficaram mais inteligentes, PCI-express facilitou a vida de todo mundo. SSDs e RAM ficaram muito mais baratos e acessíveis. E até a porcaria da placa gráfica integrada da Intel já serve pra maioria das coisas que precisamos hoje como assistir Netflix em 4K.</p>
<p>Se você está começando agora deve ficar mesmo confuso porque desenvolvedores mais experientes como eu passaram por esses períodos que eu falei. Muito do que se fala mal de Windows hoje é porque a gente sofreu com Windows XP. Muito do que se fala bem dos Macs é a fase de ouro até o lançamento dos iPads. A mesma coisa dos Linux, muito desenvolvedor que hoje usa Mac não consegue se ver tendo que sofrer pra instalar e customizar um Linux até ficar agradável pra usar, mas naquela época a gente não tinha Elementary ou Deepin. E pra mim, eu tenho gostos superficiais e pra mim visual faz diferença, e não ter a opção de desktop managers com compositing fazia muita diferença. No Windows a gente teve que esperar até sei lá, depois de 2009 pro Aero funcionar de verdade quando o Windows 7 ficou mais estável. E levou do Windows 8 até o 10 pra nova linguagem de interface Metro finalmente começar a ser mais adotada. Ou seja, eu realmente não recomendava e ainda não recomendaria usar Vista, 7 ou 8. O Windows 10 é o primeiro Windows que demonstrou interesse em cortar coisas fora e gastar tempo limpando a casa em vez de só ficar adicionando inutilidades como aquela horrível barra de Charms.</p>
<p>Eu disse que se você precisa desenvolver pra iOS, não tem o que escolher, você é obrigado a ter um Mac. Porém, não se preocupe em comprar os mais novos. Mesmo se você comprar um Macbook Pro usado de 2016 ainda vai funcionar razoavelmente bem. É muito difícil de justificar o custo de um Mac, especialmente com o dólar caro em relação ao Real. Mas a boa notícia é que hoje em dia comprar um bom PC não dá mais aquela sensação de estar escolhendo uma opção de segunda linha. Se você precisa desenvolver em .NET fique esperto, na prática, vai ser obrigado a usar Windows mesmo, mas dependendo do tipo de desenvolvimento, com o novo .NET Core você pode ter praticamente tudo que precisa num Linux e desenvolver com o Visual Studio Code. Caso você não saiba disso hoje é possível instalar SQL Server no Linux também e compilar e rodar programas .NET feitos em C# ou F# nativamente num Linux, é uma opção suportada depois que eles compraram a Xamarin. E com os frameworks da Xamarin ainda é possível fazer aplicações tanto pra iOS quanto pra Android, então existem várias opções ainda a serem exploradas no mundo Linux.</p>
<p>E por tudo isso, eu diria: se você tem dinheiro sobrando, na real tanto faz. Macbook Pro, Thinkpad X1 Extreme ou Carbon, Razer Blade, Asus Zephirus S, tem uma variedade muito boa. Se você for jogar ou criar conteúdo, escolha alguma com uma GTX topo da série 10 como as 1080 ou 1070 ou os mid-tier com 1660. Ou se quiser mesmo rasgar dinheiro, compra com as novas RTX série 20.</p>
<p>Se você não tem dinheiro sobrando, não se sinta mal em não estar comprando um Macbook. Procure os Dell Inspiron, Acer Switch, os HP Presario com Core i3 pelo menos. Antes pesquise no Google sobre a compatibilidade desses modelos com Linux. Escolha uma boa distro como um Ubuntu, Manjaro. E mesmo nessas máquinas dá pra ser criador de conteúdo, com um pouco mais de paciência, você consegue rodar Blender, Gimp, Kdenlive, Inkscape, Da Vince Resolve, Audacity e pra maioria dos casos você deve conseguir trabalhar normalmente.</p>
<p>Em 2016 meu objetivo de migrar pra Linux depois de mais de 10 anos usando Macs foi porque primeiro eu não tenho lealdade nenhum com a Apple. Não havia mais nada que me empolgava na Apple o suficiente pra ficar lá. E eu não ia ser aquele cara com Mac falando pras pessoas “usa lá Linux, dizem que funciona”. Eu só recomendo o que eu pessoalmente já usei como ferramenta primária por algum tempo, senão prefiro não recomendar. Eu não tenho lealdade com a Apple, também não tenho lealdade com a Microsoft e apesar de ter elogiado, ainda tá longe, mas bem longe do que eu gostaria que o Windows fosse. E também não sou ativista então nesse episódio longo veja que eu não disse nenhuma vez que você devia usar Linux por causa do aspecto de software livre. Estou sendo bem pragmático: do ponto de vista de produtividade, programação, gaming e criação de conteúdo, hoje em dia você tem PC antes de Mac e Windows e Linux antes de MacOS. Mas, mas, se você tem acesso a todas as opções, tanto faz na real.</p>
<p>E por hoje é isso aí, já fiz muito bikeshedding pra um episódio só. No final isso tudo foi um pouco uma desculpa pra eu contar alguns dos episódios da história da Apple que eu gosto, a migração do Mac Classic pro OS X, depois a migração de Power PC pra Intel. Acho uma pena que a Apple de hoje não se parece muito com a Apple daquela época, mas pelo lado bom, ainda bem que a Microsoft de hoje está muito melhor que a Microsoft daquela época. E como eu sempre digo: o mercado anda em ciclos. Espero que tenham gostado da história. Se ficaram com dúvida mande nos comentários abaixo, se curtiram mandem um joinha, assinem o canal, cliquem no sininho pra não perder os próximos episódios e continuem compartilhando com seus amigos pra ajudar o canal. A gente se vê semana que vem, até mais!</p>
<p>No episódio de hoje, pegando carona que eu fiz um vídeo sobre instalar ambiente de desenvolvimento em Ubuntu () eu queria aproveitar pra contar vários pequenos momentos e conceitos sobre sistemas operacionais que eu gosto de ficar discutindo.</p>
<p>No geral eu poderia dizer que é um vídeo “comparando” Linux, Mac e Windows mas a idéia não é escolher um no final mas sim delinear o que aconteceu nos últimos 20 e tantos anos que me fez ficar mudando de sistemas e hardware ao longo do tempo e porque existem algumas opiniões formadas hoje que quem está só começando não consegue entender porque as recomendações são extremas em muitos casos.</p>
<p>Antigamente a gente pedia “pelamor” pros desenvolvedores darem uma chance pros Macs. Hoje em dia o povo não entende porque tem tanta gente ainda recomendando Macs tão veementemente. E no fim, qual é a melhor escolha pra desenvolvedores de software? Vamos descobrir isso hoje.</p>
]]></content:encoded><category>apple</category><category>microsoft</category><category>linux</category><category>akitando</category></item><item><title>Rodando Arch Linux sobre o Windows 10!</title><link>https://akitaonrails.github.io/2018/04/29/rodando-arch-linux-sobre-o-windows-10/</link><guid isPermaLink="true">https://akitaonrails.github.io/2018/04/29/rodando-arch-linux-sobre-o-windows-10/</guid><pubDate>Sun, 29 Apr 2018 22:06:00 -0300</pubDate><description>&lt;p&gt;Ok, quem acompanha meu blog há um ano ou dois sabe como eu &lt;a href="http://www.akitaonrails.com/archlinux"target="_blank" rel="noopener"&gt;curto o Arch Linux&lt;/a&gt; — em particular o Manjaro com GNOME.&lt;/p&gt;
&lt;p&gt;Também continuo bastante intrigado com a ideia do Windows Subsystem for Linux (WSL), que estreou de verdade na &lt;a href="http://www.akitaonrails.com/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel"target="_blank" rel="noopener"&gt;Windows 10 Anniversary Edition&lt;/a&gt; em meados de 2016.&lt;/p&gt;
&lt;p&gt;Já faz quase 2 anos e a expectativa é de atualizações expressivas em compatibilidade e performance do WSL para a próxima &lt;a href="https://winaero.com/blog/command-line-wsl-improvements-windows-10-version-1803/"target="_blank" rel="noopener"&gt;Spring Creators Update&lt;/a&gt; (versão 1803), prevista para 30 de abril de 2018. Isso aproxima o WSL de algo realmente utilizável por programadores profissionais. Só para ter uma ideia: hoje em dia você consegue desempenho ordens de magnitude superior rodando sua distro favorita dentro do Virtualbox ou do VMWare Workstation.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Ok, quem acompanha meu blog há um ano ou dois sabe como eu <a href="http://www.akitaonrails.com/archlinux"target="_blank" rel="noopener">curto o Arch Linux</a> — em particular o Manjaro com GNOME.</p>
<p>Também continuo bastante intrigado com a ideia do Windows Subsystem for Linux (WSL), que estreou de verdade na <a href="http://www.akitaonrails.com/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel"target="_blank" rel="noopener">Windows 10 Anniversary Edition</a> em meados de 2016.</p>
<p>Já faz quase 2 anos e a expectativa é de atualizações expressivas em compatibilidade e performance do WSL para a próxima <a href="https://winaero.com/blog/command-line-wsl-improvements-windows-10-version-1803/"target="_blank" rel="noopener">Spring Creators Update</a> (versão 1803), prevista para 30 de abril de 2018. Isso aproxima o WSL de algo realmente utilizável por programadores profissionais. Só para ter uma ideia: hoje em dia você consegue desempenho ordens de magnitude superior rodando sua distro favorita dentro do Virtualbox ou do VMWare Workstation.</p>
<p>Além disso, o &ldquo;Bash for Windows&rdquo; de fábrica suporta oficialmente apenas Ubuntu, Fedora e OpenSuse, acho. A maioria das pessoas instala o Ubuntu mesmo. E funciona, ok. Para brincar e impressionar nas demonstrações, funciona. Mas me irrita profundamente conseguir fazer tanta coisa e não poder usar isso no meu dia a dia de verdade. É como carregar o protótipo finalizado do próximo iPhone sem suporte a 4G. Um brinquedo, só isso.</p>
<p>Mas se você quiser apenas ver como está a performance comparada ao meu setup com VMWare, pule direto para o final do artigo.</p>
<p>Voltando ao assunto das distros: usuários sérios de Linux preferem alternativas melhores. Eis o repositório no GitHub:</p>
<p><a href="https://github.com/yuk7/ArchWSL"target="_blank" rel="noopener"><img src="http://web.archive.org/web/20221226012212/https://raw.githubusercontent.com/wiki/yuk7/WSL-DistroLauncher/img/Arch_Alpine_Ubuntu.png" alt="screenfetch of arch"  loading="lazy" /></a></p>
<p>Você baixa <a href="https://github.com/yuk7/ArchWSL/releases/latest"target="_blank" rel="noopener">esse arquivo zip</a>, descompacta e executa o <code>Arch.exe</code> incluso. Só isso!</p>
<p>Aí é só abrir o &ldquo;Bash&rdquo; na versão Windows e bootstrapar o restante da instalação por lá.</p>
<p>Precisamos do Pacman e de algum gerenciador de AUR. Para iniciar o Pacman:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>pacman-key --init
pacman-key --populate
pacman -Syu</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Que delícia, o Pacman rodando nativamente no Windows! Quem diria??</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/674/big_IMG_20180429_174518.jpg" alt="pacman no windows"  loading="lazy" /></p>
<p>Isso vai atualizar tudo. Em seguida, criamos um usuário não-root:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>useradd -m your_user
passwd your_user
EDITOR=nano visudo</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Procure a linha que diz <code>root   ALL=(ALL) ALL</code> e adicione o seu usuário logo abaixo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>your_user   ALL=(ALL) ALL</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Por último, fazemos login como esse usuário:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>su your_user</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Agora vamos instalar o Yaourt para depois instalar o Pacaur (preferência pessoal minha — acho o Yaourt verboso demais com suas confirmações, por isso prefiro o Pacaur).</p>
<p>Comece editando o arquivo <code>/etc/pacman.conf</code> com seu editor favorito (vim ou nano).</p>
<p>Adicione a seguinte seção no final do arquivo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[archlinuxfr]
SigLevel = Never
Server = http://repo.archlinux.fr/$arch</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Antes de prosseguir, temos um pequeno problema. O WSL ainda não tem suporte a SYSV IPC, que é necessário para o <a href="https://unix.stackexchange.com/questions/9714/what-is-the-need-for-fakeroot-command-in-linux"target="_blank" rel="noopener">fakeroot</a>, que por sua vez é exigido pelo <code>makepkg</code> (que não pode rodar como root).</p>
<p>Para contornar isso:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>wget https://github.com/yuk7/arch-prebuilt/releases/download/17121600/fakeroot-tcp-1.22-1-x86_64.pkg.tar.xz
sudo pacman -U fakeroot-tcp-1.22-1-x86_64.pkg.tar.xz</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Por enquanto é isso! Até o WSL ter suporte nativo a SYSV IPC, usamos esse workaround. O próprio Yaourt provavelmente vai te pedir para instalar o <code>fakeroot-tcp</code> também — pode deixar.</p>
<p>Como disse, o Yaourt é bastante verboso nas confirmações. Regra geral: quando perguntar se quer editar algo, responda &ldquo;N&rdquo;. Quando perguntar se quer compilar ou instalar, responda &ldquo;Y&rdquo;. Se você quiser se livrar de mim nessa parte, faça logo:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>yaourt -S pacaur</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>A partir de agora assumo que você tem o Pacaur instalado.</p>
<h3>Suporte a Interface Gráfica<span class="hx:absolute hx:-mt-20" id="suporte-a-interface-gráfica"></span>
    <a href="#suporte-a-interface-gr%c3%a1fica" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Vamos instalar o básico para um ambiente de desenvolvimento:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo pacman -S base base-devel gvim git</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Quando aparecer &ldquo;default: all&rdquo;, instale tudo. Espaço em disco não deveria ser preocupação em 2018.</p>
<p>Prefiro ter um ambiente GNOME 3 completo, então:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo pacman -S gnome</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>De novo, deixe instalar tudo que quiser. Cada um tem seu gosto em termos de GUI — uns preferem KDE5, outros XFCE4. Tem quem vá ainda mais longe e use o gerenciador de janelas tileado <a href="https://i3wm.org/"target="_blank" rel="noopener">i3</a>.</p>
<p>Isso exige uma adaptação séria. É para quem curte usar teclado tenkeyless sem legenda nas teclas e layouts alienígenas como DVORAK ou <a href="https://colemak.com/"target="_blank" rel="noopener">Colemak</a> (argh!). Gosto é gosto. E que tal se tornar digitador fluente no <a href="https://www.maltron.com/the-maltron-letter-layout-advantage.html"target="_blank" rel="noopener">Maltron</a>? Eu te desafio, e muito! :-D</p>
<p>Mas estou divagando. Adicione isso ao seu <code>/etc/.bashrc</code> ou ao <code>/etc/environment</code> global:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>echo &#34;export LIBGL_ALWAYS_INDIRECT=1&#34; &gt;&gt; /etc/.bashrc
echo &#34;export DISPLAY=:0&#34; &gt;&gt; /etc/.bashrc</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Exporte as variáveis no shell atual ou feche e reabra o Bash.</p>
<p>Para ter um ambiente gráfico completo, instale um servidor X local. São duas opções: Xming ou VcXSrv. Tenho tido problemas para redimensionar janelas no Xming, então recomendo o <a href="https://sourceforge.net/projects/vcxsrv/"target="_blank" rel="noopener">VcXSrv</a>. Baixe e instale como qualquer aplicativo Windows, depois inicie. Ele vai criar um atalho no Desktop chamado &ldquo;XLaunch&rdquo; — é só abrir.</p>
<p>E finalmente, instalamos um terminal <strong>DE VERDADE</strong> no lugar daquela tralha derivada do cmd.exe antigo que o WSL oferece por padrão:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>pacaur -S tilix-bin
tilix</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Quem usou Mac provavelmente conhece o iTerm2, possivelmente o melhor emulador de terminal que já usei. Nada chega perto. Nada, exceto talvez o <a href="https://gnunn1.github.io/tilix-web/"target="_blank" rel="noopener">Tilix</a> (antigamente chamado Terminix).</p>
<p>Só pelo &ldquo;Ctrl-Alt-D&rdquo; para dividir o terminal horizontalmente e &ldquo;Ctrl-Alt-R&rdquo; para dividir verticalmente, e &ldquo;Alt-1&rdquo;, &ldquo;Alt-2&rdquo; etc. para navegar entre os painéis, já vale a pena. Ainda vem com temas prontos excelentes como o clássico Solarized Dark ou meu favorito atual, Monokai Dark.</p>
<p>Não me xingue, eu sei. Alguns preferem o terminal padrão com TMUX. Também é gosto — faz mais sentido quando se trabalha em servidor remoto.</p>
<p>Adicione a fonte Hack monotype para um visual mais agradável:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo pacman -S ttf-hack</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<h3>Linguagens de Programação<span class="hx:absolute hx:-mt-20" id="linguagens-de-programação"></span>
    <a href="#linguagens-de-programa%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Vamos ver se as linguagens mais importantes instalam corretamente. Como sempre digo, o ASDF resolve essa questão.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.4.3
echo -e &#39;\n. $HOME/.asdf/asdf.sh&#39; &gt;&gt; ~/.bashrc
echo -e &#39;\n. $HOME/.asdf/completions/asdf.bash&#39; &gt;&gt; ~/.bashrc</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Reinicie o terminal e continue:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>asdf plugin-add nodejs
addf plugin-add ruby</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Para Node.js é preciso adicionar as chaves GPG corretas antes de instalar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
asdf install nodejs 10.0.0
asdf global nodejs 10.0.0</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Ruby se beneficia do jemalloc para alocar menos memória do sistema. Não sei se impacta no WSL, mas vamos fazer de qualquer forma:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo pacman -S jemalloc
RUBY_EXTRA_CONFIGURE_OPTIONS=&#34;--with-jemalloc&#34; asdf install ruby 2.5.1
asdf global ruby 2.5.1
gem install bundler</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/675/big_IMG_20180429_193432.jpg" alt="ruby compilando"  loading="lazy" /></p>
<p>Até aqui tudo bem. Se precisar instalar um Ruby antigo (&lt; 2.4) para projetos legados:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>pacaur -S openssl-1.0
PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig RUBY_EXTRA_CONFIGURE_OPTIONS=&#34;--with-openssl-dir=/usr/lib/openssl-1.0&#34; asdf install ruby 2.3.3</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Infelizmente precisa de uma versão de OpenSSL que não deveria mais ser usada por questões de segurança. Todo mundo migrou para a 1.1. Além disso, o Ruby 2.3.x chegou ao seu EOL (fim de vida). Use por sua conta e risco.</p>
<p>Mas até aqui tudo funcionando. E o Go? Vamos ver:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>asdf plugin-add golang
asdf install golang 1.9.5
asdf global goland 1.9.5</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Poderíamos continuar, mas acho que você já pegou a ideia. Simplesmente funciona!</p>
<h3>Processos em Background<span class="hx:absolute hx:-mt-20" id="processos-em-background"></span>
    <a href="#processos-em-background" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Outra limitação atual do WSL (que esperamos ver resolvida na Spring Creators Update) é a capacidade de iniciar e manter processos em background (daemons).</p>
<p>Fazer <code>sudo systemctl enable postgresql</code> e reiniciar não vai iniciar o Postgresql automaticamente em background como deveria. O próprio Arch.exe que estamos usando nem tem systemd.</p>
<p>Felizmente, servidores como Postgresql ou Redis funcionam normalmente — podem ser iniciados como processos de usuário e se vinculam corretamente às suas portas TCP. Mas você vai ter que iniciá-los manualmente a cada sessão. Feche o terminal Bash e todos morrem.</p>
<p>Por exemplo, Postgresql:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>[your_user]# sudo pacman -S postgresql
[your_user]# sudo mkdir -p /run/postgresql
[your_user]# sudo chown -R postgres:postgres /run/postgresql

[your_user]# sudo -u postgres -i
[postgresql]# initdb --locale $LANG -E UTF8 -D &#39;/var/lib/postgres/data&#39;

[postgresql]# pg_ctl -D /var/lib/postgres/data start
waiting for server to start....2018-04-29 23:30:35.483 UTC [1064] LOG:  listening on IPv4 address &#34;127.0.0.1&#34;, port 5432
2018-04-29 23:30:35.505 UTC [1064] LOG:  listening on Unix socket &#34;/run/postgresql/.s.PGSQL.5432&#34;
2018-04-29 23:30:35.583 UTC [1065] LOG:  database system was shut down at 2018-04-29 23:23:48 UTC
2018-04-29 23:30:35.660 UTC [1064] LOG:  database system is ready to accept connections

[postgresql]# createuser --interactive
Enter name of role to add: your_user
Shall the new role be a superuser? (y/n) y

[postgresql]# exit
[your_user]#</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Viu o que fiz aqui? Tem um problema na instalação sob WSL em que o <code>/run/postgresql</code> não é criado com as permissões corretas. Corrigindo isso conseguimos iniciar o servidor. Podemos sair da sessão <code>su</code> e o PostgreSQL continua rodando. Mas quando fecharmos a primeira janela/sessão Bash, ele morre.</p>
<p>E tem mais uma coisa irritante: as correções de <code>mkdir</code> e <code>chown</code> acima? Preciso fazer toda vez que fecho o Bash for Windows e abro novamente!! Absurdamente chato!</p>
<p>Mas dá para conviver por enquanto. Esperançosamente isso vai estar resolvido amanhã (30 de abril) ou em uma atualização próxima.</p>
<p>Em um ambiente de desenvolvimento Rails, dá para usar o <a href="https://github.com/theforeman/foreman"target="_blank" rel="noopener">Foreman</a> para ajudar. Basta editar um arquivo <code>Procfile.dev</code>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>web: bundle exec puma -C config/puma.rb -p 3000
db: su postgres -c &#39;pg_ctl start -D /var/lib/postgres/data&#39;
redis: redis-server /usr/local/etc/redis.conf
mailcatcher: mailcatcher -f</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Aí é só: <code>foreman start -f Procfile.dev</code> e todos os serviços sobem de uma vez.</p>
<h3>Performance no Mundo Real<span class="hx:absolute hx:-mt-20" id="performance-no-mundo-real"></span>
    <a href="#performance-no-mundo-real" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Minha máquina do dia a dia é o Manjaro GNOME rodando no VMWare Workstation Pro no meu Surface Book 2. Dou a ele 6 dos 8 threads e generosos 12GB de RAM dos 16GB totais (Microsoft, precisamos de mais RAM! Os modernos implantam aplicativos estúpidos com camadas pesadas de JS/CSS que comem tudo que tem).</p>
<p>No projeto em que estou trabalhando, minha suite RSpec completa é um pouco lenta. Para essa comparação, estou pulando os feature specs porque não tenho paciência agora para configurar o chrome-driver no WSL (provavelmente funciona, mas fica para outra vez).</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 12 minutes 8 seconds (files took 14.58 seconds to load)
1493 examples, 0 failures, 35 pending

531,34s user 127,56s system 88% cpu 12:24,99 total</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>No ambiente WSL comparável que acabei de instalar, rodando a mesma suite RSpec, obtive:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 13 minutes 43 seconds (files took 3 minutes 16.8 seconds to load)
1474 examples, 0 failures, 35 pending


455.80s user 399.14s system 83% cpu 17:04.96 total</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Por algum motivo meu ambiente WSL está pulando alguns exemplos (parece mais um bug de contador do RSpec), mas acho que isso não muda muito o panorama geral. O WSL perde mesmo que o contador esteja correto e ele esteja rodando menos exemplos.</p>
<p>Quando começamos a exercitar o WSL de verdade, toda sorte de problemas aparece. Por exemplo, o PostgreSQL entra em colapso e fica imprimindo &ldquo;could not flush dirty data: Function not implemented&rdquo; no stdout, por causa de <a href="https://github.com/Microsoft/WSL/issues/645"target="_blank" rel="noopener">um problema documentado</a> do WSL! O que acaba acontecendo é que o runner do RSpec simplesmente pausa enquanto o PG tenta se resolver.</p>
<p>No VMWare os arquivos carregaram em menos de 15 segundos. No WSL levou mais de 3 minutos só em I/O de arquivos! Ordens de magnitude mais lento. Esse é o problema grave. Quando é só CPU contra CPU, os dois são bastante comparáveis.</p>
<p>No total, os tempos ficam próximos no papel. Em CPU o WSL até leva vantagem, o que explica como ele consegue recuperar o tempo total apesar do I/O claramente lento.</p>
<p>Na prática, numa situação normal de programação, você abre o Vim ou qualquer editor. Todo programador fica abrindo e alternando entre muitos arquivos o tempo todo. Com o I/O super lento, cada arquivo que você tenta abrir trava sua ação por uma fração de segundo. E isso vai acumulando.</p>
<p>Dentro do VMWare, o Vim responde na hora, abrir um arquivo é quase instantâneo.</p>
<p>O benchmark pode não capturar essa situação. Mas no dia a dia você vai acabar irritado. Além disso, rodar uma GUI sobre o X (VcXsrv no meu caso) também adiciona lentidão. Dentro do VMWare, o Xorg normal aproveita aceleração GPU, então todo o pipeline de rasterização é mais rápido.</p>
<p>Dá para usar o WSL como ambiente principal. Mas se consigo uma experiência mais fluida dentro do VMWare, é lá que vou ficar por enquanto.</p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Vou segurar minhas conclusões até amanhã (30 de abril) ou mais para o final da semana, porque se a Spring Creators Update realmente corrigir os problemas de performance, aí posso me ver usando isso no lugar da minha instalação do Manjaro GNOME no VMWare Workstation.</p>
<p>Pode não vir nessa grande atualização, mas tenho informações de que estão trabalhando nos problemas pendentes de performance de I/O. Então está chegando.</p>
<p>Tudo que preciso simplesmente funciona: Tilix, Vim, Git, Zsh, Ruby, Node.js. Tudo instala como esperado pelo Pacman e AUR. Pura glória do Arch Linux! Que pena que a performance ruim estraga tudo.</p>
<p>Está perto, muito perto! Pela primeira vez em quase 15 anos, consigo quase me ver voltando 100% para o Windows (sem VMWare) e ainda sendo totalmente produtivo com ferramentas reais, profissionais e open source que &ldquo;simplesmente funcionam&rdquo;.</p>
<p>Fique de olho neste post para atualizações esta semana!</p>
]]></content:encoded><category>linux</category><category>microsoft</category><category>ferramentas-de-desenvolvimento</category></item><item><title>Da Microsoft para a Apple e de Volta</title><link>https://akitaonrails.github.io/2017/11/21/da-microsoft-para-a-apple-e-de-volta/</link><guid isPermaLink="true">https://akitaonrails.github.io/2017/11/21/da-microsoft-para-a-apple-e-de-volta/</guid><pubDate>Tue, 21 Nov 2017 21:51:00 -0200</pubDate><description>&lt;p&gt;Este vai ser um artigo bem longo, se preparem.&lt;/p&gt;
&lt;p&gt;Para quem tem pressa, o resumo é este:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 10 ainda é Windows, mas não chega nem perto do pesadelo dos anos 2000. Merece uma segunda chance de verdade.&lt;/li&gt;
&lt;li&gt;O OS X está a caminho de se tornar apenas um runtime do Xcode. Rumores dizem que a Apple nem tem mais uma equipe dedicada ao SO de desktop. O foco é total no iOS e em transformar o iPad no substituto do computador.&lt;/li&gt;
&lt;li&gt;Linux é ótimo. Se você é desenvolvedor web em tempo integral, consegue trabalhar confortavelmente com Ubuntu ou Manjaro/Arch (minha recomendação pessoal).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Melhor custo-benefício: o Dell XPS 13. O Surface Book 2 vale cada centavo se você é nerd como eu. Mas, como sempre, há ressalvas a discutir.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Este vai ser um artigo bem longo, se preparem.</p>
<p>Para quem tem pressa, o resumo é este:</p>
<ul>
<li>Windows 10 ainda é Windows, mas não chega nem perto do pesadelo dos anos 2000. Merece uma segunda chance de verdade.</li>
<li>O OS X está a caminho de se tornar apenas um runtime do Xcode. Rumores dizem que a Apple nem tem mais uma equipe dedicada ao SO de desktop. O foco é total no iOS e em transformar o iPad no substituto do computador.</li>
<li>Linux é ótimo. Se você é desenvolvedor web em tempo integral, consegue trabalhar confortavelmente com Ubuntu ou Manjaro/Arch (minha recomendação pessoal).</li>
</ul>
<p>Melhor custo-benefício: o Dell XPS 13. O Surface Book 2 vale cada centavo se você é nerd como eu. Mas, como sempre, há ressalvas a discutir.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/663/20171121_111616.jpg" alt="Book 2"  loading="lazy" /></p>
<h2>As Especificações<span class="hx:absolute hx:-mt-20" id="as-especificações"></span>
    <a href="#as-especifica%c3%a7%c3%b5es" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Não vou duplicar cada <a href="https://www.youtube.com/watch?v=-Hh0lZ7Jg4U"target="_blank" rel="noopener">review de hardware</a> que você encontra por aí. Todos são verdadeiros. Como o <a href="https://www.ifixit.com/Teardown/Microsoft&#43;Surface&#43;Book&#43;2&#43;Teardown/100364"target="_blank" rel="noopener">iFixIt diz</a>: é a pior pontuação em reparabilidade. Como o MacBook, a linha Surface é uma declaração. É a melhor combinação de design e funcionalidade. A contrapartida é que tem zero de expansibilidade e você precisa tomar cuidado para não quebrá-lo. Se quebrar, garanta que tem garantia e exija a substituição.</p>
<p>Em termos de especificações, fica próximo dos outros notebooks top de linha.</p>
<p>O Surface Book 2 top de linha custa <a href="https://www.microsoft.com/en-us/surface/devices/surface-book-2/overview"target="_blank" rel="noopener">USD 3.299</a> e vem com SSD de 1 TB, 16 GB de RAM, GTX 1060 com 6 GB GDDR5, Intel Core i7 8ª geração Kaby Lake R, display 4K. Caríssimo, mas dá para justificar. Explico mais abaixo.</p>
<p>O Dell XPS 15&quot; Touch top de linha custa <a href="http://dell.to/2jMDOx5"target="_blank" rel="noopener">USD 2.459</a> e vem com SSD de 1 TB, <strong>32 GB de RAM</strong>, GTX 1050 com 4 GB GDDR5, Intel Core i7 7ª geração Kaby Lake, display 4K. O design do XPS é impecável faz pelo menos 3 gerações. Para mim, é o melhor custo-benefício.</p>
<p>O Razer Blade top de linha custa <a href="https://www.razerzone.com/gaming-laptops/razer-blade/shop"target="_blank" rel="noopener">USD 2.599</a> e vem com SSD de 1 TB, 16 GB de RAM, GTX 1060 com 6 GB, Intel Core i7 7ª geração, display 4K. É provavelmente o melhor design industrial do grupo, com a atenção impecável da Razer aos detalhes. Mas também é o que tem menos suporte disponível e mais problemas de construção relatados, então cuidado ao comprar no exterior.</p>
<p>O HP Spectre x360 top de linha custa <a href="http://store.hp.com/us/en/pdp/hp-spectre-x360-15-bl152nr"target="_blank" rel="noopener">USD 1.499</a> e vem com SSD de 512 GB, GeForce MX150 com 2 GB GDDR5, Intel Core i7 8ª geração, display 4K. O design é lindo, super fino e conversível. As especificações não são lá essas coisas, mas é o mais barato entre os notebooks premium.</p>
<p>O Lenovo Yoga 920 14&quot; Vibe top de linha custa <a href="http://lnv.gy/2A4DjlU"target="_blank" rel="noopener">USD 1.899</a> mas vem apenas com gráficos integrados Intel (sem GPU secundária), SSD de 1 TB, 16 GB de RAM, Intel Core i7 8ª geração, display 4K, e já inclui a Caneta. O design é ótimo, com uma dobradiça de quase 360 graus para usar como tablet. Um bom 2-em-1.</p>
<p>Agora, o MacBook Pro 15&quot; top de linha custa <a href="http://apple.co/2zXSz6d"target="_blank" rel="noopener">USD 3.399</a> e vem com SSD de 1 TB, Radeon Pro 560 com 4 GB, Intel Core i7 7ª geração, display UHD e a infame touch bar (50% de chance de gostar). É isso. O design industrial e a construção ainda são excelentes, mas os concorrentes chegaram bem perto.</p>
<p>Se você usa aplicações gráficas intensivas, a Radeon Pro 560 é boa, mas a GTX 1060 é <a href="http://bit.ly/2zsIjE5"target="_blank" rel="noopener">superior</a>. Os displays UHD IPS (LCD) da Apple têm resolução máxima de 2560x1060. Todos os notebooks premium hoje vêm com displays 4K completos (LED) com resolução máxima de 3840x2160. A diferença é perceptível. Se você nunca viu um display 4K moderno, o display do MacBook vai parecer bom. E isso sem mencionar que todos são touchscreens com 4.096 pontos de sensibilidade. O que antes era gimmick hoje rivaliza com o melhor que a Wacom tem a oferecer. A linha Surface chega perto do topo da linha Wacom Cintiq e do novo iPad Pro. Estão no mesmo nível.</p>
<p>Há 2 aspectos do Surface Book 2 que deixam a desejar. Primeiro, a ausência de uma porta Thunderbolt 3 de verdade. Sem ela, você não consegue conectar armazenamentos externos modernos ou GPUs externas. O segundo é a fonte de alimentação fraca. Relatos indicam que em jogos muito exigentes (como Destiny 2 sem configuração adequada), o sistema throttla e drena a bateria mais rápido do que consegue carregar da tomada. <a href="https://www.theverge.com/2017/11/21/16685986/microsoft-surface-book-2-power-problem"target="_blank" rel="noopener">The Verge quebrou essa história</a> e a Microsoft ainda não apresentou solução. Então, se jogos são prioridade máxima, compre um Razer ou qualquer notebook específico para games, como um Alienware. O problema de bateria <a href="https://www.youtube.com/watch?v=imzVR4JSITM&amp;t=1s"target="_blank" rel="noopener">não é tão dramático</a> quanto alguns relataram anteriormente.</p>
<p>Em termos de construção: Macs são todos feitos com a mesma construção unibody de alumínio. O Book 2 usa magnésio. Fica muito sólido e bem leve. Aliás, depois de tantos anos, todo mundo dominou o alumínio. E estão indo em outras direções. A Dell, por exemplo, usa fibra de carbono nos apoios de pulso, o que acho muito mais confortável. O magnésio também não é tão gelado quanto o alumínio. Gosto que os fabricantes superaram a fase de copiar e estão experimentando materiais novos e interessantes.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/664/20171121_111533.jpg" alt="it’s not as thin"  loading="lazy" /></p>
<h2>A Proposta de Valor<span class="hx:absolute hx:-mt-20" id="a-proposta-de-valor"></span>
    <a href="#a-proposta-de-valor" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Já estabelecemos que o Surface Book 2 é caríssimo e nem é bom o suficiente para jogos muito exigentes como Destiny 2.</p>
<p>Onde ele realmente brilha é no fato de não ser um 2-em-1 conversível comum como o Spectre ou o Yoga. Você já sabe que a tela pode ser desacoplada da base.</p>
<p>A grande conquista da equipe Surface é a <strong>dobradiça fulcrum dinâmica</strong>. Uma maravilha de engenharia. Quando acoplada, não balança nem perto do que se esperaria. É muito sólida — você pode pegar o conjunto inteiro pela tela sem se preocupar que a base vai cair ou quebrar.</p>
<p>Quando ouvi falar nisso pela primeira vez, 2 anos atrás, achei legal mas pensei que poderia quebrar com o tempo, então esperei. Agora estou totalmente convencido porque 2 anos depois não se vê nenhum &ldquo;hinge-gate&rdquo; ou relatos massivos de dobradiças se desfazendo. E 2 anos depois nenhum outro fabricante tem isso. Se você não vê uma cópia barata vinda da China, é porque é muito difícil de construir. A Microsoft acertou em cheio nessa parte.</p>
<p>Com a tela removível, os componentes principais ficam todos atrás dela. CPU, GPU, RAM, SSD. Você tem um Intel i7 top de linha em um tablet! A bateria é compreensivelmente pequena (no máximo 3 horas) para alimentar um display 4K de 15&quot; com capacidade touch e precisão suficiente para rivalizar com o iPad Pro e o Wacom Cintiq ou Mobile Studio.</p>
<p>O que a maioria não menciona é que, por causa disso, é o chassi da tela que esquenta. A base de performance fica fria! É super confortável ficar com ele no colo por muitas horas sem risco de ficar estéril ou cozinhar ovos no processo.</p>
<p>Tem potência para conectar 1 display 4K externo a 60hz ou dois displays 4K a 30hz. O MacBook Pro, com sua porta customizada, consegue alimentar um display 5K. Algo que a maioria dos notebooks ainda não consegue. Aí vai depender do uso.</p>
<p>Não sou designer de profissão, mas sou hobbyista. Depois de muitos anos de trabalho duro, acredito que posso me dar ao luxo de ter algo assim. E não me entendam mal, o Surface Pro é outra ótima opção para designers. O Surface Pro top de linha tem tudo que o Book 2 tem, sem a GTX 1060, mas custando USD 600 a menos, em <a href="https://www.microsoft.com/en-us/surface/devices/surface-pro/overview#surfaceconfiguration"target="_blank" rel="noopener">USD 2.699</a>. Acho que é um produto mais adequado para a maioria das pessoas que querem uma solução de esboço fácil de carregar.</p>
<p>Profissionais criativos são os que precisam ser mais cuidadosos nas especificações. Mas para a maioria dos profissionais sem demandas tão pesadas, dá para pagar bem mais barato. Não precisam de GPU extra, nem do i7 (um i5 já resolve), 8 GB de RAM são suficientes, até 256 GB de SSD já dão conta porque tudo hoje está na &ldquo;Nuvem&rdquo;. Esse é o <a href="http://www.dell.com/en-us/shop/dell-laptops/new-xps-13/spd/xps-13-9360-laptop/dncwtr744h"target="_blank" rel="noopener">Dell XPS 13 de USD 999</a>. Ou a única opção comparável da Apple é o <a href="https://www.apple.com/shop/buy-mac/macbook"target="_blank" rel="noopener">MacBook de USD 1.299</a> com um ridículo processador Intel m3. Para a maioria dos profissionais, o Dell XPS 13 mais barato é uma proposta de valor muito melhor do que o MacBook.</p>
<p>Para profissionais com demandas pesadas, o Dell XPS 15 é o melhor custo-benefício. O Surface Book 2 é o premium para quem valoriza a touchscreen mais do que o fluxo de trabalho. Em termos práticos: designers vão de Book 2, editores de vídeo ou modeladores 3D vão de Dell XPS.</p>
<p>Ah, e mais uma coisa sobre preço. O MacBook Pro 15&quot; custa USD 3.399 e o Book 2 custa USD 3.299. Mas se você quiser um tablet, ainda precisa adicionar USD 949 por um iPad Pro de 12&quot; com Wi-Fi e 256 GB de armazenamento. E vai acabar carregando uma mochila mais pesada.</p>
<h2>Por que não instalar Linux?<span class="hx:absolute hx:-mt-20" id="por-que-não-instalar-linux"></span>
    <a href="#por-que-n%c3%a3o-instalar-linux" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Você não compra um produto Surface a menos que tenha interesse na experiência e no ecossistema da <strong>Surface Pen</strong>. Isso me parece óbvio, caso contrário você está melhor com um Dell XPS ou qualquer outro notebook mais barato.</p>
<p>Também é óbvio por que não faz sentido perguntar <em>&ldquo;Por que não abandona o Windows e instala Linux nele?&rdquo;</em>. Porque nenhuma distribuição Linux tem suporte à Caneta. A base de performance também tem uma tecla física que você precisa pressionar para que a dobradiça libere a tela.</p>
<p>Você vai querer ter Adobe Photoshop, Autodesk Sketchbook, Sketchable ou qualquer outro pacote de software excelente disponível. Não vou repetir cada <a href="https://www.youtube.com/watch?v=U8cpC2jZdgM"target="_blank" rel="noopener">review disponível</a> mostrando quão boa é a caneta. Confirmo apenas que sim, a caneta é excelente, precisa, fiel, e flui de forma muito natural. É um estúdio inteiro numa caixa só.</p>
<p>Desenvolvedores de software deveriam <strong>evitar</strong> esse tipo de produto porque a maioria das distribuições Linux não terá os drivers adequados para tantas soluções de hardware exclusivas. Para essas situações, recomendo muito o Dell XPS 13, especificamente <a href="http://dell.to/2A3SPOZ"target="_blank" rel="noopener">a configuração de USD 1.759</a> com Windows 10 Pro (ou economize USD 60 pegando a edição Home se pretende instalar Linux por cima), o ótimo display touch InfinityEdge QHD+ (3200x1800), Intel Core i7 8ª geração, 16 GB de RAM, SSD de 512 GB. É, de longe, o melhor custo-benefício para um desenvolvedor de software em tempo integral.</p>
<p>O OS X tem uma comunidade excelente <strong>apesar</strong> da Apple não fazer muito para ajudá-la. Historicamente, a transição do MacOS legado para o OS X significou ter um kernel e toolchain compatíveis com UNIX disponíveis. Até hoje, ainda não é comparável a uma distribuição Linux moderna. Mas o OS X compensa isso por ter, de longe, o melhor Compositor Gráfico do mercado. A GUI é fluida, responsiva.</p>
<p>O kernel Darwin Mach suporta múltiplas políticas, e a mais importante para Profissionais Criativos, especialmente músicos, era a capacidade de <strong>soft real-time</strong> do scheduler. Até hoje, o <a href="https://wiki.archlinux.org/index.php/Realtime_kernel"target="_blank" rel="noopener">Linux Real Time</a> não é a opção padrão, e não é tão bem ajustado nem estável. E o kernel do Windows evoluiu, mas ainda está longe de ser tão polido.</p>
<p>O Soft Real-Time evita o efeito de travamento que observamos. E é um dos fatores pelo qual a experiência Mac é, no geral, superior mesmo em hardware menos potente.</p>
<p>Em particular, todos na comunidade do <a href="https://brew.sh/"target="_blank" rel="noopener">Homebrew</a> merecem muito elogio pelo esforço de continuar trazendo ferramentas open source para o OS X, <strong>apesar</strong> de cada nova atualização do Xcode e do OS X quebrar tudo.</p>
<h2>Meu Ambiente<span class="hx:absolute hx:-mt-20" id="meu-ambiente"></span>
    <a href="#meu-ambiente" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/662/20171121_111546.jpg" alt="Magnesium Body"  loading="lazy" /></p>
<p>Depois de muita experimentação, decidi usar o Windows 10 nativo como host e uma distribuição Linux completa (<a href="https://manjaro.org/get-manjaro/"target="_blank" rel="noopener">Manjaro GNOME</a>) em um ambiente Virtualbox, alocando 4 dos 8 cores (2 cores físicos, cada um com 2 hyperthreads) e metade da memória (8 GB).</p>
<p>Por que não usar o novíssimo <a href="https://msdn.microsoft.com/en-us/commandline/wsl/faq#can-i-run-all-linux-apps-in-wsl"target="_blank" rel="noopener">Windows Subsystem for Linux (WSL)</a>?</p>
<p>Porque embora seja promissor, ainda precisamos esperar que resolvam as arestas. Em particular, um suporte melhor a GUI e uma abstração de I/O mais rápida. O que dói mais é como a camada de sistema de arquivos é <strong>dolorosamente lenta</strong> agora. É uma <a href="http://www.akitaonrails.com/2017/09/20/windows-subsystem-for-linux-e-bom-mas-ainda-nao-suficiente"target="_blank" rel="noopener">ordem de magnitude mais lenta</a> do que usar Linux no Virtualbox.</p>
<p>Poderia usar uma solução híbrida estilo Vagrant, com uma distribuição Linux headless no Virtualbox e acessando arquivos via CIFS/NFS. Funcionaria bem se você gosta de editores como Sublime Text 3, Visual Studio Code ou Atom. Mas sou do time Vim e gosto do GVIM, que funciona melhor dentro do GNOME, dentro de uma distribuição Linux com GUI de verdade.</p>
<blockquote>
  <p><em>&ldquo;Por que não usar Docker? É super rápido e tal.&rdquo;</em></p>

</blockquote>
<p>Me surpreende quando as pessoas perguntam isso, porque demonstra como pouco entendem das ferramentas que recomendam.</p>
<p>Docker faz sentido de verdade em uma distribuição Linux nativa. No Windows, precisa rodar Linux no Virtualbox ou Hyper-V. No Mac, usa o framework Hypervisor, que — como o Hyper-V da Microsoft — é uma camada de <strong>virtualização</strong>. É basicamente o mesmo que Virtualbox, para todos os efeitos práticos.</p>
<p>Docker, como o LXC, apenas faz um processo &ldquo;acreditar&rdquo; que está rodando sozinho no SO ao ocultar os outros processos. Então, no Linux, é super rápido. Em qualquer outra plataforma, precisa virtualizar o Linux e então rodar o Docker lá dentro.</p>
<p>O cliente Docker está na verdade se comunicando com um Linux virtualizado no Windows ou Mac. Se você acreditou que é mais rápido que Virtualbox ou Hyper-V de forma significativa, foi enganado. Não há mágica aqui.</p>
<blockquote>
  <p><em>&ldquo;Por que não dar dual-boot então?&rdquo;</em></p>

</blockquote>
<p>Isso também não resolve meu cenário. Quero um ambiente GNOME completo com GUI. E não quero manter Outlook no Windows e Thunderbird ou Evolution no Linux, gerenciando contas diferentes em todo tipo de aplicação (e sim, prefiro muito binários nativos a web apps, sou old-school assim). Não quero reiniciar quando quiser usar o Photoshop e reiniciar de volta para Linux para usar o Vim.</p>
<p><strong>Quero</strong> ter software de ambas as plataformas disponível <strong>ao mesmo tempo</strong>. Não acredito em cenários de dual-boot a menos que os usos sejam completamente separados. Por exemplo, usar uma distribuição Linux o dia todo e à noite reiniciar no Windows para rodar o Steam e jogar.</p>
<p>Sim, o Virtualbox terá uma UI menos responsiva por causa do pipeline gráfico virtualizado. Mas para desenvolvimento de software, funciona perfeitamente. Até vejo pessoas fazendo coisas mirabolantes como ter um ambiente de desenvolvimento inteiro em uma instância EC2 da AWS e acessar via SSH com Vim e Tmux. Isso é bem mais complicado, na minha opinião. Não iria tão longe.</p>
<p>Todo o hardware top de linha que listei acima tem Cores e RAM suficientes para rodar 2 SOs ao mesmo tempo. Não faça isso em hardware básico.</p>
<p>E se não precisar de um notebook para carregar, com o mesmo dinheiro você compra um computador desktop muito superior.</p>
<blockquote>
  <p><em>&ldquo;Mas no OS X você tem tudo nativo, porque é UNIX e tal&rdquo;</em></p>

</blockquote>
<p>Sim, mas desconfio muito das grandes atualizações do OS X da Apple. Elas sempre, sempre estragam alguma coisa. Depois de ter minha cota de dias de trabalho perdidos pós-atualizações, migrei meu ambiente de desenvolvimento para o <a href="https://www.vagrantup.com/"target="_blank" rel="noopener">Vagrant</a> pelo menos 5 anos atrás. Então já estava usando Linux no Virtualbox (ou VMWare) o tempo todo. Nunca olhei para trás. Ficava lendo as reclamações das pessoas depois das grandes atualizações e eu estava lá, ileso e produtivo. O Virtualbox era muito pior naquela época, hoje não é tanto. Não me lembro da última vez que travou, se é que travou alguma vez.</p>
<blockquote>
  <p><em>&ldquo;Mas por que não usar Hyper-V em vez do Virtualbox?&rdquo;</em></p>

</blockquote>
<p>Tentei. E não recomendo agora. Foi construído para que o Windows rode caixas Linux em <strong>servidores</strong>. Então é excelente para particionar recursos de hardware entre diferentes instâncias virtuais. A menos que você seja sysadmin em treinamento ou precise de um servidor simulado no seu notebook, não é para você.</p>
<p>Tem suporte muito ruim para gráficos (servidores headless não precisam de gráficos). A resolução máxima no monitor virtual é um ridículo 1152x864. Meu Virtualbox suporta meu monitor LG Ultrawide 2560x1080 tranquilamente. O Hyper-V não consegue e isso é um dealbreaker.</p>
<p>Virtualbox, VMWare, Parallels e Hyper-V vão todos usar as mesmas instruções VT-X fornecidas pela Intel. A performance base não vai ser tão diferente. As ferramentas de guest podem diferir. Alguma estabilidade pode diferir. Mas no geral, são basicamente a mesma coisa do ponto de vista da usabilidade.</p>
<p>Sei que parece &ldquo;estranho&rdquo; rodar o Windows 10 como host nativo principal. Mas funciona bem no geral.</p>
<p>E também sei que parece ainda mais estranho rodar uma distribuição Linux como SO convidado secundário no Virtualbox. Mas posso dizer que quando estou usando em tela cheia, trabalhando, não tenho a sensação de que está lento ou sem resposta.</p>
<h2>O Software<span class="hx:absolute hx:-mt-20" id="o-software"></span>
    <a href="#o-software" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Se você está no OS X, provavelmente está acostumado com muitas ferramentas. Pagou dinheiro por algumas delas. E trocar de SO sempre é uma dor.</p>
<p>Em resumo, o único software que realmente senti falta no começo foi o Keynote. Mas superei meu preconceito contra o PowerPoint e tenho que admitir que ele faz tudo que preciso agora.</p>
<p>Sempre odiei Pages e Numbers — são ótimos para amadores. Mas nada, nem o LibreOffice, muito menos o Google Docs, substitui o Office. O Google Slides é terrível e o Impress é além de inútil para mim (e é super lento). Sério, o PowerPoint hoje é uma ferramenta muito melhor.</p>
<p>O Office no Mac sempre foi &ldquo;suficiente&rdquo;, felizmente. Mas o Office no Windows é muito superior. Sem dúvida na minha mente. Então um grande benefício de voltar ao Windows 10 é ter a experiência completa do Office.</p>
<p>Se você usa as ferramentas da linha Pro, vai sentir falta do Final Cut Pro. Se é músico profissional, vai sentir falta do Logic Pro. Não há nada como o GarageBand para músicos hobbyistas. Não há nada a fazer aqui. E mesmo tendo hardware melhor no PC, a Apple customiza o Final Cut para render excepcionalmente melhor no AMD Radeon Pro. Então os tempos de exportação do Final Cut ainda são superiores aos do Adobe Premiere. O Motion 5 ainda é mais fácil e responsivo que o After Effects.</p>
<p>Dito isso, a margem não é enorme. A Adobe Creative Suite é muito forte, e a menos que você seja um one-trick pony, qualquer profissional consegue migrar para a Adobe e fazer o trabalho.</p>
<p>Em termos de desenvolvimento de software, a menos que você seja um one-trick pony do .NET, vai querer toda a parafernália open source. O WSL deveria fornecer isso — no futuro. Agora mesmo, sua melhor aposta é rodar o Virtualbox e você não vai se arrepender.</p>
<p>Sim, existem pequenos softwares exclusivos como 1Password, Tweetbot, Alfred. Não sinto falta de nenhum deles. Especialmente porque meu último iPhone foi o 4, lá em 2010. Depois migrei para Android com o Galaxy S4 e também nunca olhei para trás. Estou usando um S8 e prestes a receber meu Pixel 2, então estou bem em termos de cliente de Twitter ou gerenciamento de senhas (uso o LastPass e, embora não seja perfeito, resolve).</p>
<p>Ou existe um substituto nativo bom o suficiente para desktop ou mobile, ou existe um serviço Web. Posso me sentir desconfortável com a mudança, mas na prática não há nada no macOS que me impeça de trocar. Mesmo que você tenha comprado músicas ou filmes no iTunes, existe iTunes para Windows.</p>
<blockquote>
  <p><em>&ldquo;Mas espera, o Windows Update vai te enlouquecer!&rdquo;</em></p>

</blockquote>
<p>Achei o mesmo. A Microsoft finalmente resolveu isso. Ainda existe, você ainda precisa reiniciar. Mas não é nem de longe tão irritante quanto era antes. A maioria das atualizações roda em segundo plano e você nem vai notar. E há várias opções como <a href="https://support.microsoft.com/en-us/help/4028233/windows-10-schedule-or-pause-updates"target="_blank" rel="noopener">agendar</a> para rodar apenas à noite quando você não está trabalhando.</p>
<blockquote>
  <p><em>&ldquo;E os problemas de segurança e vírus!?&rdquo;</em></p>

</blockquote>
<p>Sim, recomendo fortemente não navegar na Deep Web numa máquina Windows, você vai ser comprometido. Nem com um browser Tor. Vai ser comprometido.</p>
<p>Também recomendo usar o BitLocker (disponível apenas no Windows 10 Pro) para criptografar sua partição. E fazer backup em HDs externos com a maior frequência possível. Nada te protege melhor do que um backup frio prontamente disponível.</p>
<p>E sim, instale alguma solução de terceiros como o <a href="https://www.avast.com/index"target="_blank" rel="noopener">Avast antivírus</a>. Tenha comportamento saudável de navegação e evite sites duvidosos. Você sabe do que estou falando. Vai ser comprometido.</p>
<p>Se necessário, instale uma distribuição Linux segura dentro do Virtualbox e abra o Tor de lá.</p>
<blockquote>
  <p><em>&ldquo;E a bagunça que é o Registro!?&rdquo;</em></p>

</blockquote>
<p>Ainda existe. Se você nunca experimentou, o Registro é o equivalente Windows do &ldquo;/etc&rdquo; nas distribuições Linux. É um banco de dados binário. Fica corrompido. Fica com entradas sujas.</p>
<p>Mas minha recomendação é: esqueça-o. Se você ficar pensando e mexendo nele, vai corromper o sistema. Não tente limpá-lo (nunca, jamais use algo como o CCleaner).</p>
<p>O próprio Windows agora tem snapshots automáticos de restauração do sistema toda vez que algo importante acontece. E é bastante confiável. Chegam ao ponto de duplicar o diretório atual &ldquo;C:\Windows&rdquo; em um &ldquo;C:\Windows.old&rdquo; quando há uma grande atualização do Windows, só por precaução. Se atiraram no próprio pé tantas vezes que finalmente aprenderam a ter várias camadas de opções de recuperação.</p>
<p>Hoje você pode até baixar a <a href="https://www.microsoft.com/en-us/software-download/windows10"target="_blank" rel="noopener">ferramenta de Criação de Mídia</a> diretamente do site da Windows. Não precisa nem se cadastrar em lugar nenhum. E a licença do Windows vem no firmware (BIOS) da máquina. Não precisa nem lembrar onde está sua chave de ativação do produto. Ativa automaticamente e como cada máquina já vem com uma licença, o processo é transparente. E a maioria dos fabricantes tem atualizações automáticas para drivers e firmware.</p>
<p>Então você deve ter uma experiência razoavelmente tranquila, aconteça o que acontecer.</p>
<blockquote>
  <p><em>&ldquo;Mas o Windows não é open source!&rdquo;</em></p>

</blockquote>
<p>O OS X também não. E essa é uma vantagem do Linux. Então, se for obrigatório, use apenas Linux nativamente. O ponto da discussão é encontrar uma alternativa ao Mac. Então estamos alinhados.</p>
<h2>O Efeito Ruby on Rails e os Hipsters<span class="hx:absolute hx:-mt-20" id="o-efeito-ruby-on-rails-e-os-hipsters"></span>
    <a href="#o-efeito-ruby-on-rails-e-os-hipsters" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Sendo honesto: no mundo do desenvolvimento de software, migramos para o Mac principalmente por causa do Rails e do Textmate 2. Tínhamos acesso a algumas ferramentas open source embutidas, tínhamos GCC para compilar o resto. O Windows XP estava bem além da validade. O Windows Vista foi uma experiência horrível. Os fabricantes de hardware para PC nem estavam tentando, e a Apple lançava hardware bom e boa experiência o tempo todo.</p>
<p>Os desenvolvedores migraram em massa após a transição de PowerPC para Intel em 2005. Meu primeiro Mac foi um Mac Mini G4 com OS X 10.4 Tiger. Depois comprei o primeiro MacBook branco Intel e nunca olhei para trás.</p>
<p>As ferramentas de software no Windows eram risíveis. O Visual Studio .NET era terrível. IDEs baseadas em Eclipse eram terríveis. Não tínhamos PowerShell ainda. E definitivamente nunca tivemos nada como o WSL para linha de comando. Você podia instalar o Cygwin, mas era uma experiência sofrível.</p>
<p>E rodar Linux como SO principal também era terrível. O Wine ainda é terrível, apesar de seus melhores esforços. Infelizmente, as GPUs da NVIDIA e AMD só rodam no melhor de sua capacidade no Windows. E Linux nunca foi realmente bom para criação de conteúdo. Não é nem questão de aprender um novo fluxo de trabalho — as ferramentas são medíocres. Precisam fazer engenharia reversa de tudo, e isso leva tempo. E na velocidade das redes sociais, não temos tempo suficiente, então precisamos aceitar compromissos.</p>
<p>O ecossistema Windows parou de fingir e finalmente abraçou tudo que o ecossistema open source e da Apple construiu. Agora todos nos beneficiamos.</p>
<p>A propósito, se você gosta do iTerm 2, vai adorar instalar o <a href="https://gnunn1.github.io/tilix-web/"target="_blank" rel="noopener">Tilix para Linux</a>, que é muito similar.</p>
<h2>Com o Passar do Tempo<span class="hx:absolute hx:-mt-20" id="com-o-passar-do-tempo"></span>
    <a href="#com-o-passar-do-tempo" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Acompanho a evolução da linha Surface ao longo dos anos. No começo, era muito cético. É muito fácil lançar um produto gimmick e descontinuá-lo. Confio em empresas que continuam evoluindo seus produtos ao longo dos anos. Não só um ecossistema se forma em torno deles, como você tem tempo para montar serviços de suporte, peças disponíveis nas lojas oficiais e no mercado secundário. Depois de todos esses anos, a Microsoft merece ser chamada de fabricante de hardware.</p>
<p>É a Microsoft finalmente cumprindo o que Alan Kay disse uma vez:</p>
<blockquote>
  <p><em>&ldquo;Pessoas que são realmente sérias sobre software deveriam fazer seu próprio hardware.&rdquo;</em></p>

</blockquote>
<p>Só falharam de verdade no mercado de smartphones, onde a competição é muito mais difícil e as margens são super baixas por causa disso. Mas acertaram no mercado de tablets, no desktop, no notebook, nos games, nos servidores (com seus próprios serviços Azure). Então agora acredito que eles realmente <strong>entendem</strong> as necessidades específicas de todas essas áreas, e isso aparece no software. Têm um entendimento muito superior de cada mercado — exceto smartphones — em relação à Apple. Finalmente têm skin no jogo de verdade.</p>
<p>Porque agora a Microsoft fabrica seu próprio hardware e fez um negócio disso, há um incentivo real dentro das equipes da empresa para um ciclo de feedback positivo que resulta em mais refinamentos no código do Windows.</p>
<p>Ficaram tentando e falhando em soluções touch desde o início dos anos 2000. Agora a Caneta não é mais um gimmick, é um produto real, com qualidades reais e casos de uso reais.</p>
<p>Também mantiveram sua visão de se dar bem com o Open Source. Ninguém pode razoavelmente esperar que a Microsoft vire totalmente open source. Mas aparece. São os segundos apenas para o Google no GitHub em termos de contribuições open source. Adquiriram a Xamarin e sua estratégia de .NET Core está em andamento e forte. O próprio Visual Studio recebeu tratamento open source. Ainda há um longo caminho, mas é preciso reconhecer os passos gigantescos.</p>
<p>O que é muito mais do que podemos dizer sobre a Apple, onde os coitados do <a href="https://github.com/Homebrew/homebrew-core/issues/14418"target="_blank" rel="noopener">Homebrew sofrem</a> a cada atualização do OS X.</p>
<p>A tentativa do Surface RT e do Windows Mobile até possibilitou que o Windows fosse finalmente compilado para rodar em processadores ARM. É um bom sinal para o futuro. Me lembra quando o OS X foi compilado pela primeira vez para rodar em processadores Intel (antes rodava em PowerPC) em 2005.</p>
<p>E o MacBook? Ganhou uma touch bar gimmick. A Apple está realmente desconectada da realidade.</p>
<h2>Por Que Saí do Ecossistema Apple?<span class="hx:absolute hx:-mt-20" id="por-que-saí-do-ecossistema-apple"></span>
    <a href="#por-que-sa%c3%ad-do-ecossistema-apple" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O foco da Apple não é no Mac. Pior: o Mac está rapidamente se tornando abandonware, apesar dos comunicados de relações públicas.</p>
<p>São claramente uma empresa de iPhone, com um negócio paralelo hobbyista que fabrica Macs e MacBooks, que existem principalmente para servir como toolchain de desenvolvimento de apps para iPhone. Esse é o modelo de negócios.</p>
<p>Você viu o último anúncio deles para o iPad?</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/sQB2NjhJHvY"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Sim, é super fofo e eu curto.</p>
<p>Mas a mensagem é cristalina: a visão é para as pessoas usarem apenas iPhones e iPads. Não existe tal coisa como um &ldquo;computador&rdquo;.</p>
<p>São a empresa de tecnologia mais valiosa no momento. Mas desde o ano passado, não têm mais nem uma equipe dedicada ao OS X. O que isso diz?</p>
<p>A linha iOS é um &ldquo;monopólio&rdquo; dentro da linha Apple. O Mac não consegue competir. O próprio Steve Jobs <a href="https://www.youtube.com/watch?v=ZBma82g3Uag"target="_blank" rel="noopener">alertou</a> sobre o que acontece com os monopólios.</p>
<p>Estamos começando a ouvir a mesma história por toda a indústria:</p>
<ul>
<li><a href="http://cdm.link/2016/09/apples-relationship-pro-music-needs-mending/"target="_blank" rel="noopener">Apple&rsquo;s relationship with pro music needs some mending</a> - Set, 26, 2016</li>
<li><a href="https://www.bloomberg.com/news/articles/2016-12-20/how-apple-alienated-mac-loyalists"target="_blank" rel="noopener">How Apple Alienated Mac Loyalists</a> - Dez, 20, 2016</li>
<li><a href="https://www.theverge.com/2016/12/21/14037686/apple-macbook-macos-focus-mobile-features-ios"target="_blank" rel="noopener">macOS is becoming legacy software</a> - Dez, 21, 2016</li>
<li><a href="https://www.stuckincustoms.com/2017/02/10/switching-from-mac-to-windows/"target="_blank" rel="noopener">Apple Is Dead To Me… I&rsquo;m Switching To Windows!</a> - Fev, 10, 2017</li>
<li><a href="https://char.gd/blog/2017/why-i-left-mac-for-windows-apple-has-given-up"target="_blank" rel="noopener">Why I left Mac for Windows: Apple has given up</a> - Mar, 5, 2017</li>
</ul>
<p>A Microsoft jogou bem suas cartas. Levou quase 15 anos. Mas valeu muito a pena. A Apple realmente alienou os leais, os que costumavam &ldquo;Think Different&rdquo;.</p>
<p>A Apple é &ldquo;vítima&rdquo; do <a href="https://www.amazon.com/Innovators-Dilemma-Revolutionary-Change-Business/dp/0062060244"target="_blank" rel="noopener">&ldquo;Dilema do Inovador&rdquo;</a> de Clayton Christensen. Se ainda tivessem visão, poderiam se estender e manter. Mas ao invés disso, escolheram apostar tudo em uma única linha de produtos.</p>
<p>A Microsoft parece ter lido a <a href="https://www.amazon.com/Innovators-Solution-Creating-Sustaining-Successful/dp/1422196577/ref=pd_sim_14_4?_encoding=UTF8&amp;psc=1&amp;refRID=CC6NWGVZMEWTTDETMZ8W"target="_blank" rel="noopener">&ldquo;Solução do Inovador: Criando e Sustentando o Crescimento de Sucesso&rdquo;</a> de Clayton.</p>
<p>Quando o iPod estava no auge, a Microsoft havia &ldquo;perdido&rdquo;. Estavam fora do jogo. Era deprimente de ver. Steve Ballmer foi um CEO vergonhoso. O Windows Vista foi um SO vergonhoso. O Zune falhou em capturar a aura do iPod. O Windows Mobile era uma bagunça. E o Sharepoint&hellip; ah, o Sharepoint. Chegaram a comemorar quando o jQuery foi adicionado ao ASP.NET! Falar em tarde demais.</p>
<p>E a Amazon — uma loja de varejo — lançou com sucesso a melhor infraestrutura do mundo e se tornou sinônimo de &ldquo;Nuvem&rdquo;, enquanto a Microsoft ainda estava tentando entender o que era Linux.</p>
<p>Falha após falha, em vez de defender sua posição baixa, finalmente decidiram se erguer e seguir em frente um passo de cada vez. Refinar. Evoluir. Sustentar.</p>
<p>Agora, o Windows 10 recapturou a aura do XP no seu melhor. Está fazendo atualizações incrementais e sólidas. Primeiro a Anniversary Edition, depois a Creators Update e finalmente a mais recente Fall Creators Update. Todas atualizações sólidas.</p>
<p>A linha Surface está indo forte como a melhor referência de design industrial e funcionalidades em desktops, notebooks e acessórios. Sério, a Apple ainda vende aquele terrível <a href="https://www.apple.com/shop/product/MLA02LL/A/magic-mouse-2"target="_blank" rel="noopener">Magic Mouse 2</a> escorregadio e difícil de segurar, mas a &ldquo;mágica&rdquo; é que alguém de fato compra. A Microsoft tem o <a href="http://amzn.to/2ztHZVv"target="_blank" rel="noopener">Arc Touch</a> e o <a href="http://amzn.to/2zu8p9o"target="_blank" rel="noopener">Precision Mouse</a>, dois dos melhores já fabricados.</p>
<p>Profissionais criativos, desenvolvedores de software — todos migramos em massa para o OS X quando era a &ldquo;Coisa Diferente&rdquo; da campanha &ldquo;Think Different&rdquo;. Ajudamos a evangelizar. Ajudamos a construir ferramentas. Ajudamos a construir serviços. Escrevemos toneladas de <a href="http://www.akitaonrails.com/2012/04/20/off-topic-comprei-meu-primeiro-mac-e-agora-edicao-2012"target="_blank" rel="noopener">posts</a> e documentação para ajudar.</p>
<p>Steve Jobs morreu e a Apple morreu com ele. Basicamente não fizeram nada novo desde então, e seus produtos antes bem-sucedidos foram deixados para decair e morrer. O que resta é o efeito halo, a inércia, e o crescente apetite por ordenhar a mesma vaca indefinidamente, abandonando todo o P&amp;D.</p>
<h2>A Apple Não Liga. Por Que Eu Deveria?<span class="hx:absolute hx:-mt-20" id="a-apple-não-liga-por-que-eu-deveria"></span>
    <a href="#a-apple-n%c3%a3o-liga-por-que-eu-deveria" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A Microsoft jogou com inteligência, continuou corrigindo e evoluindo, ano após ano. Perdeu a geração dos anos 90. Recuperou a geração dos anos 2010. E começaram cedo, atraindo atenção pelo Xbox até chegar ao Windows.</p>
<p>Sério, o Dashboard do XBox é melhor do que o do PS4. Prefiro muito mais.</p>
<p>E agora estão em boa posição. Os jogadores estão invertidos. O &ldquo;Think Different&rdquo; agora se refere ao Windows 10 e ao hardware PC. A Intel está conservadora. A NVIDIA fabrica as melhores GPUs. Há muitas ótimas opções que não estão disponíveis no Mac.</p>
<p>A transição de 32 para 64 bits e as necessidades do XBox até ajudaram a Microsoft a repensar como isolar e empacotar seu software. Mesmo que a Windows Store ainda seja uma piada de mau gosto neste ponto.</p>
<p>E Bill Gates estava absolutamente certo em meados dos anos 90: o browser tornaria o monopólio do Windows obsoleto. E tornou. Do lado bom, você tem os mesmos Chrome e Firefox disponíveis no OS X, Windows 10 e qualquer distribuição Linux. Isso significa acesso imediato a tudo que a maioria das pessoas precisa: Gmail, Google Docs, Office 365, Dropbox, LastPass, Spotify, Slack, Discord, Twitter, Netflix, HBO, Hulu, etc.</p>
<p>Odeio wrappers de desktop baseados em Javascript como a praga. O Electron é pesado demais. Mas o que posso fazer? Pelo menos hardware poderoso e RAM estão baratos hoje em dia, e podemos nos dar ao luxo de abas de browser que consomem 100 MB cada.</p>
<p>O browser é o novo SO para a maioria das pessoas. Muita gente se vira com Chromebooks! Todo o resto está nos celulares, não no desktop. Então ferramentas pesadas são necessárias. Ferramentas leves você já carrega no bolso.</p>
<p>O ecossistema Apple ainda não está morto. A Apple ainda tem tempo de corrigir a situação. Tenho esperado pelos últimos 3 anos, mas ainda zero sinais de melhora. Meu primeiro artigo sobre a troca foi <a href="http://www.akitaonrails.com/2015/11/10/situacao-brasil-no-macs-for-the-rest-of-us"target="_blank" rel="noopener">publicado em 10 de novembro de 2015</a>.</p>
<p>Diferente de outros artigos sobre troca de plataforma, não estou dizendo isso de forma leviana. Já fiz a troca, nos últimos 2 anos.</p>
<p>Como digo em muitos dos meus posts e palestras: não sou definido pelas minhas ferramentas. Não carrego bandeiras. Não sou leal a ninguém por padrão. Nunca fui pago pela Apple para defendê-la. E não sou pago pela Microsoft para dizer coisas boas sobre ela. Apenas analiso os fatos e aponto o melhor caminho a seguir.</p>
<p>E os fatos me dizem que o macOS chegou ao fim. Foi uma boa viagem. Adeus ao Mac e obrigado pelos peixes.</p>
]]></content:encoded><category>apple</category><category>microsoft</category><category>hardware</category></item><item><title>Windows Subsystem for Linux é Bom, Mas Ainda Não Suficiente</title><link>https://akitaonrails.github.io/2017/09/20/windows-subsystem-for-linux-e-bom-mas-ainda-nao-suficiente/</link><guid isPermaLink="true">https://akitaonrails.github.io/2017/09/20/windows-subsystem-for-linux-e-bom-mas-ainda-nao-suficiente/</guid><pubDate>Wed, 20 Sep 2017 14:43:00 -0300</pubDate><description>&lt;p&gt;Em julho de 2016 escrevi um post precipitado intitulado &lt;a href="http://www.akitaonrails.com/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel"target="_blank" rel="noopener"&gt;&amp;ldquo;The Year of Linux on the Desktop - It&amp;rsquo;s Usable!&amp;rdquo;&lt;/a&gt; e, de fato, ele era (mal e mal) utilizável.&lt;/p&gt;
&lt;p&gt;O verdadeiro &amp;ldquo;Ano do Linux no Desktop&amp;rdquo; ainda não chegou. Mas está chegando, como vou explicar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; este não vai ser &amp;lsquo;mais-um-post-de-instalação-do-WSL&amp;rsquo;, já existem vários por aí, por exemplo &lt;a href="https://medium.com/xtrememl/why-how-to-use-windows-10-wsl-built-in-linux-for-machine-learning-6a225f4bbd3a"target="_blank" rel="noopener"&gt;este&lt;/a&gt; ou &lt;a href="https://www.neowin.net/news/bash-plus-windows-10-equals-linux-gui-apps-on-the-windows-desktop"target="_blank" rel="noopener"&gt;este outro&lt;/a&gt;. E você sempre pode &lt;a href="http://lmgtfy.com/?q=windows&amp;#43;10&amp;#43;creator&amp;#43;update&amp;#43;install&amp;#43;WSL"target="_blank" rel="noopener"&gt;pesquisar no Google&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No início de 2016 a Microsoft anunciou e lançou uma versão bem alpha do que viria a ser o Windows Subsystem for Linux (WSL). Ele inicializava e rodava alguns programas, mas era cheio de bugs. Justo, afinal era ainda apenas um preview para Insiders (aliás, evite builds do Insider Preview, eles travam com tela azul o tempo todo, é desenvolvimento ativo).&lt;/p&gt;</description><content:encoded><![CDATA[<p>Em julho de 2016 escrevi um post precipitado intitulado <a href="http://www.akitaonrails.com/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel"target="_blank" rel="noopener">&ldquo;The Year of Linux on the Desktop - It&rsquo;s Usable!&rdquo;</a> e, de fato, ele era (mal e mal) utilizável.</p>
<p>O verdadeiro &ldquo;Ano do Linux no Desktop&rdquo; ainda não chegou. Mas está chegando, como vou explicar.</p>
<p><strong>TL;DR</strong> este não vai ser &lsquo;mais-um-post-de-instalação-do-WSL&rsquo;, já existem vários por aí, por exemplo <a href="https://medium.com/xtrememl/why-how-to-use-windows-10-wsl-built-in-linux-for-machine-learning-6a225f4bbd3a"target="_blank" rel="noopener">este</a> ou <a href="https://www.neowin.net/news/bash-plus-windows-10-equals-linux-gui-apps-on-the-windows-desktop"target="_blank" rel="noopener">este outro</a>. E você sempre pode <a href="http://lmgtfy.com/?q=windows&#43;10&#43;creator&#43;update&#43;install&#43;WSL"target="_blank" rel="noopener">pesquisar no Google</a>.</p>
<p>No início de 2016 a Microsoft anunciou e lançou uma versão bem alpha do que viria a ser o Windows Subsystem for Linux (WSL). Ele inicializava e rodava alguns programas, mas era cheio de bugs. Justo, afinal era ainda apenas um preview para Insiders (aliás, evite builds do Insider Preview, eles travam com tela azul o tempo todo, é desenvolvimento ativo).</p>
<p>Um ano se passou, chegamos ao Windows 10 Anniversary Update e, finalmente, ao tão esperado <strong>Creators Update</strong>. A evolução foi significativa.</p>
<p>Se você não sabe o que é o WSL, recomendo muito que leia os <a href="https://blogs.msdn.microsoft.com/wsl/"target="_blank" rel="noopener">artigos no blog de desenvolvedores da Microsoft</a> e o excelente post da Jessie Frazelle, <a href="https://blog.jessfraz.com/post/windows-for-linux-nerds/"target="_blank" rel="noopener">Windows for Linux Nerds</a>. Em resumo: o WSL intercepta as system calls do kernel do Windows e as mapeia como system calls do kernel Linux, enganando binários ELF64 não modificados para que rodem como se estivessem num sistema Linux de verdade. O detalhe crucial é que não há nenhum kernel Linux rodando! Ele também encapsula serviços do Windows como sistema de arquivos e rede em dispositivos que o Linux consegue acessar.</p>
<p>Portanto, não é virtualização. Não existe Hyper-V envolvido. É o Windows executando binários ELF64 diretamente, sem recompilação, sem modificação.</p>
<p>Diferentemente do OS X, onde é preciso ajustar o código-fonte e recompilar para rodar no Darwin (a camada Mach/BSD do sistema), aqui dá para baixar binários Ubuntu (ou de qualquer outra distro — Fedora e SUSE estão chegando em breve à Windows App Store) e executá-los <strong>diretamente</strong>.</p>
<p>Melhor ainda: dá para rodar daemons de sistema (sim, PostgreSQL, Memcached, Redis, etc. todos carregam e rodam em background) e até programas com interface gráfica via X!</p>
<p>Não me entendam mal, tenho o maior respeito por quem trabalha duro na Microsoft para fazer isso acontecer. É um feito técnico notável por si só.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/657/2017-09-14.png" alt="Windows e X lado a lado"  loading="lazy" /></p>
<p>Olhem bem para esse screenshot. É algo digno de admiração: GNOME-VIM nativo rodando lado a lado com o Microsoft Edge carregando um site servido por uma aplicação Rails dentro do WSL, acessando o PostgreSQL.</p>
<p>Mas será que funciona bem para o dia a dia?</p>
<h3>O WSL é bom de verdade?<span class="hx:absolute hx:-mt-20" id="o-wsl-é-bom-de-verdade"></span>
    <a href="#o-wsl-%c3%a9-bom-de-verdade" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>TL;DR</strong> não chega nem perto de ser tão fluido quanto rodar uma distro Linux pura, e a integração está longe de ser tão boa quanto o OS X em termos de usabilidade — o Windows simplesmente não foi redesenhado de forma significativa para ser um sistema UNIX como o OS X.</p>
<p>Num mundo ideal, o Windows substituiria toda a base NT e construiria sua própria infraestrutura inspirada em BSD (como o Darwin) ou criaria uma distro Linux própria usando o kernel Linux pronto (provavelmente inviável por causa da GPL).</p>
<p>Mas isso é irreal. A Apple conseguiu fazer isso numa época em que a base instalada de Macs era pequena, então alienar alguns usuários não custava tanto. O Windows é grande demais para falhar. É e continuará sendo um pesadelo de manutenção de proporções épicas.</p>
<p>Dito isso, o WSL em si é um milagre, então não tenho como reclamar. A Microsoft teve uma década realmente difícil na virada do século. O Windows 10 é uma volta por cima, e depois de duas grandes iterações está finalmente se tornando razoável de novo. Talvez estejamos a mais algumas atualizações de um WSL realmente utilizável. Só o tempo dirá.</p>
<p>A Apple teve seu milagre na virada do século, e o OS X e o iOS são sistemas operacionais excelentes. Os melhores da categoria. E conseguir reiniciar um ecossistema inteiro do zero não é algo que qualquer empresa consegue fazer.</p>
<p>As distros Linux tiveram seus altos e baixos. Nenhum ecossistema evolui de forma saudável e coesa sendo tão fragmentado. Mas cada distro principal conseguiu forçar seu próprio ecossistema na marra. A Canonical sobreviveu onde muitas falharam, mas ainda não é a vencedora definitiva, e dá a impressão de que está <a href="https://arstechnica.com/information-technology/2017/04/ubuntu-unity-is-dead-desktop-will-switch-back-to-gnome-next-year/"target="_blank" rel="noopener">perdendo o fôlego</a>. A RedHat aproveitou a febre do dot-com e conseguiu voar alto no mercado corporativo. Não existe distro &ldquo;melhor&rdquo;. É, de novo, uma questão de gosto e ego, na maior parte do tempo para a maior parte das pessoas.</p>
<p>E a comunidade OSS ainda desperdiça uma quantidade absurda de tempo em disputas sem sentido, como a <a href="https://www.reddit.com/r/linuxmasterrace/comments/616wxo/what_is_with_all_the_controversy_with_systemd/"target="_blank" rel="noopener">controvérsia do Systemd</a> ou o tempo que está levando para abandonar o X e finalmente migrar para o Wayland. OSS tem prós e contras, como tudo o mais.</p>
<p>Mas voltando ao WSL, antes que eu me perca. Sim, como prometido, quase tudo que se faz num Ubuntu 16.04 nativo pode ser feito nesse novo ambiente. Até o ridículo <code>cmd.exe</code> foi bastante atualizado para o século XXI. Ainda está longe de um Terminal padrão do Linux ou OS X, mas está chegando lá. Na prática, eu recomendaria instalar o <a href="https://github.com/goreliu/wsl-terminal"target="_blank" rel="noopener">WSL Terminal</a> como substituto, e apesar do nome terrível &ldquo;Bash on Ubuntu on Windows&rdquo;, eu recomendaria instalar o ZSH em vez do Bash para ter mais recursos de usabilidade.</p>
<p>Dá para pesquisar tutoriais sem fim sobre como personalizar o ambiente, Vim, ajustar o PostgreSQL, etc. Então não vou repetir isso aqui. Um aviso importante: tenho que rodar <code>sudo /etc/init.d/PostgreSQL start</code> para iniciar os daemons. Eles não sobem automaticamente depois de reiniciar o sistema — guarde isso.</p>
<p>Também dá para instalar um servidor X no Windows, como o <a href="https://sourceforge.net/projects/xming/"target="_blank" rel="noopener">xming</a>, fazer <code>export DISPLAY=:0</code> e então <code>sudo apt install gvim</code> para carregar a versão gráfica do Gvim, por exemplo. Ou um desktop GNOME ou XFCE completo, se for o seu negócio. Dá para rodar aplicações X lado a lado com apps Windows, e isso é muito legal. Gosto de instalar o <a href="https://github.com/skwp/dotfiles"target="_blank" rel="noopener">YADR</a>, aquela coleção de dotfiles supercustomizada, e ele funciona bem.</p>
<p>Estou usando o <a href="https://github.com/asdf-vm/asdf"target="_blank" rel="noopener">ASDF</a> para instalar e gerenciar múltiplas versões de Ruby, Node.js, Elixir, etc. E também funciona.</p>
<p>Consegui mover minhas chaves SSH da instalação anterior do <a href="http://www.akitaonrails.com/2017/01/10/arch-linux-a-melhor-distro-de-todas"target="_blank" rel="noopener">Arch Linux</a>. E aí consigo clonar os repositórios Git normalmente. E aqui vem o <strong>grande problema</strong>. Clonei e configurei um projeto Rails. Este é o melhor resultado que consegui rodando toda a suíte RSpec com testes de aceitação usando PhantomJS:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 5 minutes 35 seconds (files took 48.53 seconds to load)
888 examples, 0 failures</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso rodando no meu <a href="http://www.akitaonrails.com/2017/01/31/do-macbook-pro-para-o-dell-xps-arch-linux-para-usuarios-criativos"target="_blank" rel="noopener">Dell XPS 9550</a> com Core i7 Skylake (4 cores, 8 threads), 16 GB de RAM e SSD NVME2. Pedi a um colega para rodar no Mac Mini dele, de 2012, com Core i5 (provavelmente Haswell), 10 GB de RAM e SSD normal. Este foi o resultado dele:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 3 minutes 37.6 seconds (files took 9.73 seconds to load)
888 examples, 0 failures</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Sim, chocante. A emulação do sistema de arquivos é <a href="https://meta.discourse.org/t/installation-notes-for-discourse-on-bash-for-windows/48141/3?u=sam"target="_blank" rel="noopener">notoriamente lenta</a> no WSL (pelo menos 4 vezes mais lenta, como se vê nos números acima).</p>
<p>Este outro teste rodou num hardware um pouco mais novo (ainda bem inferior ao meu Dell XPS) com Linux Mint:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 3 minutes 2.4 seconds (files took 22.69 seconds to load)
888 examples, 1 failure</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Rodei a mesma suíte algumas vezes para confirmar, mas não consegui passar da marca de 5 minutos, e o carregamento de arquivos fica sempre em torno de 1 minuto, enquanto em outros sistemas operacionais é de 2 a 4 vezes mais rápido.</p>
<p>Se o seu fluxo de desenvolvimento é intensivo em I/O, você vai sofrer. A compilação do Webpack, que já é lenta, fica ainda mais lenta. Npm/Yarn demora uma eternidade. Instalar coisas a partir do código-fonte é muito devagar.</p>
<p>Não chega a ser inutilizável, mas essa lentidão vai cansar rápido.</p>
<h3>E a Virtualização?<span class="hx:absolute hx:-mt-20" id="e-a-virtualização"></span>
    <a href="#e-a-virtualiza%c3%a7%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Depois de ver a performance de sistema de arquivos deplorável descrita acima, pensei: <em>&ldquo;e quanto a rodar tudo no bom e velho Virtualbox?&rdquo;</em></p>
<p>Em teoria, o WSL &ldquo;deveria&rdquo; ser uma camada mais fina que o Virtualbox, mas o grande vilão em termos de overhead parece ser a camada de abstração do sistema de arquivos, e não necessariamente o acesso a CPU ou RAM. Meu instinto inicial diria que um Virtual Drive — um único arquivo montado como HD virtual — teria um desempenho bem melhor.</p>
<p>Então lá fui eu instalar o Virtualbox com o mesmo conjunto de ferramentas (asdf, etc.).</p>
<p>Montar uma pasta compartilhada diretamente para o equivalente no WSL não funciona direito; parece que o protocolo de montagem não entende dot files, então eles simplesmente não aparecem. É preciso compactar a pasta com tar e descompactar dentro da máquina para preservar arquivos ocultos e permissões.</p>
<p>Rodando a mesma suíte RSpec no Virtualbox com 4 Cores (dos 8 que minha máquina tem) e 4GB de RAM:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 2 minutes 3.4 seconds (files took 6.33 seconds to load)
888 examples, 2 failure</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Então fomos de 5:35 min para 2:03 min e o carregamento de arquivos de 49 segundos para 6 segundos! Cerca de 2,5 vezes mais rápido na execução e nada menos que 8 vezes mais rápido no carregamento de arquivos! É absurdo, mas faz todo sentido. Minha máquina de 2016, dentro do Virtualbox, ainda supera hardware bare-metal de 2011/2012. E o WSL fica na última posição.</p>
<p>Esqueça benchmarks sintéticos — este é um caso real misturando execuções bound em CPU e I/O. Só para comparar, tentei ver se conseguia mais desempenho rodando no VMWare Workstation. O resultado:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>Finished in 2 minutes 3.3 seconds (files took 6.21 seconds to load)</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Praticamente idêntico. Para mim, isso mostra que o Virtualbox percorreu um longo caminho para se igualar a soluções comerciais historicamente mais robustas como VMware e Parallels, então fico com o Virtualbox por enquanto.</p>
<p>Fiz outro teste: instalação do Ruby 2.4.2 a partir do código-fonte usando <code>asdf</code>. Primeiro no WSL (rodando com <code>time</code>):</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>229.38s user 244.59s system 113% CPU 6:57.51 total</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E a mesma instalação no Virtualbox:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>295,39s user 22,43s system 135% CPU 3:53,87 total</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Mais uma vez, cenário misto de CPU e I/O. No Virtualbox sou pelo menos duas vezes mais rápido.</p>
<p>Se quiser ver cenários mais controlados com benchmarks sintéticos, recomendo ler <a href="http://www.phoronix.com/scan.php?page=article&amp;item=intel-7900x-wsl&amp;num=1"target="_blank" rel="noopener">o artigo do Phoronix sobre WSL vs Virtualbox</a>.</p>
<h3>O Dilema do &ldquo;Ano do Linux no Desktop&rdquo;<span class="hx:absolute hx:-mt-20" id="o-dilema-do-ano-do-linux-no-desktop"></span>
    <a href="#o-dilema-do-ano-do-linux-no-desktop" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A falta de software comercial é um problema, e uma das causas é a ausência de compatibilidade binária retroativa.</p>
<p>Apesar de todos os seus problemas, a Microsoft manteve compromisso com um conceito muito difícil: dá para executar binários não modificados do Windows 95 no Windows 10 atual. Na maioria das vezes eles &ldquo;simplesmente funcionam&rdquo;. Nas distros Linux, todo binário é compilado contra cabeçalhos de biblioteca muito específicos — o próprio kernel, Glibc e muitos outros. Sempre que um desses muda, todos os binários precisam ser recompilados. É por isso que existe o conceito de &ldquo;distros&rdquo;, onde se recompila e testa um conjunto completo de softwares. O Long-Term Support (LTS) é basicamente travar as versões dessas dependências por alguns anos para que o software rode sem precisar recompilar tanto. Mas em distros de ponta, é inevitável recompilar muita coisa várias vezes.</p>
<p>O Windows carrega os binários de dependências antigos consigo. O OS X faz o mesmo em certa medida. E o OS X vai além, com o conceito de &ldquo;fat binaries&rdquo; (ou &ldquo;Universal Binaries&rdquo;), onde um pacote contém múltiplos binários voltados para diferentes arquiteturas de hardware (32-bit vs 64 bit, Intel vs ARM vs PowerPC).</p>
<p>Principalmente por causa desse suporte, aplicações comerciais complexas como o Office ou o Creative Suite da Adobe conseguem rodar em muitas máquinas diferentes, em versões diferentes do sistema operacional, por muitos anos sem precisar atualizar. Nas distros Linux, binários são uma dor de cabeça. É por isso que ter o código-fonte disponível é tão importante — e esse é um debate filosófico sobre o conceito do &ldquo;Software Livre&rdquo; como concebido por Richard Stallman.</p>
<p>É um dilema sem solução. Distros Linux não têm compatibilidade binária retroativa nativa. Desenvolvedores precisam contar com ferramentas como o <a href="https://lvc.github.io/abi-compliance-checker/"target="_blank" rel="noopener">ABI Compliance Checker</a> e tentar usar <a href="http://www.airs.com/blog/archives/220"target="_blank" rel="noopener">symbol versioning</a> do glibc, entre outros recursos. Mas não é realista esperar que voluntários contribuindo com seu tempo livre para o código aberto mantenham versões antigas de software por muitos anos. É um compromisso justo. Quer o melhor, o mais rápido, o mais seguro? Atualize frequentemente, mas aceite que software antigo e não mantido vai quebrar.</p>
<p>Portanto, sem liberar o código-fonte, não dá para ter binários compatíveis e bons em cada grande distribuição, em versões diferentes, ao longo de muitos anos.</p>
<h3>Qual é o certo para você?<span class="hx:absolute hx:-mt-20" id="qual-é-o-certo-para-você"></span>
    <a href="#qual-%c3%a9-o-certo-para-voc%c3%aa" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Não adianta tentar fazer benchmark de sistemas operacionais. Todos são geralmente bons o suficiente.</p>
<p>Macs são mais caros (às vezes por uma diferença absurda de mais de um milhão de reais). Não tem como negar. O compromisso é que o hardware da Apple, o OS X e o ecossistema são geralmente os melhores no geral, e o &ldquo;acabamento&rdquo; dos produtos costuma ser de fato superior do ponto de vista de experiência de uso.</p>
<p>Para a melhor combinação de software mainstream com software open source, não existe alternativa melhor. Se puder comprar um Mac, compre um Mac.</p>
<p>Quem é gamer precisa ficar com o Windows. Sem discussão. Os melhores jogos estão no Windows, ponto. A melhor combinação de hardware suporta Windows. Nenhum ajuste no Linux vai te dar o desempenho bruto necessário para extrair 4K a 60fps das novas GPUs AMD e NVIDIA via DirectX. O hardware Mac tem limitações e não aceita as GPUs mais novas. Se quer jogar os últimos jogos AAA do jeito que foram projetados para rodar, monte um hardware personalizado com Windows 10.</p>
<p>Desenvolvedores web têm mais sorte. Não tem como errar — é literalmente questão de gosto qual sistema operacional escolher. Dá para entregar os mesmos resultados usando as mesmas ferramentas. E a não ser que você precise de infraestrutura específica Microsoft (SQL Server, Active Directory, etc.), instala qualquer distro Linux e fica feliz.</p>
<p>Desenvolvedores de apps desktop precisam pensar no público-alvo. Se quer construir apps desktop Windows, tem que estar no Windows. Mas dá para usar .NET/Xamarin ou Java para construir binários cross-platform. O problema é que, idealmente, precisam ter os três sistemas para garantir que o software se comporta como esperado.</p>
<p>Desenvolvedores mobile também têm azar. Android dá para fazer no Windows ou Linux, mas para desenvolver para a App Store da Apple é preciso ter Mac. Não tem como escapar disso, e boa sorte esperando a Apple liberar suas ferramentas para outras plataformas.</p>
<p>Profissionais criativos podem escolher entre Windows e OS X. Depende das ferramentas. Se você usa Adobe, qualquer um serve bem, mas provavelmente vai querer uma workstation personalizada. Até a Apple remodelar o ridículo Mac Pro, não encontrará o melhor hardware pelo preço na Apple. O iMac 5K atual é bom, mas acima disso não tem opção. Por exemplo, se precisar de 2 GPUs NVIDIA Titan ou Quadro rodando em paralelo, a Apple não vai ajudar.</p>
<p>Se o fluxo de trabalho exige Final Cut Pro, Logic Pro, Motion 5, a melhor opção disponível é o iMac 5K.</p>
<p>Eu não sou mais desenvolvedor em tempo integral. Divido meu tempo gerindo uma empresa, fazendo apresentações, experimentando tecnologia e pesquisando. Meu setup ideal seria um MacBook Pro. Mas estou me forçando a viver fora do ecossistema Apple, e dói. Meu lado desenvolvedor web fica feliz no Linux (Manjaro GNOME é meu favorito atualmente). Mas quando o lado criativo precisa de ferramentas, Gimp, Inkscape, Kdenlive simplesmente não chegam lá. Estou muito acostumado com Photoshop, Illustrator, Final Cut/Premiere, Motion 5/After Effects. O LibreOffice Impress é terrível para apresentações complexas, e os slides baseados em HTML/JS servem para coisas simples. Tente fazer gráficos e animações sérias lá e você vai sofrer demais.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/a59U6kRJHLg"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>Se você é um criativo, <strong>precisa</strong> de telas com calibração de cores (espaço Adobe RGB), precisa de poder de processamento bruto para renders rápidos e pós-processamento avançado. Editores de vídeo Adobe vão preferir Windows. Editores Final Cut são bem atendidos nos Macs, mesmo que o sistema de refrigeração dos novos MacBook Pros seja terrível:</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/6TWbXV5xeYE"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>E se você é editor de vídeo em tempo integral, pode pagar tanto por um PC quanto por um Mac de ponta, então a disputa fica pequena.</p>
<p>Se você é editor de vídeo com orçamento limitado, <strong>não vai</strong> ter um bom fluxo de edição 4K no Linux, ponto. O suporte para explorar o potencial total das GPUs modernas é fraco, não há bom suporte a Cuda ou OpenCL, e a maioria das ferramentas de edição não os utiliza. O Blender — que é primariamente uma ferramenta de modelagem 3D e animação — é considerado uma das melhores ferramentas de edição de vídeo disponíveis no Linux, o que já diz muito. O estado lamentável do suporte a GPU no Linux compromete o uso criativo. A única outra ferramenta de edição não-linear que consegue atingir fluxos de trabalho profissionais é o <a href="https://www.linux.com/learn/pro-level-video-editing-lightworks-linux"target="_blank" rel="noopener">LightWorks</a>, que não é open source, requer os binários proprietários da NVIDIA e <a href="https://www.lwks.com/index.php?option=com_shop&amp;view=shop&amp;Itemid=205"target="_blank" rel="noopener">custa dinheiro</a>.</p>
<p>Se for por esse caminho, provavelmente é melhor ficar com Windows ou OS X por enquanto.</p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Me perdi um pouco no meio do caminho, mas a conclusão é simples:</p>
<ul>
<li>O WSL ainda não chegou lá. Precisamos esperar mais algumas atualizações. Quando você ouvir que melhoraram a abstração do sistema de arquivos em algumas ordens de magnitude, aí sim vale tentar de novo. E lembre-se que existem toneladas de <a href="https://github.com/Microsoft/BashOnWindows/issues"target="_blank" rel="noopener">issues abertas</a>, então os resultados variam muito.</li>
<li>Se você é desenvolvedor web, está seguro em qualquer distro Linux.</li>
<li>Se você é um profissional misto, precisando tanto de ferramentas de desenvolvimento quanto de ferramentas criativas, use Mac ou Windows 10 com uma distro Linux totalmente virtualizada.</li>
<li>Se é gamer, Windows.</li>
<li>Se é profissional criativo em tempo integral, tanto Macs quanto PCs servem bem.</li>
</ul>
<p>Por enquanto vou ficar com meu Dell XPS rodando Windows 10 e Manjaro GNOME no Virtualbox. O Virtualbox é rápido o suficiente para não prejudicar meu fluxo de trabalho. E as ferramentas criativas conseguem aproveitar os núcleos CUDA da minha NVIDIA sem problema, então consigo renderizar no Blender e fazer o Premiere processar vídeo 4K em tempo razoável.</p>
]]></content:encoded><category>linux</category><category>microsoft</category><category>performance</category></item><item><title>O Ano do Linux no Desktop - Está Usável!</title><link>https://akitaonrails.github.io/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel/</link><guid isPermaLink="true">https://akitaonrails.github.io/2016/07/26/o-ano-do-linux-no-desktop-esta-usavel/</guid><pubDate>Tue, 26 Jul 2016 14:13:00 -0300</pubDate><description>&lt;p&gt;23/07/16: por coincidência, postei esse review um dia antes do release final :-) Então o build final é o 14393 e &lt;a href="http://arstechnica.com/information-technology/2016/07/windows-10-anniversary-update-is-ready-to-go-and-free-for-just-a-few-more-days/"target="_blank" rel="noopener"&gt;já está disponível&lt;/a&gt; de graça agora mesmo!&lt;/p&gt;
&lt;p&gt;Já fazem 3 meses desde que postei &lt;a href="http://www.akitaonrails.com/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft"target="_blank" rel="noopener"&gt;minhas impressões iniciais&lt;/a&gt; sobre a feature mais importante do Windows 10 Anniversary Edition: o Bash no Windows. Minha conclusão na época foi que ainda não estava pronto pra produção.&lt;/p&gt;
&lt;p&gt;Minha conclusão agora, em 26 de julho, é que finalmente está usável o suficiente pra desenvolvedores web, particularmente pra desenvolvedores Ruby que sempre sofreram com a falta de suporte no Windows.&lt;/p&gt;</description><content:encoded><![CDATA[<p>23/07/16: por coincidência, postei esse review um dia antes do release final :-) Então o build final é o 14393 e <a href="http://arstechnica.com/information-technology/2016/07/windows-10-anniversary-update-is-ready-to-go-and-free-for-just-a-few-more-days/"target="_blank" rel="noopener">já está disponível</a> de graça agora mesmo!</p>
<p>Já fazem 3 meses desde que postei <a href="http://www.akitaonrails.com/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft"target="_blank" rel="noopener">minhas impressões iniciais</a> sobre a feature mais importante do Windows 10 Anniversary Edition: o Bash no Windows. Minha conclusão na época foi que ainda não estava pronto pra produção.</p>
<p>Minha conclusão agora, em 26 de julho, é que finalmente está usável o suficiente pra desenvolvedores web, particularmente pra desenvolvedores Ruby que sempre sofreram com a falta de suporte no Windows.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/543/big_Screen_Shot_2016-07-26_at_13.28.48.png" alt="It’s alive!"  loading="lazy" /></p>
<p>O processo de instalação é o mesmo. Você precisa estar inscrito no programa <a href="http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/"target="_blank" rel="noopener">Windows Insider</a>, esperar pelo menos um dia se for sua primeira vez. Habilite o <strong>Fast ring</strong> de updates, instale a edição Preview pelo Windows Update normal e então ligue a feature &ldquo;Windows Subsystem for Linux (Beta)&rdquo;.</p>
<blockquote>
  <p>Da última vez eu estava testando Windows 10 sobre Virtualbox sobre Ubuntu 14.04 num notebook Dell Inspiron (i7 com 8 cores e 16GB de RAM). Estava lentíssimo, não recomendo de jeito nenhum. Agora voltei pro meu confiável Macbook Pro 2013 com 16GB de RAM e SSD rodando VMWare Fusion, e o Windows 10 voa aqui. Super recomendado.</p>

</blockquote>
<p>Depois de fazer tudo isso, você pode iniciar o &ldquo;Bash on Ubuntu on Windows&rdquo; (que nome enorme). A primeira boa surpresa é que ele pede pra você registrar um novo nome de usuário em vez de cair direto no Root. Como falei no post anterior, é boa prática criar um novo usuário e adicionar ao grupo sudoers, e é isso que ele faz. Então você pode instalar pacotes usando &ldquo;sudo apt-get install&rdquo;.</p>
<p>Você deveria seguir meu <a href="http://www.akitaonrails.com/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft"target="_blank" rel="noopener">post anterior</a> pra ver todos os pacotes e configurações que eu normalmente faço numa máquina Linux de desenvolvimento.</p>
<p>RVM agora funciona! Consegui instalar Ruby 2.3.1 via RVM sem nenhum problema.</p>
<p>Consegui dar <code>git clone</code> num pequeno projeto Rails e rodar <code>bundle install</code> direitinho. Todas as gems foram baixadas, extensões nativas compilaram sem nenhuma falha.</p>
<p>Algumas coisas ainda não funcionam. Por exemplo, você não vai conseguir terminar a instalação do Postgresql 9.3. Ele vai baixar e instalar, mas o setup do cluster falha, como você pode acompanhar nessa <a href="https://github.com/microsoft/WSL/issues/61"target="_blank" rel="noopener">thread de issue</a>.</p>
<p>Mas você não precisa ter <strong>tudo</strong> instalado sob o Ubuntu, dá pra usar o <a href="https://www.postgresql.org/download/windows/"target="_blank" rel="noopener">Postgresql for Windows</a> nativo e editar seu <code>config/database.yml</code> apontando pro server <code>127.0.0.1</code> e porta <code>5432</code>. No lado do Ubuntu, basta instalar o <code>libpq-dev</code> pra que a gem <code>pg</code> consiga compilar suas extensões nativas e pronto.</p>
<p>Serviços menores como Memcached ou Redis instalam direitinho com <code>apt-get</code>, mas eles não vão dar auto-start via Upstart. Você pode iniciá-los manualmente e usar algo como <a href="https://github.com/ddollar/foreman"target="_blank" rel="noopener">Foreman</a> pra controlar os processos. Os dois sobem e funcionam bem o suficiente, então dá pra testar caching nos seus projetos Rails e também testar workers Sidekiq.</p>
<p>Eu sei que ainda é um Preview, então ainda vêm correções de bug e possivelmente algumas features novas até o release final de agosto. O que mais me incomoda é que todo comando que rodo com <code>sudo</code> demora alguns segundos pra começar. É irritante, mas funciona no final.</p>
<p>Node.js 6.3.1 instala e roda com sucesso. Consegui dar <code>npm i</code> e <code>node server.js</code> no <a href="https://github.com/openshift/nodejs-ex"target="_blank" rel="noopener">repositório de exemplo</a> Node do Openshift.</p>
<p>Crystal 0.18.7 instala com sucesso e compilou meu projeto <a href="https://github.com/akitaonrails/cr_manga_downloadr"target="_blank" rel="noopener">Manga Downloader</a> direitinho. Rodou meu teste de performance embutido em 15 minutos. A performance é modesta, mas executa corretamente até o fim. (E sim, Crystal agora também roda no Windows!).</p>
<p>Go 1.6 funciona. Só dei um <code>go get</code> pra instalar o Martini e rodei o simples server &ldquo;Hello World&rdquo;. Compila, inicia e executa rapidíssimo como esperado.</p>
<p>Infelizmente, Elixir 1.3.1 trava, ainda não sei por quê.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>$ iex
Crash dump is being written to: erl_crash.dump...done
erl_child_setup closed</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Na real, o próprio Erlang trava só de tentar rodar <code>erl</code>. Nenhuma das ferramentas Elixir funciona como consequência. Sem iex, sem mix. O engraçado é que estava funcionando no Preview inicial. Então ou é algo do novo Preview ou algo dos releases mais novos do Erlang. Existem <a href="https://github.com/microsoft/WSL/issues?utf8=%e2%9c%93&amp;q=is%3Aissue%20elixir"target="_blank" rel="noopener">issues abertas</a> sobre esse problema, então vamos torcer pra ser corrigido logo.</p>
<p><a name="best-windows-dev-env"></a></p>
<h3>&ldquo;O Melhor Ambiente para Rails no Windows&rdquo;<span class="hx:absolute hx:-mt-20" id="o-melhor-ambiente-para-rails-no-windows"></span>
    <a href="#o-melhor-ambiente-para-rails-no-windows" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Eu tenho <a href="https://web.archive.org/web/20160814041945/http://www.akitaonrails.com/2009/1/13/the-best-environment-for-rails-on-windows"target="_blank" rel="noopener">esse post bem antigo de 2009</a> pra guiar desenvolvedores presos no Windows que precisam implementar projetos Rails. O primeiro conselho é evitar Ruby for Windows. Eu realmente louvo os esforços de grandes desenvolvedores como o Luis Lavena, que investiu muito tempo pra fazer aquilo funcionar bem o suficiente. Mas, infelizmente, a realidade é que Ruby foi feito pra ambientes Linux, ele se conecta a extensões nativas em C que têm um monte de dependências difíceis de disponibilizar no Windows.</p>
<p>Então a melhor opção até agora era instalar Vagrant (via Virtualbox ou, melhor ainda, VMWare) como runtime e usar editores disponíveis no Windows como Sublime Text 3 ou Atom.</p>
<p>Agora você pode evitar a parte de Vagrant/virtualização e usar diretamente o &ldquo;Bash on Ubuntu on Windows&rdquo;. É tão completo que dá até pra usar ZSH e instalar dotfiles complexos como o YADR. Dá pra rodar Postgresql for Windows e conectar em localhost:5432 na sua aplicação Rails ou em qualquer aplicação web que precise de Postgresql, por exemplo.</p>
<p>Você pode instalar o ConEmu como um emulador de terminal melhor do que o cmd.exe padrão estupidamente ruim. Siga <a href="https://conemu.github.io/en/BashOnWindows.html"target="_blank" rel="noopener">esse artigo</a> pra acompanhar novidades sobre o suporte ao Bash no Windows. Por enquanto você tem que mudar o hotkey &ldquo;Ctrl-V&rdquo; pra outra coisa (&ldquo;Ctrl-Shift-V&rdquo;), as setas não funcionam direito no Vim, e dá pra adicionar uma Default Task pro Bash assim: <code>%windir%\system32\bash.exe ~ -cur_console:p</code></p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/544/big_Screen_Shot_2016-07-28_at_14.13.36.png" alt="Desenvolvendo Rails no Windows"  loading="lazy" /></p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Então, sim, pelo menos a partir dessa versão que testei (instalada em 25 de julho), esse é um &ldquo;Bash on Ubuntu on Windows&rdquo; <strong>usável</strong> e desenvolvedores web de Ruby a Javascript a Crystal a Go podem começar a testar e tentar fazer do Windows 10 Anniversary sua plataforma primária pra desenvolvimento sério baseado em Linux.</p>
<p>Adicione Sublime Text ou Atom (ou Visual Studio, se for sua praia) e você está pronto. Espero que os próximos releases corrijam alguns dos bugs e problemas de performance, mas comparado ao que vimos em abril, é uma melhoria gigantesca.</p>
<p>Parabéns à Microsoft por isso!</p>
<p>E se você quer saber mais detalhes hardcore sobre como o Windows Subsystem for Linux é de fato implementado, eu recomendo essa série de posts no blog do próprio MSDN:</p>
<ul>
<li><a href="https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/"target="_blank" rel="noopener">Windows Subsystem for Linux Overview</a></li>
<li><a href="https://blogs.msdn.microsoft.com/wsl/2016/05/23/pico-process-overview/"target="_blank" rel="noopener">Pico Process Overview</a></li>
<li><a href="https://blogs.msdn.microsoft.com/wsl/2016/06/08/wsl-system-calls/"target="_blank" rel="noopener">WSL System Calls</a></li>
<li><a href="https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/"target="_blank" rel="noopener">WSL File System Support</a></li>
</ul>
]]></content:encoded><category>microsoft</category><category>linux</category><category>ferramentas-de-desenvolvimento</category><category>off-topic</category></item><item><title>O Ano do Linux no Desktop, pela Microsoft??</title><link>https://akitaonrails.github.io/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft/</link><guid isPermaLink="true">https://akitaonrails.github.io/2016/04/12/o-ano-do-linux-no-desktop-pela-microsoft/</guid><pubDate>Tue, 12 Apr 2016 18:33:00 -0300</pubDate><description>&lt;p&gt;Pois é, finalmente chegou. Escrevi sobre o anúncio no evento Build alguns dias atrás &lt;a href="http://www.akitaonrails.com/2016/03/31/off-topic-uma-nova-era-para-a-microsoft"target="_blank" rel="noopener"&gt;aqui&lt;/a&gt;. Agora a Microsoft provoca mais um pouco e &lt;a href="http://thehackernews.com/2016/04/how-to-run-ubuntu-on-windows-10.html"target="_blank" rel="noopener"&gt;liberou o primeiro Insider Build Preview&lt;/a&gt;. O rótulo é &amp;ldquo;Build 14316.rs1_release.160402-2217&amp;rdquo;; confira se é exatamente esse antes de seguir.&lt;/p&gt;
&lt;p&gt;Para conseguir baixar, você precisa atender aos seguintes requisitos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ter um Windows 10 64 bits ativado&lt;/li&gt;
&lt;li&gt;Inscrever-se no programa &lt;a href="https://insider.windows.com/"target="_blank" rel="noopener"&gt;Windows Insider&lt;/a&gt;. Se for sua primeira vez, pode levar até 24 horas para ativar&lt;/li&gt;
&lt;li&gt;Nas configurações do Windows Update, em Opções Avançadas, escolha &amp;ldquo;Get Started&amp;rdquo; na opção Insider e também escolha o anel &amp;ldquo;Fast&amp;rdquo;. Agora, ao buscar atualizações, o Preview 14316 deve aparecer. Se não aparecer, espere até a Microsoft atualizar sua conta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/538/windows_update_settings.jpg"target="_blank" rel="noopener"&gt;&lt;img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/538/big_windows_update_settings.jpg" alt="configurações do windows update" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;</description><content:encoded><![CDATA[<p>Pois é, finalmente chegou. Escrevi sobre o anúncio no evento Build alguns dias atrás <a href="http://www.akitaonrails.com/2016/03/31/off-topic-uma-nova-era-para-a-microsoft"target="_blank" rel="noopener">aqui</a>. Agora a Microsoft provoca mais um pouco e <a href="http://thehackernews.com/2016/04/how-to-run-ubuntu-on-windows-10.html"target="_blank" rel="noopener">liberou o primeiro Insider Build Preview</a>. O rótulo é &ldquo;Build 14316.rs1_release.160402-2217&rdquo;; confira se é exatamente esse antes de seguir.</p>
<p>Para conseguir baixar, você precisa atender aos seguintes requisitos:</p>
<ul>
<li>Ter um Windows 10 64 bits ativado</li>
<li>Inscrever-se no programa <a href="https://insider.windows.com/"target="_blank" rel="noopener">Windows Insider</a>. Se for sua primeira vez, pode levar até 24 horas para ativar</li>
<li>Nas configurações do Windows Update, em Opções Avançadas, escolha &ldquo;Get Started&rdquo; na opção Insider e também escolha o anel &ldquo;Fast&rdquo;. Agora, ao buscar atualizações, o Preview 14316 deve aparecer. Se não aparecer, espere até a Microsoft atualizar sua conta.</li>
</ul>
<p><a href="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/538/windows_update_settings.jpg"target="_blank" rel="noopener"><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/538/big_windows_update_settings.jpg" alt="configurações do windows update"  loading="lazy" /></a></p>
<p>Você precisa ter, no mínimo, 10GB de espaço livre na sua partição principal, então tenha isso em mente. Outra observação: se você é como eu e está testando no Virtualbox, lembre que para redimensionar um disco virtual é preciso deletar os snapshots, e o processo de merge pode demorar um tempo ridículo.</p>
<p>Depois de instalado, vá às opções de Desenvolvedor no Painel de Controle &ldquo;Update &amp; Security&rdquo; e mude seu perfil para &ldquo;Developer Mode&rdquo;. A feature &ldquo;Bash on Windows&rdquo; vai aparecer na lista de Windows Features. É voltada <strong>apenas para desenvolvedores</strong>, não deve ser usada em servidores de produção.</p>
<p>Com o Preview instalado, você deve conseguir abrir o velho cmd.exe (ou qualquer console melhor como o <a href="https://conemu.github.io/"target="_blank" rel="noopener">ConEmu</a>) e digitar &ldquo;bash&rdquo;. Ele vai pedir para instalar o userland do Ubuntu empacotado pela Canonical. Mais um tempinho. Aliás, o processo todo demora bastante, então reserve pelo menos meio dia. Não faça isso no trabalho :-)</p>
<p>Um problema que esbarrei logo de cara foi que a rede não estava funcionando direito. Alguém <a href="https://github.com/microsoft/WSL/issues/35"target="_blank" rel="noopener">identificou</a> que o DNS não estava sendo adicionado em <tt>/etc/resolv.conf</tt>, então é preciso adicionar manualmente. Basta colocar o DNS do Google (8.8.8.8 e 8.8.4.4) no arquivo resolv.conf e pronto.</p>
<p>Por fim, você cai dentro do bash como usuário root. Se você é um usuário Windows, saiba desde já que rodar como root é inseguro e uma péssima prática. Não faça isso.</p>
<p>A primeira coisa que você <strong>precisa</strong> fazer é criar manualmente um usuário Linux sem privilégios e adicioná-lo ao grupo sudo, como Andrew Malton <a href="https://web.archive.org/web/20160411063840/http://blog.greenarrow.me/elixir-with-ubuntu-for-windows/"target="_blank" rel="noopener">publicou</a> primeiro:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>useradd new_username -m -s /bin/bash 
passwd new_username
usermod -aG sudo new_username</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Aí você pode logar nesse shell de usuário com <tt>su - [seu usuário]</tt> sempre que quiser!</p>
<p>A partir daqui, podemos assumir que é um Ubuntu 14.04 comum e você deve conseguir seguir o <a href="http://www.akitaonrails.com/2015/01/28/ruby-e-rails-no-ubuntu-14-04-lts-trusty-tahr"target="_blank" rel="noopener">meu post bem antigo</a> sobre como configurar um ambiente Ubuntu para desenvolvedor, ou qualquer outro tutorial pelo Google. Os pacotes básicos de desenvolvimento que sempre instalo primeiro rodam normalmente:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo apt-get install curl build-essential openssl libcurl4-openssl-dev libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libgmp-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion redis-server libhiredis-dev memcached libmemcached-dev imagemagick libmagickwand-dev exuberant-ctags ncurses-term ack-grep git git-svn gitk ssh libssh-dev

sudo dpkg-divert --local --divert /usr/bin/ack --rename --add /usr/bin/ack-grep</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso te dá toda a toolchain essencial de compilação além de algumas ferramentas de linha de comando bem conhecidas como o ack (muito melhor que o grep). Também adiciona Redis e Memcached. Todos rodam.</p>
<p>Como boa prática, adicione o seguinte ao arquivo de configuração <tt>/etc/bash.bashrc</tt>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E depois disso, configure também o locale para UTF-8:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Só para esquentar um pouco, podemos começar com uma das coisas que eram impossíveis no Windows: ter uma instalação estável de Ruby. Para isso, dizem que o RVM não funciona (assim como o ZSH também não funciona devido a problemas de /dev/pts e symlinks neste preview, veja mais abaixo). Mas o RBENV funciona! Você precisa <a href="https://github.com/rbenv/rbenv"target="_blank" rel="noopener">instalá-lo</a> primeiro e depois o plugin <a href="https://github.com/rbenv/ruby-build#readme"target="_blank" rel="noopener">ruby-build</a>:</p>
<p><a href="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/536/installing_ruby.png"target="_blank" rel="noopener"><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/536/big_installing_ruby.png" alt="instalando ruby pelo rbenv"  loading="lazy" /></a></p>
<p>Curiosamente, demora bastante para terminar e durante o processo o uso de CPU vai às alturas. Instalar Go é ainda mais demorado! Algo continua instável por baixo dos panos, porque a CPU não deveria ficar a 100% por tanto tempo.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/537/big_resources.jpg" alt="CPU nas alturas"  loading="lazy" /></p>
<p>Se eu checar quanta memória tenho no sistema fica mais claro:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>root@localhost:/mnt/c/Users/fabio# free -h
             total       used       free     shared    buffers     cached
Mem:          1.0G       342M       664M         0B         0B         0B
-/&#43; buffers/cache:       342M       664M
Swap:           0B         0B         0B</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Não tenho certeza se esse valor de memória é meio &ldquo;hard-coded&rdquo;, já que muita gente está reportando os mesmos &ldquo;664M&rdquo; livres independente do que esteja rodando. Mas tem algo incompleto aqui. Swap também é zero e você não consegue adicionar nenhum, pelo que pude testar. Swapon, fallocate, nada disso funciona ainda.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>root@localhost:/mnt/c/Users/fabio# swapon -s
swapon: /proc/swaps: open failed: No such file or directory

root@localhost:/mnt/c/Users/fabio# fallocate -l 4G swapfile
fallocate: swapfile: fallocate failed: Invalid argument</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Cheguei a tentar <a href="https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04"target="_blank" rel="noopener">criar um swap file</a> usando <tt>dd</tt> em vez de <tt>fallocate</tt> e adicionar ao <tt>/etc/fstab</tt>, mas não funcionou:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>root@localhost:/mnt/c/Users/fabio# free -m
             total       used       free     shared    buffers     cached
Mem:          1006        342        664          0          0          0
-/&#43; buffers/cache:        342        664
Swap:            0          0          0

root@localhost:/mnt/c/Users/fabio# cat /etc/fstab
LABEL=cloudimg-rootfs   /        ext4   defaults        0 0
/swapfile       none    swap    sw      0 0</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Então parece mesmo que a memória está &ldquo;hard-coded&rdquo;. Acompanhe <a href="https://github.com/microsoft/WSL/issues/92"target="_blank" rel="noopener">esta issue #92</a> se quiser ver como vai evoluir.</p>
<p>Mas pior que isso, a memória compartilhada tem limites muito baixos e comportamento estranho. O Postgresql instala mas não sobe de jeito nenhum:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>root@localhost:/mnt/c/Users/fabio# pg_createcluster 9.3 main --start
Creating new cluster 9.3/main ...
  config /etc/postgresql/9.3/main
  data   /var/lib/postgresql/9.3/main
  locale en_US.UTF-8
FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=1, size=48, 03600).
HINT:  This error usually means that PostgreSQL&#39;s request for a shared memory segment exceeded your kernel&#39;s SHMMAX parameter, or possibly that it is less than your kernel&#39;s SHMMIN parameter.
        The PostgreSQL documentation contains more information about shared memory configuration.
child process exited with exit code 1
initdb: removing contents of data directory &#34;/var/lib/postgresql/9.3/main&#34;
Error: initdb failed</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E se tentamos expandir o limite SHMMAX, é isso que acontece:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>root@localhost:/mnt/c/Users/fabio# sysctl -w kernel.shmmax=134217728
sysctl: cannot stat /proc/sys/kernel/shmmax: No such file or directory

root@localhost:/mnt/c/Users/fabio# echo 134217728 &gt;/proc/sys/kernel/shmmax
bash: /proc/sys/kernel/shmmax: Operation not permitted</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Então, sem Postgresql por enquanto. Algumas pessoas que conseguiram completar a instalação do Go Lang (eu desisti depois de muito tempo esperando o apt-get terminar) reclamaram que o Go também quebrou nos requisitos de memória compartilhada. Acompanhe a <a href="https://github.com/microsoft/WSL/issues/32"target="_blank" rel="noopener">Issue #32</a> e a <a href="https://github.com/microsoft/WSL/issues/146"target="_blank" rel="noopener">Issue #146</a> para ver se alguém consegue fazer rodar.</p>
<p>Também tentei instalar o Node.js. Sem sorte com a instalação dos pacotes:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>curl -sL https://deb.nodesource.com/setup_5.x | sudo -E bash -
...
E: dpkg was interrupted, you must manually run &#39;sudo dpkg --configure -a&#39; to correct the problem.
Error executing command, exiting</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>O NVM instala, mais ou menos, com vários erros no git:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>...
error: unable to create file test/slow/nvm run/Running &#34;nvm run 0.x&#34; should work (No such file or directory)
error: unable to create file test/slow/nvm run/Running &#34;nvm run&#34; should pick up .nvmrc version (No such file or directory)
error: unable to create file test/slow/nvm use/Running &#34;nvm use iojs&#34; uses latest io.js version (No such file or directory)
error: unable to create file test/slow/nvm use/Running &#34;nvm use node&#34; uses latest stable node version (No such file or directory)
error: unable to create file test/slow/nvm use/Running &#34;nvm use v1.0.0&#34; uses iojs-v1.0.0 iojs version (No such file or directory)
error: unable to create file test/slow/nvm use/Running &#34;nvm use&#34; calls &#34;nvm_die_on_prefix&#34; (No such file or directory)</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E é isso que acontece se eu tento instalar a versão mais recente:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>akitaonrails@localhost:~/.nvm$ nvm install 5.10.1
Downloading https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz...
######################################################################## 100.0%
tar: bin/npm: Cannot create symlink to &#39;../lib/node_modules/npm/bin/npm-cli.js&#39;: Invalid argument
tar: Exiting with failure status due to previous errors
Binary download failed, trying source.
######################################################################## 100.0%
Checksums empty
tar: bin/npm: Cannot create symlink to &#39;../lib/node_modules/npm/bin/npm-cli.js&#39;: Invalid argument
tar: Exiting with failure status due to previous errors
Binary download failed, trying source.
Detected that you have 1 CPU thread(s)
Number of CPU thread(s) less or equal to 2 will have only one job a time for &#39;make&#39;
Installing node v1.0 and greater from source is not currently supported</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>A <a href="https://github.com/microsoft/WSL/issues/9"target="_blank" rel="noopener">Issue #9</a> aponta para a falta de suporte a symlinks.</p>
<p>Outra coisa muito chata é a falta de Pseudo-Terminais (/dev/pts), que é possivelmente uma das razões do ZSH não funcionar. Acompanhe a <a href="https://github.com/microsoft/WSL/issues/80"target="_blank" rel="noopener">Issue #80</a>.</p>
<p>Você também deve conseguir copiar suas chaves SSH privadas para &ldquo;.ssh&rdquo; e começar a clonar do Github ou dar git push para o Heroku rapidinho.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>akitaonrails@localhost:~$ ssh-keygen  -t rsa
Generating public/private rsa key pair.
Created directory &#39;/home/akitaonrails/.ssh&#39;.kitaonrails/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/akitaonrails/.ssh/id_rsa.
Your public key has been saved in /home/akitaonrails/.ssh/id_rsa.pub.
The key fingerprint is:
f8:16:b1:be:85:31:0c:71:f8:c2:d3:72:ab:48:42:9a akitaonrails@localhost
The key&#39;s randomart image is:
&#43;--[ RSA 2048]----&#43;
|      ...        |
|      .o         |
|     ..o.        |
|  .   =&#43;&#43;o       |
| &#43;    .=S.       |
|E . .  o.=       |
|   o . .= .      |
|    . .. o       |
|        .        |
&#43;-----------------&#43;</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Pelo menos o Elixir parece funcionar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>akitaonrails@localhost:~$ iex
Erlang/OTP 18 [erts-7.3] [source-d2a6d81] [64-bit] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.2.3) - press Ctrl&#43;C to exit (type h() ENTER for help)
iex(1)&gt; defmodule HelloWorld do; def say(name) do; IO.puts(&#34;Hello #{name}&#34;); end; end
iex:1: warning: redefining module HelloWorld
{:module, HelloWorld,
 &lt;&lt;70, 79, 82, 49, 0, 0, 5, 240, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 147, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...&gt;&gt;,
 {:say, 1}}
iex(2)&gt; HelloWorld.say(&#34;Fabio&#34;)
Hello Fabio
:ok</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Calma lá&hellip;</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>akitaonrails@localhost:~$ mix new ex_test
** (ErlangError) erlang error: :terminated
    (stdlib) :io.put_chars(#PID&lt;0.25.0&gt;, :unicode, [[[[[[[] | &#34;\e[32m&#34;], &#34;* creating &#34;] | &#34;\e[0m&#34;], &#34;.gitignore&#34;] | &#34;\e[0m&#34;], 10])
    (mix) lib/mix/generator.ex:26: Mix.Generator.create_file/3
    (mix) lib/mix/tasks/new.ex:76: Mix.Tasks.New.do_generate/4
    (elixir) lib/file.ex:1138: File.cd!/2
    (mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Você vai encontrar mais informações no pseudo-projeto que a Microsoft abriu no Github para acompanhar as <a href="https://github.com/microsoft/WSL/issues?q=is%3Aissue&#43;is%3Aclosed"target="_blank" rel="noopener">Issues</a> de testers como eu. Dá para acompanhar a lista de issues abertas e fechadas por lá. Você vai ver muita coisa que funciona, mas também muita outra que não vai funcionar até sair uma nova release que conserte tudo o que mencionei aqui.</p>
<h3>Conclusão<span class="hx:absolute hx:-mt-20" id="conclusão"></span>
    <a href="#conclus%c3%a3o" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Então, o &ldquo;Bash on Windows&rdquo; é um bom ambiente de desenvolvimento para usuários Linux terem sobre o Windows?</p>
<p>No Preview 14316, ainda não. A palavra-chave aqui é &ldquo;ainda&rdquo;. Está tomando forma de um jeito legal e, se conseguirem realmente corrigir todas as issues abertas até agora, vai ficar muito utilizável muito rápido.</p>
<p>Ainda faltam controles de memória decentes, suporte bem implementado de pseudo-terminal, limites configuráveis de memória compartilhada e symlinks funcionando. Falta também o upstart do Ubuntu, para que serviços como Redis ou Memcached (que instalei e rodam) subam sozinhos quando eu inicio o ambiente. Hoje eles não voltam sozinhos depois que reinicio a máquina.</p>
<p><a href="http://www.neowin.net/news/bash-plus-windows-10-equals-linux-gui-apps-on-the-windows-desktop"target="_blank" rel="noopener">Algumas pessoas</a> chegaram a conseguir enganar o X11 e rodar apps GUI como Firefox e até XFCE sobre esse ambiente, então é realmente promissor. Essa ideia funciona.</p>
<p>Uma vez que essas issues sejam resolvidas, sim, acredito que estamos mais perto do que nunca de finalmente usar Windows como um ambiente de desenvolvimento viável e completo. Vamos ver se até o Anniversary Release do Windows 10 em junho vamos ter uma instalação estável de Ubuntu.</p>
<p>Uma coisa que acho que fizeram muito errado foi amarrar o Linux Subsystem à instalação do Windows 10. Devia ter sido um instalador separado, para que o time pudesse liberar atualizações de build sem ter que empacotar tudo junto com o sistema operacional inteiro.</p>
<p>Se você estava pretendendo migrar para Windows para seus desenvolvimentos baseados em Linux, ainda não. Segure os cavalos um pouco mais.</p>
]]></content:encoded><category>microsoft</category><category>linux</category><category>ferramentas-de-desenvolvimento</category><category>off-topic</category></item><item><title>[Off-Topic] Uma Nova Era para a Microsoft</title><link>https://akitaonrails.github.io/2016/03/31/off-topic-uma-nova-era-para-a-microsoft/</link><guid isPermaLink="true">https://akitaonrails.github.io/2016/03/31/off-topic-uma-nova-era-para-a-microsoft/</guid><pubDate>Thu, 31 Mar 2016 16:10:00 -0300</pubDate><description>&lt;p&gt;Atualização 07/04: &lt;a href="http://thehackernews.com/2016/04/how-to-run-ubuntu-on-windows-10.html"target="_blank" rel="noopener"&gt;o preview já saiu&lt;/a&gt; antecipando o lançamento em Junho. Se você for membro do programa Insider, baixe e teste já. Deixe suas impressões nos comentários.&lt;/p&gt;
&lt;p&gt;Ontem foi um dia histórico para a Microsoft. Na minha visão pessoal, pode ter sido um divisor de águas. Desde ontem venho tentando pensar em como deixar isso registrado para a posteridade.&lt;/p&gt;
&lt;h3&gt;Prólogo - 1995 a 2005, 1a Década&lt;span class="hx:absolute hx:-mt-20" id="prólogo---1995-a-2005-1a-década"&gt;&lt;/span&gt;
&lt;a href="#pr%c3%b3logo---1995-a-2005-1a-d%c3%a9cada" class="subheading-anchor" aria-label="Permalink for this section"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Digo isso para nós, desenvolvedores de software. Já conhecemos alguns divisores assim na história: o lançamento do Turbo Pascal em 1983, o do Visual Basic em 1991, o do Java em 1995, as primeiras distros de Linux como o Slackware a partir de 1993, o lançamento do OS X em 2000 e a transição de PowerPC para Intel em 2005.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Atualização 07/04: <a href="http://thehackernews.com/2016/04/how-to-run-ubuntu-on-windows-10.html"target="_blank" rel="noopener">o preview já saiu</a> antecipando o lançamento em Junho. Se você for membro do programa Insider, baixe e teste já. Deixe suas impressões nos comentários.</p>
<p>Ontem foi um dia histórico para a Microsoft. Na minha visão pessoal, pode ter sido um divisor de águas. Desde ontem venho tentando pensar em como deixar isso registrado para a posteridade.</p>
<h3>Prólogo - 1995 a 2005, 1a Década<span class="hx:absolute hx:-mt-20" id="prólogo---1995-a-2005-1a-década"></span>
    <a href="#pr%c3%b3logo---1995-a-2005-1a-d%c3%a9cada" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Digo isso para nós, desenvolvedores de software. Já conhecemos alguns divisores assim na história: o lançamento do Turbo Pascal em 1983, o do Visual Basic em 1991, o do Java em 1995, as primeiras distros de Linux como o Slackware a partir de 1993, o lançamento do OS X em 2000 e a transição de PowerPC para Intel em 2005.</p>
<p>Os anos 80 e 90 foram conturbados, uma época de crescimento acelerado em que tudo ficava obsoleto muito rápido. Numa década, de 1989 até 1999, passei de Basic para dBase, Clipper, Fox Pro, Visual Basic, Delphi, Java, multimídia (Flash, Director/Shockwave) e Internet (HTML, Javascript, ASP, PHP, Perl). Nunca vi uma década andar tão rápido. Fui de um XT de 4 MHz para um Pentium III de quase 1 GHz nesses dez anos.</p>
<p>Chegamos ao fim do século no ápice da Bolha da Internet, tivemos o 11 de Setembro em 2001 e o crash. Mas a Internet chegou para ficar, e os dispositivos começaram a despontar com os Palms e iPods. Em 2001 a Microsoft lançou o Windows XP e passaria a década seguinte carregando esse legado nas costas.</p>
<p>Um ano antes, a pequena Apple iniciava seu levante com os novos iMac, iBook e iPod, além do OS X baseado em BSD UNIX. Um passo de cada vez, ela montava um sistema pensado tanto para consumidores quanto para desenvolvedores, a promessa da NeXT ganhando forma uma década depois de sua concepção.</p>
<p>Então, em 2005, a Apple forjaria aliança com uma das mais antigas parceiras da Microsoft, a Intel, e finalmente os Macs rodariam no mesmo processador que o Windows, dando um salto estratosférico em adoção. E isso abria mais uma porta: como o OS X foi feito agnóstico de processador, era questão de tempo até rodar em chips ARM, menores e mais eficientes. Foi o que aconteceu em 2007 com o lançamento do iPhone. O resto é história.</p>
<h3>2005 a 2015 - 2a Década<span class="hx:absolute hx:-mt-20" id="2005-a-2015---2a-década"></span>
    <a href="#2005-a-2015---2a-d%c3%a9cada" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Enquanto isso, a Microsoft ficou para trás. Fracassou na promessa do Windows Vista, entregou um Windows 7 competente e emendou no controverso Windows 8. Só com o Windows 10, anunciado no fim de 2014, é que as coisas começaram a mudar. E os efeitos da morte de Steve Jobs, no fim de 2011, ficavam mais aparentes: a Apple parou.</p>
<p>De 2011 até hoje, só tivemos novas versões. Nada significativo, nada novo. O último grande iPhone foi o 5, de 2012. O último grande felino do OS X foi o Mountain Lion, de 2011. Enquanto isso, o Google passou à frente no mundo mobile quando o KitKat saiu em 2013, para mim a primeira versão do Android em pé de igualdade com o iOS.</p>
<p>De 1999 até 2005, no geral, o desenvolvedor de software enterprise tinha duas opções: Java e .NET. O PHP tinha boa adoção, mas na maioria como customização de Wordpress e Magento, longe da mesma categoria de Java ou .NET; o resto era nicho. A partir de 2006 surgiu uma nova geração de desenvolvedores para a chamada Web 2.0, o mundo pós-Google, com SEO, UX, iterações rápidas e Agilidade com &ldquo;A&rdquo; maiúsculo. Foi ali que Ruby, Python e depois Node aceleraram exponencialmente.</p>
<p>A partir de 2010, o mundo mobile acelerou, e em particular um tipo de desenvolvimento integrado: baseado em &ldquo;Cloud&rdquo;, em que uma &ldquo;app&rdquo; nativa fala com serviços em servidores remotos, sobretudo da Amazon AWS, que havia estreado não fazia muito tempo, em 2006.</p>
<p>A Microsoft ficou de fora desse movimento e gastou os dez anos seguintes correndo atrás, na ressaca do Vista. Manteve a liderança em mercados puramente enterprise, com licenças de SQL Server e Office, mas à margem do &ldquo;cutting-edge&rdquo; do desenvolvimento de software.</p>
<p>Na verdade, eu diria que o divisor de águas veio em 2013, com a <a href="http://web.archive.org/web/20160404073120/http://olhardigital.uol.com.br/pro/noticia/mercado-reage-bem-a-saida-de-ballmer-da-microsoft/36992"target="_blank" rel="noopener">saída de Ballmer</a> e o fim da &ldquo;Era Estendida de Gates&rdquo;, abrindo espaço para a <a href="http://www.businessinsider.com/microsoft-year-in-review-2015-12"target="_blank" rel="noopener">entrada de Satya Nadella</a>. A Microsoft é uma entidade gigante, muitos cérebros já pesquisavam isso fazia anos, e boa parte só apareceu agora. Mas falo em &ldquo;Eras&rdquo; num sentido simbólico: o fim da cultura Highlander da Microsoft, o &ldquo;there can only be one&rdquo;.</p>
<p>A <a href="http://1995blog.com/2015/05/24/the-internet-tidal-wave-20-years-on/"target="_blank" rel="noopener">profecia de 1995</a>, de que a Internet destruiria a hegemonia do Windows, se cumpriu. E chegamos ao mundo pós-Moore, em que a computação ficou acessível e ubíqua. Pense nisso: em 1995, ter um cluster de &ldquo;super&rdquo; computadores para computação distribuída de alto processamento era coisa de universidade ou grande corporação. Hoje, você cria um cluster de quantas dúzias de máquinas quiser no EC2 por um mês pelo preço de um videogame.</p>
<p>Fui usuário de DOS desde 1988, mudei para o Windows 95 assim que saiu e passei quase dez anos desenvolvendo primariamente em Windows, em ambiente corporativo. Fui de Visual Basic para ASP e para .NET ao mesmo tempo que mexia com Java e PHP. Mas eu queria poder usar Perl, PHP, Python e Ruby nativos de Linux, sem abrir mão de Office e Photoshop.</p>
<p>A resposta que já esperávamos era o OS X. Com o lançamento do Tiger, a coisa ficou séria. Eu mesmo experimentei com um Mac Mini G4 em 2004. Era excepcional ter uma usabilidade muito melhor que a do Windows XP e acesso a tudo de UNIX numa única máquina.</p>
<p>Quando a Intel lançou o Core Duo e depois o Core 2 Duo de 64 bits, e o Tiger passou a rodar em Intel em 2005, não havia o que pensar: era hora de migrar. Passaria a década seguinte num ambiente puramente OS X, desenvolvendo em outro tipo de plataforma, com outras ferramentas e outra cultura. Foi toda a minha história com Ruby e OS X nesses dez anos, que vocês conhecem bem se acompanham o blog.</p>
<h3>2015 em diante, Epílogo<span class="hx:absolute hx:-mt-20" id="2015-em-diante-epílogo"></span>
    <a href="#2015-em-diante-ep%c3%adlogo" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>2015 chegou, quatro anos depois da morte de Steve Jobs. Foi um intervalo importante, porque deu tempo para as plataformas não-Mac se equipararem e superarem o OS X em muitas áreas. Estamos definitivamente na Era do Software como Serviço. Não &ldquo;compramos&rdquo; mais nada, &ldquo;assinamos&rdquo; serviços.</p>
<p>Passamos da Era Pós-PC. Passamos da Era do Smartphone. Estamos na Era dos Serviços, em que tudo é um serviço. Nossa identidade é um perfil do Facebook, nossa voz é o Zap Zap, e tudo o que fazemos gera dados. Estamos na Era do Big Data, um monte de dados inúteis que nenhum SQL Server do mundo dá conta de manter.</p>
<p>Precisamos de coisas novas para lidar com esse paradigma: Cassandra, Riak, Hadoop, HBase, Spark, Elasticsearch, Go, Rust, Elixir. Todos eles &ldquo;rodam&rdquo; em Windows, mas alguém precisa gastar tempo fazendo ports, criando patches de compatibilidade e empacotando instaladores. E o principal: a maioria dos desenvolvedores dessas tecnologias está em Linux ou em OS X, quase ninguém desenvolve essa nova geração de ferramentas dentro do Windows. Todos usam Emacs, Vim ou Sublime Text, quase ninguém quer o Visual Studio.</p>
<p>E isso volta ao começo do post: é uma nova Era para a Microsoft. Ela passou os últimos dez anos correndo atrás e, pela primeira vez, parece ter chances reais de dar a volta por cima e voltar a ser relevante para o desenvolvedor não-.NET.</p>
<p>Para isso, duas coisas aconteceram ontem.</p>
<h3>2016 - O Ano do Linux no Desktop<span class="hx:absolute hx:-mt-20" id="2016---o-ano-do-linux-no-desktop"></span>
    <a href="#2016---o-ano-do-linux-no-desktop" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Primeiro, o anúncio de que o <a href="http://thehackernews.com/2016/03/ubuntu-on-windows-10.html"target="_blank" rel="noopener">&ldquo;Bash está chegando ao Windows&rdquo;</a>. Que na prática é muito mais do que o Bash: é uma parceria com a Canonical, que já vinha se desenhando desde o anúncio do <a href="http://web.archive.org/web/20160415160138/http://www.microsoft.com/en/server-cloud/sql-server-on-linux.aspx"target="_blank" rel="noopener">SQL Server rodando em Linux</a>. Na prática, é um <a href="http://blog.dustinkirkland.com/2016/03/ubuntu-on-windows.html"target="_blank" rel="noopener">subsistema Linux</a> rodando em paralelo à kernel do Windows, traduzindo chamadas de sistema Linux para Windows.</p>
<p>A ideia original veio do falecido Projeto Astoria, ou Windows Bridge for Android, que na época queria permitir apps Android rodando em Windows. Tecnicamente o Android é um tipo de Linux, então o salto para ontem foi curto.</p>
<p>Assim, será possível pegar um binário feito para Ubuntu e rodá-lo no Windows sem modificar nada.</p>
<p>Desde que começamos a desenvolver com Ruby, muita gente que usa Windows queria rodar Ruby nativamente. Existe uma <a href="http://rubyinstaller.org/"target="_blank" rel="noopener">distribuição</a>, mas não é boa, e a culpa não é dos mantenedores. O Ruby, assim como Python e PHP, foi feito para funcionar em Linux.</p>
<p>Para portar para Windows é preciso fazer &ldquo;wrappers&rdquo;, e ainda falta um ambiente com compiladores como o GCC para compilar pacotes de extensões. Tudo isso é trivial no Linux e uma dor de cabeça no Windows. Não valia o trabalho, então a única saída era rodar uma máquina virtual (como o VirtualBox) com algo como o Vagrant para facilitar e usar o Ruby de Linux de verdade.</p>
<p>Tudo de Linux que &ldquo;funciona&rdquo; em Windows, seja Python ou PHP, nunca funcionou 100%, e a gente simplesmente se acostumou com isso.</p>
<p>O que a Microsoft vai lançar no Anniversary Update é uma camada muito fina de tradução no nível mais baixo, e não uma máquina virtual ou um hypervisor: de uma kernel Linux &ldquo;virtual&rdquo; para a kernel do Windows. Tudo vai pensar que está rodando em Linux. É o que o projeto Wine tenta fazer para rodar aplicações Windows no Linux, só que ao contrário. Também é diferente do Cygwin, que exige recompilar tudo do Linux para ter um ambiente semi-Linux sobre o Windows.</p>
<p>Provavelmente não haverá ambiente gráfico secundário num primeiro momento, então nada de X, nada de GNOME ou KDE. E nem precisa: estamos num mundo Web, nosso ambiente gráfico agora é HTML e Javascript, e Chrome e Firefox já existem nativos no Windows. Para coisas como compilar gems com extensões nativas, até o GCC vai funcionar. É exatamente o mesmo binário, no mesmo ambiente, com tudo a que estamos acostumados no UNIX. Ter Bash e SSH no Windows é só a ponta do iceberg.</p>
<p>O segundo anúncio é o <a href="http://techcrunch.com/2016/03/31/thanks-to-microsoft-small-teams-can-now-get-xamarins-ide-and-core-tools-for-free"target="_blank" rel="noopener">lançamento das ferramentas Xamarin de graça e como open source</a>! A Microsoft adquiriu a Xamarin, de Miguel de Icaza, há pouco tempo. Eles desenvolveram o .NET open source por pura engenharia reversa, reimplementando tudo em código aberto, e agora a Microsoft fez a coisa inteligente: além de comprá-los, abriu as ferramentas. A última coisa que ainda prendia um desenvolvedor no Mac era precisar do Xcode, que já vem no OS X, para desenvolver para iOS. Agora dá para fazer isso no Windows de graça.</p>
<p>Portanto, a conta ficou bem mais simples. O Windows 10 é a primeira versão respeitável de Windows desde o breve intervalo do 7. Vamos esquecer que o 8 existiu, do mesmo jeito que já esquecemos do Vista. O XP finalmente morreu, levou mais de uma década, junto com os horrorosos Internet Explorer 6, 7 e 8. O Google nos fez o favor de tornar o Chrome ubíquo, e serviços como o Facebook forçaram os usuários a migrar mais rápido.</p>
<p>Com o <a href="http://arstechnica.com/information-technology/2016/03/windows-10-270-million-users-binbash-supporting-anniversary-update-coming-summer/"target="_blank" rel="noopener">Windows 10 Anniversary Update</a>, provavelmente vamos poder fazer:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>apt-get install build-essential
\curl -sSL https://get.rvm.io | bash
rvm install 2.3.0
bundle install</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>E tudo deve funcionar.</p>
<p>No mesmo ambiente, ainda vamos poder usar o Xamarin Studio e, com um pouco de esforço para relembrar os músculos de C#, criar apps iOS e Android. Vamos poder usar o Office 365 nativo, todas as ferramentas mais recentes do Adobe CS6 e até jogar The Division, tudo na mesma máquina.</p>
<p>De uma só vez, o Windows 10 vira a escolha com o melhor custo-benefício: comodidade de uso, opções de desenvolvimento e hardware competente na forma de Surface Book, Lenovo Yoga 3 e Razer Blade Stealth, que finalmente alcançaram e passaram o lendário acabamento dos MacBook.</p>
<p>2016 é finalmente o famigerado Ano do Linux no Desktop, só que não do jeito que o pessoal de Free Software gostaria. Não dá para ter tudo.</p>
]]></content:encoded><category>microsoft</category><category>ferramentas-de-desenvolvimento</category><category>mercado-de-tecnologia</category><category>off-topic</category></item><item><title>IIS 8 finalmente ganha um módulo de Proxy-Reverso! E como executar Rails sobre JRuby no Windows!</title><link>https://akitaonrails.github.io/2015/02/16/iis-8-finalmente-ganha-um-modulo-de-proxy-reverso-e-como-executar-rails-sobre-jruby-no-windows/</link><guid isPermaLink="true">https://akitaonrails.github.io/2015/02/16/iis-8-finalmente-ganha-um-modulo-de-proxy-reverso-e-como-executar-rails-sobre-jruby-no-windows/</guid><pubDate>Mon, 16 Feb 2015 12:29:00 -0200</pubDate><description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: se está familiarizado com os problemas de executar Rails no Windows e já sabe o que é o HttpPlatformHandler, porque devemos usar JRuby no Windows, pule direto pra seção &lt;a href="#configuracao"&gt;Configurando Rails da forma Correta para Windows&lt;/a&gt; mais pra abaixo.&lt;/p&gt;
&lt;p&gt;No dia 4/2 a Microsoft &lt;a href="http://azure.microsoft.com/blog/2015/02/04/announcing-the-release-of-the-httpplatformhandler-module-for-iis-8/"target="_blank" rel="noopener"&gt;anunciou o módulo HttpPlatformHandler&lt;/a&gt;. Então, em 9/2, o conhecido blogueiro &lt;a href="http://www.hanselman.com/blog/AnnouncingRunningRubyOnRailsOnIIS8OrAnythingElseReallyWithTheNewHttpPlatformHandler.aspx"target="_blank" rel="noopener"&gt;Scott Hanselman fez um blog post&lt;/a&gt; explicando como poderíamos usar esse módulo para servir uma aplicação Rails atrás do IIS 8. Depois de um comentário que fiz ele atualizou para demonstrar como servir uma aplicação Rails em cima do JRuby.&lt;/p&gt;</description><content:encoded><![CDATA[<p><strong>TL;DR</strong>: se está familiarizado com os problemas de executar Rails no Windows e já sabe o que é o HttpPlatformHandler, porque devemos usar JRuby no Windows, pule direto pra seção <a href="#configuracao">Configurando Rails da forma Correta para Windows</a> mais pra abaixo.</p>
<p>No dia 4/2 a Microsoft <a href="http://azure.microsoft.com/blog/2015/02/04/announcing-the-release-of-the-httpplatformhandler-module-for-iis-8/"target="_blank" rel="noopener">anunciou o módulo HttpPlatformHandler</a>. Então, em 9/2, o conhecido blogueiro <a href="http://www.hanselman.com/blog/AnnouncingRunningRubyOnRailsOnIIS8OrAnythingElseReallyWithTheNewHttpPlatformHandler.aspx"target="_blank" rel="noopener">Scott Hanselman fez um blog post</a> explicando como poderíamos usar esse módulo para servir uma aplicação Rails atrás do IIS 8. Depois de um comentário que fiz ele atualizou para demonstrar como servir uma aplicação Rails em cima do JRuby.</p>
<p>O HttpPlatformHandler é um módulo que há anos estava faltando no IIS, e não entendo a razão  de porque tanta demora. Todo servidor HTTP tinha um módulo desses por padrão (Apache, NGINX, etc), menos o IIS. E esse módulo é importante para poder repassar uma requisição HTTP do IIS para uma aplicação web que responde HTTP atrás dele (basicamente qualquer coisa que não é PHP, de Python/WSGI a Java). Antes disso era necessário usar um módulo desenvolvido por terceiros ou uma combinação de <a href="http://www.gitshah.com/2013/06/how-to-use-iis7-as-front-end-to-java.html"target="_blank" rel="noopener">ARR (Application Request Routing, que é um balanceador de carga) e URL Rewrite</a>, que é tudo menos algo &ldquo;plug-and-play&rdquo;.</p>
<p>Minha &ldquo;teoria da conspiração&rdquo; é que a Microsoft obviamente gostaria que o IIS fosse o único servidor de aplicação e qualquer coisa dinâmica deveria rodar dentro do controle de seus Application Pools, o que era verdade para ASP antigo e .NET. O resto ficaria relegado ao antigo (obsoleto) esquema de sub-processo por requisição de CGI/FastCGI (que é extremamente ineficiente).</p>
<p>Na verdade não precisamos do IIS se quisermos rodar uma aplicação Rails, Java ou qualquer outro no Windows: basta desabilitar o IIS (para não ocupar a porta 80) e fazer o JRuby on Rails/Puma ou Java/JBoss/Tomcat/etc subir na porta 80 e pronto. Por outro lado poderíamos querer executar uma aplicação ASP.NET MVC e outra em Java/JSF na mesma máquina, e aí começa a ficar mais complicado.</p>
<p>Um módulo de proxy-reverso é a solução nesses cenários: agora é possível executar aplicações em quaisquer linguagens na mesma máquina, todas coordenadas com o IIS 8, repassando a requisição quando ele mesmo não tiver como responder. Com a proposta do Azure de querer ser uma plataforma para muitas linguagens e projetos open source, esse componente era muito necessário para colocá-lo em pé de igualdade com NGINX e outros servidores web.</p>
<h2>Por que Rails (ou qualquer coisa diferente de .NET) no Windows?<span class="hx:absolute hx:-mt-20" id="por-que-rails-ou-qualquer-coisa-diferente-de-net-no-windows"></span>
    <a href="#por-que-rails-ou-qualquer-coisa-diferente-de-net-no-windows" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Na realidade é a mesma resposta de &ldquo;por que Java/Python/PHP/etc&rdquo; no Windows. Na prática, eu diria que se você precisar muito se manter na plataforma Windows - e existem dezenas de razões legítimas pra isso - mantenha-se na stack do .NET, use ASP.NET MVC (ou o vNext que é o próximo). Faça web services com WCF, faça aplicações desktop com WPF. Muitas soluções corporativas precisam integrar diversos componentes como BizTalk, Exchange, Sharepoint, conectar exclusivamente com endpoints SOAP ou COM+ e nesses casos o melhor é ficar no nativo.</p>
<p>Usar algo diferente de .NET significa não somente mudar de linguagem, mas mudar de sistema operacional e toda uma forma de trabalhar e desenvolver que são completamente diferentes. Linguagens de script como PHP, Ruby, Python, Perl dependem bastante do sistema operacional por baixo. Algumas se esforçaram para oferecer mais suporte no Windows, mas eles nunca vão se comportar 100% da mesma forma em dois sistemas operacionais diferentes.</p>
<p>O <a href="https://technet.microsoft.com/en-us/library/bb496993.aspx"target="_blank" rel="noopener">próprio Technet da Microsoft</a> tem vários artigos detalhando as diferenças (tanto técnicas quanto filosóficas) e se procurar no Google vai achar centenas de artigos (muitos meramente pedantes e trolls, evite-os) detalhando mais sobre essas diferenças, principalmente nos aspectos de <a href="http://www.kernelthread.com/publications/security/uw.html"target="_blank" rel="noopener">segurança</a>.</p>
<p>Extensões nativas precisam ser escritas levando em consideração APIs, chamadas de baixo nível de sistema muito diferentes. Windows e Linux/Unix são animais diferentes, gerenciam memória de formas diferentes, lidam com I/O (sistema de arquivos, rede) de formas diferentes. Daí é necessário programar uma &ldquo;camada intermediária&rdquo; que tenta abstrair as duas coisas. PHP é de longe o que tem mais &ldquo;wrappers&rdquo; prontos para ambos os sistemas, Python vem na sequência. Ruby não tem histórico de uso no Windows por isso tem menos wrappers.</p>
<p>Existem várias ferramentas do mundo Linux que um desenvolvedor no Windows não está acostumado a usar. Coisas que vão desde coisas simples como um simples wget ou curl até coisas mais complexas como GDB ou DTrace. Por isso mesmo não é simples para um programador Windows migrar para qualquer outra plataforma diferente de .NET.</p>
<p>Mesmo assim, pode ser muito útil saber o básico de algumas linguagens pois daí é possível tirar vantagens de instalar um Wordpress (PHP), ou um Plone (Python) e até mesmo no caso de Rails usar aplicações excelentes como Redmine, Discourse, Spree, FatFreeCRM, e várias outras aplicações de código aberto, sem precisa duplicar esforços e refazê-los em .NET. Ou então usar as excelentes ferramentas que temos para criar CRUDs rápidos usando Rails + Devise + ActiveAdmin por exemplo. Existem várias razões para tirar proveito das excelentes ferramentas do ecossistema Rails que não existem no mundo ASP.NET MVC.</p>
<p>Por essas razões, o Ruby no Windows nunca será tão bom quanto o Ruby no Linux/OS X, nem mesmo PHP ou Perl será tão bom no Windows quanto é no Linux, no mesmo hardware. Um exemplo prático mais notável: <a href="http://stackoverflow.com/questions/21732566/linux-fork-function-compared-to-windows-createprocess-what-gets-copied"target="_blank" rel="noopener">Windows não tem o conceito e nem a implementação de fork()</a>, algo essencial para nossos servidores de aplicação Ruby como Unicorn, Puma, Thin, etc. Por isso mesmo, rodar Rails usando o servidor padrão, Webrick, não é aceitável em produção. Ele vai ter um único processo e responder a apenas uma requisição de cada vez, sem possibilidade de responder conexões simultâneas.</p>
<p>Isso dito, no caso específico de Ruby, existe uma ótima solução e é <a href="http://jruby.org"target="_blank" rel="noopener">JRuby</a>, que permite executar código Ruby dentro da máquina virtual Java. Em resumo, uma aplicação inteira feita em Ruby on Rails, com pequenas modificações (por exemplo, instalando o driver JDBC pra acessar banco de dados), pode ser executado no ambiente Java, com todas as vantagens que ele oferece como melhor performance e capacidade para multithreading real.</p>
<p>O motivo disso é que Java roda sobre a Java Virtual Machine (JVM) que, como o próprio nome diz, é literalmente uma máquina virtual (de um jeito tosco, pense nele como um VirtualBox, com outro sistema operacional rodando virtualmente). A JVM abstrai completamente o sistema operacional por baixo e é como se fosse um micro-sistema operacional próprio. De fato, já houve a tentativa de se fazer um <a href="http://en.wikipedia.org/wiki/JavaOS"target="_blank" rel="noopener">Java OS</a> inteiro que não necessitaria de um outro sistema como Linux ou Windows pra executar.</p>
<p>Feito isso, podemos colocar uma aplicação Rails, com boa performance, com boa concorrência, integrado com banco de dados como SQL Server ou Oracle, atrás do IIS, rodando lado a lado com aplicações feitas em .NET.</p>
<p><a name="configuracao"></a></p>
<h2>Configurando Rails da forma Correta para Windows<span class="hx:absolute hx:-mt-20" id="configurando-rails-da-forma-correta-para-windows"></span>
    <a href="#configurando-rails-da-forma-correta-para-windows" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A partir daqui vou assumir que você é um desenvolvedor familiarizado com o ambiente Windows e sabe como usar <a href="http://www.microsoft.com/web/downloads/platform.aspx"target="_blank" rel="noopener">Web Platform Installer</a>, onde procurar instaladores, não estranha em usar o Command Prompt e sabe como instalar os seguinte componentes básicos:</p>
<ul>
<li>IIS 8</li>
<li>SQL Server 2008 R2</li>
<li>Java 1.8</li>
</ul>
<p>E antes de realmente começar precisamos configurar algumas coisas.</p>
<p>No caso de Java, também precisamos antes instalar o <a href="http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html"target="_blank" rel="noopener">Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy</a> que é um tosco arquivo zip cujos arquivos precisam ser manualmente copiados no diretório de policies do JRE:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/481/Screen_Shot_2015-02-13_at_14.13.41.png" alt="JCE"  loading="lazy" /></p>
<p>Depois disso precisamos fazer o SQL Server se ligar à porta TCP 1433. Para isso instale e abra o SQL Server Configuration Manager, habilite o TCP/IP e na tela de propriedades apague o que estiver em &ldquo;TCP Dynamic Ports&rdquo; e coloque &ldquo;1433&rdquo; em TCP Port. Precisa fazer isso em todos os campos.</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/482/Screen_Shot_2015-02-13_at_14.18.37.png" alt="SQL Server Configuration Manager"  loading="lazy" /></p>
<p>Agora, baixe <a href="https://github.com/akitaonrails/jruby_windows_demo"target="_blank" rel="noopener">meu código do Github</a> em alguma pasta. Se não for diretamente dentro do C:\inetpub\wwwroot precisa adicionar o usuário IIS_IUSRS para ter acesso a todos os subdiretórios:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/483/Screen_Shot_2015-02-13_at_14.16.34.png" alt="Permissões"  loading="lazy" /></p>
<p>A partir de um Command Prompt, entre no diretório do projeto e execute:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>jruby -S bundle install</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Isso deve instalar todas as dependências que estão listadas no arquivo <tt>Gemfile</tt> cujas partes mais importantes são:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># Bundle edge Rails instead: gem &#39;rails&#39;, github: &#39;rails/rails&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;rails&#39;</span><span class="p">,</span> <span class="s1">&#39;4.1.9&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Use jdbcsqlite3 as the database for Active Record</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;jdbc-mssql-azure&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;activerecord-jdbc-adapter&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;activerecord-jdbcmssql-adapter&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ...</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;puma&#39;</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;jruby-openssl&#39;</span><span class="p">,</span> <span class="nb">require</span><span class="p">:</span> <span class="kp">false</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ...</span>
</span></span><span class="line"><span class="cl"><span class="n">gem</span> <span class="s1">&#39;tzinfo-data&#39;</span><span class="p">,</span> <span class="ss">platforms</span><span class="p">:</span> <span class="o">[</span><span class="ss">:mingw</span><span class="p">,</span> <span class="ss">:mswin</span><span class="p">,</span> <span class="ss">:x64_mingw</span><span class="p">,</span> <span class="ss">:jruby</span><span class="o">]</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>As partes importantes:</p>
<ul>
<li>Use Rails 4.1 e não 4.2 pois muitas gems ainda não estão totalmente compatíveis até o momento deste post.</li>
<li>Use <a href="https://github.com/MikeEmery/jdbc-mssql-azure"target="_blank" rel="noopener">drivers JDBC</a> pois estaremos rodando dentro da JVM, e para isso funcionar é necessário um <a href="https://github.com/jruby/activerecord-jdbc-adapter/tree/master/activerecord-jdbcmssql-adapter"target="_blank" rel="noopener">adapter de activerecord</a>.</li>
<li>Vamos usar <a href="https://github.com/puma/puma"target="_blank" rel="noopener">Puma</a> como servidor Web em vez do padrão Webrick, que é muito melhor por suportar multi-thread na JVM.</li>
<li>Precisamos adicionar o pacote <a href="https://github.com/jruby/jruby-openssl"target="_blank" rel="noopener">jruby-openssl</a> pois o Windows não tem suporte nativo a OpenSSL e também o <a href="https://github.com/tzinfo/tzinfo-data"target="_blank" rel="noopener">tzinfo-data</a> pois o Windows também não tem dados de time zones facilmente acessíveis (lembram quando falei das várias coisas diferentes entre sistemas operacionais, estes são exemplos de pacotes pra cobrir buracos desse tipo).</li>
</ul>
<p>Finalmente, configure uma nova aplicação no IIS dentro do Default Web Site, numa sub-pasta chamada &ldquo;rails&rdquo;:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/484/Screen_Shot_2015-02-13_at_14.16.13.png" alt="IIS"  loading="lazy" /></p>
<p>Uma aplicação Rails, por padrão, não é feito para funcionar numa sub-pasta, mas este trecho no arquivo <tt>config.ru</tt> garante que isso vai funcionar:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">relative_url_root</span> <span class="o">=</span> <span class="s1">&#39;/rails&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">map</span> <span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">config</span><span class="o">.</span><span class="n">relative_url_root</span> <span class="o">||</span> <span class="s2">&#34;/&#34;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="n">run</span> <span class="no">Rails</span><span class="o">.</span><span class="n">application</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Você vai precisar criar um banco de dados chamado &ldquo;jruby_demo&rdquo; ou outro nome que você pode configurar no arquivo <tt>config/database.yml</tt>. Note que você precisa modificar também o usuário e senha nesse arquivo para conseguir se conectar ao seu banco. Nesse caso significa que precisa usar <a href="https://msdn.microsoft.com/en-us/library/ms144284.aspx"target="_blank" rel="noopener">SQL Server Authentication</a> e não o padrão Windows Authentication.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="cp">&amp;default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">adapter</span><span class="p">:</span><span class="w"> </span><span class="l">jdbcmssql</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">com.microsoft.sqlserver.jdbc.SQLServerDriver</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;jdbc:sqlserver://localhost;databaseName=jruby_demo&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l">sa</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">password</span><span class="p">:</span><span class="w"> </span><span class="l">abcd1234</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Se estiver configurado corretamente, agora podemos usar o processo de migrations do ActiveRecord para criar tabelas e subir dados de exemplo, executando o seguinte na linha de comando:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><pre><code>jruby -S rake db:migrate db:seed</code></pre></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Para o IIS 8 conseguir carregar corretamente o JRuby, você precisa configurar o arquivo <tt>Web.config</tt>:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-XML" data-lang="XML"><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;configuration&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;system.webServer&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;handlers&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;add</span> <span class="na">name=</span><span class="s">&#34;httpplatformhandler&#34;</span> <span class="na">path=</span><span class="s">&#34;*&#34;</span> <span class="na">verb=</span><span class="s">&#34;*&#34;</span> <span class="na">modules=</span><span class="s">&#34;httpPlatformHandler&#34;</span> <span class="na">resourceType=</span><span class="s">&#34;Unspecified&#34;</span> <span class="na">requireAccess=</span><span class="s">&#34;Script&#34;</span> <span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/handlers&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;httpPlatform</span> <span class="na">stdoutLogEnabled=</span><span class="s">&#34;true&#34;</span> <span class="na">stdoutLogFile=</span><span class="s">&#34;rails.log&#34;</span> <span class="na">startupTimeLimit=</span><span class="s">&#34;60&#34;</span> <span class="na">startupRetryCount=</span><span class="s">&#34;5&#34;</span> <span class="na">processPath=</span><span class="s">&#34;c:\jruby-1.7.19\bin\jruby.exe&#34;</span>
</span></span><span class="line"><span class="cl">                  <span class="na">arguments=</span><span class="s">&#34;-S puma --env production --dir C:\Users\Fabio\Projects\jruby_demo2 -p %HTTP_PLATFORM_PORT%&#34;</span><span class="nt">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;environmentVariables&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;environmentVariable</span> <span class="na">name=</span><span class="s">&#34;JAVA_HOME&#34;</span> <span class="na">value=</span><span class="s">&#34;C:\Program Files\Java\jre1.8.0_31&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="nt">&lt;environmentVariable</span> <span class="na">name=</span><span class="s">&#34;SECRET_KEY_BASE&#34;</span> <span class="na">value=</span><span class="s">&#34;4a8f4bb5de3637e9fab1f3c8fb6e3a787f60a811d6b36ff8d77a3371a31d19f7a93cfb48597d8263f46748c729b291a0277e6e819a869c4f8edf9445595e5548&#34;</span><span class="nt">/&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="nt">&lt;/environmentVariables&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="nt">&lt;/httpPlatform&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;/system.webServer&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/configuration&gt;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Preste atenção aos diretórios no arquivo para refletirem onde estão essas coisas na sua máquina, sem isso estar correto, nada vai carregar.</p>
<p>Feito isso, você já deve conseguir carregar a URL &ldquo;http://localhost/rails&rdquo; num navegador. Como é JRuby a primeira requisição vai demorar alguns segundos pra carregar (até a JVM terminar de carregar). Mas depois disso vai ficar tudo rápido.</p>
<p>Uma coisa diferente entre o HttpPlatformHandler e um módulo normal de proxy-reverso é que além de fazer o papel de proxy reverso ele também controla o ciclo de vida da aplicação por trás, no caso o JRuby + Puma. E também controla em que porta a aplicação vai ficar escutando (pela variável de ambiente &ldquo;HTTP_PLATFORM_PORT&rdquo;).</p>
<p>Sobre aplicações Rails, não se esqueça que todos tem um &ldquo;SECRET_KEY_BASE&rdquo; diferente. Sempre gere um novo através da linha de comando <tt>jruby -S rake secret</tt>.</p>
<p>Se tudo foi feito corretamente, você deveria conseguir ver o seguinte no navegador:</p>
<p><img src="https://akitaonrails.s3.amazonaws.com/assets/image_asset/image/485/Screen_Shot_2015-02-13_at_14.12.18.png" alt="JRuby Demo"  loading="lazy" /></p>
<p>A partir daqui você pode evoluir a aplicação, criar mais models, mais controller, adicionar frameworks CSS como Bourbon (pois o Asset Pipeline vai funcionar corretamente usando o <a href="https://github.com/mozilla/rhino"target="_blank" rel="noopener">Rhino</a> como runtime Javascript no lugar do V8).</p>
]]></content:encoded><category>rails</category><category>java</category><category>microsoft</category></item><item><title>[Off-Topic] Desmistificando a Microsoft do "Mal"</title><link>https://akitaonrails.github.io/2011/02/20/off-topic-desmistificando-a-microsoft-do-mal/</link><guid isPermaLink="true">https://akitaonrails.github.io/2011/02/20/off-topic-desmistificando-a-microsoft-do-mal/</guid><pubDate>Sun, 20 Feb 2011 17:53:00 -0300</pubDate><description>&lt;p&gt;&lt;img src="http://s3.amazonaws.com/akitaonrails/assets/2011/2/20/ballmerasdrevil_original.jpg?1298235025" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Talvez quem tenha entrado no mercado de tecnologia nesta década não acompanhou a história da década de 90 que culminou com o caso antitruste contra a Microsoft. O “medo” da Microsoft “monopolista” foi substituído por um desdém e ridicularização. Eu sei, eu mesmo uso essa figura de vez em quando, é quase que uma piada universal onde a Microsoft é o mal eterno e todo o resto, as Canonicals, as Apples, os Googles, são os mocinhos do bem.&lt;/p&gt;</description><content:encoded><![CDATA[<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2011/2/20/ballmerasdrevil_original.jpg?1298235025" alt=""  loading="lazy" /></p>
<p>Talvez quem tenha entrado no mercado de tecnologia nesta década não acompanhou a história da década de 90 que culminou com o caso antitruste contra a Microsoft. O “medo” da Microsoft “monopolista” foi substituído por um desdém e ridicularização. Eu sei, eu mesmo uso essa figura de vez em quando, é quase que uma piada universal onde a Microsoft é o mal eterno e todo o resto, as Canonicals, as Apples, os Googles, são os mocinhos do bem.</p>
<p>Ou quase, porque agora é a Apple que está crescendo demais, assim como o Google, que já tem milhares de detratores em vez de fãs. Em breve talvez estaremos vendo um novo caso antitruste: contra um iTunes Store da Apple, por suas práticas “injustas” e “anticompetitivas”. Se isso acontecer, é porque as pessoas não aprendem nada mesmo e estamos fadados a retroceder em vez de progredir.</p>
<p>Em termos de gosto pessoal, garantido pela liberdade individual de expressão, eu desgosto da maioria dos produtos da Microsoft e gosto da maioria dos produtos da Apple. Isso não me impede de entender, respeitar e admirar a capacidade das duas de saírem de uma garagem para o topo do mundo. É o que um mercado livre capitalista possibilita.</p>
<p>E me incomoda quando o sucesso passa a ser visto com o desdém e a inveja dos incompetentes, que no fim acham que têm “direito” a alguma coisa sem ter a mesma capacidade.</p>
<p>Aliás, se eu considero um produto “tecnicamente” melhor ou não é irrelevante. “Melhor” e “pior” são questão de gosto, e o melhor termômetro do mercado é a demanda. Se a demanda é alta, o produto pode ser “bom” mesmo sendo “tecnicamente ruim”.</p>
<p>Ninguém tem “direito” a nada além do que ele próprio produz, e muito menos a algo dos outros de graça. Mas muita gente acha que ninguém pode crescer demais, senão como ficam os competidores menores? Esse tipo de pensamento estatista levou à Grande Depressão de 1929, às Guerras Mundiais e à Crise Financeira de 2008.</p>
<p>Eu acho desorientado juntar o fato de um software ser “aberto”, ou de uma empresa apoiar “software livre”, com movimentos sociais e populistas. Tecnologia não deve se misturar com ideologias socialistas fracassadas. Em outro artigo vou explicar por que Código Aberto (open source) tem tudo a ver com Capitalismo e nada a ver com movimentos sociais politizados.</p>
<p>O texto a seguir é antigo, traduzido do <a href="https://ari.aynrand.org/issues/government-and-business/regulations/drop-the-antitrust-case-against-microsoft/"target="_blank" rel="noopener">artigo original</a> de Onkar Ghate (Pittsburgh Tribune-Review, 17 de março de 2002), e deve convencê-los do que quero dizer. Larguem os preconceitos (“Microsoft = Mal”) e leiam com raciocínio, porque os argumentos são lógicos. O contexto é de 2002; desde então a Microsoft decresceu bastante e suas qualidades mudaram.</p>
<h2>[TRADUÇÃO] Largue o caso antitruste contra Microsoft<span class="hx:absolute hx:-mt-20" id="tradução-largue-o-caso-antitruste-contra-microsoft"></span>
    <a href="#tradu%c3%a7%c3%a3o-largue-o-caso-antitruste-contra-microsoft" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>O histórico caso de antitruste contra a Microsoft está agora entrando em sua fase final: a determinação da pena da Microsoft. O juiz-presidente, juiz da Corte Distrital dos EUA, Colleen Kollar-Kotelly, deveria ser tão branda quanto legalmente permitido. (Se possível, ela deveria impor uma punição nominal como uma multa de um dólar ou, melhor ainda, jogar o caso fora por completo.)</p>
<p>Para entender o porquê, é preciso entender dois pontos, um geral e um particular. Primeiro, as leis antitruste não são objetivas e são injustas. Em segundo lugar, a Microsoft não é culpada de nenhum crime real. Vamos começar com o primeiro ponto.</p>
<p>As “ações” que as leis antitruste proíbem são vagas, contraditórias, indefinidas. Por exemplo, as leis antitruste proíbem as empresas de criarem “restrições ao comércio”. Mas que ações específicas constituem “restrição ao comércio”? Se, como é feito repetidamente no mundo dos negócios, a companhia assina um acordo exclusivo de distribuição com outra empresa, isso é “restrição do comércio” porque agora outras concorrentes potenciais são excluídas dessa área do mercado? Ou se uma empresa vende um computador para um indivíduo X, isso é “a restrição do comércio” porque empresas de informática concorrentes não podem mais vender a X um computador pois ele tem necessidade de um só? Não – os tribunais têm declarado a empresários – apenas as “restrições” que são “irracionais” são ilegais. Mas que “restrições” específicas são “irracionais”? Nenhuma definição é encontrada na lei, de modo que nenhuma empresa pode saber antes de agir quais ações são legais e quais não são.</p>
<p>Considere um outro exemplo. As leis antitruste proíbem as práticas de comércio “injustas”. Mas, novamente, o que conta como uma prática “abusiva”? É qualquer prática comercial que, por exemplo, provoca falências entre alguns dos concorrentes de uma empresa, porque não conseguiram encontrar uma maneira de competir com os preços baixos da empresa e/ou produtos de qualidade superior? Ou é simplesmente uma prática que a administração no poder desaprova? Mais uma vez, nenhuma resposta pode ser encontrada na lei, por isso é impossível para uma empresa determinar de antemão quais ações específicas a lei proíbe.</p>
<p>Tome um último exemplo. Segundo as leis antitruste, uma empresa pode ser acusada de “preços predatórios”, se define preços inferiores aos dos seus concorrentes, porque os concorrentes poderiam falir como resultado. Ele pode ser acusado de “preços de monopólio”, se define os preços que são considerados muito altos, porque isso é supostamente fraudar os consumidores dos seus rendimentos suados. Mas se do contrário decidir fixar os preços ao nível do dos seus concorrentes – pode ser acusado de “conluio” ou “conspiração”, porque agora ele não está mais “competindo”.</p>
<p>No mundo de pesadelo que é a lei antitruste, toda e qualquer ação pode ser declarada ilegal. Não existem e não podem ser definidos princípios objetivos especificados na lei, e como resultado um empresário não tem como determinar, antes de agir, se a sua ação é legal ou não. Na prática, isso significa que os empresários ficam à mercê do governo. Qualquer momento em que o governo quer enfraquecer uma determinada empresa, pode desencadear as leis antitruste contra ela. Na lógica, uma empresa não tem defesa possível contra a acusação de “restrição ao comércio” ou políticas de comércio “injustas” ou de “preços predatórios”, porque a própria acusação não tem nenhum significado objetivo. As leis antitruste, portanto, dão poder arbitrário ao governo.</p>
<p>O resultado óbvio é que quando, digamos, um burocrata está descontente com uma empresa de sucesso, porque ele falhou em compartilhar (isto é, dar) a sua riqueza ou apoio a programas específicos do governo – ou quando um funcionário do governo acha que a destruição de um poderosa empresa vai ganhar o voto dos cidadãos desorientados que acreditam que o “Grande Negócio” é o seu inimigo – ou quando concorrentes ressentidos, invejosos (como a Netscape, Oracle e AOL no caso da Microsoft) podem convencer os seus representantes do governo a enfraquecer um concorrente superior – o impacto da legislação antitruste desce sobre essa empresa.</p>
<p>Não é por acaso que as empresas mais bem-sucedidas, mais produtivas, mais admiradas da América – Microsoft, IBM, Intel, Wal-Mart, American Airlines, Standard Oil, etc – são as que são submetidas a processos antitruste.</p>
<p>Como uma forma de conceder o poder arbitrário ao governo, as leis antitruste são inconstitucionais e anti-americanas. Como uma forma de punir os bem sucedidos pelo seu sucesso, as leis antitruste são uma perversão da justiça.</p>
<p>Vamos agora, portanto, deixar de lado a lei antitruste, segundo o qual toda a ação de uma empresa poderia ser considerada um crime, e perguntar se de fato a Microsoft é culpada de algum crime.</p>
<p>Quais são as principais acusações contra a Microsoft?</p>
<p>A Microsoft é acusada de concorrência “desleal”. Mas a concorrência se refere ao processo pelo qual as empresas utilizam os seus ativos e pessoal para construir produtos melhores e/ou mais baratos. Assim eles procuram ganhar, através de trocas voluntárias, lucros ainda maiores. Em um mercado livre, não existe concorrência “desleal”. Há apenas concorrentes melhores e piores. Em outras palavras, algumas empresas são melhores do que outras em pesquisa e desenvolvimento, estruturação de longo prazo, acordos de negócios mutuamente benéficos, comercialização de produtos, em manter os bons funcionários felizes e com desafios. A Microsoft, por exemplo, é excelente em todos estes processos – e muitos mais. (A acusação de que a Microsoft não é inovadora é particularmente hipócrita dada a sua contínua atualização e melhorias em seus principais produtos. Mesmo o juiz Jackson teve que admitir este ponto). O fato de a Microsoft ser um dos maiores competidores que o mundo dos negócios tem visto é, em uma nação livre, não um crime, mas uma virtude.</p>
<p>A única “concorrência desleal” que existe é, de fato, a não-competição. Se, digamos, a Máfia ameaça explodir a loja de um comerciante a menos que ele lhe dê um percentual de suas vendas, a máfia não está envolvida na competição, ainda que injusta. Ela está envolvida na coerção – precisamente para impedir o comércio voluntário e mercado livre de operar. Quando a Netscape perde vendas para a Microsoft porque o navegador da Microsoft é melhor e/ou mais barato, a perda da Netscape de vendas não tem qualquer semelhança com “perda” de um lojista de vendas para a máfia. Nunca se deve equacionar voluntário (pessoas optam por comprar produtos da Microsoft) com coagido (se ele tivesse uma escolha, o lojista não “lidaria” com a Máfia).</p>
<p>Em segundo lugar, a Microsoft é acusada de “preços predatórios”. Traduzido em realidade, isto significa que a Microsoft é capaz de praticar preços inferiores aos dos seus concorrentes, como o Netscape. Alguns destes concorrentes, que não podem igualar os preços baixos da Microsoft, perdem fatia de mercado ou vão à falência. Mas é a incrível eficiência e produtividade da Microsoft que permite bater sua competição e ainda assim fazer grandes lucros. Novamente, isto não representa um comportamento criminoso, mas virtude.</p>
<p>Finalmente, a Microsoft é acusada de exercer o “poder de monopólio.” Essa acusação também se baseia em equacionar o voluntário com o forçado.</p>
<p>É verdade que a Microsoft detém uma posição dominante no mercado em alguns segmentos da indústria de software e que alguns dos seus concorrentes saíram do negócio. Mas isso é porque a Microsoft realmente estava vencendo a competição: foi mais inovadora, mais eficiente, tem marketing melhor, e empregou melhor do que outras empresas de software. A Microsoft, em outras palavras, ganhou a sua posição dominante.</p>
<p>E continua a ganhar: ela enfrenta concorrência constante, mesmo se não houver concorrentes reais atualmente em seu mercado. Pois sempre que outro empreendedor descobre uma maneira de produzir software similar a um preço mais barato ou melhor software a um preço atraente (ou alguns inimagináveis produtos que tornam o software atual obsoleto), ele é livre para entrar no mercado da Microsoft. E se ele tiver um bom plano de negócios, será capaz de levantar o capital necessário, mesmo se ele próprio não tem nada: há milhares de investidores de risco procurando o próximo Bill Gates. A posição dominante da Microsoft no setor de software, em outras palavras, deve ser conquistada de novo a cada dia.</p>
<p>Então mais uma vez, a Microsoft está sendo atacada por seu sucesso: na realidade ela não tem poder de monopólio, apenas gestão brilhante.</p>
<p>Os únicos monopólios que podem de fato existir são os criados pelo governo. Somente um governo pode impedir alguém de entrar num mercado e, assim, eliminar a concorrência. Os Correios, por exemplo, são um monopólio. Há pouca dúvida de que a Federal Express (nos EUA) pode oferecer um serviço melhor, mais barato, e ainda obter lucro. Mas o governo forçadamente a impede de entrar nesse mercado. A posição dominante dos Correios no mercado não é conquistada: oferece um serviço ruim, mas por causa da coerção do governo não enfrenta concorrência. A posição dominante de mercado da Microsoft, pelo contrário, é conquistada: ela enfrenta concorrência constante, que continua batendo. Novamente, não equiparem o voluntário com o forçado.</p>
<p>A Microsoft é o epítome do sucesso empresarial americano: ela produz uma enorme riqueza através da inteligência e trabalho duro. Imagine a riqueza que existiria – para cada empresa, para cada empregado, para todos os acionistas, para cada cliente – se todas as empresas na América fossem dirigidas por um Bill Gates. O fato de que não são não deve nos levar a destruir a criação de Bill Gates, mas, mais ainda, admirá-lo e defendê-lo.</p>
<p>Por que a punição da Microsoft deveria ser tão tolerante quanto possível (supondo que o caso não pode ser jogado fora, nesta fase do processo)? Porque as leis antitruste são leis arbitrárias que penalizam a virtude por ser virtude – como as acusações específicas contra a Microsoft revelam claramente.</p>
<p>Dr. <a href="https://ari.aynrand.org/experts/onkar-ghate/"target="_blank" rel="noopener">Onkar Ghate</a>, PhD em filosofia, é um pesquisador sênior do Instituto Ayn Rand, em Irvine, na Califórnia. O Instituto promove o Objetivismo, a filosofia de Ayn Rand, autora de <a href="http://web.archive.org/web/20070202073236/http://www.aynrandbookstore.com:80/prodinfo.asp?number=AR91B"target="_blank" rel="noopener">Atlas Shrugged</a> e <a href="http://web.archive.org/web/20070202073147/http://www.aynrandbookstore.com:80/prodinfo.asp?number=AR89B"target="_blank" rel="noopener">The Fountainhead</a>.</p>
<h2>Disclaimer<span class="hx:absolute hx:-mt-20" id="disclaimer"></span>
    <a href="#disclaimer" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Explicando, não é a intenção dizer que a Microsoft é inocente em tudo. Para isso existe o sistema judiciário e qualquer empresa que se sinta prejudicada ilegalmente tem todo o direito de processar, como já aconteceu inúmeras vezes. Vejam <a href="http://en.wikipedia.org/wiki/Microsoft_litigation"target="_blank" rel="noopener">esta lista</a> de processos.</p>
<p>E isso é verdade para qualquer empresa. Uma das funções de um governo é garantir que contratos sejam cumpridos.</p>
<p>A discussão que me interessa no episódio acima é o <a href="http://en.wikipedia.org/wiki/Sherman_Antitrust_Act"target="_blank" rel="noopener">Sherman Antitrust Act</a> que, em essência, dá carta branca ao governo para litigar qualquer empresa por qualquer motivo. Esse não foi o único processo contra a Microsoft, mas foi um dos mais divulgados. A lei antitruste em si é um mal, assim como regulamentações que dão privilégios que ninguém conseguiria no mercado.</p>
<p>E para quem quer se aprofundar, recomendo ler o <a href="https://www.justice.gov/sites/default/files/atr/legacy/2006/04/11/msjudge.pdf"target="_blank" rel="noopener">Findings of Fact</a> completo sobre o caso, no arquivo da justiça americana. Para entender por que a lei antitruste é um grave problema, comece por <a href="http://wiki.objectivismonline.net/Antitrust"target="_blank" rel="noopener">este artigo</a>, mas principalmente pelo livro <a href="http://en.wikipedia.org/wiki/Capitalism:_The_Unknown_Ideal"target="_blank" rel="noopener">Capitalism: The Unknown Ideal</a>.</p>
]]></content:encoded><category>leis-e-regulacao</category><category>microsoft</category><category>filosofia</category><category>off-topic</category></item><item><title>Conversando com Luis Lavena (Ruby no Windows)</title><link>https://akitaonrails.github.io/2008/07/02/conversando-com-luis-lavena-ruby-on-windows/</link><guid isPermaLink="true">https://akitaonrails.github.io/2008/07/02/conversando-com-luis-lavena-ruby-on-windows/</guid><pubDate>Wed, 02 Jul 2008 14:16:00 -0300</pubDate><description>&lt;p&gt;Desta vez entrevistei &lt;a href="http://blog.mmediasys.com/"target="_blank" rel="noopener"&gt;&lt;strong&gt;Luis Lavena&lt;/strong&gt;&lt;/a&gt;. Se você é um desenvolvedor Ruby trabalhando no Windows, deve muito a ele! Afinal, ele é o mantenedor do &lt;a href="http://github.com/luislavena/rubyinstaller/tree"target="_blank" rel="noopener"&gt;One-Click Ruby Installer&lt;/a&gt;, a principal distribuição de Ruby para Windows. É muito trabalho manter uma distribuição dessas e Luis explica todos os obstáculos necessários para isso. A mensagem principal: precisamos de mais colaboradores! Qualquer um pode reclamar, mas poucos descem do pedestal e colocam a mão na massa.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Desta vez entrevistei <a href="http://blog.mmediasys.com/"target="_blank" rel="noopener"><strong>Luis Lavena</strong></a>. Se você é um desenvolvedor Ruby trabalhando no Windows, deve muito a ele! Afinal, ele é o mantenedor do <a href="http://github.com/luislavena/rubyinstaller/tree"target="_blank" rel="noopener">One-Click Ruby Installer</a>, a principal distribuição de Ruby para Windows. É muito trabalho manter uma distribuição dessas e Luis explica todos os obstáculos necessários para isso. A mensagem principal: precisamos de mais colaboradores! Qualquer um pode reclamar, mas poucos descem do pedestal e colocam a mão na massa.</p>
<p><a href="http://www.flickr.com/photos/diegal/325572435/"target="_blank" rel="noopener"><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/7/2/325572435_f1f1382372.jpg" alt=""  loading="lazy" /></a></p>
<p><strong>AkitaOnRails:</strong> Ok. Vamos começar. Primeiramente, obrigado pelo seu tempo. É curioso porque temos como 5 horas de diferença. Você está em Paris agora, mas entendo que é da Argentina. Pode nos contar o que está fazendo atualmente?</p>
<p><strong>Luis Lavena:</strong> Sim, curioso mesmo. Agora sou Diretor Técnico de uma agência de design e interação com escritórios em NY e Paris. Meu trabalho é fazer a ponte entre o campo de design e o tecnológico, principalmente no desenvolvimento de aplicações web.</p>
<p>Sou da Argentina, moro lá, família e amigos. Agora me mudei por alguns meses para impulsionar alguns desenvolvimentos e dar os primeiros passos na nova organização.</p>
<p>Sou de uma pequena província chamada Tucumán, na área noroeste da Argentina (1200 km de Buenos Aires, para ser exato).</p>
<p><strong>AkitaOnRails:</strong> Incrível. Você já foi ao Brasil? Tem contato com outros Railers da América Latina?</p>
<p><strong>Luis Lavena:</strong> Apesar de o Brasil ser tão perto da Argentina, nunca fui lá, o que é uma pena. Tenho vários amigos que moraram lá ao longo dos anos.</p>
<p>Mantenho contato com vários Rubistas e Railers da América Latina, mas principalmente com os da Argentina por causa de vários encontros que tivemos ao longo dos anos em que a lista <a href="http://lista.rubyargentina.com.ar"target="_blank" rel="noopener">RubyArg</a> vem funcionando.</p>
<p><strong>AkitaOnRails:</strong> Tenho muito interesse em entender como os Railers estão se organizando na Argentina, já que nós, no Brasil, somos uma comunidade em crescimento também. Você vê novos programadores indo direto para Rails ou é o movimento habitual de Java/outros para Rails? As empresas estão adotando, ou Ruby/Rails ainda tem um longo caminho a percorrer por lá também?</p>
<p><strong>Luis Lavena:</strong> Bem, há um número enorme de desenvolvedores que vieram de Java e dotNET (principalmente Java) e estão experimentando Rails. Também há muitos desenvolvedores que usam Ruby para tarefas administrativas ou até para criar jogos.<br>
As empresas de desenvolvimento de software ainda precisam adotar Ruby/Rails nos seus negócios. O maior problema é a falta de suporte na forma de empresas como a Sun ou alguns serviços de consultoria para Java — ou mesmo Microsoft.</p>
<p><strong>AkitaOnRails:</strong> Voltando ao passado, como você começou na programação em geral? Estudou ciência da computação, ou chegou até lá de outra forma? E, finalmente, como você tropeçou no Ruby e no Rails?</p>
<p><strong>Luis Lavena:</strong> É engraçado. Comecei a programar em 1989, brincando com sprites e GOTOs em BASIC num computador Z80.</p>
<p>Oficialmente não terminei minha graduação em CC, porque trabalho e diversão me distraíram. Conheci o Ruby pela primeira vez em 2001, adorei a sintaxe, gostei da sua verbosidade, mas não estava maduro o suficiente para as minhas necessidades, pelo menos não no Windows.</p>
<p>Embora eu tenha usado Python por muitos anos, internamente usava Ruby para gerenciar várias coisas, desde scripts simples até rake tasks que nos ajudavam a construir nossas ferramentas.</p>
<p>Com Rails foi diferente — começamos a procurar alternativas ao Zope e apostamos no Rails naquela época (versão 0.10 ou 0.12, se a memória não me trai).</p>
<p>Posso dizer que não me arrependo da aposta no Rails naquela época.</p>
<p><strong>AkitaOnRails:</strong> É muito interessante ver profissionais como você saindo da zona de conforto em direção ao &ldquo;desconhecido&rdquo; como Ruby e Rails. A maioria dos programadores é muito defensiva e até agressiva na busca de justificativas para não usar nenhum dos dois. Você se sentiu assim na época? O que te levou ao Ruby?</p>
<p><strong>Luis Lavena:</strong> Bem, estou acostumado a mudar de linguagens conforme minhas necessidades.<br>
Considere que nossa primeira escolha foi a era pré-J2EE ou o dotNET. Analisamos o que nos daria melhores soluções a longo prazo e decidimos evitá-los.</p>
<p>As coisas de Java pareciam — e ainda parecem até hoje — caras para os negócios. A Argentina não é um país onde você vai encontrar clientes com orçamentos enormes para cobrar o custo de usar ferramentas desenhadas para outros mercados.</p>
<p>Bancos e similares podem se dar ao luxo de ter tudo rodando com J2EE, mas isso não funciona quando você tenta ser menor e ágil — baseado principalmente em experiências com o fluxo do mercado na Argentina.</p>
<p><strong>AkitaOnRails:</strong> É ainda mais desafiador considerando que você decidiu que queria Ruby no Windows, provavelmente não encontrou nada razoável e decidiu atacar o problema você mesmo. Foi assim que aconteceu?</p>
<p><strong>Luis Lavena:</strong> Fui obrigado a usar Windows por muitos anos, principalmente relacionado ao desenvolvimento de hardware no campo de transmissão de vídeo. Além disso, sou usuário de BSD e Linux, até brinquei alguns anos com Macs e ultimamente com OSX.</p>
<p>Então essa restrição me forçou a construir a maior parte das minhas ferramentas em torno dessa limitação.<br>
O Ruby me permitiu aproveitar essa limitação sendo expressivo, o que me tornou mais produtivo nessa área.</p>
<p>Ruby não é capaz de lidar com meus requisitos principais para processamento de vídeo, mas ainda alimenta 70% do meu ambiente, junto com software Open Source e Freeware.</p>
<p>Usei Ruby por tanto tempo que pensei que a comunidade, agora que estava crescendo, talvez valorizasse a experiência e a disposição de ajudar nesse cenário específico.</p>
<p>Então, em vez de continuar coçando minha coceira nas sombras, decidi contribuir de volta e ajudar outros que buscam a mesma coisa. Pode dizer que estou tentando equilibrar meu karma.</p>
<p><strong>AkitaOnRails:</strong> Os americanos provavelmente não entendem isso, mas em países emergentes como o Brasil, as pessoas não têm muita escolha. A maioria não tem instrução suficiente (<em>cof</em> inglês <em>cof</em>) e encontra muitas barreiras. O último recurso para todo mundo é o Windows. Acho que é a mesma coisa na Argentina. Os Railers aqui não simplesmente migram para Macs ou Linux — diria que pelo menos 90% de todos os desenvolvedores estão presos ao Windows por um motivo ou outro. É a mesma coisa na Argentina, imagino?</p>
<p><strong>Luis Lavena:</strong> Mesmo que eu não goste, tenho que concordar. Felizmente as universidades começaram a mudar isso alguns anos atrás, dando palestras e sendo mais abertas à comunidade Linux, que cresceu muito.</p>
<p>Ainda assim, há muitos usuários e desenvolvedores presos em ambientes corporativos/médios ou que precisam rodar Windows por algum hardware proprietário ou similar.</p>
<p>Então, nós (como comunidade) não conseguimos chegar a esses desenvolvedores sem sermos mais abertos ou fornecer ferramentas que facilitem o caminho entre o ambiente atual deles e ferramentas alternativas.</p>
<p><strong>AkitaOnRails:</strong> Mas por algum motivo parece haver quase zero interesse da comunidade em suportar Ruby no Windows. Quer dizer, existem pessoas como você, alguns desenvolvedores de RubyGems que se dão ao trabalho de disponibilizar binários para win32, mas parece não ser suficiente. Como o <a href="http://rubyforge.org/projects/rubyinstaller/"target="_blank" rel="noopener">One-Click Ruby Installer</a> começou? Você o criou ou herdou?</p>
<p><strong>Luis Lavena:</strong> Sim, concordo, mas não posso culpá-los — afinal, cada um coça sua própria coceira. ;-)</p>
<p>Herdei o One-Click Installer do <a href="http://curthibbs.wordpress.com/"target="_blank" rel="noopener">Curt Hibbs</a>, que também herdou do <a href="http://en.wikipedia.org/wiki/Andy_Hunt_%28author%29"target="_blank" rel="noopener">Andy Hunt</a> e outros contribuidores.</p>
<p>A verdade é que por muitos anos usei minha própria versão do Ruby, compilada internamente, então tínhamos controle sobre ela. Não a modificávamos de forma alguma — gostamos de ter todo o processo documentado e automatizado, para poder identificar os componentes específicos atualizados que introduziram conflitos.</p>
<p>O One-Click Installer, por outro lado, depende de builds feitos pelos atuais desenvolvedores e mantenedores do ruby-core, o que torna o processo de encontrar as dependências corretas um pouco difícil. Esse build também impôs outros problemas, mas isso exigiria mais tempo para explicar.</p>
<p><strong>AkitaOnRails:</strong> Haha, quero mergulhar nas partes mais técnicas para que as pessoas possam entender melhor a situação atual no Windows. Quão diferente é o Ruby no Windows comparado ao Ruby no Linux? A coisa mais óbvia é que qualquer Gem com Extensões C sem binários adequados para Windows vai falhar. Tentar executar comandos shell vai falhar e o <a href="http://www.zenspider.com/ZSS/Products/RubyInline/"target="_blank" rel="noopener">RubyInline</a> também. O que mais?</p>
<p><strong>Luis Lavena:</strong> Hehe, isso é só a ponta do iceberg. Deixe-me mostrar um exemplo. Suponha que você tem um pacote ABC construído para sua distribuição atual de Linux. Essa versão específica de Linux está vinculada a um runtime comum que cuida de comandos básicos como manipulação de arquivos, console, etc. Isso é geralmente chamado de CRT (C Runtime) e no Linux é a glibc.</p>
<p>Então sua distribuição de Linux está vinculada a esta versão glibc A.B.C. Se sua distribuição atualiza a versão da glibc (por exemplo de 2.2 para 2.5), você é forçado a:</p>
<ol>
<li>atualizar todos os seus pacotes instalados, ou</li>
<li>recompilar tudo do zero.</li>
</ol>
<p>Já ouvi de algumas dessas atualizações dando tão errado que os usuários são forçados a começar do zero. O Windows, por outro lado, não pode quebrar 2 bilhões de aplicações por causa de uma mudança de CRT, então mantém versões antigas e preserva a compatibilidade no arquivo MSVCRT.dll (onde a versão base é 6.0).</p>
<p>Uma vantagem do Windows é que você pode ter vários CRTs coexistindo no seu sistema operacional. A parte ruim é que você não pode vincular com segurança a um CRT e usar componentes que se vinculam a outra versão sem se preocupar com segfaults e afins.</p>
<p>Tentei condensar essas informações <a href="http://blog.mmediasys.com/2008/01/17/ruby-for-windows-part-1/"target="_blank" rel="noopener">num post</a> algum tempo atrás. Como você pode ver, a falta de ferramentas de desenvolvimento não é o pior problema no desenvolvimento Windows.</p>
<p><strong>AkitaOnRails:</strong> Interessante. E outra coisa é o compilador Visual Studio vs <a href="http://www.mingw.org/"target="_blank" rel="noopener">MinGW</a>. Você pode nos dar uma ideia de por que escolheu o MinGW? É só porque o VS é comercial e os desenvolvedores teriam que pagar?</p>
<p><strong>Luis Lavena:</strong> O Visual Studio é ótimo, mas só quando você pode pagá-lo. As versões gratuitas carecem de algumas coisas muito úteis, como a Profile-Guided Optimization (PGO) que está sendo usada para construir binários Windows do Python, por exemplo.</p>
<p>O problema com o VS, mesmo as versões gratuitas, é que você não tem permissão de distribuí-las. Acho que é até ilegal vincular à URL/página de download. Então, mesmo para o nosso projeto de sandbox automatizado, o Visual Studio precisaria ser baixado, instalado e configurado manualmente.</p>
<p>Felizmente nas últimas versões você não precisa instalar o Platform SDK, que era 1GB. As versões do VS se vinculam apenas à versão mais recente do MSVCRT, o que nos força a relinkar cada biblioteca da qual o Ruby depende (e o código fonte do Ruby depende de muitos externos).</p>
<p>Além disso, o Ruby não usa a versão safe do CRT para funções de cópia de strings, então você precisa de flags de compilador só para evitar isso&hellip; Então depois de semanas de muito trabalho para compilar com VC8 e todas as dependências, você acaba com algo que tem performance quase igual, já que não há ganho de performance — mas agora você tem menos cabelos.</p>
<p>O MinGW, por outro lado, era mais próximo de um ambiente Linux, então a maioria das ferramentas funcionava imediatamente. A parte boa é que não precisávamos compilar todas as dependências com ele, já que por padrão tudo se vincula ao MSVCRT (o CRT padrão no Windows). O MinGW também fornece algumas ferramentas de cross-compilação que permitem construir, usando o ambiente Linux, bibliotecas compartilhadas (dll) e executáveis para Windows.<br>
Considero isso uma vantagem, não sei o que os outros pensam.</p>
<p><strong>AkitaOnRails:</strong> Uau, isso é realmente avassalador e recomendo a qualquer pessoa interessada nos detalhes que dê uma olhada no seu <a href="http://blog.mmediasys.com/"target="_blank" rel="noopener">blog</a>. Mas tudo isso dito, agora você tem tudo no lugar, um processo adequado e tal, presumo. Se eu sou um desenvolvedor C Windows e quero contribuir, onde devo ir primeiro para saber quais ferramentas usar, como compilar as coisas, etc.?</p>
<p><strong>Luis Lavena:</strong> Essa é a parte boa! <a href="http://blog.robustlunchbox.com/"target="_blank" rel="noopener">Gordon Thiesfeld</a> e eu temos trabalhado em dois pacotes para o novo One-Click Installer: Runtime e Developer Kit.</p>
<p>O Runtime vem com o mínimo de Ruby+RubyGems para você começar e também pode ser usado como módulo para outras instalações. O DevKit fornece o ambiente MinGW para você criar extensões Ruby ou mesmo instalar aquelas que não são pré-compiladas para Windows mas são fáceis de obter.</p>
<p>Este DevKit não vai apenas facilitar o trabalho com Ruby no Windows (e dar acesso a algumas ótimas Rubygems), mas também permitir que você contribua de volta para o projeto Ruby. Como? Fácil — o projeto Ruby Installer (no <a href="http://github.com/luislavena/rubyinstaller/tree/master"target="_blank" rel="noopener">Github</a>) é auto-hospedado. O que isso significa? É possível replicar nosso ambiente de desenvolvimento em qualquer lugar, hackear suas mudanças ou até debugar o próprio código C do Ruby e contribuir de volta para a comunidade. Temos feito isso por vários meses e está funcionando. Que legal, né?</p>
<p><strong>AkitaOnRails:</strong> Parece incrível. Não sabia disso e aposto que muitos desenvolvedores também não. Espero que os desenvolvedores C que leram isso possam se atualizar agora. Outro detalhe: RubyGems. Quão difícil é portar uma Gem com Extensões C para fornecer um binário Windows quando você a instala?</p>
<p><strong>Luis Lavena:</strong> Oh, isso requer que alguns desenvolvedores não caiam em truques específicos de plataforma para fazer suas ferramentas funcionarem. Um exemplo, que também é uma má prática, é usar caminhos hard-coded&hellip;</p>
<p>Outro é depender da existência de algumas ferramentas externas que às vezes não estão disponíveis ou os desenvolvedores/usuários não instalaram. E não estou falando de problemas de plataforma Linux-Windows — mesmo entre distribuições Linux isso é um problema.</p>
<!-- dead Flash embed removed (service offline): flash -->  
<p><a href="http://www.vimeo.com/1266418?pg=embed&amp;sec=1266418"target="_blank" rel="noopener">Instalando Gems no RubyInstaller</a> de <a href="http://www.vimeo.com/luislavena?pg=embed&amp;sec=1266418"target="_blank" rel="noopener">Luis Lavena</a> no <a href="http://vimeo.com?pg=embed&amp;sec=1266418"target="_blank" rel="noopener">Vimeo</a>.</p>
<p><strong>AkitaOnRails:</strong> Então depende bastante da qualidade da Gem original, certo? Quanto mais limpo o código, mais fácil de portar, claro. Mas seu DevKit fornece alguns atalhos para isso? E quanto ao RubyInline, ele simplesmente quebra?</p>
<p><strong>Luis Lavena:</strong> Sim, aprendi ao longo dos anos que você não deve supor nada sobre o ambiente em que sua aplicação vai rodar — assim você evita esses erros.</p>
<p>Felizmente o RubyInline funciona bem com o Ruby Installer (One-Click Installer que usa MinGW) há algumas versões atrás — graças ao Ryan Davis por incluir esses patches.</p>
<p>O build atual em VC6 do One-Click Installer não é seguro, pois você precisa do VS6 para funcionar, que não está mais disponível. Já ouvi de usuários aproveitando Sequel, Ambition e ImageScience no Windows graças a esses patches.</p>
<p><strong>AkitaOnRails:</strong> Me corrija se estiver errado, mas não é uma forma de incorporar snippets de código C misturado com código Ruby? Isso significa que ele compila nativamente esse snippet para executar? Como consegue isso num ambiente Windows que não tem compiladores por padrão?</p>
<p><strong>Luis Lavena:</strong> Conseguimos incluir alguns patches no Hoe e no RubyInline que &ldquo;empacotam&rdquo; as extensões pré-compiladas dentro das gems, então os usuários não precisam de um compilador nesses casos.</p>
<p>De qualquer forma, agora usar o build VC6 do Ruby exige mão de obra para manter essas gems e acompanhar os novos lançamentos, o que leva tempo. Até agora era só eu na jogada (já que temos algumas licenças VC6). Construir tudo para todo mundo é um fardo que estou ansioso para transferir para o DevKit.</p>
<p><strong>AkitaOnRails:</strong> São vocês que mantêm as versões Windows das Gems ou cada desenvolvedor cuida do seu próprio projeto? Há um repositório central para Gems prontas para Windows? O DevKit já está disponível, aliás?</p>
<p><strong>Luis Lavena:</strong> Para alguns projetos sou o único que mantém gems para Windows; para outros apenas contribuí com patches e outros usuários gerenciam os builds. Não há repositório central para gems Windows porque quero que o RubyForge seja o central.<br>
De qualquer forma, estou publicando as específicas do MinGW baseadas em forks do github aqui:</p>
<pre><code>gem list --remote --source http://gems.rubyinstaller.org</code></pre>
<p>O devkit já está disponível, mas estamos embrulhando-o num bom pacote de instalação Windows. Você pode sujar as mãos e pegar o projeto sandbox do <a href="http://github.com/luislavena/rubyinstaller">Github</a> para ter seu ambiente, ou simplesmente <a href="http://www.rubyinstaller.org/sandbox/">baixar os pacotes</a>.</p>
<p><strong>AkitaOnRails:</strong> Então, no que diz respeito a ferramentas e processos, você está fazendo um ótimo trabalho. Mas então há o código Ruby que, por si só, é um grande desafio pelo que ouço. Você me mencionou que nem parece C. Quais são os maiores problemas? Técnicos ou conseguir ajuda da lista ruby-core, ou ambos? E quanto aos test suites, como você está eliminando bugs de compatibilidade?</p>
<p><strong>Luis Lavena:</strong> Para ser honesto, às vezes olhar para o código C do Ruby me dá dor de cabeça. Há muitas macros, definições e condições de macro que aparecem no meio de um bloco if..else... A parte mais difícil, além de rastrear o bug, é obter feedback do ruby-core. Várias vezes <a href="http://blog.mmediasys.com/2008/03/06/is-windows-a-supported-platform-for-ruby-i-guess-not/">expressei</a> minhas preocupações em listas de e-mail, IRC e no meu blog.</p>
<p>Várias vezes perguntei se era OK ter alguns erros nos unit tests do próprio Ruby e às vezes obtive respostas, mas às vezes não. Felizmente não precisamos mais basear nossa qualidade de testes nos unit tests incluídos no Ruby. Começamos a encontrar problemas com a implementação do Ruby no Windows usando as Ruby Specs criadas pelo pessoal do projeto Rubinius e que a maioria das implementações (IronRuby e jRuby) contribui ativamente e usa como base de seus interpretadores.</p>
<p><strong>AkitaOnRails:</strong> Falando nisso, <a href="http://blog.emptyway.com/2008/04/06/the-rubyspecs-quick-starting-guide/">RubySpecs</a> — quão longe está o Ruby no Windows de passar por elas? Ou já passa?</p>
<p><strong>Luis Lavena:</strong> Bem, é uma tarefa grande. Primeiro começamos fazendo o MSpec funcionar corretamente no Windows, já que o RubySpec requer alguma auditoria para remover caminhos hard-coded. Então começamos a adicionar guards em torno de coisas que não são suportadas ou não funcionam no Windows no <span class="caps">MRI</span>.</p>
<p>Isso leva mais tempo já que precisamos revisar os resultados em cada plataforma, mergulhar na documentação do Ruby (que às vezes é insuficiente) ou respirar fundo e olhar para o código C para descobrir o que está fazendo.</p>
<p>Se tivéssemos <strong>mais mão de obra</strong>, talvez conseguíssemos terminar de proteger todo o código e ter specs rodando limpas no Windows. Agora há muitas que simplesmente falham ou causam segfault.</p>
<p><strong>AkitaOnRails:</strong> Você deveria documentar esse processo para que as pessoas possam ajudar, se ainda não o fez :-) Agora falando de coisas mais práticas: Ruby no Windows, hoje, é um runtime viável para rodar apps Rails no Windows? Mesmo apps em produção? Você trabalhou com Zed Shaw no Mongrel para Windows, certo? Experimentou o mais recente suporte FastCGI da Microsoft para <span class="caps">IIS</span>?</p>
<p><strong>Luis Lavena:</strong> Hehee, documentação, documentação — é totalmente superestimada. Planejamos ter vários screencasts no site do RubyInstaller, mas continua como <em>'em breve'</em> por enquanto.</p>
<p>Não só você pode desenvolver aplicações Rails no Windows (como eu também faço), mas conheço várias empresas que rodam lado a lado com <span class="caps">IIS</span> ou mesmo Tomcat.</p>
<p>Mesmo 2 anos após o Zed tê-lo criado, o Mongrel ainda domina o cenário de servidores web Ruby. Não fiz muito ao próprio Mongrel, já que o Zed criou algo que funcionava no Windows com pequenos ajustes.</p>
<p>Criei algo para rodar o Mongrel como serviço (mongrel_service), o que ajudou várias pessoas a introduzir Ruby e Rails em seus ambientes corporativos, inclusive conversando com servidores <span class="caps">MSSQL</span>.</p>
<p>Pessoalmente não testei o <a href="http://mvolo.com/blogs/serverside/archive/2007/02/18/10-steps-to-get-Ruby-on-Rails-running-on-Windows-with-IIS-FastCGI.aspx">suporte a <span class="caps">FCGI</span> no <span class="caps">IIS</span></a>, mas fui eu quem o corrigiu para ser incluído no One-Click Installer para que alguns usuários pudessem aproveitá-lo. Podemos dizer que funciona.</p>
<p><strong>AkitaOnRails:</strong> Sobre performance, o Windows parece ter uma condição inerente: na mesma máquina quando inicio, digamos, um simples <span class="caps">IRB</span> no Windows, depois dou dual boot para Linux e rodo, parece abrir muito mais rápido (não é exatamente um experimento científico :-). Qual é sua experiência com a performance do Ruby no Windows?</p>
<p><strong>Luis Lavena:</strong> Há problemas de performance relacionados ao código C gerado pelo compilador e problemas relacionados ao SO e I/O gerenciados por ele. Carregar o <span class="caps">IRB</span> no Windows pode estar exigindo RubyGems em segundo plano, que por sua vez precisa varrer e carregar todas as especificações de gems. Tento manter <code>RUBYOPT=rubygems</code> fora das minhas variáveis de ambiente.</p>
<p><strong>AkitaOnRails:</strong> Aliás, por que tenho a impressão de que vejo <span class="caps">RUBYOPT</span>=rubygems sendo recomendado em todo tutorial Windows que vejo?</p>
<p><strong>Luis Lavena:</strong> <code>RUBYOPT=rubygems</code> é a parte da mágica que devemos evitar.<br>
No Linux, se você começa a criar um script e precisa de uma gem, começa com:</p>
<hr>
<pre><code>require 'rubygems'
require 'some_gem'</code></pre>
<p>O mesmo deveria ser feito para Windows. Não é doloroso, é boa prática. <span class="caps">RUBYOPT</span> é um atalho que não gosto — nunca vi uma distribuição Linux que ative isso por padrão e não gosto que seja configurado no Windows (é claro, esse é meu ponto de vista pessoal).</p>
<p>Então, para evitar cair em procedimentos de teste padrão, continuo usando um solver de sudoku simples mas bom que exercita recursão, arrays e condições da VM em vez de ser I/O bound.</p>
<p>Você pode ver isso, com resultados interessantes no <a href="http://blog.mmediasys.com/2008/04/24/contributions-speedup-and-less-quirks-for-us/">meu blog</a> (veja a seção <em>"Rubinius, RubySpecs, and speed."</em> do post).</p>
<p>O principal é que o VC6 torna tudo lento. Depois você tem as coisas I/O bound (I/O no Windows não é tão bom quanto no Linux). Considero o build padrão VC6 do Ruby no Windows dolorosamente lento. Por outro lado, o do MinGW é mais ágil, mas ainda acho que há um longo caminho a percorrer para melhorias.</p>
<p><strong>AkitaOnRails:</strong> Então, no geral, Ruby no Windows está sempre evoluindo — o que é ótimo —, roda bem no Windows — o que é notável —, mas poderia usar um pouco mais de ajuda, certo? Você acha que mais desenvolvedores C Windows ajudariam? Ou seja, adicionar mais mãos ajudaria a melhorar a qualidade?</p>
<p><strong>Luis Lavena:</strong> Definitivamente!</p>
<p><strong>AkitaOnRails:</strong> Que tipo de desenvolvedores — o que uma pessoa deveria saber para ajudar?</p>
<p><strong>Luis Lavena:</strong> Não sei se o "core" do Ruby vai aceitar isso — ultimamente só ouço a palavra fork em torno do Ruby <span class="caps">MRI</span>. Além disso, podemos corrigir bugs na implementação Ruby para Windows, mas não podemos melhorar muito a qualidade já que essas mudanças afetariam outras plataformas também.</p>
<p>A parte ruim é que não há separação clara por plataforma de código específico — tudo é uma série de macros e condições de compilação que dificultam o rastreamento (para desenvolvedores não-masoquistas).</p>
<p><strong>AkitaOnRails:</strong> O que me lembra o pessoal da Phusion com a sua <a href="http://www.rubyenterpriseedition.com/">Enterprise Edition</a>, que é um fork do <span class="caps">MRI</span>. Você tentou analisar os patches de GC copy-on-write deles? Talvez incluí-los na versão Windows? O Ruby no Windows em si é um "fork". Você acaba tendo que sincronizar seu trunk com o deles — é assim que funciona?</p>
<p><strong>Luis Lavena:</strong> Honestamente não tive tempo de analisar a Enterprise Edition, mesmo tendo acompanhado todos os posts e a discussão desses patches no ruby-core. O engraçado é que os últimos lançamentos da branch Ruby 1.8.6 estão me dando dores de cabeça (mais do que olhar para o código C). Eles não conseguem nem completar os self-tests e causam segfault com algumas extensões como a gem mysql.</p>
<p><strong>AkitaOnRails:</strong> Sim, tem gerado muito barulho na comunidade — e com razão. Espero que possam resolver logo. Bem, acho que já tomei muito do seu tempo. Há algum assunto que você gostaria de abordar, ou pelo menos alguma mensagem para a comunidade brasileira mais jovem?</p>
<p><strong>Luis Lavena:</strong> Sim — não tenha medo de fazer perguntas, não se envergonhe de usar Windows como plataforma. Você pode realizar ótimas aplicações usando Windows e pode se infiltrar mais facilmente em ambientes corporativos com ele.</p>
<p><strong>AkitaOnRails:</strong> Ah, o que me lembra de uma última pergunta que todo mundo me faz o tempo todo — e vou repassar para você, já que é um desenvolvedor Windows: quais são suas ferramentas preferidas para editar projetos Ruby/Rails?</p>
<p><strong>Luis Lavena:</strong> Uso principalmente coisas gratuitas ou open source, então tenho usado o <a href="http://www.activestate.com/store/download.aspx?prdGUID=20f4ed15-6684-4118-a78b-d37ff4058c5f">Komodo Edit</a> (não Pro) e o <a href="http://www.pnotepad.org/">Programmer Notepad</a>, já que às vezes os uso para trabalhar com código C, FreeBASIC e Assembler para hardware embarcado.</p>
<p>Ultimamente tenho usado um editor leve chamado <a href="http://intype.info/home/index.php">Intype</a> que vem com alguns bundles para imitar o TextMate, mas realmente não aproveito muito. Usei NetBeans por um tempo, mas depois de 500MB simplesmente fechei :-)</p>
<p><strong>AkitaOnRails:</strong> Haha, e o que você recomendaria para um programador Rails iniciante?</p>
<p><strong>Luis Lavena:</strong> Para começar, o NetBeans é bom, mas com a prática aprenderão que até o notepad é suficiente para programar.</p>
<p>(PS: Já estamos incluindo os patches da Enterprise para os últimos problemas no build MinGW! :-)</p>
<p><strong>AkitaOnRails:</strong> Haha, certo. Bem, acho que é isso. Espero que isso alcance um público mais amplo e chame atenção dos desenvolvedores Windows por aí. Muito obrigado!</p>
<p><strong>Luis Lavena:</strong> Obrigado a você, Fabio.</p>
<p style="text-align: center; margin: 5px"><a href="http://www.flickr.com/photos/diegal/325555121/"><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/7/2/325555121_e6e22ea444.jpg" alt=""></a></p>
]]></content:encoded><category>entrevistas</category><category>ruby</category><category>microsoft</category></item><item><title>Conversando com Scott Hanselman</title><link>https://akitaonrails.github.io/2008/02/18/conversando-com-scott-hanselman/</link><guid isPermaLink="true">https://akitaonrails.github.io/2008/02/18/conversando-com-scott-hanselman/</guid><pubDate>Mon, 18 Feb 2008 09:45:00 -0300</pubDate><description>&lt;p&gt;Esta semana entrevistei mais uma pessoa do campo Microsoft, &lt;a href="http://www.hanselman.com/"target="_blank" rel="noopener"&gt;Scott Hanselman&lt;/a&gt;. Eu o conheço pelo seu podcast &lt;a href="http://www.hanselminutes.com/"target="_blank" rel="noopener"&gt;Hanselminutes&lt;/a&gt;. Em um episódio ele &lt;a href="https://akitaonrails.github.io/2007/07/08/hanselminutes-entrevista-com-david-hansson-e-martin-fowler/"&gt;entrevistou&lt;/a&gt; tanto Martin Fowler quanto David Hansson na RailsConf do ano passado — uma conversa realmente notável.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/1370206727_84d760de06.jpg" alt="" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;Ele também postou um excelente &lt;a href="http://www.hanselman.com/blog/ASPNET35ExtensionsPlusMVCHowToScreencast.aspx"target="_blank" rel="noopener"&gt;screencast&lt;/a&gt; sobre o novo framework MVC alternativo da Microsoft e achei que seria ótimo tê-lo aqui no blog para falar sobre tecnologia e frameworks web. Como já disse antes, acho que não devemos ficar alheios ao que está acontecendo em outras frentes, e Scott é uma pessoa de pensamento avançado e mente aberta.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Esta semana entrevistei mais uma pessoa do campo Microsoft, <a href="http://www.hanselman.com/"target="_blank" rel="noopener">Scott Hanselman</a>. Eu o conheço pelo seu podcast <a href="http://www.hanselminutes.com/"target="_blank" rel="noopener">Hanselminutes</a>. Em um episódio ele <a href="/2007/07/08/hanselminutes-entrevista-com-david-hansson-e-martin-fowler/">entrevistou</a> tanto Martin Fowler quanto David Hansson na RailsConf do ano passado — uma conversa realmente notável.</p>
<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/1370206727_84d760de06.jpg" alt=""  loading="lazy" /></p>
<p>Ele também postou um excelente <a href="http://www.hanselman.com/blog/ASPNET35ExtensionsPlusMVCHowToScreencast.aspx"target="_blank" rel="noopener">screencast</a> sobre o novo framework MVC alternativo da Microsoft e achei que seria ótimo tê-lo aqui no blog para falar sobre tecnologia e frameworks web. Como já disse antes, acho que não devemos ficar alheios ao que está acontecendo em outras frentes, e Scott é uma pessoa de pensamento avançado e mente aberta.</p>
<p><strong>AkitaOnRails:</strong> Antes de tudo, deixa eu te parabenizar sr. <a href="http://www.hanselman.com/blog/BlueBadge.aspx"target="_blank" rel="noopener">progman.exe</a> :-) Entendo que isso foi algo pelo qual você estava muito animado. Pode nos contar um pouco mais sobre sua transição para a Microsoft e suas novas responsabilidades?</p>
<p><strong>Scott Hanselman:</strong> Estou trabalhando para Simon Muzio, que cuida de <a href="http://www.asp.net"target="_blank" rel="noopener">www.asp.net</a>, <a href="http://www.iis.net"target="_blank" rel="noopener">www.iis.net</a> e grandes sites cheios de conteúdo como esses. Gosto de pensar que meu trabalho é escrever um livro que nunca vai terminar, onde esse livro são posts de blog, artigos, screencasts, vídeos, palestras, etc. No fundo sou um professor, então mesmo tendo o título de &ldquo;Community Liaison&rdquo;, prefiro &ldquo;Professor&rdquo;.</p>
<p><strong>AkitaOnRails:</strong> Conta pra gente sobre sua história. Como você começou no mundo da computação? Você sempre foi mais voltado para Windows ou tinha uma base no mundo Unix também? E antes de sua recente saída para a Microsoft você trabalhava na <a href="http://www.hanselman.com/blog/CheckFreeClosesDealToAcquireCorillianNowTheRealWorkBegins.aspx"target="_blank" rel="noopener">Corillian</a>. Qual era sua função lá?</p>
<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/computerolympics.jpg" alt=""  loading="lazy" /></p>
<p><strong>Scott Hanselman:</strong> <a href="http://www.hanselman.com/blog/TeachingChildrenAndKidsToProgramTheOldSchoolWay.aspx"target="_blank" rel="noopener">Este post de blog</a> fala sobre meus primeiros anos na escola.</p>
<blockquote>
  <p>Viu aquele livro à direita? Foi assim que aprendi a programar. Esse livro era O livro em 1984. Digitei o livro inteiro num Commodore 64.</p>

</blockquote>
<p>E uma professora MUITO <a href="http://www.hanselman.com/blog/MrsMayfieldHillMyFifthGradeTeacher.aspx"target="_blank" rel="noopener">influente</a> que me colocou no caminho certo.</p>
<blockquote>
  <p>Marianne Mayfield é minha professora da quinta série e a razão pela qual estou em computação hoje. Ela esteve no meu casamento, em formaturas, em eventos de família. Vinte anos depois ainda somos próximos. Quando eu era jovem, ela reconheceu que eu estava &ldquo;em risco de dar problema&rdquo; e se sentou com minha família para encontrar uma forma de me colocar de volta nos trilhos. Ela viu que eu estava fascinado pelo Apple II na nossa sala de aula e arranjou para que a gente pudesse levar o computador para fora da escola, desde que estivesse de volta antes do domingo à noite sem que ninguém notasse.</p>

</blockquote>
<p>(clique nos links acima para mais detalhes)</p>
<p><strong>Scott Hanselman:</strong> Eu era o Arquiteto-Chefe na Corillian, trabalhando com outros engenheiros e arquitetos em toda a empresa, planejando, projetando e codando a próxima geração da Plataforma de Internet Banking da Corillian.</p>
<p><strong>AkitaOnRails:</strong> Aplaudo sua campanha <a href="http://www.hanselman.com/blog/TeamHanselmanAndDiabetesWalk2007.aspx"target="_blank" rel="noopener">Team Hanselman</a> para ajudar no combate à Diabetes. Entendo que você também tem Diabetes e que, felizmente, conseguiu controlá-la hoje em dia. Pode nos contar essa história e os objetivos da sua campanha?</p>
<p><strong>Scott Hanselman:</strong> Minha história pessoal está <a href="http://hanselman.com/fightdiabetes"target="_blank" rel="noopener">aqui</a>:</p>
<blockquote>
  <p>Atualmente tomo três injeções de Symlin por dia enquanto uso uma bomba de insulina 24 horas por dia, inclusive enquanto durmo. A bomba me poupa de mais seis injeções por dia, que tomei durante 8 anos antes da bomba. Meço minha glicose picando meu dedo entre 8 e 10 vezes por dia — são cerca de 46.500 picadas até agora, e ainda há um longo caminho pela frente.</p>

</blockquote>
<p>E tem uma boa explicação da diabetes <a href="http://www.hanselman.com/blog/ScottsDiabetesExplanationTheAirplaneAnalogy.aspx"target="_blank" rel="noopener">aqui</a>:</p>
<blockquote>
  <p>É aqui que a analogia fica interessante. Lembre que na analogia estamos voando de Los Angeles para Nova York, mas só podemos verificar nossa altitude sete vezes. E só podemos mudar de altitude (tomar insulina) menos de dez vezes. Mas quando verifico minha glicose, estou vendo o passado. Estou vendo uma leitura de como estava minha glicose há 15 minutos. E quando tomo insulina, ela só começa a reduzir minha glicose depois de pelo menos 30 minutos.</p>

</blockquote>
<p>A campanha acabou arrecadando mais de USD$30.000, e esse dinheiro será aplicado em pesquisa, educação e programas relacionados à diabetes.</p>
<p><strong>AkitaOnRails:</strong> <em>&ldquo;O que diabos você estava fazendo numa RailsConf?&rdquo;</em> Isso é o que acho que pessoas de fora do mundo de blogs Microsoft perguntariam a você :-) Então, você é apenas curioso sobre Rails, ou chega a desenvolver aplicações baseadas em Rails? Estou muito interessado em conhecer sua opinião sobre Rails. Como você o encontrou? O que você acha de melhor no Rails? E mais importante, o que você acha que Rails poderia melhorar?</p>
<p><strong>Scott Hanselman:</strong> Estou sempre experimentando diferentes linguagens de programação e frameworks. Tenho feito Rails de vez em quando há cerca de 18 meses, mas ainda não clicou pra mim. Tenho certeza que vai em breve. O padrão MVC é muito antigo… eu fazia isso em Java há mais de 10 anos, e certamente o padrão remonta a 30 anos. Acho que Rails é um bom framework considerando sua pouca idade. Mas acho que é o Ruby que tem a magia de verdade, e vejo que a estética do Ruby está muito em linha com a minha.</p>
<p><strong>AkitaOnRails:</strong> Então, seguindo minhas preferências tendenciosas, o próximo artigo de que gosto é seu <a href="http://www.hanselman.com/blog/ASPNET35ExtensionsPlusMVCHowToScreencast.aspx"target="_blank" rel="noopener">screencast</a> sobre o framework CTP ASP.NET MVC. Vejo que esse novo framework se parece muito com Rails. Claro, pode parecer assim apenas porque ambos implementam MVC. Por outro lado, ele usa expressões muito similares ao Rails em todo lugar. Falta um pouco de &ldquo;mágica de convenção-sobre-configuração&rdquo;, mas pelo que vi parece muito melhor do que fazer ASP.NET convencional. O que você acha dele? Pode resumir um pouco para quem não conhece esse produto? E o que você acha que ainda vai melhorar nele?</p>
<p><strong>Scott Hanselman:</strong> Se alguém aponta para Rails e diz &ldquo;isso é MVC&rdquo; então tudo mais vai se parecer com Rails, claro. Qualquer bom framework MVC precisa não só seguir o padrão adequadamente, mas também abstrair o HTTP (assumindo que é um framework web) de forma limpa, mas não completa. A implementação do ASP.NET MVC ainda carrega alguma bagagem que sempre vai precisar carregar porque o ASP.NET WebForms veio primeiro e não foi projetado do zero com testabilidade em mente. Dito isso, tudo se resume a alternativas. Use o framework que te deixa feliz e em que você se sente mais produtivo. Alguma fração, talvez 20%, dos desenvolvedores ASP.NET vai preferir MVC. Agora eles têm uma opção com suporte da Microsoft e boa integração com C# 3.0.</p>
<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/505403549_2ad6d13ce7.jpg" alt=""  loading="lazy" /><br>
na RailsConf'07</p>
<p><strong>AkitaOnRails:</strong> E o que seria o mundo tech sem discussões e flame wars? Entendo que a maioria dos desenvolvedores .NET nem presta atenção a Rails ou outros frameworks. Até ouvi que há alguns desenvolvedores questionando coisas como <em>&ldquo;Por que mais um framework web se o ASP.NET já existe?&rdquo;</em> Ou seja, por que reinventar a roda e dividir atenções? Particularmente acho que esse novo MVC é o caminho a seguir, mas é inegável que o velho ASP.NET tem muito mais aceitação e suporte. Como reconciliar os dois pontos de vista?</p>
<p><strong>Scott Hanselman:</strong> Isso é puro FUD (fear, uncertainty, and doubt — medo, incerteza e dúvida). Que pensem o que quiserem, esse framework é apenas sobre alternativas. WebForms é ótimo, e se você está fazendo aplicações Line of Business (LOB) com grids complexos e afins, ele não vai a lugar nenhum. No entanto, se você é uma equipe ágil que preza TDD e ficou frustrado com ViewState, então confira ASP.NET MVC. Não há nada a reconciliar. Algumas pessoas vão de carro, outras de moto, outras a pé. O que importa é chegar do ponto A ao ponto B e se sentir bem durante a jornada.</p>
<p><strong>AkitaOnRails:</strong> Falando em flame wars, há provavelmente um assunto que me dá arrepios: as teorias conspiratórias paranoicas sobre Miguel de Icaza e o <a href="http://www.hanselman.com/blog/MonoAndItsManyFacetsScreencast.aspx"target="_blank" rel="noopener">Mono</a>. Muita gente acredita de fato que Miguel está &ldquo;vendendo&rdquo; parte do mundo open source para a Microsoft. Você já usou? O que você ouve da comunidade e qual é sua opinião sobre o assunto?</p>
<p><strong>Scott Hanselman:</strong> Sim, já usei Mono e acho que é uma ótima forma de fazer sua aplicação .NET funcionar no Linux ou Mac. Acho Miguel brilhante e um excelente dançarino. Ouço na comunidade que as pessoas estão felizes por Mono existir e estar disponível como uma opção.</p>
<p><strong>AkitaOnRails:</strong> Provavelmente vou levar uma maldição por isso, mas não sou &ldquo;fortemente&rdquo; contra a Microsoft como alguns fundamentalistas são. É público e notório que a Microsoft é uma grande corporação e, como tal, cometeu sua parte de atos equivocados. Muitos deles já foram resolvidos na justiça. Então é mais complexo do que as pessoas geralmente pensam. Prefiro assumir que dentro da Microsoft há muitas pessoas muito inteligentes.</p>
<p><strong>Scott Hanselman:</strong> Fico fora de questões legais. A Microsoft é uma empresa enorme com muita gente inteligente, mas na prática é muitas empresas de porte médio trabalhando juntas (geralmente). Não posso falar sobre &ldquo;atos equivocados&rdquo;. Só posso dizer que faço meu melhor todo dia para não ser mau, assim como meus colegas de trabalho. Não há nenhum plano maléfico mestre no meu grupo.</p>
<p><strong>AkitaOnRails:</strong> Particularmente gosto do roadmap para Windows Server 2008 (com sua abordagem minimalista, finalmente tendo instalado apenas o que você precisa). No ano passado você estava experimentando o <a href="http://www.hanselman.com/blog/ScreencastHowToIIS7AndPHPWithFastCGI.aspx"target="_blank" rel="noopener">IIS 7</a> e seu novo suporte a FastCGI. Acho que era destinado principalmente ao suporte de PHP mas teoricamente poderia lidar com Ruby on Rails também. Você já tentou Rails lá? Acho que a Microsoft claramente está indo atrás do segmento de menor custo com Windows Server 2008 + IIS 7, contra as caixas baratas de Linux+Apache. Acho que não conseguirão chegar lá em termos de preço, mas o que você acha dele como competidor de serviços de internet?</p>
<p><strong>Scott Hanselman:</strong> Tenho pouco poder nessa arena, mas toda vez que alguém quiser ouvir estou defendendo um SKU barato de Servidor Web. Sou um grande fã do IIS7 e gostaria que o máximo de pessoas possível o experimentasse. Não testei IIS7+Rails mas ouvi rumores de pessoas conseguindo fazer funcionar.</p>
<p><strong>AkitaOnRails:</strong> Há muitos recursos novos no .NET 3.5. LINQ é o que mais me interessa. Pode nos dar uma breve descrição de por que é tão interessante? E o que você acha das melhores melhorias da versão 3.5? Você já está usando o Orcas? Qual é sua opinião? Ah, e você conhece o projeto <a href="http://www.sapphiresteel.com/"target="_blank" rel="noopener">Sapphire in Steel</a>?</p>
<p><strong>Scott Hanselman:</strong> LINQ é interessante porque é sua própria Linguagem de Domínio Específico para consultar objetos de todos os tipos, e está vivendo diretamente dentro de VB e C#. É um compilador MUITO mais inteligente e é um prazer trabalhar com ele. Instalei o Sapphire In Steel e conheço algumas pessoas que adoram. Estou animado para ver Rails no .NET.</p>
<p><strong>AkitaOnRails:</strong> Uma das vantagens da estratégia Microsoft .NET foi estar preparada desde o primeiro dia para ser agnóstica em relação a linguagens. Agora temos o DLR que foi derivado dos trabalhos no IronPython e não no IronRuby. Mas há ainda outra linguagem interessante que poucas pessoas conhecem: F#, a linguagem inspirada em OCaml. Você já experimentou?</p>
<p><strong>Scott Hanselman:</strong> Sim, e fiz dois podcasts sobre ela, um com <a href="http://www.hanselman.com/blog/HanselminutesPodcast76FWithRobertPickering.aspx"target="_blank" rel="noopener">Robert Pickering</a>, autor de um livro sobre F# e outro com <a href="http://www.hanselman.com/blog/HanselminutesPodcast96StartingSmallWithFWithDustinCampbell.aspx"target="_blank" rel="noopener">Dustin Campbell</a>, um entusiasta. Estou animadíssimo que ela vai ser uma linguagem de primeira classe dentro do VS.</p>
<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/1930668335_0719ad4d3f.jpg" alt=""  loading="lazy" /><br>
com John Lam</p>
<p><strong>AkitaOnRails:</strong> Não sou contra comparações técnicas, precisamos fazer esse tipo de coisa para decidir nossos passos em projetos. Mas sou contra desafios sem sentido. Rails está longe de ser perfeito e sou o primeiro a dizer isso. Dito isso, é ótimo para um nicho específico de desenvolvimento web. Costumo recomendar que bons programadores devem expandir seus horizontes e aprender o máximo possível de coisas novas. Não dá para saber tudo perfeitamente, mas é sempre bom estar ciente das possibilidades. Você <a href="http://www.hanselman.com/blog/TheProgrammingLanguageExplosion.aspx"target="_blank" rel="noopener">escreveu algo</a> nessa linha. O que você acha disso?</p>
<p><strong>Scott Hanselman:</strong> Rails é bom no que faz dentro do seu nicho. Você não cria aplicativos desktop Windows com Rails e tudo bem. É por isso que não comparamos Rails com WPF, mas com frameworks web. Comparação é boa e sempre há algo bom para encontrar dos dois lados. Evito flame wars também. É inútil. Se o sapato aperta, não use. Mas experimente o máximo de sapatos que puder!</p>
<p><strong>AkitaOnRails:</strong> No ano passado você escreveu um <a href="http://www.hanselman.com/blog/TheSkynetComputeCloudIThinkThereIsAWorldMarketForMaybeFiveComputers.aspx"target="_blank" rel="noopener">post interessante</a> sobre o futuro. Google é esse grande gigante, Amazon lançou produtos surpreendentemente bons nos últimos meses como S3, EC2, SimpleDb. Não estou bem a par da estratégia atual do Microsoft Live. Pode dizer algo sobre para onde está rumando?</p>
<p><strong>Scott Hanselman:</strong> Não estou nesse grupo então não tenho nenhum conhecimento além do que já foi dito. No entanto, ainda mantenho minhas previsões naquele post!</p>
<blockquote>
  <p>A computação vai se mover para a Nuvem. Já está acontecendo, estamos 20% lá. A ideia existe desde o começo e vai, na minha opinião, continuar surgindo até que realmente aconteça e construamos a Skynet. Uma dessas nuvens de computação vai certamente acabar em órbita.</p>

</blockquote>
<p><strong>AkitaOnRails:</strong> E claro, de certa forma &ldquo;preciso&rdquo; te perguntar isso: você usa Windows Vista? Como tem sido para você considerando que há uma enorme campanha underground contra ele? Você acha que é tão ruim quanto todo mundo diz? Não posso comentar porque nunca o testei fora da minha máquina virtual (sou um cara de Mac), mas eles venderam 100 milhões de licenças.</p>
<p><strong>Scott Hanselman:</strong> Com certeza. Rodo Vista 64-bit em 3 máquinas e Vista 32-bit em 2 máquinas. Foi difícil nos primeiros 3 meses enquanto o suporte a drivers deixava a desejar, mas agora está ótimo. Tenho 2 máquinas com Vista que não foram reinicializadas há meses, apenas colocadas em modo de suspensão e acordadas. Depois que você consegue bons drivers de vídeo, geralmente tá tranquilo.</p>
<p>As pessoas implicam com o Vista, mas esquecem a vasta gama de hardware em que ele tem que rodar. O OS X só precisa rodar em Macs, e em uma faixa estreita deles. O Vista tem que rodar em milhões de combinações de hardware. Drivers de terceiros são DE LONGE o que mais trava o Vista, e ele leva a culpa. Por isso rodo 64-bit e uso apenas drivers assinados. Estou encantado com o 64-bit. Funciona muito bem.</p>
<p><strong>AkitaOnRails:</strong> Ok, é isso :-) Muito obrigado!</p>
<p><img src="http://s3.amazonaws.com/akitaonrails/assets/2008/2/18/90081476_85f9a226dd.jpg" alt=""  loading="lazy" /></p>
]]></content:encoded><category>entrevistas</category><category>microsoft</category><category>desenvolvimento-web</category></item></channel></rss>