<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>@lcmartinsfilho’s Blog do Luiz - Eloquent Javascript</title><link>https://luizmartins.dev/https://luizmartins.dev/pt/tags/eloquent-javascript/</link><description>All entries in Eloquent Javascript on Blog do Luiz</description><generator>Hugo -- gohugo.io</generator><language>pt-BR</language><lastBuildDate>Sat, 26 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://luizmartins.dev/pt/tags/eloquent-javascript/" rel="self" type="application/rss+xml"/><item><title>Testando a criação de posts no iPad (segunda vez)</title><link>https://luizmartins.dev/pt/post/second-ipad-post/</link><pubDate>Thu, 10 Sep 2026 23:23:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/second-ipad-post/</guid><description>&lt;p&gt;Dessa vez clonei o repo do meu Github Pages dentro do iSH e editei o arquivo diretamente no terminal pelo neovim, commitei e pushei para o repo. Me pareceu muito mais ergonômico e prático do que usar a interface do Github, sem falar que funciona completamente off-line.&lt;/p&gt;</description></item><item><title>Testando a criação de posts no iPad</title><link>https://luizmartins.dev/pt/post/posting-from-ipad/</link><pubDate>Thu, 10 Sep 2026 23:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/posting-from-ipad/</guid><description>&lt;p&gt;Estou na academia, num café próximo à entrada, testando a viabilidade de criar posts em meu blog usando o iPad com o teclado. Se o app do Github não funcionar ou não for ergonômico o suficiente, ainda posso testar o iSH ou coisa parecida para fazer modificações locais. Aliás, acho que clonar o repositório do blog por lá e usar o neovim talvez seja a alternativa mais interessante.&lt;/p&gt;
&lt;p&gt;Esse post escrevi dentro do próprio app do Github, criando o arquivo diretamente nele e commitando diretamente na main.&lt;/p&gt;</description></item><item><title>Correção de texto com Harper</title><link>https://luizmartins.dev/pt/post/correcao-de-texto-com-harper/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/correcao-de-texto-com-harper/</guid><description>&lt;p&gt;Luiz recentemente recebeu uma recomendação sobre &lt;a href="https://writewithharper.com/"&gt;Harper&lt;/a&gt;, uma nova ferramenta de verificação gramatical desenvolvida pela &lt;a href="https://automattic.com/"&gt;Automattic&lt;/a&gt; usando Rust.&lt;/p&gt;
&lt;p&gt;O repositório do projeto descreve Harper como atendendo aos requisitos específicos do desenvolvedor: ele é o verificador gramatical que atende às necessidades, analisando documentos em milissegundos com um consumo mínimo de memória.&lt;/p&gt;
&lt;h2 id="características-principais"&gt;Características principais&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Desempenho rápido:&lt;/strong&gt; análise em nível de milissegundos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Baixo consumo de memória:&lt;/strong&gt; menos de 1/50 do uso do LanguageTool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacidade completa:&lt;/strong&gt; funciona localmente, sem enviar dados para servidores&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilidade com WebAssembly:&lt;/strong&gt; pode ser executado em múltiplas plataformas&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/correcao-de-texto-com-harper/image-1.png" alt="Harper Interface"&gt;&lt;/p&gt;
&lt;h2 id="instalação"&gt;Instalação&lt;/h2&gt;
&lt;p&gt;A instalação é simples através das lojas de extensões para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Navegadores web&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Obsidian&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para outras plataformas, documentação abrangente está disponível em &lt;a href="https://writewithharper.com/docs/about"&gt;writewithharper.com/docs/about&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/correcao-de-texto-com-harper/screenshot.png" alt="Plataformas Disponíveis"&gt;&lt;/p&gt;
&lt;h2 id="links-úteis"&gt;Links úteis&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/"&gt;Site Oficial - Harper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Automattic/harper"&gt;Repositório no GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/docs/about"&gt;Documentação Oficial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Sincronizando seu Obsidian</title><link>https://luizmartins.dev/pt/post/instalando-obsidian-sync/</link><pubDate>Sat, 17 Jan 2026 14:15:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/instalando-obsidian-sync/</guid><description>&lt;p&gt;Existem várias formas de sincronizar o Obsidian, mas decidi documentar o método que escolhi, tanto para não esquecer os detalhes no futuro quanto para ajudar quem também busca uma solução própria de sincronização.&lt;/p&gt;
&lt;p&gt;Para esse projeto, usaremos o plugin Obsidian LiveSync:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vrtmrz/obsidian-livesync"&gt;vrtmrz/obsidian-livesync&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="criando-uma-vps-no-magalucloud"&gt;Criando uma VPS no MagaluCloud&lt;/h2&gt;
&lt;p&gt;Para o servidor, criarei uma VPS no &lt;a href="https://magalu.cloud/?ref=luizmartins.dev"&gt;MagaluCloud&lt;/a&gt;. Vou fazer o mesmo processo de forma manual, pelo console, mas é possível fazer tudo utilizando o &lt;code&gt;mgc&lt;/code&gt; (MagaluCloud &lt;em&gt;cli&lt;/em&gt;).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abra o &lt;a href="https://console.magalu.cloud/?ref=luizmartins.dev"&gt;console&lt;/a&gt;. Para criar uma nova máquina virtual, clique em &lt;a href="https://console.magalu.cloud/virtual-machine?ref=luizmartins.dev"&gt;Virtual Machines&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/instalando-obsidian-sync/1-abrindo-vm.png" alt="Abrindo Virtual Machines no console"&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Na página de &lt;a href="https://console.magalu.cloud/virtual-machine?ref=luizmartins.dev"&gt;Virtual Machines&lt;/a&gt;, clique em &lt;strong&gt;Criar Instância&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/instalando-obsidian-sync/2-criar-instancia.png" alt="Clicando em Criar Instância"&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Selecione a Zona de Disponibilidade desejada (nesse exemplo, escolhi a br-se1-a) e também o Sistema Operacional. Aqui vou de Debian 13 LTS:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/instalando-obsidian-sync/3-zona-distro.png" alt="Selecionando zona e sistema operacional"&gt;&lt;/p&gt;
&lt;p&gt;Para o servidor, podemos ir com a opção mais barata! Escolhi a instância com 1 vCPU e 1 GB de RAM (BV1-1-20). O único detalhe é o espaço; por segurança, escolhi um disco local de 20 GB.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/instalando-obsidian-sync/4-dimensionamento-maquina.png" alt="Dimensionamento e configuração da máquina"&gt;&lt;/p&gt;
&lt;p&gt;Não se esqueça de deixar marcada a opção para atribuir endereço de IPv4 público para a instância. Para acessar a máquina, selecione uma chave SSH existente (se já tiver uma). Do contrário, insira uma chave pública nova. Se não ainda não tiver uma, a documentação pode ajudar. Guarde as chaves geradas com cuidado, pois perdê-las impedirá o acesso à máquina! Por fim, dê um nome ilustrativo à instância e clique em Criar instância.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/instalando-obsidian-sync/5-ip-nomeia-maquina.png" alt="Configurando IP e nomeando a máquina"&gt;&lt;/p&gt;
&lt;h2 id="configurando-o-servidor"&gt;Configurando o servidor&lt;/h2&gt;
&lt;p&gt;Acesse o servidor recém criado com ssh:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh debian@seu-ip-aqui.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para esse projeto, precisaremos do Docker instalado. O passo a passo de instalação foi retirado da documentação do projeto. Rode individualmente cada comando abaixo para adicionar o repositório do Docker ao seu servidor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add Docker&amp;#39;s official GPG key:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ca-certificates curl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo install -m &lt;span class="m"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/apt/sources.list.d/docker.sources &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;URIs: https://download.docker.com/linux/debian
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;#34;$VERSION_CODENAME&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Components: stable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Signed-By: /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depois de adicionar o repositório oficial do Docker com os comandos acima, instale as ferramentas necessárias:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com o Docker instalado, crie um diretório para separar seus dados e configurações:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/obsidian-livesync/&lt;span class="o"&gt;{&lt;/span&gt;couchdb-data,config&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/obsidian-livesync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crie o arquivo &lt;code&gt;~/obsidian-livesync/config/local.ini&lt;/code&gt; e adicione as seguintes configurações:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[couchdb]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;single_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_document_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;50000000 ; 50MB (Adjust based on your note size needs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_http_request_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;4294967296 ; 4GB (Necessary for large sync batches)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd_auth]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;authentication_redirect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/_utils/session.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[httpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WWW-Authenticate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Basic realm=&amp;#34;administrator&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[cors]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;app://obsidian.md,capacitor://localhost,http://localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;accept, authorization, content-type, origin, referer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;GET, PUT, POST, HEAD, DELETE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Para instalar o CouchDB, usaremos um docker compose:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;couchdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;couchdb:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;livesync-couchdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_USER=admin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_PASSWORD=YOUR_STRONG_PASSWORD_HERE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./couchdb-data:/opt/couchdb/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config/local.ini:/opt/couchdb/etc/local.d/local.ini&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;127.0.0.1:5984:5984&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Expose only to localhost, Caddy handles external traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;caddy:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;livesync-caddy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;443:443&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./Caddyfile:/etc/caddy/Caddyfile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;caddy_data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;caddy_config:/config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;couchdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Não se esqueça de alterar a senha de seu banco no arquivo anterior. Escolha uma senha forte!&lt;/p&gt;
&lt;p&gt;Para lidar com proxy reverso e certificado digital, usaremos o Caddy. Crie o arquivo &lt;code&gt;~/obsidian-livesync/Caddyfile&lt;/code&gt; e adicione as seguintes configurações, ajustando o domínio:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;obsidian.yourdomain.com {
reverse_proxy couchdb:5984
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Suba a stack com:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora vamos criar um banco de dados chamado obsidian. Você é livre para usar qualquer nome aqui:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X PUT -u admin http://127.0.0.1:5984/obsidian
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entre com o nome de usuário e senha definidos no arquivo &lt;code&gt;~/obsidian-livesync/config/local.ini&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="configurando-o-cliente"&gt;Configurando o cliente&lt;/h2&gt;
&lt;p&gt;Instale o Plugin Self-hosted LiveSync após ativar os Community Plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup Wizard:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Abra as Plugin Settings&lt;/li&gt;
&lt;li&gt;Selecione Remote Database Configuration&lt;/li&gt;
&lt;li&gt;Configure os seguintes campos:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URI:&lt;/strong&gt; &lt;a href="https://obsidian.yourdomain.com"&gt;https://obsidian.yourdomain.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; YOUR_STRONG_PASSWORD_HERE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database Name:&lt;/strong&gt; obsidian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End-to-End Encryption:&lt;/strong&gt; Enabled (Recomendado! Será usada uma nova senha para encriptação!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Teste: Clique &amp;ldquo;Test Connection&amp;rdquo;. Se tiver sucesso, aplique as configurações.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>JavaScript is (too) liberal</title><link>https://luizmartins.dev/pt/post/javascript-is-too-liberal/</link><pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/javascript-is-too-liberal/</guid><description>&lt;p&gt;&lt;img src="https://luizmartins.dev/pt/post/javascript-is-too-liberal/featured.jpg" alt="Featured Image"&gt;&lt;/p&gt;
&lt;p&gt;JavaScript é uma linguagem notavelmente permissiva, o que pode ser tanto uma bênção quanto uma maldição para desenvolvedores. Esta publicação explora os aspectos liberais da linguagem e suas implicações para a qualidade do código e experiência do desenvolvedor.&lt;/p&gt;</description></item><item><title>Repositório de ideias</title><link>https://luizmartins.dev/pt/post/repositorio-de-ideias/</link><pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/pt/post/repositorio-de-ideias/</guid><description>&lt;p&gt;Este blog funciona como um repositório de tudo quanto estou lendo, pensando ou que me interessa. É um retorno à tradição dos blogs pessoais da era anterior às redes sociais, onde cada pessoa mantinha seu próprio espaço na internet.&lt;/p&gt;
&lt;h2 id="o-propósito"&gt;O propósito&lt;/h2&gt;
&lt;p&gt;Em um mundo dominado por algoritmos e feeds infinitos, há algo especial em manter um espaço genuinamente pessoal. Um lugar onde ideias podem ser exploradas livremente, sem preocupação com engagement ou alcance. Apenas pensamentos, leituras e reflexões.&lt;/p&gt;
&lt;p&gt;Bem-vindo ao Blog do Luiz!&lt;/p&gt;</description></item></channel></rss>