<?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>codexico</title>
	<atom:link href="https://codexico.com.br/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://codexico.com.br/blog</link>
	<description>Só mais um computeiro</description>
	<lastBuildDate>Sat, 03 Dec 2022 14:15:41 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<site xmlns="com-wordpress:feed-additions:1">15546639</site>	<item>
		<title>Exemplos de $.when()</title>
		<link>https://codexico.com.br/blog/2014/04/13/exemplos-de-jquery-when/</link>
					<comments>https://codexico.com.br/blog/2014/04/13/exemplos-de-jquery-when/#respond</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Mon, 14 Apr 2014 02:35:47 +0000</pubDate>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[deferreds]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=421</guid>

					<description><![CDATA[<p>Atualizaçao: Mais exemplos e completão. Caso Simples: dois ajax ao mesmo tempo 90% das vezes é isso que a gente precisa. Muito prático, por exemplo para carregar um html, os dados necessários para preenchê-lo e depois inserir na página. O que acontece é que o $.when recebe como parâmetros objetos chamados&#8220;Deferreds&#8220;, uma tradução seria &#8220;adiados&#8221;, [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2014/04/13/exemplos-de-jquery-when/">Exemplos de $.when()</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3 class="wp-block-heading">Atualizaçao: <a href="https://github.com/codexico/blog/blob/master/when/full-1-pt.md" target="_blank" rel="noopener">Mais exemplos e completão.</a></h3>



<h2 class="wp-block-heading">Caso Simples: dois ajax ao mesmo tempo</h2>



<p>90% das vezes é isso que a gente precisa.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">$.when(
  $.ajax('/value1'),
  $.ajax('/value2'))
.done(function (data1, data2) {
  console.log('os dois ajax terminaram');
  console.log('agora dá para chamar alguma função que usa as duas respostas dos ajax');
});
</pre>



<p>Muito prático, por exemplo para carregar um html, os dados necessários para preenchê-lo e depois inserir na página.</p>



<p>O que acontece é que o <a href="http://api.jquery.com/jquery.when/">$.when</a> recebe como parâmetros objetos chamados<br>&#8220;<a href="http://api.jquery.com/jQuery.Deferred/">Deferreds</a>&#8220;, uma tradução seria &#8220;adiados&#8221;, ou seja, objetos que não retornam<br>imediatamente, são adiados, em algum momento &#8220;prometem&#8221; que irão terminar.</p>



<p>Quando as promises terminam o &#8220;done&#8221; é executado.</p>



<h2 class="wp-block-heading">Outros Exemplos</h2>



<p>Grande parte dos erros que acontecem ao usar $.when() são por usar alguma função que não retorna uma promise.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function getFacebookData() {
  // criamos uma deferred para resolver somente quando termina o FB
  var dfd = new $.Deferred();
  // o FB acontece async e não retorna uma promise
  FB.api('/me', {fields: 'last_name'}, function(response) {
    console.log(response);
    // aqui avisamos ao $.when que o FB terminou
    dfd.resolve(response);
  });
  // retorna ao $.when uma promessa de que em algum momento a função vai terminar
  return dfd.promise();
}

function getTimeout() {
  // criamos uma deferred para resolver somente quando terminar o timeout
  var dfd = new $.Deferred();
  setTimeout(function() {
    // alguma coisa complexa acontecendo aqui
    // avisa ao $.when que terminou o getTimeout()
    dfd.resolve("fim");
  }, 1000);
  // retorna ao $.when uma promessa de que em algum momento a função vai terminar
  return dfd.promise();
}

// $.ajax retorna uma promise, mas não uma função com $.ajax dentro
function complexAjax(x) {
  var options = {
    url: '/url1',
    data: { param1: x }
  }
  // não é necessário criar a dfd aqui,
  // podemos retornar a própria promise do ajax
  return $.ajax(options);
}
$.when(
  getFacebookData(),
  getTimeout(),
  complexAjax('teste')
  .done(function (fbResponse, dataFromTimeout, ajaxData) {
  // as funções terminaram
});</pre>



<p>Muitas funções do jQuery retornam uma promise, $.ajax() e $.animate() por exemplo.</p>



<p><br>Quando uma função não retorna a promessa, como o FB, podemos simplesmente criar uma e retornar quando quisermos.</p>



<p>Esse foi um resumão do funcionamento das deferreds, eu estava escrevendo um tutorial mas estava ficando muito grande, acho que os exemplos acima já resolvem muitos problemas, depois eu posto o completão com detalhes de Promise, Deferreds, when, then, done, async, etc.</p>



<h3 class="wp-block-heading">Referências</h3>



<p><a href="http://api.jquery.com/jQuery.Deferred/">Deferreds &#8211; http://api.jquery.com/jQuery.Deferred/</a></p>



<p><a href="http://api.jquery.com/jquery.when/">$.when &#8211; http://api.jquery.com/jquery.when/</a></p><p>The post <a href="https://codexico.com.br/blog/2014/04/13/exemplos-de-jquery-when/">Exemplos de $.when()</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2014/04/13/exemplos-de-jquery-when/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">421</post-id>	</item>
		<item>
		<title>DIY &#8211; slideshow em jQuery</title>
		<link>https://codexico.com.br/blog/2010/12/15/diy-slideshow-em-jquery/</link>
					<comments>https://codexico.com.br/blog/2010/12/15/diy-slideshow-em-jquery/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Wed, 15 Dec 2010 23:46:53 +0000</pubDate>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[diy]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[slideshow]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=380</guid>

					<description><![CDATA[<p>Pare com a "pluginite"! Para coisas simples não precisa de plugin, faça você mesmo (diy), neste post o exemplo feito é  um slideshow em jQuery rapidinho e em poucas linhas.</p>
<p>The post <a href="https://codexico.com.br/blog/2010/12/15/diy-slideshow-em-jquery/">DIY – slideshow em jQuery</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<header>
<hgroup>
<h1>Faça você mesmo um slideshow em jQuery</h1>
</hgroup>
<nav>
<p>Demos:</p>
<ul>
<li><a href="http://codexico.com.br/projetos/slideshow/zero.html">zero</a> &#8211; somente o html</li>
<li><a href="http://codexico.com.br/projetos/slideshow/um.html">um</a> &#8211; sem animação</li>
<li><a href="http://codexico.com.br/projetos/slideshow/dois.html">dois</a> &#8211; a mesma animação para os dois lados</li>
<li><a href="http://codexico.com.br/projetos/slideshow/tres.html">três</a> &#8211; transições completas, uma para cada lado</li>
<li><a href="http://codexico.com.br/projetos/slideshow/quatro.html">quatro</a> &#8211; plugin</li>
</ul>
</nav>
</header>
<article>
      <time datetime="2010-12-15" pubdate>15 de dezembro de 2010</time></p>
<p>Neste artigo vamos descobrir que não é necessário ir atrás de plugins toda vez que precisamos fazer algo em jQuery. A biblioteca tem muitas ferramentas e quando a tarefa é simples é mais rápido fazer você mesmo (DIY) do que procurar plugins por aí.</p>
<p>Por exemplo, outro dia eu precisava que um conteúdo fosse trocado por outro quando o user clicasse em &#8220;próximo&#8221;, alguns chamam de slideshow, outros de apresentação, tem muitos plugins por aí, que fazem todo tipo de coisa com todo tipo de animação, mil tipos de piruetas psicodélicas&#8230;</p>
<p>Até encontrar um que fizesse o necessário e sem bugs e fácil de usar demoraria um pouco, e para piorar o sistema em que eu estava mexendo não permitia incluir outros arquivos javascripts e tinha pouco tempo para entregar. Muitas vezes a gente perde um tempão procurando plugins e no final nenhum dos 15 encontrados servem, esse parecia ser o caso, os plugins eram bem diferentes um do outro. Então resolvi fazer eu mesmo.</p>
<section>
<header>
<h1>
            <a href="http://codexico.com.br/projetos/slideshow/zero.html">zero</a>: html e css<br />
          </h1>
</header>
<p>Este será o html usado neste exemplo, todos os slides estão em uma lista e aparecem um abaixo do outro:</p>
<p><code lang="html"><br />
<!DOCTYPE html><br />
<html lang="pt"><br />
  <head><br />
    <meta charset="utf-8" /></p>
<style type="text/css">
    #slides{
      list-style-type: none;
    }
    .slide{
      width: 200px;
      height: 200px;
      border: 1px solid #000;
    }
    </style>
<p>  </head><br />
  <body></p>
<div id="slideshow" >
      <button id="slideanterior" class="slideshow-button" >anterior </button><br />
      <button id="slideproximo" class="slideshow-button" > próximo</button></p>
<ul id="slides">
<li class="slide">1</li>
<li class="slide">2</li>
<li class="slide">3</li>
<li class="slide">4</li>
<li class="slide">5</li>
</ul></div>
<p>    <!-- fim slideshow --><br />
  </body><br />
</html><br />
</code></p>
<p>Demo <a href="http://codexico.com.br/projetos/slideshow/zero.html">zero</a></p>
</section>
<section>
<header>
<h1>
<a href="http://codexico.com.br/projetos/slideshow/um.html">Um</a>: javascript inicial<br />
</h1>
</header>
<p>A ideia é pegar o html, esconder os slides e mostrar o primeiro.</p>
<p>Então adicionar um listener em cada botão, ao clicar o slide ativo é escondido substituído pelo próximo.</p>
<p>Mais uma linhazinha para quando chegar ao último voltar ao primeiro.</p>
<p>Em 17 linhas (descontando os comentários) já está montado um slideshow funcional:</p>
<p><code lang="javascript"><br />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script><br />
<script type="text/javascript">
  jQuery(document).ready(function($) {
    //identifica o slideshow
    $slideshow = $("#slideshow");
    //inicialmente esconde os slides
    $slideshow.find("li.slide").hide();
    //encontra o prmeiro slide e ativa-o
    $slideativo = $slideshow.find("li.slide").first().addClass('slideatual').show();
    //ao clicar mostra o proximo slide
    $('#slideproximo').click(function(){
      //esconde o slide atual
      $slideativo.hide();
      //procura o proximo
      $slideativo = $slideshow.find("li.slideatual").next();
      if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").first();//volta ao primeiro
      //remove o marcador do slide anterior
      $slideshow.find("li.slideatual").removeClass("slideatual");
      //coloca o marcador e mostra
      $slideativo.addClass("slideatual").show();
    });
    //ao clicar mostra o slide anterior
    $('#slideanterior').click(function(){
      $slideativo.hide();
      $slideativo = $slideshow.find("li.slideatual").prev();
      if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").last();//volta ao ultimo
      $slideshow.find("li.slideatual").removeClass("slideatual");
      $slideativo.addClass("slideatual").show();
    });
  });
</script><br />
</code></p>
<p>Demo <a href="http://codexico.com.br/projetos/slideshow/um.html">um</a></p>
</section>
<section>
<header>
<h1>
            <a href="http://codexico.com.br/projetos/slideshow/dois.html">Dois</a>: animação<br />
          </h1>
</header>
<p>Tá, funcionou, mas ficou sem graça, os slides trocam automaticamente sem efeito nenhum.</p>
<p>Vamos trocar o show() e hide() por um animate().</p>
</p>
<p><code lang="javascript"><br />
//ao clicar mostra o proximo slide<br />
$('#slideproximo').click(function(){<br />
  //esconde o slide atual<br />
  $slideativo.animate({<br />
    "width": "toggle", "opacity": "toggle"<br />
  }, "slow",  function() {//com callback<br />
    //<br />
    //procura o proximo<br />
    $slideativo = $slideshow.find("li.slideatual").next();<br />
    if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").first();//volta ao primeiro</p>
<p>    //remove o marcador do slide anterior<br />
    $slideshow.find("li.slideatual").removeClass("slideatual");<br />
    //coloca o marcador e mostra<br />
    $slideativo.addClass("slideatual").animate({<br />
      "width": "toggle", "opacity": "toggle"<br />
    }, "slow");<br />
  });<br />
});</p>
<p>//ao clicar mostra o slide anterior<br />
$('#slideanterior').click(function(){<br />
  $slideativo.animate({<br />
    "width": "toggle", "opacity": "toggle"<br />
  }, "slow");//sem callback</p>
<p>  $slideativo = $slideshow.find("li.slideatual").prev();<br />
  if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").last();//volta ao ultimo<br />
  $slideshow.find("li.slideatual").removeClass("slideatual");<br />
  $slideativo.addClass("slideatual").animate({<br />
    "width": "toggle", "opacity": "toggle"<br />
  }, "slow");<br />
});<br />
</code></p>
<p>Demo <a href="http://codexico.com.br/projetos/slideshow/dois.html">dois</a></p>
<p>Repare que a animação de recolher usa um callback para começar a mostrar o outro slide só depois que o primeiro já terminou de recolher.</p>
<p>Mas ainda está meio estranha, tanto a animação &#8220;anterior&#8221; quanto &#8220;próxima&#8221; estão iguais, seria melhor que fossem diferentes.</p>
</section>
<section>
<header>
<h1>
            <a href="http://codexico.com.br/projetos/slideshow/tres.html">Três</a>: um pra cada lado<br />
          </h1>
</header>
<p>Para animar dqa esquerda para a direita primeiro o elemento precisa estar à esquerda <em>$slideativo.show().css(&#8220;left&#8221;, $slideativo.outerWidth()*-1).css(&#8216;opacity&#8217;, &#8216;0&#8217;);</em>. Vários truques se escondem nessa linha:</p>
<p><em>outerWidth()</em> serve para determinar o tamanho do slide</p>
<p><em>css(&#8220;left&#8221;, $slideativo.outerWidth()*-1)</em> *-1 para colocar o slide à esquerda</p>
<p><em>show()</em>, mas só funciona se o elemento estiver com &#8220;show&#8221;</p>
<p><em>css(&#8216;opacity&#8217;, &#8216;0&#8217;)</em> está com &#8220;show&#8221; mas ainda não deve aparecer.</p>
<p><code lang="javascript"><br />
$slideativo = $slideshow.find("li.slide").first().addClass('slideatual').css("left","0").show();</p>
<p>//ao clicar mostra o proximo slide<br />
$('#slideproximo').click(function(){<br />
  //esconde o slide atual para a direita<br />
  $slideativo.animate({<br />
    "left": "+="+$slideativo.outerWidth(),  "opacity": "0"<br />
  }, "slow",  function() {//callback<br />
    //procura o proximo<br />
    $slideativo = $slideshow.find("li.slideatual").next();<br />
    if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").first();//volta ao primeiro</p>
<p>    //remove o marcador do slide anterior<br />
    $slideshow.find("li.slideatual").removeClass("slideatual");</p>
<p>    //posiciona na esquerda<br />
    $slideativo.show().css("left", $slideativo.outerWidth()*-1).css('opacity', '0');<br />
    //coloca o marcador e mostra<br />
    $slideativo.addClass("slideatual").animate({<br />
      "left": "0", "opacity": "1"<br />
    }, "slow");<br />
  });<br />
});</p>
<p>//ao clicar mostra o slide anterior<br />
$('#slideanterior').click(function(){<br />
  //esconde o slide atual para a esquerda<br />
  $slideativo.animate({<br />
    "left": "-="+$slideativo.outerWidth(), "opacity": "0"<br />
  }, "slow");<br />
  //procura o proximo<br />
  $slideativo = $slideshow.find("li.slideatual").prev();<br />
  if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").last();//volta ao ultimo</p>
<p>  //remove o marcador do slide anterior<br />
  $slideshow.find("li.slideatual").removeClass("slideatual");</p>
<p>  //posiciona na direita<br />
  $slideativo.show().css("left", $slideativo.outerWidth()).css('opacity', '0');<br />
  //coloca o marcador e mostra<br />
  $slideativo.addClass("slideatual").animate({<br />
    "left": "0", "opacity": "1"<br />
  }, "slow");<br />
});<br />
</code></p>
<p>Repare que em uma está usando callback e na outra não, dessa maneira uma espera desaparecer para mostrar enquanto na outra os slides correm grudados, fica à escolha do freguês, veja a <a href="http://codexico.com.br/projetos/slideshow/tres.html">demo três</a>.</p>
<p>Foi necessário também adicionar um <code>.css("left","0")</code> para posicionar corretamente os slides.</p>
<p>O css também teve que mudar um pouco:</p>
<p><code lang="css"><br />
#slides{<br />
  list-style-type: none;<br />
  width: 200px;<br />
  overflow: hidden;<br />
}<br />
.slide{<br />
  width: 200px;<br />
  height: 200px;<br />
  border: 1px solid #000;<br />
  left: -200px;<br />
  position: absolute;<br />
}<br />
</code></p>
<p>Pronto, agora a animação é diferente, ao clicar em &#8220;anterior&#8221; os slides correm para a esquerda e em &#8220;próximo&#8221; os slides correm para a direita.</p>
<p>Demo <a href="http://codexico.com.br/projetos/slideshow/tres.html">Três</a></p>
</section>
<section>
<header>
<h1>
            <a href="http://codexico.com.br/projetos/slideshow/quatro.html">Quatro</a>: Plugin<br />
          </h1>
</header>
<p>Beleza, agora se quiser mesmo fazer um plugin fica fácil, esse DIY não é sobre fazer plugin então vou economizar e usar o <a href="http://starter.pixelgraphics.us/">starter</a>, um gerador de código que gera um template para plugins jQuery.</p>
<p>O código então fica assim (<a href="http://codexico.com.br/projetos/slideshow/jquery.slideshow.js">jquery.slideshow.js</a>) (um pouco maior que as 17 linhas iniciais):</p>
<p><code lang="javascript"><br />
(function ($) {<br />
  //http://starter.pixelgraphics.us/<br />
  $.slideshow = function (el, options) {<br />
    // To avoid scope issues, use 'base' instead of 'this'<br />
    // to reference this class from internal events and functions.<br />
    var base = this;<br />
    // Access to jQuery and DOM versions of element<br />
    base.$el = $(el);<br />
    base.el = el;<br />
    // Add a reverse reference to the DOM object<br />
    base.$el.data("slideshow", base);</p>
<p>    base.init = function(){<br />
      //junta as opcoes default com as passadas na chamada do plugin<br />
      base.options = $.extend({},$.slideshow.defaultOptions, options);</p>
<p>      //um nome mais pratico para base.$el<br />
      $slideshow = base.$el;<br />
      //inicialmente esconde os slides<br />
      $slideshow.find("li.slide").hide();<br />
      //encontra o prmeiro slide e ativa-o<br />
      $slideativo = $slideshow.find("li.slide").first().addClass('slideatual').css("left","0").show();</p>
<p>      base.proximo();<br />
      base.anterior();<br />
    };</p>
<p>    base.proximo = function(paramaters){<br />
      //ao clicar mostra o proximo slide<br />
      $('#slideproximo').click(function(){<br />
        //esconde o slide atual para a direita<br />
        $slideativo.animate({<br />
          "left": "+="+$slideativo.outerWidth(),<br />
          "opacity": "0"<br />
        }, "slow");<br />
        //procura o proximo<br />
        $slideativo = $slideshow.find("li.slideatual").next();<br />
        if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").first();//volta ao primeiro</p>
<p>        //remove o marcador do slide anterior<br />
        $slideshow.find("li.slideatual").removeClass("slideatual");</p>
<p>        //posiciona na esquerda<br />
        $slideativo.show().css("left", $slideativo.outerWidth()*-1).css('opacity', '0');<br />
        //coloca o marcador e mostra<br />
        $slideativo.addClass("slideatual").animate({<br />
          "left": "0",<br />
          "opacity": "1"<br />
        }, "slow");<br />
      });<br />
    };</p>
<p>    base.anterior = function(paramaters){<br />
      //ao clicar mostra o slide anterior<br />
      $('#slideanterior').click(function(){<br />
        //esconde o slide atual para a esquerda<br />
        $slideativo.animate({<br />
          "left": "-="+$slideativo.outerWidth(),<br />
          "opacity": "0"<br />
        }, "slow");<br />
        //procura o proximo<br />
        $slideativo = $slideshow.find("li.slideatual").prev();<br />
        if(!$slideativo.size()) $slideativo = $slideshow.find("li.slide").last();//volta ao ultimo</p>
<p>        //remove o marcador do slide anterior<br />
        $slideshow.find("li.slideatual").removeClass("slideatual");</p>
<p>        //posiciona na direita<br />
        $slideativo.show().css("left", $slideativo.outerWidth()).css('opacity', '0');<br />
        //coloca o marcador e mostra<br />
        $slideativo.addClass("slideatual").animate({<br />
          "left": "0",<br />
          "opacity": "1"<br />
        }, "slow");<br />
      });<br />
    };</p>
<p>    // Run initializer<br />
    base.init();<br />
  };</p>
<p>  $.slideshow.defaultOptions = {<br />
  //colocar aqui opcoes default<br />
  };</p>
<p>  $.fn.slideshow = function(options){<br />
    return this.each(function () {<br />
      (new $.slideshow(this, options));<br />
    });<br />
  };<br />
})(jQuery);<br />
</code></p>
<p>E para chamar o plugin basta incluir o script acima e <em>&#8220;$(&#8216;#slideshow&#8217;).slideshow();&#8221;</em></p>
<p><code lang="html"><br />
<script src="jquery.slideshow.js" type="text/javascript"></script><br />
<script type="text/javascript">
  jQuery(document).ready(function($) {</p>
<p>    //chama o plugin
    $('#slideshow').slideshow();
  });
</script><br />
</code></p>
<p>Demo <a href="http://codexico.com.br/projetos/slideshow/quatro.html">quatro</a></p>
</section>
</article>
<p>No total demorou 1 hora para chegar na etapa 3, acho que demoraria mais ou menos a mesma coisa para encontrar um plugin que fizesse algo parecido, mas também poderia gastar esse tempo todo e não encontrar nenhum adequado.</p>
<p>Você já passou por isso também? Deixe um comentário.</p>
<p><em>PS:</em> este post foi feito em html5, confira o código na <a href="http://codexico.com.br/projetos/slideshow/index.html">demo principal</a></p>
<p>Também no github: <a href="https://github.com/codexico/diy-slideshow-jQuery">https://github.com/codexico/diy-slideshow-jQuery</a></p><p>The post <a href="https://codexico.com.br/blog/2010/12/15/diy-slideshow-em-jquery/">DIY – slideshow em jQuery</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/12/15/diy-slideshow-em-jquery/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">380</post-id>	</item>
		<item>
		<title>Tutorial simples parte 2: git branch e merge</title>
		<link>https://codexico.com.br/blog/2010/11/16/tutorial-simples-parte-2-git-branch-e-merge/</link>
					<comments>https://codexico.com.br/blog/2010/11/16/tutorial-simples-parte-2-git-branch-e-merge/#comments</comments>
		
		<dc:creator><![CDATA[codexico admin]]></dc:creator>
		<pubDate>Tue, 16 Nov 2010 02:11:42 +0000</pubDate>
				<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=361</guid>

					<description><![CDATA[<p>o básico de como usar branch e merge para separar produção e desenvolvimento</p>
<p>The post <a href="https://codexico.com.br/blog/2010/11/16/tutorial-simples-parte-2-git-branch-e-merge/">Tutorial simples parte 2: git branch e merge</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>A parte 1 (<a href="http://codexico.com.br/blog/linux/tutorial-simples-como-usar-o-git-e-o-github">Como usar o git e o github</a>) foi sobre instalar o git, ssh-key, criar um projeto no github e os commits básicos.</p>
<p>Em projetos super simples tudo bem, mas para qualquer coisa maiorzinha já é melhor usar branchs, é fácil também, nem tirei o <em>simples</em> do título do post.</p>
<p>Vou abordar os branchs de forma educacional, como se fosse um projeto de uma só pessoa. A parte 3 trará uma visão mais prática, com um fluxo de trabalho completo e voltado para equipes, graças ao git ainda será simples.</p>
<p>Será usado o mesmo <a href="https://github.com/codexico/tutorial-github">repositório da parte 1</a>.</p>
<h3>Branch</h3>
<p>Para criar um branch no diretório do projeto:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">$ git branch parte2</pre>
<p>Atenção, somente foi criado o branch, o git não mudou para ele, qualquer alteração ou commit será feito no master. O git mostra onde está:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">$ git branch
* master
parte2</pre>
<p>Para mudar para o branch é necessário um checkout:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">$ git checkout parte2
Switched to branch 'parte2'</pre>
<p>Os dois passos podem ser substituídos por um só (mas é sempre bom saber de onde veio):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">git checkout -b parte2</pre>
<p>Agora sim as modificações serão feitas no branch correto. Que tal criar um diretório, uns arquivos e também alterar o README da parte 1?<br />
<code></code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">mkdir parte2
touch parte2/testeparte2
git add .
git commit -m "arquivo para testes da parte2"
vim README
git commit -a -m "README parte2"</pre>
<p><code></code></p>
<p><code>&nbsp;</code></p>
<p>Foram criados dois commits, ambos no branch <em>parte2</em>, um push agora não irá alterar nada no repositório.</p>
<h3>Merge</h3>
<p>Para enviar as modificações é necessário primeiro um checkout para voltar ao master, depois o merge com o branch e então o push.</p>
<p>Dica: TAB autocompleta os comandos e também os nomes dos branchs.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git checkout master
git merge parte2
git push origin master</pre>
<p>Foi enviado o código mas o github não percebeu que havia um branch pois o branch está somente na máquina local, para enviar o branch ao repositório o push muda um pouco:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git push origin parte2:parte2</pre>
<p>O formato é o seguinte <em>git push repositorioRemoto nomeLocalDoBranch:nomeRemotoDoBranch</em>, assim dá para enviar com um nome diferente se quiser.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git checkout parte2
vim parte2/testeparte2
git commit -a -m "texto teste"
git push origin parte2:parte2</pre>
<p>Agora sim dá para ver que existe um branch, olha lá <a href="https://github.com/codexico/tutorial-github/network">https://github.com/codexico/tutorial-github/network</a></p>
<p>Quando não for mais usá-lo, o branch pode ser deletado com:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git branch -d nome-do-branch</pre>
<p>Legal, já deu pra perceber que dá por exemplo para trabalhar em uma nova funcionalidade do projeto sem alterar o código principal. Quando tudo estiver pronto, os testes passaram e tal, pode ser feito o merge e só então enviar para o repositório.</p>
<p>Pronto, acabou o básico sobre branch e merge com git.</p>
<h3>Branch e Merge exemplo 2</h3>
<p>Até agora foi muito básico, normalmente enquanto se está trabalhando num branch aparece um bug para ser arrumado no master, ou outro branch também está sendo trabalhado, ou seu sistema de desenvolvimento é dividido em produção, desenvolvimento, homologação e outros, são muitas possibilidades, cada lugar trabalha de uma maneira. Na parte 3 terá mais sobre isso.</p>
<p>Agora um exemplo um pouquinho mais trabalhado:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git checkout -b funcionalidadeX
touch funcionalidadeX
git add .
git commit -m "funcionalidadeX iniciada"
vim funcionalidadeX
git add .
git commit -m "funcionalidadeX parcialmente executada"</pre>
<p>Foi iniciado um branch para a funcionalidadeX e depois de alguns commits ela ainda não está finalizada.</p>
<p>Então apareceu um bug no master que precisa ser corrigido rapidamente (colocar o link da parte2 antes do texto da parte2 do README, urgente né, o usuário é fogo).</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git checkout -b bug42
vim README
git commit -a -m "bug 42 corrigido"
git checkout master
git merge --no-ff bug42
git branch -d bug42</pre>
<p>Foi criado um branch para o bug, o bug foi corrigido, voltou ao master, foi dado um merge para incluir as alterações no master e então o branch foi deletado. A opção <strong>&#8211;no-ff</strong> é utilizada para forçar a criação de um commit, sem ela o merge não cria commit e fica mais difícil recuperar o código anterior.</p>
<p>Agora é só completar a funcionalidade X.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git checkout funcionalidadeX
vim funcionalidadeX
git commit -a -m "funcionalidadeX finalizada"
vim README
git commit -a -m "README atualizado com a funcionalidadeX"
git checkout master
git merge --no-ff funcionalidadeX</pre>
<p>Correu tudo bem? Pode ser que sim, o github vai fundir o código da funcionalidadeX com o master, que já contém a correção do bug. Mas e se a correção conflita com as alterações da funcionalidade X? Neste caso o git mostra um alerta e não permite o merge, mas mostra os conflitos:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git status</pre>
<p>Os conflitos precisam ser corrigidos manualmente e então o merge será aceito. O git inclui marcações no código dos arquivos em conflito para ajudar na resolução do conflito.</p>
<p>Com um fluxo de trabalho melhorzinho dá para evitar muitos conflitos, logo mais na Parte 3 do tutorial&#8230;</p>
<p>No final os merges ficaram assim:<br />
<a href="https://github.com/codexico/tutorial-github/network"><img data-recalc-dims="1" decoding="async" class="aligncenter size-full wp-image-363" title="branches" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/11/merge.png?resize=312%2C155" alt="" width="312" height="155"></a></p>
<p>Para finalizar uma tag:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">git tag -a v2.0 -m 'parte 2'
git push origin v2.0</pre>
<h3>Referências:</h3>
<p><a href="http://progit.org/book/ch3-2.html">Pro Git &#8211; Basic Branching and Merging</a><br />
<a href="http://help.github.com/remotes/">github &#8211; Working with remotes</a><br />
<a href="http://nvie.com/posts/a-successful-git-branching-model/">nvie.com &#8211; A successful Git branching model</a></p><p>The post <a href="https://codexico.com.br/blog/2010/11/16/tutorial-simples-parte-2-git-branch-e-merge/">Tutorial simples parte 2: git branch e merge</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/11/16/tutorial-simples-parte-2-git-branch-e-merge/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">361</post-id>	</item>
		<item>
		<title>Tutorial simples: Formas básicas do canvas no html5</title>
		<link>https://codexico.com.br/blog/2010/10/17/tutorial-simples-formas-basicas-do-canvas-no-html5/</link>
					<comments>https://codexico.com.br/blog/2010/10/17/tutorial-simples-formas-basicas-do-canvas-no-html5/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Sun, 17 Oct 2010 18:14:38 +0000</pubDate>
				<category><![CDATA[html5]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html5 canvas png]]></category>
		<category><![CDATA[png]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=321</guid>

					<description><![CDATA[<p>Neste tutorial aprenda a usar canvas html5 para desenhar retângulos, círculos, incluir texto e ainda salvar o canvas como imagem png</p>
<p>The post <a href="https://codexico.com.br/blog/2010/10/17/tutorial-simples-formas-basicas-do-canvas-no-html5/">Tutorial simples: Formas básicas do canvas no html5</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>No html5 apareceu a tag &lt;canvas&gt;, com ela é possivel desenhar com código javascript, e até animar o desenho.</p>
<p>Como sou péssimo para desenhar resolvi experimentar com o canvas quando tive que fazer um ícone para a extensão de utf-8 que fiz para o Google Chrome, na documentação dizia que o ícone podia ser em canvas (é bom para extensões que mostram algum movimento no ícone), então vamos nessa ⚡</p>
<p>O ícone da extensão envolve os 3 principais e mais simples elementos, um retângulo, um círculo e texto.</p>
<p>Tudo começa com um arquivo html:</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="html"><title>Canvas tutorial</title>

<!-- Este é um canvas!!! -->
<canvas id="icon"></canvas>
</pre>
<p></code><code></code><code></code></p>
<p>Mas assim ele não faz nada, precisa executar ao carregar a página, para isso é necessário um pouquinho de javascript. Um template para começar um canvas ficaria assim:</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript"><script type="text/javascript">
function draw(){
  var canvas = document.getElementById('icon');
  if (canvas.getContext){//verifica se o navegador suporta
    var context = canvas.getContext('2d');
  }
}
</script>

<!-- desenha o canvas ao carregar a página,
claro q na prática deve ser feito de maneira não intrusiva -->

</pre>
<p></code><code></code><code></code></p>
<p>A forma mais básica é o retângulo, prático para demarcar o tamanho do desenho.</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript"><script type="text/javascript">
function draw(){
  var canvas = document.getElementById('icon');
  if (canvas.getContext){
    var context = canvas.getContext('2d');
    //retangulo
    context.fillStyle = "rgba(0, 0, 200, 0.2)";//cor do preenchimento
    context.fillRect (0, 0, 128, 128);//background
    context.strokeStyle = "#FF0000";//cor da borda
    context.strokeRect(0,0,128,128);//borda
  }
}
</script>

<canvas id="icon" width="128" height="128"></canvas>

</pre>
<p></code><code></code><code></code></p>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas3.png"><img data-recalc-dims="1" decoding="async" class="alignnone size-full wp-image-334" title="tutorial-canvas3" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas3.png?resize=128%2C128" alt="retangulo em canvas" width="128" height="128"></a></p>
<p>O canvas só suporta diretamente retângulos e texto, para o resto é necessário um &#8220;path&#8221;, usamos <em>beginPath()</em> para iniciar e <em>closePath()</em> para terminar, só então dá pra desenhar com o <em>stroke()</em> ou o <em>fill()</em>.</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript">function draw(){
var canvas = document.getElementById('icon');
if (canvas.getContext){
var context = canvas.getContext('2d');

//retangulo
context.strokeStyle = "red";
context.strokeRect(0,0,128,128);

//circulo
context.fillStyle = "rgba(241, 178, 21, 0.3)";
context.strokeStyle = "blue";
context.beginPath();
var x = 64; // = 128/2 - centraliza o circulo
var y = 64;
var radius = 64; //raio do circulo = diametro/2
var anticlockwise = true;
var startAngle = 0; //inicia o arco na posição 0 graus (direita)
var endAngle = Math.PI*2; //termina o arco na posição 360 graus (volta completa)
context.arc(x, y, radius, startAngle, endAngle, anticlockwise);
context.closePath();
context.stroke(); //desenha a borda
context.fill(); //preenche

}
}
</pre>
<p></code><code></code><code></code><br />
<a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas4.png"><img data-recalc-dims="1" decoding="async" class="alignnone size-full wp-image-336" title="tutorial-canvas4" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas4.png?resize=128%2C128" alt="circulo em canvas" width="128" height="128"></a></p>
<p>Como a extensão que eu estava fazendo envolvia caracteres utf-8, resolvi economizar no desenho e usar uma estrela em utf mesmo.</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript"><script type="text/javascript">
function draw() {
  var canvas = document.getElementById("icon");
  if (canvas.getContext) {
    var context = canvas.getContext("2d");
    //circulo
    context.fillStyle = "rgba(241, 178, 21, 0.3)";
    context.strokeStyle = "blue";
    context.beginPath();
    context.arc(64, 64, 64, 0, Math.PI * 2, true);
    context.closePath();
    context.stroke();
    context.fill();
    //texto
    context.strokeStyle = "rgba(2, 93, 198, 1)";
    context.fillStyle = "rgba(2, 93, 198, 0.9)";
    context.font = "italic bold 146px sans-serif";
    context.fillText("✪", 3, 117); //aqui ñ encontrei uma fórmula para x,y e o tamanho da fonte
  }
}
</script>

<canvas id="icon" width="128" height="128"></canvas>

</pre>
<p></code><code></code><code></code></p>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas5.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone size-full wp-image-337" title="tutorial-canvas5" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas5.png?resize=128%2C128" alt="texto em canvas" width="128" height="128"></a></p>
<p>Repare que além dos métodos para incluir o texto na imagem foi necessário incluir &#8220;&lt;meta charset=&#8221;utf-8&#8243;&gt;&#8221; para o caracter aparecer corretamente.</p>
<p>Só que ficou meio normal demais esse ícone. ¿Que tal brincar um pouco com os ângulos do arc?</p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript">//texto
context.strokeStyle = "rgba(2, 93, 198, 1)";
context.fillStyle = "rgba(2, 93, 198, 0.9)";
context.font = "italic bold 146px sans-serif";
context.fillText("✪", 3, 117);

//circulo
context.fillStyle = "rgba(241, 178, 21, 0.3)";
context.beginPath();
var startAngle = (Math.PI * 3.78) / 2; //comeca um pouco acima do 0
var endAngle = Math.PI + (Math.PI * 3.42) / 2; //termina no sudoeste
context.arc(64, 64, 64, startAngle, endAngle, true);
context.closePath();
context.fill();

</pre>
<p></code><code></code><code></code></p>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas6.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignnone size-full wp-image-338" title="tutorial-canvas6" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/tutorial-canvas6.png?resize=128%2C128" alt="angulos em canvas" width="128" height="128"></a></p>
<p>Tá, mas até agora o desenho só apareceu no navegador, se tentar salvar vai baixar o fonte e não a imagem! Para criar um png do canvas o método é <em>canvas.toDataURL()</em></p>
<p><code></code></p>
<p><code></code></p>
<p><code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="javascript">//texto
context.strokeStyle = "rgba(2, 93, 198, 1)";
context.fillStyle = "rgba(2, 93, 198, 0.9)";
context.font = 'italic bold 146px sans-serif';
context.fillText("✪", 3, 117);
//circulo
context.fillStyle = "rgba(241, 178, 21, 0.3)";
context.beginPath();
var startAngle = (Math.PI*3.78)/2;
var endAngle = Math.PI+(Math.PI*3.42)/2;
context.arc(64,64,64,startAngle,endAngle,true);
context.closePath();
context.fill();

//criar imagem png
window.open(canvas.toDataURL());
</pre>
<p></code><code></code><code></code></p>
<p>Vai tentar abrir um popup, não esqueça de liberar.</p>
<p>Por hoje é só pessoal!!</p>
<p>Para saber mais sobre canvas:<br />
<a href="https://developer.mozilla.org/en/Canvas_tutorial">https://developer.mozilla.org/en/Canvas_tutorial</a></p>
<p>Se tiver curiosidade segue o link para a extensão utf-8:<br />
Firefox: <a href="https://addons.mozilla.org/en-US/firefox/addon/242192/">https://addons.mozilla.org/en-US/firefox/addon/242192/</a><br />
Chrome: <a href="https://chrome.google.com/extensions/detail/fcemphgmjnjpmmdhcedhjiegickfbiia">https://chrome.google.com/extensions/detail/fcemphgmjnjpmmdhcedhjiegickfbiia</a></p><p>The post <a href="https://codexico.com.br/blog/2010/10/17/tutorial-simples-formas-basicas-do-canvas-no-html5/">Tutorial simples: Formas básicas do canvas no html5</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/10/17/tutorial-simples-formas-basicas-do-canvas-no-html5/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">321</post-id>	</item>
		<item>
		<title>Símbolos para usar no twitter</title>
		<link>https://codexico.com.br/blog/2010/10/07/simbolos-para-usar-no-twitter/</link>
					<comments>https://codexico.com.br/blog/2010/10/07/simbolos-para-usar-no-twitter/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Thu, 07 Oct 2010 23:49:50 +0000</pubDate>
				<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=303</guid>

					<description><![CDATA[<p>Conheça os símbolos e ícones + úteis para escrever mensagens no twitter e substituir palavras para deixar as mensagens mais curtas e caber nos 140 caracteres, usando utf-8, ex:  ✈☽ ☕ ☔   ✍ ✔ ⚐ ☮ ☢ ☣  ♥ ☠  ♫</p>
<p>The post <a href="https://codexico.com.br/blog/2010/10/07/simbolos-para-usar-no-twitter/">Símbolos para usar no twitter</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Atualização: Fica fácil de usar as letras com o <a href="https://chrome.google.com/webstore/detail/utf-8/fcemphgmjnjpmmdhcedhjiegickfbiia">plugin para Google Chrome</a>.
</p>
<p>No twitter &eacute; poss&iacute;vel inserir s&iacute;mbolos bacanas no lugar de palavras e&nbsp; assim&nbsp; deixar as mensagens mais curtas para caber nos 140 caracteres. Tamb&eacute;m serve para outros sites que utilizem utf-8.</p>
<p>Alguns exemplos:</p>
<blockquote>
<p dir="ltr" style="margin-left: 40px;"><cite>Vou para o ✈ antes q a☽ apare&ccedil;a, mas antes vou tomar um ☕ pq t&aacute; ☔, qd chegar te </cite></p>
<p dir="ltr" style="margin-left: 40px;"><cite>Grande , ✍ e me manda os detalhes por ✉ para eu dar um ✔</cite></p>
<p dir="ltr" style="margin-left: 40px;"><cite>vamos declarar ⚐ para dar uma chance &agrave; ☮</cite></p>
<p dir="ltr" style="margin-left: 40px;"><cite>☄ se aproxima da terra, risco de ☢☣</cite></p>
<p dir="ltr" style="margin-left: 40px;"><cite> temos q colocar na ⚖ antes de tomar a decis&atilde;o</cite></p>
<p dir="ltr" style="margin-left: 40px;"><cite>&nbsp;<span class="the_content">I &hearts; you</span></cite></p>
</blockquote>
<p>&Eacute; bem dif&iacute;cil encontrar os s&iacute;mbolos, ent&atilde;o juntei alguns dos principais e mais &uacute;teis a seguir:</p>
<p style="margin-left: 40px;">Carinhas, smiles, emoticons:<br />
<span style="font-size: 36px;">☹ ☺ ☻ ☃ ☠ </span></p>
<p style="margin-left: 40px;">Sinais:<br />
<span style="font-size: 36px;">⚠ ⚡ ✆   ♿</span></p>
<p style="margin-left: 40px;">Coisas &uacute;teis:<br />
<span style="font-size: 36px;">✈  ☎ ☏ ☂ ☔ ✉ ☄☽ ☾☕ ✇ ❤   </span></p>
<p style="margin-left: 40px;">Religi&otilde;es:<br />
<span style="font-size: 36px;">☯ ✝ ✞ ✟ ☨ ☦ ☭ ☮ ☪ ☫ ☬ ☩ ✠ ☧ ✡</span></p>
<p style="margin-left: 40px;">Signos:<br />
<span style="font-size: 36px;">♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓</span></p>
<p style="margin-left: 40px;">G&ecirc;nero (um desses deve ser zumbi, s&oacute; n&atilde;o sei qual):<br />
<span style="font-size: 36px;">♀ ♂ ☿ ♁ ⚢ ⚣ ⚤ ⚥ ⚦ ⚧ ⚨ ⚩</span></p>
<p style="margin-left: 40px;">Flores:<br />
<span style="font-size: 36px;">❁ ❀ ✿ ✽ ✾ ❃ ⚘ ☘ </span></p>
<p style="margin-left: 40px;">Xadrez:<br />
<span style="font-size: 36px;">♚ ♔ ♛ ♕ ♜ ♖ ♝ ♗ ♞ ♘ ♟ ♙</span></p>
<p style="margin-left: 40px;">Cartas:<br />
<span style="font-size: 36px;">&hearts; ♡ &spades; ♤ &diams; ♢ &clubs; ♧</span></p>
<p style="margin-left: 40px;">Estrelas:<br />
<span style="font-size: 36px;">✩ ★ ☆ ✪ ✫ ✬ ✭ ✮ ✯ ✰ ☼ ☸ ☉ ❂</span></p>
<p style="margin-left: 40px;">M&uacute;sica:<br />
<span style="font-size: 36px;">♬ ♫ ♪ ♩</span></p>
<p style="margin-left: 40px;">Reciclagem:<br />
<span style="font-size: 36px;">♺ ♽ ♼ ♻ ♲ ♳ ♴ ♵ ♶ ♷ ♸ ♹</span></p>
<p style="margin-left: 40px;">Asteriscos:<br />
<span style="font-size: 36px;">✱ ✲ ✳ ✴ ✵ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ❉ ❊ ❋</span></p>
<p style="margin-left: 40px;">Flocos de neve:<br />
<span style="font-size: 36px;">❄ ❅ ❆</span></p>
<p style="margin-left: 40px;">Profiss&otilde;es:<br />
<span style="font-size: 36px;">☤ ⚕ ⚒ ⚓ ⚙ ⚜</span></p>
<p style="margin-left: 40px;">Ci&ecirc;ncia:<br />
<span style="font-size: 36px;">☢ ☣ ⚝ ⚛</span></p>
<p style="margin-left: 40px;">Marcadores:<br />
<span style="font-size: 36px;">☐ ☑ ☒ ✓ ✔ ✕ ✖ ✗ ✘ ✚</span></p>
<p style="margin-left: 40px;">M&atilde;os:<br />
<span style="font-size: 36px;">✌ ✍ ☟ ☝ ☜ ☚ ☞ ☛</span></p>
<p style="margin-left: 40px;">Setas:<br />
<span style="font-size: 36px;">➘ ➙ ➚ ➝ ➜ ➟ ➡ ➢ ➤ ➩ ➿ ⟲ ⟳ ⟷ ⟵ ⟶ ⟿</span></p>
<p style="margin-left: 40px;">Tesoura e l&aacute;pis:<br />
<span style="font-size: 36px;">✂ ✄ ✏ ✎ ✐</span></p>
<p style="margin-left: 40px;">Marcas:<br />
<span style="font-size: 36px;">&copy; &reg; &trade; </span></p>
<p style="margin-left: 40px;">Moedas:<br />
<span style="font-size: 36px;">&pound; $ &euro;</span></p>
<p style="margin-left: 40px;">Matem&aacute;tica:<br />
<span style="font-size: 36px;">&infin; &oslash; &ne; % &hellip;     &int; &asymp; &there4; &prop;</span></p>
<p style="margin-left: 40px;">Letras antigas:<br />
<span style="font-size: 36px;">   &micro; &part; &Omega; &Phi; &Psi; &lambda; ϴ &omega;</span></p>
<p style="margin-left: 40px;">A interroga&ccedil;&atilde;o usada em espanhol (acho que deveria ser utilizada em todos os idiomas):<br />
<span style="font-size: 36px;">&iquest;</span></p>
<p style="margin-left: 40px;">Temperatura:<br />
<span style="font-size: 36px;">℃ ℉</span></p>
<p style="margin-left: 40px;">Bandeiras:<br />
<span style="font-size: 36px;">⚑ ⚐</span></p>
<p style="margin-left: 40px;">Ahnn, sei l&aacute;:<br />
<span style="font-size: 36px;">&para; &sect; ❝ ❞ ❦ ☙ ♨ ☁ ⚖</span></p>
<p>&nbsp;</p>
<p>Se quiser copiar todos estes caracteres especiais acima juntos de uma vez, deixei aqui: <a href="http://codexico.com.br/files/utf8.html">http://codexico.com.br/files/utf8.html</a></p>
<p>Quando estiver fazendo um html n&atilde;o esque&ccedil;a de avisar ao navegador que o conte&uacute;do &eacute; utf, colocando no &lt;head&gt;:</p>
<p>&lt;meta content=&quot;text/html charset=UTF-8&quot; http-equiv=&quot;Content-Type&quot;&gt;</p>
<p>E html5 fica assim:</p>
<p>&lt;meta charset=&quot;utf-8&quot;&gt;</p>
<p>&nbsp;</p>
<p>Links para as tabelas completas de caracteres:</p>
<p><a href="http://macchiato.com/unicode/chart/">http://macchiato.com/unicode/chart/</a> separados por tipos e bem organizado</p>
<p><a href="http://www.utf8-chartable.de/unicode-utf8-table.pl">http://www.utf8-chartable.de/unicode-utf8-table.pl</a> separados por tipos e com mais informa&ccedil;&otilde;es</p>
<p><a href="http://www.alanwood.net/unicode/menu.html">http://www.alanwood.net/unicode/menu.html</a> separados por tipos e com uma p&aacute;gina para cada</p>
<p><a href="http://tlt.its.psu.edu/suggestions/international/bylanguage/mathchart.html">http://tlt.its.psu.edu/suggestions/international/bylanguage/mathchart.html</a> especializado nos caracteres matem&aacute;ticos</p>
<p>&nbsp;</p>
<p>Olha s&oacute; um jogo de xadrez em 140 caracteres:</p>
<p>1 e4 ♞f6<br />
2 e5 ♞d5<br />
3 c4 ♞b6<br />
4 d4 d6<br />
5 f4 dxe5<br />
6 fxe5 ♞c6<br />
7 ♗e3 ♝f5<br />
8 ♘c3 e6<br />
9 ♘f3 ♝e7<br />
10 e2 O-O<br />
11 O-O f6<br />
12 ♘h4 fxe5<br />
13 ♘xf5 exf5<br />
14 d5 ♞d4!</p>
<p>&nbsp;</p>
<p>➤➤ &iquest;Conhece + exemplos de frases usando ut-8? Quem escrever nos coment&aacute;rios ganha uma estrelinha ☆</p>
<p>&nbsp;</p>
<p><strong>Atualiza&ccedil;&atilde;o</strong> [17/10/10]</p>
<p>Se ainda n&atilde;o te convenci, olha o gr&aacute;fico do google mostrando que em 2008 utf j&aacute; era a codifica&ccedil;&atilde;o mais usada:</p>
<p><a href="http://googleblog.blogspot.com/2008/05/moving-to-unicode-51.html"><img data-recalc-dims="1" decoding="async" alt="Growth of Unicode on the Web" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/10/Unicode2-1.gif?ssl=1" style="width: 432px; height: 458px;" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Novidade:&nbsp;</strong> Voc&ecirc; leu e pensou &quot;&iquest;<em>O xico t&aacute; emo agora, e</em><em>screvendo sobre coisinhas bonitinhas? </em>&iquest;<em>Ou est&aacute; tentando aumentar a audi&ecirc;ncia com coisinhas pops?</em>&quot;, nada disso, &eacute; que eu estava aprendendo a fazer extens&otilde;es para o Firefox e precisava de algo f&aacute;cil de fazer.</p>
<p>Ent&atilde;o a&iacute; est&aacute; uma extens&atilde;o para Firefox e outra para o Google Chrome:</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/242192/">https://addons.mozilla.org/en-US/firefox/addon/242192/</a></p>
<p><a href="https://chrome.google.com/extensions/detail/fcemphgmjnjpmmdhcedhjiegickfbiia">https://chrome.google.com/extensions/detail/fcemphgmjnjpmmdhcedhjiegickfbiia</a></p>
<p>Ainda est&atilde;o bem b&aacute;sicas, mas vai melhorar, as pr&oacute;ximas mudan&ccedil;as est&atilde;o em <a href="http://www.pivotaltracker.com/projects/127653">http://www.pivotaltracker.com/projects/127653</a>, se tiver uma ideia escreva l&aacute;.</p>
<p>O c&oacute;digo, como sempre est&aacute; no github:</p>
<p>firefox: <a href="http://github.com/codexico/UTF-8-Firefox-Extension">http://github.com/codexico/UTF-8-Firefox-Extension</a></p>
<p>chrome: <a href="http://github.com/codexico/UTF-8-Chrome-Extension">http://github.com/codexico/UTF-8-Chrome-Extension</a></p><p>The post <a href="https://codexico.com.br/blog/2010/10/07/simbolos-para-usar-no-twitter/">Símbolos para usar no twitter</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/10/07/simbolos-para-usar-no-twitter/feed/</wfw:commentRss>
			<slash:comments>22</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">303</post-id>	</item>
		<item>
		<title>Copiar ou clonar uma VM no VirtualBox é fácil</title>
		<link>https://codexico.com.br/blog/2010/08/31/copiar-ou-clonar-uma-vm-no-virtualbox-e-facil/</link>
					<comments>https://codexico.com.br/blog/2010/08/31/copiar-ou-clonar-uma-vm-no-virtualbox-e-facil/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Tue, 31 Aug 2010 20:48:43 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[virtualização]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=266</guid>

					<description><![CDATA[<p>1)escolher o snapshot que deseja clonar<br />
2)VBoxManage clonehd nome_vm_existente.vdi nome_do_clone.vdi<br />
3)criar a máquina virtual usando o disco clonado</p>
<p>The post <a href="https://codexico.com.br/blog/2010/08/31/copiar-ou-clonar-uma-vm-no-virtualbox-e-facil/">Copiar ou clonar uma VM no VirtualBox é fácil</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Em dois simples passos (ou três se tiver snapshots) a VM está clonada.</p>
<p>Só um detalhe exige atenção, se a VM tiver snapshots, o estado clonado será o do snapshot mais antigo, se quiser o mais novo será necessário eliminar os snapshots até que reste somente o estado atual que é desejado clonar.</p>
<p>Vá até a pasta onde ficam as VM&#8217;s (~/.VirtualBox/HardDisks) e use o comando:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="shell">VBoxManage clonehd nome_vm_existente.vdi nome_do_clone.vdi</pre>
<p>Vai aparecer algo do tipo:</p>
<blockquote><p>Oracle VM VirtualBox Command Line Management Interface Version 3.2.8<br />
(C) 2005-2010 Oracle Corporation<br />
All rights reserved.</p>
<p>0%&#8230;10%&#8230;20%&#8230;30%&#8230;40%&#8230;50%&#8230;60%&#8230;70%&#8230;80%&#8230;90%&#8230;100%<br />
Clone hard disk created in format &#8216;VDI&#8217;. UUID: 8c97595a-08a9-4333-9ce9-dcbe4cd8f2a3</p></blockquote>
<p>O que este comando fez foi criar um novo hd, a vantagem é que ele clona o conteúdo da VM anterior. Se ainda não usou o disco e quiser deletá-lo (por exemplo se criou com nome errado, ou desistiu da cópia), basta ir até a pasta <em>~/.VirtualBox/HardDisks</em> e apagar o .vdi que acabou de criar. Se já está em uso, pode apagá-lo no Gerenciador de Mídias Virtuais (Ctrl+D).</p>
<p>Então basta criar uma nova máquina virtual (Máquina &gt; Novo) e quando for solicitado se gostaria de criar um novo disco ou usar um existente, clique para escolher um existente. Na tela que aparece ainda não mostrará o clone, para que apareça clique em &#8220;Acrescentar&#8221; e adicione o disco que criou no passo anterior.</p>
<p>Pronto, mais fácil que isso só se tivesse um botão &#8220;Clonar&#8221;!</p>
<p>Todos os tutoriais ou blogs que encontrei estavam desatualizados, tinham uns passos a mais e não eram em português, por isso escrevi esse. Pensei em colocar umas imagens ou fazer um screencast, mas ficou tão simples que vai só o texto mesmo. Qualquer dúvida ou sugestão mande um comentário.</p>
<p>Comentário extra: experimente Ctrl(direita)+L quando estiver usando a VM, é muito legal!</p>
<h3>Possíveis contratempos:</h3>
<p>Se acontecer um erro do tipo:</p>
<blockquote><p>VBoxManage: error: Cannot register the hard disk &#8216;/&#8230;.vdi&#8217; {ae40c3b3-0b98-4395-a1d0-4f2530312215} because a hard disk &#8216;/&#8230;.vdi&#8217; with UUID {ae40c3b3-0b98-4395-a1d0-4f2530312215} already exists<br />
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component VirtualBox, interface IVirtualBox, callee nsISupports<br />
Context: &#8220;OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, AccessMode_ReadWrite, pMedium.asOutParam())&#8221; at line 209 of file VBoxManageDisk.cpp</p></blockquote>
<p>A solução é trocar o UUID da vdi, não há nenhum problema em trocar o UUID basta um comando simples:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">VBoxManage internalcommands sethduuid nome_vm_existente.vdi</pre>
<p>Então repita o camando clonehd.</p>
<p>Outro problema que pode ocorrer é depois de trocar o UUID a VM não iniciar porque o UUID ficou diferente do registrado.</p>
<p>Na mensagem de erro aparece o UUID, copie e substitua no comando:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">VBoxManage internalcommands sethduuid nome_vm_existente.vdi 82caefd3-be95-4736-80e7-268d4a2558e0
</pre>
<p>Refs:<br />
<a href="http://www.virtualbox.org/manual/ch05.html#cloningvdis">http://www.virtualbox.org/manual/ch05.html#cloningvdis</a><br />
<a href="http://www.virtualbox.org/manual/ch08.html#vboxmanage-clonevdi">http://www.virtualbox.org/manual/ch08.html#vboxmanage-clonevdi</a><br />
<a href="http://srackham.wordpress.com/cloning-and-copying-virtualbox-virtual-machines/">http://srackham.wordpress.com/cloning-and-copying-virtualbox-virtual-machines/</a></p><p>The post <a href="https://codexico.com.br/blog/2010/08/31/copiar-ou-clonar-uma-vm-no-virtualbox-e-facil/">Copiar ou clonar uma VM no VirtualBox é fácil</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/08/31/copiar-ou-clonar-uma-vm-no-virtualbox-e-facil/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">266</post-id>	</item>
		<item>
		<title>Por que fiz o http://ttlocal.info</title>
		<link>https://codexico.com.br/blog/2010/07/26/porque-fiz-o-ttlocal/</link>
					<comments>https://codexico.com.br/blog/2010/07/26/porque-fiz-o-ttlocal/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Mon, 26 Jul 2010 21:10:06 +0000</pubDate>
				<category><![CDATA[projetos]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[trending topics]]></category>
		<category><![CDATA[tt]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=211</guid>

					<description><![CDATA[<p>Estava estudando a api do twitter para um site que estou desenvolvendo que ter&#225; bastante integra&#231;&#227;o do twitter. A&#237; come&#231;ou a hist&#243;ria do &#34;Cala Boca Galv&#227;o&#34; e comecei a olhar para o &#34;Trending&#34; que fica na home do twitter quando se est&#225; logado. L&#225; s&#243; aparece uma de cada vez, estavam dizendo que o &#34;Cala [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2010/07/26/porque-fiz-o-ttlocal/">Por que fiz o http://ttlocal.info</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Estava estudando a api do twitter para um site que estou desenvolvendo que ter&aacute; bastante integra&ccedil;&atilde;o do twitter. A&iacute; come&ccedil;ou a hist&oacute;ria do &quot;Cala Boca Galv&atilde;o&quot; e comecei a olhar para o &quot;Trending&quot; que fica na home do twitter quando se est&aacute; logado.</p>
<p>L&aacute; s&oacute; aparece uma de cada vez, estavam dizendo que o &quot;Cala Boca Galv&atilde;o&quot; estava entre os primeiros do mundo mas eu havia deixado o Trending configurado para o Brasil. Quando fui mudar percebi que &eacute; dif&iacute;cil acompanhar 2 locais, s&oacute; d&aacute; pra ver um de cada vez, a&iacute; o curioso n&atilde;o consegue saber se um topic passou de local a mundial, ou se est&aacute; sendo comentado em outros lugares tamb&eacute;m.</p>
<p>Ent&atilde;o resolvi fazer um site com todos os locais ao mesmo tempo.</p>
<p>Agora basta acessar o <a href="http://ttlocal.info">http://ttlocal.info</a> que est&atilde;o todos l&aacute;.</p>
<p>Claro que ainda est&aacute; em beta, fiz em 2 dias, um durante a copa, a&iacute; tive que fazer outras coisas e retomei para terminar somente hoje. Ainda vou trocar o layout (a Mary est&aacute; fazendo) e colocar alguma forma de ordena&ccedil;&atilde;o por pa&iacute;s.</p>
<p>No pr&oacute;ximo post coloco detalhes de c&oacute;digo para o pessoal programador.</p>
<p>Escreva um coment&aacute;rio. Sugest&otilde;es s&atilde;o bem-vindas!</p><p>The post <a href="https://codexico.com.br/blog/2010/07/26/porque-fiz-o-ttlocal/">Por que fiz o http://ttlocal.info</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/07/26/porque-fiz-o-ttlocal/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">211</post-id>	</item>
		<item>
		<title>Como instalar Rails 3 no (k) ubuntu</title>
		<link>https://codexico.com.br/blog/2010/06/08/como-instalar-rails-3-no-kubuntu-10-04/</link>
					<comments>https://codexico.com.br/blog/2010/06/08/como-instalar-rails-3-no-kubuntu-10-04/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Wed, 09 Jun 2010 00:50:38 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[10.04]]></category>
		<category><![CDATA[apt-get]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[kubuntu]]></category>
		<category><![CDATA[rails3]]></category>
		<category><![CDATA[ror]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rubygems]]></category>
		<category><![CDATA[ubuntu]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=95</guid>

					<description><![CDATA[<p>Instalação básica do Rails 3 em um linux (K)ubuntu zero km, depois de muitos testes cheguei a esse conjunto de 6 etapas (testado nas versões 10.04 e 10.10): 1) Instalar os&#160;pre-requisitos e ruby sudo apt-get install curl bison build-essential zlib1g-dev libssl-dev libreadline6-dev libxml2-dev git-core subversion autoconf sqlite3 libsqlite3-dev ruby-full rake rubygems Atualização (03/12/2010): As instruções [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2010/06/08/como-instalar-rails-3-no-kubuntu-10-04/">Como instalar Rails 3 no (k) ubuntu</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<div id="_mcePaste"></div>
<div>Instalação básica do Rails 3 em um linux (K)ubuntu zero km, depois de muitos testes cheguei a esse conjunto de 6 etapas (testado nas versões 10.04 e 10.10):</div>
<div></div>
<div>1) Instalar os&nbsp;pre-requisitos e ruby</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">sudo apt-get install curl bison build-essential zlib1g-dev libssl-dev libreadline6-dev libxml2-dev git-core subversion autoconf sqlite3 libsqlite3-dev ruby-full rake rubygems</pre>
<div></div>
<p>Atualização (03/12/2010): As instruções funcionam também no Debian. A única diferença é no debian stable &#8220;lenny&#8221; onde basta trocar <em>libreadline6-dev</em> por <em>libreadline5-dev</em>.</p>
<p>Atualização (18/03/2011): Como o Felypeguimaraes lembrou nos comentários, só use &#8220;sudo&#8221; nos comandos onde estiver escrito &#8220;sudo&#8221;, se usar sudo para instalar o rvm ou gem, etc, não vai funcionar.</p>
<div>Depois de +50MB de download, já dá para conferir qual a versão instalada:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ruby -v</pre>
<div></div>
<div>2) Instalar o&nbsp;rvm&nbsp;<a href="http://rvm.beginrescueend.com/">http://rvm.beginrescueend.com/</a>, ele tem muitas vantagens, auxilia a instalação e a manutenção de vários ambientes:</div>
<div></div>
<pre></pre>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">bash &lt; &lt;(curl https://rvm.beginrescueend.com/install/rvm)</pre>
<pre></pre>
<div></div>
<div>3) Editar o arquivo &nbsp;.bashrc. Esse passo pode ser um pouco chato.</div>
<div></div>
<div>Após instalar o rvm aparece esse aviso:</div>
<div id="_mcePaste"></div>
<blockquote>
<div id="_mcePaste">You must now finish the install manually:</div>
<div id="_mcePaste">1) Place the folowing line at the end of your shell&#8217;s loading files(.bashrc or .bash_profile for bash and .zshrc for zsh), after all path/variable settings:</div>
<div id="_mcePaste">[[ -s $HOME/.rvm/scripts/rvm ]] &amp;&amp; source $HOME/.rvm/scripts/rvm</div>
<div id="_mcePaste">2) Ensure that there is no &#8216;return&#8217; from inside the .bashrc file. (otherwise rvm will be prevented from working properly).</div>
<div id="_mcePaste">This means that if you see &#8216;[ -z &nbsp;] &amp;&amp; return&#8217; then you must change this line to:</div>
<div id="_mcePaste">if [[ ! -z &nbsp;]] ; then</div>
<div id="_mcePaste">&#8230; original content that was below the &amp;&amp; return line &#8230;</div>
<div id="_mcePaste">fi # &lt;= be sure to close the if.</div>
<div id="_mcePaste">#EOF .bashrc</div>
<div id="_mcePaste">Be absolutely *sure* to REMOVE the &#8216;&amp;&amp; return&#8217;.</div>
<div id="_mcePaste">If you wish to DRY up your config you can &#8216;source ~/.bashrc&#8217; at the bottom of your .bash_profile.</div>
<div id="_mcePaste">placing all non-interactive items in the .bashrc, including the &#8216;source&#8217; line above</div>
</blockquote>
<div id="_mcePaste"></div>
<div>No linux Mint foi só adicionar a linha no final. Já no Ubuntu a maneira mais fácil encontrei nesse fóum <a href="http://ubuntuforums.org/archive/index.php/t-1392189.html">http://ubuntuforums.org/archive/index.php/t-1392189.html</a></div>
<div id="_mcePaste"></div>
<div id="_mcePaste">3.1) renomear o .bashrc para .bashrc_part2</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">cp .bashrc .bashrc_part2</pre>
<div id="_mcePaste">3.2) remover no&nbsp;.bashrc_part2&nbsp;a linha com &#8216;&#8230; &amp;&amp; return&#8217;, linha 6</div>
<div></div>
<div id="_mcePaste">3.3) esvaziar o .bashrc e&nbsp;colocar o conteúdo:</div>
<div></div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">[[ -s $HOME/.rvm/scripts/rvm ]] &amp;&amp; source $HOME/.rvm/scripts/rvm
if [[ ! -z "$PS1" ]] ; then
  source ~/.bashrc_part2
fi</pre>
<div></div>
<div>4)&nbsp;Feche o terminal e abra um novo terminal para recarregar o bashrc e o rvm funcionar direitinho.</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">rvm info</pre>
<div id="_mcePaste">A versao atual do ruby ainda deve ser a mesma de antes:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ruby -v</pre>
<div id="_mcePaste">4.1) Instalar ruby pelo rvm</div>
<p><span style="text-decoration: line-through;">(rvm install ruby-head)</span> instalou o 1.9.3dev, testando mais um pouco vi que o head dá problema quando vai usar o console do rails, então é melhor instalar o 1.9.2 mesmo</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">rvm install 1.9.2</pre>
<div id="_mcePaste">Demora alguns minutos, aguenta firme. Após a instalação ainda não vai aparecer:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ruby -v</pre>
<div id="_mcePaste">4.2) Escolher a versão do ruby como default</div>
<p><span style="text-decoration: line-through;">(rvm &#8211;default ruby-head)</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">rvm --default 1.9.2</pre>
<div>Agora já aparece a&nbsp;versão head do ruby</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ruby -v</pre>
<div></div>
<div>4.3) O ruby mais novo ja está instalado e funcionando, só falta uma coisa antes de instalar o rails, também demora, uns 5~10 minutos:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">gem install sqlite3-ruby</pre>
<div></div>
<div></div>
<div>5) Chegou a hora, mais uns 10 minutos:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">gem install rails</pre>
<blockquote></blockquote>
<div></div>
<div>Atualização (29/11/2010): Parece haver um bugzinho na versão 3.0.3, se aparecer este erro:</div>
<pre>ERROR:  Error installing rails:
	mail requires i18n (~&gt; 0.4.1, runtime)</pre>
<div>A solução é instalar o mail antes:</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">gem install mail</pre>
<p>E depois desinstalar o i18n versão 5</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">gem uninstall i18n</pre>
<blockquote>
<pre>Select gem to uninstall:
 1. i18n-0.4.2
 2. i18n-0.5.0
 3. All versions</pre>
</blockquote>
<p>Escolha a opção 2.</p>
<div>Então é só repetir o comando de instalação do rails.</div>
<div></div>
<div>6)&nbsp;Testar:</div>
<div id="_mcePaste">#criar a aplicacao</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">rails new appteste1</pre>
<div id="_mcePaste">#ir para a aplicacao</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">cd appteste1</pre>
<div id="_mcePaste">#ligar o servidor</div>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">rails s</pre>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">bash &lt; &lt;(curl https://rvm.beginrescueend.com/install/rvm)
</pre>
<div id="_mcePaste">#acessar no navegador</div>
<div id="_mcePaste"><a href="http://localhost:3000" target="_blank" rel="noopener">http://localhost:3000</a></div>
<div></div>
<div></div>
<h4>Extras:</h4>
<h5>Mysql</h5>
<p><code>sudo apt-get  install mysql-server</code><br />
<code>gem install mysql2</code></p>
<p>Se por algum motivo aparecer esse erro:</p>
<pre>ERROR:  Error installing mysql:
	ERROR: Failed to build gem native extension.
