<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Heliton M. Reis Filho]]></title><description><![CDATA[Heliton M. Reis Filho]]></description><link>https://blog.hellmrf.dev.br</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 21:21:11 GMT</lastBuildDate><atom:link href="https://blog.hellmrf.dev.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Turing, 1950. Máquinas de calcular e Inteligência. [PT-BR]]]></title><description><![CDATA[TURING, A. M. Computing Machinery and Intelligence. Mind, Oxford, v. 59, n. 236, p. 433-460, out. 1950. DOI: 10.1093/mind/LIX.236.433.

Tradução do inglês para português por Heliton Martins. Alguns termos originais são mantidos para maior clareza.

R...]]></description><link>https://blog.hellmrf.dev.br/turing-1950-maquinas-de-calcular-e-inteligencia-pt</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/turing-1950-maquinas-de-calcular-e-inteligencia-pt</guid><category><![CDATA[programming]]></category><category><![CDATA[turing-machine]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[inteligencia artificial ]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Thu, 30 Oct 2025 21:45:23 GMT</pubDate><content:encoded><![CDATA[<blockquote>
<p>TURING, A. M. <em>Computing Machinery and Intelligence</em>. <strong>Mind</strong>, Oxford, v. 59, n. 236, p. 433-460, out. 1950. DOI: <a target="_blank" href="https://doi.org/10.1093/mind/LIX.236.433">10.1093/mind/LIX.236.433</a>.</p>
</blockquote>
<p><strong>Tradução do inglês para português</strong> por <a target="_blank" href="https://github.com/hellmrf">Heliton Martins</a>. Alguns termos originais são mantidos para maior clareza.</p>
<blockquote>
<p>Read the original paper (in English):</p>
<ul>
<li><p><a target="_blank" href="https://doi.org/10.1093/mind/LIX.236.433">Official (publisher page)</a> (paid);</p>
</li>
<li><p><a target="_blank" href="https://phil415.pbworks.com/f/TuringComputing.pdf">Original scan</a> (no OCR, free);</p>
</li>
<li><p><a target="_blank" href="https://courses.cs.umbc.edu/471/papers/turing.pdf">Digital transcription</a> (natively digital, free).</p>
</li>
</ul>
</blockquote>
<hr />
<h1 id="heading-maquinas-de-calcular-e-inteligencia">Máquinas de calcular e inteligência</h1>
<h2 id="heading-1-o-jogo-da-imitacao">1. O jogo da imitação</h2>
<p>Proponho-me a considerar a questão: "Podem as máquinas pensar?" Isso deveria começar com definições do significado dos termos "máquina" e "pensar". As definições poderiam ser formuladas de modo a refletir, tanto quanto possível, o uso normal das palavras, mas essa atitude é perigosa. Se o significado das palavras "máquina" e "pensar" for encontrado examinando-se como elas são comumente usadas, é difícil escapar à conclusão de que o significado e a resposta à pergunta "Podem as máquinas pensar?" devem ser buscados em uma pesquisa estatística, como uma pesquisa Gallup. Mas isso é um absurdo. Em vez de tentar tal definição, substituirei a pergunta por outra, que está intimamente relacionada a ela e é expressa em palavras relativamente inequívocas.</p>
<p>A nova forma do problema pode ser descrita em termos de um jogo que chamamos de "jogo da imitação". É jogado com três pessoas: um homem (A), uma mulher (B) e um interrogador (C), que pode ser de qualquer sexo. O interrogador fica em uma sala separada dos outros dois. O objetivo do jogo para o interrogador é determinar qual dos outros dois é o homem e qual é a mulher. Ele os conhece pelas etiquetas X e Y e, ao final do jogo, ele diz "X é A e Y é B" ou "X é B e Y é A". O interrogador pode fazer perguntas a A e B da seguinte forma:</p>
<blockquote>
<p><strong>C:</strong> Pode X, por favor, me dizer o comprimento de seu cabelo?</p>
</blockquote>
<p>Agora, suponha que X seja realmente A; então A deve responder. O objetivo de A no jogo é tentar fazer com que C faça a identificação errada. Sua resposta poderia, portanto, ser:</p>
<blockquote>
<p>"Meu cabelo é curto, e os fios mais longos têm cerca de nove polegadas de comprimento."</p>
</blockquote>
<p>Para que o tom de voz não ajude o interrogador, as respostas devem ser escritas ou, melhor ainda, datilografadas. O arranjo ideal é ter um teleimpressor (<em>teleprinter</em>) comunicando-se entre as duas salas. Alternativamente, a pergunta e as respostas podem ser repetidas por um intermediário. O objetivo do jogo para a terceira jogadora (B) é ajudar o interrogador. A melhor estratégia para ela é, provavelmente, dar respostas verdadeiras. Ela pode adicionar às suas respostas coisas como: "Eu sou a mulher, não dê ouvidos a ele!", mas isso de nada adiantará, pois o homem pode fazer observações semelhantes.</p>
<p>Agora fazemos a pergunta: "O que acontecerá quando uma máquina assumir o papel de A neste jogo?" O interrogador decidirá errado com a mesma frequência quando o jogo é jogado assim, como ele faz quando o jogo é jogado entre um homem e uma mulher? Essas perguntas substituem a nossa original: "Podem as máquinas pensar?"</p>
<h2 id="heading-2-critica-ao-novo-problema">2. Crítica ao Novo Problema</h2>
<p>Além de perguntar: "Qual é a resposta para esta nova forma da questão?", pode-se perguntar: "Esta nova questão é digna de ser investigada?". Investigaremos esta última questão sem mais delongas, interrompendo assim um regresso infinito.</p>
<p>O novo problema tem a vantagem de traçar uma linha bastante nítida entre as capacidades físicas e as intelectuais de um homem. Nenhum engenheiro ou químico afirma ser capaz de produzir um material que seja indistinguível da pele humana. É possível que em algum momento isso possa ser feito, mas mesmo supondo que essa invenção estivesse disponível, sentiríamos que não faria muito sentido tentar tornar uma "máquina pensante" mais humana, vestindo-a com tal carne artificial. A forma como apresentamos o problema reflete esse fato na condição que impede o interrogador de ver ou tocar os outros competidores, ou ouvir suas vozes. Algumas outras vantagens do critério proposto podem ser evidenciadas por exemplos de perguntas e respostas. Assim:</p>
<blockquote>
<p><strong>P:</strong> Por favor, escreva-me um soneto sobre o tema da Ponte Forth (<em>Forth Bridge</em>).</p>
<p><strong>R:</strong> Deixe-me fora dessa. Eu nunca consegui escrever poesia.</p>
<p><strong>P:</strong> Some 34957 a 70764.</p>
<p><strong>R:</strong> (Pausa de cerca de 30 segundos e então dá como resposta) 105621.</p>
<p><strong>P:</strong> Você joga xadrez?</p>
<p><strong>R:</strong> Sim.</p>
<p><strong>P:</strong> Eu tenho o Rei em K1 (<em>Rei 1</em>), e nenhuma outra peça. Você tem apenas o Rei em K6 (<em>Rei 6</em>) e a Torre em R1 (<em>Torre 1</em>). É a sua vez de jogar. O que você joga?</p>
<p><strong>R:</strong> (Após uma pausa de 15 segundos) T-R8 mate (<em>R-R8 mate</em>).</p>
</blockquote>
<p>O método de perguntas e respostas parece ser adequado para introduzir quase qualquer um dos campos do esforço humano que desejamos incluir. Não desejamos penalizar a máquina por sua incapacidade de brilhar em concursos de beleza, nem penalizar um homem por perder em uma corrida contra um avião. As condições do nosso jogo tornam essas deficiências irrelevantes. As "testemunhas" (<em>witnesses</em>) podem se gabar, se considerarem aconselhável, o quanto quiserem sobre seus encantos, força ou heroísmo, mas o interrogador não pode exigir demonstrações práticas.</p>
<p>O jogo talvez possa ser criticado com o argumento de que as chances estão excessivamente contra a máquina. Se o homem fosse tentar fingir ser a máquina, ele claramente teria um desempenho muito ruim. Ele seria denunciado imediatamente pela lentidão e imprecisão na aritmética. Não poderiam as máquinas realizar algo que deveria ser descrito como pensar, mas que é muito diferente do que um homem faz? Esta objeção é muito forte, mas pelo menos podemos dizer que se, no entanto, uma máquina puder ser construída para jogar o jogo da imitação satisfatoriamente, não precisaremos nos preocupar com esta objeção.</p>
<p>Poder-se-ia argumentar que, ao jogar o "jogo da imitação", a melhor estratégia para a máquina pode possivelmente ser algo diferente da imitação do comportamento de um homem. Isso pode ser, mas acho improvável que haja qualquer grande efeito desse tipo. De qualquer forma, não há intenção de investigar aqui a teoria do jogo, e será assumido que a melhor estratégia é tentar fornecer respostas que seriam naturalmente dadas por um homem.</p>
<h2 id="heading-3-as-maquinas-envolvidas-no-jogo">3. As Máquinas Envolvidas no Jogo</h2>
<p>A questão que colocamos no item 1 não será totalmente definida até que tenhamos especificado o que queremos dizer com a palavra "máquina". É natural que desejemos permitir que todo tipo de técnica de engenharia seja usado em nossas máquinas. Também desejamos permitir a possibilidade de que um engenheiro ou equipe de engenheiros possa construir uma máquina que funcione, mas cuja maneira de operação não possa ser satisfatoriamente descrita por seus construtores, porque eles aplicaram um método que é amplamente experimental. Finalmente, desejamos excluir das máquinas os homens nascidos da maneira usual. É difícil formular as definições de modo a satisfazer essas três condições. Poder-se-ia, por exemplo, insistir que a equipe de engenheiros fosse toda de um só sexo, mas isso não seria realmente satisfatório, pois é provavelmente possível criar um indivíduo completo a partir de uma única célula da pele (digamos) de um homem. Fazer isso seria um feito de técnica biológica merecedor dos maiores elogios, mas não estaríamos inclinados a considerá-lo como um caso de "construção de uma máquina pensante" (<em>thinking machine</em>). Isso nos leva a abandonar a exigência de que todo tipo de técnica seja permitido. Estamos ainda mais dispostos a fazê-lo em vista do fato de que o interesse atual por "máquinas pensantes" foi despertado por um tipo particular de máquina, geralmente chamada de "computador eletrônico" (<em>electronic computer</em>) ou "computador digital" (<em>digital computer</em>). Seguindo essa sugestão, permitimos apenas que computadores digitais participem do nosso jogo.</p>
<p>Essa restrição parece, à primeira vista, muito drástica. Tentarei mostrar que, na realidade, ela não o é. Fazer isso exige uma breve descrição da natureza e das propriedades desses computadores.</p>
<p>Pode-se dizer também que essa identificação de máquinas com computadores digitais, assim como nosso critério para "pensar", só será insatisfatória se (contrariando minha crença) se revelar que os computadores digitais são incapazes de ter um bom desempenho no jogo.</p>
<p>Já existem vários computadores digitais em funcionamento, e pode-se perguntar: "Por que não tentar o experimento imediatamente? Seria fácil satisfazer as condições do jogo. Vários interrogadores poderiam ser usados, e estatísticas compiladas para mostrar com que frequência a identificação correta foi dada." A resposta curta é que não estamos perguntando se todos os computadores digitais se sairiam bem no jogo, nem se os computadores atualmente disponíveis se sairiam bem, mas se existem computadores imagináveis que se sairiam bem. Mas esta é apenas a resposta curta. Veremos essa questão sob uma luz diferente mais adiante.</p>
<h2 id="heading-4-computadores-digitais">4. Computadores Digitais</h2>
<p>A ideia por trás dos computadores digitais pode ser explicada dizendo que essas máquinas se destinam a realizar quaisquer operações que poderiam ser feitas por um computador humano. Supõe-se que o computador humano siga regras fixas; ele não tem autoridade para desviar-se delas em nenhum detalhe. Podemos supor que essas regras são fornecidas em um livro, que é alterado sempre que ele é colocado em um novo trabalho. Ele também tem um suprimento ilimitado de papel no qual faz seus cálculos. Ele também pode fazer suas multiplicações e adições em uma "máquina de calcular" (<em>desk machine</em>), mas isso não é importante.</p>
<p>Se usarmos a explicação acima como definição, estaremos em perigo de circularidade de argumento. Evitamos isso dando um esboço dos meios pelos quais o efeito desejado é alcançado. Um computador digital geralmente pode ser considerado como constituído por três partes:</p>
<ol>
<li><p><strong>Memória</strong> (<em>Store</em>)</p>
</li>
<li><p><strong>Unidade de Execução</strong> (<em>Executive unit</em>)</p>
</li>
<li><p><strong>Controle</strong> (<em>Control</em>)</p>
</li>
</ol>
<p>A memória é um armazém de informações e corresponde ao papel do computador humano, seja este o papel no qual ele faz seus cálculos ou aquele no qual seu livro de regras está impresso. Na medida em que o computador humano faz cálculos de cabeça (<em>in his head</em>), uma parte da memória corresponderá à sua memória (mental).</p>
<p>A unidade de execução é a parte que realiza as várias operações individuais envolvidas em um cálculo. Quais são essas operações individuais, varia de máquina para máquina. Geralmente, operações bastante longas podem ser feitas, como <em>"Multiplicar 3540675445 por 7076345687"</em>, mas em algumas máquinas apenas operações muito simples, como <em>"Escreva 0"</em>, são possíveis.</p>
<p>Mencionamos que o "livro de regras" fornecido ao computador é substituído na máquina por uma parte da memória. É então chamado de "tabela de instruções". É dever do controle (<em>control</em>) garantir que essas instruções sejam obedecidas corretamente e na ordem certa. O controle é construído de forma que isso aconteça necessariamente.</p>
<p>A informação na memória é geralmente dividida em pacotes de tamanho moderadamente pequeno. Em uma máquina, por exemplo, um pacote pode consistir em dez dígitos decimais. Números são atribuídos às partes da memória onde os vários pacotes de informação são armazenados, de alguma maneira sistemática. Uma instrução típica poderia dizer:</p>
<blockquote>
<p>"Some o número armazenado na posição 6809 ao da posição 4302 e coloque o resultado de volta nesta última posição de armazenamento."</p>
</blockquote>
<p>Desnecessário dizer que isso não ocorreria na máquina expresso em inglês. Seria mais provável que estivesse codificado em uma forma como <code>6809430217</code>. Aqui, <code>17</code> diz qual das várias operações possíveis deve ser realizada sobre os dois números. Neste caso, a operação é a descrita acima, a saber: <em>"Some o número..."</em>. Nota-se que a instrução ocupa 10 dígitos e, assim, forma um pacote de informação, muito convenientemente. O controle (<em>control</em>) normalmente pegará as instruções a serem obedecidas na ordem das posições em que estão armazenadas, mas ocasionalmente uma instrução como:</p>
<blockquote>
<p>"Agora obedeça à instrução armazenada na posição 5606 e continue a partir daí"</p>
</blockquote>
<p>pode ser encontrada, ou ainda:</p>
<blockquote>
<p>"Se a posição 4505 contém 0, obedeça em seguida à instrução armazenada em 6707; caso contrário, continue em frente."</p>
</blockquote>
<p>Instruções desses últimos tipos são muito importantes porque tornam possível que uma sequência de operações seja repetida (<em>replaced</em>) várias vezes até que alguma condição seja satisfeita, mas, ao fazê-lo, obedecendo não a novas instruções a cada repetição, mas às mesmas repetidamente. Tomando uma analogia doméstica, suponha que a Mãe queira que Tommy passe no sapateiro toda manhã a caminho da escola para ver se os sapatos dela estão prontos. Ela pode pedir-lhe de novo toda manhã. Alternativamente, ela pode afixar um aviso de uma vez por todas no corredor, que ele verá quando sair para a escola e que lhe diz para passar a buscar os sapatos, e também para destruir o aviso quando voltar, se ele tiver os sapatos consigo.</p>
<p>O leitor deve aceitar como fato que os computadores digitais podem ser construídos, e de fato foram construídos, de acordo com os princípios que descrevemos, e que eles podem, na verdade, imitar as ações de um computador humano muito de perto.</p>
<p>O livro de regras que descrevemos nosso computador humano usando é, naturalmente, uma ficção conveniente. Computadores humanos reais realmente se lembram do que têm de fazer. Se alguém quer fazer uma máquina imitar o comportamento do computador humano em alguma operação complexa, tem de perguntar-lhe como é feito e, em seguida, traduzir a resposta para a forma de uma tabela de instruções. Construir tabelas de instruções é geralmente descrito como "programar" (<em>programming</em>). <em>"Programar uma máquina para realizar a operação A"</em> significa colocar a tabela de instruções apropriada na máquina para que ela faça A.</p>
<p>Uma variante interessante da ideia de um computador digital é um "computador digital com um elemento aleatório" (<em>digital computer with a random element</em>). Estes têm instruções que envolvem o lançamento de um dado ou algum processo eletrônico equivalente; uma dessas instruções poderia, por exemplo, ser: <em>"Lance o dado e coloque o número resultante na memória 1000"</em>. Às vezes, tal máquina é descrita como tendo livre-arbítrio (<em>free will</em>) (embora eu mesmo não usasse essa frase). Normalmente não é possível determinar, observando uma máquina, se ela tem um elemento aleatório, pois um efeito semelhante pode ser produzido por dispositivos como fazer as escolhas dependerem dos dígitos da dízima de $\pi$.</p>
<p>A maioria dos computadores digitais reais tem apenas uma memória (<em>store</em>) finita. Não há dificuldade teórica na ideia de um computador com uma memória ilimitada. Claro, apenas uma parte finita pode ter sido usada a qualquer momento. Da mesma forma, apenas uma quantidade finita pode ter sido construída, mas podemos imaginar mais e more sendo adicionada conforme necessário. Tais computadores têm especial interesse teórico e serão chamados de computadores de capacidade infinita.</p>
<p>A ideia de um computador digital é antiga. Charles Babbage, Professor Lucasiano de Matemática em Cambridge de 1828 a 1839, planejou tal máquina, chamada de Máquina Analítica (<em>Analytical Engine</em>), mas ela nunca foi concluída. Embora Babbage tivesse todas as ideias essenciais, sua máquina não era, naquela época, uma perspectiva tão atraente. A velocidade que estaria disponível seria definitivamente mais rápida que a de um computador humano, mas algo como 100 vezes mais lenta que a máquina de Manchester, ela própria uma das mais lentas das máquinas modernas. O armazenamento (<em>storage</em>) deveria ser puramente mecânico, usando rodas e cartões.</p>
<p>O fato de a Máquina Analítica de Babbage ser inteiramente mecânica nos ajudará a nos livrarmos de uma superstição. Importância é frequentemente atribuída ao fato de que os computadores digitais modernos são elétricos, e que o sistema nervoso também é elétrico. Visto que a máquina de Babbage não era elétrica, e dado que todos os computadores digitais são, em certo sentido, equivalentes, vemos que esse uso da eletricidade não pode ser de importância teórica. É claro que a eletricidade geralmente entra em cena quando se trata de sinalização rápida, de modo que não é surpreendente que a encontremos em ambas as conexões. No sistema nervoso, os fenômenos químicos são pelo menos tão importantes quanto os elétricos. Em certos computadores, o sistema de armazenamento (<em>storage</em>) é principalmente acústico. A característica de usar eletricidade é, portanto, vista como sendo apenas uma semelhança muito superficial. Se quisermos encontrar tais semelhanças, deveríamos procurar, em vez disso, por analogias matemáticas de função.</p>
<h2 id="heading-5-universalidade-dos-computadores-digitais">5. Universalidade dos Computadores Digitais</h2>
<p>Os computadores digitais considerados na última seção podem ser classificados entre as "máquinas de estados discretos" (<em>discrete-state machines</em>). Estas são as máquinas que se movem por saltos (<em>jumps</em>) ou cliques (<em>clicks</em>) repentinos de um estado bastante definido para outro. Esses estados são suficientemente diferentes para que a possibilidade de confusão entre eles seja ignorada. A rigor, não existem tais máquinas. Tudo, na realidade, move-se continuamente. Mas há muitos tipos de máquina que podem vantajosamente (<em>profitably</em>) ser pensadas como sendo máquinas de estados discretos. Por exemplo, ao considerar os interruptores de um sistema de iluminação, é uma ficção conveniente que cada interruptor deva estar definitivamente ligado (<em>on</em>) ou definitivamente desligado (<em>off</em>). Deve haver posições intermediárias, mas, para a maioria dos propósitos, podemos esquecê-las.</p>
<p>Como exemplo de uma máquina de estados discretos, poderíamos considerar uma roda que gira com um clique 120° uma vez por segundo, mas pode ser parada por uma alavanca que pode ser operada de fora; além disso, uma lâmpada deve acender em uma das posições da roda. Esta máquina poderia ser descrita abstratamente da seguinte forma. O estado interno da máquina (que é descrito pela posição da roda) pode ser $q_1$, $q_2$ ou $q_3$. Existe um sinal de entrada $i_0$ ou $i_1$ (posição da alavanca). O estado interno a qualquer momento é determinado pelo último estado e pelo sinal de entrada, de acordo com a tabela:</p>
<p><strong>(TABELA OMITIDA)</strong></p>
<p>Os sinais de saída, a única indicação externamente visível do estado interno (a luz), são descritos pela tabela:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Estado</td><td>$q_1$</td><td>$q_2$</td><td>$q_3$</td></tr>
</thead>
<tbody>
<tr>
<td>Saída</td><td>$o_0$</td><td>$o_0$</td><td>$o_1$</td></tr>
</tbody>
</table>
</div><p>Este exemplo é típico de máquinas de estados discretos. Elas podem ser descritas por tais tabelas, desde que tenham apenas um número finito de estados possíveis.</p>
<p>Parecerá que, dado o estado inicial da máquina e os sinais de entrada, é sempre possível prever todos os estados futuros. Isso é reminiscente da visão de Laplace de que, a partir do estado completo do universo em um momento, descrito pelas posições e velocidades de todas as partículas, deveria ser possível prever todos os estados futuros. A predição que estamos considerando está, no entanto, bem mais próxima da praticabilidade (<em>practicability</em>) do que a considerada por Laplace. O sistema do "universo como um todo" (<em>universe as a whole</em>) é tal que erros bastante pequenos nas condições iniciais podem ter um efeito avassalador em um momento posterior. O deslocamento de um único elétron por um bilionésimo de centímetro em um momento pode fazer a diferença entre um homem ser morto por uma avalanche um ano depois, ou escapar. É uma propriedade essencial dos sistemas mecânicos que chamamos de "máquinas de estados discretos" que esse fenômeno não ocorra. Mesmo quando consideramos as máquinas físicas reais em vez das máquinas idealizadas, um conhecimento razoavelmente preciso do estado em um momento fornece um conhecimento razoavelmente preciso vários passos adiante.</p>
<p>Como mencionamos, os computadores digitais se enquadram na classe das máquinas de estados discretos. Mas o número de estados de que tal máquina é capaz é geralmente enormemente grande. Por exemplo, o número para a máquina que agora opera em Manchester é de cerca de $2^{165,000}$, ou seja, cerca de $10^{50,000}$. Compare isso com nosso exemplo da roda com clique (<em>clicking wheel</em>) descrito acima, que tinha três estados. Não é difícil ver por que o número de estados deve ser tão imenso. O computador inclui uma memória (<em>store</em>) correspondente ao papel usado por um computador humano. Deve ser possível escrever na memória qualquer uma das combinações de símbolos que poderiam ter sido escritas no papel. Por simplicidade, suponha que apenas dígitos de 0 a 9 sejam usados como símbolos. Variações na caligrafia são ignoradas. Suponha que o computador tenha permissão para 100 folhas de papel, cada uma contendo 50 linhas, cada uma com espaço para 30 dígitos. Então, o número de estados é $10^{100 \times 50 \times 30}$, ou seja, $10^{150,000}$. Isso é aproximadamente o número de estados de três máquinas de Manchester juntas.</p>
<p>O logaritmo na base dois do número de estados é usualmente chamado de "capacidade de armazenamento" (<em>storage capacity</em>) da máquina. Assim, a máquina de Manchester tem uma capacidade de armazenamento de cerca de 165,000 e a máquina da roda do nosso exemplo, cerca de 1,6. Se duas máquinas são postas juntas, suas capacidades devem ser somadas para obter a capacidade da máquina resultante. Isso leva à possibilidade de declarações como: <em>"A máquina de Manchester contém 64 trilhas magnéticas, cada uma com capacidade de 2560, oito tubos eletrônicos com capacidade de 1280. Armazenamento diverso</em> (Miscellaneous storage) <em>soma cerca de 300, perfazendo um total de 174,380."</em></p>
<p>Dada a tabela correspondente a uma máquina de estados discretos, é possível prever o que ela fará. Não há razão para que esse cálculo não deva ser realizado por meio de um computador digital. Desde que pudesse ser realizado rápido o suficiente, o computador digital poderia imitar o comportamento de qualquer máquina de estados discretos. O jogo da imitação poderia então ser jogado com a máquina em questão (como B) e o computador digital imitador (como A), e o interrogador não conseguiria distingui-los. É claro que o computador digital deve ter uma capacidade de armazenamento adequada, além de funcionar rápido o suficiente. Além disso, ele deve ser programado de novo para cada nova máquina que se deseja imitar.</p>
<p>Essa propriedade especial dos computadores digitais, de que eles podem imitar qualquer máquina de estados discretos, é descrita dizendo-se que eles são <strong>máquinas universais</strong> (<em>universal machines</em>). A existência de máquinas com essa propriedade tem a importante consequência de que, deixando de lado considerações de velocidade, é desnecessário projetar várias máquinas novas para fazer vários processos de computação. Todos eles podem ser feitos com um único computador digital, adequadamente programado para cada caso. Ver-se-á que, como consequência disso, todos os computadores digitais são, em certo sentido, equivalentes.</p>
<p>Devemos agora considerar novamente o ponto levantado ao final do §3. Foi sugerido, tentativamente, que a questão "Podem as máquinas pensar?" (<em>Can machines think?</em>) fosse substituída por "Existem computadores digitais imagináveis que se sairiam bem no jogo da imitação?". Se quisermos, podemos tornar isso superficialmente mais geral e perguntar: "Existem máquinas de estados discretos que se sairiam bem?". Mas, em vista da propriedade da universalidade, vemos que qualquer uma dessas questões é equivalente a esta: "Vamos fixar nossa atenção em um computador digital específico C. É verdade que, modificando este computador para ter um armazenamento adequado, aumentando adequadamente sua velocidade de ação e fornecendo-lhe um programa apropriado, C pode ser levado a desempenhar satisfatoriamente o papel de A no jogo da imitação, sendo o papel de B desempenhado por um homem?"</p>
<h2 id="heading-6-visoes-contrarias-sobre-a-questao-principal">6. Visões Contrárias sobre a Questão Principal</h2>
<p>Podemos agora considerar que o terreno foi preparado e estamos prontos para prosseguir com o debate sobre a nossa questão, "Podem as máquinas pensar?" (<em>Can machines think?</em>), e a variante dela citada ao final da última seção. Não podemos abandonar totalmente a forma original do problema, pois as opiniões divergirão quanto à adequação da substituição e devemos, pelo menos, ouvir o que tem a ser dito a esse respeito (<em>in this connexion</em>).</p>
<p>Simplificará as coisas para o leitor se eu explicar primeiro minhas próprias crenças sobre o assunto. Considere primeiro a forma mais precisa da questão. Eu acredito que em cerca de cinquenta anos será possível programar computadores, com uma capacidade de armazenamento de cerca de $10^9$, para fazê-los jogar o jogo da imitação tão bem que um interrogador médio não terá mais que 70 por cento de chance de fazer a identificação correta após cinco minutos de questionamento. A questão original, "Podem as máquinas pensar?", eu acredito ser desprovida de sentido (<em>too meaningless</em>) demais para merecer discussão.</p>
<p>No entanto, acredito que no final do século o uso das palavras e a opinião educada geral terão se alterado tanto que será possível falar de máquinas pensando sem esperar ser contradito. Acredito ainda que nenhum propósito útil é servido ao esconder essas crenças. A visão popular de que os cientistas procedem inexoravelmente de fato bem estabelecido para fato bem estabelecido, nunca sendo influenciados por qualquer conjectura aprimorada (<em>improved conjecture</em>), é bastante equivocada. Contanto que fique claro quais são fatos comprovados e quais são conjecturas, nenhum dano pode resultar. Conjecturas são de grande importância, pois sugerem linhas úteis de pesquisa.</p>
<p>Passo agora a considerar as opiniões opostas à minha.</p>
<h3 id="heading-61-a-objecao-teologica">6.1. A Objeção Teológica</h3>
<p>Pensar é uma função da alma imortal do homem. Deus deu uma alma imortal a cada homem e mulher, mas não a qualquer outro animal ou às máquinas. Portanto, nenhum animal ou máquina pode pensar.</p>
<p>Sou incapaz de aceitar qualquer parte disso, mas tentarei responder em termos teológicos. Eu acharia o argumento mais convincente se os animais fossem classificados com os homens, pois há uma diferença maior, em minha opinião, entre o animado típico e o inanimado do que há entre o homem e os outros animais. O caráter arbitrário da visão ortodoxa torna-se mais claro se considerarmos como ela poderia parecer a um membro de alguma outra comunidade religiosa. Como os cristãos consideram a visão muçulmana de que as mulheres não têm alma? Mas deixemos esse ponto de lado e voltemos ao argumento principal. Parece-me que o argumento citado acima implica uma séria restrição à onipotência do Todo-Poderoso. Admite-se que há certas coisas que Ele não pode fazer, como fazer um ser igual a dois, mas não deveríamos acreditar que Ele tem a liberdade de conferir uma alma a um elefante, se Ele assim o julgar? Poderíamos esperar que Ele apenas exercesse esse poder em conjunção com uma mutação que fornecesse ao elefante um cérebro apropriadamente melhorado para atender às necessidades desse tipo. Um argumento de forma exatamente similar pode ser feito para o caso das máquinas. Pode parecer diferente porque é mais difícil de "engolir" (<em>swallow</em>). Mas isso, na verdade, significa apenas que pensamos que seria menos provável que Ele considerasse as circunstâncias adequadas para conferir uma alma. As circunstâncias em questão são discutidas no restante deste artigo. Ao tentar construir tais máquinas, não estaríamos usurpando irreverentemente Seu poder de criar almas, assim como não o fazemos na procriação de filhos: em vez disso, somos, em ambos os casos, instrumentos de Sua vontade, provendo mansões (<em>mansions</em>) para as almas que Ele cria.</p>
<p>No entanto, isso é mera especulação. Não estou muito impressionado com argumentos teológicos, independentemente do que eles sejam usados para apoiar. Tais argumentos muitas vezes se mostraram insatisfatórios no passado. Na época de Galileu, argumentava-se que os textos:</p>
<blockquote>
<p>"E o sol se deteve... e não se apressou a pôr-se, quase um dia inteiro" (Josué x. 13)</p>
</blockquote>
<p>e</p>
<blockquote>
<p>"Ele lançou os fundamentos da terra, para que ela não se movesse em tempo algum" (Salmos cv. 5)</p>
</blockquote>
<p>eram uma refutação adequada da teoria copernicana. Com o nosso conhecimento atual, tal argumento parece fútil. Quando esse conhecimento não estava disponível, ele causava uma impressão bem diferente.</p>
<h3 id="heading-62-a-objecao-cabecas-na-areia">6.2. A Objeção "Cabeças na Areia"</h3>
<blockquote>
<p>"As consequências de máquinas pensantes seriam terríveis demais. Esperemos e acreditemos que elas não possam fazê-lo."</p>
</blockquote>
<p>Este argumento raramente é expresso tão abertamente quanto na forma acima. Mas ele afeta a maioria de nós que pensa sobre o assunto. Gostamos de acreditar que o Homem é, de alguma forma sutil, superior ao resto da criação. É melhor se puder ser demonstrado que ele é <em>necessariamente</em> superior, pois assim não há perigo de ele perder sua posição de comando. A popularidade do argumento teológico está claramente ligada a esse sentimento. É provável que seja bastante forte em pessoas intelectuais, já que elas valorizam o poder de pensar mais do que as outras, e estão mais inclinadas a basear sua crença na superioridade do Homem nesse poder.</p>
<p>Não creio que este argumento seja suficientemente substancial para exigir refutação. Consolo seria mais apropriado: talvez este deva ser buscado na transmigração das almas.</p>
<h3 id="heading-63-a-objecao-matematica">6.3. A Objeção Matemática</h3>
<p>Existem vários resultados da lógica matemática que podem ser usados para mostrar que há limitações aos poderes das máquinas de estados discretos. O mais conhecido desses resultados é o teorema de Gödel (1931), que mostra que em qualquer sistema lógico suficientemente poderoso, podem ser formuladas declarações que não podem ser nem provadas nem refutadas dentro do sistema, a menos que, possivelmente, o próprio sistema seja inconsistente. Existem outros resultados, em alguns aspectos semelhantes, devidos a Church (1936), Kleene (1935), Rosser e Turing (1937).</p>
<p>O último resultado é o mais conveniente a se considerar, pois se refere diretamente a máquinas, enquanto os outros só podem ser usados em um argumento comparativamente indireto: por exemplo, se o teorema de Gödel for usado, precisamos adicionalmente ter algum meio de descrever sistemas lógicos em termos de máquinas, e máquinas em termos de sistemas lógicos. O resultado em questão refere-se a um tipo de máquina que é essencialmente um computador digital com capacidade infinita. Ele afirma que há certas coisas que tal máquina não pode fazer. Se ela for preparada (<em>rigged up</em>) para dar respostas a perguntas como no jogo da imitação, haverá algumas perguntas para as quais ela ou dará uma resposta errada, ou falhará totalmente em dar uma resposta, não importa quanto tempo seja concedido para uma réplica. Pode haver, é claro, muitas dessas perguntas, e perguntas que não podem ser respondidas por uma máquina podem ser satisfatoriamente respondidas por outra. Estamos, é claro, supondo no momento que as perguntas são do tipo para as quais uma resposta "Sim" ou "Não" é apropriada, em vez de perguntas como "O que você acha de Picasso?". As perguntas em que sabemos que as máquinas devem falhar são deste tipo:</p>
<blockquote>
<p>"Considere a máquina especificada a seguir... . Esta máquina algum dia responderá 'Sim' a alguma pergunta?"</p>
</blockquote>
<p>As reticências devem ser substituídas pela descrição de alguma máquina em um formato padrão, que poderia ser algo como o usado no §5. Quando a máquina descrita tem uma certa relação comparativamente simples com a máquina que está sob interrogação, pode-se mostrar que a resposta está errada ou não é fornecida (<em>not forthcoming</em>). Este é o resultado matemático: argumenta-se que ele prova uma incapacidade (<em>disability</em>) das máquinas à qual o intelecto humano não está sujeito.</p>
<p>A resposta curta a este argumento é que, embora esteja estabelecido que existem limitações aos poderes de <em>qualquer</em> máquina específica, foi apenas afirmado, sem qualquer tipo de prova, que tais limitações não se aplicam ao intelecto humano. Mas eu não acho que essa visão possa ser descartada tão levianamente. Sempre que uma dessas máquinas é questionada com a pergunta crítica apropriada, e dá uma resposta definitiva, sabemos que essa resposta deve estar errada, e isso nos dá um certo sentimento de superioridade. Esse sentimento é ilusório? É, sem dúvida, bastante genuío, mas não acho que se deva dar muita importância a ele. Nós mesmos damos respostas erradas a perguntas com muita frequência para nos justificarmos em ficar muito satisfeitos (<em>pleased</em>) com tal evidência de falibilidade por parte das máquinas. Além disso, nossa superioridade só pode ser sentida em tal ocasião em relação àquela máquina sobre a qual conquistamos nosso pequeno triunfo (<em>petty triumph</em>). Não haveria questão de triunfar simultaneamente sobre <em>todas</em> as máquinas. Em resumo, então, pode haver homens mais espertos do que qualquer máquina específica, mas, novamente, pode haver outras máquinas mais espertas ainda, e assim por diante.</p>
<p>Aqueles que se apegam ao argumento matemático estariam, eu acho, em sua maioria dispostos a aceitar o jogo da imitação como base para discussão. Aqueles que acreditam nas duas objeções anteriores provavelmente não estariam interessados em critério algum.</p>
<h3 id="heading-64-o-argumento-da-consciencia">6.4. O Argumento da Consciência</h3>
<p>Este argumento é muito bem expresso na Oração Lister (<em>Lister Oration</em>) do Professor Jefferson em 1949, da qual cito:</p>
<blockquote>
<p>"Não até que uma máquina possa escrever um soneto ou compor um concerto por causa de pensamentos e emoções sentidos, e não pela queda casual de símbolos, poderíamos concordar que máquina é igual a cérebro — ou seja, não apenas escrevê-lo, mas saber que o escreveu. Nenhum mecanismo poderia sentir — e não meramente sinalizar artificialmente, um artifício fácil (<em>an easy contrivance</em>) — prazer com seus sucessos, tristeza quando suas válvulas queimam, ser aquecido por lisonjas, ser miserabilizado por seus erros, ser encantado pelo sexo, ficar com raiva ou deprimido quando não consegue o que quer."</p>
</blockquote>
<p>Este argumento parece ser uma negação da validade do nosso teste. De acordo com a forma mais extrema desta visão, a única maneira pela qual se poderia ter certeza de que uma máquina pensa é <em>sendo</em> a máquina e <em>sentindo-se</em> pensando. Poder-se-ia então descrever esses sentimentos ao mundo, mas é claro que ninguém estaria justificado em dar qualquer atenção. Da mesma forma, de acordo com essa visão, a única maneira de saber que um homem pensa é sendo aquele homem em particular. É, de fato, o ponto de vista solipsista. Pode ser a visão mais lógica a se sustentar, mas torna a comunicação de ideias difícil. A é propenso a acreditar "A pensa, mas B não", enquanto B acredita "B pensa, mas A não". Em vez de discutir continuamente sobre este ponto, é usual ter a convenção educada (<em>polite convention</em>) de que todos pensam.</p>
<p>Tenho certeza de que o Professor Jefferson não deseja adotar o ponto de vista extremo e solipsista. Provavelmente, ele estaria totalmente disposto a aceitar o jogo da imitação como um teste. O jogo (com o jogador B omitido) é frequentemente usado na prática sob o nome de <em>viva voce</em> (exame oral) para descobrir se alguém realmente entende algo ou se "aprendeu como um papagaio" (<em>learnt it parrot fashion</em>). Vamos escutar um trecho de um desses <em>viva voce</em>:</p>
<blockquote>
<p><strong>Interrogador:</strong> No primeiro verso do seu soneto, que diz "Devo comparar-te a um dia de verão" (<em>Shall I compare thee to a summer's day</em>), "um dia de primavera" (<em>a spring day</em>) não serviria tão bem ou melhor?</p>
<p><strong>Testemunha:</strong> Não daria a métrica (<em>It wouldn't scan</em>).</p>
<p><strong>Interrogador:</strong> Que tal "um dia de inverno" (<em>a winter's day</em>)? Isso daria a métrica corretamente.</p>
<p><strong>Testemunha:</strong> Sim, mas ninguém quer ser comparado a um dia de inverno.</p>
<p><strong>Interrogador:</strong> Você diria que o Sr. Pickwick o lembra do Natal?</p>
<p><strong>Testemunha:</strong> De certa forma.</p>
<p><strong>Interrogador:</strong> No entanto, o Natal é um dia de inverno, e não acho que o Sr. Pickwick se importaria com a comparação.</p>
<p><strong>Testemunha:</strong> Acho que você não está falando sério. Por "um dia de inverno", quer-se dizer um dia de inverno típico, em vez de um especial como o Natal.</p>
</blockquote>
<p>E assim por diante. O que o Professor Jefferson diria se a máquina de escrever sonetos fosse capaz de responder assim no <em>viva voce</em>? Não sei se ele consideraria a máquina como "meramente sinalizando artificialmente" (<em>merely artificially signalling</em>) essas respostas, mas se as respostas fossem tão satisfatórias e sustentadas como na passagem acima, não acho que ele a descreveria como "um artifício fácil" (<em>an easy contrivance</em>). Essa frase, eu acho, destina-se a cobrir dispositivos como a inclusão na máquina de uma gravação de alguém lendo um soneto, com comutação apropriada para ligá-la de tempos em tempos.</p>
<p>Em resumo, então, acho que a maioria daqueles que apoiam o argumento da consciência poderia ser persuadida a abandoná-lo, em vez de ser forçada à posição solipsista. Eles então provavelmente estarão dispostos a aceitar nosso teste.</p>
<p>Não desejo dar a impressão de que acho que não há mistério sobre a consciência. Há, por exemplo, algo de paradoxal conectado a qualquer tentativa de localizá-la. Mas não acho que esses mistérios precisem necessariamente ser resolvidos antes que possamos responder à pergunta com a qual estamos preocupados neste artigo.</p>
<h3 id="heading-65-argumentos-de-varias-debilidades">6.5. Argumentos de Várias Debilidades</h3>
<p>Estes argumentos assumem a forma: "Admito que você pode fazer máquinas realizarem todas as coisas que mencionou, mas você nunca será capaz de fazer uma que faça X." Inúmeras características X são sugeridas a este respeito. Ofereço uma seleção:</p>
<blockquote>
<p>Ser gentil, engenhosa (<em>resourceful</em>), bonita, amigável, ter iniciativa, ter senso de humor, distinguir o certo do errado, cometer erros, apaixonar-se, apreciar (<em>enjoy</em>) morangos com creme, fazer alguém se apaixonar por ela, aprender com a experiência, usar palavras apropriadamente, ser o sujeito de seu próprio pensamento, ter tanta diversidade de comportamento quanto um homem, fazer algo realmente novo.</p>
</blockquote>
<p>Normalmente, nenhuma sustentação é oferecida para essas afirmações. Acredito que elas se baseiam principalmente no princípio da indução científica. Um homem viu milhares de máquinas em sua vida. A partir do que ele vê delas, ele extrai várias conclusões gerais. Elas são feias, cada uma é projetada para um propósito muito limitado, quando exigidas para um propósito minuciosamente diferente são inúteis, a variedade de comportamento de qualquer uma delas é muito pequena, etc., etc. Naturalmente, ele conclui que essas são propriedades necessárias das máquinas em geral.</p>
<p>Muitas dessas limitações estão associadas à capacidade de armazenamento muito pequena da maioria das máquinas. (Estou assumindo que a ideia de capacidade de armazenamento é estendida de alguma forma para cobrir outras máquinas além das máquinas de estados discretos. A definição exata não importa, pois nenhuma precisão matemática é reivindicada na presente discussão.) Alguns anos atrás, quando muito pouco se tinha ouvido falar sobre computadores digitais, era possível suscitar muita incredulidade a respeito deles, se alguém mencionasse suas propriedades sem descrever sua construção. Isso se devia, presumivelmente, a uma aplicação semelhante do princípio da indução científica.</p>
<p>Essas aplicações do princípio são, naturalmente, em grande parte inconscientes. Quando uma criança queimada teme o fogo e demonstra temê-lo, evitando-o, eu diria que ela estava aplicando a indução científica. (Eu poderia, é claro, descrever seu comportamento de muitas outras maneiras.) As obras (<em>works</em>) e os costumes da humanidade não parecem ser um material muito adequado ao qual aplicar a indução científica. Uma parte muito grande do espaço-tempo deve ser investigada, se quisermos obter resultados confiáveis. Caso contrário, podemos (como a maioria das crianças inglesas faz) decidir que todo mundo fala inglês e que é bobagem aprender francês.</p>
<p>Existem, no entanto, observações especiais a serem feitas sobre muitas das debilidades (<em>disabilities</em>) que foram mencionadas. A incapacidade de apreciar morangos com creme pode ter parecido frívola ao leitor. Possivelmente, uma máquina poderia ser feita para apreciar esta iguaria, mas qualquer tentativa de fazê-la seria completamente idiota (<em>idiotic</em>). O que é importante sobre essa debilidade é que ela contribui para algumas das outras debilidades, por exemplo, para a dificuldade de ocorrer o mesmo tipo de amizade entre homem e máquina, como ocorre entre homem branco e homem branco, ou entre homem negro e homem negro.</p>
<p>A alegação de que "máquinas não podem cometer erros" (<em>machines cannot make mistakes</em>) parece curiosa. Fica-se tentado a replicar: "Elas são piores por causa disso?" Mas adotemos uma atitude mais simpática e tentemos ver o que realmente se quer dizer. Acho que essa crítica pode ser explicada em termos do jogo da imitação. Alega-se que o interrogador poderia distinguir a máquina do homem simplesmente apresentando-lhes vários problemas de aritmética. A máquina seria desmascarada por causa de sua precisão implacável (<em>deadly accuracy</em>). A réplica a isso é simples. A máquina (programada para jogar o jogo) não tentaria dar as respostas corretas aos problemas de aritmética. Ela introduziria erros deliberadamente, de uma maneira calculada para confundir o interrogador. Uma falha mecânica (<em>mechanical fault</em>) provavelmente se manifestaria através de uma decisão inadequada sobre que tipo de erro cometer na aritmética. Mesmo essa interpretação da crítica não é suficientemente simpática. Mas não podemos nos dar ao luxo (<em>we cannot afford the space</em>) de nos aprofundar muito mais nisso.</p>
<p>Parece-me que esta crítica depende de uma confusão entre dois tipos de erro. Podemos chamá-los de "erros de funcionamento" (<em>errors of functioning</em>) e "erros de conclusão" (<em>errors of conclusion</em>). Erros de funcionamento devem-se a alguma falha mecânica ou elétrica que faz com que a máquina se comporte de maneira diferente da qual foi projetada. Em discussões filosóficas, gosta-se de ignorar a possibilidade de tais erros; está-se, portanto, discutindo "máquinas abstratas" (<em>abstract machines</em>). Essas máquinas abstratas são ficções matemáticas, e não objetos físicos. Por definição, elas são incapazes de erros de funcionamento. Nesse sentido, podemos realmente dizer que "máquinas nunca podem cometer erros". Erros de conclusão só podem surgir quando algum significado é atribuído aos sinais de saída (<em>output signals</em>) da máquina. A máquina pode, por exemplo, datilografar equações matemáticas ou sentenças em inglês. Quando uma proposição falsa é datilografada, dizemos que a máquina cometeu um erro de conclusão. Claramente, não há razão alguma para dizer que uma máquina não pode cometer esse tipo de erro. Ela poderia não fazer nada além de datilografar repetidamente "$0 = 1$". Para tomar um exemplo menos perverso, ela poderia ter algum método para extrair conclusões por indução científica. Devemos esperar que tal método leve, ocasionalmente, a resultados errôneos.</p>
<p>A alegação de que uma máquina não pode ser o sujeito (<em>subject</em>) de seu próprio pensamento só pode, é claro, ser respondida se for possível mostrar que a máquina tem algum pensamento com algum assunto (<em>subject matter</em>). No entanto, o assunto (<em>subject matter</em>) das operações de uma máquina parece significar algo, pelo menos para as pessoas que lidam com ela. Se, por exemplo, a máquina estivesse tentando encontrar uma solução para a equação $x^2 - 40x - 11 = 0$, seria tentador descrever essa equação como parte do assunto (<em>subject matter</em>) da máquina naquele momento. Nesse tipo de sentido, uma máquina indubitavelmente pode ser seu próprio assunto (<em>subject matter</em>). Ela pode ser usada para ajudar a elaborar seus próprios programas, ou para prever o efeito de alterações em sua própria estrutura. Ao observar os resultados de seu próprio comportamento, ela pode modificar seus próprios programas de modo a atingir algum propósito mais eficazmente. Essas são possibilidades de um futuro próximo, e não sonhos utópicos.</p>
<p>A crítica de que uma máquina não pode ter muita diversidade de comportamento é apenas uma forma de dizer que ela não pode ter muita capacidade de armazenamento. Até bem recentemente, uma capacidade de armazenamento de até mesmo mil dígitos era muito rara.</p>
<p>As críticas que estamos considerando aqui são, muitas vezes, formas disfarçadas do argumento da consciência. Geralmente, se alguém sustenta que uma máquina pode fazer uma dessas coisas e descreve o tipo de método que a máquina poderia usar, não causará uma grande impressão. Pensa-se que o método (seja ele qual for, pois deve ser mecânico) é, na realidade, bastante vil (<em>base</em>). Compare os parênteses na declaração de Jefferson citada na página 22.</p>
<h3 id="heading-66-a-objecao-de-lady-lovelace">6.6. A Objeção de Lady Lovelace</h3>
<p>Nossa informação mais detalhada sobre a Máquina Analítica (<em>Analytical Engine</em>) de Babbage vem de um memorial (<em>memoir</em>) de Lady Lovelace (1842). Nele, ela afirma:</p>
<blockquote>
<p>"A Máquina Analítica não tem pretensões de <em>originar</em> nada. Ela pode fazer qualquer coisa que <em>saibamos como ordenar-lhe</em> que execute" (itálicos dela).</p>
</blockquote>
<p>Esta declaração é citada por Hartree (1949), que acrescenta:</p>
<blockquote>
<p>"Isso não implica que não seja possível construir equipamentos eletrônicos que 'pensem por si mesmos', ou nos quais, em termos biológicos, se possa estabelecer um reflexo condicionado, que serviria como base para o 'aprendizado' (<em>learning</em>). Se isso é possível em princípio ou não, é uma questão estimulante e excitante, sugerida por alguns desses desenvolvimentos recentes. Mas não parecia que as máquinas construídas ou projetadas na época tivessem essa propriedade" (itálicos do tradutor).</p>
</blockquote>
<p>Estou em total acordo com Hartree sobre isso. Note-se que ele não afirma que as máquinas em questão não tinham a propriedade, mas sim que a evidência disponível para Lady Lovelace não a encorajou a acreditar que a tivessem. É bem possível que as máquinas em questão, em certo sentido, tivessem essa propriedade. Pois suponha que alguma máquina de estados discretos tenha a propriedade. A Máquina Analítica era um computador digital universal, de modo que, se sua capacidade de armazenamento e velocidade fossem adequadas, ela poderia, por programação adequada, ser feita para imitar a máquina em questão. Provavelmente, este argumento não ocorreu à Condessa ou a Babbage. Em todo caso, não havia obrigação da parte deles de reivindicar tudo o que poderia ser reivindicado.</p>
<p>Toda esta questão será considerada novamente sob o título de máquinas que aprendem (<em>learning machines</em>).</p>
<p>Uma variante da objeção de Lady Lovelace afirma que uma máquina "nunca pode fazer nada realmente novo" (<em>never do anything really new</em>). Isso pode ser rebatido por um momento com o ditado: "Não há nada de novo debaixo do sol" (<em>There is nothing new under the sun</em>). Quem pode ter certeza de que o "trabalho original" que ele fez não foi simplesmente o crescimento da semente plantada nele pelo ensino, ou o efeito de seguir princípios gerais bem conhecidos? Uma variante melhor da objeção diz que uma máquina nunca pode "nos pegar de surpresa" (<em>take us by surprise</em>). Esta afirmação é um desafio mais direto e pode ser enfrentada diretamente.</p>
<p>As máquinas me pegam de surpresa com grande frequência. Isso ocorre em grande parte porque eu não faço cálculos suficientes para decidir o que esperar que elas façam, ou melhor, porque, embora eu faça um cálculo, eu o faço de forma apressada e desleixada (<em>slipshod fashion</em>), assumindo riscos. Talvez eu diga a mim mesmo: "Suponho que a tensão aqui deva ser a mesma que ali: de qualquer forma, vamos assumir que seja". Naturalmente, muitas vezes estou errado, e o resultado é uma surpresa para mim, pois no momento em que o experimento é feito, essas suposições já foram esquecidas. Essas admissões me expõem a sermões sobre meus métodos viciosos (<em>vicious ways</em>), mas não lançam qualquer dúvida sobre minha credibilidade quando testemunho as surpresas que experiencio.</p>
<p>Eu não espero que esta resposta silencie meu crítico. Ele provavelmente dirá que as surpresas se devem a algum ato mental criativo da minha parte, e não refletem nenhum mérito para a máquina. Isso nos leva de volta ao argumento da consciência, e para longe da ideia de surpresa. É uma linha de argumento que devemos considerar encerrada, mas talvez valha a pena notar que a apreciação de algo como surpreendente exige tanto um "ato mental criativo", quer o evento surpreendente se origine de um homem, de um livro, de uma máquina ou de qualquer outra coisa.</p>
<p>A visão de que máquinas não podem causar surpresas deve-se, creio eu, a uma falácia à qual filósofos e matemáticos estão particularmente sujeitos. Esta é a suposição de que, assim que um fato é apresentado a uma mente, todas as consequências desse fato brotam (<em>spring into</em>) na mente simultaneamente com ele. É uma suposição muito útil em muitas circunstâncias, mas esquece-se facilmente que ela é falsa. Uma consequência natural de fazer isso é que se assume, então, que não há virtude (<em>virtue</em>) no mero ato de extrair (<em>working out</em>) consequências a partir de dados e princípios gerais.</p>
<h3 id="heading-67-argumento-da-continuidade-no-sistema-nervoso">6.7. Argumento da Continuidade no Sistema Nervoso</h3>
<p>O sistema nervoso certamente não é uma máquina de estados discretos. Um pequeno erro na informação sobre a magnitude de um impulso nervoso que incide sobre um neurônio pode fazer uma grande diferença na magnitude do impulso de saída. Pode-se argumentar que, sendo assim, não se pode esperar ser capaz de imitar o comportamento do sistema nervoso com um sistema de estados discretos.</p>
<p>É verdade que uma máquina de estados discretos deve ser diferente de uma máquina contínua. Mas se nos ativermos às condições do jogo da imitação, o interrogador não será capaz de tirar qualquer vantagem dessa diferença. A situação pode ser tornada mais clara se considerarmos alguma outra máquina contínua mais simples. Um analisador diferencial (<em>differential analyser</em>) servirá muito bem. (Um analisador diferencial é um certo tipo de máquina, não do tipo de estados discretos, usado para alguns tipos de cálculo.) Alguns destes fornecem suas respostas em forma datilografada (<em>typed form</em>), e assim são adequados para participar do jogo. Não seria possível para um computador digital prever exatamente quais respostas o analisador diferencial daria a um problema, mas ele seria perfeitamente capaz de dar o <em>tipo</em> certo de resposta. Por exemplo, se lhe pedissem para dar o valor de $\pi$ (na verdade, cerca de 3,1416), seria razoável escolher aleatoriamente entre os valores 3,12, 3,13, 3,14, 3,15, 3,16 com as probabilidades de 0,05, 0,15, 0,55, 0,19, 0,06 (digamos). Nessas circunstâncias, seria muito difícil para o interrogador distinguir o analisador diferencial do computador digital.</p>
<h3 id="heading-68-o-argumento-da-informalidade-do-comportamento">6.8. O Argumento da Informalidade do Comportamento</h3>
<p>Não é possível produzir um conjunto de regras que pretenda descrever o que um homem deve fazer em cada conjunto concebível de circunstâncias. Poder-se-ia, por exemplo, ter uma regra que se deve parar quando se vê um semáforo vermelho, e seguir se vê um verde, mas e se, por alguma falha, ambos aparecerem juntos? Pode-se talvez decidir que é mais seguro parar. Mas alguma dificuldade adicional pode muito bem surgir dessa decisão mais tarde. Tentar fornecer regras de conduta para cobrir todas as eventualidades, mesmo aquelas decorrentes de semáforos, parece ser impossível. Com tudo isso eu concordo.</p>
<p>A partir disso, argumenta-se que não podemos ser máquinas. Tentarei reproduzir o argumento, mas temo que dificilmente lhe farei justiça. Parece ser algo assim:</p>
<blockquote>
<p>"Se cada homem tivesse um conjunto definido de regras de conduta pelo qual regulasse sua vida, ele não seria melhor que uma máquina. Mas não existem tais regras, logo os homens não podem ser máquinas."</p>
</blockquote>
<p>A falácia do termo médio não distribuído (<em>undistributed middle</em>) é gritante (<em>glaring</em>). Eu não acho que o argumento seja sempre apresentado exatamente assim, mas acredito que este seja, no entanto, o argumento usado.</p>
<p>Pode haver, no entanto, uma certa confusão entre "regras de conduta" (<em>rules of conduct</em>) e "leis de comportamento" (<em>laws of behaviour</em>) para turvar a questão. Por "regras de conduta" quero dizer preceitos como "Pare se vir luzes vermelhas", sobre os quais se pode agir, e dos quais se pode estar consciente. Por "leis de comportamento" quero dizer leis da natureza aplicadas ao corpo de um homem, tais como "se você o beliscar, ele gritará". Se substituirmos "leis de comportamento que regulam sua vida" por "regras de conduta pelas quais ele regula sua vida" no argumento citado, o termo médio não distribuído não é mais insuperável. Pois acreditamos que não só é verdade que ser regulado por leis de comportamento implica ser algum tipo de máquina (embora não necessariamente uma máquina de estados discretos), mas que, inversamente, ser tal máquina implica ser regulado por tais leis. No entanto, não podemos nos convencer tão facilmente da ausência de leis de comportamento completas como nos convencemos da ausência de regras de conduta completas. A única maneira que conhecemos para encontrar tais leis é a observação científica, e certamente não conhecemos nenhuma circunstância sob a qual poderíamos dizer: "Já procuramos o suficiente. Não existem tais leis."</p>
<p>Podemos demonstrar mais vigorosamente (<em>forcibly</em>) que qualquer declaração desse tipo seria injustificada. Pois, suponha que pudéssemos ter certeza de encontrar tais leis, se elas existissem. Então, dada uma máquina de estados discretos, deveria certamente ser possível descobrir por observação o suficiente sobre ela para prever seu comportamento futuro, e isso dentro de um tempo razoável, digamos, mil anos. Mas este não parece ser o caso. Eu configurei no computador de Manchester um pequeno programa usando apenas 1000 unidades de armazenamento, pelo qual a máquina, fornecida com um número de dezesseis dígitos, responde com outro em dois segundos. Eu desafiaria (<em>defy</em>) qualquer um a aprender com essas respostas o suficiente sobre o programa para ser capaz de prever quaisquer respostas para valores ainda não testados.</p>
<h3 id="heading-69-o-argumento-da-percepcao-extrassensorial">6.9. O Argumento da Percepção Extrassensorial</h3>
<p>Presumo que o leitor esteja familiarizado com a ideia de percepção extrassensorial (ESP) e o significado de seus quatro itens, a saber, telepatia, clarividência, precognição e psicocinese. Esses fenômenos perturbadores parecem negar todas as nossas ideias científicas usuais. Como gostaríamos de desacreditá-los! Infelizmente, a evidência estatística, pelo menos para a telepatia, é esmagadora (<em>overwhelming</em>). É muito difícil reorganizar as próprias ideias de modo a encaixar esses novos fatos. Uma vez que se os aceita, não parece um passo muito grande acreditar em fantasmas e assombrações. A ideia de que nossos corpos se movem simplesmente de acordo com as leis conhecidas da física, juntamente com algumas outras ainda não descobertas, mas de alguma forma semelhantes, seria uma das primeiras a desaparecer.</p>
<p>Este argumento é, em minha opinião, bastante forte. Pode-se dizer em resposta que muitas teorias científicas parecem permanecer funcionais na prática, apesar de colidirem com a ESP; que, de fato, pode-se sair muito bem se nos esquecermos dela. Isso é um consolo bastante frio (<em>rather cold comfort</em>), e teme-se que o pensamento seja exatamente o tipo de fenômeno onde a ESP pode ser especialmente relevante.</p>
<p>Um argumento mais específico baseado na ESP poderia ser o seguinte:</p>
<blockquote>
<p>"Vamos jogar o jogo da imitação, usando como testemunhas um homem que é bom como receptor telepático e um computador digital. O interrogador pode fazer perguntas como 'A qual naipe pertence a carta em minha mão direita?'. O homem, por telepatia ou clarividência, dá a resposta certa 130 vezes em 400 cartas. A máquina só pode adivinhar aleatoriamente, e talvez acerte 104, de modo que o interrogador faz a identificação correta."</p>
</blockquote>
<p>Há uma possibilidade interessante que se abre aqui. Suponha que o computador digital contenha um gerador de números aleatórios. Então, será natural usá-lo para decidir que resposta dar. Mas, nesse caso, o gerador de números aleatórios estará sujeito aos poderes psicocinéticos do interrogador. Talvez essa psicocinese possa fazer com que a máquina acerte mais vezes do que o esperado em um cálculo de probabilidade, de modo que o interrogador ainda possa ser incapaz de fazer a identificação correta. Por outro lado, ele (o interrogador) poderia ser capaz de adivinhar corretamente sem qualquer questionamento, por clarividência. Com ESP, tudo pode acontecer.</p>
<p>Se a telepatia for admitida, será necessário tornar nosso teste mais rigoroso. A situação poderia ser considerada análoga à que ocorreria se o interrogador estivesse falando consigo mesmo e um dos competidores estivesse escutando com o ouvido colado à parede. Colocar os competidores em uma "sala à prova de telepatia" satisfaria todos os requisitos.</p>
<h2 id="heading-7-maquinas-que-aprendem-learning-machines">7. Máquinas que Aprendem (<em>learning machines</em>)</h2>
<p>O leitor terá antecipado que não tenho argumentos muito convincentes de natureza positiva para apoiar minhas opiniões. Se eu os tivesse, não teria me dado a tanto trabalho para apontar as falácias nas visões contrárias. As evidências que tenho, apresentarei agora.</p>
<p>Voltemos por um momento à objeção de Lady Lovelace, que afirmava que a máquina só pode fazer o que lhe dizemos para fazer. Pode-se dizer que um homem pode "injetar" uma ideia na máquina, e que ela responderá até certo ponto e depois cairá em quiescência, como uma corda de piano golpeada por um martelo. Outra símile seria uma pilha atômica de tamanho inferior ao crítico: uma ideia injetada deve corresponder a um nêutron entrando na pilha vindo de fora. Cada nêutron desse tipo causará uma certa perturbação que eventualmente desaparece. Se, no entanto, o tamanho da pilha for suficientemente aumentado, a perturbação causada por tal nêutron de entrada muito provavelmente continuará crescendo e crescendo até que toda a pilha seja destruída. Existe um fenômeno correspondente para mentes, e existe um para máquinas? Parece haver um para a mente humana. A maioria delas parece ser "subcrítica", ou seja, corresponder nesta analogia a pilhas de tamanho subcrítico. Uma ideia apresentada a tal mente dará origem, em média, a menos de uma ideia em resposta. Uma pequena proporção é supercrítica. Uma ideia apresentada a tal mente pode dar origem a uma "teoria" inteira consistindo de ideias secundárias, terciárias e mais remotas. Mentes de animais parecem ser muito definitivamente subcríticas. Aderindo a esta analogia, perguntamos: "Pode uma máquina ser feita para ser supercrítica?"</p>
<p>A analogia da "casca de cebola" (<em>skin-of-an-onion</em>) também é útil. Ao considerar as funções da mente ou do cérebro, encontramos certas operações que podemos explicar em termos puramente mecânicos. Dizemos que isso não corresponde à mente real: é uma espécie de "casca" (<em>skin</em>) que devemos remover se quisermos encontrar a mente real. Mas então, no que resta, encontramos uma casca adicional a ser removida, e assim por diante. Procedendo dessa forma, chegamos alguma vez à mente "real", ou eventualmente chegamos a uma casca que não tem nada dentro? Neste último caso, toda a mente é mecânica. (Não seria, contudo, uma máquina de estados discretos. Já discutimos isso.)</p>
<p>Estes dois últimos parágrafos não pretendem ser argumentos convincentes. Eles deveriam ser descritos antes como "recitações que tendem a produzir crença".</p>
<p>O único apoio realmente satisfatório que pode ser dado à visão expressa no início do §6 será aquele fornecido pela espera até o final do século e, então, pela realização do experimento descrito. Mas o que podemos dizer enquanto isso? Que passos devem ser dados agora para que o experimento seja bem-sucedido?</p>
<p>Como expliquei, o problema é principalmente de programação (<em>programming</em>). Avanços na engenharia terão que ser feitos também, mas parece improvável que estes não sejam adequados para os requisitos. As estimativas da capacidade de armazenamento do cérebro variam de $10^{10}$ a $10^{15}$ dígitos binários. Eu me inclino para os valores mais baixos e acredito que apenas uma fração muito pequena é usada para os tipos mais elevados de pensamento. A maior parte dela é provavelmente usada para a retenção de impressões visuais. Eu ficaria surpreso se mais de $10^9$ fosse necessário para jogar satisfatoriamente o jogo da imitação, pelo menos contra um homem cego. (Nota: A capacidade da <em>Encyclopaedia Britannica</em>, 11ª edição, é $2 \times 10^9$). Uma capacidade de armazenamento de $10^7$ seria uma possibilidade muito praticável mesmo com as técnicas atuais. Provavelmente não é necessário aumentar de todo a velocidade das operações das máquinas. Partes das máquinas modernas que podem ser consideradas como análogos das células nervosas trabalham cerca de mil vezes mais rápido que estas últimas. Isso deve fornecer uma "margem de segurança" que poderia cobrir perdas de velocidade decorrentes de muitas maneiras. Nosso problema, então, é descobrir como programar (<em>to programme</em>) essas máquinas para jogar o jogo. No meu ritmo atual de trabalho, eu produzo cerca de mil dígitos de programa (<em>programme</em>) por dia, de modo que cerca de sessenta trabalhadores, trabalhando continuamente ao longo dos cinquenta anos, poderiam realizar o trabalho, se nada fosse para a cesta de lixo. Algum método mais expedito (<em>expeditious</em>) parece desejável.</p>
<p>No processo de tentar imitar uma mente humana adulta, somos forçados a pensar bastante sobre o processo que a levou ao estado em que se encontra. Podemos notar três componentes.</p>
<ol>
<li><p>O estado inicial da mente, digamos, no nascimento,</p>
</li>
<li><p>A educação à qual ela foi submetida,</p>
</li>
<li><p>Outras experiências, que não podem ser descritas como educação, às quais ela foi submetida.</p>
</li>
</ol>
<p>Em vez de tentar produzir um programa que simule a mente adulta, por que não tentar, em vez disso, produzir um que simule a da criança? Se este fosse então submetido a um curso apropriado de educação, obter-se-ia o cérebro adulto. Presumivelmente, o cérebro da criança é algo como um caderno que se compra na papelaria: pouco mecanismo, e muitas folhas em branco. (Mecanismo e escrita são, do nosso ponto de vista, quase sinônimos.) Nossa esperança é que haja tão pouco mecanismo no cérebro da criança que algo semelhante possa ser facilmente programado. A quantidade de trabalho na educação podemos assumir, como uma primeira aproximação, ser muito parecida com a de uma criança humana.</p>
<p>Dividimos, assim, nosso problema em duas partes. O <strong>programa-criança</strong> (<em>child programme</em>) e o <strong>processo educacional</strong>. Estes dois permanecem muito intimamente conectados. Não podemos esperar encontrar uma boa máquina-criança (<em>child machine</em>) na primeira tentativa. Deve-se experimentar ensinar uma tal máquina e ver quão bem ela aprende. Pode-se então tentar outra e ver se é melhor ou pior. Há uma conexão óbvia entre este processo e a evolução, pelas identificações:</p>
<ul>
<li><p>Estrutura da máquina-criança = material hereditário</p>
</li>
<li><p>Mudanças da máquina-criança = mutação</p>
</li>
<li><p>Seleção natural = julgamento do experimentador</p>
</li>
</ul>
<p>Pode-se esperar, contudo, que este processo seja mais expedito (<em>expeditious</em>) que a evolução. A sobrevivência do mais apto é um método lento para medir vantagens. O experimentador, pelo exercício da inteligência, deveria ser capaz de acelerá-lo. Igualmente importante é o fato de que ele não está restrito a mutações aleatórias. Se ele puder rastrear a causa de alguma fraqueza, ele provavelmente poderá pensar no tipo de mutação que a melhorará.</p>
<p>Não será possível aplicar exatamente o mesmo processo de ensino à máquina como a uma criança normal. Ela não será, por exemplo, provida de pernas, de modo que não se poderia pedir-lhe para sair e encher o balde de carvão. Possivelmente ela poderia não ter olhos. Mas por melhor que essas deficiências pudessem ser superadas por engenharia inteligente, não se poderia mandar a criatura para a escola sem que as outras crianças zombassem dela excessivamente. Ela deve receber alguma instrução. Não precisamos nos preocupar muito com as pernas, olhos, etc. O exemplo da Srta. Helen Keller mostra que a educação pode ocorrer, desde que a comunicação em ambas as direções, entre professor e aluno, possa ocorrer por um meio ou outro.</p>
<p>Normalmente associamos <strong>punições</strong> (<em>punishments</em>) e <strong>recompensas</strong> (<em>rewards</em>) ao processo de ensino. Algumas máquinas-criança simples podem ser construídas ou programadas com base nesse tipo de princípio. A máquina tem que ser construída de tal forma que eventos que precederam em pouco tempo (<em>shortly preceded</em>) a ocorrência de um sinal de punição (<em>punishment signal</em>) sejam improváveis de se repetir, enquanto um sinal de recompensa (<em>reward signal</em>) aumente a probabilidade de repetição dos eventos que levaram a ele. Essas definições não pressupõem quaisquer sentimentos por parte da máquina. Eu fiz alguns experimentos com uma dessas máquinas-criança, e consegui ensiná-la algumas coisas, mas o método de ensino foi muito pouco ortodoxo para que o experimento fosse considerado realmente bem-sucedido.</p>
<p>O uso de punições e recompensas pode, na melhor das hipóteses, ser <em>uma parte</em> do processo de ensino. Grosso modo, se o professor não tem outros meios de se comunicar com o aluno, a quantidade de informação que pode alcançá-lo não excede o número total de recompensas e punições aplicadas. Até que uma criança aprendesse a repetir o poema "Casabianca", ela provavelmente se sentiria muito dolorida (<em>very sore</em>), se o texto só pudesse ser descoberto por uma técnica de "Vinte Perguntas", onde cada "NÃO" tomasse a forma de um golpe. É necessário, portanto, ter alguns outros canais "não emocionais" (<em>unemotional</em>) de comunicação. Se estes estiverem disponíveis, é possível ensinar uma máquina, por punições e recompensas, a obedecer a ordens dadas em alguma linguagem, por exemplo, uma linguagem simbólica. Essas ordens devem ser transmitidas através dos canais "não emocionais". O uso dessa linguagem diminuirá muito o número de punições e recompensas necessárias.</p>
<p>As opiniões podem variar quanto à complexidade adequada na máquina-criança. Pode-se tentar torná-la o mais simples possível, de forma consistente com os princípios gerais. Alternativamente, pode-se ter um sistema completo de inferência lógica "embutido". Neste último caso, a memória (<em>store</em>) estaria largamente ocupada com definições e proposições. As proposições teriam vários tipos de status, por exemplo, fatos bem estabelecidos, conjecturas, teoremas matematicamente provados, declarações dadas por uma autoridade, expressões com a forma lógica de proposição, mas sem valor-crença (<em>belief-value</em>). Certas proposições podem ser descritas como "imperativos" (<em>imperatives</em>). A máquina deve ser construída de tal forma que, assim que um imperativo for classificado como "bem estabelecido", a ação apropriada ocorra automaticamente. Para ilustrar isso, suponha que o professor diga à máquina: "Faça seu dever de casa agora". Isso pode fazer com que "O professor diz 'Faça seu dever de casa agora'" seja incluído entre os fatos bem estabelecidos. Outro fato desse tipo poderia ser: "Tudo o que o professor diz é verdade". A combinação destes pode, eventualmente, levar ao imperativo "Faça seu dever de casa agora" ser incluído entre os fatos bem estabelecidos; e isso, pela construção da máquina, significará que o dever de casa realmente é iniciado, mas o efeito é muito satisfatório. Os processos de inferência usados pela máquina não precisam ser tais que satisfaçam os lógicos mais exigentes. Poderia, por exemplo, não haver hierarquia de tipos. Mas isso não significa necessariamente que falácias de tipo (<em>type fallacies</em>) ocorrerão, assim como não estamos fadados a cair de penhascos sem cerca. Imperativos adequados (expressos dentro dos sistemas, não formando parte das regras do sistema) tais como "Não use uma classe a menos que seja uma subclasse de uma que tenha sido mencionada pelo professor" podem ter um efeito similar a "Não chegue muito perto da borda".</p>
<p>Os imperativos que podem ser obedecidos por uma máquina que não tem membros estão fadados a ser de um caráter bastante intelectual, como no exemplo (fazer o dever de casa) dado acima. Importantes entre tais imperativos serão aqueles que regulam a ordem em que as regras do sistema lógico em questão devem ser aplicadas. Pois, em cada estágio, quando se está usando um sistema lógico, há um número muito grande de passos alternativos, qualquer um dos quais se é permitido aplicar, no que diz respeito à obediência às regras do sistema lógico. Essas escolhas fazem a diferença entre um raciocinador brilhante (<em>brilliant</em>) e um fútil (<em>footling</em>), não a diferença entre um raciocinador sólido (<em>sound</em>) e um falacioso (<em>fallacious</em>). Proposições que levam a imperativos desse tipo podem ser:</p>
<blockquote>
<p>"Quando Sócrates for mencionado, use o silogismo em Barbara"</p>
</blockquote>
<p>ou</p>
<blockquote>
<p>"Se um método provou ser mais rápido que outro, não use o método mais lento."</p>
</blockquote>
<p>Alguns destes podem ser "dados por autoridade" (<em>given by authority</em>), mas outros podem ser produzidos pela própria máquina, por exemplo, por indução científica.</p>
<p>A ideia de uma máquina que aprende (<em>learning machine</em>) pode parecer paradoxal para alguns leitores. Como podem as regras de operação da máquina mudar? Elas deveriam descrever completamente como a máquina reagirá, qualquer que seja seu histórico, quaisquer que sejam as mudanças pelas quais ela passe. As regras são, assim, bastante invariantes no tempo. Isso é bem verdade. A explicação do paradoxo é que as regras que são alteradas no processo de aprendizado são de um tipo um tanto menos pretensioso, reivindicando apenas uma validade efêmera. O leitor pode traçar um paralelo com a Constituição dos Estados Unidos.</p>
<p>Uma característica importante de uma máquina que aprende é que seu professor será, muitas vezes, em grande parte ignorante do que exatamente está acontecendo lá dentro, embora ele ainda possa ser capaz, em certa medida, de prever o comportamento de seu pupilo. Isso deve se aplicar mais fortemente à educação posterior de uma máquina originada de uma máquina-criança (<em>child machine</em>) de uma arquitetura ou programa (<em>design or programme</em>) bem testados. Isso está em claro contraste com o procedimento normal ao usar uma máquina para fazer computações: o objetivo de alguém é, então, ter uma imagem mental clara do estado da máquina a cada momento da computação. Esse objetivo só pode ser alcançado com esforço (<em>struggle</em>). A visão de que "a máquina só pode fazer o que sabemos como ordenar-lhe que faça" parece estranha em face disso. A maioria dos programas que podemos colocar na máquina resultará em ela fazendo algo do qual dificilmente extraimos sentido (se é que conseguimos), ou que consideramos como comportamento completamente aleatório. O comportamento inteligente presumivelmente consiste em um desvio do comportamento completamente disciplinado envolvido na computação, mas um desvio bastante sutil (<em>slight</em>), que não dê origem a comportamento aleatório, ou a laços (<em>loops</em>) repetitivos sem sentido. Outro resultado importante de preparar nossa máquina para seu papel no jogo da imitação por um processo de ensino e aprendizado é que a "falibilidade humana" (<em>human fallibility</em>) é provavelmente <strong>imitada</strong> (<em>imitated</em>) de uma forma bastante natural, ou seja, sem "treinamento" (<em>coaching</em>) especial. (O leitor deve reconciliar isso com o ponto de vista das páginas 23 e 24.) Processos que são aprendidos não produzem cem por cento de certeza no resultado; se o fizessem, não poderiam ser desaprendidos (<em>unlearnt</em>).</p>
<p>É provavelmente sensato incluir um elemento aleatório em uma máquina que aprende. Um elemento aleatório é bastante útil quando estamos procurando a solução de algum problema. Suponha, por exemplo, que quiséssemos encontrar um número entre 50 e 200 que fosse igual ao quadrado da soma de seus dígitos; poderíamos começar em 51, depois tentar 52 e continuar até encontrar um número que funcionasse. Alternativamente, poderíamos escolher números aleatoriamente até encontrar um bom. Este método tem a vantagem de que não é necessário manter um registro dos valores que foram tentados, mas a desvantagem de que se pode tentar o mesmo valor duas vezes, mas isso não é muito importante se houver várias soluções. O método sistemático tem a desvantagem de que pode haver um bloco enorme sem nenhuma solução na região que deve ser investigada primeiro. Ora, o processo de aprendizado pode ser considerado como uma busca (<em>search</em>) por uma forma de comportamento que satisfaça o professor (ou algum outro critério). Como provavelmente existe um número muito grande de soluções satisfatórias, o método aleatório parece ser melhor que o sistemático. Deve-se notar que ele é usado no processo análogo da evolução. Mas lá o método sistemático não é possível. Como se poderia manter um registro das diferentes combinações genéticas que foram tentadas, de modo a evitar tentá-las novamente?</p>
<p>Podemos esperar que as máquinas eventualmente compitam com os homens em todos os campos puramente intelectuais. Mas com quais é melhor começar? Mesmo esta é uma decisão difícil. Muitas pessoas pensam que uma atividade muito abstrata, como jogar xadrez, seria o melhor. Pode-se também sustentar que é melhor fornecer à máquina os melhores órgãos dos sentidos (<em>sense organs</em>) que o dinheiro pode comprar, e então ensiná-la a entender e falar inglês. Este processo poderia seguir o ensino normal de uma criança. Coisas seriam apontadas e nomeadas, etc. Novamente, não sei qual é a resposta certa, mas acho que ambas as abordagens deveriam ser tentadas.</p>
<p>Só podemos ver a uma curta distância à frente, mas vemos claramente que há muito a ser feito. (<em>We can only see a short distance ahead, but we can see plenty there that needs to be done.</em>)</p>
<hr />
<p>TURING, A. M. <em>Computing Machinery and Intelligence</em>. <strong>Mind</strong>, Oxford, v. 59, n. 236, p. 433-460, out. 1950. DOI: <a target="_blank" href="https://doi.org/10.1093/mind/LIX.236.433">10.1093/mind/LIX.236.433</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Quando o "estado da arte" não é a melhor opção]]></title><description><![CDATA[Recentemente, liderei um projeto que exemplifica perfeitamente por que inteligência artificial não se resume a "aplicar a tecnologia mais recente", mas exige resolver problemas reais com arquitetura inteligente e criativa.
O cliente recebia, diariame...]]></description><link>https://blog.hellmrf.dev.br/quando-o-estado-da-arte-nao-e-a-melhor-opcao</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/quando-o-estado-da-arte-nao-e-a-melhor-opcao</guid><category><![CDATA[inteligencia artificial ]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[neural networks]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Mon, 27 Oct 2025 21:52:50 GMT</pubDate><content:encoded><![CDATA[<p>Recentemente, liderei um projeto que exemplifica perfeitamente por que inteligência artificial não se resume a "aplicar a tecnologia mais recente", mas exige resolver problemas reais com arquitetura inteligente e criativa.</p>
<p>O cliente recebia, diariamente, milhares de editais de licitação que precisavam ser classificados por tipo de serviço. O processo manual era tecnicamente complexo, lento e sujeito à fadiga cognitiva dos especialistas.</p>
<p>O objetivo era automatizar esse processo com IA, e 3 requisitos estavam claros:</p>
<ol>
<li><p>baixo custo operacional;</p>
</li>
<li><p>alta aderência à expertise humana (precisão); e</p>
</li>
<li><p>determinismo (previsibilidade e explicabilidade das decisões).</p>
</li>
</ol>
<h3 id="heading-a-armadilha">A armadilha</h3>
<p>A tentação imediata seria utilizar um modelo como <a target="_blank" href="https://platform.openai.com/docs/models">GPT</a> ou <a target="_blank" href="https://ai.google.dev/gemini-api/docs/models">Gemini</a> para fazer as classificações. Essa abordagem, aparentemente moderna e sofisticada, rapidamente se revelaria ingênua — uma flagrante engenharia excessiva e em conflito com todos os requisitos do cliente.</p>
<p>É fato que os LLMs são o estado da arte na compreensão de texto. Mas o outro lado da moeda, a etapa generativa, apresenta:</p>
<ul>
<li><p>custo extremo;</p>
</li>
<li><p>pré-treinamento genérico e alheio à expertise humana; e, portanto,</p>
</li>
<li><p>comportamento imprevisível em domínios específicos.</p>
</li>
</ul>
<p>Ou seja: alto custo, baixa aderência e pouca previsibilidade. <strong>Trágico!</strong></p>
<h3 id="heading-o-pulo-do-gato">O "pulo do gato"</h3>
<p>Felizmente, todo o poder de compreensão de um LLM reside em seu engenhoso "<em>Transformer</em>", que mapeia o texto em um espaço vetorial semântico. Enquanto os detalhes técnicos podem ser consultados no artigo intitulado “<em>Attention Is All You Need”</em> (<a target="_blank" href="https://arxiv.org/abs/1706.03762">Vaswani <em>et al.</em>, 2017</a>), os provedores comerciais de LLM fornecem essa transformação com desempenho excepcional e custo reduzido por meio de suas API.</p>
<p>Assim, podemos desfrutar de uma compreensão semântica de altíssima qualidade, enquanto evitamos a caríssima etapa de geração, substituindo-a completamente por um modelo adequado ao problema.</p>
<p>Para a classificação, os experimentos da modelagem corroboraram o bom desempenho das Redes Neurais Artificiais, o que já era indicado pela experiência. Assim, essa arquitetura foi utilizada para desenvolver um modelo e treiná-lo sobre o conjunto de dados do cliente, composto por milhares de licitações previamente classificadas manualmente.</p>
<h3 id="heading-resultados">Resultados</h3>
<p>Como esperávamos, essa arquitetura híbrida foi um sucesso, alcançando um classificador com a mesma capacidade interpretativa de um LLM comercial e com a mesma estratégia de classificação do especialista humano.</p>
<p>A escolha do classificador adequado permitiu uma redução brutal do número de parâmetros envolvidos na etapa de classificação (e, por conseguinte, de sua complexidade): em vez dos bilhões (e, por vezes, trilhões!) de parâmetros de um LLM comercial de propósito geral, utilizamos apenas algumas centenas de neurônios e uma arquitetura surpreendentemente mais simples.</p>
<p>Por fim, a arquitetura completa foi:</p>
<ol>
<li><p>Compreensão (<em>embedding</em> de <em>Transformer</em> via API);</p>
</li>
<li><p>Classificação (RNA própria).</p>
</li>
</ol>
<p>Dada a simplicidade do classificador e considerando a total viabilidade de sua execução na infraestrutura atual do cliente sem custos adicionais, podemos considerar que o custo operacional final é igual ao custo da etapa de compreensão (isto é, da API de <em>embedding</em>).</p>
<p>Considerando-se a aproximação <code>3 caracteres ≈ 1 token</code>, o tamanho médio aproximado dos objetos licitatórios é de 70 <em>tokens</em>. Para 10 mil documentos, temos <strong>700.000 <em>tokens*</em></strong>.<em> Com um custo de US$ 0,15 por milhão de </em>tokens<em> e a cotação do dólar a R$ 5,38, temos que <em>*o custo final (estimado) para 10.000 documentos é de, aproximadamente, R$ 0,54!</em></em></p>
<h3 id="heading-conclusoes">Conclusões</h3>
<p>Este projeto foi um case clássico de que, em Machine Learning, a melhor solução não é a maior ou mais nova tecnologia, mas aquela que resolve a dor do cliente de forma precisa, controlada e economicamente viável.</p>
<p>Às vezes, a verdadeira inovação está em saber o que NÃO usar.</p>
<blockquote>
<p><a target="_blank" href="https://www.linkedin.com/posts/helitonmrf_inteligenciaartificial-machinelearning-ia-activity-7387929893499568129-oZv0">Postado originalmente no LinkedIn.</a></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Reprodutibilidade na ciência: Git como um requisito básico em computação científica]]></title><description><![CDATA[Em pesquisa acadêmica, a programação já não pertence a uma área do conhecimento. De economistas modelando agentes heterogêneos a historiadores analisando arquivos digitais, o código computacional tornou-se uma linguagem franca da descoberta. Para a v...]]></description><link>https://blog.hellmrf.dev.br/reprodutibilidade-git-em-computacao-cientifica</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/reprodutibilidade-git-em-computacao-cientifica</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[research]]></category><category><![CDATA[Science ]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Mon, 20 Oct 2025 20:49:21 GMT</pubDate><content:encoded><![CDATA[<p>Em pesquisa acadêmica, a programação já não pertence a uma área do conhecimento. De economistas modelando agentes heterogêneos a historiadores analisando arquivos digitais, o código computacional tornou-se uma linguagem franca da descoberta. Para a vasta maioria, o objetivo não é se tornar um engenheiro de software, mas sim usar a <strong>computação para responder a perguntas científicas</strong>.</p>
<p>O desafio, portanto, não é técnico, mas cultural. Exige que o pesquisador <strong>veja o código não como um rascunho descartável, mas como um ativo de pesquisa primário</strong>, tão duradouro e auditável quanto uma amostra de laboratório ou um dado de campo. Adotar ferramentas de controle de versão como o Git não é aprender a programar melhor; é praticar ciência de forma mais rigorosa.</p>
<blockquote>
<p>“Qualquer tolo pode escrever código que um computador entende. Bons programadores escrevem código que humanos entendem.” — Martin Fowler (tradução livre)</p>
</blockquote>
<p>Se a pasta do seu projeto contém arquivos como <code>analise_final.py</code>, <code>analise_final_revisada.py</code> e o desesperado <code>analise_final_agora_vai.py</code>, você não está sozinho. Se a sua colaboração se parece com uma troca de e-mails com anexos <code>codigo_v2_comentarios_joao.zip</code>, saiba que essa é a norma em muitos departamentos. Mas essa prática, embora comum, representa um dos maiores e mais silenciosos riscos à integridade do trabalho científico moderno.</p>
<h2 id="heading-reprodutibilidade-em-computacao-cientifica">Reprodutibilidade em computação científica</h2>
<p>Enquanto você lê este artigo, economistas escrevem programas para simular o comportamento dos mercados; químicos e farmacêuticos escrevem código que prevê a eficácia de fármacos que ainda nem existem; biólogos ou cientistas sociais analisam grandes volumes de dados para encontrar padrões ocultos nos seus respectivos objetos de estudo…</p>
<p>Mesmo áreas tradicionalmente distantes da computação incorporam cada vez mais ferramentas computacionais em suas metodologias centrais. Para muitos pesquisadores nessas áreas, a programação não é vocação ou interesse principal, mas sim ferramenta necessária para responder às questões científicas que os motivam.</p>
<h3 id="heading-exemplo-o-que-pode-dar-errado">Exemplo: O que pode dar errado?</h3>
<p>Aprecie a seguir a história da doutoranda Ana Ribeiro, que facilmente suscitará identificação no leitor.</p>
<blockquote>
<p>Após incansáveis anos de trabalho, a pesquisadora Ana Ribeiro, doutoranda em neurociência computacional, finalmente submeteu um artigo promissor com seu modelo de rede neural para simular a tomada de decisão. Enquanto aguardava a resposta dos revisores, seu orientador, empolgado com os resultados, propôs duas novas e ousadas hipóteses para expandir o trabalho: uma envolvendo um mecanismo de "atenção seletiva" e outra, uma forma de "plasticidade sináptica" mais complexa.</p>
<p>Empolgada, Ana mergulhou de cabeça no desenvolvimento. A pasta do projeto logo se tornou um labirinto de arquivos como <code>modelo_v2_atencao.py</code> e <code>modelo_v3_plasticidade_teste.py</code>, com funções sendo reescritas e parâmetros sendo ajustados constantemente em múltiplas versões divergentes, sem um registro claro do que pertencia a qual experimento. Felizmente, as duas hipóteses forneceram resultados promissores que certamente integrariam sua tese.</p>
<p>Três meses depois, enquanto já preparava outro artigo com seus novos resultados, o e-mail que ela tanto esperava chegou. Eram boas notícias: o artigo anterior fora aceito com revisões menores. No entanto, uma das solicitações era aparentemente simples: "Poderia a autora rodar novamente a simulação da Figura 3, mas alterando um parâmetro de entrada, para validar a robustez do resultado?".</p>
<p>O que deveria ser uma tarefa de minutos se transformou em pânico! O código exato que gerou aquela figura não existia mais em sua forma original; ele havia sido canibalizado e modificado para os novos experimentos. Diante da confusão de arquivos, ela não conseguia garantir qual versão era a correta, tornando impossível atender ao pedido do revisor com integridade científica e colocando em risco a publicação de todo o seu trabalho.</p>
</blockquote>
<p>A história de Ana é uma ficção, mas a tragédia vivida por ela se situa nas proximidades da dura realidade de inúmeros pós-graduandos e pesquisadores — mais do que gostaríamos de admitir.</p>
<p>Se Ana tivesse usado Git, a versão submetida estaria marcada por uma <em>tag</em> ou seria facilmente recuperável pelo <em>commit</em> relacionado, criando um registro permanente e imutável. As novas e empolgantes hipóteses seriam exploradas em ramificações paralelas (<em>branches</em>), sem jamais tocar na versão "oficial" do artigo. O pedido do revisor seria atendido com a confiança e o rigor que a ciência exige, em vez de se tornar uma crise que ameaçava meses de trabalho.</p>
<h3 id="heading-o-codigo-e-a-metodologia">O código <em>é</em> a metodologia</h3>
<p>O código que produz um resultado científico não é mero subproduto da pesquisa; constitui a especificação exata e inequívoca de como os dados foram transformados em conclusões, carregando, em si próprio, a reprodutibilidade do trabalho. <strong>O código se torna a própria metodologia</strong>.</p>
<p>Nenhum pesquisador sério publicaria resultados experimentais sem documentar meticulosamente os procedimentos utilizados. Cadernos de laboratório registram todos os detalhes técnicos e observações relevantes para o trabalho. Essa documentação permite que o pesquisador original reconstrua o que foi feito meses ou anos depois, e permite que outros pesquisadores tentem replicar os resultados independentemente.</p>
<p>A lógica subjacente é tão fundamental à prática científica que raramente é questionada. <strong>Registrar todas as alterações do código-fonte ao longo de um projeto de pesquisa, documentar qual versão foi utilizada para gerar cada resultado, e manter histórico completo do desenvolvimento computacional são práticas de mesma natureza e mesma importância.</strong></p>
<p><strong>A reprodutibilidade não é um detalhe técnico ou uma virtude periférica — é a linha que distingue a ciência da opinião.</strong> Se um pesquisador não consegue recuperar a versão precisa do código que gerou os resultados de um artigo, esses resultados, estritamente falando, não são mais reprodutíveis. Um trabalho que não pode ser verificado por terceiros não pode servir como uma fundação confiável para a construção de novo conhecimento.</p>
<p>Modificar código sem documentar a mudança é equivalente a alterar um procedimento experimental sem registrar a alteração. Usar uma versão diferente do código sem a identificar claramente é equivalente a trocar um reagente químico sem anotá-lo. Perder o histórico de desenvolvimento do código é equivalente a rasgar páginas do caderno de laboratório.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Embora as conclusões de um trabalho constituam seu valor epistemológico central, a reprodutibilidade é a condição que as precede e as fundamenta. Numa ciência coletiva e internacional, <strong>um trabalho não deve ser reprodutível apenas para confirmar a conclusão do autor, mas para possibilitar à comunidade científica a obtenção de novas conclusões</strong>.</div>
</div>

