<?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>Abstraindo.com</title>
	<atom:link href="http://www.abstraindo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.abstraindo.com</link>
	<description>Seu Blog sobre Tecnologia!</description>
	<lastBuildDate>Tue, 24 Apr 2012 20:45:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Google Drive. Guarde tudo. Compartilhe o que quiser.</title>
		<link>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/</link>
		<comments>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 20:43:25 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[alternativa dropbox]]></category>
		<category><![CDATA[alternativa skydrive]]></category>
		<category><![CDATA[compartilhar arquivos]]></category>
		<category><![CDATA[google drive]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=722</guid>
		<description><![CDATA[Aí está um serviço para competir com o Dropbox e com o SkyDrive (que nem merece link =P). E ele está para chegar! Falta pouco! Visite agora o Google Drive! E peça sua notificação!]]></description>
			<content:encoded><![CDATA[<p>Aí está um serviço para competir com o <a title="DropBox" href="http://www.dropbox.com" target="_blank">Dropbox</a> e com o SkyDrive (que nem merece link =P).</p>
<p>E ele está para chegar! Falta pouco! Visite agora o <a title="Google Drive" href="http://drive.google.com" target="_blank">Google Drive</a>! E peça sua notificação!</p>
<p><center><img class="aligncenter size-medium wp-image-724" title="Google Drive waiting approval" src="http://www.abstraindo.com/wp-content/uploads/2012/04/Screen-Shot-2012-04-24-at-17.41.17-300x245.png" alt="" width="300" height="245" /></center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/google/google-drive-guarde-tudo-compartilhe-o-que-quiser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Alterando o PS1 do Command Prompt/Bash</title>
		<link>http://www.abstraindo.com/ambiente-de-desenvolvimento/alterando-o-ps1-do-command-promptbash/</link>
		<comments>http://www.abstraindo.com/ambiente-de-desenvolvimento/alterando-o-ps1-do-command-promptbash/#comments</comments>
		<pubDate>Mon, 16 Apr 2012 13:16:19 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[Ambiente de desenvolvimento]]></category>
		<category><![CDATA[branch atual no ps1]]></category>
		<category><![CDATA[command line ps1]]></category>
		<category><![CDATA[rvm no ps1]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=705</guid>
		<description><![CDATA[Olá Pessoal, hoje ensinarei vocês a alterarem seu bash para exibir o rvm, branch, user atual, como na imagem a seguir: Para fazer isto, abra seu Terminal, você pode alterar algum desses arquivos: ~/.bash_profile ~/.bashrc ~/.profile Comigo funcionou no bash_profile. Então dê um vim ~/.bash_profile e adicione o seguinte trecho ao final do arquivo: # [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal, hoje ensinarei vocês a alterarem seu bash para exibir o rvm, branch, user atual, como na imagem a seguir:</p>
<p style="text-align: center;"><a href="http://www.abstraindo.com/wp-content/uploads/2012/04/Screen-Shot-2012-04-12-at-10.23.52.png" rel="lightbox[705]"><img class="aligncenter size-medium wp-image-707" title="PS1 Command Prompt" src="http://www.abstraindo.com/wp-content/uploads/2012/04/Screen-Shot-2012-04-12-at-10.23.52-300x95.png" alt="" width="300" height="95" /></a></p>
<p style="text-align: left;">Para fazer isto, abra seu Terminal, você pode alterar algum desses arquivos:</p>
<ul>
<li>~/.bash_profile</li>
<li>~/.bashrc</li>
<li>~/.profile</li>
</ul>
<p>Comigo funcionou no bash_profile.</p>
<p>Então dê um vim ~/.bash_profile e adicione o seguinte trecho ao final do arquivo:</p>
<pre class="brush: text; gutter: true"># show the branch, rvm, user in bash
export PS1=&quot;\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;36m\]$(~/.rvm/bin/rvm-prompt) \[\033[01;34m\]\w\[\033[00m\]$(git branch &amp;&gt;/dev/null; if [ $? -eq 0 ]; then echo &quot;\[\033[01;33m\]($(git branch | grep ^*|sed s/\*\ //))\[\033[00m\]&quot;; fi)$&quot;</pre>
<p>Pronto! Dê um source ~/.bash_profile para recarregar as configurações e feito!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/ambiente-de-desenvolvimento/alterando-o-ps1-do-command-promptbash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Screencasts do AkitaOnRails.com liberados</title>
		<link>http://www.abstraindo.com/programacao-2/screencasts-do-akitaonrails-com-liberados/</link>
		<comments>http://www.abstraindo.com/programacao-2/screencasts-do-akitaonrails-com-liberados/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 03:43:25 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[screencasts]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=698</guid>
		<description><![CDATA[Olá Pessoal, faz tempo que não postamos nada no Abstraindo. Mas precisamos compensar de vez em quando O Akita liberou os screencasts que antes eram pagos no blip.tv, para ver o post dele, acesse akitaonrails.com. Os screencasts incluem: Palestra: Entenda Software da Forma Correta Screencast: Instalando um Ambiente Ruby Screencast: Começando com o Vim Screencast: [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Pessoal, faz tempo que não postamos nada no Abstraindo. Mas precisamos compensar de vez em quando <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>O <a title="@akitaonrails" href="http://www.twitter.com/akitaonrails" target="_blank">Akita</a> liberou os screencasts que antes eram pagos no blip.tv, para ver o post dele, acesse <a title="Screencasts liberados gratuitamente" href="http://www.akitaonrails.com/2012/04/09/screencasts-liberados-gratuitamente" target="_blank">akitaonrails.com</a>.</p>
<p>Os screencasts incluem:</p>
<ul>
<li>Palestra: Entenda Software da Forma Correta</li>
<li>Screencast: Instalando um Ambiente Ruby</li>
<li>Screencast: Começando com o Vim</li>
<li>Screencast: Começando com o Git</li>
</ul>
<p><span id="more-698"></span></p>
<p>Eu já vi o Entenda Software da Forma Correta e agora estou vendo o Começando com o Git, ambos estão bem legais e é ótimo para quem está começando.</p>
<p>Para quem quiser ver a página com todos, segue <a title="BlipTV @akitaonrails" href="http://blip.tv/akitaonrails" target="_blank">link do perfil dele no blip.tv</a></p>
<p>Quem quiser ver um trecho do de Git aqui no Abstraindo.com:</p>
<p><center><br />
<iframe src="http://blip.tv/play/AYLy5TgC.html?p=1" frameborder="0" width="320" height="240"></iframe><object style="display: none;" width="320" height="240" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://a.blip.tv/api.swf#AYLy5TgC" /><embed style="display: none;" width="320" height="240" type="application/x-shockwave-flash" src="http://a.blip.tv/api.swf#AYLy5TgC" /></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/programacao-2/screencasts-do-akitaonrails-com-liberados/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando a Storage API do HTML5</title>
		<link>http://www.abstraindo.com/programacao-2/utilizando-a-storage-api-do-html5/</link>
		<comments>http://www.abstraindo.com/programacao-2/utilizando-a-storage-api-do-html5/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 17:30:16 +0000</pubDate>
		<dc:creator>Hussani</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[storage]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=651</guid>
		<description><![CDATA[E aí galerinha, como estão? Hoje eu vou mostrar como utilizar as interfaces SessionStorage e LocalStorage do HTML5. Estas duas interfaces fazem parte da especificação Web Storage da W3C. Esta API tem a finalidade de acabar com os famosos Cookies, salvando uma grande quantidade de informação no cliente e resgatando a informação salva de uma [...]]]></description>
			<content:encoded><![CDATA[<p>E aí galerinha, como estão?</p>
<p>Hoje eu vou mostrar como utilizar as interfaces SessionStorage e LocalStorage do HTML5.</p>
<p>Estas duas interfaces fazem parte da especificação <a href="http://dev.w3.org/html5/webstorage/" target="_blank">Web Storage da W3C</a>.</p>
<p>Esta API tem a finalidade de acabar com os famosos <a href="http://en.wikipedia.org/wiki/HTTP_cookie" target="_blank">Cookies</a>, salvando uma grande quantidade de informação no cliente e resgatando a informação salva de uma forma simples e segura.</p>
<p>Então vamos pensar em que funcionalidades a Storage API tem vantagem sobre os cookies. Vou listar algumas vantagens bem relevantes da Storage API:</p>
<ul>
<li>Storage API pode salvar até 5MB de espaço no disco do usuário, enquanto os Cookies armazenam míseros 4kb;</li>
<li>Os dados não são trafegados a cada requisição do servidor, como acontece nos Cookies;</li>
<li>Funciona como um <a href="http://en.wikipedia.org/wiki/Associative_array" target="_blank">Array Associativo</a> (key, value);</li>
<li>Diferente dos Cookies, não possui data de expiração (falarei sobre isso abaixo)</li>
</ul>
<p><span id="more-651"></span></p>
<p>A SessionStorage e a LocalStorage possuem os seguintes métodos:</p>
<ul>
<li>key(<em>n</em>) para retornar o nome da chave que está nesta posição da Storage</li>
<li>getItem(<em>key</em>) para retornar o valor associado a uma chave</li>
<li>setItem(<em>key,value</em>) para associar um determinado valor a uma chave, ou criar a chave e associar um valor a ela</li>
<li>removeItem(<em>key</em>) para remover determinada chave e o valor associado a ela</li>
<li>clear() para limpar o Storage</li>
</ul>
<p>As duas interfaces além destes métodos possuem o atributo length, que mostra o número de chaves na interface.</p>
<p>Agora vocês devem estar pensando &#8220;As duas interfaces tem o mesmos atributos e métodos. Por que diabos existes as duas?&#8221;.</p>
<p>A diferença entre as duas interfaces está em quando os dados são expirados.</p>
<p>Na SessionStorage os dados salvos expiram quando o usuário fecha o navegador. Na LocalStorage os dados salvos simplesmente não expiram. Sim, os dados não tem data de expiração. Só são apagados quando o desenvolvedor ou o usuário os apagam.</p>
<p>Uma coisa importante é que se você deve ficar atento com o domínio que está sendo utilizado na sua aplicação. Uma Storage funciona apenas para o domínio corrente, diferente dos cookies. Então se eu salvar uma LocalStorage em http://hussani.com.br, o site http://www.abstraindo.com não terá acesso aos dados. O mesmo acontece quando você salva dados sem o &#8220;www.&#8221; e tenta acessar os dados em um endereço do mesmo domínio com o &#8220;www.&#8221; (exemplo: os dados salvos em http://www.abstraindo.com não podem ser acessados por http://abstraindo.com). Isso garante que os dados não fiquem abertos para que qualquer site vasculhe nas informações contidas nas Storages.</p>
<p>Então galera, cuidado com os endereços da sua aplicação.</p>
<p>A Storage API está disponível para IE8+, Firefox 5+, Chrome 4+, Safari 4+, Opera 10.5+, e também está disponível em todas as versões de Android Browser e iOS Safari. Então vamos codar!</p>
<p>Vamos colocar a mão na massa com uma pequena demonstração. Vocês podem ver a demostração <a title="Demonstrando a Storage API" href="http://abstraindo.com/tutoriais/html5-storage/" target="_blank">aqui</a>.</p>
<p>Nesta demonstração é apresentado um exemplo simples de como usar a interface LocalStorage. Poderíamos utilizar SessionStorage também, o resultado seria o mesmo.</p>
<p>Só irei colocar as partes importantes do código e se vocês quiserem o código da demonstração completa podem baixar <a title="Download tutorial HTML5 Storage" href="http://abstraindo.com/tutoriais/html5-storage/html5-storage.zip" target="_blank">aqui</a>.</p>
<p>Esta é a estrutura principal da página</p>
<pre class="brush: html; gutter: true">    &lt;div class=&quot;wrapper&quot;&gt;
        &lt;section id=&quot;com-storage&quot; class=&quot;box-list&quot;&gt;
            &lt;h3&gt;Com Local Storage&lt;/h3&gt;
            &lt;ul id=&quot;stored-list&quot; contenteditable=&quot;true&quot;&gt;
                &lt;li&gt;&lt;/li&gt;
            &lt;/ul&gt;
            &lt;button id=&quot;clear&quot;&gt;Limpar&lt;/button&gt;
        &lt;/section&gt;

        &lt;section id=&quot;sem-storage&quot; class=&quot;box-list&quot;&gt;
            &lt;h3&gt;Sem Local Storage&lt;/h3&gt;
            &lt;ul id=&quot;not-stored-list&quot; contenteditable=&quot;true&quot;&gt;
                &lt;li&gt; &lt;/li&gt;
            &lt;/ul&gt;
        &lt;/section&gt;
    &lt;/div&gt;</pre>
<p>Neste bloco criamos duas seções com listas editáveis. Em um usaremos a LocalStorage para salvar os dados e na outra não usaremos nenhum Storage.</p>
<p>Agora vamos montar o Storage. Utilizei o <a title="jQuery" href="http://www.jquery.com" target="_blank">jQuery</a> para auxiliar na manipulação de JavaScript, nada difícil, e a biblioteca <a title="Modernizr" href="http://www.modernizr.com/" target="_blank">Modernizr</a> para verificar se o browser tem suporte a API de Storage. Para verificar se há suporte fiz desta forma:</p>
<pre class="brush: javascript; gutter: true">$(function(){
  if(Modernizr.localstorage){
    /* codigo aqui */
  }else{
/* callback se o browser não suportar a localstorage */
}
});</pre>
<p>Simples, não é?<br />
Vamos agora salvar os dados da lista quando o usuário editá-la</p>
<pre class="brush: javascript; gutter: true">$(&quot;#stored-list&quot;).keypress(function(){
  localStorage.setItem(&#039;minha-lista&#039;, $(&quot;#stored-list&quot;).html());
});</pre>
<p>O que eu fiz acima: quando algo for alterado na lista com o id &#8220;stored-list&#8221; eu salvo o conteúdo html da lista em um localstorage com a chave &#8220;minha-lista&#8221;.</p>
<p>Pronto já salvamos conteúdo em um LocalStorage. \o/</p>
<p>Agora vamos recuperar o valor da chave &#8220;minha-lista&#8221; sempre que página for recarregada.</p>
<pre class="brush: javascript; gutter: true">if(localStorage.getItem(&#039;minha-lista&#039;)){
  $(&#039;#stored-list&#039;).html(localStorage.getItem(&#039;minha-lista&#039;));
}</pre>
<p>Note que antes de retornar o valor, nós verificamos se existe algo relacionado a chave. Se houver algum valor ele é escrito dentro da lista.</p>
<p>Pronto! Agora nós conseguimos salvar os conteúdos e conseguimos resgatar eles. Mas e se eu quiser apagar a lista e fazer uma nova?</p>
<pre class="brush: javascript; gutter: true">$(&#039;#clear&#039;).click(function(){
  localStorage.clear();
  $(&#039;#stored-list&#039;).html(&#039;&lt;li&gt; &lt;/li&gt;&#039;);
});</pre>
<p>Muito simples também! Quando eu clicar no botão com id &#8220;clear&#8221; eu aciono o método <em>clear</em> que apaga todos os dados do LocalStorage.</p>
<p>Como só utilizamos uma chave para armazenar a lista, podemos apagar ela de uma outra forma:</p>
<pre class="brush: javascript; gutter: true">$(&#039;#clear&#039;).click(function(){
  localStorage.removeItem(&#039;minha-lista&#039;);
  $(&#039;#stored-list&#039;).html(&#039;&lt;li&gt; &lt;/li&gt;&#039;);
});</pre>
<p>Isso apaga apenas a chave &#8220;minha-lista&#8221; e seu conteúdo.</p>
<p>Bem galera, acho que é isso. Espero que vocês tenham gostado.</p>
<p>Qualquer dúvida, crítica ou aflição deixe um comentário.</p>
<p>Até a próxima pessoal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/programacao-2/utilizando-a-storage-api-do-html5/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Criando snippets no TextMate</title>
		<link>http://www.abstraindo.com/softwares/criando-snippets-no-textmate/</link>
		<comments>http://www.abstraindo.com/softwares/criando-snippets-no-textmate/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 13:27:50 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Apps]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[produtividade]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Softwares]]></category>
		<category><![CDATA[TextMate]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[atalhos]]></category>
		<category><![CDATA[mac os]]></category>
		<category><![CDATA[snippets]]></category>
		<category><![CDATA[teclado]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=632</guid>
		<description><![CDATA[Fala abstratos! Como vocês estão?! Sentiram minha falta? É claro que não né, estavam muito bem acompanhados com o Hussani, Diego Felix e Weverton não é mesmo? Bom, hoje vamos brincar com uma coisinha que pode agilizar monstruosamente nosso desenvolvimento, os famosos snippets! Puxa Brunno que bacanudo! Estou empolgado!! Mas o que são snippets?? Bom, [...]]]></description>
			<content:encoded><![CDATA[<p>Fala abstratos! Como vocês estão?! Sentiram minha falta? É claro que não né, estavam muito bem acompanhados com o <a title="Trabalhando com remotes no git" href="http://www.abstraindo.com/tutoriais/trabalhando-com-remotes-no-git/" target="_blank">Hussani</a>, <a title="Contador de caracteres restantes com jQuery" href="http://www.abstraindo.com/web-developer/contador-de-caracteres-restantes-com-jquery/" target="_blank">Diego Felix</a> e <a title="Trocando de branch no git" href="http://www.abstraindo.com/ambiente-de-desenvolvimento/trocando-de-branch-no-git/" target="_blank">Weverton</a> não é mesmo?</p>
<p>Bom, hoje vamos brincar com uma coisinha que pode agilizar monstruosamente nosso desenvolvimento, os famosos <a title="Snippets na Wikipédia" href="http://en.wikipedia.org/wiki/Snippet_%28programming%29" target="_blank">snippets</a>!</p>
<p><span id="more-632"></span>Puxa Brunno que bacanudo! Estou empolgado!! Mas o que são snippets??</p>
<p>Bom, snippets são &#8220;atalhos&#8221; para pequenos trechos de código navegáveis, é como se fosse uma biblioteca de cmd+c (ou crtl+c), onde você guarda os pedacinhos de códigos que você vai usar com frequência.</p>
<p>Vamos aprender a fazer os nossos snippets no <a title="TextMate" href="http://macromates.com/" target="_blank">TexMate</a>, abra o app e no menu siga esse caminho: Bundles &gt; Bundle Editor &gt; Show Bundle Editor.</p>
<p>Você vai se depara com uma janela como essa:</p>
<p style="text-align: center;"><a style="display: block; text-align: center;" href="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.38.51.png" rel="lightbox[632]"><img class="aligncenter size-medium wp-image-633" title="Bundle editor" src="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.38.51-300x212.png" alt="Editor de bundles do TextMate" width="300" height="212" /></a>Vamos clicar no<strong> + </strong> lá embaixo e escolher <strong>new snippet</strong> para começarmos a nossa brincadeira!</p>
<p style="text-align: center;"><a style="display: block; text-align: center;" href="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.49.07.png" rel="lightbox[632]"><img class="aligncenter size-medium wp-image-634" title="Novo snippet" src="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.49.07-300x201.png" alt="" width="300" height="201" /></a>Vamos ter agora uma janelinha de edição de snippets com as instruções na tela, uma coisa linda! hehehehe</p>
<p style="text-align: center;"><a style="display: block; text-align: center;" href="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.50.15.png" rel="lightbox[632]"><img class="aligncenter size-medium wp-image-635" title="Novo Snippet" src="http://www.abstraindo.com/wp-content/uploads/2011/12/Screen-Shot-2011-12-06-at-10.50.15-300x212.png" alt="Janela de novo snippet do TextMate" width="300" height="212" /></a>Como podemos ver, o TextMate criou um conjunto de bundle com nosso nome e um item sem título que será o nome do nosso snippet, escolha um nome qualquer e vamos para os boxes ao lado.</p>
<p>O primeiro campo é onde vamos editar nosso snippet, mas vamos deixá-lo por último, pois a parte inferior é mais rápida de explicar hehehe</p>
<p>Primeiro temos Activation, que é a forma como vamos lançar o snippet, o bacana é mesmo é o Tab Trigger, e ao lado temos um campo que é qual será esse trigger, aqui vamos escolher a palavra que vai disparar nosso snippet, para o exemplo vamos inserir <strong>array_push</strong>.</p>
<p>Em scope selector vamos escolher qual será o escopo que nossa trigger vai funcionar, escolha source.php.</p>
<p>Agora é a hora da verdade, no campo superior limpe o conteúdo e insira isso:</p>
<pre class="brush: php; gutter: true">array_push($array, $valor);</pre>
<p>Pronto, saia do editor, abra um arquivo php qualquer e digite: array_push e em seguida a telcla TAB. Mágico né?!</p>
<p>Mas onde fica a parte do &#8220;navegável&#8221; que eu citei acima né?! hehe</p>
<p>Vamos voltar no Bundle Editor e editar nosso snippet:</p>
<pre class="brush: php; gutter: true">array_push(\$${1:array},\$${2:valor});</pre>
<p>Agora volte no arquivo php e execute o snippet novamente. Perceba que o array veio selecionado, agora você navega pela função usando o TAB e SHIFT+TAB, onde você preenche com o valor que você quiser de forma rápida.</p>
<p>Note que precisamos escapar o &#8220;$&#8221; da variavel com &#8220;\&#8221; e também que podemos definir a ordem dos TABs com o número que vem antes dos &#8220;:&#8221;.</p>
<p>Bacana né?! <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/softwares/criando-snippets-no-textmate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Trabalhando com remotes no git</title>
		<link>http://www.abstraindo.com/tutoriais/trabalhando-com-remotes-no-git/</link>
		<comments>http://www.abstraindo.com/tutoriais/trabalhando-com-remotes-no-git/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 16:34:34 +0000</pubDate>
		<dc:creator>Hussani</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[git remote]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=612</guid>
		<description><![CDATA[Olá pessoal, tudo bem? Antes de tudo, vou me apresentar. Sou o Hussani Oliveira, estou me formando em Análise e Desenvolvimento de Sistemas e trabalho a quase dois anos desenvolvendo aplicações para internet. Nesse post vou ensinar vocês a trabalhar com mais de um remote no git. Me deparei com esse problema quando tive que [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal, tudo bem?</p>
<p>Antes de tudo, vou me apresentar. <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Sou o <a title="Link para Twitter do Hussani" href="http://twitter.com/#!/hussanii" target="_blank">Hussani Oliveira</a>, estou me formando em Análise e Desenvolvimento de Sistemas e trabalho a quase dois anos desenvolvendo aplicações para internet.</p>
<p>Nesse post vou ensinar vocês a trabalhar com mais de um remote no git.</p>
<p>Me deparei com esse problema quando tive que enviar o mesmo projeto git para dois lugares diferentes e não queria criar 2 repositórios para isto.</p>
<p>É importante lembrar que o &#8216;remote&#8217; no git é a origem do seu repositório quando você o clona. O repositório que você faz fetch, push e pull.</p>
<p>Vamos a receita!</p>
<p><span id="more-612"></span></p>
<p>Primeiro vamos ver quais são os repositórios remote que vocês tem com este comando:</p>
<pre class="brush: text; gutter: true">git remote -v
</pre>
<p>Com esse comando podemos ver a lista de repositórios origem. O retorno vai ser algo assim:</p>
<pre class="brush: text; gutter: true">nome1	http://meuservidor.com:/caminhodoarquivo.git (fetch)
nome1	http://meuservidor.com:/caminhodoarquivo.git (push)
nome2	usuario@123.456.789.0:/caminhodoarquivo.git (fetch)
nome2	usuario@123.456.789.0:/caminhodoarquivo.git (push)
</pre>
<p>Se pegarmos o primeiro item da lista acima temos o nome do repositório remoto (nome1), seu caminho (http://meuservidor.com:/caminhodoarquivo.git) e o tipo de permissão ao repositório (fetch). Quando se tem permissão &#8220;push&#8221; você pode mandar atualizações (pull e push) para o repositório remoto, quando se tem permissão &#8220;fetch&#8221; você pode apenas ler o repositório remoto e atualizar o repositório local a partir dele.<br />
Agora vamos adicionar um novo repositório com o comando:</p>
<pre class="brush: text; gutter: true">git remote add &lt;nome&gt; &lt;caminho do repositório&gt;</pre>
<p>Após você adicionar o repositório e usar o comando &#8220;git remote -v&#8221; ele será listado junto com os outros remotes.</p>
<p>Agora vem a parte mais legal, dar fetch&#8217;s e push&#8217;s para o remoto.</p>
<p>Para push usamos</p>
<pre class="brush: text; gutter: true">git push &lt;nome do remote&gt;</pre>
<p>Para fetch usamos</p>
<pre class="brush: text; gutter: true">git fetch &lt;nome do remote&gt;</pre>
<p>Podemos também renomear um repositório remote com o comando</p>
<pre class="brush: text; gutter: true">git remote rename &lt;nome atual&gt; &lt;novo nome&gt;</pre>
<p>Ou remover com o comando</p>
<pre class="brush: text; gutter: true">git remote rm &lt;nome&gt;</pre>
<p>Espero que isso ajude vocês.<br />
Abraço e até a próxima! =D</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/tutoriais/trabalhando-com-remotes-no-git/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Trocando de branch no git</title>
		<link>http://www.abstraindo.com/ambiente-de-desenvolvimento/trocando-de-branch-no-git/</link>
		<comments>http://www.abstraindo.com/ambiente-de-desenvolvimento/trocando-de-branch-no-git/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 12:29:08 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[Ambiente de desenvolvimento]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[SCM]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[trocar branch no git]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=603</guid>
		<description><![CDATA[Olá pessoal! Decidi fazer esse post porque ultimamente o app do GitHub tem me dado muita dor de cabeça e decidi voltar a usar git somente via command line. Eu já havia trabalhado via command line por um tempo no XPG mas não cheguei a utilizar vários branches, era só master e mandar bala. Porém [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal! Decidi fazer esse post porque ultimamente o <a title="GitHub Mac App" href="http://mac.github.com/" target="_blank">app do GitHub</a> tem me dado muita dor de cabeça e decidi voltar a usar git somente via command line. Eu já havia trabalhado via command line por um tempo no <a title="XPG" href="http://www.xpg.com.br/" target="_blank">XPG</a> mas não cheguei a utilizar vários branches, era só master e mandar bala.</p>
<p>Porém agora no projeto do <a title="Mangá no Mori" href="http://www.manganomori.com.br" target="_blank">Mangá no Mori</a> que está no <a title="GitHub" href="http://www.github.com" target="_blank">GitHub</a> (private repo) precisamos criar um novo branch por algumas questões técnicas do framework. Mas enfim, vamos ao que interessa.</p>
<p><span id="more-603"></span></p>
<p>Primeiro, clone o repositório do nosso alvo, se seu repo estiver no GitHub, seria assim:</p>
<pre class="brush: text; gutter: true">git clone git@github.com:Nome-Repositorio.git</pre>
<p>Agora, vamos listar os branchs remotos:</p>
<pre class="brush: text; gutter: true">git branch</pre>
<p>Esse comando permite você listar todos os branches locais. Para listar todos, incluindo os remotos, utilize o <code>-a</code> ao final da linha de comando.</p>
<p>Pronto, agora já sabemos qual é o nome do nosso branch remoto.</p>
<pre class="brush: css; gutter: true">git checkout -b &lt; novo_branch &gt; origin/&lt; novo_branch &gt;</pre>
<p>Agora sim! Temos nosso clone trabalhando diretamente neste branch.</p>
<p>Esse comando troca o contexto do branch, no exemplo estamos utilizando um branch já existente no repo, um branch remoto. Vamos testar? Atualize o branch:</p>
<pre class="brush: text; gutter: true">git pull</pre>
<p>Se der tudo certo você deve ver um &#8220;Already up-to-date&#8221;. Se você utilizar o <code>git branch</code> novamente, verá que o novo_branch estará com um * (asterisco), isso significa que este é seu branch ativo nesse clone.</p>
<p><strong>Não conseguiu? Vamos lá:</strong></p>
<p>Caso você esteja recebendo este erro:</p>
<pre class="brush: text; gutter: true">fatal: git checkout: updating paths is incompatible with switching branches/forcing
Did you intend to checkout ‘origin/‘ which can not be resolved as commit?’</pre>
<p>Vamos tentar resolver, dando um <code>git pull</code> primeiro!</p>
<p>Agora é só tentar dar o <code>git checkout</code> <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>É isso aí, se tiverem alguma dúvida, é comentar que resolveremos juntos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/ambiente-de-desenvolvimento/trocando-de-branch-no-git/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Contador de caracteres restantes com jQuery</title>
		<link>http://www.abstraindo.com/web-developer/contador-de-caracteres-restantes-com-jquery/</link>
		<comments>http://www.abstraindo.com/web-developer/contador-de-caracteres-restantes-com-jquery/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 19:22:02 +0000</pubDate>
		<dc:creator>Diego Felix</dc:creator>
				<category><![CDATA[Programação]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[Web Developer]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[tutoriais]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=592</guid>
		<description><![CDATA[Olá pessoal. Antes de começar o tutorial gostaria de me apresentar já que esse é o primeiro tutorial que posto aqui. Meu nome é Diego Felix, sou formado em Análise e desenvolvimento de Sistemas e trabalho há quase 3 anos como Web Developer. Sem mais, vamos ao que interessa! Hoje ensinarei pra vocês como fazer [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal.</p>
<p>Antes de começar o tutorial gostaria de me apresentar já que esse é o primeiro tutorial que posto aqui.</p>
<p>Meu nome é <a title="@diegofelix" href="http://www.twitter.com/diegofelix" target="_blank">Diego Felix</a>, sou formado em Análise e desenvolvimento de Sistemas e trabalho há quase 3 anos como Web Developer.</p>
<p>Sem mais, vamos ao que interessa!</p>
<p>Hoje ensinarei pra vocês como fazer um contador de caracteres restantes igual ao do twitter.<br />
Para isso iremos utilizar somente xhtml e javascript, para o javascript utilizaremos a biblioteca jQuery.</p>
<p><span id="more-592"></span></p>
<p>Então mãos a obra! Vocês podem conferir o contador funcionando <a title="Contador de caracteres restantes" href="http://www.abstraindo.com/tutoriais/maxcharacters/" target="_blank">aqui</a>.</p>
<p>Estrutura básica xhtml.</p>
<pre class="brush: html; gutter: true">&lt;html&gt;
    &lt;head&gt;

        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt;

        &lt;title&gt;Max Characters&lt;/title&gt;

        &lt;!-- opcional --&gt;
        &lt;link rel=&quot;stylesheet&quot; href=&quot;style.css&quot; media=&quot;screen&quot; /&gt;
        &lt;!-- opcional --&gt;

        &lt;script type=&quot;text/javascript&quot; src=to&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;script.js&quot;&gt;&lt;/script&gt;
    &lt;/head&gt;    

    &lt;body&gt;

        &lt;h1&gt;Tutorial de máximo de caracteres&lt;/h1&gt;

        &lt;form action=&quot;&quot; method=&quot;post&quot;&gt;

            &lt;label for=&quot;content&quot;&gt;

                &lt;span&gt;
                    Conteúdo
                    &lt;span id=&quot;content-countdown&quot; title=&quot;140&quot;&gt;140&lt;/span&gt;
                &lt;/span&gt;

                &lt;textarea name=&quot;content&quot; id=&quot;content&quot; maxlength=&quot;140&quot; class=&quot;maxlength&quot;&gt;&lt;/textarea&gt;

            &lt;/label&gt;

        &lt;/form&gt;

    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Sem muitos segredos até aqui certo?</p>
<p>Alguns pontos a reparar.</p>
<ul>
<li>Temos uma span com o id #content-countdown</li>
<li>Na span #content-countdown temos uma title com o valor 140.</li>
<li>Esse valor também é o limite de caracteres do textarea.</li>
<li>Não é obrigatório colocar o maxlength no textarea, mas também não custa nada.</li>
</ul>
<p>Agora vamos começar com o jQuery.</p>
<p>As explicações para o código serão inseridas no próprio código para facilitar a leitura.</p>
<pre class="brush: javascript; gutter: true">// quando o documento estiver pronto, faça.
$(function(){

    /*
        Keyup é um evento que é disparado sempre que o usuário tirou o dedo da tecla.
        Ou seja, não queremos fazer nada quando o usuário clica, somente quando ele solta
        a tecla.
    */
    $(&quot;.maxlength&quot;).keyup(function(event){

        // abaixo algumas variáveis que iremos utilizar.

        // pega a span onde esta a quantidade máxima de caracteres.
        var target    = $(&quot;#content-countdown&quot;);

        // pego pelo atributo title a quantidade maxima permitida.
        var max        = target.attr(&#039;title&#039;);

        // tamanho da string dentro da textarea.
        var len     = $(this).val().length;

        // quantidade de caracteres restantes dentro da textarea.
        var remain    = max - len;

        // caso a quantidade dentro da textarea seja maior que
        // a quantidade maxima.
        if(len &gt; max)
        {
            // abaixo vamos pegar tudo que tiver na string e limitar
            // a quantidade de caracteres para o máximo setado.
            // isso significa que qualquer coisa que seja maior que
            // o máximo será cortado.
            var val = $(this).val();
            $(this).val(val.substr(0, max));

            // setamos o restante para 0.
            remain = 0;
        }

        // atualizamos a quantidade de caracteres restantes.
        target.html(remain);

    });

});</pre>
<p>Espero que o código acima esteja bem comentado para vocês. Resumindo o que está acontecendo, a cada vez que o usuário digita alguma coisa dentro da textarea, eu disparo um evento onde eu verifico a quantidade de caracteres máximos que ele pode digitar, verifico se o que ele digitou atingiu esse máximo, se atingiu eu limito para o máximo e atualizo a quantidade restante, caso contrário eu apenas atualizo a quantidade restante.</p>
<p>Caso vocês queiram, segue abaixo o código css que eu coloquei no exemplo.</p>
<pre class="brush: css; gutter: true">body{
	font:normal 0.8em &quot;Trebucet MS&quot;, Tahoma, Verdana, Arial, sans-serif;
}
form, textarea{
	width:300px;
}
label{
	display:table;
	width:100%;
}
label span.countdown span{
	float:right;
}</pre>
<p>Você também pode baixar todos os arquivos <a title="Download do Contador de caracteres" href="http://www.abstraindo.com/tutoriais/maxcharacters/maxcharacters.zip">clicando aqui.</a> <img src='http://www.abstraindo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Um grande abraço à todos e até a próxima.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/web-developer/contador-de-caracteres-restantes-com-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Steve Jobs</title>
		<link>http://www.abstraindo.com/apple/steve-jobs/</link>
		<comments>http://www.abstraindo.com/apple/steve-jobs/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 00:28:32 +0000</pubDate>
		<dc:creator>Brunno dos Santos</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Steve Jobs]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[rip]]></category>
		<category><![CDATA[steve jobs]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=580</guid>
		<description><![CDATA[É com grande dor que venho hoje, dia 05 de Outubro de 2011, fazer uma singela homenagem ao homem que mudou o modo como eu enxergo o meu computador, o homem que fez que eu ouvisse música em um player descente, o homem que fez com que eu amasse um celular! Steve Jobs faleceu hoje [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.abstraindo.com/apple/steve-jobs/attachment/screen-shot-2011-10-05-at-21-21-38/" rel="attachment wp-att-581"><img class="alignleft size-medium wp-image-581" title="Steve Jobs" src="http://www.abstraindo.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-05-at-21.21.38-300x201.png" alt="" width="300" height="201" /></a>É com grande dor que venho hoje, dia 05 de Outubro de 2011, fazer uma singela homenagem ao homem que mudou o modo como eu enxergo o meu computador, o homem que fez que eu ouvisse música em um player descente, o homem que fez com que eu amasse um celular!</p>
<p>Steve Jobs faleceu hoje e deixou como legado grandes invenções, inovações e a empresa mais valiosa do mundo. Esse é homem que gravou seu nome na história como poucos conseguiram, o homem que revolucionou o computador pessoal, o homem que abriu os olhos do mercado para o mundo mobile se foi hoje, deixando fãs e sua família pra trás.</p>
<p><strong>Steve, espero que você consiga a Paz, espero que daí de onde você está agora você se sinta completo. Saiba que você se foi com a missão cumprida.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/apple/steve-jobs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe compra TypeKit e como usar fontes personalizadas em seu site</title>
		<link>http://www.abstraindo.com/browsers/adobe-compra-typekit/</link>
		<comments>http://www.abstraindo.com/browsers/adobe-compra-typekit/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 22:17:32 +0000</pubDate>
		<dc:creator>Weverton do Couto Timoteo</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Navegadores]]></category>
		<category><![CDATA[Notícias]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[css3 fontes]]></category>
		<category><![CDATA[font-face]]></category>
		<category><![CDATA[fontes]]></category>
		<category><![CDATA[fontes personalizadas]]></category>
		<category><![CDATA[google web fonts]]></category>
		<category><![CDATA[type compra adobe]]></category>

		<guid isPermaLink="false">http://www.abstraindo.com/?p=574</guid>
		<description><![CDATA[Isso mesmo! A empresa Typekit anunciou sua compra realizada pela Adobe, o que será que os usuários do serviço ganharam com essa aquisição? Typekit surgiu em Setembro de 2009 fundada pela empresa Small Batch, Inc., a ideia do serviço para quem não conhece é servir fontes para aplicar em web sites. O Google tem algo [...]]]></description>
			<content:encoded><![CDATA[<p>Isso mesmo! A empresa <a title="TypeKit" href="http://typekit.com" target="_blank">Typekit</a> anunciou sua compra realizada pela Adobe, o que será que os usuários do serviço ganharam com essa aquisição?</p>
<p>Typekit surgiu em Setembro de 2009 fundada pela empresa Small Batch, Inc., a ideia do serviço para quem não conhece é servir fontes para aplicar em web sites. O Google tem <a title="Google WebFonts" href="http://www.google.com/webfonts" target="_blank">algo semelhante</a>, mas para isso, utiliza fontes abertas (Open Source Fonts), portanto seu uso é gratuito, o nome do serviço é <a title="Google WebFonts" href="http://www.google.com/webfonts" target="_blank">Google WebFonts</a>.</p>
<p><span id="more-574"></span></p>
<p>O Typekit possui <a title="Planos TypeKit" href="https://typekit.com/plans" target="_blank">diversos planos</a> que começam gratuitamente até $ 99 anual. O plano gratuito tem as seguintes características:</p>
<ul>
<li><strong>25,000</strong> Pageviews/mês</li>
<li>Acesso a uma <a title="Biblioteca Trial" href="https://typekit.com/libraries/trial" target="_blank">biblioteca Trial</a></li>
<li><strong>1</strong> Website</li>
<li><strong>2</strong> Fontes por site</li>
<li>Requere uso da badge do Typekit</li>
</ul>
<p>A equipe Abstraindo já usou várias fontes em diversos sites e seu uso é muito bacana!</p>
<p>Agora podemos esperar um grande aumento no catálogo de fontes do Typekit =)</p>
<h2>Utilizando fontes personalizas em meu site</h2>
<p>Mas você deve estar se perguntando: Eu tenho a fonte, quero utilizá-la em meu site, como eu faço isso?</p>
<p>Isso é possível tecnicamente, mas você não tem direito de distribuir a fonte para os usuários. O Typekit faz justamente isso, ele compras os direitos de distribuição e serve sua fonte para os visitantes do seu site.</p>
<p>Caso você queira distribuir mesmo assim é muito simples, mãos a massa no CSS:</p>
<pre class="brush: css; gutter: true">@font-face {
 font-family: Nome da Fonte;
 src: url(enderecodafontenoservidor);
 }</pre>
<p>Pronto! Para saber quais navegadores suportam font-face, <a title="WebFonts - Compatibilidade do @font-face" href="http://webfonts.info/wiki/index.php?title=@font-face_browser_support" target="_blank">verifique aqui</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abstraindo.com/browsers/adobe-compra-typekit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

