<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>denicostadsc.com</title>
    <link href="http://deniscostadsc.com/"/>
    <updated>2026-08-09T18:00:53+00:00</updated>
    <id>http://deniscostadsc.com/</id>
    <author>
        <name>Denis Costa</name>
        <email>deniscostadsc@gmail.com</email>
    </author>

    
        <entry>
            <id>http://deniscostadsc.com/career/2015/06/27/nunca-pare-de-mandar-curriculo</id>
            <title>Nunca pare de mandar currículo</title>
            <link type="text/html" href="http://deniscostadsc.com/career/2015/06/27/nunca-pare-de-mandar-curriculo.html"/>
            <updated>2015-06-27T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;Mandar currículos, normalmente, é sinônimo de desemprego. Mas nesse texto vou 
mostrar como usar essa prática a seu favor mesmo empregado, podendo testar o
mercado que você trabalha, validar se o seu salário está na média praticada
pelo mercado e muito mais.&lt;/p&gt;

&lt;h3 id=&quot;síndrome-de-embraer&quot;&gt;Síndrome de Embraer&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;OBS: Eu nunca ouvi o termo “Síndrome de Embraer”. Aparentemente eu inventei.
Mas se você quiser usar em um estudo sociológico ou algo do gênero fique a
vontade. =D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em São José dos Campos, cidade onde moro, tem uma fábrica gigante da Embraer.
Que pra quem não sabe é uma das maiores empresas da indústria da aviação do
mundo. A Embraer costuma pagar muito bem seus funcionários. Do engenheiro até
os empregados das linhas de montagem. Mas alguns dos cargos que existem lá,
principalmente do chão de fábrica não existem em outras empresa. Pelo menos não
no Brasil.&lt;/p&gt;

&lt;p&gt;Como toda empresa, a Embraer já passou por crises, e precisou demitir muitos
dos funcionários. E vários desses funcionários não perceberam que viviam em uma
bolha. O conhecimento que eles exerciam lá não seria muito útil em outras
empresas. E provavelmente não vão conseguir outro emprego com um salário nem
próximo do que recebiam na Embraer.&lt;/p&gt;

&lt;p&gt;Amigos meus já me falaram de histórias de seus pais e amigos que entraram em
depressão depois de passar por isso.&lt;/p&gt;

&lt;p&gt;A Embraer, é apenas um exemplo. Mas esse tipo de bolha infelizmente não é raro.&lt;/p&gt;

&lt;h3 id=&quot;fique-atento-às-vagas-nas-empresas-que-você-admira&quot;&gt;Fique atento às vagas nas empresas que você admira&lt;/h3&gt;

&lt;p&gt;Pra saber o que o mercado tem cobrado, a coisa mais fácil a se fazer é
acompanhar as vagas nas empresas que mais se destacam no mercado que você
gostaria de trabalhar. Além de não ter o trabalho (que trabalho duro, né?) de
mandar currículos, essas vagas já te dão um bom indício do que o mercado está
exigindo dos empregados hoje em dia.&lt;/p&gt;

&lt;p&gt;E obviamente, várias dessas vagas vão pedir conhecimento que você não domina.
Esse é um bom indicador do que você precisa para se manter atualizado e não vir
a sofrer da “Síndrome de Embraer”.&lt;/p&gt;

&lt;h3 id=&quot;seu-currículo-é-bom-o-suficiente&quot;&gt;Seu currículo é bom o suficiente?&lt;/h3&gt;

&lt;p&gt;Mandar currículo para vagas nessas empresas, mesmo que você não queira
mudar de emprego, vai validar as suas suposições sobre a sua empregabilidade.&lt;/p&gt;

&lt;p&gt;A um certo tempo,
&lt;a href=&quot;/offtopic/2014/05/24/como-vim-parar-na-alemanha.html&quot; title=&quot;Post sobre como fui parar na alemanha&quot;&gt;eu queria fazer intercâmbio&lt;/a&gt;,
e não tinha currículo em inglês. Resolvi traduzir o meu e testar em uma
grande multinacional da minha área. Fui chamado para fazer uma primeira
entrevista. Obviamente eu falei não, pois eu queria mesmo era fazer o tal do
intercâmbio. Mas essa ação que me custou 10 minutos, já validou se o meu
currículo em inglês era razoavelmente legível e inspirava interesse.&lt;/p&gt;

&lt;h3 id=&quot;o-seu-salário-é-justo&quot;&gt;O seu salário é justo?&lt;/h3&gt;

&lt;p&gt;Falar de dinheiro é tabu pra muita gente e eu pretendo falar de maneira mais
profunda sobre isso em outro blog post. Mas geralmente, não saber o seu valor
de mercado indica de que você está sendo mal pago.&lt;/p&gt;

&lt;p&gt;Ir para a segunda fase de um processo seletivo, já indica que sua atual
experiência não é muito diferente da necessidade do mercado. Mas também vai te
ajudar a validar o seu salário em relação ao que o mercado está pagando.&lt;/p&gt;

&lt;h3 id=&quot;vai-que-cola&quot;&gt;Vai que cola…&lt;/h3&gt;

&lt;p&gt;Todos os argumentos que usei neste texto independem de você estar procurando
uma nova oportunidade ou não. Mas e se uma dessas empresas te oferecer uma
oportunidade irrecusável? Negociar quando você não precisa te dá enormes
vantagens. Você não está desesperado, pode negociar com calma e chegar em um
ótimo acordo.&lt;/p&gt;

&lt;h3 id=&quot;e-se-meu-chefe-descobrir&quot;&gt;E se meu chefe descobrir?&lt;/h3&gt;

&lt;p&gt;Muitas empresas veem com maus olhos seus funcionários participando de processos
seletivos em outras empresas. Se o seu chefe vier falar com você, eu recomendo
falar algumas dessas verdades:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Você não tem interesse em sair, mas quer testar o mercado.&lt;/li&gt;
  &lt;li&gt;Você não tem interesse em sair, mas está fazendo uma pesquisa salarial.&lt;/li&gt;
  &lt;li&gt;Você não tem interesse em sair, mas está procurando vagas pra ver que
tecnologias estão sendo usadas por aí.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso demostra que você não quer ficar para trás em relação ao que está
rolando nas outras empresas/startups. E faz de você um bom empregado.&lt;/p&gt;

&lt;h3 id=&quot;conclusões&quot;&gt;Conclusões&lt;/h3&gt;