<h2 id="heading-a-solucao-pragmatica">A solução pragmática</h2>
<p>Para a implementação do versionamento de código, serão mínimas as mudanças na sua rotina — mas elas te forçarão a trabalhar de forma organizada. Utilizaremos duas ferramentas, gratuitas e complementares, que são o padrão absoluto no mundo hoje. Tratam-se do Git e do GitHub.</p>
<p>O <a target="_blank" href="https://pt.wikipedia.org/wiki/Git"><strong>Git</strong></a> é um <em>sistema de controle de versões (VCS) distribuído</em>, ou seja, a ferramenta responsável por registrar e gerenciar toda a sequência de alterações do projeto desde a sua criação, e resolver conflitos entre diferentes versões existentes. Além disso, ele é capaz de reconstruir o estado exato do código-fonte em qualquer versão disponível. É uma ferramenta livre desenvolvida por Linus Torvalds, desenvolvedor do kernel Linux.</p>
<p>Já o <a target="_blank" href="https://github.com/">GitHub</a> é a central que armazenará seu projeto e o histórico do Git, permitindo a colaboração entre diferentes pessoas/máquinas ou simplesmente garantindo que seu projeto esteja sempre acessível. É um serviço gratuito adquirido pela Microsoft.</p>
<p>Em suma, você utiliza o Git para registrar as alterações no seu projeto local e para sincronizá-las com o GitHub.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Para instalar e configurar o Git, veja <a target="_self" href="https://blog.hellmrf.dev.br/configuracao-inicial-git-e-github-linux">este post (Linux/WSL)</a> ou <a target="_self" href="https://blog.hellmrf.dev.br/guia-de-configuracao-inicial-git-e-github-windows">este post (Windows)</a>.</div>
</div>

