<?php ml version="1.0" encoding="UTF-8"?><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">
<channel>
	<title>O Desenvolvedor</title>
	<link>http://odesenvolvedor.andafter.org/</link>
	<pubDate>Mon, 26 Sep 2016 14:27:41 -0300</pubDate>
	<description></description>
	<generator>GS Solutions</generator>
	<language>pt-br</language>
	<copyright>Copyright GS Solutions - Tecnologia da Informação. Todos os direitos reservados.</copyright>
	<webMaster>contato@gssolutions.com.br</webMaster>
	<creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />

		<item>
			<title>Eliminando PHP short tags com regex</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/eliminando-php-short-tags-com-regex.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/eliminando-php-short-tags-com-regex.html#comments</comments>
			<pubDate>Mon, 26 Sep 2016 14:27:41 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>regex, php</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/eliminando-php-short-tags-com-regex.html</guid>
			<description><![CDATA[Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas - e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam "comendo" caracter dependendo do caso).A expressão...]]></description>
			<content:encoded><![CDATA[<p>Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas - e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam "comendo" caracter dependendo do caso).</p><p>A expressão regular (regex):</p><pre>&lt;\?([^p|=])</pre><p>O replace:</p><pre>&lt;?php $1</pre><p><br></p><p>Explicando a REGEX:</p><p>Ela irá buscar por qualquer <b style="font-style: italic;">&lt;? </b>que não seja seguido imediatemente por um "p", garantindo que &lt;?php não case com a regex, ou seguido por um "=" - garantindo que <i style="font-weight: bold;">&lt;?= </i>não case com a regex.</p><p>Os parêntesis da REGEX criam um grupo de captura que é utilizado no replace, isto serve para casos específicos como</p><pre>&lt;?if(</pre><p>O i seria "engolido" neste caso. O grupo de captura também captura quebras de linha, isso garante que:</p><pre>&lt;?<br>if($x = $y)</pre><p>Se transforme em:</p><p></p><pre>&lt;?php<br>if($x = $y)</pre>E não em:<p></p><p></p><pre>&lt;?php if($x = $y)</pre>Mantendo a mesma legibilidade e formatação do código original após o replace.<p></p><p><br></p><p>Não encontrei nenhuma situação em que esta regex causou problema, se ela não funcionar em algum caso comente aí.</p><p><br></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Controlando GPIO do RaspberryPI com NodeJS</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/controlando-gpio-do-raspberrypi-com-nodejs.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/controlando-gpio-do-raspberrypi-com-nodejs.html#comments</comments>
			<pubDate>Wed, 14 Jan 2015 12:32:50 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>maker, eletronica, raspberry-pi, arduino</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/controlando-gpio-do-raspberrypi-com-nodejs.html</guid>
			<description><![CDATA[Esta semana eu comecei a me aventurar com o Arduino e depois de me sentir um pouco mais seguro na parte eletrônica resolvi entender como controlar os "pinos", ou formalmente conhecidos como General Purpose Input/Output (GPIO) do Raspberry Pi.Consegui fazer testes para controlar GPIO do Raspberry PI pelo terminal unix, mas...]]></description>
			<content:encoded><![CDATA[<p>Esta semana eu comecei a me aventurar com o <b>Arduino</b> e depois de me sentir um pouco mais seguro na parte eletrônica resolvi entender como controlar os "pinos", ou formalmente conhecidos como <em>General Purpose Input/Output</em> (<em>GPIO</em>) do <b>Raspberry Pi</b>.</p><p>Consegui fazer testes para <b>controlar GPIO do Raspberry PI pelo terminal unix</b>, mas resolvi colocar em teste a <b>Atwood's Law</b>:</p><blockquote><p><i>"any application that can be written in JavaScript, will eventually be written in JavaScript. "</i></p><p>qualquer aplicação que pode ser escrita em JavaScript, eventualmente será escrita em JavaScript.</p></blockquote><h2>Controlando GPIO do RaspberryPI com Node.JS</h2><p><br></p><h3>1) Instale NodeJS + NPM no RPi<br></h3><p>A instalação do nodejs e do npm pode variar de acordo com o SO que você está usando no RPi - aqui eu estava usando o SO do <a href="http://www.kano.me">Kano</a> e consegui instalar sem problemas - mas não via (apt-get).<br></p><p></p><pre>wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb</pre><p></p><p>Para verificar se você tem nodejs instalado - ou se a instalação aconteceu com sucesso, utilize os comando abaixo para verificar a versão instalada:<br></p><pre>node -v</pre><p>Repita o proesso para o npm</p><pre>npm -v</pre><p>Se eles não estão instalados o primeiro passo é <b>instalar o NodeJS e NPM no seu raspberry</b>.</p><p style="text-align: center;"><a href="https://eucompraria.com.br/produto/camiseta-node-js"><img alt="Camiseta Node.JS" style="float: none; margin: 0px; width: 402.537px; height: 537px;" src="https://eucompraria.com.br/media/img/produtos/camiseta-node-js/camiseta-node-js.jpg"></a></p><p style="text-align: center;">Jabá: <a href="eucompraria.com.br/produto/camiseta-node-js"></a><a href="https://eucompraria.com.br/produto/camiseta-node-js">camiseta NodeJS do Eu Compraria</a><br><a href="https://eucompraria.com.br/produto/camiseta-node-js"></a></p><p><br></p><p><br></p><h3>2) Instale o rpi-gpio<br></h3><p>Com o node e npm instalados você precisa instalar o <b><a href="https://www.npmjs.com/package/rpi-gpio">rpi-gpio</a></b> utilizando o npm.</p><pre>npm install rpi-gpio</pre><p><br></p><h3>3) Conecte um led ao seu RPi</h3><p>Defina o GPIO que você urá utilizar, veja a <a href="http://www.raspberrypi.org/documentation/usage/gpio/">documentação do GPIO dos RPi</a><b> do RPi</b> - a imagem abaixo é desta documentação.<br></p><p><img style="" src="http://www.raspberrypi.org/documentation/usage/gpio/images/basic-gpio-layout.png"><br></p><p>No meu caso usei o 13 (que é o <b>GPIO27</b>) e o pino 14 para o terra. Não esqueca de usar um resistor de acordo com o led que você vai utilizar.</p><p>Eu utilizei uma protoboard para facilitar a instalação.<br></p><p><br></p><h3>4) Crie uma aplicação em Node.JS<br></h3><p>Crie uma aplicação de teste e carregue o rpi-gpio.</p><pre>var gpio = require('rpi-gpio');</pre><p>O setup (<a href="https://www.npmjs.com/package/rpi-gpio">veja a documentação do rpi-gpio</a>) faz o "export" da GPIO e configura se será entrada ou saída.</p><p>O último parâmetro é o callback para quando a porta estiver pronta.<br></p><p></p><pre>gpio.setup(13, gpio.DIR_OUT, write);</pre><p></p><p>No callback, estou escrevendo o valor "true" para o pino 13 (ou GPIO27) - que vai acenter o <b>led </b>conectado lá.<br></p><p></p><pre>function write() {
  gpio.write(13, true, function(err) {
    if (err) throw err;
    console.log('Written to pin');
  });
}</pre><br><p></p><p>Agora você já pode fazer um server web interagir com o Arduino, com leds, com a sua casa.<br></p><p><br></p><p>Veja também:<br></p><p>Instalação do NodeJS no RPi -&nbsp;<a href="http://weworkweplay.com/play/raspberry-pi-nodejs/">we work we play</a> (en)<a href="http://weworkweplay.com/play/raspberry-pi-nodejs/"><br></a></p><p><a href="http://www.raspberrypi.org/documentation/usage/gpio/">Documentação do GPIO do Raspberry Pi</a>&nbsp;(en)<a href="http://www.raspberrypi.org/documentation/usage/gpio/"></a><a href="http://weworkweplay.com/play/raspberry-pi-nodejs/"><br></a></p><p><a href="https://ni-c.github.io/heimcontrol.js/">Heim control - Automação residencial com Node.JS</a> (en)<br></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Instalar Node.js em Ubuntu 14.04</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/instalar-nodejs-em-ubuntu-1404.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/instalar-nodejs-em-ubuntu-1404.html#comments</comments>
			<pubDate>Tue, 07 Oct 2014 08:23:16 -0300</pubDate>
			<dc:creator>Chris Benseler</dc:creator>
			<dc:subject></dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/instalar-nodejs-em-ubuntu-1404.html</guid>
			<description><![CDATA[Precisei configurar um servidor novo no EC2 da Amazon, escolhi um Ubuntu 14.04. Tudo as mil maravilhas (como sempre) até a hora de instalar o Node.js. O executável do Node.js no Ubuntu, quando instalado pelo repositório, é nodejs (e não node). Então alguns scripts começaram a dar problemas. Muitos problemas.Uma solução...]]></description>
			<content:encoded><![CDATA[<img src="https://andafter.org/media/images/posts/thumbs/770x300/nodejs-logo_770x300.png"><br><br><p>Precisei configurar um servidor novo no <b>EC2</b> da Amazon, escolhi um Ubuntu 14.04. Tudo as mil maravilhas (como sempre) até a hora de instalar o <b>Node.js</b>. O executável do <b>Node.js</b> no Ubuntu, quando instalado pelo repositório, é nodejs (e não node). Então alguns scripts começaram a dar problemas. Muitos problemas.</p><p>Uma solução que encontrei - e não conhecia, é usar o <b>nvm</b> (<i>Node.js version manager</i>).</p><p>Instalação simples e fácil. Primeiros, algumas dependências:</p><p></p><p><i>sudo apt-get update</i></p><p><span style="line-height: 1.45em; background-color: initial;"><i>sudo apt-get install build-essential libssl-dev</i></span></p>Pull no projeto do <b>nvm</b>:<p></p><p><i>curl <a href="https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh">https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh</a> | sh</i><br></p><p>Obs.: mude 0.16.1 pela versão desejada.</p><p>Recarregue o bash:</p><p><i>source ~/.profile</i><br></p><p>Pronto. Com o comando "nvm ls-remote" você verá as versões disponíveis. Então, dê um</p><p><i>nvm install 0.11.13</i><br></p><p>e a versão 0.11.13 estará instalada. Você pode instalar várias e alternar entre elas, usando:</p><p><span style="line-height: 1.45em; background-color: initial;"><i>nvm use 0.11.13</i></span></p><p><span style="line-height: 1.45em; background-color: initial;">Para quem já usou o <b>rvm</b>, é a mesma coisa.</span></p><p><span style="line-height: 1.45em; background-color: initial;">Referência:&nbsp;https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server</span></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Como bloquear user-agent pelo .htaccess<br></title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html#comments</comments>
			<pubDate>Fri, 29 Aug 2014 07:28:47 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>server, apache, server, bot</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html</guid>
			<description><![CDATA[Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do Wordpress e ontem um amigo notificou que o Eu Compraria estava fora do ar por falha do banco de dados - demorei um pouco para identificar isto pois o servidor e o...]]></description>
			<content:encoded><![CDATA[<p>Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do <b>Wordpress</b> e ontem um amigo notificou que o <b><a href="https://eucompraria.com.br">Eu Compraria</a></b> estava fora do ar por falha do banco de dados - demorei um pouco para identificar isto pois o servidor e o banco continuavam "de pé", mas analizando o processamento do servidor vi que constantemente o MySQL estava estourando o processamento.</p><p>Achei estranho e fui verificar os logs do servidor e encontrei a causa do problema: um bot fazendo requisições constantes para o <b><a href="https://andafter.org">And After</a></b>, para páginas de busca e tags (onde meu sistema de cache, confesso, não é muito eficiente).</p><p>O primeiro passo foi <b>bloquear o bot pelo IP via .htaccess </b>para sanar o problema.</p><h2>Como bloquear um IP via .htaccess</h2><p>Sem mistérios, nas regras de .htacces adicionei o seguinte:</p><pre>Order Deny,Allow
Deny from 54.197.86.53</pre><p>Problema resolvido temporariamente.</p><p>Mas claro que durou pouco, pois o bot tinha um tange de IP para trabalhar. Ao invés de ir bloquando IP por IP - ou bloquear o range de IPs, como este bot se identificava via user-agent, achei que seria uma solução mais elegante e duradoura.</p><h2>Como bloquar user-agent via htaccess</h2><p>O primeiro passo é identificar o user-agent que você quer bloquear, para isso basta ver os logs do apache.</p><pre>tail -f /path_dos_logs_do_dominio/access.log</pre><p>No meu caso o bot se identificava como <b>BDBBot</b>. Depois de identificar quem queremos bloquear vamos criar as regras no htacess, explicadas abaixo.<br></p><p>Na primeira linha vamos determinar uma "<i>env</i>" chamada <i>bad_bot</i> se o user-agent casar com <i>BDCBot</i> (usando o <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html">modsetenvif do Apache</a><b></b>). Você pode repetir esta linha para todos os user-agents que deseja bloquear.</p><p>Com esta identificação de user-agent e com o env configurado quando "casar", você só precisa escrever a regra para negar os acessos sempre que o env for <i>bad_bot</i>.</p><p>Para o meu caso adicionei o seguinte ao <b>htaccess</b>:<br></p><pre>BrowserMatchNoCase BDCBot bad_bot
Order Deny,Allow
Deny from env=bad_bot</pre><p>Agora sim, problema com este bot resolvido de uma forma um pouco menos temporária.<br></p><p><br></p><p>Ainda neste tópico li sobte uma abordagem curiosa e, ao meu ver, perigosa que é fazer o inverso: ao invés de bloquear os spammers, <a href="http://www.webmasterworld.com/forum92/5799.htm">bloquear tudo e permitir apenas os bots / crawlers conhecidos</a>. <br></p><p>Eu não arrisco, mas se você se interessar pode conferir o <a href="http://www.webmasterworld.com/forum92/5799.htm">tópico sobre o assunto</a>.<br></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Como bloquear user-agent pelo .htaccess<br></title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html#comments</comments>
			<pubDate>Fri, 29 Aug 2014 07:28:47 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>server, apache, server, bot</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/como-bloquear-user-agent-pelo-htaccess.html</guid>
			<description><![CDATA[Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do Wordpress e ontem um amigo notificou que o Eu Compraria estava fora do ar por falha do banco de dados - demorei um pouco para identificar isto pois o servidor e o...]]></description>
			<content:encoded><![CDATA[<p>Na semana passada o site de um cliente foi atacado por spammers devido a uma falha de segurança do <b>Wordpress</b> e ontem um amigo notificou que o <b><a href="https://eucompraria.com.br">Eu Compraria</a></b> estava fora do ar por falha do banco de dados - demorei um pouco para identificar isto pois o servidor e o banco continuavam "de pé", mas analizando o processamento do servidor vi que constantemente o MySQL estava estourando o processamento.</p><p>Achei estranho e fui verificar os logs do servidor e encontrei a causa do problema: um bot fazendo requisições constantes para o <b><a href="https://andafter.org">And After</a></b>, para páginas de busca e tags (onde meu sistema de cache, confesso, não é muito eficiente).</p><p>O primeiro passo foi <b>bloquear o bot pelo IP via .htaccess </b>para sanar o problema.</p><h2>Como bloquear um IP via .htaccess</h2><p>Sem mistérios, nas regras de .htacces adicionei o seguinte:</p><pre>Order Deny,Allow
Deny from 54.197.86.53</pre><p>Problema resolvido temporariamente.</p><p>Mas claro que durou pouco, pois o bot tinha um tange de IP para trabalhar. Ao invés de ir bloquando IP por IP - ou bloquear o range de IPs, como este bot se identificava via user-agent, achei que seria uma solução mais elegante e duradoura.</p><h2>Como bloquar user-agent via htaccess</h2><p>O primeiro passo é identificar o user-agent que você quer bloquear, para isso basta ver os logs do apache.</p><pre>tail -f /path_dos_logs_do_dominio/access.log</pre><p>No meu caso o bot se identificava como <b>BDBBot</b>. Depois de identificar quem queremos bloquear vamos criar as regras no htacess, explicadas abaixo.<br></p><p>Na primeira linha vamos determinar uma "<i>env</i>" chamada <i>bad_bot</i> se o user-agent casar com <i>BDCBot</i> (usando o <a href="http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html">modsetenvif do Apache</a><b></b>). Você pode repetir esta linha para todos os user-agents que deseja bloquear.</p><p>Com esta identificação de user-agent e com o env configurado quando "casar", você só precisa escrever a regra para negar os acessos sempre que o env for <i>bad_bot</i>.</p><p>Para o meu caso adicionei o seguinte ao <b>htaccess</b>:<br></p><pre>BrowserMatchNoCase BDCBot bad_bot
Order Deny,Allow
Deny from env=bad_bot</pre><p>Agora sim, problema com este bot resolvido de uma forma um pouco menos temporária.<br></p><p><br></p><p>Ainda neste tópico li sobte uma abordagem curiosa e, ao meu ver, perigosa que é fazer o inverso: ao invés de bloquear os spammers, <a href="http://www.webmasterworld.com/forum92/5799.htm">bloquear tudo e permitir apenas os bots / crawlers conhecidos</a>. <br></p><p>Eu não arrisco, mas se você se interessar pode conferir o <a href="http://www.webmasterworld.com/forum92/5799.htm">tópico sobre o assunto</a>.<br></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Como migrar um repositório git sem perder o histórico?<br></title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/como-migrar-um-repositorio-git-sem-perder-o-historico.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/como-migrar-um-repositorio-git-sem-perder-o-historico.html#comments</comments>
			<pubDate>Wed, 04 Jun 2014 11:12:46 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>git, desenvolvimento</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/como-migrar-um-repositorio-git-sem-perder-o-historico.html</guid>
			<description><![CDATA[Faz alguns anos que comecei a trabalhar com git e na época escolhi o Unfuddle como serviço para meus repositórios privados e de clientes. Atualmente estou usando o Bitbucket para repositórios privados e o Github para projetos open-source, mas ainda tem alguns repositórios "legados" no antigo serviço.Ontem retomei um projeto de...]]></description>
			<content:encoded><![CDATA[<p>Faz alguns anos que comecei a trabalhar com git e na época escolhi o <a href="http://unfuddle.com/">Unfuddle</a> como serviço para meus repositórios privados e de clientes. Atualmente estou usando o <a href="https://bitbucket.org/">Bitbucket</a> para repositórios privados e o <a href="https://github.com/gserrano">Github</a> para projetos open-source, mas ainda tem alguns repositórios "legados" no antigo serviço.</p><p>Ontem retomei um projeto de uns dois anos atrás que estava no unfuddle e resolvi migrar para o bitbucket, mas como fazer esta migração mantendo todo o histórico de commit e branches do repositório?</p><h2>Como migrar um repositório git sem perder seu histórico?</h2><p>O primeiro passo é fazer o clone do repositório original, para pegar todas as informações necessárias:<br></p><pre>git clone url-do-repositorio.git</pre><p>Agora você tem todos os arquivos e históricos do repositório no seu repositório git local. Vamos remover o repositório remoto (no meu caso, o unfuddle). Neste exemplo o nome do repositório remoto é "origin", substitua se necessário.<br></p><pre>git remote rm origin</pre><p>Agora vamos adicionar o novo repositório remoto (no meu caso, o do bitbucket):</p><p>git remote add origin git@bitbucket.org:gserrano/meurepositorio.git</p><p>Para finalizar, vamos dar um push de todos os dados do seu repositório local (recuperados do seu antigo repositório remoto) para o novo repositório remoto:</p><pre>git push -u origin --all
git push -u origin --tags</pre><p>Pronto, assim você não perde o histórico do seus repositórios GIT e tem liberdade para migrar de serviço se necessário.</p><p>Você também pode gostar:</p><ul><li><a href="http://odesenvolvedor.andafter.org/publicacoes/como-ignorar-arquivos-no-git.html">Dicas de como ignorar arquivos no git</a></li><li><a href="http://odesenvolvedor.andafter.org/publicacoes/git-enviando-uma-branch-local-para-o-repositorio.html">Git - enviando uma branch local para o repositório remoto</a><br></li></ul>
]]></content:encoded>
		</item>
	
		<item>
			<title>Como ignorar arquivos no Git<br></title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/como-ignorar-arquivos-no-git.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/como-ignorar-arquivos-no-git.html#comments</comments>
			<pubDate>Mon, 19 May 2014 12:09:25 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>git, desenvolvimento, programacao</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/como-ignorar-arquivos-no-git.html</guid>
			<description><![CDATA[Faz algum tempo que estamos usando o Git para fazer deploy nos projetos da GS Solutions e um dos cuidados que isso exige é manter os arquivos de configuração do servidor de produção intactos.Como ignorar arquivos no Git?.gitignore O modo mais fácil de ignorar arquivos no repositório é através do gitignore....]]></description>
			<content:encoded><![CDATA[<p>Faz algum tempo que estamos usando o <b><a href="http://odesenvolvedor.andafter.org/publicacoes/tutorial-deploy-com-git-no-ubuntu-server-aws-ec2.html">Git para fazer deploy</a></b> nos projetos da <b><a href="http://gssolutions.com.br">GS Solutions</a></b> e um dos cuidados que isso exige é manter os arquivos de configuração do servidor de produção intactos.<br></p><h2>Como ignorar arquivos no Git?</h2><h3>.gitignore <br></h3><p>O modo mais fácil de ignorar arquivos no repositório é através do gitignore. O gitignore é uma lista que ignora qualquer arquivo que ainda não foi acompanhado pelo repositório através do git add. Veja a <a href="http://git-scm.com/docs/gitignore">documentação</a> (en).<br></p><p>Quando um arquivo já foi adicionado ao sistema de tracking muitas pessoas acham que o <b>gitignore não está funcionando</b>. Na verdade você precisa remover o arquivo do índice para que repositório pare de monitorar aquele arquivo.<br></p><h4>Como fazer usar o .gitignore para um arquivo que já foi commitado? <br></h4><p>Se um arquivo já foi adicionado e commitado não adianta somente adicionar ele no seu <b>.gitignore</b>, você precisa primeiro <b>remover ele do sistema de tracking do git</b>. Para isso utilize o comando abaixo:<br></p><pre>git rm --cached config.json<br></pre><p>No exemplo abaixo o git vai remover o cache/tracking do arquivo config.json e se ele estiver no .gitignore do repositório ele não será mais indexado nos commits.</p><p><br></p><h2>Como ignorar um arquivo do repositório no git</h2><p>Para arquivos de configuração eu prefiro que eles estejam no <i>tracking</i> do git, pois eles são parte do projeto e devem estar no repositório. Mas apesar de estarem no repositório, não quero enviar para o repositório minhas alterações locais. Para isso podemos pedir para que o<b> git considere que determinados arquivos não foram alterados</b> alterando o índice do git manualmente. <br></p><p>Mantendo o exemplo do arquivo config.json vamos supor que ele não está no seu <i>gitignore</i> e você fez alterações para o ambiente de desenvolvimento e não quer correr o risco de commitar estas mudanças.</p><p>Diga para o git considerar que aquele arquivo não foi alterado com o seguinte comando:</p><pre>git update-index --assume-unchanged config.json<br></pre><p>Agora seu repositório vai considerar que este arquivo não foi alterado mesmo que você atualize ele inúmeras vezes. Se você precisa dar commit em alguma alteração no arquivo é só remover o status de "não alterado" deste arquivo no índice do repositório com a seguinte linha de código:<br></p><pre>git update-index --no-assume-unchanged config.json</pre><p><br></p><p>Para arquivos de configuração eu prefiro utilizar o <i>--assume-unchanged</i>. Deixo o <i>.gitignore</i> para arquivos de uploads do projetos, cache e demais arquivos que não fazem parte do projeto. <br></p><p>Como vocês lidam com arquivos de configuração no repositório? Deixe dicas nos comentários!<br></p>]]></content:encoded>
		</item>
	
		<item>
			<title>Palestra sobre Componetização de CSS e HTML (Front in Sampa 2013)</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/palestra-sobre-componetizacao-de-css-e-html-front-in-sampa-2013.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/palestra-sobre-componetizacao-de-css-e-html-front-in-sampa-2013.html#comments</comments>
			<pubDate>Thu, 24 Apr 2014 14:41:51 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>front-end, programacao, css, html</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/palestra-sobre-componetizacao-de-css-e-html-front-in-sampa-2013.html</guid>
			<description><![CDATA[Saiu o vídeo oficial da minha palestra no FrontInSampa 2013, sobre componetização de HTML e CSS e a polêmica sobre&nbsp;orientação a objetos com CSS.E os slides: E você usa componetização de CSS e HTML? Que ferramentas utiliza para isso?...]]></description>
			<content:encoded><![CDATA[<p><iframe width="640" height="480" src="https://www.youtube.com/embed/00NrHc7Vz4g" frameborder="0" allowfullscreen></iframe></p><p>Saiu o vídeo oficial da minha palestra no <b>FrontInSampa 2013</b>, sobre <b>componetização de HTML e CSS</b> e a polêmica sobre&nbsp;<b><a href="http://odesenvolvedor.andafter.org/publicacoes/css-orientado-a-objetos_1130.html">orientação a objetos com CSS</a>.</b></p><p>E os slides:</p><p><iframe src="https://www.slideshare.net/slideshow/embed_code/28678434" width="770" height="642" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe><br></p><p>E você usa componetização de CSS e HTML? Que ferramentas utiliza para isso?</p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Datas recursivas com PHP</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/datas-recursivas-com-php.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/datas-recursivas-com-php.html#comments</comments>
			<pubDate>Thu, 27 Mar 2014 11:03:08 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>php, datas, programacao, web</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/datas-recursivas-com-php.html</guid>
			<description><![CDATA[Em um dos projetos que estou trabalhando eu precisei trabalhar com datas recursivas a partir de uma data inicial e de uma periodicidade.&nbsp;Datas no PHPNão vou abordar a fundo como trabalhar com datas no PHP, apenas como adicionar determinado número de dias em uma data. Se você não tem ideia de...]]></description>
			<content:encoded><![CDATA[<p>Em um dos projetos que estou trabalhando eu precisei trabalhar com <b>datas recursivas</b> a partir de uma data inicial e de uma periodicidade.&nbsp;</p><h2>Datas no PHP</h2><p>Não vou abordar a fundo como trabalhar com datas no PHP, apenas como adicionar determinado número de dias em uma data. Se você não tem ideia de como trabalhar com datas no PHP, recomendo começar pelo <a href="http://www.php.net/manual/pt_BR/function.date.php">manual do PHP date()</a> date().&nbsp;</p><p>Mas o conceito de recursividade é simples e vou explicar abaixo o funcionamento de cada passo para gerar datas repetidas com PHP.</p><h3>Formatando a data de hoje</h3><p>Primeiro, o básico de formatação de datas com PHP. Estou trabalhando com MySQL (date), portanto trabalho com a seguinte formatação.</p><pre>date('Y-m-d');</pre><p>O código acima vai retornar a data de hoje no formato ano-mes-dia.</p><h3>Adicionar dias em uma data</h3><p>Para dar início a recursividade a lógica é: tenho uma data e preciso saber qual será a data daqui X dias, e assim sucessivamente.&nbsp;<span style="line-height: 1.45em;">Para adicionar dias a uma data usamos a função <b>strtotime</b>&nbsp;(veja o <a href="http://us2.php.net/manual/pt_BR/function.strtotime.php"><b>manual</b></a>) do PHP junto com date.&nbsp;</span></p><p><span style="line-height: 1.45em;">No exemplo abaixo o resultado deve ser a data formatada para exatamente daqui a 7 dias.</span></p><pre>date('Y-m-d', strtotime(date('Y-m-d') . '+7 days'));</pre><p><br></p><h2>Recursividade de datas</h2><p>Com estes 2 conceitos básicos sobre datas no PHP e um pouco de criatividade você consegue gerar <b>datas recursivas no PHP</b>.&nbsp;</p><p>No exemplo abaixo, vou pegar as próximas 10 datas a partir de hoje, com uma periodicidade de 15 dias e colocar no array $myDates;</p><pre>$lastDate = date('Y-m-d');
$myDates = array();

for ($x=0; $x&lt;=10; $x++){
  $myDates[] = $lastDate;
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days'));
}</pre><p><br></p><h2><b>Recursividade de datas por período</b></h2><p>Indo um pouco mais longe, você pode fazer seleções de datas dentro de janela de tempo usando quase a mesma lógica - mas deve tomar cuidado para não gerar <b><a href="http://loopinfinito.com.br/">loop infinito</a></b> no seu código.</p><p>No exemplo abaixo, quero retornar todas as datas a partir de hoje, contando de 15 em 15 dias, até a data limite de 4 de Dezembro.</p><pre>$lastDate = date('Y-m-d');
$endDate = '2014-12-04';
$myDates = array();
$finished = false;
while(!$finished){
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days')); 
  if(strtotime($lastDate) &gt; strtotime($endDate)){ $finished = true; break; } 
  $myDates[] = $lastDate;
}

</pre><p>Usando a mesma verificação do $endDate você pode configurar uma data inicial e uma final, selecionando apenas as datas dentro deste período.</p><br><p>Talvez existe algum método mais eficiente de fazer isso. Quando pesquisei sobre o assunto encontrei a biblioteca <a href="https://github.com/tplaner/When" style="font-weight: bold;">When</a>, mas ela não era exatamente o que eu queria.&nbsp;</p><p><span style="line-height: 1.45em;">Se você precisa saber quando serão as próximas Quarta-Feiras que irão cair em um dia 2 de Fevereiro, é a biblioteca para você, vale conferir.&nbsp;Se você optar pela When tome cuidado com os loops infinitos que ela pode gerar.</span></p>
]]></content:encoded>
		</item>
	
		<item>
			<title>Como verificar o número de variáveis passadas em um shellscript?</title>
			<link>http://odesenvolvedor.andafter.org/publicacoes/como-verificar-o-numero-de-variaveis-passadas-em-um-shellscript.html</link>
			<comments>http://odesenvolvedor.andafter.org/publicacoes/como-verificar-o-numero-de-variaveis-passadas-em-um-shellscript.html#comments</comments>
			<pubDate>Sun, 09 Mar 2014 12:52:07 -0300</pubDate>
			<dc:creator>Guilherme Serrano</dc:creator>
			<dc:subject>shellscript, linux, unix, automatizacao</dc:subject>
			<guid isPermaLink="false">http://odesenvolvedor.andafter.org/publicacoes/como-verificar-o-numero-de-variaveis-passadas-em-um-shellscript.html</guid>
			<description><![CDATA[O que mais me traz satisfação como desenvolvedor é gerar automatização de tarefas. Desenvolver ferramentas e rotinas que possibilitem que minha equipe ou meus clientes trabalhem menos para alcançar determinado objetivo.Desde gerar backups até configurar um ambiente de desenvolvimento ou produção. Hoje fui implementar umas alterações no shellscript para criar um...]]></description>
			<content:encoded><![CDATA[<p>O que mais me traz satisfação como desenvolvedor é gerar <b>automatização</b> de tarefas. Desenvolver ferramentas e rotinas que possibilitem que <b><a href="http://gssolutions.com.br">minha equipe</a></b> ou meus clientes trabalhem menos para alcançar determinado objetivo.</p><p>Desde gerar <a href="http://odesenvolvedor.andafter.org/publicacoes/backup-do-mysql-com-shellscript.html">backups</a> até <a href="http://odesenvolvedor.andafter.org/publicacoes/shellscript-para-configurar-dominio-no-apache.html">configurar um ambiente</a> de desenvolvimento ou produção. Hoje fui implementar umas alterações no <b><a href="http://odesenvolvedor.andafter.org/publicacoes/shellscript-para-configurar-dominio-no-apache.html">shellscript para criar um site no apache</a></b> e criar as pastas no meu ambiente local, mas para isso precisava verificar o número de variáveis passadas pelo usuário antes de continuar a execução do script.&nbsp;</p><p><span style="color: rgb(0, 0, 0); font-size: 30px; font-weight: bold; line-height: 38px;">Como verificar o número de variáveis passadas no shellscript?</span><br></p><p>Para ter o número de variáveis que um shelscript recebeu é bem simples:</p><pre>$#</pre><p>Sabendo disso basta você fazer uma comparação para validar se o número de variáveis é o que você esperava. No exemplo abaixo o script finaliza a execução se o usuário não passar pelo menos 2 variáveis:</p><pre>if [ $# -lt 2 ]; then
echo 'Necessário 2 variáveis'
exit 0
fi</pre><p>Uma dica do Bruno para tornar o código mais legível é fazer a comparação da seguinte forma, e também usar exit 1 para quando der erro, fica assim:</p><p></p><pre>if [[ $# &lt; 2 ]] then
echo 'Necessário 2 variáveis'
exit 1
fi</pre>Usar o exit 1 quando algo der errado no seu script impede que outros scripts sejam executados na sequência se o seu deu errado, por exemplo:<p></p><pre>seu_script.sh &amp;&amp; seu_segundo_script.sh</pre><p>Se algum erro acontecer no seu_script o seu_segundo_script não será executado.</p><p>Agora consigo validar a execução de qualquer shellscript e evitar erros. Se voc6e tem uma maneira diferente de fazer esta verificação deixe nos comentários!</p>
]]></content:encoded>
		</item>
	</channel>
</rss>