&lt;p&gt;Manter um currículo atualizado, uma boa rede de contatos e estar atento ao
mercado te dá vantagens na hora de negociar um aumento, saber que nova
tecnologia estudar, ou mesmo trocar de emprego.&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/programming/2014/08/24/dicas-uteis-de-git</id>
            <title>Dicas úteis de git</title>
            <link type="text/html" href="http://deniscostadsc.com/programming/2014/08/24/dicas-uteis-de-git.html"/>
            <updated>2014-08-24T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;Neste artigo vou falar de algumas dicas para ajudar no seu aprendizado sobre
git e também para melhorar o seu wokflow com git no dia-a-dia.&lt;/p&gt;

&lt;h3 id=&quot;pro-git-em-português&quot;&gt;Pro Git em português&lt;/h3&gt;

&lt;p&gt;Um bom começo para os iniciantes em git é o livro
&lt;a href=&quot;http://www.amazon.com/gp/product/1430218339?ie=UTF8&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1430218339&amp;amp;linkCode=as2&amp;amp;tag=git-sfconservancy-20&quot; title=&quot;Pro Git na Amazon&quot;&gt;Pro Git&lt;/a&gt; escrito por
Scott Chacon. Algumas pessoas não sabem, mas esse livro é distribuído sob
Licença Creative Commons. E foi totalmente
&lt;a href=&quot;http://git-scm.com/book/pt-br&quot; title=&quot;Livro Pro Git online em português.&quot;&gt;traduzido para o português&lt;/a&gt; pela
comunidade.&lt;/p&gt;

&lt;h3 id=&quot;alterar-o-comportamento-do-mv-e-do-rm&quot;&gt;Alterar o comportamento do mv e do rm&lt;/h3&gt;

&lt;p&gt;Umas das coisas mais chatas que acontece comigo quando quero remover um arquivo
de um projeto pela linha de comando, e digito &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mv&lt;/code&gt; ao invés de &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Quando isso acontece vc tem que fazer dois passos a mais.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;mv &lt;/span&gt;file &lt;span class=&quot;nb&quot;&gt;dir&lt;/span&gt;/file
git &lt;span class=&quot;nb&quot;&gt;rm &lt;/span&gt;file
git add &lt;span class=&quot;nb&quot;&gt;dir&lt;/span&gt;/file&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;O que fiz foi alterar o comportamento do rm do sistema colocando no meu
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt; a seguinte função:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;function &lt;/span&gt;mv_git &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;mv_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;which &lt;span class=&quot;nb&quot;&gt;mv&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    git &lt;span class=&quot;nb&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt; 2&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$mv_path&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;E um alias:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;alias mv&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;mv_git&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Agora ao mover um arquivo, a função primeiro tenta remover usando &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv&lt;/code&gt;
se não der certo ela executa simplesmente &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mv&lt;/code&gt;. Para adicionar o mesmo
comportamento ao  &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm&lt;/code&gt;, adicione também a função abaixo no seu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.bashrc&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;function &lt;/span&gt;rm_git &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nv&quot;&gt;rm_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;which &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
    git &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt; 2&amp;gt; /dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$rm_path&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$*&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Com a respectiva alias:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;alias rm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&apos;rm_git&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;h3 id=&quot;git-log-mais-bonito&quot;&gt;Git log mais bonito&lt;/h3&gt;

&lt;p&gt;A saída do &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git log&lt;/code&gt; padrão, grande parte das vezes, não ajuda muito. Por
isso usei a
&lt;a href=&quot;http://fredkschott.com/post/2014/02/git-log-is-so-2005/&quot; title=&quot;Git log is *so* 2005.&quot;&gt;dica do Fred Schott&lt;/a&gt; e adicionei essa alias ao meu &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitconfig&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;usando-git-hooks-para-tarefas-repetitivas&quot;&gt;Usando Git hooks para tarefas repetitivas&lt;/h3&gt;

&lt;p&gt;Caso você tenha alguma tarefa que precisa ser executada a cada commit, ou toda
vez que você faz um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;push&lt;/code&gt; uma boa forma de resolver esse problema é com
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Git hooks&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eu, por exemplo, adicionei um hook para analisar o código que vou “commitar”.
Caso o código tenha algum problema, eu não consigo fazer o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;commit&lt;/code&gt; até
consertá-lo.&lt;/p&gt;

&lt;p&gt;Saber quais hooks existem pode ajudar quando você se deparar com uma situação
como a que descrevi. &lt;a href=&quot;http://githooks.com/&quot; title=&quot;Site sobre Git hooks&quot;&gt;Esse site&lt;/a&gt;
reúne artigos informações e projetos relacionados aos hooks dos Git.&lt;/p&gt;

&lt;h3 id=&quot;gitignore-global&quot;&gt;Gitignore global&lt;/h3&gt;

&lt;p&gt;Para quem programa em Python, é praticamente certo que não se quer arquivos
compilados (com extensão .pyc) no seu repositório. Mesmo assim não é raro você
encontrar esse tipo de arquivo em algum repositório.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema eu criei um arquivo .gitignore_global (mas pode ser
qualquer nome) com todos as extensões que eu sei que sempre vou querer ignorar
e adicionei isso ao meu .gitconfig com o seguinte comando:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.excludesfile ~/.gitignore_global&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Eu espero que as dicas sejam úteis no dia-a-dia de vocês também.&lt;/p&gt;

&lt;p&gt;Abraço&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/programming/2014/06/15/o-basico-de-qualidade-de-codigo</id>
            <title>O básico de qualidade de código</title>
            <link type="text/html" href="http://deniscostadsc.com/programming/2014/06/15/o-basico-de-qualidade-de-codigo.html"/>
            <updated>2014-06-15T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;Qualidade de código não é algo opcional (pelo menos não deveria ser). Isso
deveria ser um requisito obrigatório em qualquer projeto. Mas por que tem
tanto código ruim no mercado? A resposta é simples: É muito difícil escrever
código bem feito. Leva-se tempo para aprender a se escrever um bom código. É
preciso errar, e sofrer com seus erros para melhorar.&lt;/p&gt;

&lt;p&gt;E quando se fala em qualidade de código, estamos falando de um coisa bem
ampla. Podemos falar sobre grau de acoplamento, taxa de cobertura de teste e
muitas outras coisas. Todas essas podem ser consideradas medidas de qualidade.&lt;/p&gt;

