<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yuri Ximenes Martins</title>
    <description>The latest articles on DEV Community by Yuri Ximenes Martins (@yxm).</description>
    <link>https://dev.to/yxm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1119028%2Ffea9a143-6b5b-4528-8aeb-2c6aba4b8da7.jpeg</url>
      <title>DEV Community: Yuri Ximenes Martins</title>
      <link>https://dev.to/yxm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yxm"/>
    <language>en</language>
    <item>
      <title>arXiv: 3 boas alternativas</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Tue, 12 Dec 2023 14:16:37 +0000</pubDate>
      <link>https://dev.to/yxm/arxiv-3-boas-alternativas-4j4h</link>
      <guid>https://dev.to/yxm/arxiv-3-boas-alternativas-4j4h</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Para as pessoas ligadas à pesquisa na área de exatas, certamente o &lt;a href="https://arxiv.org/"&gt;arXiv&lt;/a&gt; é um ambiente muito visitado.&lt;/p&gt;

&lt;p&gt;Para aqueles que não conhecem, o processo de validação da pesquisa é feita mediante publicação de artigos científicos em revistas científicas.&lt;/p&gt;

&lt;p&gt;Normalmente a versão final fica retida pelas revistas, o que pode impedir o acesso a esse conhecimento por parte de outras pessoas (sobre esse ponto, veja meu desabafo &lt;a href="https://dev.to/yxm/sobre-a-validacao-da-pesquisa-qualis-capes-e-as-grandes-empresas-de-editoracao-um-desabafo-10o5"&gt;nesse&lt;/a&gt; outro post). O que se costuma fazer é divulgar uma versão preliminar do trabalho, conhecida como "pré-print".&lt;/p&gt;

&lt;p&gt;ArXiv é o repositório "padrão" na área de exatas para armazenamento de pré-prints. No entanto, como veremos abaixo, existem outros repositórios igualmente importantes. Dois deles não são tão conhecidos, especialmente aqui no Brasil.&lt;/p&gt;

&lt;h1&gt;
  
  
  Por que fugir do ArXiv?
&lt;/h1&gt;

&lt;p&gt;Diferentemente das revistas científicas, o arXiv não se propõe a fazer um processo de revisão dos trabalhos, mas apenas uma moderação básica para evitar a introdução de trabalhos totalmente aleatórios. As regras de tal processo podem ser encontradas &lt;a href="https://info.arxiv.org/help/moderation/index.html"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por experiência própria, tenho alguns questionamentos a respeito da conduta da moderação utilizada no arXiv. Não só eu, mas outras pessoas também têm enfrentado alguns problemas. Deixo para falar disso, em detalhes, num próximo post.&lt;/p&gt;

&lt;p&gt;Por hora, me resumo a dizer que acho importante haver uma maior distribuição dos pré-prints para haver uma descentralização do "poder" nas mãos de um só repositório.&lt;/p&gt;

&lt;p&gt;Assim, a questão não é "fugir" do arXiv, mas não depender completamente dele.&lt;/p&gt;

&lt;p&gt;Outro ponto a ser levantado é que o arXiv só aceita pré-prints que, segundo os critérios dele, tem um potencial de serem publicados em alguma revista científica. Isso, em tese, descarta notas de aula, slides de apresentações e outros tipos de recursos interessantes. Há uma preferência, também, por trabalhos em Inglês.&lt;/p&gt;

&lt;h1&gt;
  
  
  Alternativas
&lt;/h1&gt;

&lt;p&gt;Apresento três alternativas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://hal.science/?lang=en"&gt;HAL&lt;/a&gt;. 

&lt;ul&gt;
&lt;li&gt;Trata-se de um repositório Francês, criado pelo &lt;a href="https://www.ccsd.cnrs.fr/"&gt;Center for Direct Scientific Communication&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Além de pré-prints, recebe também slides de apresentações e notas de aula. &lt;/li&gt;
&lt;li&gt;Aceita submissões em diversos idiomas, incluindo o Português. &lt;/li&gt;
&lt;li&gt;Os trabalhos passam por um processo de moderação mais "brando" do que o do arXiv.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zenodo.org/"&gt;Zenodo&lt;/a&gt;. 

&lt;ul&gt;
&lt;li&gt;Repositório mantido pelo &lt;a href="https://home.cern/"&gt;CERN&lt;/a&gt; e &lt;a href="https://www.openaire.eu/"&gt;OpenAIRE&lt;/a&gt;. Para quem não sabe, CERN (European Organization for Nuclear Research) é o maior centro de pesquisa mundial na área de Física Nuclear. É deles a responsabilidade do &lt;a href="https://pt.wikipedia.org/wiki/Grande_Colisor_de_H%C3%A1drons"&gt;LHC&lt;/a&gt; (Large Hadron Collider), de onde saem as mais importantes descobertas do mundo sub-atômico. Foi no CERN que as primeiras ideias sobre internet foram levantadas (veja &lt;a href="https://home.web.cern.ch/science/computing/birth-web"&gt;aqui&lt;/a&gt;). &lt;/li&gt;
&lt;li&gt;Aceita, além de pré-prints, slides de apresentações, notas de aula, e outros formatos. &lt;/li&gt;
&lt;li&gt;Também aceita trabalhos em diferentes idiomas, incluindo o Português.&lt;/li&gt;
&lt;li&gt;O processo de moderação é mais "brando" se comparado com o do arXiv.&lt;/li&gt;
&lt;li&gt;É possível criar "grupos", nos quais diferentes pessoas podem colocar seus trabalhos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Repositórios no Github, Gitlab ou Codeberg.

&lt;ul&gt;
&lt;li&gt;Uma terceira alternativa simples é manter seus trabalhos hospedados em repositórios versionados em git.&lt;/li&gt;
&lt;li&gt;A desvantagem é falta de "reconhecimento" por parte da academia se comparado com algo incluído no arXiv ou nas alternativas acima.&lt;/li&gt;
&lt;li&gt;Nessa opção não há uma restrição quanto ao tipo de conteúdo a ser introduzido ou ao idioma.&lt;/li&gt;
&lt;li&gt;Não há processo de moderação.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;ArXiv é o padrão. No entanto, existem opções tão boas quanto.&lt;/p&gt;

&lt;p&gt;Você já conhecia essas alternativas?&lt;/p&gt;

&lt;p&gt;Até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>arxiv</category>
      <category>research</category>
      <category>pesquisa</category>
      <category>preprint</category>
    </item>
    <item>
      <title>Sobre a validação da pesquisa, Qualis Capes e as grandes empresas de editoração: um desabafo</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Mon, 11 Dec 2023 18:38:10 +0000</pubDate>
      <link>https://dev.to/yxm/sobre-a-validacao-da-pesquisa-qualis-capes-e-as-grandes-empresas-de-editoracao-um-desabafo-10o5</link>
      <guid>https://dev.to/yxm/sobre-a-validacao-da-pesquisa-qualis-capes-e-as-grandes-empresas-de-editoracao-um-desabafo-10o5</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Nos últimos anos dediquei boa parte da minha vida e de minha saúde para o desenvolvimento de pesquisa nas áreas de Física e Matemática. No entanto, sinto que, depois de bastante cansado, minha dedicação não valeu tanto a pena.&lt;/p&gt;

&lt;p&gt;Acredito que grande parte da minha frustração se deva ao processo de validação da Ciência como é adotado no Brasil e no mundo. No presente artigo, apresento algumas reflexões e alguns pontos de descontentamento.&lt;/p&gt;

&lt;p&gt;Não sou nenhum grande pesquisador e, portanto, minha pequena opinião não possui peso algum. No entanto, depois de me distanciar um pouco do meio acadêmico e poder ver a situação de forma mais panorâmica, não consigo deixar de levantar meus questionamentos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Qualis, Scimago e segregação científica
&lt;/h1&gt;

&lt;p&gt;Caso não saibam, ao se desenvolver uma pesquisa, o processo de "validação" pelo meio acadêmico se dá pela publicação desta, no formato de artigos científicos, em revistas científicas consideradas "bem avaliadas".&lt;/p&gt;