<p>No próximo artigo desta série, aprofundaremos no modelo mental adequado aos pesquisadores que desejam versionar seu código-fonte.</p>
]]></content:encoded></item><item><title><![CDATA[Guia de Configuração Inicial: Git e GitHub (Windows)]]></title><description><![CDATA[“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler

Esta é uma clássica citação de Martin Fowler, um dos mais influentes pensadores da engenharia de software moderna. Em u...]]></description><link>https://blog.hellmrf.dev.br/guia-de-configuracao-inicial-git-e-github-windows</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/guia-de-configuracao-inicial-git-e-github-windows</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Windows]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Mon, 20 Oct 2025 17:38:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1760981812092/73652062-54f8-461d-ad5b-ad059eb0c4a5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler</p>
</blockquote>
<p>Esta é uma clássica citação de Martin Fowler, um dos mais influentes pensadores da engenharia de software moderna. Em uma tradução livre:</p>
<blockquote>
<p>Qualquer tolo pode escrever código que um computador entende. Bons programadores escrevem código que humanos entendem.</p>
</blockquote>
<p>A citação de Fowler vai além da simples elegância do código; ela toca no coração do desenvolvimento de software como uma atividade colaborativa e duradoura. Um programa não é apenas um conjunto de instruções para uma máquina, mas também um documento vivo que será lido, modificado e mantido por outras pessoas — ou por você mesmo, meses depois.</p>
<p>Como, então, garantimos que a história e a evolução de nosso código sejam tão compreensíveis quanto o próprio código? A resposta está no <strong>controle de versão</strong>, e a ferramenta padrão da indústria para essa tarefa é o <strong>Git</strong>.</p>
<p>O Git é o sistema que permite registrar "fotografias" do seu projeto ao longo do tempo, entender quem alterou o quê e por quê, e colaborar de forma organizada com equipes de qualquer tamanho. No entanto, o Git por si só é apenas a ferramenta local. Para levar a colaboração a um nível global, utilizamos plataformas como o <strong>GitHub</strong>, que funciona como uma grande rede social para repositórios de código, permitindo que desenvolvedores de todo o mundo hospedem, compartilhem e contribuam para projetos de forma centralizada.</p>
<h3 id="heading-este-guia-e-para-mim">Este guia é para mim?</h3>
<p>Se seu objetivo é apenas explorar projetos públicos ou baixar o código-fonte de uma ferramenta no GitHub, você não precisa de nenhuma configuração especial. A plataforma funciona como qualquer outro site de download.</p>
<p>Contudo, para se tornar um participante ativo no ecossistema de desenvolvimento — seja para contribuir com um projeto de código aberto, trabalhar em uma equipe ou simplesmente para salvar seus próprios projetos de forma segura na nuvem — você precisará estabelecer um canal de comunicação seguro e autenticado entre sua máquina local (onde o Git opera) e os servidores do GitHub.</p>
<p>Este guia é focado exatamente nisso: configurar a ponte segura que lhe permitirá não apenas consumir, mas também <strong>criar e colaborar</strong>.</p>
<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Usando Linux? Veja <a target="_self" href="https://blog.hellmrf.dev.br/configuracao-inicial-git-e-github-linux">este tutorial</a> focado em sistemas Linux ou WSL.</div>
</div>