&lt;p&gt;Apesar de esse ser um assunto bem vasto, vou abordar uma das partes mais
simples, mas que está diretamente ligada à qualidade e que às vezes é
esquecida por boa parte dos programadores: A formatação de código. Usar
indentação corretamente não faz o seu código menos acoplado ou mais coeso. Mas
se você não se atentar a esses pequenos detalhes, o seu código pode virar uma
grande bola de neve.&lt;/p&gt;

&lt;p&gt;A aparência dos seu código fala muito sobre você como programador. Então neste
post vou falar algumas regras simples que uso no dia-a-dia como guia em todos
os meus projetos.&lt;/p&gt;

&lt;h3 id=&quot;1---use-uma-ferramenta-de-analise-estática&quot;&gt;1 - Use uma ferramenta de analise estática&lt;/h3&gt;

&lt;p&gt;Eu particularmente não vejo nenhuma boa razão para não usar ferramentas de
análise estática de código em todos os seus projetos. Existem ferramentas
open-source para fazer esse tipo de análise em praticamente todas as
linguagens mais usadas. &lt;a href=&quot;http://flake8.readthedocs.org/&quot; title=&quot;Link para
documentação do flake8.&quot;&gt;flake8&lt;/a&gt; para Python, &lt;a href=&quot;http://jshint.com/&quot; title=&quot;Link para documentação do jshint.&quot;&gt;jshint&lt;/a&gt; para Javascript,
&lt;a href=&quot;http://www.shellcheck.net/&quot; title=&quot;Link para site do shellcheck.&quot;&gt;shellcheck&lt;/a&gt; para
shell script, &lt;a href=&quot;http://csslint.net/&quot; title=&quot;Site do csslint.&quot;&gt;csslint&lt;/a&gt; para CSS e
muitos outras.&lt;/p&gt;

&lt;p&gt;Existem também serviços que fazem analise estática e geram ótimos relatórios
sobre o seu projeto. Serviços como o &lt;a href=&quot;https://landscape.io/&quot; title=&quot;Site do Landscape.&quot;&gt;Landscape&lt;/a&gt; para Python e o &lt;a href=&quot;https://codeclimate.com/&quot; title=&quot;Site do Code Climate.&quot;&gt;Code Climate&lt;/a&gt; para Ruby e Javascript (mas eles estão prestes a
lançar suporte a PHP e pretendem suportar em breve Coffe Script e Python).
Ambos são gratuitos para projetos com repositório público.&lt;/p&gt;

&lt;p&gt;Um ponto importante de padrões de formatação de código que são externos à
sua equipe, como os feitos por essas ferramentas e serviços, é que eles acabam
discussões inúteis de como dever ser formatado o código. Em Python, por
exemplo, é abraçar as convenções PEP8 e ser feliz.&lt;/p&gt;

&lt;h3 id=&quot;2---evite-linhas-longas&quot;&gt;2 - Evite linhas longas&lt;/h3&gt;

&lt;p&gt;Muitos programadores (eu inclusive) não gostam dos limites de tamanho de linha
que grande parte das ferramentas de lint impõe. Então é muito comum
desabilitar essa verificação.&lt;/p&gt;

&lt;p&gt;Mas isso não é motivo para se ter código com 220 caracteres por linhas (já
vi isso!). Aí você precisar rolar o editor de texto para o lado para poder ler
o código. Isso é inadmissível. Deixe o bom senso ser seu guia, mas defina um
tamanho máximo para você e/ou para a sua equipe.&lt;/p&gt;

&lt;p&gt;Como eu disse, não gosto muito do limite padrão da maioria das convenções,
que é de 79 (ou 80) linhas. Eu acho muito pouco. Então, normalmente uso 119
caracteres como limite de caracteres.&lt;/p&gt;

&lt;p&gt;Em python, quando você tem imports longos, como o exemplo abaixo, você você
pode agrupá-los, usando parenteses, e assim quebrar as linhas.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.template&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RequestContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TemplateDoesNotExist&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Agrupando os imports.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
3
4
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.template&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RequestContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TemplateDoesNotExist&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Você ainda pode usar uma formatação diferente (que por sinal é a &lt;a href=&quot;https://github.com/django/django/blob/master/django/views/defaults.py#L2&quot;&gt;formatação
original&lt;/a&gt;
desse código) dependendo da sua preferência e contexto. Mas recomendo que
escolha um e mantenha-o.&lt;/p&gt;

&lt;p&gt;Esse talvez seja a dica mais simples de seguir. Para ajudar a visualizar os
limites de colunas nas linhas, você pode configurar sua IDE/Editor de texto
para traçar uma linha mostrando esse limite.&lt;/p&gt;

&lt;h3 id=&quot;3---evite-escapar-o-caractere-de-fim-de-linha&quot;&gt;3 - Evite escapar o caractere de fim de linha&lt;/h3&gt;

&lt;p&gt;O problema anterior pode ser resolvido simplesmente quebrando a linha e
escapando o caractere de fim de linha. Mas antes de falar sobre isso, responda
a seguinte pergunta: Qual a diferença dos dois códigos a baixo?&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.template&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RequestContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; \ 
                            &lt;span class=&quot;n&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TemplateDoesNotExist&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;table class=&quot;rouge-table&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;gutter gl&quot;&gt;&lt;pre class=&quot;lineno&quot;&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.template&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RequestContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; \
                            &lt;span class=&quot;n&quot;&gt;loader&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TemplateDoesNotExist&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Nenhuma, aparentemente. Mas a maior diferença é que o primeiro código acusa
erro de sintaxe e o segundo executa normalmente.&lt;/p&gt;

&lt;p&gt;Olhando para os dois código não é possível perceber nenhuma diferença, mas o
primeiro tem um espaço depois do escape. Assim, caractere de fim de linha
não é mais escapado. Para o interpretador a segunda linhas é um statement
novo (e inválido). Por isso recebemos um erro de sintaxe. Um bug chato de achar
por que o caractere que causa problema, o espaço, não é visível.&lt;/p&gt;

&lt;p&gt;Esse isso deve ser evitado em qualquer linguagem.&lt;/p&gt;

&lt;p&gt;Eu sei que você pode configurar seu editor de texto para retirar os espaços
no fim das linhas ao salvar o texto. Mas mesmo assim prefiro evitar que esse
tipo de coisa aconteça, evitando quebrar linhas assim.&lt;/p&gt;