&lt;p&gt;Aqui no Brasil, o critério de avaliação é normalmente baseado em uma nota dada pela Capes (Qualis Capes - veja &lt;a href="https://sucupira.capes.gov.br/sucupira/public/consultas/coleta/veiculoPublicacaoQualis/listaConsultaGeralPeriodicos.jsf"&gt;aqui&lt;/a&gt;) à cada revista. Fora do Brasil utiliza-se outras classificações, como a Scimago (veja &lt;a href="https://www.scimagojr.com/journalrank.php"&gt;aqui&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Assim, no Brasil, para que sua pesquisa seja considerada validada, ela deve ter sido publicada em revistas com boa nota Qualis Capes. Essa nota é levada em consideração em processos seletivos de docentes em universidades públicas, bem como em sua progressão depois de concursados. Ela também é levada em consideração por agências de fomento, que liberam recursos financeiros para que novas pesquisas sejam realizadas, o que inclui, por exemplo, bolsas de pesquisa. &lt;/p&gt;

&lt;p&gt;Fato é que muitas revistas consideradas muito boas pela Scimago não estão listadas no Qualis Capes, o que significa que publicar nelas não trará tanto impacto e valorização de seu trabalho mediante agências de fomento aqui no Brasil. Isso induz uma segregação que força com que trabalhos sejam publicados majoritariamente em revistas pré-definidas.&lt;/p&gt;

&lt;p&gt;As revistas são catalogadas na Qualis por demanda: se há bastante gente publicando em uma revista não listada, em uma revisão futura eles podem acrescentá-la. Note, no entanto, que para que novas revistas sejam incluídas, é necessário que um grupo de pessoas se disponha a "remar contra a maré", publicando trabalhos em revistas não listadas, o que lhes confere o risco de terem um trabalho não validado.&lt;/p&gt;

&lt;p&gt;Existem revistas de cunho geral e revistas de cunho específico. Revistas gerais aceitam a submissão de trabalhos de diversas áreas dentro de uma dada disciplina. Revistas específicas são mais focadas em determinadas áreas. Grande parte das revistas gerais consideradas boas pela Scimago estão listadas no Qualis. A discrepância maior se dá quando se fala de revistas especializadas.&lt;/p&gt;

&lt;p&gt;Deve-se notar que revistas de cunho geral tendem a ser bem mais concorridas que revisas especializadas. Afinal, aceitam trabalho de diversas áreas.&lt;/p&gt;

&lt;p&gt;Considere, agora a seguinte situação. Um grupo de pesquisa emerge no Brasil em uma área ainda não consolidada. Naturalmente, os primeiros trabalhos não são tão fortes, uma vez que o grupo ainda está em seu início. A escolha natural de revistas para submeter seus trabalhos são revistas especializadas, as quais, infelizmente, estão fora do Qualis. Isso significa que, das duas uma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;o grupo tenta remar contra a maré, publicando seus trabalhos em boas revistas especializadas fora do Qualis, torcendo para que em uma próxima revisão as revistas naturais de seu meio sejam incluídas;&lt;/li&gt;
&lt;li&gt;o grupo publica seus trabalhos em revistas gerais, menos qualificadas, mas listadas no Qualis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Compare a situação com um grupo de pesquisa em uma área já consolidada. A conclusão certamente será a de que há uma maior chance de que este sobreviva ao longos dos anos.&lt;/p&gt;

&lt;p&gt;Retrato minha situação pessoal. Minha pesquisa se concentra em temas ligados à processos de abstração, com foco na área de Teoria das Categorias. Existem poucas pessoas que trabalham na área no Brasil (e no mundo, se comparado com outras áreas da Matemática). Consequentemente, existem poucas revistas listadas no Qualis que sejam especializadas no assunto. Publicar sobre o tema em revistas boas, de cunho geral, é bastante difícil, pois se está concorrendo diretamente com áreas mais "visadas". &lt;/p&gt;

&lt;p&gt;Em minha experiência pessoal, tive bastante dificuldade de alocar meus trabalhos em boas revistas dentro do Qualis. Alguns foram publicados em revistas especializadas consideradas boas pelo Qualis, mas em áreas correlatas. Por conta disso, precisei modificar o trabalho direcionando-o para outra área. Outros foram publicados em revistas gerais, considerados razoáveis pelo Qualis. O restante, depois de diversas manobras, acabou ficando como pré-print. &lt;/p&gt;

&lt;h1&gt;
  
  
  Springer, Elsevier, Wiley e direitos de divulgação
&lt;/h1&gt;

&lt;p&gt;Outro ponto a ser levantado é que as revistas tipicamente considerados "de qualidade" estão concentrados nas mãos de grandes empresas de editoração, como Springer e Elsevier.&lt;/p&gt;

&lt;p&gt;Nós, pesquisadores, escrevemos artigos científicos e os submetemos para as revistas, isto é, para as empresas. As revistas (isto é, as empresas) recebem os trabalhos, os distribuem para pesquisadores cadastrados (considerados "revisores") e chamados de reviewers (juízes, em tradução livre), os quais irão dizer se o trabalho é digno de ser publicado ali ou não.&lt;/p&gt;

&lt;p&gt;Durante o processo de publicação, transfere-se o direito de distribuição da versão final de seu trabalho à empresa, de modo que ela pode vender seu acesso a outros pesquisadores e instituições de ensino.&lt;/p&gt;

&lt;p&gt;Você deve estar pensando: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;poxa, mas então um pesquisador deve ganhar bastante dinheiro publicando trabalhos. Os revisores também devem ganhar um bom dinheiro por revisar.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fato é que os pesquisadores e os revisores não recebem nada além de prestígio, enquanto que as empresas faturam com a venda de seus trabalhos. Tratam-se de empresas multi-bilionárias: em 2020, Elsevier, Springer e Wiley tiveram faturamentos de $3,79 bi, $2,03 bi e $0,97 bi, respectivamente (veja &lt;a href="https://uniavisen.dk/en/scientific-publishers-are-reaping-huge-profits-from-the-work-of-researchers-and-the-universities-are-paying-for-it/"&gt;aqui&lt;/a&gt;, &lt;a href="https://www.theguardian.com/science/2017/jun/27/profitable-business-scientific-publishing-bad-for-science"&gt;aqui&lt;/a&gt; e &lt;a href="https://www.thenation.com/article/society/neuroimage-elsevier-editorial-board-journal-profit/"&gt;aqui&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Na verdade, a situação piora.&lt;/p&gt;

&lt;h1&gt;
  
  
  Gold Open Access
&lt;/h1&gt;

&lt;p&gt;Durante muitos tempo, antes da consolidação da internet, os principais as revistas científicas eram assinadas especialmente por bibliotecas. Com o avanço da internet e a popularização de uma facilidade de acesso à informação, o fato das publicações em revistas científicas serem acessíveis somente à assinantes levantou sérios questionamentos.&lt;/p&gt;

&lt;p&gt;Note que as empresas faturam justamente com o acesso à informação. Se após aceitos os trabalhos ficassem disponíveis para quem quisesse vê-los, a fonte de lucro se esgotaria. Pois as empresas tiveram uma grande ideia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;oferecer ao autor do trabalho a possibilidade de pagar um valor (extremamente alto) para que, depois de publicado, seu artigo fique disponível a todos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certamente o pesquisador vai querer que outras pessoas tenham acesso a seus trabalhos, o que faz que busque recursos em agências de fomento à pesquisa. As agências passam, então, financiar a disponibilização de pesquisas que elas mesmas já custearam antes.&lt;/p&gt;

&lt;p&gt;Sim, os pesquisadores cedem o direito sobre seus trabalhos e pagam para que esse conhecimento seja acessível a todos.&lt;/p&gt;

&lt;p&gt;Me pergunto, seriamente, se existe uma lógica por de trás desse processo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Revistas Predatórias
&lt;/h1&gt;

&lt;p&gt;Normalmente o processo de publicação de um trabalho, desde a etapa de submissão até seu aceite e divulgação na página da revista, leva alguns meses ou anos (a depender da revista). Sim, o pesquisador faz sua pesquisa, paga (os órgãos de fomento de sua pesquisa pagam - e caro)  para que, caso seja aceito, seu trabalho fique disponível a todos, e ainda precisa esperar vários meses (não raro alguns anos) para que um desfecho seja dado.&lt;/p&gt;

&lt;p&gt;De olho nessa demora e no dinheiro envolvido, muitas empresas decidiram criar revistas "fantoches", com um processo de revisão mal feito (ou mesmo sem revisão, em alguns casos), nas quais o trabalho é aceito e publicado dentro de poucos dias. Tais empresas coletam indevidamente o email de pesquisadores em diversas plataformas da internet e disparam emails sucessivos oferecendo publicações rápidas. O preço? Alto, é claro.&lt;/p&gt;

&lt;p&gt;Pela prática que empregam, tais revistas são consideras "predatórias" (veja &lt;a href="https://en.wikipedia.org/wiki/Predatory_publishing"&gt;aqui&lt;/a&gt;). Uma tentativa de tentar identificá-las é através dos &lt;em&gt;critérios de Bell&lt;/em&gt;. Para uma lista atualizada das revistas que se enquadram em tais critérios, veja &lt;a href="https://beallslist.net/"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Green Open Access
&lt;/h1&gt;

&lt;p&gt;Existem, no entanto, revistas que, verdadeiramente, remam contra a maré. Normalmente ligadas à alguma instituição de ensino, fazem um processo de revisão criterioso e não cobram nada por isso. O problema? Bem, poucas pessoas lutam contra a maré. Isso significa que poucas pessoas publicam em tais revistas, o que por sua vez implica que elas normalmente não estejam listadas no Qualis. E a história toda continua...&lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Decidi não compactuar mais com esse comércio. É uma questão ideológica. Eu havia submetido alguns trabalhos para revistas conhecidas. Dois foram aceitos. Depois de pensar, decidi não publicá-los nelas. E assim pretendo continuar. Caso julgue que um trabalho valha uma publicação, o submeterei para revistas verdadeiramente Open Access, cunho verdadeiro intuito é a validação e a distribuição de conhecimento.&lt;/p&gt;

&lt;p&gt;Julguem-me todos, mas nessa não caio mais.&lt;/p&gt;

&lt;p&gt;Até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>research</category>
      <category>pesquisa</category>
      <category>capes</category>
      <category>paper</category>
    </item>
    <item>
      <title>Failed Dependency! Instabilidade e TTL no Codeberg Pages</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Wed, 29 Nov 2023 14:05:38 +0000</pubDate>
      <link>https://dev.to/yxm/failed-dependency-instabilidade-e-ttl-no-codeberg-pages-4fo1</link>
      <guid>https://dev.to/yxm/failed-dependency-instabilidade-e-ttl-no-codeberg-pages-4fo1</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; é uma alternativa gratuita e open-source ao Github/Gitlab, a qual oferece uma plataforma para gerenciamento de repositórios &lt;code&gt;git&lt;/code&gt; (veja &lt;a href="https://dev.to/yxm/codeberg-uma-alternativa-open-source-e-gratuita-ao-github-e-gitlab-b80"&gt;esse&lt;/a&gt; post). Lá você também pode hospedar um site estático de forma bastante simples no que é chamado de &lt;a href="https://docs.codeberg.org/codeberg-pages/"&gt;Codeberg Pages&lt;/a&gt;, serviço análogo ao Github/Gitlab Pages, conforme discutido &lt;a href="https://dev.to/yxm/como-utilizar-um-css-hospedado-no-github-ou-codeberg-em-um-projeto-html-3158"&gt;nesse&lt;/a&gt; post.&lt;/p&gt;

&lt;h1&gt;
  
  
  Erro 1
&lt;/h1&gt;

&lt;p&gt;Suponhamos que você utiliza o Codeberg Pages e, na maioria dos casos, sua página carrega normalmente (com domínio personalizado ou não). No entanto, em algumas raras situações, ao tentar acessar sua página, você se depara com o erro &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Failed Dependency! (...) could not find target for custom domain&lt;/em&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse caso, não se desespere! O servidor que mantém o Codeberg Pages passa, vez ou outra, por instabilidades. Lembremos que é um serviço gratuito, com foco total em projetos open-source, e mantido por doações (veja &lt;a href="https://docs.codeberg.org/getting-started/faq/#is-codeberg-well-funded%3F"&gt;aqui&lt;/a&gt;), algo que não pode ser comparado com o GitHub (o qual é mantido pela Microsoft) nem com o Gitlab (que é uma empresa privada, com fins lucrativos).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YzgJo5im--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/zCjKLj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YzgJo5im--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/zCjKLj0.png" alt="Failed Dependency! (...) could not find target for custom domain" width="643" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Erro 2
&lt;/h1&gt;

&lt;p&gt;Por outro lado, se você criou sua página e está tentando ativar/alterar um domínio personalizado, talvez você encontre um outro erro do tipo "Failed Depencency!" um pouco diferente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Failed Dependency! (...) could not obtain repo owner from custom domain&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa situação também não é motivo de desespero. Primeiramente, verifique se você:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;configurou o arquivo &lt;code&gt;.domains&lt;/code&gt; na raiz de seu repositório de modo a conter uma linha única com o seu domínio customizado (digamos &lt;code&gt;my-domain.com&lt;/code&gt;), conforme descrito na &lt;a href="https://docs.codeberg.org/codeberg-pages/"&gt;documentação&lt;/a&gt;; &lt;/li&gt;
&lt;li&gt;adicionou registros DNS da forma correta, a saber (o erro normalmente aparece por equívoco no registro &lt;code&gt;TXT&lt;/code&gt;):

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;A&lt;/code&gt;, apontando para o IPv4 &lt;code&gt;217.197.91.145&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AAA&lt;/code&gt;, apontando para o IPv6 &lt;code&gt;2001:67c:1401:20f0::1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TXT&lt;/code&gt;, apontando para &lt;code&gt;branch.repo.user.codeberg.page&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se ainda assim o erro persistir, saiba que o  TTL (time to live) do cache no servidor do Codeberg Pages é de 3h (veja &lt;a href="https://codeberg.org/Codeberg/Community/issues/1013"&gt;aqui&lt;/a&gt;). Nesse caso, é só esperar um tempo até que cache seja limpo. &lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Codeberg pode apresentar instabilidades, mas para hospedagem de sites estáticos, ainda assim é a minha opção predileta.&lt;/p&gt;

&lt;p&gt;Até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>errors</category>
      <category>codeberg</category>
      <category>dns</category>
      <category>ttl</category>
    </item>
    <item>
      <title>Como utilizar um `.css` hospedado no GitHub ou Codeberg em um projeto HTML?</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Tue, 28 Nov 2023 17:10:35 +0000</pubDate>
      <link>https://dev.to/yxm/como-utilizar-um-css-hospedado-no-github-ou-codeberg-em-um-projeto-html-3158</link>
      <guid>https://dev.to/yxm/como-utilizar-um-css-hospedado-no-github-ou-codeberg-em-um-projeto-html-3158</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Considere a seguinte situação: você possui um arquivo &lt;code&gt;.css&lt;/code&gt; (digamos &lt;code&gt;style.css&lt;/code&gt;) e gostaria de utilizá-lo em vários projetos de desenvolvimento web. Como fazer isso de forma simples?&lt;/p&gt;

&lt;p&gt;Naturalmente, a ideia é utilizar um import&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"path/to/style.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por comodidade, seria interessante se o arquivo &lt;code&gt;style.css&lt;/code&gt; estivesse hospedado em algum servidor externo para que não haja a necessidade de se mantê-lo na mesma máquina onde os projetos estão sendo desenvolvidos.&lt;/p&gt;

&lt;p&gt;Algo baste útil seria manter um repositório no GitHub, ou em outra plataforma de manejo de repositórios &lt;code&gt;git&lt;/code&gt;, como Codeberg ou Gitlab, contendo todos os arquivos &lt;code&gt;.css&lt;/code&gt; a serem utilizados. Neste caso, poderíamos manter os arquivos organizados por versões e, quando necessitássemos de um deles, bastaria fazer um import como acima para sua correspondente url.&lt;/p&gt;

&lt;p&gt;A questão é: &lt;em&gt;qual url utilizar?&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A tentativa mais óbvia seria a url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/user/repo/path/to/style.css`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;onde &lt;code&gt;path/to/style.css&lt;/code&gt; é o caminho relativo ao repositório &lt;code&gt;repo&lt;/code&gt;. No entanto, esta não é uma url válida. &lt;/p&gt;

&lt;p&gt;Ao visitar o repositório pela plataforma (digamos o GitHub) e clicar  no arquivo &lt;code&gt;style.css&lt;/code&gt;, observa-se que a url indicada está no formato&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/user/repo/blob/branch/path/to/style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contudo, essa url não expõe o arquivo. Poderíamos, então, pensar na url que apresenta a versão &lt;code&gt;raw&lt;/code&gt; de &lt;code&gt;style.css&lt;/code&gt;, a qual é da forma&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://raw.githubusercontent.com/user/repo/branch/path/to/style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas essa url expõe o &lt;em&gt;conteúdo&lt;/em&gt; do arquivo &lt;code&gt;style.css&lt;/code&gt;, e não o arquivo em si.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Poxa vida, como proceder?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Abordagem 1
&lt;/h1&gt;

&lt;p&gt;Uma abordagem seria pegar o conteúdo exposto na url &lt;code&gt;raw&lt;/code&gt; e incorporá-lo dentro da tag &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; do projeto no qual se deseja utilizar &lt;code&gt;style.css&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso pode ser feito, por exemplo, adicionando o seguinte trecho dentro da tag &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; no &lt;code&gt;index.html&lt;/code&gt; do projeto (veja &lt;a href="https://stackoverflow.com/a/63621260"&gt;aqui&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;xhttp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XMLHttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://raw.githubusercontent.com/user/repo/branch/path/to/style.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onreadystatechange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readyState&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;style&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responseText&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;head&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;xhttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Caramba, mas não há uma forma mais direta de expor os arquivos &lt;code&gt;.css&lt;/code&gt;?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Abordagem 2
&lt;/h1&gt;

&lt;p&gt;Se a sua plataforma admite a criação de páginas estáticas (&lt;a href="https://docs.github.com/pt/pages"&gt;GitHub Pages&lt;/a&gt;, &lt;a href="https://docs.codeberg.org/codeberg-pages/"&gt;Codeberg Pages&lt;/a&gt; ou &lt;a href="https://docs.gitlab.com/ee/user/project/pages/"&gt;Gitlab Pages&lt;/a&gt;, por exemplo), então há uma forma imediata de expor arquivos em repositórios. A saber, &lt;em&gt;transformando os repositórios em uma página estática&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Eu gosto muito do Codeberg para a hospedagem de sites estáticos. De fato, lá é muito simples: &lt;em&gt;todos os repositórios podem ser vistos, por padrão, como sites estáticos&lt;/em&gt;. Com efeito, ao invés de utilizar a url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://codeberg.org/user/repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;basta utilizar a url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://user.codeberg.page/repo/@branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, o arquivo &lt;code&gt;style.css&lt;/code&gt; ficaria automaticamente exposto na url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://user.codeberg.page/repo/@branch/path/to/style.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e bastaria importá-la no projeto desejado em uma tag &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;, como comentado no início do post.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;A depender da plataforma, algumas configurações são necessárias para transformar um repositório em um site estático. Além disso, a url para acessar as páginas do site podem variar. No entanto, no fundo o processo é o mesmo.&lt;/p&gt;

&lt;p&gt;Outra alternativa seria colocar seus arquivos &lt;code&gt;.css&lt;/code&gt; num S3 Bucket na AWS ou em algum serviço similar em outros serviços de nuvem, que fornecem uma cota gratuita. Contudo, nessa abordagem perde-se a praticidade de se trabalhar com um repositório versionado.&lt;/p&gt;

&lt;p&gt;Até mais,&lt;br&gt;
Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>github</category>
      <category>codeberg</category>
    </item>
    <item>
      <title>berg: um CLI para Codeberg</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Sun, 01 Oct 2023 16:42:13 +0000</pubDate>
      <link>https://dev.to/yxm/berg-um-cli-para-codeberg-13ci</link>
      <guid>https://dev.to/yxm/berg-um-cli-para-codeberg-13ci</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Em um &lt;a href="https://dev.to/yxm/codeberg-uma-alternativa-open-source-e-gratuita-ao-github-e-gitlab-b80"&gt;post anterior&lt;/a&gt; apresentei a vocês o &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt;: uma alternativa gratuita e Open-Source ao Github e ao Gitlab.&lt;/p&gt;

&lt;p&gt;Sou adepto a usar o terminal sempre que possível. Dito isso, algo que me incomodava um pouco era o fato de que Github e Gitlab oferecem ferramentas CLI oficiais (&lt;a href="https://github.com/cli/cli"&gt;gh&lt;/a&gt; e &lt;a href="https://gitlab.com/gitlab-org/cli"&gt;glab&lt;/a&gt;, respectivamente) para a configuração de repositórios, merges, etc. O Codeberg não fornece uma CLI, de modo que sempre que precisava criar, deletar ou editar a descrição de repositório, por exemplo, tinha que acessar via browser. Nada muito sério, só uma inconveniência.&lt;/p&gt;

&lt;p&gt;Pois encontrei &lt;a href="https://codeberg.org/RobWalt/codeberg-cli"&gt;berg&lt;/a&gt;: uma CLI para o Codeberg que se propõe a ser uma solução similar ao &lt;code&gt;gh&lt;/code&gt; e ao &lt;code&gt;glab&lt;/code&gt;. A CLI não é oficial, mas cumpre bem com seu papel (veja observação no fim do post). &lt;/p&gt;

&lt;p&gt;Neste post descrevo brevemente como instalar e utilizar &lt;code&gt;berg&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalação
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;berg&lt;/code&gt; é escrito em &lt;code&gt;Rust&lt;/code&gt;, de modo que o primeiro passo é instalar &lt;code&gt;Rust&lt;/code&gt; e seu gerenciador de pacotes e builder &lt;code&gt;cargo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://sh.rustup.rs &lt;span class="nt"&gt;-sSf&lt;/span&gt; | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, o seguinte código será adicionado em seu &lt;code&gt;.bashrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cargo/env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cabe notar que em &lt;code&gt;Bash&lt;/code&gt; o ponto &lt;code&gt;.&lt;/code&gt; é um alias para o builtin &lt;code&gt;source&lt;/code&gt;. Se você utiliza &lt;code&gt;.&lt;/code&gt; em outras aplicações (como é o meu caso), para que não haja problemas altere a linha acima para&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cargo/env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora clone o repositório do &lt;code&gt;berg&lt;/code&gt; e o instale com &lt;code&gt;cargo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://codeberg.org/RobWalt/codeberg-cli
&lt;span class="nb"&gt;cd &lt;/span&gt;codeberg-cli
cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Autorização
&lt;/h1&gt;

&lt;p&gt;Depois de instalado, autorize o uso de &lt;code&gt;berg&lt;/code&gt; em sua conta do Codeberg com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;berg auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prossiga com um &lt;code&gt;y&lt;/code&gt; e você será redirecionado para sua conta do Codeberg. Gere um token adicionando um nome e as permissões que você deseja. Copie o token e cole no terminal onde executou o comando anterior. &lt;/p&gt;

&lt;p&gt;Pronto! Agora você já pode utilizar o &lt;code&gt;berg&lt;/code&gt; com as permissões criadas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Utilização
&lt;/h1&gt;

&lt;p&gt;Dê um &lt;code&gt;berg -h&lt;/code&gt; para ver as opções disponíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usage: berg [COMMAND]

Commands:
  auth          Authentication subcommands
  user          User subcommands
  issue         Issue subcommands
  pull          Pull request subcommands
  label         Label subcommands
  repo          Repository subcommands
  milestone     Milestone subcommands
  notification  
  completion    Print completion script
  help          Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help (see more with '--help')
  -V, --version  Print version

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

&lt;/div&gt;



&lt;p&gt;Por exemplo, se quiser criar um repositório, execute &lt;code&gt;berg repo create&lt;/code&gt; e siga as instruções.&lt;/p&gt;

&lt;p&gt;Para mais detalhes sobre um dada opção ou comando, execute &lt;code&gt;berg [option] --help&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OBS:&lt;/strong&gt; uma pena é que com &lt;code&gt;berg&lt;/code&gt; não se pode deletar repositórios, algo que pode ser feito diretamente com &lt;code&gt;gh&lt;/code&gt;, por exemplo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;É isso. Com &lt;code&gt;berg&lt;/code&gt; o Codeberg se torna uma alternativa ainda mais viável ao manejo de pequenos projetos. Codeberg ainda não fornece (e ao que pude entender nem se propõe a tal) ferramentas CI/CD, de modo que o manejo de grandes projetos ainda é bastante limitado.&lt;/p&gt;

&lt;p&gt;Um abraço e até mais.&lt;/p&gt;

&lt;p&gt;Yuri Ximenes Martins&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>cli</category>
      <category>codeberg</category>
      <category>rust</category>
    </item>
    <item>
      <title>Como mudar para o cwd do Netrw ao sair do Vim?</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Thu, 21 Sep 2023 22:42:12 +0000</pubDate>
      <link>https://dev.to/yxm/como-mudar-para-o-cwd-do-netrw-ao-sair-do-vim-ko0</link>
      <guid>https://dev.to/yxm/como-mudar-para-o-cwd-do-netrw-ao-sair-do-vim-ko0</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Eu gosto de estruturas minimalistas, e esse é um dos motivos pelos quais eu utilizo &lt;code&gt;Vim&lt;/code&gt; como meu editor de texto. Desde a versão 5.5, o &lt;code&gt;Vim&lt;/code&gt; vem de fábrica com um plugin que permite navegar no terminal através de arquivos e pastas de maneira visual e sem precisar ficar dando &lt;code&gt;cd&lt;/code&gt; e &lt;code&gt;ls&lt;/code&gt; toda hora. Trata-se do &lt;a href="https://github.com/vim-scripts/netrw.vim"&gt;Netrw&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Muita gente não o utiliza, sendo o &lt;a href="https://github.com/preservim/nerdtree"&gt;Nerdtree&lt;/a&gt; seu principal substituto. Uma das desvantagens do &lt;code&gt;Netrw&lt;/code&gt; é que, para que funcione de maneira aceitável, um punhado de configurações são necessárias. No entanto, seguindo a filosofia do minimalismo, não vejo nisso argumento forte o suficiente para instalar um plugin a mais.&lt;/p&gt;

&lt;p&gt;Em momento oportuno farei uma publicação sobre minhas configurações para o &lt;code&gt;Netrw&lt;/code&gt;. Hoje, no entanto, gostaria de trazer a solução de um problema que me \ ,incomodava há algum tempo.&lt;/p&gt;

&lt;h1&gt;
  
  
  O Problema
&lt;/h1&gt;

&lt;p&gt;Suponhamos que você abriu seu &lt;code&gt;Netrw&lt;/code&gt; e começou a navegar por diretórios &lt;em&gt;dentro do &lt;code&gt;Vim&lt;/code&gt;&lt;/em&gt;. Rapidamente você sai de um diretório &lt;code&gt;A&lt;/code&gt; e chega em um diretório distante &lt;code&gt;B&lt;/code&gt;. Suponhamos, agora, que você quer executar algum comando de &lt;code&gt;Bash&lt;/code&gt; (digamos &lt;code&gt;cmd_Bash&lt;/code&gt;) estando no diretório &lt;code&gt;B&lt;/code&gt;. Utilizando  apenas de um  ferramental builtin, tem-se algumas opções:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;executar &lt;code&gt;:shell&lt;/code&gt; no &lt;code&gt;Vim&lt;/code&gt; para abrir um prompt, o qual iniciará no diretório &lt;code&gt;B&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;executar &lt;code&gt;:! cd path/to/B | cmd_Bash&lt;/code&gt; no &lt;code&gt;Vim&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suponha, ainda, que você já não mais precisa do &lt;code&gt;Vim&lt;/code&gt; e quer fazer coisas no terminal no entorno do diretório &lt;code&gt;B&lt;/code&gt;. Nesse caso, você sairá do &lt;code&gt;Vim&lt;/code&gt;. Seria muito interessante se o seu working directory do terminal estivesse sincronizado com o working directory do &lt;code&gt;Netrw&lt;/code&gt;. Pois, assim, ao fechar o &lt;code&gt;Netrw&lt;/code&gt; no diretório &lt;code&gt;B&lt;/code&gt; seu terminal estaria já posicionado ali.&lt;/p&gt;

&lt;p&gt;O problema é que, no entanto, tal sincronização não existe: &lt;em&gt;alterações em buffers do &lt;code&gt;Vim&lt;/code&gt; só se aplicam ao &lt;code&gt;Vim&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Solução Errada
&lt;/h1&gt;

&lt;p&gt;A estratégia imediata de solução ao problema seria a seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;definir uma variável &lt;code&gt;vim_cwd&lt;/code&gt; interna ao &lt;code&gt;Vim&lt;/code&gt; que contém o working directory do &lt;code&gt;Netrw&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;atualizar tal variável quando o buffer do &lt;code&gt;Netrw&lt;/code&gt; é fechado;&lt;/li&gt;
&lt;li&gt;associar &lt;code&gt;vim_cwd&lt;/code&gt; uma variável &lt;code&gt;bash_cwd&lt;/code&gt; em &lt;code&gt;Bash&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;configurar o &lt;code&gt;Vim&lt;/code&gt; para que, ao ser fechado, seja executado o comando &lt;code&gt;cd $bash_cwd&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As etapas 1. e 2. são tranquilas, como segue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa 1
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;Netrw&lt;/code&gt; o símbolo &lt;code&gt;%&lt;/code&gt; representa o arquivo em uso, &lt;code&gt;p&lt;/code&gt; representa "tomar o full path de", ao passo que &lt;code&gt;h&lt;/code&gt; representa "pegar o diretório de". Assim, pode-se obter o diretório de um arquivo aberto através de &lt;code&gt;expand('%:p:h')&lt;/code&gt;. Em um buffer do &lt;code&gt;Netrw&lt;/code&gt; isso se refere exatamente ao working directory. Para salvá-lo em uma variável global &lt;code&gt;vim_cwd&lt;/code&gt;,  basta um&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%:p:h'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Etapa 2
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;Vim&lt;/code&gt; pode-se executar comandos internos ao se fechar um buffer adicionando-os como&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;BufDelete&lt;/span&gt; * your_command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para se restringir a um dado buffer, concatena-se com um &lt;code&gt;if &amp;amp;ft ==# 'your_buffer'&lt;/code&gt;. No nosso caso, o buffer é &lt;code&gt;netrw&lt;/code&gt;, de modo que ficamos com&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;BufDelete&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'netrw'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; your_command &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aplicando à situação particular da etapa anterior, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;BufDelete&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'netrw'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%:p:h'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Etapa 4
&lt;/h2&gt;

&lt;p&gt;Assim como existe uma maneira de executar comandos internos ao &lt;code&gt;Vim&lt;/code&gt; quando buffers são fechados, pode-se executá-los quando o próprio &lt;code&gt;Vim&lt;/code&gt; é fechado. A sintaxe é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;VimLeave&lt;/span&gt; * your_command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por outro lado, pode-se executar comandos de &lt;code&gt;Bash&lt;/code&gt; como comandos de &lt;code&gt;Vim&lt;/code&gt; através de &lt;code&gt;execute '!your_bash_command'&lt;/code&gt;. Portanto, o seguinte código executa um comando em &lt;code&gt;Bash&lt;/code&gt; ao se fechar o &lt;code&gt;Vim&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;VimLeave&lt;/span&gt; * &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!your_bash_command'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Etapa 3
&lt;/h2&gt;

&lt;p&gt;É no ato de transformar uma variável interna ao &lt;code&gt;Vim&lt;/code&gt; em uma variável de &lt;code&gt;Bash&lt;/code&gt; (etapa 3) que a estratégia anterior falha. Até onde vai meu conhecimento, não existe uma maneira de se fazer isso diretamente dentro do &lt;code&gt;Vim&lt;/code&gt; sem se recorrer a um script de &lt;code&gt;Bash&lt;/code&gt;. &lt;/p&gt;

&lt;h1&gt;
  
  
  A solução Correta
&lt;/h1&gt;

&lt;p&gt;Como contornar a situação? Ao invés de transformar diretamente uma variável &lt;code&gt;vim_cwd&lt;/code&gt; do &lt;code&gt;Vim&lt;/code&gt; em uma variável &lt;code&gt;bash_cwd&lt;/code&gt; do &lt;code&gt;Bash&lt;/code&gt;, podemos fazer isso em passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;escrever o valor da variável &lt;code&gt;vim_cwd&lt;/code&gt; em um arquivo;&lt;/li&gt;
&lt;li&gt;ler tal arquivo em uma variável de &lt;code&gt;Bash&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Isso sim funciona, pois o &lt;code&gt;Vim&lt;/code&gt; admite uma função chamada &lt;code&gt;writefile()&lt;/code&gt; que permite exatamente a escrita de uma variável em um arquivo. Em nosso caso, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;&lt;span class="nb"&gt;writefile&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/some_file'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por sua vez, poderíamos obter &lt;code&gt;bash_cwd&lt;/code&gt; através de&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;bash_cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/some_file&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Juntando tudo, a solução ao nosso problema seria, então, dada pelo seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;BufDelete&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'netrw'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%:p:h'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;writefile&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/some_file'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
autocmd &lt;span class="nb"&gt;VimLeave&lt;/span&gt; * &lt;span class="nb"&gt;execute&lt;/span&gt; &lt;span class="s1"&gt;'!bash_cwd=$(cat /tmp/some_file) | cd $bash_cwd'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos, no entanto, mais um problema: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;o operador de substituição &lt;code&gt;$()&lt;/code&gt; não funciona muito bem ao ser executado como um comando dentro do &lt;code&gt;Vim&lt;/code&gt;!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A alternativa é pedir que o comando &lt;code&gt;cd $(cat /tmp/some_file)&lt;/code&gt; seja executado não dentro do &lt;code&gt;Vim&lt;/code&gt;, mas diretamente em &lt;code&gt;Bash&lt;/code&gt;. Isso pode ser feito redefinindo o comando &lt;code&gt;vim&lt;/code&gt; substituindo-o por uma função &lt;code&gt;vim()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;vim&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;command &lt;/span&gt;vim &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/some_file  &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;bash_cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/some_file&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$bash_cwd&lt;/span&gt;
        &lt;span class="nb"&gt;rm&lt;/span&gt; /tmp/some_file
    &lt;span class="k"&gt;else
        return
    fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Se você quer que ao fechar o &lt;code&gt;Vim&lt;/code&gt; seu terminal esteja no último diretório acessado pelo &lt;code&gt;Netrw&lt;/code&gt;, faça o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;em seu &lt;code&gt;.vim/vimrc&lt;/code&gt; adicione
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight viml"&gt;&lt;code&gt;autocmd &lt;span class="nb"&gt;BufDelete&lt;/span&gt; * &lt;span class="k"&gt;if&lt;/span&gt; &amp;amp;&lt;span class="nb"&gt;ft&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt;# &lt;span class="s1"&gt;'netrw'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%:p:h'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="nb"&gt;writefile&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;g:vim_cwd&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/some_file'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;endif&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;em seu &lt;code&gt;.bashrc&lt;/code&gt; adicione
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;vim&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nb"&gt;command &lt;/span&gt;vim &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /tmp/some_file  &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;bash_cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /tmp/some_file&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$bash_cwd&lt;/span&gt;
        &lt;span class="nb"&gt;rm&lt;/span&gt; /tmp/some_file
    &lt;span class="k"&gt;else
        return
    fi&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>vim</category>
      <category>cwd</category>
      <category>netrw</category>
      <category>bash</category>
    </item>
    <item>
      <title>Linguagens e seus tipos</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Tue, 12 Sep 2023 22:47:54 +0000</pubDate>
      <link>https://dev.to/yxm/linguagens-e-seus-tipos-1l6</link>
      <guid>https://dev.to/yxm/linguagens-e-seus-tipos-1l6</guid>
      <description>&lt;h2&gt;
  
  
  Apresentação
&lt;/h2&gt;

&lt;p&gt;Linguagens são formas de &lt;em&gt;comunicação&lt;/em&gt; bem estruturadas. Grosso modo, a comunicação se dá pelo envio de informação entre indivíduos: o &lt;em&gt;emissor&lt;/em&gt; envia uma mensagem ao &lt;em&gt;receptor&lt;/em&gt; que a recebe e &lt;em&gt;processa&lt;/em&gt;. Dito isso, linguagens são formas de transmitir a informação seguindo &lt;em&gt;regras&lt;/em&gt; pré-estabelecidas. Todos os animais, de uma ou outra forma, se comunicam entre si. No entanto, o uso de linguagens (isto é, de uma comunicação estruturada) é um dos critérios que diferencia nós, humanos, dos outros animais. &lt;/p&gt;

&lt;p&gt;Na comunicação entre animais, os "indivíduos" são sempre outros animais. O homem foi capaz de criar linguagens que permitem a comunicação não somente entre humanos, mas entre indivíduos denominados de &lt;em&gt;máquinas&lt;/em&gt;. Estes, por sua vez, podem ser objetos inanimados formados de componentes físicos (como &lt;em&gt;hardwares&lt;/em&gt;), ou mesmo construções abstratas, que não necessariamente existem aqui na Terra, mas apenas enquanto ideias ou conceitos. Veja até onde fomos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;podemos falar da comunicação, de forma estruturada, entre indivíduos que não existe concretamente&lt;/em&gt;!
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tem-se diferentes tipos de linguagens, como as linguagens naturais, as linguagens de máquina, as linguagens formais e as linguagens de programação. Todas elas, no entanto, dividem diversas características, as quais discutimos em seguida.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintaxe, Gramática e Semântica
&lt;/h2&gt;

&lt;p&gt;Independentemente do seu tipo, linguagens são construções humanas. Isso significa que elas são &lt;em&gt;construídas&lt;/em&gt; a partir de blocos fundamentais seguindo-se regras bem definidas. O que muda de um tipo de linguagem para outra &lt;strong&gt;não&lt;/strong&gt; é a estrutura subjacente, mas sim a natureza dos blocos fundamentais e das regras utilizadas na construção da linguagem. De fato:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;parte-se de símbolos fundamentais, os quais definem o &lt;em&gt;alfabeto&lt;/em&gt; da linguagem;&lt;/li&gt;
&lt;li&gt;então se dita como símbolos devem ser unidos para formar palavras;&lt;/li&gt;
&lt;li&gt;e como palavras se unem para formar frases;&lt;/li&gt;
&lt;li&gt;e assim sucessivamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ao conjunto das regras que ditam como construir palavras a partir de símbolos, frases a partir de palavras, etc., dá-se o nome de &lt;em&gt;sintaxe&lt;/em&gt; da linguagem. Por sua vez, diz-se que os símbolos, as palavras e as frases propriamente ditas constituem sua &lt;em&gt;gramática&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Observemos, no entanto, que linguagens &lt;strong&gt;não&lt;/strong&gt; são meras construções. Afinal, elas possuem um objetivo claro: o da comunicação, e a comunicação só se concretiza quando a mensagem passada admite algum &lt;em&gt;significado&lt;/em&gt; para aquele que a recebeu. Muitas vezes, no entanto, uma mesma mensagem pode admitir diferentes significados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; para um mesmo receptor, dependendo do &lt;em&gt;contexto&lt;/em&gt; no qual a mensagem está inserida;&lt;/li&gt;
&lt;li&gt; para diferentes receptores, dependendo do &lt;em&gt;contexto&lt;/em&gt; no qual o receptor está inserido.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sendo assim, dependendo do &lt;em&gt;contexto&lt;/em&gt;, fala-se que uma mensagem recebe uma &lt;em&gt;interpretação&lt;/em&gt;. Às diferentes maneiras de se interpretar as construções de uma linguagem (isto é, suas palavras, frases, etc.), dá-se o nome de &lt;em&gt;semântica&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Desta forma, em poucas palavras, pode-se dizer que estudar uma linguagem consiste em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;construí-la&lt;/em&gt;, o que é feito fornecendo símbolos e uma sintaxe, a partir da qual se obtém sua &lt;em&gt;gramática&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;interpretá-la&lt;/em&gt;, que significa associar à sintaxe/gramática um significado concreto (ou abstrato - veja abaixo), o qual define sua &lt;em&gt;semântica&lt;/em&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De forma ainda mais resumida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;estuda-se uma linguagem através de sua sintaxe, gramática e semântica&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tipos de Linguagem
&lt;/h2&gt;

&lt;p&gt;Como comentamos, o que diferencia os tipos de linguagens não é a estrutura subjacente (admitir uma sintaxe, uma gramática e uma semântica), mas sim a &lt;em&gt;natureza&lt;/em&gt; daquilo que compõe sua estrutura. Uma diferença, em particular, é especialmente interessante: a natureza das regras definidas pela sintaxe para se construir a gramática. Segundo tal critério, as linguagens podem ser divididas em dois tipos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Linguagens Naturais&lt;/em&gt;. Nelas, as regras da sintaxe são definidas por convenções sociais e agrupadas naquilo se chama de &lt;em&gt;dicionários&lt;/em&gt; e &lt;em&gt;livros gramaticais&lt;/em&gt; (também chamados simplesmente de &lt;em&gt;gramáticas&lt;/em&gt;). Ao se aprender uma nova língua, olha-se em gramáticas para saber quais palavras existem, como formar frases, etc. Por sua vez, olha-se no dicionário para saber o significado social associado a cada uma dessas palavras definidas na gramática.

&lt;ul&gt;
&lt;li&gt;Português, Inglês e outras línguas definem linguagens naturais. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Linguagens Formais&lt;/em&gt;. Em contrapartida, em &lt;em&gt;linguagens formais&lt;/em&gt; as regras da sintaxe (isto é, as regras que definem como se formam palavras válidas, frases, etc.) são dadas não por convenções sociais, mas por fórmulas de alguma &lt;em&gt;lógica&lt;/em&gt;. Existem diferentes tipos de lógica e, para cada uma delas, um tipo diferentes de linguagem formal.

&lt;ul&gt;
&lt;li&gt; Linguagens utilizadas dentro da Matemática e da Computação são exemplos de linguagens formais.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lembre-se que em uma comunicação por meio de linguagens, os humanos não são os únicos indivíduos: tem-se, também, as &lt;em&gt;máquinas&lt;/em&gt;. Desta forma, pode-se classificar as linguagens também com respeito ao tipo de indivíduo envolvido na comunicação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Linguagens Humanas&lt;/em&gt;. Tratam-se, pois, daquelas utilizadas na comunicação humano-humano;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Linguagens de Máquina&lt;/em&gt;. São aquelas em que ao menos um indivíduo não é um humano, mas sim uma máquina.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Linguagens de máquina são tipicamente formais, enquanto que linguagens humanas podem ser formais ou naturais. Antes do avanço da Inteligência Artificial, linguagens naturais só eram processadas por humanos, o que as caracterizava, necessariamente, como linguagens humanas. No entanto, com a evolução do Processamento de Linguagens Naturais (&lt;a href="https://en.wikipedia.org/wiki/Natural_language_processing"&gt;Natural Language Processing&lt;/a&gt;) e com o desenvolvimento dos Modelos de Grandes Linguagens (&lt;a href="https://en.wikipedia.org/wiki/Large_language_model"&gt;Large Language Models&lt;/a&gt;), torna-se possível, ainda que de maneira limitada, a comunicação entre humanos e máquinas por meio de linguagens naturais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linguagens de Programação
&lt;/h2&gt;

&lt;p&gt;No início da texto, comentamos que "máquinas" podem ser objetos concretos, formados de componentes físicos (como hardwares) ou mesmo abstrações que, a princípio, existem apenas enquanto conceitos criados pelo homem. Um exemplo de tal diferenciação entre "máquinas concretas" e "máquinas abstratas" se dá no uso de recursos naturais: a energia em nosso universo é &lt;em&gt;finita&lt;/em&gt;. Portanto, algo criado pelo homem só pode consumir uma quantidade &lt;em&gt;finita&lt;/em&gt; de energia. &lt;/p&gt;

&lt;p&gt;Em uma &lt;em&gt;máquina concreta&lt;/em&gt;, leva-se esse ponto em consideração: seus componentes devem ser tais que consumam somente &lt;em&gt;finitos&lt;/em&gt; recursos. No imaginário humano, no entanto, podemos pensar em máquinas que não satisfazem tal premissa básica do universo. Estas, em tese, poderiam consumir recursos &lt;em&gt;indefinidamente&lt;/em&gt;. A elas dá-se o nome de &lt;em&gt;máquinas abstratas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tipicamente se dá o nome de &lt;em&gt;computador&lt;/em&gt; a uma máquina concreta. Linguagens de máquina que envolvem computadores (isto é, quando algum dos indivíduos é uma máquina concreta, cujos componentes consomem uma quantidade finita de energia) são então chamadas de &lt;em&gt;linguagens de computadores&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ao se querer enfatizar que uma linguagem de máquina envolve a comunicação de máquinas que não são necessariamente concretas (isto é, quando não se leva em consideração o consumo de energia), fala-se, então, de &lt;em&gt;linguagens de programação&lt;/em&gt;. Desta forma, linguagens de computadores são exemplos de linguagens de programação. &lt;/p&gt;

&lt;p&gt;Existem muitas outras classificações e subtipos de linguagens de programação. Por outro lado, assim como os diferentes tipos de linguagens (naturais, formais, humanas, de máquina, etc.) admitem a mesma estrutura (gramática, sintaxe e semântica), as diferentes classes de linguagens de programação possuem muitos aspectos em comum. A área de estudo que estuda tais aspectos em comum é chamada de Teoria das Linguagens de Programação (&lt;a href="https://en.wikipedia.org/wiki/Programming_language_theory"&gt;Programming Language Theory&lt;/a&gt;). Conhecer um pouco dela significa &lt;em&gt;aprender sobre&lt;/em&gt; &lt;strong&gt;&lt;em&gt;todas&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;as linguagens de programação ao mesmo tempo&lt;/em&gt;!&lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>language</category>
      <category>study</category>
      <category>llm</category>
      <category>syntax</category>
    </item>
    <item>
      <title>Por que estudar teoria?</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Thu, 03 Aug 2023 22:59:29 +0000</pubDate>
      <link>https://dev.to/yxm/por-que-estudar-teoria-5ajd</link>
      <guid>https://dev.to/yxm/por-que-estudar-teoria-5ajd</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Oi. &lt;/p&gt;

&lt;p&gt;Essa é a primeira postagem da coluna &lt;em&gt;Theoretical Insights&lt;/em&gt;. Nela pretendo apresentar, de maneira intuitiva e menos formal, alguns aspectos teóricos ligados à programação. Ao longo de vários artigos, responderemos perguntas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o que, de fato, define uma linguagem de programação?&lt;/li&gt;
&lt;li&gt;como funciona o processo de compilação?&lt;/li&gt;
&lt;li&gt;o que são algoritmos?&lt;/li&gt;
&lt;li&gt;o que é uma máquina?&lt;/li&gt;
&lt;li&gt;como funcionam os computadores?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;por que um desenvolvedor de software deveria fazer algo para além de resolver problemas concretos e de estudar novas tecnologias?&lt;/li&gt;
&lt;li&gt;por que dedicar parte de seu tempo tentando compreender aspectos teóricos que, no dia a dia, aparentam ser irrelevantes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inicio esta coluna apresentando alguns argumentos que corroboram para a tese de que, na verdade, ter uma boa bagagem teórica pode implicar diretamente em uma melhor performance como desenvolvedor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Independência da Linguagem
&lt;/h2&gt;

&lt;p&gt;Desenvolvedores se especializam em linguagens de programação, o que faz com que consigam refletir de maneira bastante intrincada em sua linguagem de especialização. No entanto, diferentes linguagens são construídas com diferentes propósitos e, dependendo da situação, seria mais interessantes construir algo em uma linguagem distinta daquela na qual se está habituado. Como proceder?&lt;/p&gt;

&lt;p&gt;Linguagens de programação implementam algoritmos. Uma linguagem é dita ser &lt;em&gt;completa&lt;/em&gt; (&lt;a href="https://en.wikipedia.org/wiki/Turing_completeness"&gt;Turing complete&lt;/a&gt;) se é capaz de implementar todos os algoritmos realizáveis em um computador moderno (isto é, em uma &lt;a href="https://en.wikipedia.org/wiki/Turing_machine"&gt;Turing machine&lt;/a&gt;). Fato é que as linguagens de programação de alto nível e mais utilizadas no meio corporativo, como &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;C++&lt;/code&gt;, &lt;code&gt;Java&lt;/code&gt;, &lt;code&gt;C#&lt;/code&gt;, &lt;code&gt;JavaScript&lt;/code&gt;, &lt;code&gt;Python&lt;/code&gt;, &lt;code&gt;Go&lt;/code&gt;, &lt;code&gt;Ruby&lt;/code&gt;, &lt;code&gt;Rust&lt;/code&gt;, etc., são completas. Isso significa que, em termos da capacidade de implementar algoritmos, todas elas cumprem o mesmo papel. Isso também significa que existe uma maneira de se pensar e construir soluções que é independente da linguagem de programação a ser utilizada. A saber, através de &lt;em&gt;algoritmos&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conclusão.&lt;/strong&gt; &lt;em&gt;Entender melhor o que é uma linguagem de programação e o que são algoritmos nos permite desenvolver a capacidade de resolver problemas que independam de uma dada linguagem de programação.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Otimização
&lt;/h2&gt;

&lt;p&gt;Ao se trabalhar com desenvolvimento de software, lida-se, diariamente, com a construção de soluções para problemas. Às vezes não paramos para pensar, mas um mesmo problema pode admitir diferentes soluções. Julgo que uma das características que demonstram a senioriedade de um desenvolvedor é conseguir olhar para o leque de possíveis soluções de um dado problema e saber decidir, baseado em critérios previamente estabelecidos, qual a solução é a mais adequada. Mas, como fazer isso de maneira sistemática?&lt;/p&gt;

&lt;p&gt;Escolher &lt;em&gt;a melhor&lt;/em&gt; dentre um conjunto de possibilidades é um problema de &lt;em&gt;otimização&lt;/em&gt;. Como comentado, linguagens de programação implementam algoritmos. Fato é que existem áreas de estudo devotadas ao problema de análise e otimização de algoritmos, como a &lt;em&gt;Teoria da Complexidade Computacional&lt;/em&gt; (&lt;a href="https://en.wikipedia.org/wiki/Computational_complexity_theory"&gt;Computational Complexity Theory&lt;/a&gt;) e a &lt;em&gt;Análise de Algoritmos&lt;/em&gt; (&lt;a href="https://en.wikipedia.org/wiki/Analysis_of_algorithms"&gt;Analysis of Algorithms&lt;/a&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conclusão.&lt;/strong&gt; &lt;em&gt;Estudar sobre a teoria dos algoritmos nos dá critérios objetivos para decidir, dentre uma gama de possíveis soluções, qual é que melhor se adapta a uma dada demanda&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Inovação
&lt;/h2&gt;

&lt;p&gt;Para pensar em buscar pela solução otimizada, precisa-se, antes, conhecer o leque de possíveis soluções. Algumas soluções tendem a ser mais óbvias que outras e, não raro, a solução mais adequada é altamente não-trivial. Ser não-trivial é ser inesperado, e ser inesperado é ser inovador. Ao se trabalhar mergulhado em uma linguagem de programação específica, tende-se a construir soluções que mais se adequam aos objetivos e características da própria linguagem, o que naturalmente diminui o leque de possíveis soluções a serem observadas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conclusão.&lt;/strong&gt; &lt;em&gt;Se desprender de uma dada linguagem e pensar de forma mais abstrata abre horizontes e possibilita a construção de soluções inovadoras.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Visão Panorâmica
&lt;/h2&gt;

&lt;p&gt;Tornando-se especialista, dá-se um zoom em toda a gama de conhecimentos e passa-se a concentrar em assuntos restritos e a assuntos fortemente relacionados a eles. Ao se estudar aspectos teóricos e fundamentalistas, diminui-se um pouco esse zoom, permitindo uma observação mais panorâmica dos problemas extremamente especializados que se estava lidando. Uma visão mais abrangente é menos enviesada e permite, por exemplo, observar conexões entre assuntos e problemas que antes não se via. Talvez a solução que se busca já exista, mas seja adaptada a um problema em um tópico ligeiramente distante, o qual não poderia ser observado em um zoom muito grande.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Conclusão.&lt;/strong&gt; &lt;em&gt;Estudar teoria fornece uma visão abrangente, a qual possibilita a adaptação de soluções já existentes para problemas de outras áreas.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Não-Linearidade do Aprendizado
&lt;/h2&gt;

&lt;p&gt;Por fim, gostaria de dizer que, diferentemente do que é exposto em livros técnicos e na estrutura de cursos de graduação, o aprendizado não se dá de forma linear. Existe um campo devoto ao estudo da construção do conhecimento, chamado de &lt;a href="https://pt.wikipedia.org/wiki/Epistemologia"&gt;Epistemologia&lt;/a&gt;, o qual se origina na Filosofia e se intersecta com outras áreas como a Psicologia. &lt;/p&gt;

&lt;p&gt;Uma das questões epistemológicas é como se dá o aprendizado. Existem diversas teorias e vários modelos educacionais associadas a elas. Uma delas, pela a qual tenho grande apreço, é a &lt;em&gt;Teoria do Aprendizado por Descobertas&lt;/em&gt;, de Jerome Bruner (&lt;a href="https://en.wikipedia.org/wiki/Discovery_learning"&gt;Discovery Learning&lt;/a&gt;, em inglês), cujo modelo educacional é não-linear baseado em um formato espiral. Nele, não se torna especialista em algo, para então se tornar especialista em outro algo, e assim sucessivamente (perspectiva linear). Ao contrário, aprende-se de maneira efetiva tendo uma visão inicialmente rudimentar do todo (primeira volta da espiral), e então revendo o todo com maior profundidade e abstração (segunda volta da espiral), e assim por diante.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--il_fN_gg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/SXp1KcA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--il_fN_gg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/SXp1KcA.png" alt="linear vs espiral" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em outras palavras, segundo esta perspectiva, uma aprendizagem efetiva é obtida partindo-se de uma visão generalista, e então retomando os diferentes assuntos por diversas vezes, cada vez com maior compreensão e profundidade.&lt;/p&gt;

&lt;p&gt;Estudar aspectos teóricos e fundamentalistas é ir exatamente na direção de construir essa espiral do aprendizado, e as experiências e vivências adquiridas em cada volta certamente darão uma maior amplitude no momento de atacar um problema específico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fim
&lt;/h2&gt;

&lt;p&gt;Fica a minha mensagem. &lt;/p&gt;

&lt;p&gt;Espero ter transmitido a ideia de que ao se descer do mundo dos códigos especializados e estudar um pouco de teoria, tem-se a possibilidade de obter ferramentas poderosas que o tornarão um profissional capaz de pensar fora da caixa, propor soluções otimizadas e ideias inovadoras. Pode parecer perda de tempo, mas é um investimento.&lt;/p&gt;

&lt;p&gt;Obviamente não estou dizendo que aprender habilidades técnicas especializadas não é útil ou necessário. Pelo contrário: digo que aliar o conhecimento técnico ao teórico tem o potencial de ampliar suas capacidades e seu desempenho enquanto desenvolvedor. &lt;/p&gt;

&lt;p&gt;No entanto, sinta-se à vontade para discordar do meu ponto de vista e contribuir nos comentários com suas vivências.&lt;/p&gt;

&lt;p&gt;Um abraço e até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>theory</category>
      <category>study</category>
      <category>programming</category>
      <category>thinking</category>
    </item>
    <item>
      <title>devto-cli: sincronizando um repositório do GitHub com suas publicações do dev.to</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Sat, 29 Jul 2023 00:42:16 +0000</pubDate>
      <link>https://dev.to/yxm/devto-cli-sincronizando-um-repositorio-do-github-com-suas-publicacoes-do-devto-4na7</link>
      <guid>https://dev.to/yxm/devto-cli-sincronizando-um-repositorio-do-github-com-suas-publicacoes-do-devto-4na7</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Gosto de escrever e de compartilhar minhas ideias; gosto de tornar intuitivo aquilo que é tido como complexo. Ao longo da última década, escrevi livros, artigos científicos e notas de aula para cursos que ministrei em diversos tópicos da Física e da Matemática. No entanto, estando agora mais interessado em Desenvolvimento de Software, me vi na posição de buscar produzir e divulgar conteúdo em um novo formato.&lt;/p&gt;

&lt;p&gt;Em contrapartida, gosto de fazer tudo o que puder no terminal e, quando possível, trabalhar com ferramentas CLI ao invés de TUI ou GUI. Há um peso estético, confesso. No entanto, CLIs permitem automação de processos, o que facilita a vida. Além disso, ao trabalhar localmente posso me dar ao luxo de utilizar de todas as configurações e customizações que fiz em meu computador para melhor se adaptarem as minhas necessidades. Isso, para mim, é qualidade de vida!&lt;/p&gt;

&lt;p&gt;Ao meu ver, o ideal seria poder escrever os conteúdos localmente, em arquivos &lt;code&gt;.md&lt;/code&gt;, para então publicá-los em plataformas de divulgação através de alguma ferramenta CLI. Além da comodidade de escrever em Markdown, isso permitiria facilmente reutilizar posts e automatizar sua publicação. Naturalmente, a construção de uma tal CLI depende da disponibilização por parte da plataforma de uma API versátil o suficiente.&lt;/p&gt;

&lt;p&gt;Inicialmente cheguei a tentar me adaptar a publicar conteúdos no &lt;a href="https://linkedin/in/yxmartins"&gt;Linkedin&lt;/a&gt;, mas o fato de ter de preparar cada post especificamente para lá me fez repensar se realmente vale o esforço. Infelizmente, o Linkedin não fornece uma API oficial para criação e edição de postagens para usuários quaisquer (apenas para páginas vinculadas a alguma empresa - veja &lt;a href="https://www.linkedin.com/developers/apps/new?src=re-other&amp;amp;veh=learn.microsoft.com%7Cre-other"&gt;aqui&lt;/a&gt;), o que inviabiliza a construção de CLI com as características desejadas (para uma CLI não oficial, baseada na API restrita fornecida pelo Linkedin, veja &lt;a href="https://github.com/tigillo/linkedin-cli"&gt;tigillo/linkedin-cli&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Foi então que descobri que a plataforma &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; oferece uma API rica e, para minha surpresa, uma ferramenta CLI que já funciona muito bem: &lt;a href="https://github.com/sinedied/devto-cli"&gt;sinedied/devto-cli&lt;/a&gt;! Por conta disso, decidi concentrar aqui a minha criação de conteúdo sobre Desenvolvimento de Software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como tudo funciona
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/sinedied/devto-cli"&gt;sinedied/devto-cli&lt;/a&gt; é uma aplicação escrita em &lt;code&gt;Node.js&lt;/code&gt; que permite a sincronização de um repositório local de arquivos &lt;code&gt;.md&lt;/code&gt; com o conjunto de publicações de um perfil na plataforma &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;. A sincronização se dá por intermédio da criação de um repositório no GitHub, conectado ao repositório local, o qual contém uma workflow que a cada novo commit criado pela CLI executa a GitHub Action &lt;a href="https://github.com/sinedied/publish-devto"&gt;sinedied/publish-devto&lt;/a&gt;. Esta, por sua vez, ativa a API que, por meio dos metadados contidos na frontmatter dos arquivos &lt;code&gt;.md&lt;/code&gt;, os faz corresponder às publicações no &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração
&lt;/h2&gt;

&lt;p&gt;Descrevo o passo a passo da configuração do &lt;a href="https://github.com/sinedied/devto-cli"&gt;sinedied/devto-cli&lt;/a&gt; no caso de um sistema operacional que utiliza &lt;code&gt;Bash&lt;/code&gt; como shell:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;instale &lt;a href="https://github.com/sinedied/devto-cli"&gt;sinedied/devto-cli&lt;/a&gt; por meio do &lt;code&gt;npm&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @sinedied/devto-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;logado em sua conta do &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;, acesse &lt;a href="https://dev.to/settings/extensions"&gt;dev.to/settings/extensions&lt;/a&gt;. No final da página, gere uma API.
&lt;/li&gt;
&lt;li&gt;crie um repositório no seu GitHub, o qual servirá para intermediar o processo. Por exemplo, o meu é &lt;a href="https://github.com/yxm-dev/dev.to"&gt;yxm-dev/dev.to&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;acesse seu repositório e vá em &lt;code&gt;Settings &amp;gt; Secrets and variables &amp;gt; Actions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;adicione uma nova key com o nome &lt;code&gt;DEVTO_TOKEN&lt;/code&gt; e com conteúdo dada por sua API obtida no passo 2.&lt;/li&gt;
&lt;li&gt;crie um diretório local, digamos &lt;code&gt;dir/&lt;/code&gt;, acesse-o e dê um &lt;code&gt;dev init&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nb"&gt;cd dir
    &lt;/span&gt;dev init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;complete com o nome do repositório do GitHub criado na etapa 3 e com o branch que você irá utilizar.&lt;/li&gt;
&lt;li&gt;dentro de &lt;code&gt;dir/&lt;/code&gt; crie um arquivo &lt;code&gt;.env&lt;/code&gt; e adicione o repositório, o branch e a API:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nb"&gt;touch&lt;/span&gt; .env
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"DEVTO_TOKEN=sua_API"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"DEVTO_REPO=seu_usuario/seu_repositorio"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"DEVTO_BRANCH=seu_branch"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;por segurança, crie um &lt;code&gt;.gitignore&lt;/code&gt; e adicione o arquivo &lt;code&gt;.env&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nb"&gt;touch&lt;/span&gt; .gitignore
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;crie um remote para seu repositório do GitHub:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    git remote add seu_remote ssh://git@github.com/seu_usuario/seu_repositorio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;push para o repositório no GitHub:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    git add &lt;span class="nb"&gt;.&lt;/span&gt;
    git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"..."&lt;/span&gt;
    git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilizando
&lt;/h2&gt;

&lt;p&gt;A utilização básica é bem simples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;dentro de &lt;code&gt;dir/&lt;/code&gt; há um sub-diretório &lt;code&gt;dir/posts/&lt;/code&gt;. É aqui que seus arquivos &lt;code&gt;.md&lt;/code&gt; serão criados&lt;/li&gt;
&lt;li&gt;para criar um arquivo &lt;code&gt;.md&lt;/code&gt; pré-configurado, execute &lt;code&gt;dev new nome_post&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;complete os metadados na frontmatter. Se quiser que o post seja publicado, coloque &lt;code&gt;published: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;para publicar as postagens, em &lt;code&gt;dir/&lt;/code&gt; execute &lt;code&gt;dev push -e&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;OBS: somente os arquivos &lt;code&gt;.md&lt;/code&gt; que estiverem dentro de &lt;code&gt;dir/posts/&lt;/code&gt; serão publicados
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;se quiser ver o status de suas postagens, execute &lt;code&gt;dev stats&lt;/code&gt; em &lt;code&gt;dir/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mantendo as Postagens no GitHub
&lt;/h2&gt;

&lt;p&gt;Em minha humilde opinião, existe uma pequeno defeito na construção utilizada pelo &lt;a href="https://github.com/sinedied/devto-cli"&gt;sinedied/devto-cli&lt;/a&gt;. Ao se executar &lt;code&gt;dev push -e&lt;/code&gt;, as postagens passam pelo GitHub, mas não ficam por lá! Você poderia pensar em dar um &lt;code&gt;git push&lt;/code&gt;. Mas, neste caso, para cada novo commit, ao invés dos posts já publicados no &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; serem atualizados, eles são duplicados! &lt;/p&gt;

&lt;p&gt;Para remediar o problema e automatizar o processo de publicação, criei uma função &lt;code&gt;devp&lt;/code&gt;, a qual copia os arquivos de &lt;code&gt;dir/posts/&lt;/code&gt; para um outro diretório &lt;code&gt;dir/files/&lt;/code&gt;. Para implementá-la, faça o seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;adicione &lt;code&gt;posts/*&lt;/code&gt; em &lt;code&gt;dir/.gitignore&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"posts/*"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt;/.gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;em seu arquivo &lt;code&gt;~/.bashrc&lt;/code&gt;, adicione o seguinte:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="k"&gt;function &lt;/span&gt;devp&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nb"&gt;cd dir&lt;/span&gt;/
        &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; posts/&lt;span class="k"&gt;*&lt;/span&gt; files/
        git add &lt;span class="nb"&gt;.&lt;/span&gt;
        git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"..."&lt;/span&gt;
        git push &lt;span class="nt"&gt;-q&lt;/span&gt; dev.to master
        dev p &lt;span class="nt"&gt;-e&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Pronto! Agora basta executar &lt;code&gt;devp&lt;/code&gt; para publicar seus artigos no &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; e, ao mesmo tempo, mantê-los em seu repositório do GitHub.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Até mais,&lt;br&gt;
Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>automation</category>
      <category>cli</category>
      <category>node</category>
    </item>
    <item>
      <title>Codeberg: uma alternativa Open Source e gratuita ao GitHub e GitLab</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Fri, 28 Jul 2023 22:10:15 +0000</pubDate>
      <link>https://dev.to/yxm/codeberg-uma-alternativa-open-source-e-gratuita-ao-github-e-gitlab-b80</link>
      <guid>https://dev.to/yxm/codeberg-uma-alternativa-open-source-e-gratuita-ao-github-e-gitlab-b80</guid>
      <description>&lt;p&gt;Oi.&lt;/p&gt;

&lt;p&gt;Vocês conhecem o &lt;a href="https://codeberg.org"&gt;codeberg.org&lt;/a&gt;? Trata-se de uma plataforma Open Source e gratuita, baseada no &lt;a href="https://about.gitea.com/"&gt;GiTea&lt;/a&gt; e mantida por meio de doações. O foco é em FOSS (Free and Open Source Software) e, para repositórios públicos, não há um limite predefinido de tamanho.&lt;/p&gt;

&lt;p&gt;Em suas próprias palavras:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The mission of Codeberg e.V. is to build and maintain a free collaboration platform for creating, archiving, and preserving code and to document its development process.&lt;br&gt;
(...)&lt;br&gt;
Dependencies on commercial, external, or proprietary services for the operation of the platform are avoided, in order to guarantee independence and reliability."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Diferentemente do &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; e do &lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt;, o objetivo não é fornecer ferramentas adicionais, como de CI/CD. O &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; também não oferece, ainda, uma alternativa CLI. No entanto, lá você conta com o que é necessário para a hospedagem e manutenção de um projeto, como a criação de páginas estáticas via o &lt;a href="https://docs.codeberg.org/codeberg-pages/"&gt;Codeberg Pages&lt;/a&gt;, de wikis, e muito mais. Veja &lt;a href="https://docs.codeberg.org/"&gt;aqui&lt;/a&gt; para a documentação completa.&lt;/p&gt;

&lt;p&gt;Se você possui um projeto Open Source ou se identifica com a filosofia FOSS, talvez o &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt; seja uma boa opção para você. Eu mesmo possuo uma conta lá (&lt;a href="https://codeberg.org/yxm"&gt;codeberg.org/yxm&lt;/a&gt;), a qual utilizo para manter repositórios mais pesados e para hospedar sites estáticos de meus projetos.&lt;/p&gt;

&lt;p&gt;Fica a sugestão. Talvez valha a pena conhecer.&lt;/p&gt;

&lt;p&gt;Um abraço e até mais,&lt;/p&gt;

&lt;p&gt;Yuri.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitlab</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Prazer, Yuri.</title>
      <dc:creator>Yuri Ximenes Martins</dc:creator>
      <pubDate>Fri, 28 Jul 2023 22:07:42 +0000</pubDate>
      <link>https://dev.to/yxm/prazer-yuri-21k9</link>
      <guid>https://dev.to/yxm/prazer-yuri-21k9</guid>
      <description>&lt;p&gt;Oi.&lt;/p&gt;

&lt;p&gt;Sou novo por aqui no &lt;a href="https://dev.to/yxm"&gt;dev.to&lt;/a&gt; e essa é a minha primeira postagem. Gostaria de iniciar esse contato me apresentando, contando um pouco de minha história e dizendo o que você pode esperar mim.&lt;/p&gt;

&lt;h1&gt;
  
  
  Yuri
&lt;/h1&gt;

&lt;p&gt;Meu nome é Yuri Ximenes Martins e tenho 30 anos. Sou um pesquisador brasileiro que atua na interseção entre Matemática, Ciência da Computação, Física e Filosofia, em temas ligados à abstração. Atuo, também, como desenvolvedor de software, onde tenho afinidade com o paradigma funcional. &lt;/p&gt;

&lt;p&gt;Sou um usuário assíduo de Linux e gosto de trabalhar dentro de um terminal. Amante de Vim, prefiro arquiteturas minimalistas. Gosto de pensar sobre o meu impacto no meio ambiente, de tornar o que é complexo intuitivo e de me expressar através de versos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Física e Matemática
&lt;/h1&gt;

&lt;p&gt;Comecei minha graduação em Física em meados de 2010. De 2016 a 2022 estive no programa de Pós Graduação em Matemática da Universidade Federal de Minas Gerais (UFMG), onde fiz meu mestrado e doutorado.&lt;/p&gt;

&lt;p&gt;Durante a graduação fui me interessando cada vez mais por extrair a essência de conceitos, por generalizar ideias, e pela criação de novas estruturas; exemplos do que se pode chamar de &lt;em&gt;processos de abstração&lt;/em&gt;. Ao se seguir nessa direção, naturalmente se chega a questões ligadas aos fundamentos da área de estudo em questão. O entendimento dos pilares fundamentais da Física foi tema de minha pesquisa durante a pós-graduação. Mais precisamente, meu interesse se concentrou em questões que conectam a Física, a Matemática e a Filosofia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;O que é, de fato, um sistema da Física?&lt;/em&gt; Essa foi minha questão central.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Existem várias maneiras de se perguntar sobre o que uma coisa "é". Uma delas é buscar dizer se ela pode ser "formalizada". Isso significa se perguntar se ela pode ser descrita puramente em termos de estruturas da Matemática e de certas áreas da Filosofia. No que diz respeito à Física, para descrevê-la precisa-se da Lógica (que vem da Matemática) e da Ontologia (que vem da Filosofia). A questão, então, é saber se Lógica e Ontologia são &lt;em&gt;suficientes&lt;/em&gt; para descrever a Física.&lt;/p&gt;

&lt;p&gt;A existência de uma base formal para a Física foi proposta, pela primeira vez, em 1900 pelo matemático David Hilbert. Mesmo depois de mais de 120 anos de pesquisa intensa, uma construção completa ainda não foi obtida. Como uma pequena amostra da importância e da grandiosidade do problema, noto que parte do que seria uma possível solução é considerada, ao lado de &lt;a href="https://en.wikipedia.org/wiki/P_versus_NP_problem"&gt;P=NP&lt;/a&gt; e outras questões, como um dos &lt;a href="https://en.wikipedia.org/wiki/Millennium_Prize_Problems"&gt;Problemas do Milênio&lt;/a&gt;, os quais possuem como recompensa um prêmio de um milhão de dólares!&lt;/p&gt;

&lt;h1&gt;
  
  
  Desenvolvimento de Software
&lt;/h1&gt;

&lt;p&gt;Talvez você esteja se perguntando: mas como o estudo dos fundamentos da Física se relaciona com o Desenvolvimento de Software? E como você saiu de lá para chegar aqui na &lt;a href="https://dev.to/yxm"&gt;dev.to&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Explico.&lt;/p&gt;

&lt;p&gt;Toda linguagem (seja ela de programação, formal ou natural) pode ser estudada de diferentes aspectos. Dentre eles, tem-se a &lt;em&gt;sintaxe&lt;/em&gt; (que lida com sua estrutura) e a &lt;em&gt;semântica&lt;/em&gt; (que diz respeito às formas de se interpretá-la). &lt;/p&gt;

&lt;p&gt;Uma maneira de se organizar a sintaxe é por meio de "tipos". Isso significa que a sintaxe de uma linguagem está muito ligada com o que se chamada de &lt;a href="https://en.wikipedia.org/wiki/Type_theory"&gt;Teoria de Tipos&lt;/a&gt;. Por sua vez, uma maneira de se interpretar uma linguagem é associando a ela estruturas da Matemática. Assim, a semântica de uma linguagem está relacionada com a "teoria das estruturas matemáticas", a qual recebe o nome de &lt;a href="https://en.wikipedia.org/wiki/Category_theory"&gt;Teoria das Categorias&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eR91qML_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vLjiSfV.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eR91qML_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/vLjiSfV.png" alt="sintaxe_semantica" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um fato interessante é que, no caso de linguagens de programação, tem-se uma seta contrária a partir do qual, para determinados sistemas de tipos, sabe-se associar uma linguagem de programação. Esse é a chamada &lt;a href="https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspondence"&gt;correspondência de Curry-Howard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TGQ6bz7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4fyd796.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TGQ6bz7H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/4fyd796.png" alt="curry-howard" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Teoria das categorias e Teoria de Tipos são temas extremamente importantes em minha pesquisa. Por sua vez, a correspondência acima coloca Ciência da Computação em jogo. Através dela pode-se pensar em formalizar a Física e/ou a Matemática não em uma linguagem qualquer, mas em uma linguagem de programação! Esse é o cerne da pesquisa no desenvolvimento de linguagens de programação altamente estruturadas que atuem como verificadores de prova, como é o caso de &lt;a href="https://coq.inria.fr/"&gt;Coq&lt;/a&gt; e &lt;a href="https://wiki.portal.chalmers.se/agda/pmwiki.php"&gt;Agda&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Portanto, sim: linguagens de programação aparecem nos fundamentos da Física. No entanto, como os problemas a serem descritos e solucionados por elas são extremamente abstratos e distantes daqueles da "vida real", tais linguagens destoam daquelas com cunho mais comercial, as quais foram desenvolvidas para atacar e serem eficientes na solução de problemas concretos.&lt;/p&gt;

&lt;p&gt;Cansado de emergir em abstração, resolvi ter contato com questões concretas (e, portanto, com as ferramentas inerentes a elas), as quais possuem potencial de influenciar, de forma mais direta e imediata, o mundo em que vivemos. Foi assim que decidi entrar pro meio do Desenvolvimento de Software...  &lt;/p&gt;

&lt;h1&gt;
  
  
  Linux e Bash
&lt;/h1&gt;

&lt;p&gt;Desde que entrei na universidade, em 2010, utilizo Linux. No começo fui um usuário mais passivo. Aos poucos, à medida em que me aproximava da abstração e da busca pelo essencial, tornei-me mais ativo, no sentido de não só utilizar ferramentas, mas também modificá-las e criar novas de acordo com meus interesses e necessidades.&lt;/p&gt;

&lt;p&gt;Pra ser sincero, aprendi a programar de forma procedural em Bash. Gosto muito de automatizar pequenas tarefas, criar funções que incorporem diferentes funcionalidades, desenvolver versões interativas para CLI já existentes, criar TUI para aplicações, etc. No fundo, gosto mesmo é de trabalhar no terminal! &lt;/p&gt;

&lt;p&gt;No entanto, me dá um pouco de agonia ver como lidar só com linha de comando pode ser contra intuitivo. Sinto-me forçado a recorrer a documentações da GNU recorrentemente, bem como a (salvadora) &lt;a href="https://wiki.archlinux.org/"&gt;ArchWiki&lt;/a&gt;. Nesse sentido, tenho medido alguns esforços para construir um ambiente mais intuitivo que, quem sabe, possa servir não só a mim, mas a outros que desejam viver no terminal sem serem grandes especialistas em Linux. Chamo tal projeto de &lt;em&gt;InTUI&lt;/em&gt; (uma mistura de "intuição" com "TUI"). Trata-se de um conjunto de funções e scripts em Bash, as quais disponibilizo em meu &lt;a href="https://github.com/yxm-dev"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Lab
&lt;/h1&gt;

&lt;p&gt;Tenho tentado pegar o hábito de documentar minhas dúvidas e as respostas que melhor se adequam a elas. Como as dúvidas são recorrentes, fica mais simples de encontrar a resposta caso precise outra vez. Junto delas tenho criado listas com documentações e referências complementares para softwares que utilizo, além de um "dicionário" contendo uma tentativa de dar definições mais precisas a termos do meio.&lt;/p&gt;

&lt;p&gt;Pensando que talvez possa ser útil a alguém, disponibilizo o conteúdo na página &lt;a href="https://lab.yxm.me"&gt;lab.yxm.me&lt;/a&gt;, cujos arquivos &lt;code&gt;.md&lt;/code&gt; subjacentes podem ser encontrados &lt;a href="https://codeberg.org/yxm/lab"&gt;neste&lt;/a&gt; repositório no &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que esperar de mim
&lt;/h1&gt;

&lt;p&gt;Aqui no &lt;a href="https://dev.to/yxm"&gt;dev.to&lt;/a&gt; pretendo escrever no formato de colunas sobre temas nos quais tenho interesse e que acredito que possa contribuir de alguma forma. Por exemplo, pretendo manter as seguintes colunas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linux Tips, com dicas rápidas sobre Linux&lt;/li&gt;
&lt;li&gt;Bash Tips, com dicas rápidas sobre Bash&lt;/li&gt;
&lt;li&gt;Vim Tips, com dicas rápidas sobre Vim&lt;/li&gt;
&lt;li&gt;CLI Tools, com pequenos tutoriais e sugestões de ferramentas que operam por linha de comando,&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;bem como algo sobre Lógica, abstração, teoria das categorias, teoria de tipos, novas tecnologias que eu estiver estudando, e o que mais me parecer útil a alguém.&lt;/p&gt;

&lt;h1&gt;
  
  
  Fim
&lt;/h1&gt;

&lt;p&gt;Um abraço e até mais!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://yxm.me"&gt;yxm.me&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yxm.dev"&gt;github.com/yxm-dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codeberg.com/yxm"&gt;codeberg.com/yxm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>logic</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