<h3 id="heading-nosso-ponto-de-partida-e-o-caminho-a-seguir">Nosso Ponto de Partida e o Caminho a Seguir</h3>
<p>Este artigo assume que você já compreendeu a importância fundamental do controle de versão e está pronto para configurar seu ambiente de desenvolvimento profissionalmente.</p>
<p><strong>Pré-requisitos:</strong></p>
<p>Para acompanhar este tutorial, você já deve ter realizado dois passos essenciais:</p>
<ul>
<li><p><strong>Possuir uma conta no</strong> <a target="_blank" href="https://github.com/"><strong>GitHub</strong></a><strong>:</strong> Sua identidade no universo do desenvolvimento colaborativo.</p>
</li>
<li><p><strong>Sistema Operacional Windows (10 ou 11)</strong>.</p>
</li>
</ul>
<p><strong>Objetivo:</strong></p>
<p>Ao final deste guia, teremos estabelecido uma conexão segura e permanente entre o cliente Git em sua máquina e sua conta no GitHub. Para isso, vamos:</p>
<ol>
<li><p>Realizar a instalação e a configuração inicial de identidade no Git;</p>
</li>
<li><p>Gerar um par de chaves criptográficas (SSH) para garantir uma comunicação segura e sem a necessidade de senhas;</p>
</li>
<li><p>Configurar sua máquina para usar a chave privada e o GitHub para reconhecer sua chave pública;</p>
</li>
<li><p>Garantir que seu ambiente local está totalmente autenticado e pronto para interagir com qualquer repositório ao qual você tenha acesso.</p>
</li>
</ol>
<p><strong>Objetivo:</strong></p>
<p>Ao final deste guia, teremos estabelecido uma conexão segura e permanente entre o cliente Git em sua máquina e sua conta no GitHub. Para isso, vamos:</p>
<ol>
<li><p>Realizar a configuração inicial de identidade no Git;</p>
</li>
<li><p>Gerar um par de chaves criptográficas (SSH) para garantir uma comunicação segura e sem a necessidade de senhas;</p>
</li>
<li><p>Configurar sua máquina para usar a chave privada e o GitHub para reconhecer sua chave pública;</p>
</li>
<li><p>Garantir que seu ambiente local está totalmente autenticado e pronto para interagir com qualquer repositório ao qual você tenha acesso.</p>
</li>
</ol>
<h2 id="heading-instrucoes">Instruções</h2>
<h3 id="heading-passo-1-instalacao-e-configuracao-de-identidade">Passo 1: Instalação e Configuração de Identidade</h3>
<p>Antes de estabelecermos a ponte segura com o GitHub, precisamos garantir que o Git esteja corretamente instalado e que saiba quem você é. Toda contribuição que você fizer será assinada com essa identidade.</p>
<h4 id="heading-11-instalando-o-git-for-windows">1.1. Instalando o Git for Windows</h4>
<p>Primeiro, vamos instalar o cliente Git em sua máquina. Para Windows, o pacote <strong>Git for Windows</strong> é a escolha padrão, pois inclui não apenas o Git, mas também o <strong>Git Bash</strong>, um terminal que nos dá acesso a comandos essenciais como <code>ssh-keygen</code>, de forma muito similar a ambientes Linux.</p>
<ol>
<li><p>Acesse o site oficial: <a target="_blank" href="https://git-scm.com/download/win"><strong>https://git-scm.com/download/win</strong></a></p>
</li>
<li><p>O download do instalador deve começar automaticamente. Execute-o.</p>
</li>
<li><p>Durante a instalação, você pode manter as opções padrão na maioria das telas. Elas são seguras e adequadas para a maioria dos usuários.</p>
</li>
</ol>
<p>Após a instalação, procure por <strong>"Git Bash"</strong> no menu Iniciar e abra-o. Todos os comandos a seguir deverão ser executados neste terminal.</p>
<p>Para verificar se a instalação foi bem-sucedida, execute:</p>
<pre><code class="lang-bash">git --version
</code></pre>
<p>Você deverá ver a versão do Git instalada, como <code>git version</code> <a target="_blank" href="http://2.42.0.windows"><code>2.42.0.windows</code></a><code>.1</code>.</p>
<h4 id="heading-12-configurando-sua-identidade">1.2. Configurando sua Identidade</h4>
<p>Agora, vamos nos apresentar ao Git. As informações de nome e e-mail que você configurar aqui serão usadas para "assinar" todos os seus <em>commits</em>, registrando sua autoria no histórico do projeto.</p>
<p><strong>É crucial que o e-mail seja o mesmo associado à sua conta do GitHub.</strong></p>
<p>Execute os seguintes comandos no <strong>Git Bash</strong>, substituindo os valores de exemplo pelos seus dados reais:</p>
<pre><code class="lang-bash">git config --global user.name <span class="hljs-string">"Seu Nome Completo"</span>