&lt;h3 id=&quot;4---não-misture-aspas-simples-e-duplas&quot;&gt;4 - Não misture aspas simples e duplas&lt;/h3&gt;

&lt;p&gt;Algumas linguagens, como Javascript e Python, aceitam aspas simple e duplas
para delimitar strings. Não use essa “feature”!&lt;/p&gt;

&lt;p&gt;Eu, particularmente, uso aspas simples sempre que possível (Javascript, Python)
e duplas quando necessário (C/C++, Java). Escolha uma e mantenha o padrão
em toda a sua base de código.&lt;/p&gt;

&lt;h3 id=&quot;5---evite-código-desnecessário&quot;&gt;5 - Evite código desnecessário&lt;/h3&gt;

&lt;p&gt;Essa regra é bem simples: Quando um código não precisar ser escrito, não o
escreva. Vejamos o código abaixo:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;anything&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;some&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;something_else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Não existe a necessidade de escrever aquele else. Pois se o código do if for
executado, a função retorna e nada mais ali dentro é executado. Sempre que você
tiver uma situação assim, escreva dessa forma:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;anything&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;some&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;something_else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Essa regra pode ser resumida em: “sem else depois de return.”&lt;/p&gt;

&lt;p&gt;Mas esse código ainda não está legal. Eu estou fazendo uma verificação
booleana para então retornar um booleano. Esse código pode ser melhorado e
ficar assim:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;anything&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;some&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;something_else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Essas pequenas melhorias, variam de caso para caso, mas mantenha na sua cabeça
o mantra: “código que não precisa ser escrito, não deve ser escrito”.&lt;/p&gt;

&lt;h3 id=&quot;6---seja-consistente-nos-retornos-das-funções&quot;&gt;6 - Seja consistente nos retornos das funções&lt;/h3&gt;

&lt;p&gt;Algumas linguagens dinâmicas, não obrigam o programador a declarar o tipo do
retorno das funções. Então, a mesma função pode retornar um array, uma string,
ou ainda um float. Evite isso e tenta manter a consistência da API que você
está desenvolvendo.&lt;/p&gt;

&lt;p&gt;Nos casos de comportamento errôneo é melhor lançar uma exceção. Para informar
explícitamente, que aquele comportamento da função não é o caso esperado.&lt;/p&gt;

&lt;p&gt;O único caso (que lembrei enquanto escrevia o post) que isso pode ser usado
como uma boa solução acho que pode fugir você esteja implementando um método
de busca, você pode retorna nulo (None, null, nil, etc. Dependendo da
linguagem) para o caso de não achar nenhum elemento durante a busca.&lt;/p&gt;

&lt;h3 id=&quot;7---escreva-as-regras&quot;&gt;7 - Escreva as regras&lt;/h3&gt;

&lt;p&gt;Uma coisa que realmente ajuda na manutenção dessas regras é você ter um
documento que agregue todas as regras. A Plataformatec tem publicado um
belíssimo &lt;a href=&quot;http://guidelines.plataformatec.com.br/&quot; title=&quot;Guide lines da
Plataformatec&quot;&gt;guideline&lt;/a&gt;. Recomendo a todos que leiam.&lt;/p&gt;

&lt;h3 id=&quot;conclusões&quot;&gt;Conclusões&lt;/h3&gt;

&lt;p&gt;Essas regras são apenas o início do que vem a ser um código bem escrito. Mas
elas não precisam ser seguidas de maneira cega. Use o bom senso. Crie
e compartilhe as suas, comente as minhas.&lt;/p&gt;

&lt;p&gt;O desenvolvimento de software é uma coisa viva e orgânica, suas premissas e
regras também devem ser. Sendo assim eu atualizarei esse post caso me lembre
de outra regra.&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/offtopic/2014/05/24/como-vim-parar-na-alemanha</id>
            <title>Como vim parar na Alemanha</title>
            <link type="text/html" href="http://deniscostadsc.com/offtopic/2014/05/24/como-vim-parar-na-alemanha.html"/>
            <updated>2014-05-24T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;A muito tempo eu tinha vontade de morar, pelo menos por um período, fora do Brasil. E esse ano de 2014 conseguir iniciar um intercâmbio de um ano, estagiando em Aachen, Alemanha. Uma pequena cidade universitária alemã.&lt;/p&gt;

&lt;p&gt;Nesse post vou falar sobre como foi esse processo até aqui. Como a intenção deste texto é ajudar a maior quantidade de pessoas possível, então vou falar detalhadamente sobre coisa que podem ser óbvias para algumas pessoas, mas não são para todos. Principalmente para quem nunca viajou para o exterior.&lt;/p&gt;

&lt;h3 id=&quot;a-semente&quot;&gt;A semente&lt;/h3&gt;

&lt;p&gt;Minha primeira oportunidade de morar fora foi com o programa do Governo Federal &lt;a href=&quot;http://www.cienciasemfronteiras.gov.br&quot; title=&quot;Site do Ciência sem Fronteiras&quot;&gt;Ciência sem Fronteiras&lt;/a&gt;. Logo no seu primeiro edital, a Inglaterra era o único país na época que não pedia o &lt;a href=&quot;www.ets.org/toefl&quot; title=&quot;Site oficial do TOEFL&quot;&gt;TOEFL&lt;/a&gt;, que para quem não conhece, é uma certificado de língua inglesa, mundialmente reconhecido. Como esse teste era bem caro pra mim na época, optei pela Inglaterra. O sonho ficou um pouco mais próximo quando recebi um email falando que eu tinha passado para a segunda fase do processo seletivo. Fiquei muito feliz! Mas esse mesmo email falava que eu tinha que enviar o meu certificado do TOEFL, em alguns dias. Data inviável para fazer o exame, que já estava fora de cogitação por causa do valor. E meus planos de morar um tempo fora não deram certo dessa vez. Mas a vontade de morar fora não passou, acho que na verdade só aumentou depois desse acontecimento.&lt;/p&gt;

&lt;h3 id=&quot;o-início&quot;&gt;O início&lt;/h3&gt;

&lt;p&gt;Antes de mais nada vou tentar explicar o que é a &lt;a href=&quot;http://www.aiesec.org.br/sobre/&quot; title=&quot;Site da AIESEC&quot;&gt;AIESEC&lt;/a&gt;. A AIESEC, de maneira bem resumida, é uma ONG comandada por estudantes de mais de 100 países que visa desenvolver atributos que você não aprende na faculdade, como empreendedorismo, liderança e etc.. E eles fazem isso possibilitando que outros estudantes façam intercâmbio para outros países onde a AIESEC também tem sede. O trabalho dos voluntários da AIESEC é garantir que esse ecossistema de intercâmbio funcione de maneira sustentável.&lt;/p&gt;

