<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Elcio Ferreira</title>
	<atom:link href="http://elcio.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>https://elcio.com.br/</link>
	<description>HTML5, CSS, Tableless, Desenvolvimento Web, Python, Linux</description>
	<lastBuildDate>Fri, 23 Feb 2024 18:29:17 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://elcio.com.br/wp-content/uploads/2026/02/elcio-150x150.jpg</url>
	<title>Elcio Ferreira</title>
	<link>https://elcio.com.br/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Desabilitar webcam interna do notebook no Linux</title>
		<link>https://elcio.com.br/desabilitar-webcam-interna-do-notebook-no-linux/</link>
					<comments>https://elcio.com.br/desabilitar-webcam-interna-do-notebook-no-linux/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Mon, 26 Feb 2024 18:27:21 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[câmera]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[webcam]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111145</guid>

					<description><![CDATA[<p>Você pagou por todo o seu hardware, certo? Por que alguém quereria desabilitar a webcam interna ou qualquer outra coisa que veio com seu notebook?&#8230;</p>
<p>O post <a href="https://elcio.com.br/desabilitar-webcam-interna-do-notebook-no-linux/">Desabilitar webcam interna do notebook no Linux</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você pagou por todo o seu hardware, certo? Por que alguém quereria desabilitar a webcam interna ou qualquer outra coisa que veio com seu notebook? Bem, comprei uma webcam bem melhor que a do meu notebook. É uma <a href="https://www.amazon.com.br/gp/search?ie=UTF8&amp;tag=elcio0a7-20&amp;linkCode=ur2&amp;linkId=365f523f4d07ac85f9092821e4f3e45d&amp;camp=1789&amp;creative=9325&amp;index=computers&amp;keywords=Insta360%20link">Insta360 Link</a>. É uma câmera 4k, com zoom ótico e controles por gestos usando inteligência artificial. Ela é muito, mas muito, muito melhor que a câmera interna do meu computador. E funcionou perfeitamente aqui no <a href="https://elcio.com.br/tags/linux/">Linux</a>.</p>



<p>Acontece que a webcam interna continua disponível. Isso poderia ser algo bom, certo? Bem, não exatamente&#8230; Às vezes, sem nenhum motivo, vou entrar numa reunião via Zoom ou Google Meet e a webcam interna é selecionada automaticamente. Então, ao invés dessa imagem:</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="576" src="https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_insta360_link-1024x576.jpg" alt="" class="wp-image-111147" srcset="https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_insta360_link-1024x576.jpg 1024w, https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_insta360_link-500x281.jpg 500w, https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_insta360_link-1536x864.jpg 1536w, https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_insta360_link.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p>Quem está na chamada acaba vendo isso:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="640" height="480" src="https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_interna.jpg" alt="" class="wp-image-111149" srcset="https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_interna.jpg 640w, https://elcio.com.br/wp-content/uploads/2024/02/captura_webcam_interna-500x375.jpg 500w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p></p>



<p>Além do óbvio problema na qualidade da imagem, essa câmera ainda me pega de surpresa porque o notebook fica ao lado do meu monitor, então fica esse enquadramento acidental que você está vendo aí. É por isso que eu resolvi desabilitar a webcam interna.</p>



<h2 class="wp-block-heading">Como descobrir o identificador da câmera</h2>



<p>O primeiro passo para fazer isso é descobrir qual é o identificador do fabricante e do produto da minha câmera. Para isso, usei comando <kbd>lsusb</kbd> no terminal, que me deu essa saída:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="590" height="142" src="https://elcio.com.br/wp-content/uploads/2024/02/lsusb.jpg" alt="" class="wp-image-111150" srcset="https://elcio.com.br/wp-content/uploads/2024/02/lsusb.jpg 590w, https://elcio.com.br/wp-content/uploads/2024/02/lsusb-500x120.jpg 500w" sizes="(max-width: 590px) 100vw, 590px" /></figure>



<p></p>



<p>Mas, peraí, porque lsusb? Sim, é estranho, mas a câmera interna, no meu e em vários outros modelos de notebook, é um dispositivo USB. Está ligada, por dentro, a uma interface USB da placa mãe. Vai entender&#8230;</p>



<p>Na segunda linha da saída acima, você pode ver a webcam interna listada, com o nome &#8220;Silicon Motion Web Camera&#8221;. E logo antes do nome, o identificador do produto: 2232:1080. Todos os dispositivos USB seguem esse padrão, os quatro primeiros dígitos são a identificação do fabricante, os quatro últimos são a identificação do produto.</p>



<h2 class="wp-block-heading">Como desabilitar a webcam</h2>



<p>Com esse código, no diretório /etc/udev/rules.d/ você vai criar um arquivo com uma regra para desabilitar a webcam interna. O nome deve começar com um número, que define a ordem de execução, e terminar com a extensão .rules. No meu caso, eu usei o nome 80-generic-webcam-remove.rules.</p>



<p>Se você não sabe como criar um arquivo no diretório /etc/, pode abrir um editor com o comando:</p>



<pre class="wp-block-code"><code>sudo nano /etc/udev/rules.d/80-generic-webcam-remove.rules</code></pre>



<p>O conteúdo, no meu caso, ficou assim:</p>



<pre class="wp-block-code"><code># ID 2232:1080 Generic Web Camera should be disabled
ACTION=="add", ATTR{idVendor}=="2232", ATTR{idProduct}=="1080", RUN="/bin/sh -c 'echo 1 >/sys/\$devpath/remove'"</code></pre>



<p>Claro, substitua os números 2232 e 1080 no código acima pelos da sua webcam. </p>



<p>Salve e feche o editor. Se estiver usando nano, pressione <kbd>CTRL+X</kbd>, seguido de <kbd>Y</kbd> e <kbd>Enter</kbd>.</p>



<p>Reinicie seu computador e pronto, isso vai desabilitar a webcam interna em seu notebook.</p>
<p>O post <a href="https://elcio.com.br/desabilitar-webcam-interna-do-notebook-no-linux/">Desabilitar webcam interna do notebook no Linux</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/desabilitar-webcam-interna-do-notebook-no-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Telegram Bloqueado no Brasil: o que exatamente aconteceu</title>
		<link>https://elcio.com.br/telegram-bloqueado-no-brasil/</link>
					<comments>https://elcio.com.br/telegram-bloqueado-no-brasil/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Fri, 28 Apr 2023 00:51:26 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Brasil]]></category>
		<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[Justiça]]></category>
		<category><![CDATA[Legislação]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[Telegram]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111137</guid>

					<description><![CDATA[<p>Porque estamos com o aplicativo de mensagens Telegram bloqueado no Brasil? O tema foi noticiado amplamente por sites da área, como o Techtudo e a&#8230;</p>
<p>O post <a href="https://elcio.com.br/telegram-bloqueado-no-brasil/">Telegram Bloqueado no Brasil: o que exatamente aconteceu</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Porque estamos com o aplicativo de mensagens Telegram bloqueado no Brasil? O tema foi noticiado amplamente por sites da área, como o <a href="https://www.techtudo.com.br/noticias/2023/04/telegram-suspenso-no-brasil-veja-tudo-o-que-voce-precisa-saber-edapps.ghtml">Techtudo</a> e a <a href="https://exame.com/brasil/telegram-porque-o-app-foi-bloqueado-no-brasil-entenda-a-decisao-da-justica/">Revista Exame</a>. Li várias matérias sobre o tema e fiquei incomodado com a falta de informações técnicas básicas. A maioria deles deixa a entender que o bloqueio é culpa do próprio Telegram, por não colaborar com a justiça. O Techtudo, por exemplo, publicou:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Não há previsão de retorno de funcionamento do Telegram. Isso ocorre porque é preciso, primeiro, que o aplicativo colabore com os órgãos federais para, então, ter ordem emitida desfazendo a sua suspensão.</p>
</blockquote>



<p>O que exatamente aconteceu? A Polícia Federal obteve acesso a grupos neonazistas no Telegram que estariam recrutando menores para atos terroristas e, como parte das investigações, a justiça solicitou ao Telegram os números de telefones e outros dados de participantes de dois desses grupos. O Telegram demorou a responder e, quando respondeu, não entregou os dados e recorreu da decisão.</p>



<h2 class="wp-block-heading">A sequência de eventos que levou ao Telegram bloqueado</h2>



<p><a href="https://g1.globo.com/tecnologia/noticia/2023/04/27/telegram-diz-que-justica-ordenou-coleta-de-dados-impossiveis-de-serem-obtidos-pf-afirma-que-lentidao-permitiu-exclusao-de-informacoes.ghtml">Segundo o G1</a>, o primeiro pedido da justiça para obter dados desses grupo aconteceu no dia 19/04, mas só foi encaminhada ao Telegram no dia 20/04, às 13h46. Um desses grupos já havia sido excluído há meses. O Telegram responde solicitando informações adicionais. A justiça envia parte dessas informações às 16h14 e o restante no dia seguinte, 21, às 8h06, momento em que o segundo grupo já havia sido  também deletado. É parte da <a href="https://telegram.org/privacy#10-deleting-data">política de privacidade do Telegram</a> a exclusão física real de dados que você mandou excluir. Embora a política de privacidade não fale sobre a exclusão de grupos, para as outras coisas todas, incluindo sua própria conta, o Telegram é claro: excluiu, já era, não temos cópia. Podemos deduzir que o mesmo se aplica também a grupos.</p>



<p>Acontece que esse segundo grupo, excluído no dia 20, havia sido alvo de um outro pedido da justiça ao Telegram, no dia 10. Esse pedido anterior havia sido menos abrangente, solicitava apenas dados do administrador do grupo. Segundo o Telegram, eles só tinham nesse momento informações desse administrador, coletadas para atender ao pedido do dia 10, e de mais ninguém. E não seria mais possível recuperar informações sobre os outros participantes do grupo. O Telegram diz que entregou o que tinha, mas a justiça considerou que não era suficiente e ordenou: Telegram bloqueado.</p>



<p>Veja a resposta publicada por Pavel Durov em <a href="https://t.me/durov">seu canal no Telegram</a>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>A missão do Telegram é preservar a privacidade e liberdade de expressão ao redor do mundo.</p>



<p>Em casos onde as leis locais vão contra essa missão ou impõem requerimentos tecnologicamente inviáveis, nós às vezes temos que deixar esses mercados. No passado, países como China, Irã e Rússia baniram Telegram devido a nossa postura baseada em princípios no tema de direitos humanos. Esses eventos, apesar de infelizes, são ainda preferíveis a trair nossos usuários e as crenças sobre as quais nos fundamentamos.</p>



<p>No Brasil, um tribunal requisitou dados que nos são tecnologicamente impossíveis de obter. Estamos apelando da decisão e esperando ansiosos pela solução final. Não importa o custo, vamos defender nossos usuários no Brasil e seu direito à comunicação privada.</p>
<cite><a href="https://t.me/durov/209">Pavel Durov</a></cite></blockquote>



<p>Isso nos levanta três questões muito importantes:</p>



<h2 class="wp-block-heading">Juízes lidando com tecnologia</h2>



<p><strong>A primeira delas é sobre o conhecimento técnico que deveria embasar decisões judiciais</strong>. O judiciário e a polícia precisam de bons assessores técnicos para auxilia-los nas decisões. Por exemplo, do primeiro grupo a ser excluído, mesmo que agisse imediatamente, o Telegram não teria dado algum.</p>



<p>Pior do que isso, veja esse trecho do <a href="https://www.conjur.com.br/dl/telegram-decisao-suspensao.pdf">ofício enviado pela Justiça do Espírito Santo</a> ao Telegram:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>&#8230; forneça, no prazo de 24 horas, os dados cadastrais com <strong>nome</strong>, nome de usuários, <strong>CPF</strong>, foto do perfil, status do perfil, <strong>e-mail</strong>, <strong>endereço</strong>, <strong>dados bancários</strong> e do <strong>cartão de crédito</strong> cadastrados, <strong>contatos</strong> fornecidos para recuperação de conta, dispositivos vinculados (incluindo IMEI, se houver), número de confiança<br>indicado para a autenticação de dois fatores e logs de criação (contendo IP, data, hora, fuso horário GMT/UTC e porta lógica) de todos os usuários do canal &#8230;</p>
</blockquote>



<p>Você que é usuário de Telegram, me diga, em algum momento você cadastrou seu CPF ou sua conta bancária no aplicativo? Talvez você seja usuário do Premium e tenha cadastrado seu cartão de crédito. Mas, se for o caso, espero que seu cartão de crédito tenha sido tokenizado por um gateway de pagamento e o Telegram também não tenha acesso aos dados do cartão.</p>



<h3 class="wp-block-heading">Como cumprir uma ordem impossível?</h3>



<p>Não sei se Pavel Durov está de má vontade com a justiça brasileira. Ele é um sujeito polêmico e está sempre metido nesse tipo de confusão. Mas uma coisa está clara: mesmo que o Telegram não tivesse solicitado informações adicionais e tivesse agido imediatamente, não teria sido possível atender completamente o pedido da justiça.  Veja esse trecho da política de privacidade do Telegram:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Telegram é um serviço de comunicação. Você informa seu número de telefone e dados básicos de conta (o que pode incluir um nome de perfil, foto de perfil e informação sobre você) para criar uma conta Telegram&#8230; Nós não queremos saber seu nome real, gênero, idade ou do que você gosta.</p>
</blockquote>



<p>É claro que um juiz não tem a menor obrigação ou condições de saber o que é criptografia de ponta-a-ponta, política de retenção de dados, tokenização, etc. Mas deveria ter alguém ao lado dele para dizer: &#8220;então, excelência, isso aqui que o senhor está pedindo&#8230;&#8221;</p>



<p>Talvez, se o judiciário e a polícia estivessem melhor assessorados por técnicos competentes, não tivessem pedido ao Telegram dados que eles obviamente não têm. Talvez isso tivesse eliminado a necessidade de o Telegram responder com novas dúvidas. Nesse cenário em que o tempo foi crucial para o fracasso da iniciativa, talvez isso permitisse coletar os dados que o Telegram obviamente tinha (como número de telefone e IP) antes de o grupo ser apagado.</p>



<h2 class="wp-block-heading">Sites e aplicativos na internet mundial</h2>



<p><strong>A segunda questão muito importante é sobre quanto empresas estrangeiras devem cumprir a legislação brasileira ao operar pela internet</strong>. </p>



<p>Por que então estamos com o Telegram bloqueado no Brasil? Se o Telegram não tinha os dados, por que o juiz determinou a suspensão do serviço? Porque no entendimento do juiz:</p>



<ol class="wp-block-list">
<li>O Telegram <strong>tinha</strong> os dados e não queria entregá-los. Por isso ele escreve &#8220;ante a recalcitrância do Telegram em cumprir&#8230;&#8221; O que volta para o ponto acima, o juiz não entendeu os detalhes técnicos do que estava pedindo.</li>



<li>O Telegram <strong>deveria</strong> ter esses dados. Porque a legislação brasileira exige. O <a href="http://www.planalto.gov.br/ccivil_03/_ato2011-2014/2014/lei/l12965.htm">Marco Civil da Internet</a>, em seu artigo 15°, diz:</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>O provedor de aplicações de internet constituído na forma de pessoa jurídica e que exerça essa atividade de forma organizada, profissionalmente e com fins econômicos deverá manter os respectivos registros de acesso a aplicações de internet, sob sigilo, em ambiente controlado e de segurança, pelo prazo de 6 (seis) meses, nos termos do regulamento.</p>
</blockquote>



<p>Aqui também temos uma complicação ´técnica porque a legislação não diz quais registros de acesso, de quê, devem ser guardados. Absolutamente nenhuma aplicação guarda logs de <strong>TUDO</strong> o que o usuário faz ou acessa porque, obviamente, esses logs poderiam ser maiores que o próprio banco de dados da aplicação.</p>



<p>Ou seja, o Telegram poderia ter log de acesso dos usuários, com IP, hora de login e atividade, e não ter nenhuma informação sobre de que grupos cada usuário participava, tornando impossível vincular um id de grupo a uma lista de usuários. Tudo isso, sem descumprir a legislação. Acontece que o Telegram nem precisaria cumprir a legislação brasileira.</p>



<h3 class="wp-block-heading">O Telegram e a lei brasileira</h3>



<p>O Telegram não tem escritório no Brasil. Há um tempo alguns portais noticiaram, de uma forma bem sensacionalista, que <a href="https://www.tecmundo.com.br/redes-sociais/234212-telegram-tem-representante-brasil-ha-7-anos-ignora-tse.htm">o Telegram teria um escritório o representando no Brasil</a>. Não é verdade, eles apenas contrataram um escritório de advocacia brasileiro para cuidar do registro da marca deles no Brasil.</p>



<p>Bom, é uma empresa com sede em Dubai e servidores todos fora do Brasil. Eles não estão sujeitos a nossa legislação. Nós deveríamos permitir que usuários brasileiros usassem os serviços deles?</p>



<p>Pense bem antes de responder. É claro que nós queremos que as empresas sejam responsáveis por seus atos, produtos e serviços e a legislação é uma maneira de tentar garantir isso. Mas você realmente quer que brasileiros não possam acessar sites, blogs, jogos, aplicativos e serviços de empresas e entidades que não têm uma sede brasileira? Isso não mataria boa parte da inovação que a internet pode trazer ao nos permitir colaborar em escala global?</p>



<h2 class="wp-block-heading">Para que serviu o Telegram bloqueado?</h2>



<p><strong>O que nos leva ao terceiro ponto: será que o judiciário não deveria pensar duas vezes antes de bloquear serviços usados pela população?</strong> É claro que combater o nazismo é uma causa super prioritária e devemos empregar todos os esforços que pudermos nela. Mas o que estamos vendo aqui é uma trapalhada de comunicação entre o judiciário e o Telegram que, como consequência, prejudicou a vida dos 42 milhões de usuários ativos do app no Brasil. Muitos deles que usam o aplicativo para trabalhar e sustentar suas famílias. Se os dados que a justiça quer não existem, manter o Telegram bloqueado não está ajudando ninguém.</p>



<p>O Telegram entregou à Justiça os dados que eles tinham, o número de telefone e IP do administrador do grupo:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="491" height="171" src="https://elcio.com.br/wp-content/uploads/2023/04/image.png" alt="Captura de tela do ofício que deixou o Telegram bloqueado, mostrando os dados do administrador do grupo neonazista:
Usuário: #6129271951
Telefone: +51969506146
IP: 190.236.6.11, 11 Apr 2023, 4:16:36, UTC+0" class="wp-image-111139"/></figure>



<p>Tanto o número de telefone quanto o endereço de IP são de Lima, no Peru:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="667" height="161" src="https://elcio.com.br/wp-content/uploads/2023/04/image-1.png" alt="Geolocalização do IP do administrador do grupo neonazista:
IP ADDRESS: 190.236.6.11
COUNTRY: Peru 
REGION: Lima
CITY: Lima
ISP: Telefonica del Peru S.A.A.
ORGANIZATION: Not available
LATITUDE: -12.0433
LONGITUDE: -77.0283" class="wp-image-111140" srcset="https://elcio.com.br/wp-content/uploads/2023/04/image-1.png 667w, https://elcio.com.br/wp-content/uploads/2023/04/image-1-500x121.png 500w" sizes="auto, (max-width: 667px) 100vw, 667px" /></figure>



<p></p>



<p>Faz sentido deixar o Telegram bloqueado para 42 milhões de pessoas por isso? Ainda mais por uma ordem impossível de ser cumprida?</p>
<p>O post <a href="https://elcio.com.br/telegram-bloqueado-no-brasil/">Telegram Bloqueado no Brasil: o que exatamente aconteceu</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/telegram-bloqueado-no-brasil/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Experimento com animações CSS</title>
		<link>https://elcio.com.br/experimento-com-animacoes-css/</link>
					<comments>https://elcio.com.br/experimento-com-animacoes-css/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Wed, 20 May 2020 13:39:00 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[animações]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[experimento]]></category>
		<category><![CDATA[front-end]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111125</guid>

					<description><![CDATA[<p>Fiz uma pequena experiência com animações CSS: O truque é usar gradientes CSS e animar o background-size e background position. Fiz isso em várias camadas,&#8230;</p>
<p>O post <a href="https://elcio.com.br/experimento-com-animacoes-css/">Experimento com animações CSS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Fiz uma pequena experiência com animações CSS:</p>



<iframe src="/animation/" style="height:50vh;width:100%"></iframe>



<p>O truque é usar gradientes CSS e animar o background-size e background position. Fiz isso em várias camadas, com opacidade variável.</p>



<p>Veja <a href="https://elcio.com.br/animation/">aqui</a>.</p>
<p>O post <a href="https://elcio.com.br/experimento-com-animacoes-css/">Experimento com animações CSS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/experimento-com-animacoes-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Programe Música: Sonic Pi</title>
		<link>https://elcio.com.br/programe-musica-sonic-pi/</link>
					<comments>https://elcio.com.br/programe-musica-sonic-pi/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 19 May 2020 01:11:30 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[diversão]]></category>
		<category><![CDATA[live coding]]></category>
		<category><![CDATA[música]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[ruby]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111118</guid>

					<description><![CDATA[<p>É, oficialmente, meu novo hobby. Sonic Pi é uma ferramenta para criação de música ao vivo através de programação Ruby.<br />
É divertidíssimo! Recomendo.</p>
<p>O post <a href="https://elcio.com.br/programe-musica-sonic-pi/">Programe Música: Sonic Pi</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>É, oficialmente, meu novo hobby. <a href="https://sonic-pi.net/">Sonic Pi</a> é uma ferramenta para criação de música ao vivo através de programação Ruby.</p>



<p>É divertidíssimo! Olha só, um exemplo do Sonic Pi tocando um Dó-Ré-Mi-Fá:</p>



<pre class="wp-block-code"><code># Do-Re-Mi-Fa

use_synth :pluck

melody = &#91; :C, :D, :E, :F, 0, :F, :F, 0,
           :C, :D, :C, :D, 0, :D, :D, 0,
           :C, :G, :F, :E, 0, :E, :E, 0,
           :C, :D, :E, :F, 0, :F, :F, 0 ]

melody.each do |note|
  if note != 0 then
    play note
  end
  sleep 0.3
end
</code></pre>



<p>Numa tarde de domingo, escrevi o seguinte programa:</p>



<pre class="wp-block-code"><code># Cyber Piano Blues #1
# Author: Elcio Ferreira
# https://elcio.com.br/

beat = 0.45

chords = &#91; chord(:A3, :minor7), chord(:D4, :minor7), chord(:A3, :minor7), chord(:A3, :minor7),
           chord(:D4, :minor7), chord(:D4, :minor7), chord(:A3, :minor7), chord(:A3, :minor7),
           chord(:E4, :minor7), chord(:D4, :minor7), chord(:A3, :minor7), chord(:E4, :major7),
           ]

basses = &#91; :A2, :C3, :E3, :A2, :D3, :F3, :E3, :C3, :E3, :D3, :C3, :E3,
           :A2, :C3, :A2, :C3, :D3, :F3, :A2, :C3, :E3, :A2, :E3, :A2 ]

melody = &#91;&#91; :A4, :B4, :C5, :E5, :B4, :C5, :E5, :Fs5, :A4, :B4, :C5, :E5, :B4, :C5, :E5, :Fs5,
            :E5, :B4, :C5, :E5, :B4, :C5, :E5, :C5,  :E5, :B4, :C5, :E5, :B4, :C5, :E5, :C5,
            :C5, :E5, :G5, :E5, :C5, :A4, :F4, :C5,  :C5, :E5, :G5, :E5, :C5, :A4, :F4, :C5,
            :A4, :B4, :C5, :E5, :B4, :C5, :E5, :C5,  :A4, :B4, :C5, :E5, :B4, :C5, :E5, :C5,
            :B4, :G4, :B4, :D5, :F5, :D5, :F5, :D5,  :B4, :G4, :B4, :D5, :F5, :D5, :F5, :D5,
            :B4, :C5, :E5, :Fs5,:E5, :Gs5,:E5, :D5,  :B4, :C5, :E5, :Fs5,:E5, :Gs5,:E5, :D5,
            ],
          &#91; :B4, :C5, :A4, :E5, :C5, :E5, :B4, :Fs5,
            :B4, :C5, :E5, :E5, :C5, :E5, :B4, :C5,
            :E5, :G5, :C5, :E5, :A4, :F4, :C5, :C5,
            :B4, :C5, :A4, :E5, :C5, :E5, :B4, :C5,
            :G4, :B4, :B4, :D5, :D5, :F5, :F5, :D5,
            :C5, :E5, :B4, :Fs5,:Gs5,:E5, :E5, :D5,
            ]
          ]


live_loop :melody do
  use_synth :piano
  idx = 0
  2.times do |melodyidx|
    4.times do |time|
      if time == 1 or time == 3 then
        melody&#91;melodyidx].each do |tune|
          play tune
          sleep beat * (idx % 2 + 0.5)
          idx+=1
        end
      elsif time == 2 then
        melody&#91;melodyidx].each do |tune|
          2.times do
            play tune
            if idx % 2 == 1 then
              sleep beat * 1
              play tune, pan: 0.5
            end
            sleep beat * 0.5
            play tune, pan: -0.5
            idx+=1
          end
        end
      else
        play :A5
        play_chord chord(:A4, :major7)
        play_chord chord(:A5, :major7)
        sleep beat * 6 * 8
        melody&#91;1].each do |tune|
          play tune
          sleep beat/2
          play tune
          sleep beat/2
        end
      end
    end
  end
end

live_loop :chimes do
  sleep 12 * 4 * 4 * beat
  (12 * 4 * 4).times do
    sample :drum_cymbal_pedal
    sleep beat
  end
end

counter = 0
live_loop :drums do
  if counter % 4 == 0 and counter > 23 and counter &lt; 48 then
    sample :drum_cymbal_open
  end
  sleep beat
  sample :drum_tom_hi_soft, pan: 0.4
  sleep beat * 1.5
  if counter > 23 then
    sample :drum_tom_hi_soft, pan: 0.4
  end
  sleep beat / 2
  if counter > 47 then
    sample :drum_tom_hi_soft, pan: 0.4
  end
  sleep beat
  sample :drum_snare_soft
  if counter % 24 == 0 then
    sample :drum_cymbal_closed, pan: 0.4
  end
  counter += 1
  if counter > 71 then
    counter = 0
  end
end

live_loop :progression_chords do
  use_synth :piano
  4.times do |variation|
    if variation > 0 then
      chords.each do |thechord|
        sleep beat
        play thechord, pan: -0.4
        sleep beat * 4
        play thechord, pan: -0.4
        sleep beat * 3
      end
    else
      chords.each do |thechord|
        sleep beat/2
        play thechord, pan: -0.4
        sleep beat * 2
        play thechord, pan: -0.2
        sleep beat * 1.5
        sleep beat/2
        play thechord, pan: 0
        sleep beat * 2
        play thechord, pan: 0.2
        sleep beat * 1.5
      end
    end
  end
end

live_loop :basses do
  use_synth :piano
  3.times do
    basses.each do |bass|
      2.times do
        play bass, amp: 1, pan: -0.7
        sleep beat/2
        play bass, amp: 1, pan: -0.7
        sleep beat * 3.5
      end
    end
  end
  4.times do
    basses.each do |bass|
      2.times do
        play bass, amp: 1, pan: -0.7
        sleep beat/2
        play bass, amp: 1, pan: -0.7
        sleep beat * 2.5
        play bass, amp: 1, pan: -0.7
        sleep beat
      end
    end
  end
end

live_loop :progression_melody do
  use_synth :piano
  5.times do |round|
    chords.each do |thechord|
      if round == 0 then
        play_pattern_timed thechord, beat/2, amp: 1, pan: 0.7
        sleep beat * 2
        play_pattern_timed thechord, beat/2, amp: 1, pan: 0.7
        sleep beat * 2
      elsif round == 1 then
        play_pattern_timed thechord, beat, amp: 0.6, pan: 0.7
        play_pattern_timed thechord, beat/2, amp: 0.6, pan: 0.7
        sleep beat * 2
      elsif round == 2 then
        play_pattern_timed thechord, beat, amp: 0.6, pan: 0.7
        play_pattern_timed thechord, beat, amp: 0.6, pan: 0.7
      else
        play_pattern_timed thechord, beat/2, amp: 0.6, pan: 0.7
        play_pattern_timed thechord, beat/2, amp: 0.6, pan: 0.7
        sleep beat * 4
      end
    end
  end
end
</code></pre>



<p>Se você não estiver afim de instalar o Sonic Pi para testar, e quiser saber como ficou meu blues:</p>



<figure class="wp-block-audio"><audio controls src="https://elcio.com.br/wp-content/uploads/2020/05/blues.mp3"></audio><figcaption>Meu primeiro blues em Sonic Pi</figcaption></figure>



<p>Recomendo! Instala, testa, é divertido!</p>
<p>O post <a href="https://elcio.com.br/programe-musica-sonic-pi/">Programe Música: Sonic Pi</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/programe-musica-sonic-pi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://elcio.com.br/wp-content/uploads/2020/05/blues.mp3" length="9121540" type="audio/mpeg" />

			</item>
		<item>
		<title>Otimização de performance prematura: não faça!</title>
		<link>https://elcio.com.br/otimizacao-de-performance-prematura-nao-faca/</link>
					<comments>https://elcio.com.br/otimizacao-de-performance-prematura-nao-faca/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Mon, 17 Feb 2020 12:06:00 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[arquivos]]></category>
		<category><![CDATA[banco de dados]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[modelagem]]></category>
		<category><![CDATA[otimização]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[sql]]></category>
		<guid isPermaLink="false">http://elcio.com.br/?p=64960</guid>

					<description><![CDATA[<p>Otimização de performance é uma preocupação comum para quem está começando em programação, e muitas vezes mesmo programadores experientes tem dúvidas sobre esse assunto, o&#8230;</p>
<p>O post <a href="https://elcio.com.br/otimizacao-de-performance-prematura-nao-faca/">Otimização de performance prematura: não faça!</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Otimização de performance é uma preocupação comum para quem está começando em programação, e muitas vezes mesmo programadores experientes tem dúvidas sobre esse assunto, o que é normal uma vez que o assunto é mesmo complexo. Não vou explicar nesse post tudo o que você precisa saber sobre performance, mas pretendo dizer o mais importante: quando você precisa se preocupar. Isso mesmo, porque um erro muito comum é ver os programadores se preocupar demais com performance, na hora errada.</p>
<p>Então vamos lá: nossos computadores são muito potentes hoje em dia. Muito. Dificilmente mudar a lógica de um cálculo, criar uma variável a menos, otimizar um loop, ou até concatenar menos strings vai fazer algum diferença sensível. Então, não pré-otimize, não otimize antes de medir.</p>
<p>Vamos mostrar um exemplo. Fiz em <a href="https://elcio.com.br/tags/python/">Python</a> só porque eu gosto, mas a mesma coisa vale para sua linguagem favorita. Escrevi os dois arquivos a seguir:</p>
<h4>strings1.py</h4>
<pre>tamanho=20
a='a'
for i in range(tamanho):
    a*=2
print(len(a))</pre>
<h4>strings2.py</h4>
<pre>tamanho=20
a='a' * (2**tamanho)
print(len(a))</pre>
<p>São duas maneiras bem diferentes de se criar uma grande string. A segunda é muito mais eficiente que a primeira. Bom, veja os resultados da execução aqui na minha máquina:</p>
<pre><strong>$ time python strings1.py</strong>
1048576
real 0m0.023s
user 0m0.013s
sys 0m0.008s
<strong>$ time python strings2.py</strong>
1048576
real 0m0.021s
user 0m0.012s
sys 0m0.008s</pre>
<p>Nenhuma diferença prática, certo? Aumentei a variável tamanho para 30, agora notamos diferença:</p>
<pre><strong>$ time python strings1.py</strong>
1073741824
real 0m1.375s
user 0m0.671s
sys  0m0.691s
<strong>$ time python strings2.py</strong>
1073741824
real 0m0.586s
user 0m0.235s
sys  0m0.344s</pre>
<p>Agora a diferença é absurda, certo? Mas quando foi a última vez que você precisou concatenar strings de um bilhão de caracteres? O caso é: se suas strings vão chegar a esse tamanho, você provavelmente vai saber disso antes. Por exemplo, se você está fazendo um software de tratamento de imagens, parece óbvio que processamento pode ser um problema, certo? Se não, gastar seu tempo e esforço com otimização de performance provavelmente não vale a pena.</p>
<p><strong>Aviso</strong>: o código do exemplo 1 é muito ruim, além de dar mais trabalho para escrever. Eu <em><strong>não</strong></em> estou sugerindo que você escreva código ruim de propósito, tá? Apenas que você não se preocupe demais com performance e não gaste seu tempo resolvendo problemas imaginários.</p>
<p>Há, porém, algumas situações em que tudo o que eu disse acima não vale. Nossos processadores são muito rápidos, nossas memórias também. Discos já não são tão rápidos assim. Bancos de dados, mais ou menos. A internet, bom, quem pode confiar na internet, né?</p>
<p>Então, se você vai consumir um webservice, e pode mudar seu algoritmo para fazer dez chamados ao invés de vinte, faça isso. Se vai escrever muito no disco, e puder reduzir em 20% as operações de escrita de arquivos, faça isso. Se escrevendo uma consulta SQL mais complexa você consegue fazer muito menos consultas ao banco de dados e usar mais índices, faça isso.</p>
<p>Eu faço mais ou menos assim em relação a performance:</p>
<ol>
<li>Vamos usar a internet? Otimize sempre.</li>
<li>Vamos gravar grandes arquivos, ou fazer uso intensivo de disco? Otimize sempre.</li>
<li>Cálculo científico, tratamento de imagens e outras operações de processamento massivo? Otimize sempre.</li>
<li>Bancos de dados com milhões de registros e uso intenso? Otimize sempre.</li>
<li>Uso comum de arquivos e bancos de dados? Cuide de não escrever nada muito ruim, e otimize se der problema.</li>
<li>O resto todo? Escreva pensando em legibilidade, encapsulamento e reuso. Só otimize se tiver problemas.</li>
</ol>
<p>Publiquei um vídeo sobre isso há um tempo, se você quiser dar uma olhada: <a href="https://www.youtube.com/watch?v=z0AgfjRgLGA">Não pré-otimize</a>.</p>
<p>O post <a href="https://elcio.com.br/otimizacao-de-performance-prematura-nao-faca/">Otimização de performance prematura: não faça!</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/otimizacao-de-performance-prematura-nao-faca/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Média de lista em Python, como calcular</title>
		<link>https://elcio.com.br/media-de-lista-em-python-como-calcular/</link>
					<comments>https://elcio.com.br/media-de-lista-em-python-como-calcular/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 20 Aug 2019 10:36:09 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[cálculo]]></category>
		<category><![CDATA[dica]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[dúvida]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111103</guid>

					<description><![CDATA[<p>Às vezes a gente tem a tendência de complicar as coisas. Semana passada, um amigo me perguntou se há alguma forma de calcular a média&#8230;</p>
<p>O post <a href="https://elcio.com.br/media-de-lista-em-python-como-calcular/">Média de lista em Python, como calcular</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Às vezes a gente tem a tendência de complicar as coisas. Semana passada, um amigo me perguntou se há alguma forma de calcular a média de uma lista em <a href="https://elcio.com.br/tags/python/">Python</a>. Assim como há funções para calcular a soma dos elementos ou o maior elemento, ele esperava que houvesse uma para calcular a média. </p>



<p>Afinal, calcular a média de uma lista é uma necessidade comum, certo? Deve haver no Python algum jeito fácil de fazer, então. Quando eu disse que não, meu amigo gastou alguns segundos pesquisando e chegou nessa solução:</p>



<pre class="wp-block-code"><code>import numpy
l = [ 2, 5, 6.8, 9, 7]
avg = numpy.mean(l)</code></pre>



<p>Funciona. Não é muito código. Mas tem alguns problemas:</p>



<ol class="wp-block-list"><li><strong>Cria uma dependência extra</strong>: será preciso ter o <a href="https://www.numpy.org/">numpy</a> instalado para que a aplicação funcione</li><li><strong>Complica um pouco mais o código</strong>: nem todo mundo sabe o que faz o método .mean(), fazendo com que outros programadores tenham que gastar um tempinho pesquisando</li><li><strong>Tem uma performance pior</strong>: ou, pelo menos, para os tamanhos de lista mais comum. A função de média do numpy é otimizada. Deveria portanto, ser mais rápida. Se você tiver que calcular centenas de médias de listas gigantescas, numpy vai fazer diferença. Mas não é o caso da maioria das aplicações. Se você for usar pouco a função mean() o custo de importá-la é maior que o de fazer o cálculo você mesmo.</li></ol>



<p>E como fica esse cálculo? O jeito como eu recomendo calcular a média de uma lista em Python é esse:</p>



<pre class="wp-block-code"><code>l = [ 2, 5, 6.8, 9, 7]
avg = sum(l)/len(l)</code></pre>



<p>A dica é: antes de procurar ou construir um módulo com a solução do seu problema, pense se não é um problema simples demais para isso. Se você fizer esse exercício, vai evitar escrever código como esse:</p>



<pre class="wp-block-code"><code>import calculations
x = calculations.sum(2, 7)</code></pre>



<p>Ao invés de:</p>



<pre class="wp-block-code"><code>x = 2 + 7</code></pre>



<p>E não, não tem filosofia, técnica ou estratégia que você posa usar para tentar me convencer de que o primeiro jeito é melhor do que o segundo.</p>
<p>O post <a href="https://elcio.com.br/media-de-lista-em-python-como-calcular/">Média de lista em Python, como calcular</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/media-de-lista-em-python-como-calcular/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recursos &#8220;escondidos&#8221; do Python</title>
		<link>https://elcio.com.br/recursos-escondidos-do-python/</link>
					<comments>https://elcio.com.br/recursos-escondidos-do-python/#comments</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 25 Jun 2019 18:18:59 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[dúvida]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Quora]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111095</guid>

					<description><![CDATA[<p>Resposta que eu dei à pergunta: Quais são alguns dos recursos ocultos do Python?&#160;no Quora. 1. Atribuição múltipla (com tuple unpacking) a, b, c =&#8230;</p>
<p>O post <a href="https://elcio.com.br/recursos-escondidos-do-python/">Recursos &#8220;escondidos&#8221; do Python</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Resposta que eu dei à pergunta: <a href="https://pt.quora.com/Quais-s%C3%A3o-alguns-dos-recursos-ocultos-do-Python">Quais são alguns dos recursos ocultos do Python?</a>&nbsp;no Quora.</p>



<hr class="wp-block-separator"/>



<p>1. Atribuição múltipla (com tuple unpacking)</p>



<pre class="wp-block-preformatted">a, b, c = 1, 2, 3</pre>



<p>2. Com isso dá para trocar o valor de variáveis</p>



<pre class="wp-block-preformatted">a, b = b, a</pre>



<p>3. Encadeamento de comparadores</p>



<pre class="wp-block-preformatted">x = 3
print(1 &lt; x &lt; 5) # True</pre>



<p>4. Generators</p>



<pre class="wp-block-preformatted">def fib(max):
    n1, n2 = 0, 1
    for i in range(max):
        yield n1
        n1, n2 = n2, n1 + n2
f = fib(20)
for i in f:
    print(i)</pre>



<p>5. If em uma linha</p>



<pre class="wp-block-preformatted">aliquota = 0.05 if valor &lt; 1000 else 0.07</pre>



<p>6. List comprehension</p>



<pre class="wp-block-preformatted"># Quadrados dos números de 0 a 99
[i ** 2 for i in range(100)]

# Quadrados dos números de 0 a 99, apenas
# se o resultado não contém o dígito "4"
[i ** 2 for i in range(100) if not '4' in str(i**2)]</pre>



<p>7. Invertendo uma string</p>



<pre class="wp-block-preformatted">a = a[::-1]</pre>



<p>8. enumerate</p>



<pre class="wp-block-preformatted">for i, l in enumerate('palavra'):
    print (i, l, end=' / ')
# 0 p / 1 a / 2 l / 3 a / 4 v / 5 r / 6 a /</pre>



<p>9. Unpacking estendido (só Python 3)</p>



<pre class="wp-block-preformatted">a, *b, c = "unpacking"
print(a, b, c)
# u ['n', 'p', 'a', 'c', 'k', 'i', 'n'] g</pre>



<p>10. Dict comprehension</p>



<pre class="wp-block-preformatted">d = {i: i**2 for i in range(10)}
print(d)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}</pre>



<p>11. String formatting</p>



<pre class="wp-block-preformatted">dados={'nome': 'Joaquim', 'email': 'jsilva@fbi.gov'}
print('%(nome)s &lt;%(email)s&gt;' % dados)
# Joaquim &lt;jsilva@fbi.gov&gt;
print('{nome} &lt;{email}&gt;'.format(**dados))
# Joaquim &lt;jsilva@fbi.gov&gt;</pre>



<p>12. zip</p>



<pre class="wp-block-preformatted">list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]</pre>



<p><strong>Módulos Úteis</strong></p>



<p>1. collections</p>



<pre class="wp-block-preformatted">import collections
print(collections.Counter('banana'))
# Counter({'a': 3, 'n': 2, 'b': 1})
d = collections.defaultdict(lambda:'...')
d['nome'] = 'Teste'
print(d['nome']) # Teste
print(d['idade']) # ...</pre>



<p>2. pprint</p>



<pre class="wp-block-preformatted">from pprint import pprint
pprint(['a' * i for i in range(20)])
# ['',
#  'a',
#  'aa',
#  'aaa',
#  'aaaa',
#  'aaaaa',
#  'aaaaaa',
#  'aaaaaaa',
#  'aaaaaaaa',
#  'aaaaaaaaa',
#  'aaaaaaaaaa',
#  'aaaaaaaaaaa',
#  'aaaaaaaaaaaa',
#  'aaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaaaaaa',
#  'aaaaaaaaaaaaaaaaaaa']</pre>



<p>3. itertools</p>



<pre class="wp-block-preformatted">import itertools
for i in itertools.permutations("123"):
    print("".join(i), end=", ")
# 123, 132, 213, 231, 312, 321,
for i in itertools.product("01", repeat=3):
    print("".join(i), end=", ")
# 000, 001, 010, 011, 100, 101, 110, 111,</pre>



<p>4. SimpleHTTPServer</p>



<pre class="wp-block-preformatted">➜  ~ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...</pre>



<p>5. webbrowser</p>



<pre class="wp-block-preformatted">import webbrowser
webbrowser.open('https://campus.visie.com.br/')</pre>



<p>6. atexit</p>



<pre class="wp-block-preformatted">➜  ~ python3 -q
&gt;&gt;&gt; def teste():
...     print('Bye!')
...
&gt;&gt;&gt; import atexit
&gt;&gt;&gt; atexit.register(teste)
&lt;function teste at 0x10973a620&gt;
&gt;&gt;&gt; ^D
Bye!
➜  ~ _</pre>



<p>7. base64</p>



<pre class="wp-block-preformatted">import base64
print(base64.b64encode(b'Teste'))
# b'VGVzdGU='</pre>



<p>8. gzip</p>



<pre class="wp-block-preformatted">import gzip
print(gzip.open('teste.txt.gz').read())</pre>



<p><strong>Easter Eggs</strong></p>



<p>Tente aí:</p>



<pre class="wp-block-preformatted">&gt;&gt; import this
&gt;&gt; import hello
&gt;&gt; import antigravity
&gt;&gt; from __future__ import braces</pre>
<p>O post <a href="https://elcio.com.br/recursos-escondidos-do-python/">Recursos &#8220;escondidos&#8221; do Python</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/recursos-escondidos-do-python/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Como tornar seu script Python executável</title>
		<link>https://elcio.com.br/como-tornar-seu-script-python-executavel/</link>
					<comments>https://elcio.com.br/como-tornar-seu-script-python-executavel/#comments</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Mon, 24 Jun 2019 19:52:34 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[dúvida]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Quora]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[terminal]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111093</guid>

					<description><![CDATA[<p>Resposta que eu dei à pergunta: É possível escrever um script executável em Python? no Quora. Sim! No Windows, basta associar arquivos .py ao Python.&#8230;</p>
<p>O post <a href="https://elcio.com.br/como-tornar-seu-script-python-executavel/">Como tornar seu script Python executável</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Resposta que eu dei à pergunta: <a href="https://pt.quora.com/%C3%89-poss%C3%ADvel-escrever-um-script-execut%C3%A1vel-em-Python">É possível escrever um script executável em Python?</a> no Quora.</p>



<hr class="wp-block-separator"/>



<p>Sim!</p>



<p>No Windows, basta associar arquivos .py ao Python. Acredito que o instalador do Python para windows já faz isso. Feito isso, duplo clique no arquivo .py vai executá-lo.</p>



<p>No Linux, Mac, FreeBSD e assemelhados, basta colocar, na primeira linha do seu script:</p>



<pre class="wp-block-preformatted">#!/usr/bin/env python</pre>



<p>Em seguida, torne seu script executável com o comando:</p>



<pre class="wp-block-preformatted">chmod +x seuscript.py</pre>



<p>Claro, troque &#8220;seuscript&#8221; pelo nome do seu arquivo. Pronto, ele é executável. Você pode executar com:</p>



<pre class="wp-block-preformatted">./seuscript.py</pre>



<p>Diferente do windows, a extensão não precisa ser .py, nem precisa ter extensão. Além disso, você pode mover o script para qualquer lugar no PATH do sistema e poderá executá-lo de qualquer diretório, sem precisar de ./ no início do comando. Por exemplo, pode fazer:</p>



<pre class="wp-block-preformatted">sudo mv ./seuscript.py /usr/local/bin/seucomando</pre>



<p>Em seguida pode executar apenas:</p>



<pre class="wp-block-preformatted">seucomando</pre>



<p>Sem ./ e em qualquer diretório.</p>
<p>O post <a href="https://elcio.com.br/como-tornar-seu-script-python-executavel/">Como tornar seu script Python executável</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/como-tornar-seu-script-python-executavel/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Fish no Mac OS</title>
		<link>https://elcio.com.br/fish-no-mac-os/</link>
					<comments>https://elcio.com.br/fish-no-mac-os/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Thu, 06 Jun 2019 12:46:54 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[fish]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[terminal]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111090</guid>

					<description><![CDATA[<p>Há um tempo, usando KDE Neon, troquei meu shell padrão para o fish. É tudo o que você pode querer num terminal. Autocompletar fantástico, syntax&#8230;</p>
<p>O post <a href="https://elcio.com.br/fish-no-mac-os/">Fish no Mac OS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Há um tempo, usando <a href="https://neon.kde.org/">KDE Neon</a>, troquei meu shell padrão para o <a href="https://fishshell.com/">fish</a>. É tudo o que você pode querer num terminal. Autocompletar fantástico, syntax highlight e fácil de usar. Você pode testar o fish no navegador, sem instalar nada, no <a href="https://rootnroll.com/d/fish-shell/">fish shell playground</a>.</p>



<p>Agora estou de volta com um Mac. Segue um passo a passo de como fiz:</p>



<h2 class="wp-block-heading">1. Instalar o Homebrew</h2>



<p>Esta é a parte mais demorada e complicada do processo, mas a mais importante. Você precisa ter o XCode instalado. Em seguida, execute:</p>



<pre class="wp-block-code"><code>/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"</code></pre>



<p>O script vai te guiar no passo a passo da instalação</p>



<h2 class="wp-block-heading">2. Instalar o fish</h2>



<p>Com o Homebrew instalado, é bem fácil:</p>



<pre class="wp-block-code"><code>brew install fish</code></pre>



<p>Depois disso, você pode abrir o terminal e executar &#8220;fish&#8221;.</p>



<h2 class="wp-block-heading">3. Tornar o fish o shell padrão</h2>



<p>Basta executar:</p>



<pre class="wp-block-code"><code>chsh -s /usr/local/bin/fish</code></pre>



<p>Tendo feito isso, abra uma nova janela do terminal. O fish já deve carregar sozinho.</p>
<p>O post <a href="https://elcio.com.br/fish-no-mac-os/">Fish no Mac OS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/fish-no-mac-os/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Software desejável</title>
		<link>https://elcio.com.br/software-desejavel/</link>
					<comments>https://elcio.com.br/software-desejavel/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Thu, 23 May 2019 10:24:17 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Usabilidade]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111085</guid>

					<description><![CDATA[<p>Usabilidade e design em software é uma oportunidade desperdiçada. Por que ERPs precisam ser tão feios?</p>
<p>O post <a href="https://elcio.com.br/software-desejavel/">Software desejável</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Um dos processos mais eficientes para melhorar a performance e o valor de um software é a análise de funil. </p>



<p>Isso é, você procura pelos &#8220;gargalos&#8221; de performance, aqueles pontos onde, se você melhorar as coisas, tudo vai fluir melhor.</p>



<p>Bem, <a href="https://elcio.com.br/e-sobre-pessoas/">software é feito para ser usado por pessoas</a>. E aí está, geralmente, o gargalo mais óbvio para que um software dê o retorno que se espera dele.</p>



<p>Nós não somos racionais como gostamos de achar que somos. A maior parte de nossas motivações é emocional e intuitiva.</p>



<p>Por isso, se você construir software que as pessoas gostem de usar, isso pode com facilidade dobrar ou triplicar os retornos que seu software gera para seu cliente.</p>



<p>Isso inclui fatores objetivos, como responder rápido, ser fácil de usar, automatizar tarefas repetitivas e exigir menos passos para completar tarefas.</p>



<p>Mas inclui fatores subjetivos. Coisas que fazem as pessoas gostarem de um software.</p>



<p>Por exemplo, não basta que ele <strong>seja</strong> fácil de usar, precisa <strong>parecer</strong> fácil de usar. Não basta <strong>ser</strong> produtivo, precisa <strong>parecer</strong> produtivo.</p>



<p>Estou falando do valor de um bom design. O pessoal que desenvolve sites já descobriu isso há uns vinte anos.</p>



<p>Mas muita gente no mercado de software ainda está desperdiçando essa oportunidade. Você já reparou como são feios e complicados os ERPs, por exemplo?</p>
<p>O post <a href="https://elcio.com.br/software-desejavel/">Software desejável</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/software-desejavel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>É sobre pessoas</title>
		<link>https://elcio.com.br/e-sobre-pessoas/</link>
					<comments>https://elcio.com.br/e-sobre-pessoas/#comments</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Wed, 22 May 2019 09:39:23 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[pessoas]]></category>
		<category><![CDATA[Usabilidade]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111082</guid>

					<description><![CDATA[<p>Você gastou um bocado de tempo para entender de computadores. E de gente?</p>
<p>O post <a href="https://elcio.com.br/e-sobre-pessoas/">É sobre pessoas</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você está no negócio de atender pessoas. </p>



<p>Se você desenvolve software, lembre-se de que alguém vai usá-lo. Para gerenciar coisas que importam para outras pessoas.</p>



<p>Se você desenvolve sites, lembre-se de que ele será acessado por pessoas. Para comunicar algo sobre outras pessoas.</p>



<p>Computadores são máquinas determinísticas. Ou pelo menos, são feitos para ser. Isso significa que, recebendo as mesmas entradas, um computador deveria se comportar sempre do mesmo jeito.</p>



<p>Seu comportamento pode ser completamente compreendido e previsto. E, se você é um programador, é exatamente isso que você estudou para fazer.</p>



<p>Já pessoas são o oposto. Não são máquinas, não são determinísticas. Seu comportamento também pode ser estudado e previsto, mas nunca com a mesma precisão. E isso exige um conjunto completamente diferente de conhecimento e ferramentas.</p>



<p>Talvez você precise gastar algum tempo para entender de pessoas. No post de amanhã vou falar sobre o porquê.</p>
<p>O post <a href="https://elcio.com.br/e-sobre-pessoas/">É sobre pessoas</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/e-sobre-pessoas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Aprenda os fundamentos: cores no CSS</title>
		<link>https://elcio.com.br/aprenda-os-fundamentos-cores-no-css/</link>
					<comments>https://elcio.com.br/aprenda-os-fundamentos-cores-no-css/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 21 May 2019 12:04:31 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[cores]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[Estilo de Vida]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111078</guid>

					<description><![CDATA[<p>Quando você se deparar com algum tipo de código, tenha a curiosidade de decifrá-lo. Me impressiono com a quantidade de programadores que precisam escrever CSS&#8230;</p>
<p>O post <a href="https://elcio.com.br/aprenda-os-fundamentos-cores-no-css/">Aprenda os fundamentos: cores no CSS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Quando você se deparar com algum tipo de código, tenha a curiosidade de decifrá-lo.</p>



<p>Me impressiono com a quantidade de programadores que precisam escrever CSS com regularidade e nunca pararam para entender o significado dos código de cores.</p>



<p>É simples: uma cor RGB é composta de três números, representando as cores vermelho (R), verde (G) e azul (B). Cada um desses números pode ir de 0 a 255 (1 byte).</p>



<p>Então o vermelho vivo é:</p>



<pre class="wp-block-code"><code>rgb(255, 0, 0)</code></pre>



<p>Que também pode ser escrito como:</p>



<pre class="wp-block-code"><code>rgb(100%, 0, 0)</code></pre>



<p>Ou, em hexadecimal (255 = FF):</p>



<pre class="wp-block-code"><code>#FF0000</code></pre>



<p>As cores que podem ser &#8220;arredondadas&#8221; para duplas de letras iguais, como essa, podem também ser escritas assim:</p>



<pre class="wp-block-code"><code>#F00</code></pre>



<p>E é isso. Da próxima vez que você escrever uma cor, vai saber o que significa. Agora pesquisa sobre RGBA, você via ver como fica fácil entender.</p>



<p>Mas não é só sobre cores. Faça isso sempre que se deparar com qualquer tipo de código, tente entender o que ele significa, você vai gastar um pouquinho de tempo no início, mas a vida vai ficar muito mais fácil depois.</p>
<p>O post <a href="https://elcio.com.br/aprenda-os-fundamentos-cores-no-css/">Aprenda os fundamentos: cores no CSS</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/aprenda-os-fundamentos-cores-no-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Você está no negócio do conhecimento</title>
		<link>https://elcio.com.br/voce-esta-no-negocio-do-conhecimento/</link>
					<comments>https://elcio.com.br/voce-esta-no-negocio-do-conhecimento/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Mon, 20 May 2019 10:47:16 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[carreira]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[dicas]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111073</guid>

					<description><![CDATA[<p>Programadores vendem o que sabem fazer. Se você souber mais, vai ter mais pra vender.</p>
<p>O post <a href="https://elcio.com.br/voce-esta-no-negocio-do-conhecimento/">Você está no negócio do conhecimento</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.joelonsoftware.com/">Joel Spolsky</a> diz que um bom programador pode ser 5 ou 10 vezes mais produtivo que um programador medíocre.</p>



<p>Esses números, postos desse jeito, talvez não dêem a dimensão do que isso significa. Você preferiria trabalhar com alguém porque ele é 10% mais produtivo? Que tal 20%? Com certeza!</p>



<p>Não estamos falando de um ganho de 10% ou 20%, estamos falando de um ganho de 400% a 900%!</p>



<p>Você quer ser esse programador? Então vai estudar, filhão!</p>



<p>Eu sei que tem assuntos demais para ser estudados, que é difícil escolher qual linguagem, framework, ferramenta ou técnica aprender em seguida. Mas não use isso como desculpa! Larga um pouco o Free Fire e investe na sua carreira.</p>



<p>Faço uma aposta com você: meia hora por dia, por seis meses. Daqui a seis meses você pede um aumento, ou arruma um emprego melhor. Duvido que não funcione.</p>
<p>O post <a href="https://elcio.com.br/voce-esta-no-negocio-do-conhecimento/">Você está no negócio do conhecimento</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/voce-esta-no-negocio-do-conhecimento/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Não seja escravo das suas ferramentas</title>
		<link>https://elcio.com.br/nao-seja-escravo-das-suas-ferramentas/</link>
					<comments>https://elcio.com.br/nao-seja-escravo-das-suas-ferramentas/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Fri, 17 May 2019 10:55:38 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[pylint]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Yoast SEO]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111067</guid>

					<description><![CDATA[<p>Padrões de código não são os dez mandamentos. Você pode quebrar as regras, se tiver um bom motivo.</p>
<p>O post <a href="https://elcio.com.br/nao-seja-escravo-das-suas-ferramentas/">Não seja escravo das suas ferramentas</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Muita gente que, como eu, tem um blog, usa o plugin <a href="https://yoast.com/wordpress/plugins/seo/">Yoast SEO</a> para WordPress. É muito bom, uma escolha óbvia. Ele praticamente lê seu texto e te diz o que você tem que fazer para melhorar a indexação.</p>



<p>O problema? Muitas vezes, otimizar seu texto para uma determinada palavra-chave o torna chato de ler. Seu texto fica mais ou menos assim:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8230; Ao usar um plugin de SEO para WordPress, você corre o risco de escrever um texto mecânico. É verdade que plugins de SEO para WordPress são uma coisa boa, mas você precisa tomar cuidado para não deixar seu plugin de SEO para WordPress mandar em você&#8230;</p></blockquote>



<p>Você quer apenas ser encontrado? Tem um monte de sites por aí tão cheios de publicidade que tornam quase impossível ler o que está escrito. O objetivo é ser encontrado e gerar um clique patrocinado, apenas isso. Se é isso o que você está construindo, vá em frente, siga as regras do plugin e você vai poupar um bocado de tempo.</p>



<p>Mas se seu objetivo é que as pessoas encontrem, leiam e entendam o que você está escrevendo, então seguir cegamente as regras não é a melhor decisão.</p>



<p>Escreve para pessoas, depois faça o que for possível para agradar os robôs.</p>



<p>Há um tempo que eu tenho usado o <a href="https://www.pylint.org/">Pylint</a> em alguns projetos. Ele me avisa se eu deixo de seguir algum padrão de código. Ele até dá uma nota para o meu código!</p>



<p>Mas o recurso mais legal do Pylint é poder fazer isso:</p>



<pre class="wp-block-code"><code>import config # pylint: disable = relative-import</code></pre>



<p>Ou seja, não preciso seguir as regras cegamente.</p>



<p>Você também pode decidir quando quebrar as regras. Escolha com cuidado.</p>
<p>O post <a href="https://elcio.com.br/nao-seja-escravo-das-suas-ferramentas/">Não seja escravo das suas ferramentas</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/nao-seja-escravo-das-suas-ferramentas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Não é sobre quantas linhas de código você escreve</title>
		<link>https://elcio.com.br/nao-e-sobre-quantas-linhas-de-codigo-voce-escreve/</link>
					<comments>https://elcio.com.br/nao-e-sobre-quantas-linhas-de-codigo-voce-escreve/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Thu, 16 May 2019 10:47:55 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[complexidade]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[simplicidade]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111065</guid>

					<description><![CDATA[<p>É sobre manter as coisas simples. Às vezes, menos código é mais simples. Às vezes não.</p>
<p>O post <a href="https://elcio.com.br/nao-e-sobre-quantas-linhas-de-codigo-voce-escreve/">Não é sobre quantas linhas de código você escreve</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Parece haver uma certa fixação entre os programadores, principalmente os menos experientes, em quantas linhas de código são necessárias para resolver determinado problema.</p>



<p>Às vezes isso é bom. Veja como ler um arquivo texto em Java:</p>



<pre class="wp-block-code"><code>import java.io.*; 
public class ReadingFromFile 
{ 
    public static void main(String[] args) throws Exception 
    { 
	FileReader fr = 
	new FileReader("arquivo.txt"); 

	int i; 
	while ((i=fr.read()) != -1) 
	    System.out.print((char) i); 
    } 
} </code></pre>



<p>Agora compare com a mesma coisa em Python:</p>



<pre class="wp-block-code"><code>print(open('arquivo.txt').read())</code></pre>



<p>Nesse caso, parece óbvio que a resposta em Python é muito melhor, não? Agora olhe esse código em JavaScript:</p>



<pre class="wp-block-code"><code>urlscore = url.indexOf('http') ? -1 : (url.indexOf('https://')+1)*5 + 
                                      (url.split('/')[2].indexOf('www')?1:0)*2 + 
                                      (url.split('/')[1].indexOf('@')>-1?-1:1)*3</code></pre>



<p>Uau! O sujeito reduziu a função inteira a uma única expressão! Parece uma boa ideia pra você? Coitado de quem tiver que dar manutenção nisso!</p>



<p>Seu inimigo não é a quantidade de código, é a complexidade. É difícil dar uma boa definição técnica de complexidade, mas você a reconhece quando vê.</p>
<p>O post <a href="https://elcio.com.br/nao-e-sobre-quantas-linhas-de-codigo-voce-escreve/">Não é sobre quantas linhas de código você escreve</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/nao-e-sobre-quantas-linhas-de-codigo-voce-escreve/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Seja conservador (não, não é sobre política)</title>
		<link>https://elcio.com.br/seja-conservador-nao-nao-e-sobre-politica/</link>
					<comments>https://elcio.com.br/seja-conservador-nao-nao-e-sobre-politica/#comments</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Wed, 15 May 2019 10:00:30 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[papel e caneta]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[tecnologia]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111062</guid>

					<description><![CDATA[<p>Às vezes um pouco de ceticismo faz bem. Mesmo com as coisas mais corriqueiras. Experimente escrever a mão, com papel e caneta.</p>
<p>O post <a href="https://elcio.com.br/seja-conservador-nao-nao-e-sobre-politica/">Seja conservador (não, não é sobre política)</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Eu tenho andado por aí com um caderno. Não um desses Moleskines descolados. O meu é um clássico Tilibra de dez matérias, que você pode comprar por doze reais em qualquer papelaria.</p>



<p>Durante milênios a humanidade, ou a parte dela que tinha o privilégio de saber escrever, escreveu a mão. Eu, que vivo de tecnologia, acho uma maravilha poder escrever com um teclado, como estou fazendo agora.</p>



<p>Mas percebi que alguma coisa diferente deve acontecer no cérebro quando a gente escreve a mão. E isso está me fazendo um bem enorme.</p>



<p>A gente usa teclados há duas gerações. Telas touch, há uns quinze anos.</p>



<p>Talvez, daqui a cinquenta anos, a humanidade esteja lamentando o quanto a gente perdeu por deixar de escrever e terceirizar nossa memória. Por deixar que os alunos simplesmente tirem fotos da lousa ao final da aula.</p>



<p>Talvez não. Mas por que correr esse risco? Você pode continuar usando teclados, esfregando suas digitais em pequenas telas de vidro ou falando com seu telefone. Mas experimente o velho e bom papel com caneta, pode funcionar pra você.</p>
<p>O post <a href="https://elcio.com.br/seja-conservador-nao-nao-e-sobre-politica/">Seja conservador (não, não é sobre política)</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/seja-conservador-nao-nao-e-sobre-politica/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>O ano do Linux no Desktop (não como você esperava)</title>
		<link>https://elcio.com.br/o-ano-do-linux-no-desktop-nao-como-voce-esperava/</link>
					<comments>https://elcio.com.br/o-ano-do-linux-no-desktop-nao-como-voce-esperava/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 14 May 2019 10:38:57 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[ChromeOS]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mercado]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 10]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111058</guid>

					<description><![CDATA[<p>Chegou! Finalmente o Linux vai estar na maioria dos Desktops. E isso importa pouco.</p>
<p>O post <a href="https://elcio.com.br/o-ano-do-linux-no-desktop-nao-como-voce-esperava/">O ano do Linux no Desktop (não como você esperava)</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>O Windows 10 vai incluir um kernel Linux completo. O ChromeOS é baseado no kernel Linux.</p>



<p>Seria 2019, finalmente, o &#8220;ano do Linux no Desktop&#8221;?</p>



<p>Eu não certeza das implicações disso. </p>



<p>Eu sei que o que você esperava era a popularização do Gnome. Ou do KDE, ou XFCE, ou Enlightenment, ou Mate&#8230; Tanto faz, certo? Não importa qual interface gráfica, se o coração for Linux.</p>



<p>Então, será que faz diferença se a interface é Windows ou ChromeOS? O resultado final é que você vai poder escrever aplicações baseadas no Linux para rodar em todo lugar. </p>



<p>E, sinceramente, a web já tinha tornado essa discussão meio irrelevante.</p>



<p>Exceto para nós, programadores, que vamos poder desenvolver usando qualquer sistema operacional. Para o resto do mundo, a maior parte do tempo, o sistema operacional é o navegador.</p>
<p>O post <a href="https://elcio.com.br/o-ano-do-linux-no-desktop-nao-como-voce-esperava/">O ano do Linux no Desktop (não como você esperava)</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/o-ano-do-linux-no-desktop-nao-como-voce-esperava/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Quanto mais óbvio, melhor</title>
		<link>https://elcio.com.br/quanto-mais-obvio-melhor/</link>
					<comments>https://elcio.com.br/quanto-mais-obvio-melhor/#comments</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Mon, 13 May 2019 10:54:25 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[código]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[Padrões]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[simplicidade]]></category>
		<category><![CDATA[Usabilidade]]></category>
		<category><![CDATA[web2py]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111055</guid>

					<description><![CDATA[<p>Padrões e convenções de código são uma excelente ideia. Livram do esforço de pensar no que deveria ser óbvio, para que você se concentre no problema real.</p>
<p>O post <a href="https://elcio.com.br/quanto-mais-obvio-melhor/">Quanto mais óbvio, melhor</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Quando você está escrevendo código, pense sempre em quem vai ter que lê-lo no futuro. Pode ser você mesmo. Pode ser você mesmo, daqui a cinco, às duas da manhã, correndo para consertar um bug.</p>



<p>É por isso que padrões e convenções são uma ideia tão boa. </p>



<p>Quanto tempo você já passou olhando o código de alguma aplicação, tentando descobrir onde estão as coisas? No <a href="http://web2py.com/">web2py</a>, um dos meus frameworks favoritos, quando você cria uma nova aplicação, a pasta de código se parece com isso:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="280" height="469" src="https://elcio.com.br/wp-content/uploads/2019/05/pastas_nova_aplicacao_web2py.jpg" alt="" class="wp-image-111056" srcset="https://elcio.com.br/wp-content/uploads/2019/05/pastas_nova_aplicacao_web2py.jpg 280w, https://elcio.com.br/wp-content/uploads/2019/05/pastas_nova_aplicacao_web2py-239x400.jpg 239w" sizes="auto, (max-width: 280px) 100vw, 280px" /><figcaption>Aplicação nova em web2py, ainda sem nenhum código.</figcaption></figure>



<p>Web2py é um framework MVC, que, você sabe, é a sigla para model, view e controller. Para acessar o banco de dados você escreve um model. E como se chama a pasta onde estão seus models? Ok, models. E as regras de negócio devem ir num controller. E onde estão seus controllers? Na pasta controllers, claro. E as views na pasta views.</p>



<p>Zero esforço para entender, zero esforço para decorar.</p>



<p>Eu sei que é bem pouco esforço decorar que, no seu novo framework da moda, as views estão dentro de /presentation/templates/html, os controllers em /app/core/controllers e os modelos em /persistence/rdbs. Mas pouco é infinitamente mais do que zero. E, acredite, esses pequenos esforços, somados, fazem um bocado de diferença.</p>
<p>O post <a href="https://elcio.com.br/quanto-mais-obvio-melhor/">Quanto mais óbvio, melhor</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/quanto-mais-obvio-melhor/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Site não seguro &#8211; como resolver de graça com Let&#8217;s Encrypt</title>
		<link>https://elcio.com.br/site-nao-seguro-como-resolver/</link>
					<comments>https://elcio.com.br/site-nao-seguro-como-resolver/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Tue, 21 Aug 2018 14:33:19 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Dreamhost]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[Let's Encrypt]]></category>
		<category><![CDATA[segurança]]></category>
		<guid isPermaLink="false">https://elcio.com.br/?p=111032</guid>

					<description><![CDATA[<p>No começo de 2017, o Google Chrome passou a mostrar um aviso para os usuários, com o texto &#8220;não seguro&#8221; na barra de endereço quando&#8230;</p>
<p>O post <a href="https://elcio.com.br/site-nao-seguro-como-resolver/">Site não seguro &#8211; como resolver de graça com Let&#8217;s Encrypt</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>No começo de 2017, o <a href="https://productforums.google.com/forum/#!msg/chrome-pt/oDDMNjsdaio/09tFb9jOBgAJ">Google Chrome passou a mostrar um aviso</a> para os usuários, com o texto &#8220;não seguro&#8221; na barra de endereço quando um site sem HTTPS pede dados do usuário. Classificou a maioria dos sites como &#8220;site não seguro&#8221;. Assim:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="773" height="186" src="https://elcio.com.br/wp-content/uploads/2018/08/não-seguro.png" alt="Aviso de site não seguro do Chrome" class="wp-image-111036" srcset="https://elcio.com.br/wp-content/uploads/2018/08/não-seguro.png 773w, https://elcio.com.br/wp-content/uploads/2018/08/não-seguro-500x120.png 500w" sizes="auto, (max-width: 773px) 100vw, 773px" /></figure>



<p>Essa mensagem aparecia apenas em situações onde o site potencialmente ia coletar dados dos usuários. Basicamente, quando havia um formulário na tela. Principalmente formulários de login, mas a mensagem aparecia para praticamente qualquer formulário. Logo, durante todo o ano passado, você poderia manter um site de conteúdo sem HTTPS, sem problema nenhum, desde que não tivesse formulários.</p>



<p>Recentemente, porém, o Google passou a avisar site não seguro para qualquer site sem HTTPS. Assim, até o <a href="http://www.pudim.com.br/">Pudim</a>, um site que não tem formulário, nem scripts, nem nada, só uma foto de um pudim, está marcado, veja:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="817" height="479" src="https://elcio.com.br/wp-content/uploads/2018/08/Pudim-site-não-seguro.jpg" alt="Site Pudim marcado pelo Chrome como site não seguro" class="wp-image-111038" srcset="https://elcio.com.br/wp-content/uploads/2018/08/Pudim-site-não-seguro.jpg 817w, https://elcio.com.br/wp-content/uploads/2018/08/Pudim-site-não-seguro-500x293.jpg 500w" sizes="auto, (max-width: 817px) 100vw, 817px" /><figcaption>Até o Pudim agora é um site não seguro, pobre Pudim <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f641.png" alt="🙁" class="wp-smiley" style="height: 1em; max-height: 1em;" /></figcaption></figure>



<h3 class="wp-block-heading">Tenho um site não seguro. Como resolver? Let&#8217;s Encrypt!</h3>



<p>Essa iniciativa do Google Chrome não está sozinha. Faz parte de um esforço de várias frentes para tornar a web mais segura. O próprio Google anunciou que está <a href="https://www.agenciamestre.com/seo/https-e-resultados-no-google/">privilegiando nas buscas sites com HTTPS</a>. Quer dizer que, ao estar marcado como site não seguro, seu site não apenas vai assustar os usuários que receber, também vai receber menos usuários.</p>



<p>O próprio Google Chrome, junto com empresas como GitHub, Facebook, Cisco e Akamai, patrocinam uma iniciativa chamada <a href="https://letsencrypt.org/isrg/">Internet Security Research Group</a>, que oferece, através do <a href="https://letsencrypt.org/">Let&#8217;s Encrypt</a>, chaves SSL grátis e automáticas para qualquer site.</p>



<p>Assim, se o seu provedor dá suporte a Let&#8217;s Encrypt, você provavelmente pode ter seu site marcado como seguro em poucos cliques. Meu hosting predileto, por exemplo, é a <a href="https://www.dreamhost.com/r.cgi?156918%20">Dreamhost</a>. Se você hospeda seu site lá, pode ativar SSL em seu site em três cliques, aqui:</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="950" height="678" src="https://elcio.com.br/wp-content/uploads/2018/08/dreamhost_letsencrypt.jpg" alt="Página Secure Hosting no painel da Dreamhost" class="wp-image-111044" srcset="https://elcio.com.br/wp-content/uploads/2018/08/dreamhost_letsencrypt.jpg 950w, https://elcio.com.br/wp-content/uploads/2018/08/dreamhost_letsencrypt-500x357.jpg 500w" sizes="auto, (max-width: 950px) 100vw, 950px" /><figcaption>Viu ali? Let&#8217;s Encrypt SSL.</figcaption></figure>



<p>Se você mantém seus próprios servidores, dedicados ou VPS, você vai ter que instalar o Let&#8217;s Encrypt você mesmo. O processo é bastante simples. Expliquei nesse vídeo:</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube">
<iframe loading="lazy" title="Visie: OWASP Top Ten - 4.c - HTTPS com Let&#039;s Encrypt" width="500" height="281" src="https://www.youtube.com/embed/1DhNxgnKHX0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<figcaption>HTTPS com Let&#8217;s Encrypt</figcaption></figure>
<p>O post <a href="https://elcio.com.br/site-nao-seguro-como-resolver/">Site não seguro &#8211; como resolver de graça com Let&#8217;s Encrypt</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/site-nao-seguro-como-resolver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Mantenha seus servidores enxutos</title>
		<link>https://elcio.com.br/mantenha-seus-servidores-enxutos/</link>
					<comments>https://elcio.com.br/mantenha-seus-servidores-enxutos/#respond</comments>
		
		<dc:creator><![CDATA[Elcio]]></dc:creator>
		<pubDate>Fri, 26 May 2017 01:05:44 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[atualização]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[segurança]]></category>
		<guid isPermaLink="false">http://elcio.com.br/?p=111019</guid>

					<description><![CDATA[<p>Foi divulgada ontem uma vulnerabilidade no servidor de compartilhamentos Samba, usado por máquinas Linux e FreeBSD para compartilhar arquivos e recursos em redes Windows. É&#8230;</p>
<p>O post <a href="https://elcio.com.br/mantenha-seus-servidores-enxutos/">Mantenha seus servidores enxutos</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Foi divulgada ontem uma vulnerabilidade no servidor de compartilhamentos Samba, usado por máquinas Linux e FreeBSD para compartilhar arquivos e recursos em redes Windows. É uma falha grave, simples de explorar, e que afeta versões do Samba desde a 3.5.0, lançada há sete anos.</p>
<p>Então, se você usa Linux, confira se você tem o Samba instalado. Se tiver, confira a versão menor (aquele terceiro número no código da versão). Se você estiver usando uma das seguintes, você está seguro: 4.6.4, 4.5.10 ou 4.4.14.</p>
<p>Se não. Você pode fazer uma das seguintes coisas:</p>
<ol>
<li>verificar se há atualização do Samba para sua distribuição, e se a versão mais atualizada é uma dessas acima; ou</li>
<li>baixar o código fonte e compilar o Samba você mesmo, de preferência da versão 4.6.4; ou</li>
<li>desligar o serviço vulnerável, adicionando ao seu smb.conf a linha abaixo:
<pre>nt pipe support = no</pre>
<p>E em seguida reiniciando o Samba; ou</li>
<li>desinstalar o Samba</li>
</ol>
<p>A última alternativa pode parecer a mais preguiçosa, e talvez você simplesmente não possa cogitá-la. Mas eu recomendo que você se pergunte, antes de qualquer outra atitude: eu preciso mesmo desse serviço? Dessa vez foi uma falha no Samba, mas praticamente todo dia saem atualizações de segurança para os diversos softwares e serviços que você pode instalar em seu sistema. Cada software não utilizado que você mantém instalado aumenta suas chances de ter problemas de segurança e suas preocupações com atualizações de versão.</p>
<p>Nesse caso, menos é mais. Reduza os pacotes que você tem instalados aos essenciais, removendo tudo o que você não usa. Principalmente em servidores. Isso vai tornar suas máquinas mais seguras e vai tornar mais fácil para você manter tudo atualizado.</p>
<p>Assine a companhe os boletins de segurança dos softwares que você usa. Você não quer correr o risco de não ficar sabendo de uma atualização crítica e ter seu sistema vulnerável simplesmente por não ter sido avisado, não é?</p>
<p>Por fim, é importante que você saiba que a essa falha de segurança no Samba é especialmente preocupante porque muitos dispositivos NAS e outras soluções de armazenamento de dados usam Samba. Então se você possui um equipamento de armazenamento de dados, é bom investigar se ele usa Samba e está vulnerável a essa falha.</p>
<hr />
<p>PS: obrigado ao <a href="https://www.youtube.com/user/cmygraf/featured">Rodrigo</a> por me avisar.</p>
<p>O post <a href="https://elcio.com.br/mantenha-seus-servidores-enxutos/">Mantenha seus servidores enxutos</a> apareceu primeiro em <a href="https://elcio.com.br">Elcio Ferreira</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://elcio.com.br/mantenha-seus-servidores-enxutos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: elcio.com.br @ 2026-03-07 21:52:17 by W3 Total Cache
-->