git config --global user.email <span class="hljs-string">"seu-email@exemplo.com"</span>
</code></pre>
<p>A flag <code>--global</code> garante que essa configuração seja aplicada para todos os seus projetos Git nesta máquina, evitando que você precise repeti-la a cada novo repositório.</p>
<h3 id="heading-passo-2-criando-a-ponte-segura-com-chaves-ssh">Passo 2: Criando a Ponte Segura com Chaves SSH</h3>
<p>A interação com o GitHub requer autenticação. Em vez de usar senhas, que podem ser inseguras e pouco práticas, usaremos o protocolo <strong>SSH (Secure Shell)</strong>.</p>
<p>O SSH funciona com um par de chaves criptográficas: uma <strong>privada</strong> e uma <strong>pública</strong>.</p>
<ul>
<li><p>A <strong>chave privada</strong> (<code>id_ed25519</code>) fica armazenada <strong>exclusivamente na sua máquina</strong>. Ela é o seu segredo, sua identidade digital. <strong>Nunca a compartilhe.</strong></p>
</li>
<li><p>A <strong>chave pública</strong> (<code>id_</code><a target="_blank" href="http://ed25519.pub"><code>ed25519.pub</code></a>) é o seu "cadeado". Você a entrega ao GitHub.</p>
</li>
</ul>
<p>Quando sua máquina tenta se conectar ao GitHub, ela envia uma mensagem assinada com sua chave privada. O GitHub usa a chave pública (o cadeado) que você forneceu para verificar essa assinatura. Se a verificação for bem-sucedida, o GitHub tem a certeza de que a conexão vem de você e autoriza o acesso.</p>
<blockquote>
<p><strong>Referência:</strong> <a target="_blank" href="https://docs.github.com/pt/authentication/connecting-to-github-with-ssh">Documentação oficial do GitHub sobre conexão com SSH</a></p>
</blockquote>
<h4 id="heading-21-gerando-seu-par-de-chaves">2.1. Gerando seu Par de Chaves</h4>
<p>Vamos criar as chaves no <strong>Git Bash</strong>. O comando a seguir utiliza o algoritmo <code>ed25519</code>, que é moderno e seguro.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Substitua pelo seu e-mail do GitHub</span>
ssh-keygen -t ed25519 -C <span class="hljs-string">"seu-email@exemplo.com"</span>
</code></pre>
<p>O <code>ssh-keygen</code> fará algumas perguntas:</p>
<ol>
<li><p><code>Enter file in which to save the key...</code>: Pressione <strong>Enter</strong> para aceitar o local padrão (<code>/c/Users/SEU_USUARIO/.ssh/id_ed25519</code>). É o local que o sistema espera encontrar a chave.</p>
</li>
<li><p><code>Enter passphrase (empty for no passphrase):</code>: Aqui você pode definir uma senha para sua chave SSH.</p>
<ul>
<li><p><strong>Recomendado:</strong> Digite uma senha segura. Isso adiciona uma camada extra de proteção. Se alguém conseguir acesso à sua máquina e copiar sua chave privada, ainda precisará dessa senha para usá-la.</p>
</li>
<li><p><strong>Alternativa:</strong> Pressione <strong>Enter</strong> (deixando em branco) se estiver em uma máquina pessoal e segura, e prefere não digitar a senha a cada conexão.</p>
</li>
</ul>
</li>
</ol>
<p>Ao final, dois arquivos terão sido criados no diretório <code>C:\Users\SEU_USUARIO\.ssh\</code>.</p>
<h4 id="heading-22-iniciando-o-agente-ssh-e-adicionando-sua-chave">2.2. Iniciando o Agente SSH e Adicionando sua Chave</h4>
<p>Para que você não precise digitar a senha da sua chave SSH toda vez que se conectar, usamos o <code>ssh-agent</code>, um programa que a mantém em memória de forma segura durante sua sessão.</p>
<p>Primeiro, inicie o agente em segundo plano no <strong>Git Bash</strong>:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">eval</span> <span class="hljs-string">"<span class="hljs-subst">$(ssh-agent -s)</span>"</span>
</code></pre>
<p>Em seguida, adicione sua chave privada ao agente:</p>
<pre><code class="lang-bash">ssh-add ~/.ssh/id_ed25519
</code></pre>
<p>Se você definiu uma senha no passo anterior, ela será solicitada agora.</p>
<h4 id="heading-23-adicionando-sua-chave-publica-ao-github">2.3. Adicionando sua Chave Pública ao GitHub</h4>
<p>O último passo é informar ao GitHub qual é a sua chave pública.</p>
<p>Primeiro, copie o conteúdo da sua chave pública para a área de transferência. No <strong>Git Bash</strong>, podemos usar o comando <code>clip</code>:</p>
<pre><code class="lang-bash">clip &lt; ~/.ssh/id_ed25519.pub
</code></pre>
<p><em>Se o comando acima falhar</em>, apenas exiba o conteúdo no terminal com <code>cat ~/.ssh/id_</code><a target="_blank" href="http://ed25519.pub"><code>ed25519.pub</code></a> e copie-o manualmente (selecione todo o texto do início <code>ssh-ed25519</code> até o final com seu e-mail, e pressione <code>Ctrl+C</code>).</p>
<p>O conteúdo copiado será algo como: <code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK...</code> <a target="_blank" href="mailto:seu-email@exemplo.com"><code>seu-email@exemplo.com</code></a></p>
<p>Agora, com a chave copiada, siga os passos no site do GitHub:</p>
<ol>
<li><p>Acesse o <a target="_blank" href="https://github.com">GitHub</a> e faça login.</p>
</li>
<li><p>Clique na sua foto de perfil no canto superior direito e vá para <a target="_blank" href="https://github.com/settings"><strong>Settings</strong></a>.</p>
</li>
<li><p>No menu esquerdo, clique em <a target="_blank" href="https://github.com/settings/keys"><strong>SSH and GPG keys</strong></a>.</p>
</li>
<li><p>Clique no botão verde <a target="_blank" href="https://github.com/settings/ssh/new"><strong>New SSH key</strong></a>.</p>
</li>
</ol>
<p>Ou, simplesmente, acesse <a target="_blank" href="https://github.com/settings/ssh/new">https://github.com/settings/ssh/new</a>. Estamos nesta tela:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760979384066/aab0708e-8489-4042-a9bd-92f481d125f8.png" alt="Captura de tela da página de configurações do GitHub, na seção &quot;SSH and GPG keys&quot;. O formulário &quot;Adicionar nova chave SSH&quot; está visível, com o campo &quot;Título&quot; preenchido como &quot;Laptop Pessoal Ubuntu&quot; e uma chave pública SSH colada no campo &quot;Key&quot;." class="image--center mx-auto" /></p>
<ol start="5">
<li><p>No campo <strong>Title</strong>, dê um nome descritivo para a chave, que ajude a identificar de qual máquina ela vem (ex: "Laptop Pessoal Windows" ou "Desktop Trabalho").</p>
</li>
<li><p>No campo <strong>Key</strong>, cole a chave pública que você copiou.</p>
</li>
<li><p>Clique em <strong>Add SSH key</strong>. O GitHub pode pedir sua senha para confirmar a ação.</p>
</li>
</ol>
<h3 id="heading-passo-3-verificando-a-conexao">Passo 3: Verificando a Conexão</h3>
<p>Tudo está configurado! Agora, vamos realizar um teste final para garantir que sua máquina consegue se comunicar e se autenticar com o GitHub via SSH.</p>
<p>Execute o seguinte comando no <strong>Git Bash</strong>:</p>
<pre><code class="lang-bash">ssh -T git@github.com
</code></pre>
<p>Na primeira vez, você poderá ver um aviso como:</p>
<pre><code class="lang-plaintext">The authenticity of host 'github.com (IP_ADDRESS)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
</code></pre>
<p>Isso é normal. Digite <code>yes</code> e pressione <strong>Enter</strong>.</p>
<p>Se tudo deu certo, você receberá uma mensagem de boas-vindas:</p>
<blockquote>
<p>Hi <code>seu-usuario</code>! You've successfully authenticated, but GitHub does not provide shell access.</p>
</blockquote>
<p><strong>Parabéns!</strong> Sua máquina está totalmente configurada para interagir de forma segura com o GitHub. Você está pronto para clonar repositórios privados, enviar suas alterações (<code>push</code>) e colaborar no ecossistema de desenvolvimento.</p>
]]></content:encoded></item><item><title><![CDATA[Guia de Configuração Inicial: Git e GitHub]]></title><description><![CDATA[“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler

Esta é uma clássica citação de Martin Fowler, um dos mais influentes pensadores da engenharia de software moderna. Em u...]]></description><link>https://blog.hellmrf.dev.br/configuracao-inicial-git-e-github-linux</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/configuracao-inicial-git-e-github-linux</guid><category><![CDATA[Git]]></category><category><![CDATA[GitHub]]></category><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Mon, 20 Oct 2025 17:17:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1760981021034/a81700e4-fbbf-4df0-982b-8e91b692a82b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” — Martin Fowler</p>
</blockquote>
<p>Esta é uma clássica citação de Martin Fowler, um dos mais influentes pensadores da engenharia de software moderna. Em uma tradução livre:</p>
<blockquote>
<p>Qualquer tolo pode escrever código que um computador entende. Bons programadores escrevem código que humanos entendem.</p>
</blockquote>
<p>A citação de Fowler vai além da simples elegância do código; ela toca no coração do desenvolvimento de software como uma atividade colaborativa e duradoura. Um programa não é apenas um conjunto de instruções para uma máquina, mas também um documento vivo que será lido, modificado e mantido por outras pessoas — ou por você mesmo, meses depois.</p>
<p>Como, então, garantimos que a história e a evolução de nosso código sejam tão compreensíveis quanto o próprio código? A resposta está no <strong>controle de versão</strong>, e a ferramenta padrão da indústria para essa tarefa é o <strong>Git</strong>.</p>
<p>O Git é o sistema que permite registrar "fotografias" do seu projeto ao longo do tempo, entender quem alterou o quê e por quê, e colaborar de forma organizada com equipes de qualquer tamanho. No entanto, o Git por si só é apenas a ferramenta local. Para levar a colaboração a um nível global, utilizamos plataformas como o <strong>GitHub</strong>, que funciona como uma grande rede social para repositórios de código, permitindo que desenvolvedores de todo o mundo hospedem, compartilhem e contribuam para projetos de forma centralizada.</p>
<h3 id="heading-este-guia-e-para-mim">Este guia é para mim?</h3>
<p>Se seu objetivo é apenas explorar projetos públicos ou baixar o código-fonte de uma ferramenta no GitHub, você não precisa de nenhuma configuração especial. A plataforma funciona como qualquer outro site de download.</p>
<p>Contudo, para se tornar um participante ativo no ecossistema de desenvolvimento — seja para contribuir com um projeto de código aberto, trabalhar em uma equipe ou simplesmente para salvar seus próprios projetos de forma segura na nuvem — você precisará estabelecer um canal de comunicação seguro e autenticado entre sua máquina local (onde o Git opera) e os servidores do GitHub.</p>
<p>Este guia é focado exatamente nisso: configurar a ponte segura que lhe permitirá não apenas consumir, mas também <strong>criar e colaborar</strong>.</p>
<h3 id="heading-nosso-ponto-de-partida-e-o-caminho-a-seguir">Nosso Ponto de Partida e o Caminho a Seguir</h3>
<p>Este artigo assume que você já compreendeu a importância fundamental do controle de versão e está pronto para configurar seu ambiente de desenvolvimento profissionalmente.</p>
<p><strong>Pré-requisitos:</strong></p>
<p>Para acompanhar este tutorial, você já deve ter realizado dois passos essenciais:</p>
<ul>
<li><p><strong>Possuir uma conta no</strong> <a target="_blank" href="https://github.com/"><strong>GitHub</strong></a><strong>:</strong> Sua identidade no universo do desenvolvimento colaborativo.</p>
</li>
<li><p><strong>Sistema Linux ou WSL</strong>.</p>
</li>
</ul>
<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Usando Windows? Veja <a target="_self" href="https://blog.hellmrf.dev.br/guia-de-configuracao-inicial-git-e-github-windows">este tutorial</a> focado em Windows.</div>
</div>