&lt;p&gt;Anos depois que a minha tentativa de estudar na Inglaterra tinha falhado, no meu último ano de faculdade, alguns membros da AIESEC foram à minha faculdade para falar quem eles são e o que eles fazem. Vi ali novamente uma ótima oportunidade de ir para o exterior. Então, alguns colegas da faculdade e eu decidimos nos inscrever para tentar participar do programa de intercâmbio da AIESEC.&lt;/p&gt;

&lt;h3 id=&quot;o-processo&quot;&gt;O processo&lt;/h3&gt;

&lt;p&gt;Diferente de serviços de intercâmbio fornecidos por agências, na AIESEC você não se candidata para ir para um país específico. Você se candidata para vagas em qualquer lugar do mundo. Mas é óbvio que você pode filtrar os países, e se aplicar apenas para vagas em países onde você deseja fazer intercâmbio. E até bom que se faça isso. Dependendo do país onde você vai, os custos ficam inviáveis. Em alguns casos as passagens são muito caras.&lt;/p&gt;

&lt;p&gt;Para quem trabalha com tecnologia sobram vagas no banco de dados da AIESEC, então não foi difícil arrumar entrevistas. Alguns escritórios da AIESEC entrevistam os candidatos antes de encaminhar o currículo para suas empresas cadastradas, mas isso não parece ser algo muito comum. O processo seletivo que cada um passa depende basicamente da empresa. Algumas empresas aplicam testes práticos online, provas, e claro entrevistas.&lt;/p&gt;

&lt;p&gt;Dois processos seletivos que eu iniciei, foram adiante. Um para a Finlândia e outro para a Alemanha. A primeira parte do processo da empresa finlandesa, foi um teste prático. A Code4Business, a empresa alemã, fez duas entrevistas em dias diferentes via Skype.&lt;/p&gt;

&lt;p&gt;Como eu fiz o processo seletivo das duas empresas ao mesmo tempo, eu fiquei muito indeciso para onde ir. Cada oportunidade tinha pontos fortes e fracos. Mas empresas resolveram me ajudar e decidiram por mim. A da Finlândia disse não, e a da Alemanha disse sim.&lt;/p&gt;

&lt;h3 id=&quot;os-documentos&quot;&gt;Os documentos&lt;/h3&gt;

&lt;p&gt;Depois da euforia de saber que passei no processo seletivo para uma empresa de outro país, vem o estresse com documentação. Alguns documentos você vai precisar independente do país. Como o passaporte. É fácil pedir o passaporte e o processo inteiro está descrito no &lt;a href=&quot;http://www.dpf.gov.br/servicos/passaporte/requerer-passaporte&quot; title=&quot;Site da Polícia Federal&quot;&gt;site da Polícia Federal&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A Alemanha, como muitos outros países, exige alguns documentos para permitir emitir vistos para estrangeiros. Não conheço o processo para outros tipos de visto. Mas eles tem um tipo de visto específico para estudantes que desejam estagiar na Alemanha. Vocês pode conseguir mais informações no site da &lt;a href=&quot;http://www.brasil.diplo.de/contentblob/2681184/Daten/707135/Merkblatt_Praktikum.pdf&quot; title=&quot;Pdf que explica o processo do visto para estágio na Alemanha.&quot;&gt;Representação Alemã no Brasil&lt;/a&gt;. Mas para pedir o visto você já precisa ter em mãos o contrato de trabalho, um comprovante da compra de um seguro de saúde e a permissão de trabalho. No meu caso a empresa e a AIESEC cuidaram disso para mim. Em outros caso não sei como funcionaria.&lt;/p&gt;

&lt;p&gt;Como brasileiros não precisam de visto para permanecer na Alemanha por menos de 90 dias, alguns intercambistas viajam sem visto e fazem o pedido de visto já dentro da Alemanha. Não sei o quão fácil é conseguir o visto dessa maneira. Conheço gente que venho dessa forma, mas eu decidi fazer o pedido no Brasil e esperar.&lt;/p&gt;

&lt;p&gt;Assim como no Brasil, quem trabalha precisa pagar impostos. Aqui até estagiários recolhem imposto. Mas aqui na Alemanha se o seus estágio é obrigatório para se graduar, você não precisa pagar nenhum impostos. Então você precisa de dois documentos da sua faculdade: Um afirma que que você tem um vínculo com a faculdade até quando esse vínculo existirá. O segundo afirma que seu estágio é obrigatório. Aconselho pedir esses documentos assim que começar a pensar a fazer o intercâmbio. Algumas faculdades demoram bastante para liberar documentos incomuns como esse. E se estiver em inglês pior ainda. Para facilitar, a &lt;a href=&quot;https://drive.google.com/folderview?id=0B-hKicxbbe0EczRkbFJGSU9sVUk&amp;amp;usp=sharing&quot; title=&quot;Templates de documentos necessários&quot;&gt;AIESEC possui templates&lt;/a&gt; de como devem ser o textos destes documentos.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Documento&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Onde conseguir?&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Passaporte&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Polícia Federal&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Visto Alemão&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Consulado/Embaixada Alemã&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Permissão de Trabalho&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Empresa/AIESEC de destino&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Seguro de saúde&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Empresa/AIESEC de destino&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Certidão de estágio obrigatório&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Faculdade&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Certidão de vínculo com a faculdade&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Faculdade&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Ainda são necessários alguns documentos da AIESEC, mas desses eu não vou comentar. Caso você decida fazer intercâmbio com eles, alguém de dentro com certeza pode explicar bem melhor que eu.&lt;/p&gt;

&lt;h3 id=&quot;as-passagens-e-a-organização-da-viagem&quot;&gt;As passagens e a organização da viagem&lt;/h3&gt;

&lt;p&gt;Como o visto alemão demora a sair, quando ele sai você tem que comprar suas passagens e organizar tudo da sua viagem em um tempo recorde. Devido a essa correria é complicado se atentar aos detalhes. Pra ajudar na minha organização peguei um check-list na internet e &lt;a href=&quot;https://github.com/deniscostadsc/trip-list/blob/master/trip-list-ptbr.md#check-list-para-viagens&quot; title=&quot;Link para o meu check-list de viagem.&quot;&gt;modifiquei para o meu caso&lt;/a&gt;. Me ajudou bastante.&lt;/p&gt;