...</pre>
<p>A solução é:</p>
<p><code>sudo apt-get install libmysqlclient-dev</code></p>
<p>Agora já dá para gerar um rails usando mysql.</p>
<p><code>rails new appmysql1 -d mysql</code></p>
<div></div>
<h4>Problemas:</h4>
<div id="_mcePaste">Instalando no virtualbox não reconhecia o repositório de gems, dava timeout.</div>
<div id="_mcePaste">Trocar o endereço padrão melhorou um pouco, no fundo dá na mesma, parece que depende de dns, conexão, provedor, firewall, sei lá..:</div>
<p><code>gem sources -a http://gems.rubyforge.org<br />
gem sources -r http://rubygems.org/</code></p>
<div id="_mcePaste">Algumas vezes não vai de primeira, mas na segunda, ou terceira tentativa vai. Não sei se ajudou, mas algumas vezes copiei o endereço de erro (por exemplo: http://gems.rubyforge.org/gems/sqlite3-ruby-1.3.0.gem) e acessei pelo navegador, aí o script acordou e encontrou a gem, vai entender&#8230;</div>
<div></div>
<h4>Refs:</h4>
<div id="_mcePaste"><a href="http://rvm.beginrescueend.com/rvm/install/" target="_blank" rel="noopener">http://rvm.beginrescueend.com/rvm/install/</a></div>
<div></div>
<div></div>
<div></div>
<div>Será que vale um vídeozinho? Ou um script para fazer tudo de uma vez?</div><p>The post <a href="https://codexico.com.br/blog/2010/06/08/como-instalar-rails-3-no-kubuntu-10-04/">Como instalar Rails 3 no (k) ubuntu</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/06/08/como-instalar-rails-3-no-kubuntu-10-04/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">95</post-id>	</item>
		<item>
		<title>Como instalar vários programas de uma só vez no Windows</title>
		<link>https://codexico.com.br/blog/2010/05/30/como-instalar-varios-programas-de-uma-so-vez-no-windows/</link>
					<comments>https://codexico.com.br/blog/2010/05/30/como-instalar-varios-programas-de-uma-so-vez-no-windows/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Sun, 30 May 2010 05:00:16 +0000</pubDate>
				<category><![CDATA[windows]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[install]]></category>
		<category><![CDATA[listas]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=62</guid>

					<description><![CDATA[<p>O windows logo após a instalação vem com poucas coisas úteis, nem um navegador de internet vem junto (¿alguém acha q o IE é navegador?), aí a gente perde um tempão para pesquisar, baixar e instalar softwares para tornar o pc usável (+- pq ainda é windows né!). Bom, deixando a discussão de lado, vou [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2010/05/30/como-instalar-varios-programas-de-uma-so-vez-no-windows/">Como instalar vários programas de uma só vez no Windows</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>O windows logo após a instalação vem com poucas coisas úteis, nem um navegador de internet vem junto (<em><strong>¿</strong></em>alguém acha q o IE é navegador?), aí a gente perde um tempão para pesquisar, baixar e instalar softwares para tornar o pc usável (+- pq ainda é windows né!). Bom, deixando a discussão de lado, vou escrever sobre como diminuir o drama.</p>
<p>Há algum tempo começaram a aparecer maneiras de facilitar a instalação de múltiplos programas ao mesmo tempo e manter uma lista de preferidos.</p>
<p>Bem antigamente a gente gravava os programas favoritos em alguns disquetes e andava com eles por aí. Depois com os cds já dava para guardar mais coisas, mas aí o mundo acelerou e os programas ficavam obsoletos muito rapidamente, quando vc pegava o cd e instalava os programas, tinha que conectar para atualizar a maioria dos programas. De vez em quando a gente queimava outro cd para atualizar os programas, com os pendrives pelo menos acabou o desperdício.</p>
<h3>1) PortableApps</h3>
<p><figure id="attachment_71" aria-describedby="caption-attachment-71" style="width: 157px" class="wp-caption alignright"><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/platform_on_vista_75x56.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class=" wp-image-71 " title="platform_on_vista_75x56" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/platform_on_vista_75x56.png?resize=157%2C117" alt="Portable Apps" width="157" height="117"></a><figcaption id="caption-attachment-71" class="wp-caption-text">Menu do Portable Apps no Windows</figcaption></figure></p>
<p>Veio o <a href="http://portableapps.com/"><em>PortableApps</em></a> [1]. Além de ser um conjunto de softwares fácil de manter atualizado, ainda roda tudo direto do pendrive. Mas ele não é exatamente para instalar os softwares no pc, até pode ser usado assim mas não é sua função principal. Nem é para usuários comuns, pois exige alguns conhecimentos e faz umas coisas diferentes, como deixar os ícones fora do menu padrão do windows.</p>
<p>Pró: Conjunto completo de programas</p>
<p>Contra: A maioria dos softwares são alterados para rodar de pendrive e não têm a mesma performance e integração ao sistema</p>
<p>Licença: free (as in freedom and beer)</p>
<h3>2) Google Pack</h3>
<p><figure id="attachment_70" aria-describedby="caption-attachment-70" style="width: 200px" class="wp-caption alignleft"><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/google-pack-lg.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-70 " title="google-pack-lg" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/google-pack-lg.jpg?resize=200%2C140" alt="Google Pack" width="200" height="140"></a><figcaption id="caption-attachment-70" class="wp-caption-text">Programas instalados pelo Pack</figcaption></figure></p>
<p>Uma das primeiras tentativas de organizar a bagunça veio com o <a href="http://pack.google.com/"><em>Google</em> Pack</a> [2], que instala vários softwares de uma só vez.</p>
<p>Pró: instala vários em um só click e os mantém atualizados</p>
<p>Contra: poucos softwares e deixa um programa rodando em background</p>
<p>Licença: free (as in beer)</p>
<h3>3) AppSnap</h3>
<p><figure id="attachment_72" aria-describedby="caption-attachment-72" style="width: 167px" class="wp-caption alignright"><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/appsnap.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-72  " style="clear: both;" title="appsnap" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/appsnap.jpg?resize=167%2C218" alt="AppSnap" width="167" height="218"></a><figcaption id="caption-attachment-72" class="wp-caption-text">AppSnap estilo Synaptic</figcaption></figure></p>
<p>Existiram também uns softwares inspirados nos repositórios do Linux, como o <a href="http://appsnap.genotrance.com/"><em><em>AppSnap</em></em></a> [3], que mostra uma lista de softwares onde vc pode escolher vários e instalar todos juntos.</p>
<p>Pró: lista grande de softwares e mantém atualizados</p>
<p>Contra: última atualização em 2008</p>
<p>Licença: free (as in freedom and beer)</p>
<h3>4) ZeuApp</h3>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/ZeuAPP1.5.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-73 alignleft" style="margin: 15px 10px; clear: both;" title="ZeuAPP1.5" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/ZeuAPP1.5.png?resize=309%2C154" alt="ZEUAPP" width="309" height="154"></a></p>
<p>Outro notável é o <a href="http://blog.zeusoft.net/zeuapp/">ZeuAPP</a> [4], só que esse só instala um de cada vez.</p>
<p>Pró: grande lista de softwares livres e grátis</p>
<p>Contra: instala um de cada vez</p>
<p>Licença: free (as in freedom and beer)</p>
<h3>5) SIP</h3>
<p><figure id="attachment_74" aria-describedby="caption-attachment-74" style="width: 257px" class="wp-caption alignright"><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/SIPsmall.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-74 " style="clear: both;" title="SmartInstallerPack" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/SIPsmall.jpg?resize=257%2C178" alt="SmartInstallerPack" width="257" height="178"></a><figcaption id="caption-attachment-74" class="wp-caption-text">Tela do Smart Installer Pack</figcaption></figure></p>
<p>Aí tem o <a href="http://smartinstallerpack.com/"><em>Smart Installer Pack</em></a> [5], que é um programa até grandinho (25mb) com uma lista boa de softwares, interface bonitinha, mas precisa instalar e deu uns problemas quando testei. E tem propagandas dentro dele.</p>
<p>Pró: interface bonitinha</p>
<p>Contra: deu uns paus (instalou o google chrome em romeno!)</p>
<p>Licença: free (as in beer)</p>
<h3>6) NINITE</h3>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/free-applications-in-Ninite_thumb1.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class="alignleft size-full wp-image-83" style="margin: 5px 14px;" title="free applications in Ninite" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/free-applications-in-Ninite_thumb1.png?resize=240%2C129" alt="" width="240" height="129"></a></p>
<p>Agora tem uns que são web, não precisa instalar, no <a href="http://www.ninite.com/"><em>Ninite</em></a> [6] por exemplo basta escolher os programas na página e baixar o instalador. Tem também uma versão paga com um modo offline útil para quem faz manutenção. Promete perceber se o sistema é 32 ou 64 bits.</p>
<p>Pró: não precisa instalar</p>
<p>Contra: a lista de programas não é muito grande, mas é o suficiente</p>
<p>Licença: free (as in beer), tem também versão paga</p>
<h3>7) AllMyApps</h3>
<p><figure id="attachment_84" aria-describedby="caption-attachment-84" style="width: 172px" class="wp-caption alignright"><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/apps-installed-by-Allmyapps_thumb1.png"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-84 " style="clear: both;" title="apps installed by Allmyapps" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/apps-installed-by-Allmyapps_thumb1.png?resize=172%2C240" alt="" width="172" height="240"></a><figcaption id="caption-attachment-84" class="wp-caption-text">Allmyapps baixando aplicativos</figcaption></figure></p>
<p>Outro web com uma lista maior de softwares é o <a href="http://allmyapps.com/"><em><em>Allmyapps</em></em></a> [7], funciona como o Ninite. Porém exige cadastro, mas dá para cadastrar por twitter, facebook, yahoo, openid &#8230; Tem separação para xp, vista, 7, e acredite, ubuntu 8.04, 8.10, 9.04 e 9.10!!</p>
<p>Algumas vezes dá problema se algum dos softwares já está instalado no micro, ou se um dos programas engasga no downloado ou na instalação e outros probleminhas.</p>
<p>Pró: não precisa instalar, lista grande de softwares</p>
<p>Contra: exige cadastro</p>
<p>Licença: free (as in beer)</p>
<p>Atualização:</p>
<h3>8)&nbsp; FreeApp</h3>
<p><a href="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/freeapplogobig.jpg"><img data-recalc-dims="1" loading="lazy" decoding="async" class="size-full wp-image-92 aligncenter" title="freeapplogobig" src="https://i0.wp.com/codexico.com.br/blog/wp-content/uploads/2010/05/freeapplogobig.jpg?resize=267%2C268" alt="" width="267" height="268"></a></p>
<p>Funciona como o AllMyApps,&nbsp; mas o <a title="FreeApp" href="http://www.freenew.net/index.html">FreeApp</a> [8] não exige cadastro, a lista de softwares é um&nbsp; pouco menor mas tem de tudo, bacaninha.</p>
<p>Pró: não precisa instalar, lista grande de softwares, não exige cadastro</p>
<p>Contra: &#8211;</p>
<p>Licença: free (as in beer)</p>
<hr>
<h2>Conclusão:</h2>
<p>Para a maioria dos casos serve o <span style="text-decoration: line-through;">Allmyapps</span> FreeApp.</p>
<p>Caso queira uma lista ainda melhor de softwares e um programa livre o melhor é o Zeuapp.</p>
<p>Se o Appsnap ainda estivesse sendo atualizado seria o melhor, pena que o desenvolvimento parou&nbsp; : (</p>
<p>[1] http://portableapps.com/</p>
<p>[2] http://pack.google.com/intl/en/pack_installer.html</p>
<p>[3] http://appsnap.genotrance.com/</p>
<p>[4] http://blog.zeusoft.net/zeuapp/</p>
<p>[5] http://www.smartinstallerpack.com/</p>
<p>[6] http://ninite.com/</p>
<p>[7] http://www.allmyapps.com</p>
<p>[8] http://www.freenew.net/index.html</p>
<p>Não conheço muitos usuários desses softwares então por favor se vc usa algum deles ou conhece outro, deixe um comentário.</p><p>The post <a href="https://codexico.com.br/blog/2010/05/30/como-instalar-varios-programas-de-uma-so-vez-no-windows/">Como instalar vários programas de uma só vez no Windows</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/05/30/como-instalar-varios-programas-de-uma-so-vez-no-windows/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">62</post-id>	</item>
		<item>
		<title>Como scannear e editar imagem no kubuntu 10.04</title>
		<link>https://codexico.com.br/blog/2010/05/27/como-scannear-e-editar-imagem-no-kubuntu-10-04/</link>
					<comments>https://codexico.com.br/blog/2010/05/27/como-scannear-e-editar-imagem-no-kubuntu-10-04/#respond</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Thu, 27 May 2010 21:16:56 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[gimp]]></category>
		<category><![CDATA[kubuntu]]></category>
		<category><![CDATA[scanner]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=57</guid>

					<description><![CDATA[<p>Preciso scanear um documento e depois fazer uma edição da imagem no Kubuntu 10.04. Beleza, passo 1: scanear. Outro dia tive q fazer a mesma coisa no w7 e foi só conectar a hp c3180 que o w7 reconheceu, aí só precisei escrever &#8220;scan&#8221; no menu que já apareceu o aplicativo para scanear. Vamos ver [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2010/05/27/como-scannear-e-editar-imagem-no-kubuntu-10-04/">Como scannear e editar imagem no kubuntu 10.04</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Preciso scanear um documento e depois fazer uma edição da imagem no Kubuntu 10.04.</p>
<p><strong>Beleza, passo 1: scanear.</strong><br />
Outro dia tive q fazer a mesma coisa no w7 e foi só conectar a hp c3180 que o w7 reconheceu, aí só precisei escrever &#8220;scan&#8221; no menu que já apareceu o aplicativo para scanear. Vamos ver como o kubuntu faz, conectei, reconheceu a impressora sem problema, vou scanear, epa, não tem programa para scanear. Devem ter cortado do cd para poupar espaço ( faz tempo que eu acho que a Canonical devia ter uma edição com mais programas intalados automaticamente ), como chamava o programa q escaneia mesmo? Vamos lá google&#8230;</p>
<p>Notícias novas [<a href="http://kubuntuforums.net/forums/index.php?topic=3104909.0">1</a>], parece que tem um aplicativo do kde4 para scanner, chamado &#8216;<em>skanlite</em>&#8216;, testado e aprovado, serve pra scannear direitinho.<br />
Outras opções são o &#8216;<em>xsane</em>&#8216; ( era esse q eu havia esquecido o nome ) e o &#8216;<em>gimp2.0-quiteinsane</em>&#8216;, a vantagem do último é que é integrado ao GIMP, testei e cumpre a função também.</p>
<p><em>Conclusão:</em> qualquer um dos 3 softwares faz o básico, que é só o que preciso e usei.</p>
<p><strong>Não doeu nada, passo 2: Editar a imagem.</strong></p>
<p>Aiaiai, não vem mais o GIMP nos ubuntus, e nenhum dos softwares básicos (okular, gwenview, f-spot) editam as imagens, até servem para o crud (cortar, rodar, u?, dimensionar), mas para algo mais só conheço o GIMP mesmo. Pena q o tuxpaint não abre uma imagem, acho que serviria para várias coisas.</p>
<p>Então, como já instalei o gimp2.0-quiteinsane, vou de gimp mesmo.</p>
<p>Quase bom, quero colocar uma setinha na imagem mas com o lápis ficou muito feio (bem q o gimp podia ter uma maneira fácil de colocar clip-art como no tuxpaint). ¿Será que tem algo no repositório? Hehehe, tem um pacote chamado &#8216;openclipart-png&#8217;, depois de instalado as imagens ficam em &#8216;/usr/share/openclipart/png/&#8217;, mas são bem feinhas. Lembrei de um site que tem ícones grátis e diferente da maioria dos sites de ícones, estes são bonitos: <a href="http://icons.mysitemyway.com/">Icons Etc</a> [2]. Problema resolvido.</p>
<p>É, até que não foi difícil, acho que vale uma blogada, faz tempo que não escrevo nada. ¿Alguma opinião ou dica de outros programas?</p>
<p>[1] http://kubuntuforums.net/forums/index.php?topic=3104909.0<br />
[2] http://icons.mysitemyway.com/</p><p>The post <a href="https://codexico.com.br/blog/2010/05/27/como-scannear-e-editar-imagem-no-kubuntu-10-04/">Como scannear e editar imagem no kubuntu 10.04</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/05/27/como-scannear-e-editar-imagem-no-kubuntu-10-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">57</post-id>	</item>
		<item>
		<title>Tutorial simples: Como usar o git e o github</title>
		<link>https://codexico.com.br/blog/2010/03/11/tutorial-simples-como-usar-o-git-e-o-github/</link>
					<comments>https://codexico.com.br/blog/2010/03/11/tutorial-simples-como-usar-o-git-e-o-github/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Thu, 11 Mar 2010 18:00:08 +0000</pubDate>
				<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[github]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=34</guid>

					<description><![CDATA[<p>9 passos para usar o git com o github, do ssh ao push, passando por fork e commit</p>
<p>The post <a href="https://codexico.com.br/blog/2010/03/11/tutorial-simples-como-usar-o-git-e-o-github/">Tutorial simples: Como usar o git e o github</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Ultimamente estou envolvido em vários projetos ao mesmo tempo com várias equipes diferentes, então controle de versão é essencial.</p>
<p>Segue um manualzinho básico para iniciar com o git, espero atualizar e complementar este passo-a-passo com mais exemplos logo.</p>
<p>O git serve para versionamento local, você pode compartilhar de algumas maneiras, a mais fácil é com serviços online. Neste exemplo vou usar o <a title="github - Social Coding" href="http://github.com" target="_blank" rel="noopener">github</a>, testei também o <a title="Project Locker" href="http://projectlocker.com/" target="_blank" rel="noopener">projectlocker</a>, que dá repositórios private grátis,&nbsp; mas não gostei. Outro que parece legal é o <a title="Codaset" href="http://codaset.com/" target="_blank" rel="noopener">Codaset</a>, ainda não testei.</p>
<h3>1) Instalar git</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ sudo apt-get install git-core</pre>
<p>É necessário gerar uma chave ssh e fazer um cadastro em algum repositório git. ( Esta etapa não é exatamente sobre o git, mas sobre a segurança dos repositórios. )</p>
<p>Confira se vc já tem alguma chave com um &#8220;ls ~/.ssh/&#8221;, se já existir uma você pode utilizá-la ou gerar uma nova:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ssh-keygen -t rsa -C "comment"</pre>
<p>&#8220;comment&#8221; é só um lembrete para saber do que se trata a chave, normalmente usa-se o seu nome de usuário do serviço que vai usar, por exemplo o github.</p>
<p>Falando nisso, está na hora de criar um usuário lá (<a href="http://github.com">http://github.com</a>), vai lá que eu espero&#8230;</p>
<p>Depois de logado vá para <a href="https://github.com/account">https://github.com/account</a> e clique em &#8220;SSH Public Keys&#8221; e &#8220;add another public key&#8221;. A cópia da chave precisa ser exata(eu ia escrever que &#8216;precisa ser precisa&#8217; mas é feio né), então pode-se fazer assim:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">sudo apt-get install xclip
cat ~/.ssh/id_rsa.pub | xclip -sel clip</pre>
<p>Aí é só colar com um Ctrl+V normal. Agora já dá para se comunicar com o github:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">ssh git@github.com</pre>
<p>Vai aparecer &#8220;ERROR: Hi codexico! You&#8217;ve successfully authenticated, but GitHub does not provide shell access&#8221;, não se assuste com o ERROR, o que interessa é que o github te reconheceu. Qualquer duvida tem o help do github: <a title="Generating SSH keys (Linux)" href="http://help.github.com/linux-key-setup/" target="_blank" rel="noopener">Generating SSH keys (Linux).</a></p>
<p>Por padrão o git vai pegar o usuário do sistema, para que seu nome de usuário do github apareça corretamente use os comandos:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">git config --global user.name "Your Name"
git config --global user.email codexico@gmail.com</pre>
<h3>2) Criar Projeto no github</h3>
<p>1) Podemos criar um novo projeto ou usar um existente. Para criar um novo vá até o github e no alto da página clique em &#8220;Dashboard&#8221; e depois em &#8220;New Repository&#8221;.</p>
<p>Crie um espaço para o projeto no comnputador:</p>
<p><code></code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ mkdir nomedoprojeto
$ cd nomedodiretorio</pre>
<p><code></code></p>
<p><code></code></p>
<p>2) Iniciar um git neste diretório:</p>
<p><code></code></p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ git init</pre>
<p><code></code></p>
<p><code></code></p>
<p>Saída do comando:</p>
<p><code>Initialized empty Git repository in /nomedodiretorio/.git/</code></p>
<p>Deve aparecer um diretorio oculto <strong>.git</strong>, neste <strong>.git</strong> ficam as configurações que serão usadas para este projeto.</p>
<p>Por exemplo:</p>
<p><code>$ ls .git<br />
branches config description FETCH_HEAD HEAD hooks index info logs<br />
objects refs</code></p>
<p>3) Adicionar o repositório, neste exemplo vou usar um que criei para este tutorial, pode ser também o repositório criado no passo 1, o endereço fica na página do projeto (neste caso https://github.com/codexico/tutorial-github):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ git remote add origin git@github.com:codexico/tutorial-github.git</pre>
<p>Formato do comando:</p>
<p>&#8220;git remote add&#8221; adiciona um repositório ao git que foi iniciado neste diretório, &#8220;origin&#8221; é o apelido para o projeto, &#8220;git@github.com:codexico/tutorial-github.git&#8221; é o endereço do projeto.</p>
<p>Resultado:(apareceu a parte <em>[remote &#8220;origin&#8221;]</em>)</p>
<p><code>$ cat .git/config<br />
[core]<br />
repositoryformatversion = 0<br />
filemode = true<br />
bare = false<br />
logallrefupdates = true<br />
[remote "origin"]<br />
url = git@github.com:codexico/tutorial-github.git<br />
fetch = +refs/heads/*:refs/remotes/origin/*</code></p>
<p>4) Baixar(pull=puxar) o projeto:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ git pull origin master</pre>
<p>Formato do comando:</p>
<p><code>git pull apelidoDaOrigem apelidoParaDestino</code></p>
<p>Saída do comando:</p>
<p><code>remote: Counting objects: 52278, done.<br />
remote: Compressing objects: 100% (10917/10917), done.<br />
remote: Total 52278 (delta 40975), reused 51715 (delta 40669)<br />
Receiving objects: 100% (52278/52278), 8.33 MiB | 189 KiB/s, done.<br />
Resolving deltas: 100% (40975/40975), done.<br />
From git@github.com:codexico/tutorial-github.git<br />
* branch  master -&gt; FETCH_HEAD</code></p>
<h3>3) Usar o git</h3>
<p>Exemplo (escolha um nome diferente para o arquivo teste):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ touch testegit</pre>
<p>1) Adicionar as alterações:</p>
<p>&#8211; Podemos adicionar somente uma alteração:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ git add testegit</pre>
<p>&#8211; Ou adicionar todas as alterações:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">$ git add .</pre>
<p>Neste passo as alterações ainda não estão sob o controle de versão, elas somente foram adicionadas para quando der um commit.</p>
<p>2) Comitar as alterações:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">$ git commit -m "mensagem teste para o tutorial"</pre>
<p>É obrigatório acrescentar uma mensagem.</p>
<p>Saída do comando:</p>
<p><code>[master de2f5ce] teste para o tutorial<br />
1 files changed, 1 insertions(+), 0 deletions(-)<br />
create mode 100644 testegit</code></p>
<p>Agora as alterações foram adicionadas ao controle de versão. Mas ainda estão somente na máquina local.</p>
<p>3) Enviar(push=empurrar) as alterações:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">$ git push origin master</pre>
<p>Saída do comando:</p>
<p><code>Counting objects: 4, done.<br />
Delta compression using up to 2 threads.<br />
Compressing objects: 100% (2/2), done.<br />
Writing objects: 100% (3/3), 288 bytes, done.<br />
Total 3 (delta 1), reused 0 (delta 0)<br />
To git@github.com:codexico/tutorial-github.git<br />
3be4c21..de2f5ce&nbsp; master -&gt; master</code></p>
<p>Se durante o tempo em que fez o pull e o push outra pessoa que também participe do projeto fez alterações o push será rejeitado. Então é necessário atualizar o projeto local antes de enviar novas alterações.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">$ git fetch origin</pre>
<p>Atualizar antes de enviar é uma boa prática a ser seguida para quem usa svn ou cvs e é obrigatória no git.</p>
<p>4)Pronto, confira as alterações no navegador acessando o endereço do projeto (<a href="http://github.com/codexico/tutorial-github">http://github.com/codexico/tutorial-github</a> neste exemplo).</p>
<p>Dica final: para que não precise digitar sempre a senha do ssh siga os passos desse link: <a href="http://help.github.com/working-with-key-passphrases/">http://help.github.com/working-with-key-passphrases/</a></p>
<p>Atualizado em 09/09/2010, mudei o repositório e adicionei instruções para gerar a chave ssh.</p><p>The post <a href="https://codexico.com.br/blog/2010/03/11/tutorial-simples-como-usar-o-git-e-o-github/">Tutorial simples: Como usar o git e o github</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/03/11/tutorial-simples-como-usar-o-git-e-o-github/feed/</wfw:commentRss>
			<slash:comments>52</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">34</post-id>	</item>
		<item>
		<title>apt-get install todos os compactadores e descompactadores no linux</title>
		<link>https://codexico.com.br/blog/2010/02/07/apt-get-install-todos-os-compactadores-e-descompactadores-no-linux/</link>
					<comments>https://codexico.com.br/blog/2010/02/07/apt-get-install-todos-os-compactadores-e-descompactadores-no-linux/#comments</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 19:14:15 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[apt-get linux zip rar]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=21</guid>

					<description><![CDATA[<p>Sempre que insatalo um sistema novo como o Ubuntu ficam faltando alguns detalhes, um deles é o suporte a todos os formatos de zip, além do gzip e bz2. Instale tudo que precisa para compactar e descompactar em sistemas derivados do debian, como kubuntu, mint&#8230; sudo apt-get install p7zip-full p7zip-rar lzma lzma-dev rar unrar-free p7zip [&#8230;]</p>
<p>The post <a href="https://codexico.com.br/blog/2010/02/07/apt-get-install-todos-os-compactadores-e-descompactadores-no-linux/">apt-get install todos os compactadores e descompactadores no linux</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Sempre que insatalo um sistema novo como o Ubuntu ficam faltando alguns detalhes, um deles é o suporte a todos os formatos de zip, além do gzip e bz2.</p>
<p>Instale tudo que precisa para compactar e descompactar em sistemas derivados do debian, como kubuntu, mint&#8230;</p>
<pre class="EnlighterJSRAW" data-enlighter-language="bash">sudo apt-get install p7zip-full p7zip-rar lzma lzma-dev rar unrar-free p7zip ark ncompress</pre>
<p>Assim devem aparecer também os menus de contexto nos gerenciadores de arquivo.</p><p>The post <a href="https://codexico.com.br/blog/2010/02/07/apt-get-install-todos-os-compactadores-e-descompactadores-no-linux/">apt-get install todos os compactadores e descompactadores no linux</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/02/07/apt-get-install-todos-os-compactadores-e-descompactadores-no-linux/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">21</post-id>	</item>
		<item>
		<title>css layout vertical center align</title>
		<link>https://codexico.com.br/blog/2010/01/23/css-layout-vertical-center-align/</link>
					<comments>https://codexico.com.br/blog/2010/01/23/css-layout-vertical-center-align/#respond</comments>
		
		<dc:creator><![CDATA[codexico]]></dc:creator>
		<pubDate>Sat, 23 Jan 2010 05:17:58 +0000</pubDate>
				<category><![CDATA[css]]></category>
		<category><![CDATA[layout]]></category>
		<guid isPermaLink="false">http://codexico.com.br/blog/?p=12</guid>

					<description><![CDATA[<p>Exemplos para alinhar verticalmente com css.</p>
<p>The post <a href="https://codexico.com.br/blog/2010/01/23/css-layout-vertical-center-align/">css layout vertical center align</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Melhores exemplos de como centralizar verticalmente um conteúdo no html com css tableless:</p>
<h4><a rel="nofollow" href="http://www.vdotmedia.com/demo/css-vertically-center.html">Vdot Media &#8211; Demo &#8211; Vertically center content with CSS</a></h4>
<h4><a rel="nofollow" href="http://www.pmob.co.uk/pob/vertical-center1.htm">Centered Element of unknown height and width</a></h4>
<h4><a rel="nofollow" href="http://www.jakpsatweb.cz/css/priklady/vertical-horizontal-align-valid-solution-en.html">Vertical and horizontal centering in valid CSS</a></h4>
<h4><a rel="nofollow" href="http://murphy.cz/victoria-s-vertical-centering/test-page/">Victoria&#8217;s Vertical Centering &#8211; Test Page</a></h4>
<h4><a rel="nofollow" href="http://www.maujor.com/tutorial/centrar-vertical/comhack.html">Centralizar verticalmente com CSS</a></h4>
<p>Ou todos nesse link:</p>
<p><a title="http://delicious.com/codexico/align+css+center+layout+vertical" href="http://delicious.com/codexico/align+css+center+layout+vertical" target="_blank" rel="noopener">http://delicious.com/codexico/align+css+center+layout+vertical</a></p>
<p>Cada um tem seus problemas, cada caso é um caso.</p>
<p>O primeiro por exemplo não funciona com doctype xhtml, só html4. E pra alinhar horizontalmente é só incluir um text-align:center;</p><p>The post <a href="https://codexico.com.br/blog/2010/01/23/css-layout-vertical-center-align/">css layout vertical center align</a> first appeared on <a href="https://codexico.com.br/blog">codexico</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://codexico.com.br/blog/2010/01/23/css-layout-vertical-center-align/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">12</post-id>	</item>
	</channel>
</rss>