<p><strong>Objetivo:</strong></p>
<p>Ao final deste guia, teremos estabelecido uma conexão segura e permanente entre o cliente Git em sua máquina e sua conta no GitHub. Para isso, vamos:</p>
<ol>
<li><p>Realizar a configuração inicial de identidade no Git;</p>
</li>
<li><p>Gerar um par de chaves criptográficas (SSH) para garantir uma comunicação segura e sem a necessidade de senhas;</p>
</li>
<li><p>Configurar sua máquina para usar a chave privada e o GitHub para reconhecer sua chave pública;</p>
</li>
<li><p>Garantir que seu ambiente local está totalmente autenticado e pronto para interagir com qualquer repositório ao qual você tenha acesso.</p>
</li>
</ol>
<h2 id="heading-instrucoes">Instruções</h2>
<h3 id="heading-passo-1-instalacao-e-configuracao-de-identidade">Passo 1: Instalação e Configuração de Identidade</h3>
<p>Antes de estabelecermos a ponte segura com o GitHub, precisamos garantir que o Git esteja corretamente instalado e que saiba quem você é. Toda contribuição que você fizer será assinada com essa identidade.</p>
<h4 id="heading-11-instalando-o-git">1.1. Instalando o Git</h4>
<p>Primeiro, vamos instalar o cliente <code>git</code> em sua máquina. Para sistemas baseados em Debian/Ubuntu, também instalaremos o <code>xclip</code>, um utilitário que nos ajudará a copiar a chave pública para a área de transferência de forma simples mais adiante.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Atualiza a lista de pacotes disponíveis</span>
sudo apt update -y

<span class="hljs-comment"># Instala o git e o utilitário xclip</span>
sudo apt install -y git xclip
</code></pre>
<p>Para outras distribuições Linux ou sistemas operacionais, consulte o <a target="_blank" href="https://git-scm.com/downloads">guia de instalação oficial</a>.</p>
<p>Após a instalação, verifique se o comando foi bem-sucedido executando:</p>
<pre><code class="lang-bash">git --version
</code></pre>
<p>Você deverá ver a versão do Git instalada, como <code>git version 2.34.1</code>.</p>
<h4 id="heading-12-configurando-sua-identidade">1.2. Configurando sua Identidade</h4>
<p>Agora, vamos nos apresentar ao Git. As informações de nome e e-mail que você configurar aqui serão usadas para "assinar" todos os seus <em>commits</em>, registrando sua autoria no histórico do projeto.</p>
<p><strong>É crucial que o e-mail seja o mesmo associado à sua conta do GitHub.</strong></p>
<p>Execute os seguintes comandos no seu terminal, substituindo os valores de exemplo pelos seus dados reais:</p>
<pre><code class="lang-bash">git config --global user.name <span class="hljs-string">"Seu Nome Completo"</span>

git config --global user.email <span class="hljs-string">"seu-email@exemplo.com"</span>
</code></pre>
<p>A flag <code>--global</code> garante que essa configuração seja aplicada para todos os seus projetos Git nesta máquina, evitando que você precise repeti-la a cada novo repositório.</p>
<h3 id="heading-passo-2-criando-a-ponte-segura-com-chaves-ssh">Passo 2: Criando a Ponte Segura com Chaves SSH</h3>
<p>A interação com o GitHub requer autenticação. Em vez de usar senhas, que podem ser inseguras e pouco práticas (especialmente com autenticação de dois fatores), usaremos o protocolo <strong>SSH (Secure Shell)</strong>.</p>
<p>O SSH funciona com um par de chaves criptográficas: uma <strong>privada</strong> e uma <strong>pública</strong>.</p>
<ul>
<li><p>A <strong>chave privada</strong> (<code>id_ed25519</code>) fica armazenada <strong>exclusivamente na sua máquina</strong>. Ela é o seu segredo, sua identidade digital. <strong>Nunca a compartilhe.</strong></p>
</li>
<li><p>A <strong>chave pública</strong> (<code>id_</code><a target="_blank" href="http://ed25519.pub"><code>ed25519.pub</code></a>) é o seu "cadeado". Você a entrega ao GitHub.</p>
</li>
</ul>
<p>Quando sua máquina tenta se conectar ao GitHub, ela envia uma mensagem assinada com sua chave privada. O GitHub usa a chave pública (o cadeado) que você forneceu para verificar essa assinatura. Se a verificação for bem-sucedida, o GitHub tem a certeza de que a conexão vem de você e autoriza o acesso.</p>
<blockquote>
<p><strong>Referência:</strong> <a target="_blank" href="https://docs.github.com/pt/authentication/connecting-to-github-with-ssh">Documentação oficial do GitHub sobre conexão com SSH</a></p>
</blockquote>
<h4 id="heading-21-gerando-seu-par-de-chaves">2.1. Gerando seu Par de Chaves</h4>
<p>Vamos criar as chaves. O comando a seguir utiliza o algoritmo <code>ed25519</code>, que é moderno e seguro.</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Substitua pelo seu e-mail do GitHub</span>
ssh-keygen -t ed25519 -C <span class="hljs-string">"seu-email@exemplo.com"</span>
</code></pre>
<p>O <code>ssh-keygen</code> fará algumas perguntas:</p>
<ol>
<li><p><code>Enter file in which to save the key...</code>: Pressione <strong>Enter</strong> para aceitar o local padrão (<code>~/.ssh/id_ed25519</code>). É o local que o sistema espera encontrar a chave.</p>
</li>
<li><p><code>Enter passphrase (empty for no passphrase):</code>: Aqui você pode definir uma senha para sua chave SSH.</p>
<ul>
<li><p><strong>Recomendado:</strong> Digite uma senha segura. Isso adiciona uma camada extra de proteção. Se alguém conseguir acesso à sua máquina e copiar sua chave privada, ainda precisará dessa senha para usá-la.</p>
</li>
<li><p><strong>Alternativa:</strong> Pressione <strong>Enter</strong> (deixando em branco) se estiver em uma máquina pessoal e segura, e prefere não digitar a senha a cada conexão.</p>
</li>
</ul>
</li>
</ol>
<p>Ao final, dois arquivos terão sido criados no diretório <code>~/.ssh/</code>:</p>
<ul>
<li><p><code>~/.ssh/id_ed25519</code> (chave privada); e</p>
</li>
<li><p><code>~/.ssh/id_</code><a target="_blank" href="http://ed25519.pub"><code>ed25519.pub</code></a> (chave pública).</p>
</li>
</ul>
<h4 id="heading-22-iniciando-o-agente-ssh-e-adicionando-sua-chave">2.2. Iniciando o Agente SSH e Adicionando sua Chave</h4>
<p>Para que você não precise digitar a senha da sua chave SSH toda vez que se conectar, usamos o <code>ssh-agent</code>, um programa que a mantém em memória de forma segura durante sua sessão.</p>
<p>Primeiro, inicie o agente em segundo plano:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">eval</span> <span class="hljs-string">"<span class="hljs-subst">$(ssh-agent -s)</span>"</span>
</code></pre>
<p>Em seguida, adicione sua chave privada ao agente:</p>
<pre><code class="lang-bash">ssh-add ~/.ssh/id_ed25519
</code></pre>
<p>Se você definiu uma senha no passo anterior, ela será solicitada agora.</p>
<h4 id="heading-23-adicionando-sua-chave-publica-ao-github">2.3. Adicionando sua Chave Pública ao GitHub</h4>
<p>O último passo é informar ao GitHub qual é a sua chave pública.</p>
<p>Primeiro, copie o conteúdo da sua chave pública para a área de transferência. O <code>xclip</code> que instalamos torna isso muito fácil:</p>
<pre><code class="lang-bash">xclip -selection clipboard &lt; ~/.ssh/id_ed25519.pub
</code></pre>
<p><em>Se você não tiver o</em> <code>xclip</code>, apenas exiba o conteúdo no terminal com <code>cat ~/.ssh/id_</code><a target="_blank" href="http://ed25519.pub"><code>ed25519.pub</code></a> e copie-o manualmente.</p>
<p>O conteúdo copiado será algo como: <code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK...</code> <a target="_blank" href="mailto:seu-email@exemplo.com"><code>seu-email@exemplo.com</code></a></p>
<p>Agora, com a chave copiada, siga os passos no site do GitHub:</p>
<ol>
<li><p>Acesse o <a target="_blank" href="https://github.com">GitHub</a> e faça login.</p>
</li>
<li><p>Clique na sua foto de perfil no canto superior direito e vá para <a target="_blank" href="https://github.com/settings"><strong>Settings</strong></a>.</p>
</li>
<li><p>No menu esquerdo, clique em <a target="_blank" href="https://github.com/settings/keys"><strong>SSH and GPG keys</strong></a>.</p>
</li>
<li><p>Clique no botão verde <a target="_blank" href="https://github.com/settings/ssh/new"><strong>New SSH key</strong></a>.</p>
</li>
</ol>
<p>Ou, simplesmente, acesse <a target="_blank" href="https://github.com/settings/ssh/new">https://github.com/settings/ssh/new</a>. Estamos nesta tela:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1760979384066/aab0708e-8489-4042-a9bd-92f481d125f8.png" alt="Captura de tela da página de configurações do GitHub, na seção &quot;SSH and GPG keys&quot;. O formulário &quot;Adicionar nova chave SSH&quot; está visível, com o campo &quot;Título&quot; preenchido como &quot;Laptop Pessoal Ubuntu&quot; e uma chave pública SSH colada no campo &quot;Key&quot;." class="image--center mx-auto" /></p>
<ol start="5">
<li><p>No campo <strong>Title</strong>, dê um nome descritivo para a chave, que ajude a identificar de qual máquina ela vem (ex: "Laptop Pessoal Ubuntu" ou "Desktop Trabalho").</p>
</li>
<li><p>No campo <strong>Key</strong>, cole a chave pública que você copiou.</p>
</li>
<li><p>Clique em <strong>Add SSH key</strong>. O GitHub pode pedir sua senha para confirmar a ação.</p>
</li>
</ol>
<h3 id="heading-passo-3-verificando-a-conexao">Passo 3: Verificando a Conexão</h3>
<p>Tudo está configurado! Agora, vamos realizar um teste final para garantir que sua máquina consegue se comunicar e se autenticar com o GitHub via SSH.</p>
<p>Execute o seguinte comando no terminal:</p>
<pre><code class="lang-bash">ssh -T git@github.com
</code></pre>
<p>Na primeira vez, você poderá ver um aviso como:</p>
<pre><code class="lang-plaintext">The authenticity of host 'github.com (IP_ADDRESS)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
</code></pre>
<p>Isso é normal. Digite <code>yes</code> e pressione <strong>Enter</strong>.</p>
<p>Se tudo deu certo, você receberá uma mensagem de boas-vindas:</p>
<blockquote>
<p>Hi <code>seu-usuario</code>! You've successfully authenticated, but GitHub does not provide shell access.</p>
</blockquote>
<p><strong>Parabéns!</strong> Sua máquina está totalmente configurada para interagir de forma segura com o GitHub. Você está pronto para clonar repositórios privados, enviar suas alterações (<code>push</code>) e colaborar no ecossistema de desenvolvimento.</p>
]]></content:encoded></item><item><title><![CDATA[Corte vídeos de graça e no terminal]]></title><description><![CDATA[Manipular vídeos nem sempre exige interfaces gráficas pesadas — muitas vezes, o terminal oferece recursos incrivelmente eficazes e elegantes. Neste artigo, mostramos como extrair segmentos específicos de um arquivo utilizando o venerável FFmpeg.
Por ...]]></description><link>https://blog.hellmrf.dev.br/ffmpeg-corte-videos-no-terminal</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/ffmpeg-corte-videos-no-terminal</guid><category><![CDATA[terminal]]></category><category><![CDATA[FFmpeg]]></category><category><![CDATA[video]]></category><category><![CDATA[Linux]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Thu, 07 Aug 2025 06:42:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754549420376/c9103348-666d-419a-a68d-8fc73cf74041.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Manipular vídeos nem sempre exige interfaces gráficas pesadas — muitas vezes, o <strong>terminal</strong> oferece recursos incrivelmente eficazes e elegantes. Neste artigo, mostramos como extrair segmentos específicos de um arquivo utilizando o venerável <a target="_blank" href="https://ffmpeg.org/">FFmpeg</a>.</p>
<h2 id="heading-por-que-recorrer-ao-ffmpeg">Por que recorrer ao FFmpeg?</h2>
<ul>
<li><p><strong>Onipresença</strong> — está disponível em praticamente todos os sistemas operacionais.</p>
</li>
<li><p><strong>Flexibilidade</strong> — oferece uma miríade de filtros, codecs e parâmetros.</p>
</li>
<li><p><strong>Automação</strong> — integra-se facilmente a <em>scripts</em> e <em>pipelines</em> de pós-produção.</p>
</li>
</ul>
<p>Para ações corriqueiras, como recortar um trecho para redes sociais ou remover introduções longas, o FFmpeg torna-se insuperável em velocidade e controle.</p>
<h2 id="heading-instalacao-do-ffmpeg-no-linux">Instalação do FFmpeg no Linux</h2>
<p>No ecossistema GNU/Linux a instalação costuma ser trivial. Seguem os comandos nos gerenciadores mais comuns:</p>
<pre><code class="lang-bash"><span class="hljs-comment"># Debian, Ubuntu e derivados</span>
sudo apt update &amp;&amp; sudo apt install -y ffmpeg

<span class="hljs-comment"># Fedora</span>
sudo dnf install ffmpeg

<span class="hljs-comment"># Arch Linux e Manjaro</span>
sudo pacman -S ffmpeg
</code></pre>
<blockquote>
<p><strong>Dica</strong>: verifique sempre a versão instalada com <code>ffmpeg -version</code>; versões antigas podem carecer de determinados <em>codecs</em> ou <em>presets</em>.</p>
</blockquote>
<h2 id="heading-dois-enfoques-para-cortar-videos">Dois enfoques para cortar vídeos</h2>
<p>Propomos dois <em>scripts</em> complementares. Ambos preservam a trilha de áudio original (<code>-c:a copy</code>) e re-codificam o vídeo em <strong>H.264</strong> (<code>-c:v libx264</code>) para máxima compatibilidade.</p>
<h3 id="heading-1-corte-por-duracao-gisthttpsgistgithubcomhellmrfead909a8a8a093799e03b0aa3b6a7c23file-cutvideoduration-sh">1. Corte por duração (<a target="_blank" href="https://gist.github.com/hellmrf/ead909a8a8a093799e03b0aa3b6a7c23#file-cut_video_duration-sh">gist</a>)</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># input:  video.mp4</span>
<span class="hljs-comment"># início: 00:01:36  (hh:mm:ss)</span>
<span class="hljs-comment"># duração: 1 minuto</span>
<span class="hljs-comment"># output: video_cropped.mp4</span>
ffmpeg -c:v libx264 -preset veryfast -crf 18 -c:a copy \
  -ss 00:01:36 -t 00:01:00 \
  -i video.mp4 \
  video_cropped.mp4
</code></pre>
<p>Utilize este método quando souber <strong>exatamente</strong> o comprimento desejado (aqui, 1 min).</p>
<h3 id="heading-2-corte-por-timecode-final-gisthttpsgistgithubcomhellmrfead909a8a8a093799e03b0aa3b6a7c23file-cutvideotimecode-sh">2. Corte por timecode final (<a target="_blank" href="https://gist.github.com/hellmrf/ead909a8a8a093799e03b0aa3b6a7c23#file-cut_video_timecode-sh">gist</a>)</h3>
<pre><code class="lang-bash"><span class="hljs-comment"># input:  video.mp4</span>
<span class="hljs-comment"># início: 00:01:36</span>
<span class="hljs-comment"># fim:    00:02:36</span>
<span class="hljs-comment"># output: video_cropped.mp4</span>
ffmpeg -c:v libx264 -preset veryfast -crf 18 -c:a copy \
  -ss 00:01:36 -to 00:02:36 \
  -i video.mp4 \
  video_cropped.mp4