&lt;p&gt;A compra das passagens foi uma dose de adrenalina. Tentei comprar as passagens no site da Lufthansa (que por sinal é horrível, em todos os aspectos), com um cartão de crédito (única forma de pagamento dentro do Brasil. E eles não parcelam), e este não tinha limite. Então para efetivamente comprar as passagens eu tinha que ligar para passar outro cartão de crédito com limite. Isso faltando 3 dias para a viagem. Mas no final consegui comprar as passagens.&lt;/p&gt;

&lt;p&gt;Aqui vai uma dica muito importante: Leia atentamente &lt;strong&gt;TODAS&lt;/strong&gt; as informaçoes do seu bilhete de viagem. Eu por exemplo descobri já em Frankfurt que não pegaria um segundo avião para Köln, e sim um trem. A pressa e a inexperiência foram minhas inimigas nesse momento, mas espero que não cometam o mesmo erro. Pois pra mim não teve maiores consequências, mas imprevistos podem acontecer e estragar sua viagem logo no início.&lt;/p&gt;

&lt;h3 id=&quot;a-viagem&quot;&gt;A viagem&lt;/h3&gt;

&lt;p&gt;Aqui o coração começa a apertar. Você se sente extremamente excitado, ansioso ao mesmo tempo que está muito triste por deixar pessoas que ama em outro continente.&lt;/p&gt;

&lt;p&gt;Para quem não está acostumado ou não gosta (meu caso) de viagens longas é bem cansativo. O voo demorou umas 10-11 horas até Frankfurt, daí fui de trem para Köln. O sistema de trem na Alemanha e na Europa como um todo é muito bom. Dá, por exemplo, pra pegar um trem daqui de Aachen direto para Paris.&lt;/p&gt;

&lt;h3 id=&quot;a-chegada&quot;&gt;A chegada&lt;/h3&gt;

&lt;p&gt;Quando cheguei tinha um membro da AIESEC para me acompanhar de Köln até Aachen. Durante os primeiros dias eu tive que me registrar na cidade, abrir uma conta no banco e outras coisa necessárias e sempre tinha um AIESECer comigo. Como a escolha de quem acompanha o novo trainee é feita baseada em quem estárá disponível na data (todos os voluntários da AIESEC também são estudantes), em poucos dias eu conheci gente de mais de 15 países.&lt;/p&gt;

&lt;h3 id=&quot;os-gastos&quot;&gt;Os gastos&lt;/h3&gt;

&lt;p&gt;Como falei anteriormente, a AIESEC não tem fins lucrativos por isso não cobre (e nem teria condições de cobrir) as despesas dos intercambistas, como passagens, aluguel e etc.. Então tenha em mente que haverão gastos. Para alguns, esses gastos podem pesar bastante no bolso.&lt;/p&gt;

&lt;p&gt;Fiz uma tabela para tentar dar uma ideia de quanto eu tive que gastar desde o início até chegar aqui. Não coloquei gastos com malas, roupas e outros acessórios. Até por que evitei ao máximo comprar essas coisas antes de viajar.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: right&quot;&gt;Item&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;Preço&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Passaporte&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;R$ 159,00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Visto Alemão&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;R$ 213,00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Taxa da AIESEC&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;R$ 1200,00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;Passagens de Avião&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;R$ 2948,28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;700 € (para despesas do primeiro mês)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;R$ 2317,00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;total&lt;/strong&gt;&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;R$ 6837,28&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;conclusões&quot;&gt;Conclusões&lt;/h3&gt;

&lt;p&gt;Para quem tem sérias restrições financeiras (que até poderia ser o meu caso), esse tipo de coisa pode ser bem complicado. Mas eu garanto que vale a pena. Talvez você deva tentar de outras formas, como o próprio Ciências sem Fronteiras que custeia praticamente tudo pra você fazer intercâmbio.&lt;/p&gt;

&lt;p&gt;O método é o que menos importa. O importante é conhecer o mundo.&lt;/p&gt;

&lt;p&gt;Abraços&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/programming/2014/02/01/login-com-curl</id>
            <title>Login com curl</title>
            <link type="text/html" href="http://deniscostadsc.com/programming/2014/02/01/login-com-curl.html"/>
            <updated>2014-02-01T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;As vezes queremos acessar uma aplicação web para procurar falhas, ou fazer alguma tipo de investigação minuciosa.&lt;/p&gt;

&lt;p&gt;Uma ferramenta de linha de comando que pode ser usada para fazer isso é o &lt;a href=&quot;http://curl.haxx.se/&quot; title=&quot;Site do curl&quot;&gt;curl&lt;/a&gt;. O uso mais básico do curl é fazer uma requisição em uma determinada URL.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl www.example.com

    &amp;lt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;doctype html&amp;gt;
    ...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;O resultado desse comando não mostra nenhuma informação muito útil, apenas o HTML da resposta. Uma das formas de visualisar os dados no cabeçalho &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616.html&quot; title=&quot;Especificação do HTTP/1.1&quot;&gt;HTTP&lt;/a&gt; é usando a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; www.example.com

    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; About to connect&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; to www.example.com port 80 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;   Trying 93.184.216.119...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Connected to www.example.com &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;93.184.216.119&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; port 80 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; GET / HTTP/1.1
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; User-Agent: curl/7.29.0
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Host: www.example.com
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Accept: &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    &amp;lt; HTTP/1.1 200 OK
    &amp;lt; Accept-Ranges: bytes
    &amp;lt; Cache-Control: max-age&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;604800
    &amp;lt; Content-Type: text/html
    &amp;lt; Date: Sat, 01 Feb 2014 22:37:35 GMT
    &amp;lt; Etag: &lt;span class=&quot;s2&quot;&gt;&quot;359670651&quot;&lt;/span&gt;
    &amp;lt; Expires: Sat, 08 Feb 2014 22:37:35 GMT
    &amp;lt; Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
    &amp;lt; Server: ECS &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;fll/0761&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &amp;lt; X-Cache: HIT
    &amp;lt; x-ec-custom-error: 1
    &amp;lt; Content-Length: 1270
    &amp;lt;
    &amp;lt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;doctype html&amp;gt;
    ...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Com a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-v&lt;/code&gt; são adicionadas no topo da saída do comando, informações sobre o que o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; está fazendo, precedidas de um “&lt;strong&gt;*&lt;/strong&gt;”; o cabeçalho da requisição, precedidas de um “&lt;strong&gt;&amp;gt;&lt;/strong&gt;” e o cabeçalho da resposta, precedias de um “&lt;strong&gt;&amp;lt;&lt;/strong&gt;”. Se forem feitas várias requisições, como quando há um redirecionamento, apareceram todas as operações de requisição e resposta. Isso pode ajudar na hora de procurar um bug em sua aplicação.&lt;/p&gt;

