<?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>shell &#8211; Rafael Bernard Araujo</title>
	<atom:link href="https://rafael.bernard-araujo.com/tag/shell/feed" rel="self" type="application/rss+xml" />
	<link>https://rafael.bernard-araujo.com</link>
	<description>desenvolvendo... while(!success){  try(); }</description>
	<lastBuildDate>Wed, 06 Nov 2024 21:23:17 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
<site xmlns="com-wordpress:feed-additions:1">21941730</site>	<item>
		<title>Tropeçando 75</title>
		<link>https://rafael.bernard-araujo.com/tropecando-75.php</link>
					<comments>https://rafael.bernard-araujo.com/tropecando-75.php#respond</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 06 Feb 2017 19:13:47 +0000</pubDate>
				<category><![CDATA[Tropeçando]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Banco de dados]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[infraestrutura]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Node.JS]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PostGreSQL]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">https://rafael.bernard-araujo.com/?p=1219</guid>

					<description><![CDATA[Promise Anti-patterns Promises are very simple once you get your head around them, but there are a few gotchas that can leave you with your head scratching. Here are a few that got me. PG Phriday: Why Postgres Generic HTTP Error Handling in AngularJS Lately during development at one of our clients, Ravello Systems, we [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="https://web.archive.org/web/20180216170651/http://taoofcode.net/promise-anti-patterns" target="_blank" rel="noopener">Promise Anti-patterns</a></p>
<blockquote><p>Promises are very simple once you get your head around them, but there are a few gotchas that can leave you with your head scratching. Here are a few that got me.</p></blockquote>
<p><a href="http://bonesmoses.org/2017/01/13/pg-phriday-why-postgres/" target="_blank" rel="noopener">PG Phriday: Why Postgres</a></p>
<p><a href="http://www.codelord.net/2014/06/25/generic-error-handling-in-angularjs/" target="_blank" rel="noopener">Generic HTTP Error Handling in AngularJS</a></p>
<blockquote><p>Lately during development at one of our clients, Ravello Systems, we decided we wanted better HTTP error handling.</p>
<p>Basically, our perfect solution would have generic handlers for errors, and most calls in the code will not have to do any special work for handling errors. This means that things like authentication problems, server unavailability issues, etc. will be handled in one place — like adding a generic “something went wrong” modal.</p></blockquote>
<p><a href="https://web.archive.org/web/20210920204600/https://www.phpclasses.org/blog/post/514-php-mysql-postgresql-performance-evaluating-and-tuning.html" target="_blank" rel="noopener">The Fastest Method to Evaluate Tune the Performance of Any PHP Web Application Server using MySQL or PostgreSQL</a></p>
<blockquote><p>In the Web development world, we often have the problem of choosing the right server to use in the production environment of a Web application.</p>
<p>Maybe we need to buy a new server to handle the expected load, or maybe the customer wants to deploy in an existing server.</p>
<p>In any case, if after deploying and running the application it will show poor performance, then we need to ask the team what we can do to make the application faster or use a better server.</p>
<p>Therefore we need to determine if the application is performing well. Read this article to learn how to quickly determine the performance of an application on the current server.</p></blockquote>
<p><a href="http://momjian.us/main/blogs/pgblog/2016.html#September_21_2016">Postgres 9.6 Features</a></p>
<blockquote><p>
PostgreSQL is now on version 16. Check the <a href="https://www.postgresql.org/docs/16/release-16-4.html">release notes</a>
</p></blockquote>
<p><a href="https://www.toptal.com/software/definitive-guide-to-datetime-manipulation" target="_blank" rel="noopener">The Definitive Guide to DateTime Manipulation</a></p>
<blockquote><p>As a software developer, you can’t run away from date manipulation. Almost every app a developer builds will have some component where date/time needs to be obtained from the user, stored in a database, and displayed back to the user.</p></blockquote>
<p><a href="https://darksideclouds.wordpress.com/2016/10/10/collect-exec-sh-my-personal-os-report/" target="_blank" rel="noopener">collect-exec.sh – My personal OS report</a></p>
<blockquote><p>The script collects a lot of information about the running system and save the output of each commands in a text file, and saves copies of important files in a directory named files. At the end of the script everything is compressed with tar in the global directory.</p></blockquote>
<p><a href="https://www.citusdata.com/blog/2016/10/12/count-performance/" target="_blank" rel="noopener">Faster PostgreSQL Counting</a></p>
<blockquote><p>Everybody counts, but not always quickly. This article is a close look into how PostgreSQL optimizes counting. If you know the tricks there are ways to count rows orders of magnitude faster than you do already.</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/tropecando-75.php/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1219</post-id>	</item>
		<item>
		<title>Linux sux</title>
		<link>https://rafael.bernard-araujo.com/linux-sux.php</link>
					<comments>https://rafael.bernard-araujo.com/linux-sux.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Fri, 28 Oct 2011 17:58:25 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[x]]></category>
		<guid isPermaLink="false">http://rafael.bernard-araujo.com/?p=879</guid>

					<description><![CDATA[Na maioria das vezes, as pessoas usam su na linha de comando para se concederem privilégios de administrador de maneira que possam editar um arquivo de configuração importante. Mas também é possível encontrarmos usando su quando se está trabalhando no console e é preciso usar uma aplicação gráfica. Quando você tenta executar uma aplicação gráfica [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Na maioria das vezes, as pessoas usam <code>su</code> na linha de comando para se concederem privilégios de administrador de maneira que possam editar um arquivo de configuração importante. Mas também é possível encontrarmos usando <code>su</code> quando se está trabalhando no console e é preciso usar uma aplicação gráfica. Quando você tenta executar uma aplicação gráfica enquanto está autenticado com um usuário diferente, você recebe o seguinte erro:</p>
<pre>Xlib: connection to ":0.0" refused by server.</pre>
<p>O problema é que as chaves usadas para autenticação em sessões X não são válidas quando se usa um usuário diferente. Esta medida de segurança parece zelosa demais, mas é uma herança do sistema de um tempo em que as sessões X foram desenhadas para ser executadas através da rede. Há duas respostas para este problema.</p>
<p>A primeira é ter certeza de que a nova conta pode ser autenticada no servidor X. Isso utiliza o comando <code>xhost</code> para autenticação de novos usuários na janela da sessão X local. Apenas digite xhost +local:local com o usuário normal antes de trocar para o novo usuário e você verá 'non-network local connections being added to access control list' como saída. Agora é possível que você rode qualquer aplicação gráfica na mesma tela em que trocou de usuário. Se você quer ter este recurso a cada vez que você executa sua sessão X, simplesmente adicione o comando <code>xhost</code> ao seu arquivo .bashrc: ele será executado automaticamente a cada vez que você abre um terminal Bash.</p>
<p>A segunda solução é ainda mais fácil. É a substituição do comando <code>su</code> que transfere suas credenciais X para uma nova sessão automaticamente. O comando é <code>sux</code>, que você precisará instalar manualmente pelo gerenciador de pacotes da sua distribuição. Uma vez instalado, digite <code>sux novousuario</code> para trocar para o usuário com o qual você quer usar a visão X. Você perceberá que pode executar aplicações gráficas pela nova sessão sem nenhuma configuração adicional.</p>
<p>Mais em <a title="Truques de linha de comando" href="../truques-de-linha-de-comando.php">Truques de linha de comando</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/linux-sux.php/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">879</post-id>	</item>
		<item>
		<title>Matando os zumbis</title>
		<link>https://rafael.bernard-araujo.com/matando-os-zumbis.php</link>
					<comments>https://rafael.bernard-araujo.com/matando-os-zumbis.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Thu, 05 May 2011 19:15:02 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">http://rafael.bernard-araujo.com/?p=753</guid>

					<description><![CDATA[Se você passa algum tempo olhando para a sua lista de processos, cedo ou tarde vai se deparar com um processo chamado 'defunto' (defunct). Antes de explicar o que é um processo defunto e como removê-lo, segue um resumo de como consultar a tabela de processos usando o comando ps. Digitar ps ux listará todos [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Se você passa algum tempo olhando para a sua lista de processos, cedo ou tarde vai se deparar com um processo chamado 'defunto' (defunct). Antes de explicar o que é um processo defunto e como removê-lo, segue um resumo de como consultar a tabela de processos usando o comando <code>ps</code>.</p>
<p>Digitar <code>ps ux</code> listará todos os processos atribuídos ao usuário atual e é possível especificar outro nome de usuário com <code>ps U username</code>. Um dos usos mais comuns para ps é de listagem de todos os processos que estão sendo executados no sistema através de <code>ps aux</code>. Quebrando o comando por partes, o <code>a</code> lista todos os processos ao invés de somente os de um único usuário, o <code>u</code> é o nível de detalhes retornados por cada processo e <code>x</code> lista os processos executados pelo daemon não executados por um terminal.</p>
<p>Um processo defunto é um processo iniciado por outro processo (o pai), mas que foi finalizado antes que o processo pai tenha sido completado. Isso pode acontecer se o processo pai ficou pendurado ou quebrado.</p>
<p>Os processos defuntos são também conhecidos por zumbis e listados com status 'Z' na saída do <code>ps</code>. Eles não são tão destrutivos quanto os mortos-vivos, já que eles não consomem quase recurso do sistema, mas em um sistema que está sempre ativo, como um servidor, eles podem se tornar distrativos. O segredo para matar um processo defunto é primeiro matar o pai, que estará listado na saída do <code>ps</code> adicionado de -l para grandes retornos. Os processos pais podem ser identificados através da coluna PPID ao invés da coluna PID, a coluna com o ID do processo. Esses são identificadores anexados a cada processo executado no seu sistema. Eles podem ser mortos usando outro comando no shell, <code>kill -9</code>, seguido do PPID. Obviamente, isto irá parar a tarefa pai, então se certifique primeiro de que a tarefa não é essencial. Uma vez que a tarefa pai tenha sido morto, o processo init do sistema deverá enviar o sinal correto aos processos defuntos, que devem terminar automaticamente.</p>
<p>Mais em <a title="Truques de linha de comando" href="http://rafael.bernard-araujo.com/truques-de-linha-de-comando.php">Truques de linha de comando</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/matando-os-zumbis.php/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">753</post-id>	</item>
		<item>
		<title>Encontre arquivos perdidos</title>
		<link>https://rafael.bernard-araujo.com/encontre-arquivos-perdidos.php</link>
					<comments>https://rafael.bernard-araujo.com/encontre-arquivos-perdidos.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Fri, 22 Jan 2010 18:14:52 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">http://rafael.bernard-araujo.com/?p=426</guid>

					<description><![CDATA[Alguma vez você salvou um arquivo, talvez um download, e então não conseguiu encontrá-lo? Talvez você o tenha salvo em um diretório diferente ou com um nome incomum. O comando find é útil aqui: find ~ -type f -mtime 0 e mostrará todos os arquivos do seu diretório home que forão modificados ou criados hoje. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Alguma vez você salvou um arquivo, talvez um <em>download</em>, e então não conseguiu encontrá-lo? Talvez você o tenha salvo em um diretório diferente ou com um nome incomum.</p>
<p>O comando <code>find</code> é útil aqui:</p>
<pre class="command">find ~ -type f -mtime 0</pre>
<p>e mostrará todos os arquivos do seu diretório <code>home</code> que forão modificados ou criados hoje. Por padrão, <code>find</code> conta dias a partir da meia-noite, então o valor <code>0</code> siginifica hoje.</p>
<p>Você deve ter usado a opção <code>-name</code> com o <code>find</code> antes, mas ele pode fazer muito mais. Estas opções podem ser combinadas, então, se o elusivo <em>download</em> foi um arquivo MP3, você pode reduzir a pesquisa com:</p>
<pre class="command">find ~ -type f -mtime 0 -iname '*.mp3'</pre>
<p>As aspas simples são necessárias para para evitar que o <em>shell </em>fique tentando expandir o coringa, e <code>-iname</code> torna a combinação insensível ao caso.</p>
<p>Permissões incorretas podem causar erros obscuros algumas vezes. Você pode, por exemplo, ter criado um arquivo no seu diretório pessoal enquanto trabalhava como <code>root</code>. Para encontrar arquivos e diretórios que não peretencem a você, use:</p>
<pre class="command">find ~ ! -user ${USER}</pre>
<p>O <em>shell </em>define a variável de ambiente <code>USER</code> para o usuário atual, e um <code>!</code> muda o resultado para o próximo teste, então este comando encontra qualquer coisa no atual diretório do usuário que não pertencem a este usuário. Você pode até usar o <code>find</code> para corrigir permissões</p>
<pre class="command">find ~ ! -user $USER -exec sudo chown ${USER}:"{}" \;</pre>
<p>A página <code>man</code> do <code>find</code> explica o uso de <code>-exec</code> e muitas outras possibilidades.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/encontre-arquivos-perdidos.php/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">426</post-id>	</item>
		<item>
		<title>Controle remoto do MPlayer</title>
		<link>https://rafael.bernard-araujo.com/controle-remoto-do-mplayer.php</link>
					<comments>https://rafael.bernard-araujo.com/controle-remoto-do-mplayer.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Mon, 18 Jan 2010 17:31:43 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[acesso remoto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mplayer]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://rafael.bernard-araujo.com/?p=407</guid>

					<description><![CDATA[Há dois tipos de pessoas neste mundo: aquelas que pensam que o MPlayer é o melhor tocador de mídia na história da existência, e aqueles que estão errados. Uma das características menos conhecidas é a possibilidades de controlá-lo pelo console, um script shell ou até mesmo através da rede. O segredo para este truque está [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Há dois tipos de pessoas neste mundo: aquelas que pensam que o MPlayer é o melhor tocador de mídia na história da existência, e aqueles que estão errados. Uma das características menos conhecidas é a possibilidades de controlá-lo pelo console, um <em>script shell </em>ou até mesmo através da rede. O segredo para este truque está na opção <code>-slave</code> do MPlayer, que diz ao programa para aceitar comandos do stdin stream ao invés das teclas de teclado. Combinar isso com a opção <code>-input</code> e comandos serão lidos de um arquivo ou um FIFO. por exemplo, teste isto num terminal:</p>
<pre class="bash" style=""><span style="color: rgb(194, 12, 185); font-weight: bold;">mkfifo</span> ~<span style="color: rgb(0, 0, 0); font-weight: bold;">/</span>mplayer-control
<span style="color: rgb(194, 12, 185); font-weight: bold;">mplayer</span> <span style="color: rgb(102, 0, 51);">-slave</span> <span style="color: rgb(102, 0, 51);">-input</span> <span style="color: rgb(0, 120, 0);">file</span>=<span style="color: rgb(0, 0, 0); font-weight: bold;">/</span>home<span style="color: rgb(0, 0, 0); font-weight: bold;">/</span>user<span style="color: rgb(0, 0, 0); font-weight: bold;">/</span>mplayer-control
filetoplay</pre>
<p>Então, em outro terminal ou de um <em>script</em>, entre:</p>
<pre class="bash" style=""><span style="color: rgb(122, 8, 116); font-weight: bold;">echo</span> <span style="color: rgb(255, 0, 0);">"pause"</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">&gt;</span>~<span style="color: rgb(0, 0, 0); font-weight: bold;">/</span>mplayer-control</pre>
<p>Este comando irá interromper a execução corrente do MPlayer, e ao soltar o comando novamente irá recomeçar a gravação. Note que você tem que dar o caminho completo do arquivo de controle para o MPlayer, com <code>/home/user</code> e daí em diante, porque <code>~/mplayer-control</code> apenas não irá funcionar. Há vários outros comandos que você pode enviar para o MPlayer - de fato, qualquer operação de teclado no programa dispara um comando que você pode usar no seu <em>script </em>de controle. Você pode até operar o MPlayer de outro computador através da rede usando SSH ou Netcat. Veja este exemplo:</p>
<pre class="bash" style=""><span style="color: rgb(194, 12, 185); font-weight: bold;">ssh</span> user<span style="color: rgb(0, 0, 0); font-weight: bold;">@</span>host <span style="color: rgb(255, 0, 0);">"echo pause &gt;mplayer-control"</span></pre>
<p>Aqui, nós nos autenticamos numa máquina remota (servidor) com o nome de usuário e executamos um comando para enviar a interrupção para o arquivo de controle do MPlayer da máquina remota. É claro, isto pode ser feito muito mais rápido se você tem a chave de autenticação de SSH habilitada para que você não precisa entrar com a senha a cada vez.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/controle-remoto-do-mplayer.php/feed</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">407</post-id>	</item>
		<item>
		<title>Faça suas próprias Bash wormholes</title>
		<link>https://rafael.bernard-araujo.com/faca-suas-proprias-bash-wormholes.php</link>
					<comments>https://rafael.bernard-araujo.com/faca-suas-proprias-bash-wormholes.php#comments</comments>
		
		<dc:creator><![CDATA[rafael]]></dc:creator>
		<pubDate>Thu, 14 Jan 2010 17:25:41 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">http://rafael.bernard-araujo.com/?p=380</guid>

					<description><![CDATA[Até mesmo para o Bash aficionado, o comando mkfifo é provavelmente um dos menos usados em sua coleção. Ele cria um sinal para compartilhamento de dados, conectando dois serviços em execução com um tipo de wormhole de linha de comando. Os dados enviadas no final de uma aparecerá instantaneamente na outra. Antes de olharmos como [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Até mesmo para o <em>Bash</em> aficionado, o comando <code>mkfifo</code> é provavelmente um dos menos usados em sua coleção. Ele cria um sinal para compartilhamento de dados, conectando dois serviços em execução com um tipo de wormhole de linha de comando. Os dados enviadas no final de uma aparecerá instantaneamente na outra.</p>
<p>Antes de olharmos como usá-lo, é válido lembrar como nós tipicamente vemos <strong>canalização</strong> (ou <em>pipes</em>). Se você está acostumado a usar o <em>shell</em> para qualquer coisa diferente de assustar seus amigos com <code>cat /dev/random</code>, você estará acostumado com a idéia de canalização. Na maioria das vezes é usado para redirecionar a saída de um programa para a entrada de outro. Um uso comum é quando texto demais na saída de um comando para ler. Canalizando a saída em outro - normalmente também menor ou maior - permite que você interrompa e pagine através da saída em seu próprio tempo:</p>
<pre class="command">cat /var/log/messages | less</pre>
<p>Nesta intância, a canalização é temporariamente criada para a execução de um único comando, mas usando mkinfo é possível criar canalizações persistentes que você pode usar em tarefas similares.</p>
<p>A parte 'fifo' do comando referencia à natureza da canalização - os dados que é o primeiro a entrar é o primeiro a sair. Criar a própria canalização é uma tão simples quando digitar mkfifo, seguido do nome pelo qual você quer chamá-lo. É igualmente possível definir as permissões para a canalização (usando o parâmetro <code>--mode</code>) para restringir o acesso. Uma vez criada a canalização você precisa apenas direcionar os dados por ela. Aqui está um pequeno exemplo. Primeiro criamos a canalização e usamos <code>tail -f</code> para processar a saída de qualquer dado que é enviado para ela:</p>
<pre class="command">mkfifo fifo_pipe
tail -f fifo_pipe</pre>
<p>O próximo passo, normalmente por outro terminal ou conta de usuário (caso a permissão tenha sido definida), é enviar dados para a canalização. Digitando <code>echo "Um teste" >> fifo_pipe</code> irá enviar a mensagem de teste, que terá a saída processada pelo comando <code>tail</code> que anexamos à canalização.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://rafael.bernard-araujo.com/faca-suas-proprias-bash-wormholes.php/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">380</post-id>	</item>
	</channel>
</rss>