</code></pre>
<p>Ideal quando se prefere demarcar o <strong>instante de término</strong>, em vez de calcular a duração.</p>
<h2 id="heading-anatomia-dos-parametros-essenciais">Anatomia dos parâmetros essenciais</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Parâmetro</td><td>Significado</td><td>Observações</td></tr>
</thead>
<tbody>
<tr>
<td><code>-ss 00:01:36</code></td><td>Ponto de partida</td><td><em>Seek</em> rápido antes de ler o arquivo inteiro.</td></tr>
<tr>
<td><code>-t 00:01:00</code></td><td>Duração a extrair</td><td>Usado apenas no primeiro <em>script</em>.</td></tr>
<tr>
<td><code>-to 00:02:36</code></td><td>Ponto final absoluto</td><td>Alternativa ao <code>-t</code>.</td></tr>
<tr>
<td><code>-c:v libx264</code></td><td>Codec de vídeo</td><td><strong>H.264</strong> é praticamente universal.</td></tr>
<tr>
<td><code>-preset veryfast</code></td><td>Complexidade de compressão</td><td>Quanto mais lento, menor o arquivo (e vice-versa).</td></tr>
<tr>
<td><code>-crf 18</code></td><td>Fator de qualidade</td><td>Valores de 18–23 costumam ser “visual-lossless”.</td></tr>
<tr>
<td><code>-c:a copy</code></td><td>Cópia do áudio</td><td>Evita recompressão e economiza tempo.</td></tr>
</tbody>
</table>
</div><h2 id="heading-refinamentos-possiveis">Refinamentos possíveis</h2>
<ol>
<li><p><strong><em>Fast seek</em></strong>: para ganho adicional de velocidade, mova o <code>-ss</code> antes do <code>-i</code>.</p>
</li>
<li><p><strong>Códigos‐fonte portáteis</strong>: troque <code>libx264</code> por <code>copy</code> caso seu destino aceite o codec de origem.</p>
</li>
<li><p><strong>Filtragem de <em>keyframes</em></strong>: acrescente <code>-force_key_frames</code> para cortes mais suaves em players exigentes.</p>
</li>
</ol>
<h2 id="heading-epilogo">Epílogo</h2>
<p>Com alguns comandos cirúrgicos, você domina o tempo do seu vídeo com a elegância de quem esculpe mármore. Experimente, ajuste parâmetros conforme a necessidade e usufrua da potência do FFmpeg em seu fluxo de trabalho diário. Afinal, poucas ferramentas combinam tanta robustez com tamanha leveza.</p>
<p><em>Bons cortes e até a próxima!</em></p>
]]></content:encoded></item><item><title><![CDATA[Instalando o Chemdraw no Linux]]></title><description><![CDATA[A migração para o Linux é dificultada para algumas pessoas devido à incompatibilidade de alguns programas. Um desses programas é o ChemDraw, importante programa de ilustrações para químicos que não está disponível no sistema do pinguim. Embora a util...]]></description><link>https://blog.hellmrf.dev.br/instalando-o-chemdraw-no-linux</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/instalando-o-chemdraw-no-linux</guid><category><![CDATA[Linux]]></category><category><![CDATA[chemistry]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Tue, 06 Oct 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A migração para o Linux é dificultada para algumas pessoas devido à incompatibilidade de alguns programas. Um desses programas é o ChemDraw, importante programa de ilustrações para químicos que não está disponível no sistema do pinguim. Embora a utilização do <a target="_blank" href="https://ctan.org/pkg/chemfig"><code>chemfig</code></a> com LaTeX seja uma ótima opção, a sintaxe pode assustar novos usuários. Por isso, neste tutorial mostrarei como instalar o ChemDraw no Linux utilizando o Wine.</p>
<p>Este tutorial foi feito utilizando-se o ChemDraw 16.0, Wine 5.0 e Ubuntu 20.04.</p>
<h2 id="heading-um-pouco-de-vinho-wine">Um pouco de vinho: Wine</h2>
<p>O Wine (sigla recursiva para <em>Wine Is Not an Emulator</em>) é uma camada de compatibilidade para a execução em sistemas Unix de programas desenvolvidos para Windows. Para instalá-lo, siga as <a target="_blank" href="https://wiki.winehq.org/Download">instruções oficiais</a> para sua distribuição.</p>
<p>Escolha um diretório para armazenar os arquivos relacionados ao Windows. O padrão é <code>~/.wine</code> e é o que será utilizado. Altere como quiser. Abra um terminal e execute os seguintes comandos:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">export</span> WINEPREFIX=~/.wine
<span class="hljs-built_in">export</span> WINEARCH=win32
</code></pre>
<p>Utilize a mesma instância do terminal até o fim do tutorial. Caso precise criar uma nova, rode esses comandos novamente. Execute agora:</p>
<pre><code class="lang-bash">winecfg
</code></pre>
<p>Você deverá ver, em <code>~/.wine/dosdevices/</code>, as unidades normalmente encontradas no sistema da Microsoft.</p>
<h2 id="heading-truques-de-bar-winetricks">Truques de bar: winetricks</h2>
<p>Winetricks é um script auxiliar do Wine para a instalação de dependências do mundo Windows. Instale-o seguindo as <a target="_blank" href="https://wiki.winehq.org/Winetricks">instruções oficiais</a>. Se você seguiu essas instruções corretamente, estará agora em <code>~/Downloads/</code> e poderá acessar o arquivo <code>winetricks</code>. Execute o seguinte comando no terminal (se ainda não tiver feito):</p>
<pre><code class="lang-bash">chmod +x winetricks
</code></pre>
<h2 id="heading-instalando-algumas-dependencias">Instalando algumas dependências</h2>
<p>Você precisará instalar três dependências que não são distribuídas por padrão com o Wine. São elas:</p>
<ul>
<li><code>dotnet40</code></li>
<li><code>gdiplus</code></li>
<li><code>vcrun2013</code></li>
</ul>
<p>Instale-as com o seguinte comando no terminal, de dentro da pasta do <code>winetricks</code>:</p>
<pre><code class="lang-bash">./winetricks dotnet40 gdiplus vcrun2013
</code></pre>
<p>Aguarde alguns minutos enquanto a instalação acontece. Siga as instruções nas interfaces Windows-like que serão mostradas.</p>
<h2 id="heading-instalando-o-software">Instalando o <em>software</em></h2>
<p>Visite o <a target="_blank" href="https://www.perkinelmer.com/product/chemdraw-professional-chemdrawpro">site oficial</a> e faça o download para Windows de sua cópia do programa. Escolha entre comprar agora ou fazer um teste gratuito. Com sua cópia baixada, use o terminal para visitar a pasta que contém o instalador .msi (se necessário, descompacte o arquivo). Supondo que o tenha baixado em <code>~/Downloads/ChemDraw/</code>, faça:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">cd</span> ~/Downloads/ChemDraw/
</code></pre>
<p>Execute o seguinte (lembre-se de corrigir o nome do arquivo ou começar a digitar e teclar "tab" para completar automaticamente):</p>
<pre><code class="lang-bash">wine msiexec /i <span class="hljs-string">"Nome do arquivo.msi"</span>
</code></pre>
<p>Você verá um instalador muito semelhante ao do Windows e poderá fazer a instalação como de costume. Os ícones dos programas instalados aparecerão no seu menu e funcionarão quase como programas nativos.</p>
]]></content:encoded></item><item><title><![CDATA[Script em Python que altera a hora automaticamente no Windows]]></title><description><![CDATA[Saudações! No meu dia-a-dia, eu utilizo tanto o Windows 10 quando o Ubuntu 20.04 em dual boot (mais o segundo que o primeiro). Entretanto, toda vez que eu entrava no Ubuntu e, mais tarde, no Windows, este se apresentava três horas adiantado (sim, o W...]]></description><link>https://blog.hellmrf.dev.br/script-em-python-que-altera-a-hora-automaticamente-no-windows</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/script-em-python-que-altera-a-hora-automaticamente-no-windows</guid><category><![CDATA[Python]]></category><category><![CDATA[Windows]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Sat, 25 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Saudações! No meu dia-a-dia, eu utilizo tanto o Windows 10 quando o Ubuntu 20.04 em dual boot (mais o segundo que o primeiro). Entretanto, toda vez que eu entrava no Ubuntu e, mais tarde, no Windows, este se apresentava três horas adiantado (sim, o Windows à frente do tempo pode soar um paradoxo). A solução era, a cada novo boot, ir até as configurações, desligar a hora automática e ligar de novo. Porém somos desenvolvedores e essa era uma ótima oportunidade de se automatizar alguma coisa. Veja agora como criei um script em Python que atualiza automaticamente a hora do Windows sempre que o sistema é inicializado.</p>
<p>Antes de tudo, aos colegas que utilizam Linux religiosamente, também é possível fazer isso, usando outras bibliotecas e outro método. Não vou apresentar aqui porque o Linux (ao menos meu Ubuntu 20.04) é inteligente o suficiente para fazer isso <em>out of the box</em> durante a inicialização...</p>
<p>Isto posto, vamos aos trabalhos.</p>
<h2 id="heading-um-pouco-de-pesquisa">Um pouco de pesquisa</h2>
<p>Diferente do que quem está começando a programar pode pensar, poucos programadores de fato sabem fazer qualquer coisa sem nenhuma consulta à internet. A verdade é que, como programadores, devemos saber descobrir de maneira efetiva a melhor forma de fazer algo, ter intuição e etc. Sendo assim, eu não sabia exatamente como definir a hora do Windows no Python. Eu já sabia que precisaria obter a hora de algum lugar, mas também não tinha decidido de onde.</p>
<p>Para começar a brincadeira, fui à internet procurar algumas bibliotecas que poderiam facilitar meu trabalho de definir a hora do sistema. Encontrei uma lib chamada <a target="_blank" href="https://pypi.org/project/pywin32/">pywin32</a> que permite, entre outras coisas, definir a hora do sistema. A forma como ela faz isso é a seguinte:</p>
<pre><code class="lang-python"><span class="hljs-comment"># Sim, o import é diferente do nome canônico da biblioteca...</span>
<span class="hljs-keyword">import</span> win32api

<span class="hljs-comment"># A hora deve ser atribuída em fuso UTC (ou GMT, a hora do pacífico).</span>
<span class="hljs-comment"># O fuso horário correto é definido nas configurações do sistema operacional.</span>
win32api.SetSystemTime(year, month, weekday, day, hour, minutes, seconds, milliseconds)
</code></pre>
<p>Ótimo. Agora eu só precisava obter a hora correta na internet. A ideia inicial foi entrar em algum site oficial e usar <a target="_blank" href="https://pt.wikipedia.org/wiki/Coleta_de_dados_web"><em>web scraping</em></a> para obter a hora atual. Como eu falei acima sobre intuição, um alerta piscante surgiu imediatamente na minha cabeça dizendo <a target="_blank" href="https://en.wikipedia.org/wiki/Overengineering"><strong>overengineering</strong></a> (engenharia excessiva, tipo construir uma ponte Rio-Niterói para um carrinho de controle remoto: funciona, mas não é uma boa ideia). Provavelmente existia alguma API pra obter isso, me restando apenas uma pesquisa decente e uma linha de código. Como em qualquer dia normal, caí no <a target="_blank" href="https://stackoverflow.com/questions/908550/python-getting-date-online">StackOverflow</a> e encontrei <a target="_blank" href="http://just-the-time.appspot.com/">um serviço</a> que retorna nada mais que a hora atual em formato ISO (esse formato da imagem abaixo). Perfeito! Era exatamente o que eu queria.</p>
<p><img src="https://i.snipboard.io/IiAVu0.jpg" alt="Serviço retornando apenas a hora" /></p>
<p>Usando um parâmetro get <code>?f=</code> também é possível obter a data em outros formatos, mas não vem ao caso.</p>
<p>Com isso tudo em mãos, bastava obter a hora (e já sabemos como), definir no sistema operacional (o que também sabemos como) e fazer isso inicializar com o sistema (isso a gente resolve mais tarde hehe).</p>
<h2 id="heading-coding-time">Coding time</h2>
<p>Abaixo o código comentado de como fiz as duas primeiras coisas.</p>
<pre><code class="lang-python"><span class="hljs-keyword">import</span> os
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">import</span> urllib3
<span class="hljs-keyword">import</span> win32api
<span class="hljs-keyword">import</span> logging

<span class="hljs-comment"># Fazemos a requisição aqui</span>
response = urllib3.PoolManager().request(<span class="hljs-string">'GET'</span>, <span class="hljs-string">"http://just-the-time.appspot.com"</span>)

<span class="hljs-comment"># Se o status HTTP não for 200 (OK), paramos tudo.</span>
<span class="hljs-keyword">if</span> response.status != <span class="hljs-number">200</span>:
    logging.error(<span class="hljs-string">f"Server responded with status <span class="hljs-subst">{response.status}</span>."</span>)
    os.exit(<span class="hljs-number">1</span>)

<span class="hljs-comment"># Agora que sabemos que o status code é 200, isso significa que response.data contém o</span>
<span class="hljs-comment"># corpo do retorno da página. No caso, apenas a data e a hora no formato iso.</span>
<span class="hljs-comment"># Vamos obtê-las separadas</span>
date, time = response.data.decode(<span class="hljs-string">'utf-8'</span>).strip().split(<span class="hljs-string">' '</span>)

<span class="hljs-comment"># E agora obtemos cada parâmetro, convertemos para inteiro e</span>
<span class="hljs-comment"># atribuímos a novas variáveis</span>
hour, minutes, seconds = list(map(int, time.split(<span class="hljs-string">':'</span>)))
year, month, day =  list(map(int, date.split(<span class="hljs-string">'-'</span>)))

<span class="hljs-comment"># Precisamos calcular o dia da semana com o datetime e vamos</span>
<span class="hljs-comment"># deixar os milissegundos em zero mesmo.</span>
time_tuple = (
    year,
    month,
    datetime(year, month, day).weekday(),
    day,
    hour,
    minutes,
    seconds,
    <span class="hljs-number">0</span>
)

<span class="hljs-comment"># A grande "hora" (haha)</span>
win32api.SetSystemTime(*time_tuple)
</code></pre>
<p>A última linha, se você não está acostumadx com Python, está "desestruturando" a tupla e passando cada elemento como um argumento. Por exemplo, as duas chamadas de funções a seguir são idênticas:</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">soma</span>(<span class="hljs-params">a: float, b: float</span>) -&gt; float:</span>
    <span class="hljs-keyword">return</span> a + b


<span class="hljs-comment"># As duas chamadas abaixo fazem exatamente a mesma coisa.</span>
soma(a, b)
soma(*(a, b))
</code></pre>
<blockquote>
<p>Para alterar a hora do sistema, é necessário obter permissões elevadas. Isso significa que você deve executar seu Terminal como administrador (para o <code>cmd.exe</code>, tecle <kbd>Win</kbd> + <kbd>R</kbd>, digite <code>cmd</code> e tecle <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>Enter</kbd> e dê a permissão).</p>
</blockquote>
<h2 id="heading-criando-um-executavel">Criando um executável</h2>
<p>Para criar um executável que funcione <em>standalone</em>, sem precisar executar via linha de comando, podemos usar o <a target="_blank" href="https://www.pyinstaller.org/"><em>pyinstaller</em></a>, biblioteca muito simples de usar. Para criar um executável a partir do arquivo principal <a target="_blank" href="http://main.py"><code>main.py</code></a>, tudo o que precisamos é fazer o seguinte na linha de comando (permissões elevadas podem ser necessárias):</p>
<pre><code class="lang-bash">&gt; <span class="hljs-built_in">cd</span> seu_diretorio\
&gt; pip install pyinstaller
&gt; pyinstaller main.py --onefile --uac-admin
</code></pre>
<p>Isso vai instalar o pyinstaller (como num Inception, tipo usar o Explorer pra baixar o Chrome) e criar um único executável (<code>--onefile</code>) que exige permissões administrativas (<code>--uac-admin</code>) a partir de <a target="_blank" href="http://main.py"><code>main.py</code></a>, que é o arquivo de entrada (nesse caso, o único) do nosso programa. Você pode definir outras opções. Acesse a documentação oficial para ver quais estão disponíveis.</p>
<p>Acesse a pasta <code>dist\</code>, copie seu executável e mova para algum lugar de seu interesse (ou deixe aí mesmo). Eu coloquei em <code>C:\Program Files\current_hour_setter\current_hour_setter.exe</code>.</p>
<h2 id="heading-inicializando-tudo-com-o-windows">Inicializando tudo com o Windows</h2>
<p>Essa é talvez a parte mais demorada. Vamos criar uma tarefa no agendador de tarefas do Windows que executa um prompt de comando com permissões administrativas e, daí, executa nosso executável com as permissões corretas. Em seguida, vamos fazer isso ser executado junto com o sistema.</p>
<h3 id="heading-executando-o-programa-com-permissoes-administrativas-sem-o-prompt">Executando o programa com permissões administrativas sem o prompt</h3>
<p>O que faremos aqui é executar o nosso script com permissão administrativa sem passar pelo <em>popup</em> típico de permissão do Windows (<em>UAC credential prompt</em>). Esse procedimento foi obtido em <a target="_blank" href="https://www.tenforums.com/tutorials/57690-create-elevated-shortcut-without-uac-prompt-windows-10-a.html">um fórum</a> (em inglês) que também apresenta um método automático usando um arquivo bat. Eu, no entanto, não recomendo (e não fiz). O método manual segue.</p>
<ol>
<li><p>Aperte <kbd>Win</kbd> + <kbd>R</kbd> e digite <code>taskschd.msc</code>, confirmando em seguida.</p>
</li>
<li><p>Clique em Biblioteca do Agendador</p>
</li>
<li><p>Clique em Criar Tarefa...</p>
</li>
<li><p>Em Nome, coloque um nome para a sua tarefa (e anote). Em Descrição, faça o mesmo. Marque a caixa "Executar com privilégios mais altos" e defina "Configurar para: Windows 10".</p>
</li>
<li><p>Clique na guia Ações e no botão Novo... Na janela que abrir, defina o Programa/Script como <code>cmd.exe</code>.</p>
</li>
</ol>
<p>Assim, estamos criando uma tarefa que executa um <code>cmd.exe</code> com permissões elevadas.</p>
<ol start="6">
<li>Vamos também executar nosso script. Adicione, no campo "Adicione argumentos (opcional)", o seguinte:</li>
</ol>
<pre><code class="lang-plaintext">/c start "Nome da Tarefa" "C:\Program Files\current_hour_setter\current_hour_setter.exe"
</code></pre>
<p>No lugar de "Nome da Tarefa", coloque o nome da tarefa definido no passo 4. Substitua o caminho para o caminho do seu executável. Clique em OK quantas vezes forem necessário e feche o agendador de tarefas (mantendo o nome da sua tarefa anotado).</p>
<p>Agora temos uma tarefa que abre um prompt de comando elevado e executa o nosso executável com as mesmas permissões.</p>
<h3 id="heading-executando-tudo-na-inicializacao-do-sistema">Executando tudo na inicialização do sistema</h3>
<ol start="7">
<li><p>Clique com o botão direito no seu desktop ou em alguma pasta vazia, vá até Novo... e clique Atalho.</p>
</li>
<li><p>No endereço, coloque o seguinte, substituindo o nome da tarefa pelo correto. <code>schtasks /run /tn "Nome da Tarefa"</code></p>
</li>
<li><p>Salve com um nome adequado.</p>
</li>
<li><p>Mova esse atalho para a pasta de inicialização do Windows.</p>
</li>
</ol>
<ul>
<li><p>Para fazer isso apenas no usuário atual, mova para: <code>%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup</code></p>
</li>
<li><p>Para fazer isso para todos os usuários do sistema, mova para: <code>%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\StartUp</code></p>
</li>
</ul>
<p>Deixe seu sistema com a hora incorreta e reinicie. Se tudo deu certo, seu relógio deve ser corrigido alguns segundos após a inicialização.</p>
<h2 id="heading-conclusao">Conclusão</h2>
<p>Esta foi uma tentativa de mostrar como a programação não é algo exatamente complicado (configurar o Windows foi bem mais trabalhoso) e também como pode ser feito para resolver problemas reais na vida.</p>
<p>Se você quer começar a programar, confira meu curso de Algoritmos com Portugol Studio <a target="_blank" href="https://www.youtube.com/c/HMProgramming">no Youtube</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Tweemol: publicando automaticamente no Twitter]]></title><description><![CDATA[Saudações! Sempre que possível, gosto de me desafiar a fazer coisas que nunca fiz e continuar aprendendo sempre. Recentemente (levemente inspirado por um vídeo do Filipe Deschamps), resolvi desenvolver um robô (bot) para, todos os dias, escolher uma ...]]></description><link>https://blog.hellmrf.dev.br/tweemol-publicando-automaticamente-no-twitter</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/tweemol-publicando-automaticamente-no-twitter</guid><category><![CDATA[Python]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Sat, 25 Jul 2020 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Saudações! Sempre que possível, gosto de me desafiar a fazer coisas que nunca fiz e continuar aprendendo sempre. Recentemente (levemente inspirado por um vídeo do <a target="_blank" href="https://www.youtube.com/watch?v=kjhu1LEmRpY">Filipe Deschamps</a>), resolvi desenvolver um robô (<em>bot</em>) para, todos os dias, escolher uma molécula na Wikipédia, encontrar informações sobre ela, a estrutura química, e publicar um <em>tweet</em> sobre isso. No momento em que escrevo, este projeto está funcionando e mora no Twitter <a target="_blank" href="https://twitter.com/tweemol">@Tweemol</a> (segue ele lá hehe). Além disso, o código é <em>open-source</em> está disponível no <a target="_blank" href="https://github.com/hellmrf/Tweemol/">GitHub</a>.</p>
<p></p><blockquote><p>Verapamil, sold under various trade names, is a medication used for the treatment of high blood pressure, angina (chest pain from not enough blood flow to the heart), and supraventricular tachycardia.<br />Know more: <a href="https://t.co/edylwYnoNW">https://t.co/edylwYnoNW</a> <a href="https://t.co/zwGlehCyUF">pic.twitter.com/zwGlehCyUF</a></p>— Tweemol (@tweemol) <a href="https://twitter.com/tweemol/status/1284473154488991749?ref_src=twsrc%5Etfw">July 18, 2020</a></blockquote> <p></p>
<p>Neste post, vou explicar como desenvolvi isso e como você pode fazer o seu também. De preferência, aventure-se com APIs diferentes das que usei, ou escolha publicar em outra rede. Isso vai evitar que você apenas siga um tutorial e realmente desenvolva o seu projeto. 
Antes de tudo, quero adiantar que este projeto é relativamente grande. Tem MUITA coisa que precisamos discutir em detalhes aqui. Recomendo ler uma vez e partir para o seu projeto, consultando novamente no momento sentir que não está avançando mais.
Então vamos lá.</p>
<h2 id="heading-escolhendo-tecnologias">Escolhendo tecnologias</h2>
<p>Se você esta desenvolvendo um projeto real que vai para produção (momento em que o projeto já está funcionando com usuários reais, diferente do estágio de desenvolvimento), o ideal é escolher a tecnologia baseado nas especificidades do negócio, na necessidade de performance, produtividade da equipe, maturidade da tecnologia, suporte, facilidade de contratar profissionais, dentre diversos outros fatores. 
Ao desenvolver um projeto para estudo, no entanto, a coisa muda um pouco de figura: nesse caso, eu já recomendo escolher tecnologias que não estejam na sua zona de conforto, ou que sejam novas, para garantir que você esteja aprendendo algo. </p>
<p>Quando desenvolvi este projeto, eu ainda não tinha muito costume com o Node.js e queria me aprofundar um pouco. Isso me fez escolher essa tecnologia. Mais tarde, escolhi Python para desenvolver outro projeto (que posso trazer aqui em breve) pelo mesmo motivo.</p>
<h2 id="heading-planejamento-como-as-coisas-vao-funcionar">Planejamento: como as coisas vão funcionar</h2>
<p>Antes de abrir o Visual Studio Code (ou o editor que você preferir) e começar a escrever um monte de coisa, é importante parar um pouco e planejar como o seu robô vai se comportar. Pense bem: como desenvolver um robô que nem você sabe como funciona? Isto dito, vamos começar nosso planejamento definindo bem o que nosso robô vai fazer.</p>
<h3 id="heading-o-que-o-robo-vai-fazer">O que o robô vai fazer?</h3>
<p>Eu decidi que queria um robô capaz de publicar, todos os dias, às 10h da manhã, um <em>tweet</em> contendo algumas informações sobre uma molécula, sua estrutura química e um link para saber mais. 
Como um robô faria isso? O primeiro passo para responder essa pergunta é com outra pergunta: como <em>eu</em> faria isso?</p>
<h4 id="heading-o-que-eu-faria">O que <em>eu</em> faria?</h4>
<p>Bom... Como químico da área de fármacos, eu simplesmente abriria a Wikipédia, procuraria alguma <a target="_blank" href="https://en.wikipedia.org/wiki/List_of_drugs">dessas</a> listas e escolheria uma molécula aleatoriamente que eu ainda não tivesse escolhido (para facilitar, manteria uma lista das moléculas que já publiquei, pra não ter que percorrer todo meu Twitter). Daí eu faria um resumo daquele texto na Wikipédia para caber num <em>Tweet</em>, adicionaria um link, a própria estrutura presente na Wikipédia e pronto. Se a Wikipédia não tivesse uma estrutura disponível, eu pesquisaria rapidamente o nome do fármaco no Google Images e pegaria a estrutura. Caso o resultado não fosse satisfatório, como bom Químico Computacional, eu procuraria pelo código <a target="_blank" href="https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system">SMILES</a> para gerar eu mesmo uma estrutura usando o <a target="_blank" href="https://www.acdlabs.com/resources/freeware/chemsketch/">ChemSketch</a> ou outro software. Feito.</p>
<h4 id="heading-o-que-um-robo-deveria-fazer">O que um robô deveria fazer?</h4>
<p>Ótimo. Podemos elencar esse meu algoritmo. Nosso robô precisa:</p>
<ul>
<li>Escolher aleatoriamente uma molécula em alguma lista da Wikipédia que ainda não tenha sido escolhida</li>
<li>Salvar isso em uma nova lista das moléculas que já foram escolhidas</li>
<li>Extrair o texto da página escolhida</li>
<li>Resumir o texto de maneira inteligente (!!!!) para que caiba num <em>Tweet</em></li>
<li>Obter a estrutura química, se disponível.<ul>
<li>Caso indisponível, procurar pelo SMILES para desenhar a estrutura, (computacionalmente, é mais fácil desenhar uma estrutura química que encontrar um bom resultado no Google, já que não temos o recurso bater-o-olho-e-escolher-a-melhor-opção)</li>
<li>Caso também indisponível, pesquisar no Google Images.</li>
</ul>
</li>
<li>Publicar tudo isso no Twitter.</li>
</ul>
<p>A parte de repetir isso todos os dias será uma tarefa <a target="_blank" href="https://en.wikipedia.org/wiki/Cron">cron</a> no servidor, não é exatamente responsabilidade do nosso robô.</p>
<p>Mas você pode estar se perguntando agora. Pera lá... Resumir texto? Pesquisar no Google? Publicar no Twitter? Como raios um robô vai fazer isso? Bom, vamos lá.</p>
<h3 id="heading-como-o-robo-vai-fazer-o-que-o-robo-tem-que-fazer"><em>Como</em> o robô vai fazer <em>o que</em> o robô tem que fazer?</h3>
<p>Agora sabemos bem <em>o que</em> o robô precisa fazer. Tá na hora de partir para o <em>como</em>. Ainda estamos no planejamento. Sem códigos. Sem fonte <code>monospaced</code> (uma vezinha só, vai). Mas aqui a coisa começa a ficar interessante. Se sentir que está muito rápido, é porque é pra ser assim. Só vamos ver como implementar isso bem mais tarde. Relaxe e prepare-se para uma chuva de links!</p>
<ol>
<li><p><strong>Escolher moléculas</strong>
Baseado na lista da Wikipédia que elenquei acima, eu fiz um script para extrair os nomes das moléculas que nosso robô poderá trabalhar. O resultado foi <a target="_blank" href="https://github.com/hellmrf/Tweemol/blob/master/all_molecules.json">este JSON</a> com mais de 5000 moléculas (não me lembro o número exato agora). Basta escolher uma molécula aleatória nesse JSON e procurá-la na Wikipédia.</p>
</li>
<li><p><strong>Obtendo dados da Wikipédia</strong>
A Wikimedia Foundation (organização que desenvolve a Wikipédia) disponibiliza a API <a target="_blank" href="https://www.mediawiki.org/wiki/API:Main_page">Media Wiki</a> que, dentre outras coisas, permite navegar na Wikipédia de maneira programática (de dentro de um programa).
Caso não tivéssemos acesso a uma API, poderíamos usar <a target="_blank" href="https://en.wikipedia.org/wiki/Web_scraping"><em>web scraping</em></a> (e aqui vai um link da Wikipédia bem no momento que falamos nela kkkkk).</p>
</li>
<li><p><strong>Resumir o Texto</strong>
Hmmm, vou manter o suspense por agora.</p>
</li>
<li><p><strong>Obter a estrutura química</strong>
Vamos dar uma rápida analisada em como a Wikipédia funciona. Acompanhe comigo a página sobre o <a target="_blank" href="https://en.wikipedia.org/wiki/Paracetamol">Paracetamol</a>, droga muito conhecida no Brasil no tratamento sintomático de dores de cabeça e febre.
<img src="https://i.snipboard.io/r96ZfX.jpg" alt="Wikipedia: Página do Paracetamol (em Inglês)" />
Observe que, à direita, há uma caixa de informações químicas sobre o fármaco. Muitas páginas da Wikipédia e todos (ao menos quase todos) os fármacos contêm essa caixa. Ela é chamada, de maneira geral, de <a target="_blank" href="https://en.wikipedia.org/wiki/Help:Infobox">Infobox</a>. Para o nosso caso, duas Infoboxes são esperadas: a <a target="_blank" href="https://en.wikipedia.org/wiki/Template:Chembox">Chembox</a> (compostos químicos em geral) e a <a target="_blank" href="https://en.wikipedia.org/wiki/Template:Infobox_drug">Drugbox</a> (específica para fármacos). Essas Infoboxes trazem, normalmente, um parâmetro do tipo <code>image*</code> contendo a imagem principal.
Voltaremos a isso mais tarde.</p>
</li>
<li><p><strong>Obter a estrutura química, Pt. 2: pesquisar no Google</strong>
Eu sei, pode parecer trivial. Ou impossível. A verdade é que não é nenhum dos dois. O Google nos permite criar um motor de busca personalizado (<a target="_blank" href="https://cse.google.com/">Custom Search Engine</a>) e fornece gratuitamente uma <a target="_blank" href="https://developers.google.com/custom-search/v1/overview">Custom Search API</a> para fazermos nossas pesquisas. Voltaremos a isso em detalhes mais tarde.</p>
</li>
<li><p><strong>Publicar no Twitter</strong>
Adivinhem. O Twitter também nos fornece uma <a target="_blank" href="https://developer.twitter.com/en/docs">API</a> através da qual podemos publicar em uma conta. Entretanto, é necessário se aplicar para uma conta de desenvolvedor antes de colocar as mãos na sua Chave de API. Faça isso <a target="_blank" href="https://developer.twitter.com/en/apply-for-access">aqui</a>. 
Aqui vai a primeira coisa que eu não gostaria de escrever: eu sugiro enfaticamente que você leia atentamente (sério!) todos os termos relacionados à utilização do Twitter como desenvolvedor. Existem diversos limites (muito mais rígidos para robôs que para humanos) que, caso transgredidos, podem (e, acredite, vão) resultar no bloqueio da sua conta. Se usar de maneira responsável, nada de ruim vai acontecer.
Enquanto sua aplicação é analisada, comprometa-se a ler a documentação da API do Twitter. Outros desenvolvedores podem discordar, mas, particularmente, achei terrível de ler. Isso não significa que todas as informações não estejam lá. É só que tem informação demais. Procure. Leia. Copiar o meu código não vai te ensinar tanto quanto eu aprendi lendo a API e fazendo funcionar.</p>
</li>
<li><p><strong>Resumir o Texto</strong>
Para resumir o texto, na verdade não vamos implementar nenhum algoritmo de <a target="_blank" href="https://en.wikipedia.org/wiki/Natural_language_processing">NLP</a> (Processamento de Linguagem Natural). Você pode fazer isso, mas eu vou usar um que já foi implementado (quem sabe em breve eu não implemente o meu rsrsrs). Essa API será fornecida por nós pelo <a target="_blank" href="https://algorithmia.com/">Algorithmia</a>. 
O Algorithmia não é exatamente gratuito, mas fornece uma quantidade mensal de créditos gratuitos que será mais que o suficiente para nossa aplicação. Acesse o site, clique em <em>Try It For Free</em> e crie sua conta. Dentro do Dashboard, à esquerda, clique em <a target="_blank" href="https://algorithmia.com/algorithms">Algorithms</a> e mergulhe na enorme lista de algoritmos disponíveis. Atente-se que cada um consome uma quantidade diferente de créditos todos consomem, no mínimo, um crédito por chamada. Além disso, cada algoritmo pode definir sua cobrança. Você pode testá-los dentro da interface. 
<a target="_blank" href="https://algorithmia.com/algorithms/nlp/Summarizer">Este aqui</a> foi o que se saiu melhor (e só consome 1 crédito por requisição). O próprio Algorithmia também fornece outros algoritmos, como o do Google Translate, que você pode implementar se quiser (mais tarde vamos falar sobre isso também). 
Clique no ícone de perfil e em <em>Manage API Keys</em> e garanta já a sua.</p>
</li>
</ol>
<p>Ok... Temos um planejamento. Vamos à parte mais bonita de todas... Mentira. Mais um passo antes.</p>
<h2 id="heading-configurando-o-ambiente">Configurando o Ambiente</h2>
<p>Bom... Vamos usar <a target="_blank" href="https://nodejs.org/">Node.js</a>, então precisamos dele instalado. Instale para seu sistema operacional favorito, obviamente o Linux (brincadeira, pode usar o que você quiser). Instale a versão LTS ou, caso goste de viver perigosamente, a versão Current. Se estiver usando Linux, recomendo dar uma olhada nas <a target="_blank" href="https://nodejs.org/en/download/package-manager/">opções de instalação via <em>package manager</em></a>.
Usaremos diversas dependências, mas, a menos que você esteja copiando um tutorial (o que, obviamente, você não está fazendo), ninguém instala todas as dependências antes de começar a escrever o código.</p>
<p>Isso só pode significar uma coisa...</p>
<h2 id="heading-coding-time"><em>Coding time</em></h2>
<p>Quem diria!
A primeira coisa que precisamos fazer é escolher uma molécula. Como já disse, estou usando <a target="_blank" href="https://github.com/hellmrf/Tweemol/blob/master/all_molecules.json">este</a> JSON. A estratégia aqui será simples como gerar um número aleatório para escolher uma posição do <em>array</em> e salvar isso nas moléculas já postadas (um JSON <a target="_blank" href="https://github.com/hellmrf/Tweemol/blob/master/molecules_posted.json">análogo</a>).
Vamo lá então.</p>
<h3 id="heading-escolhendo-uma-molecula">Escolhendo uma molécula</h3>
<p>Começaremos criando o ponto de entrada da nossa aplicação (<code>index.js</code>) e também o diretório <code>src/</code>, onde vamos armazenar a maior parte do código.
Num primeiro momento, criaremos um arquivo <code>chooseMolecule.js</code> dentro de <code>src/</code>. O código desse arquivo é o que segue.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> { molecules } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../all_molecules.json'</span>);
<span class="hljs-keyword">const</span> { posted_array } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../posted_molecules.json'</span>);