&lt;p&gt;A forma mais comum do fazer um login nos dias atuais é com um formulário HTML usando o método POST e, caso tenha sucesso identificando o usuário, salvando um cookie no browser do usuário.&lt;/p&gt;

&lt;p&gt;Para fazer uma requisição usando o método &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5&quot; title=&quot;Texto da especificação do HTTP/1.1 sobre o método POST&quot;&gt;POST&lt;/a&gt; com &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; basta indicar os dados que você deseja postar com a opção &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--data&lt;/code&gt;, e o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; infere qual método será usado. Para demostrar isso vou usar uma &lt;a href=&quot;https://limitless-harbor-1705.herokuapp.com&quot; title=&quot;Aplicação de teste&quot;&gt;aplicação de teste&lt;/a&gt; que tenho no &lt;a href=&quot;https://www.heroku.com/&quot; title=&quot;Site do Heroku.&quot;&gt;Heroku&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--data&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;email=denis@mail.com&amp;amp;password=123456&apos;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        http://limitless-harbor-1705.herokuapp.com/

    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; About to connect&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; to limitless-harbor-1705...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;   Trying 184.73.211.6...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Connected to limitless-harbor-1705.herokuapp...
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; POST / HTTP/1.1
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; User-Agent: curl/7.29.0
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Host: limitless-harbor-1705.herokuapp.com
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Accept: &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Content-Length: 45
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Content-Type: application/x-www-form-urlencoded
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; upload completely sent off: 45 out of 45 bytes
    &amp;lt; HTTP/1.1 302 FOUND
    &amp;lt; Content-Type: text/html&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf-8
    &amp;lt; Date: Sat, 01 Feb 2014 22:16:52 GMT
    &amp;lt; Location: http://limitless-harbor-1705.herokuapp.com/monkeys/
    &amp;lt; Server: gunicorn/18.0
    &amp;lt; Set-Cookie: &lt;span class=&quot;nv&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;HNAXNoQ9wwt3ISmlQ&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; HttpOnly&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/
    &amp;lt; Content-Length: 225
    &amp;lt; Connection: keep-alive
    &amp;lt;
    &amp;lt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;DOCTYPE HTML PUBLIC &lt;span class=&quot;s2&quot;&gt;&quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    ...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;É possível ver que a aplicação identificou corretamente o usuário e salvou um cookie no browser. Isso pode ser confirmado pelo campo &lt;strong&gt;Set-Cookie&lt;/strong&gt; no cabeçalho da resposta.&lt;/p&gt;

&lt;p&gt;A aplicação de teste que eu usei, depois do login com sucesso redireciona o usuário para uma listagem de todos os usuários do site. Por padrão o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; não segue para as páginas seguintes quando recebe um status code 302, de redirecionamento. Para que ele faça isso você deve passar a opção -L.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--data&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;email=denis@mail.com&amp;amp;password=123456&apos;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        http://limitless-harbor-1705.herokuapp.com/

    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; About to connect&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; to limitless-harbor-1705.herokuapp.com port 80 &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#0)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;   Trying 184.72.241.146...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Connected to limitless-harbor-1705.herokuapp.com &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;184.72.241.146&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;...
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; POST / HTTP/1.1
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; User-Agent: curl/7.29.0
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Host: limitless-harbor-1705.herokuapp.com
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Accept: &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Content-Length: 45
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Content-Type: application/x-www-form-urlencoded
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; upload completely sent off: 45 out of 45 bytes
    &amp;lt; HTTP/1.1 302 FOUND
    &amp;lt; Content-Type: text/html&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf-8
    &amp;lt; Date: Sat, 01 Feb 2014 22:38:45 GMT
    &amp;lt; Location: http://limitless-harbor-1705.herokuapp.com/monkeys/
    &amp;lt; Server: gunicorn/18.0
    &amp;lt; Set-Cookie: &lt;span class=&quot;nv&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;HNAXNoQ9wwt3ISmlQ...&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; HttpOnly&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/
    &amp;lt; Content-Length: 225
    &amp;lt; Connection: keep-alive
    &amp;lt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Ignoring the response-body
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Connection &lt;span class=&quot;c&quot;&gt;#0 to host limitless-harbor-1705.herokuapp.com left intact&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Issue another request to this URL: &lt;span class=&quot;s1&quot;&gt;&apos;http://limitless-harbor-1705...
    * Violate RFC 2616/10.3.3 and switch from POST to GET
    * Found bundle for host limitless-harbor-1705.herokuapp.com: 0x8f84fa0
    * Re-using existing connection! (#0) with host limitless-harbor-1705...
    * Connected to limitless-harbor-1705.herokuapp.com (184.72.241.146)...
    &amp;gt; GET /monkeys/ HTTP/1.1
    &amp;gt; User-Agent: curl/7.29.0
    &amp;gt; Host: limitless-harbor-1705.herokuapp.com
    &amp;gt; Accept: */*
    &amp;gt;
    &amp;lt; HTTP/1.1 401 UNAUTHORIZED
    &amp;lt; Content-Type: text/html; charset=utf-8
    &amp;lt; Date: Sat, 01 Feb 2014 22:38:45 GMT
    &amp;lt; Server: gunicorn/18.0
    &amp;lt; Content-Length: 2483
    &amp;lt; Connection: keep-alive
    &amp;lt;
    &amp;lt;!DOCTYPE html&amp;gt;
    ...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;É possível ver que o último status code é 401, que significa “Não autorizado”. Mas como isso pode acontecer se acabamos de logar e um cookie foi enviado para o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt;? Isso acontece por que, diferente dos browser, o &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; não salva essas informações para enviar para o servidor posteriormente. Você precisa fazer isso manualmente.&lt;/p&gt;

&lt;p&gt;O sintaxe básica para fazer uma requisição com cookie é:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl &lt;span class=&quot;nt&quot;&gt;--cookie&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;chave=valor&quot;&lt;/span&gt; www.example.com&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Isso pode ser um pouco chato, pois você tem que pegar os valores que quer na resposta, com o grep talvez, salvar em uma variável para poder usar em uma requisição posterior.&lt;/p&gt;

&lt;p&gt;Uma forma mais fácil de fazer isso é salvado o cabeçalho em um arquivo e reutilizando esse informação. O &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;curl&lt;/code&gt; já tem uma opção que salva essas informações em um arquivo. E a opção –cookie também aceita um arquivo como parâmetro.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;    curl &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--dump-header&lt;/span&gt; arquivo-com-o-header &lt;span class=&quot;nt&quot;&gt;--data&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;s1&quot;&gt;&apos;email=denis@mail.com&amp;amp;password=123456&apos;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        http://limitless-harbor-1705.herokuapp.com/

    curl &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cookie&lt;/span&gt;  arquivo-com-o-header &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        http://limitless-harbor-1705.herokuapp.com/monkeys/

    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; About to connect&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; to limitless-harbor-1705.herokuapp...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;   Trying 54.225.205.142...
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Connected to limitless-harbor-1705.herokuapp...
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; GET /monkeys/ HTTP/1.1
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; User-Agent: curl/7.29.0
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Host: limitless-harbor-1705.herokuapp.com
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Accept: &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; Cookie: &lt;span class=&quot;nv&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;HNAXNoQ9wwt3ISmlQ...&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
    &amp;lt; HTTP/1.1 200 OK
    &amp;lt; Content-Type: text/html&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;utf-8
    &amp;lt; Date: Sun, 02 Feb 2014 00:13:33 GMT
    &amp;lt; Server: gunicorn/18.0
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Added cookie &lt;span class=&quot;nv&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;HNAXNoQ9wwt3ISmlQ...;&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;domain...
    &amp;lt; Set-Cookie: &lt;span class=&quot;nv&quot;&gt;session&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;HNAXNoQ9wwt3ISmlQ...&lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt; HttpOnly&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/
    &amp;lt; Content-Length: 7132
    &amp;lt; Connection: keep-alive
    &amp;lt;
    &amp;lt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;DOCTYPE html&amp;gt;
    ...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Com base nisso é possível fazer login em qualquer site.&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/programming/2014/01/30/shell-script-ftw</id>
            <title>Shell Script FTW</title>
            <link type="text/html" href="http://deniscostadsc.com/programming/2014/01/30/shell-script-ftw.html"/>
            <updated>2014-01-30T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;Shell Script é sem dúvida uma das linguagens mais usadas no mundo. Independente da tecnologia usada Shell Script é onipresente. Apesar de ser raros projetos inteiros escritos em Shell Script (&lt;a href=&quot;https://github.com/trending?l=bash&quot; title=&quot;Projetos no Github escritos em Shell.&quot;&gt;raros, mas existem&lt;/a&gt;), é muito comum usar script para automatizar o build, rodar testes, instalar um software, executar tarefas programadas, e muitas outras coisas.&lt;/p&gt;

&lt;p&gt;Então muito importante aprendé-lo, pelo menos o básico. Neste post vou passar algumas referências para aprender/melhorar suas habilidade em Shell Script.&lt;/p&gt;

&lt;p&gt;O site &lt;a href=&quot;http://aurelio.net/shell/&quot; title=&quot;Site do Aurélio Marinho Jargas.&quot;&gt;Site do Aurélio Marinho Jargas&lt;/a&gt; é uma ótima referência em português para todos os níveis.&lt;/p&gt;

&lt;p&gt;O artigo &lt;a href=&quot;http://mywiki.wooledge.org/BashPitfalls&quot; title=&quot;Site que explica várioas truques do Shell Script.&quot;&gt;BashPitfalls&lt;/a&gt; demostra como reescrever alguns dos erros mais comuns que programadores cometem.&lt;/p&gt;

&lt;p&gt;Já o livro &lt;a href=&quot;http://tldp.org/LDP/abs/html/&quot; title=&quot;Advanced Bash-Scripting Guide em html.&quot;&gt;Advanced Bash-Scripting Guide&lt;/a&gt; (que tem uma versão em &lt;a href=&quot;http://www.tldp.org/LDP/abs/abs-guide.pdf&quot; title=&quot;Advanced Bash-Scripting Guide em pdf.&quot;&gt;pdf&lt;/a&gt;), é disparado uma das mais avançadas referências que conheço. É um material excelente.&lt;/p&gt;

&lt;p&gt;Usando essas referências você não terá mais problemas com Bash e afins.&lt;/p&gt;
</content>
        </entry>
 
        <entry>
            <id>http://deniscostadsc.com/meta/2014/01/26/novo-blog</id>
            <title>Novo blog</title>
            <link type="text/html" href="http://deniscostadsc.com/meta/2014/01/26/novo-blog.html"/>
            <updated>2014-01-26T00:00:00+00:00</updated>
            <content type="html">&lt;p&gt;Decidi mudar o meu antigo &lt;a href=&quot;http://deniscostadsc.blogspot.com&quot; title=&quot;Meu antigo blog&quot;&gt;blog&lt;/a&gt;, que eu mantinha no blogspot, para uma solução simples com &lt;a href=&quot;https://github.com/mojombo/jekyll&quot; title=&quot;Github do Jekyll&quot;&gt;Jekyll&lt;/a&gt; + &lt;a href=&quot;http://pages.github.com/&quot; title=&quot;Páginas estáticas servidas pelo Github&quot;&gt;GitHub pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Gostei bastante da facilidade e possibilidade de customização de praticamente tudo. Rápido, fácil e simples.&lt;/p&gt;

&lt;p&gt;Publicar um post é apenas um &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git push&lt;/code&gt;. Além de ser uma forma bem nerd de manter um blog é bem prático manter rascunhos e coisas do tipo. E usando &lt;a href=&quot;http://git-scm.com/&quot; title=&quot;Site oficial do Git&quot;&gt;Git&lt;/a&gt;, o backup do seus posts já está pronto. Isso é realmente lindo!&lt;/p&gt;

&lt;p&gt;Conforme o tempo permitir vou reblogar os posts antigos que fizerem sentido para poder ter tudo reunido em um só lugar e disponível para todos.&lt;/p&gt;
</content>
        </entry>
 
</feed>