<span class="hljs-keyword">const</span> chooseMolecule = <span class="hljs-function">() =&gt;</span> {
    <span class="hljs-keyword">let</span> moleculeOfTheDay;
    <span class="hljs-keyword">do</span> {
        <span class="hljs-keyword">const</span> rand = <span class="hljs-built_in">Math</span>.floor(<span class="hljs-built_in">Math</span>.random() * molecules.length);
        moleculeOfTheDay = molecules[rand];
    } 
    <span class="hljs-keyword">while</span> (posted_array.indexOf(moleculeOfTheDay) &gt; <span class="hljs-number">-1</span>);
    <span class="hljs-keyword">return</span> moleculeOfTheDay;
}

<span class="hljs-keyword">const</span> savePostedMolecule = <span class="hljs-function">(<span class="hljs-params">posted</span>) =&gt;</span> {
    posted_array.push(posted);
    <span class="hljs-comment">// Salvar o JSON em seguida.</span>
}

<span class="hljs-comment">// Exportamos tudo</span>
<span class="hljs-built_in">exports</span>.chooseMolecule = chooseMolecule;
<span class="hljs-built_in">exports</span>.saveServer = savePostedMolecule;
</code></pre>
<p>Vamos, no <code>index.js</code>, fazer alguma coisa também.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span>  { chooseMolecule, savePostedMolecule }  =  <span class="hljs-built_in">require</span>(<span class="hljs-string">'./src/chooseMolecule'</span>);

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> </span>{
    <span class="hljs-keyword">constructor</span>(){}

    <span class="hljs-keyword">async</span> start(){
        <span class="hljs-keyword">const</span> molecule = chooseMolecule();
        <span class="hljs-keyword">await</span> savePostedMolecule(molecule);
    }
}

<span class="hljs-comment">// O que estamos fazendo aqui é criar uma função anônima assíncrona e invocando a mesma, permitindo assim o uso do await que, no Node.js, só é permitido em funções assíncronas (diferente do Deno).</span>
(<span class="hljs-keyword">async</span> () =&gt; {
    <span class="hljs-keyword">const</span> mainInstance = <span class="hljs-keyword">new</span> Main();
    <span class="hljs-keyword">await</span> mainInstance.start();
})();
</code></pre>
<h3 id="heading-obtendo-informacoes-da-wikipedia">Obtendo informações da Wikipédia</h3>
<h2 id="heading-ls0t">---</h2>
<p><img src="https://i.snipboard.io/J8myvQ.jpg" alt /></p>
]]></content:encoded></item><item><title><![CDATA[Integração Aproximada pelo Método do Trapézio]]></title><description><![CDATA[Ontem, um estudante que assistiu minha série sobre Portugol Studio no Youtube entrou em contato comigo. Ele queria saber como implementar o Método dos Trapézios para integrais no Portugol Studio, então resolvi compartilhar toda a teoria e a implement...]]></description><link>https://blog.hellmrf.dev.br/integracao-aproximada-pelo-metodo-do-trapezio</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/integracao-aproximada-pelo-metodo-do-trapezio</guid><category><![CDATA[Math]]></category><category><![CDATA[#numerical-methods]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Sat, 26 Oct 2019 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Ontem, um estudante que assistiu minha série sobre <a target="_blank" href="https://www.youtube.com/channel/UCsXyoSkpyZB741fkBKeEovQ">Portugol Studio no Youtube</a> entrou em contato comigo. Ele queria saber como implementar o <a target="_blank" href="https://pt.wikipedia.org/wiki/Regra_dos_trap%C3%A9zios_\(equa%C3%A7%C3%B5es_diferenciais\)">Método dos Trapézios</a> para integrais no Portugol Studio, então resolvi compartilhar toda a teoria e a implementação final aqui. É importante que, para compreender 100% o que vai ser dito aqui, o leitor já tenha estudado Cálculo I. Vamos lá!</p>
<h2 id="heading-calculo">Cálculo</h2>
<p>Primeiramente, vamos analisar a definição precisa de integral através do <a target="_blank" href="https://pt.wikipedia.org/wiki/Integra%C3%A7%C3%A3o_num%C3%A9rica#Exemplos_2">método do ponto médio</a>. A integral se propõe, no caso $\mathbb{R}^2$, a calcular a área exata sob o gráfico de uma função (ou o volume no caso $\mathbb{R}^3$) no intervalo $[a,b]$. Para isso, podemos dividir o eixo $x$ em $n$ subintervalos. Para cada subintervalo, escolhemos um $x_i^<em>$ e definimos a área desse subintervalo como $f(x_i^</em>)\cdot \Delta x$, em que $\Delta x$ é o tamanho do subintervalo (dado por ${(b-a)/n}$).</p>
<p>A Figura 1 abaixo mostra as diversas somas com $n=4$, $n=8$, $n=16$ e $n= 32$. Observe que, quando $n$ aumenta, a soma das áreas de cada subintervalo se aproxima da área sob o gráfico da função.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/2/2a/Riemann_sum_convergence.png" alt="Figura 1: Somas convergindo." /></p>
<p>Figura 1: Somas convergindo.</p>
<p>Isso pode ser representado, matematicamente, por:</p>
<p>$$A \approx \sum\limits_{i=1}^n {f(x_i^*)\cdot \Delta x}$$</p><p>Sendo assim, se tomamos o limite quando $ n \to \infty $, então obtemos uma soma perfeita:</p>
<p>$$\int\limits_a^b{f(x)dx} = \lim_{n \to \infty} {\sum\limits_{i=1}^n {f(x_i^*)\cdot \Delta x}}$$</p><p>Infelizmente, são muitos os casos em que é simplesmente impossível calcular o limite infinito para encontrar uma integral exata. Daí recorremos a métodos de aproximação. Apenas remover o limite e <em>escolher</em> um $n$ arbitrariamente grande é chamado de Método dos Retângulos. Um outro método, com um erro bem menor, é o Método dos Trapézios, ou Integração Trapezoidal.</p>
<p>Nesse método, em vez de somar vários retângulos, cada um aproximando a área entre $x_{i-1}$ e $x_i$, usamos trapézios. Veja na Figura abaixo a comparação entre os dois métodos.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/e/ea/Integration_rectangle.png" alt="Figura 2(a): Integração por Retângulos." /></p>
<p>Figura 2(a): Integração por Retângulos.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/a/a8/Calkowanie_numeryczne-metoda_trapezow.png" alt="Figura 2(b): Integração Trapezoidal." /></p>
<p>Figura 2(b): Integração Trapezoidal.</p>
<p>A implementação desse método é parecida com o dos retângulos. Começamos dividindo o intervalo de integração $[a,b]$ em $n$ subintervalos de tal forma que $\Delta x = \frac{b-a}{n}$.</p>
<p>A área do trapézio é dada por: $$\frac{(B+b)\cdot h}{2}$$ Em que $B$ e $b$ são as bases do trapézio e $h$ é a altura. No nosso caso (considere o $i$-ésimo subintervalo), a "altura" do trapézio é $\Delta x$, ao passo que as bases são $f(x_i)$ e $f(x_{i-1})$.</p>
<p>Observação: note que $x_0 = a$ e $x_n = b$ .</p>
<p>Podemos, então, tomar um $n$ arbitrariamente grande e teremos a integral aproximada:</p>
<p>$$\int\limits_a^b {f(x)dx} \, \approx \, \sum\limits_{i=1}^n {\frac{[f(x_i) + f(x_{i-1})]\cdot \Delta x}{2}}$$</p><p>Como ${\Delta x}/{2}$ é uma constante, pode ser removido da soma.</p>
<p>$$\int\limits_a^b {f(x)dx} \, \approx \, \frac{\Delta x}{2}\sum\limits_{i=1}^n {[f(x_i) + f(x_{i-1})]}$$</p><p>Então temos a equação final para o método dos trapézios. Basta, agora, implementá-lo.</p>
<p>Veja a implementação:</p>
<ul>
<li><p><a target="_blank" href="https://hmprog.blogspot.com/2019/10/integracao-aproximada-metodo-trapezio-portugol.html">Portugol Studio</a></p>
</li>
<li><p><a target="_blank" href="https://hmprog.blogspot.com/2019/10/integracao-aproximada-metodo-trapezio-python.html">Python</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Mostrar/ocultar DIV com Javascript]]></title><description><![CDATA[Olá! Muitas vezes, é necessário exibir uma informação apenas quando o usuário solicita, como após o clique de um botão. Aqui está uma maneira simples e prática de fazer isso, mantendo o código limpo e funcional.
Observe que este conteúdo utiliza java...]]></description><link>https://blog.hellmrf.dev.br/mostrarocultar-div-com-javascript</link><guid isPermaLink="true">https://blog.hellmrf.dev.br/mostrarocultar-div-com-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[HTML5]]></category><dc:creator><![CDATA[Heliton Martins Reis Filho]]></dc:creator><pubDate>Thu, 13 Oct 2016 15:00:00 GMT</pubDate><content:encoded><![CDATA[<p>Olá! Muitas vezes, é necessário exibir uma informação apenas quando o usuário solicita, como após o clique de um botão. Aqui está uma maneira simples e prática de fazer isso, mantendo o código limpo e funcional.</p>
<p>Observe que este conteúdo utiliza javascript puro e certamente podem haver maneiras mais eficientes de fazer isto a depender do seu caso de uso em particular. Caso seja necessário, <a target="_blank" href="https://hellmrf.dev.br/contato">entre em contato</a> para auxílio profissional.</p>
<h2 id="heading-o-efeito-de-alternancia-toggle">O Efeito de Alternância (Toggle)</h2>
<p>A ideia é ter um botão que, ao ser clicado, mostra ou oculta um bloco de conteúdo. Podemos conseguir isso com uma única e simples função JavaScript.</p>
<h3 id="heading-o-codigo-javascript">O Código JavaScript</h3>
<p>Em vez de usar duas funções (<code>mostrar</code> e <code>fechar</code>), podemos usar apenas uma função <code>toggleVisibility</code> que verifica o estado atual do elemento e o inverte. Isso torna o código mais limpo e eficiente.</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">toggleVisibility</span>(<span class="hljs-params">id</span>) </span>{
  <span class="hljs-keyword">const</span> element = <span class="hljs-built_in">document</span>.getElementById(id);
  <span class="hljs-keyword">if</span> (!element.style.display || element.style.display === <span class="hljs-string">'none'</span>) {
    element.style.display = <span class="hljs-string">'block'</span>;
  } <span class="hljs-keyword">else</span> {
    element.style.display = <span class="hljs-string">'none'</span>;
  }
}
</code></pre>
<h3 id="heading-estrutura-html">Estrutura HTML</h3>
<p>A estrutura HTML é direta. Você precisa de um elemento clicável (como um botão ou link) que chame a função e um <code>div</code> com um <code>id</code> único que contenha o conteúdo a ser ocultado.</p>
<pre><code class="lang-html"><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">"toggleVisibility('ID_DO_SEU_CONTEUDO')"</span>&gt;</span>Clique para Mostrar/Ocultar<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"ID_DO_SEU_CONTEUDO"</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"display: none;"</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Aqui vai o seu conteúdo...<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></pre>
<h2 id="heading-video-explicativo">Vídeo Explicativo</h2>
<p>O vídeo original que demonstrava o efeito pode ser acessado aqui:</p>
<iframe height="405" src="https://www.youtube.com/embed/SQIUen6s1QY?feature=player_embedded" width="720"></iframe>
]]></content:encoded></item></channel></rss>