<?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>Elias Granja Jr.Elias Granja Jr. - Free as in free speech</title>
	<atom:link href="http://eliasgranja.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://eliasgranja.com</link>
	<description>Free as in free speech</description>
	<lastBuildDate>Mon, 30 Apr 2012 04:15:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Vulnerabilidade no acesso de administrador do WP</title>
		<link>http://eliasgranja.com/2012/04/vulnerabilidade-no-acesso-de-administrador-do-wp/</link>
		<comments>http://eliasgranja.com/2012/04/vulnerabilidade-no-acesso-de-administrador-do-wp/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 02:39:12 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=192</guid>
		<description><![CDATA[Hoje em dia é natural ter diferentes ambientes rodando uma mesma aplicação. Para o meu blog por exemplo mantenho três ambientes, &#8220;Desenvolvimento&#8221;(aka localhost), Homologação e Produção. Modificando um plugin para o wordpress neste final de semana, me deparei com um fato interessante. Estava logado no localhost(que está configurado como virtualhost apontando para eliasgranja.com) editando algumas [...]]]></description>
			<content:encoded><![CDATA[<p><center><img class="aligncenter size-medium wp-image-217" title="wordpress-website-hacked-by-hackers" src="http://eliasgranja.com/wp-content/uploads/2012/04/wordpress-website-hacked-by-hackers-300x170.jpg" alt="" width="300" height="170" /></center></p>
<p>Hoje em dia é natural ter diferentes ambientes rodando uma mesma aplicação. Para o meu blog por exemplo mantenho três ambientes, &#8220;Desenvolvimento&#8221;(aka localhost), Homologação e Produção.</p>
<p>Modificando um plugin para o wordpress neste final de semana, me deparei com um fato interessante. Estava logado no localhost(que está configurado como virtualhost apontando para eliasgranja.com) editando algumas configurações. Decidi conferir se as mudanças batiam com os settings de produção. Estava &#8220;deslogado&#8221; do ambiente, mas resolvi acessar diretamente pela URL de administração. Por algum motivo estranho consegui entrar diretamente na seção de administrador.  Acreditando fielmente que eu estava ficando doido acessei meu site no Chrome para fazer um teste. Garanti que não estava logado em produção, liguei o localhost e me loguei. Logo após desliguei o apache, apontei o dominio para o local certo e então acessei produção e magicamente estava logado.</p>
<p>Fiquei em estado de alarme, já que esse tipo de erro nos cookies é algo perigoso, principalmente em ambientes corporativos onde nem todos que tem acesso ao ambiente de desenvolvimento deveria ter ao de produção.</p>
<p>Fui estudar como o wp criava seus cookies e achei o <a href="http://pastebin.com/wqfVACs6" target="_blank">seguinte trecho de código</a> no arquivo wp-config.php.</p>
<p>Pouco acima deste trecho existe um comentário dizendo para trocar esses valores utilizando a ferramenta do wordpress disponível no endereço &#8220;<a href="https://api.wordpress.org/secret-key/1.1/salt/" target="_blank">https://api.wordpress.org/secret-key/1.1/salt/</a>&#8220;. Assim, após trocar estes dados no wordpress local refiz o teste acima e não consegui ser redirecionado diretamente para o painel de administração em produção.</p>
<p>Resumindo, o sistema de cookies do wordpress se baseia nessas keys para criar os cookies de login, assim elas devem ser <strong>únicas</strong> para cada &#8220;instância&#8221; da aplicação.</p>
<p>Minha recomendação é gerar as chaves de autenticação diferentes para cada ambiente, evitando assim que usuários sem permissão de acesso em outros ambientes acessem o painel de administração de seu blog. No meu caso, por exemplo, eu gerei um código diferente para os ambientes de produção, homologação e produção. Assim evito por exemplo de algum amigo que venha a desenvolver para o meu blog tenha acesso a ele em produção pelo simples fato de ter o código do meu wordpress. Além disso, caso tenha deixado o seu blog logado em algum ambiente público, como na faculdade, basta você fazer o mesmo procedimento de trocar as keys que automaticamente forçará todos os usuários logados a entrar com username/password novamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2012/04/vulnerabilidade-no-acesso-de-administrador-do-wp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A teoria da Janela Quebrada</title>
		<link>http://eliasgranja.com/2012/04/a-teoria-da-janela-quebrada/</link>
		<comments>http://eliasgranja.com/2012/04/a-teoria-da-janela-quebrada/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 02:08:19 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Crônica/Textos]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=174</guid>
		<description><![CDATA[Como não tive a segunda aula nesta terça-feira, resolvi começar a ler o famoso &#8220;The Pragmatic Programmer&#8221;, do Andrew Hunt e David Thomas. O que mais me chamou a atenção no momento de leitura foi a &#8220;teoria da janela quebrada&#8221;. Vocês já perceberam que certos bairros da sua cidade estão totalmente destruidos, com prédios pichados, [...]]]></description>
			<content:encoded><![CDATA[<p><center><img class="size-medium wp-image-188 aligncenter" title="arranha-céu" src="http://eliasgranja.com/wp-content/uploads/2012/04/arranha-300x201.jpg" alt="" width="300" height="201" /></center></p>
<p>Como não tive a segunda aula nesta terça-feira, resolvi começar a ler o famoso &#8220;The Pragmatic Programmer&#8221;, do Andrew Hunt e David Thomas. O que mais me chamou a atenção no momento de leitura foi a &#8220;teoria da janela quebrada&#8221;.</p>
<p>Vocês já perceberam que certos bairros da sua cidade estão totalmente destruidos, com prédios pichados, com janelas quebradas e aquele odor claro de &#8220;não deveria estar aqui&#8221;. Enquanto outros parecem ter saído de um daqueles filmes onde os mocinhos vivem em um local próximo ao paraíso?</p>
<p>Já pensou o que leva o &#8220;paraíso&#8221; se tornar aquele bairro destruído?</p>
<p>De acordo com o livro, o culpado disso seria uma janela quebrada. Uma janela quebrada passa a impressão de abandono e com isso logo logo surge uma outra janela quebrada. De repente um pichação aqui e outra ali e BUUM o prédio ou casa está abandonado.</p>
<p>Com software a história não é diferente. Um código sujo, faz com que o programador perca o tesão pelo software. Pois ele começa a ter a impressão que é o único que se importa com as boas práticas. Com isso ele fica desmotivado e passa a não se importar tanto se aquela é a melhor maneira de se resolver o problema e passa apenas a prestar atenção se &#8220;a coisa funciona&#8221;.</p>
<p>Para evitar que um lindo software se torne aquele software que você odeia tocar por que sabe que o código dele é mais sujo que o banheiro da rodoviária que não é limpo desde o ano passado, temos que tomar uma atitude. Ao ver algo errado, que não deveria estar ali, que não faz sentido, uma view com lógica de negócio(MEU DEUS SALVE-ME PELO SEU AMOR!!), se MOVA. Alerte a equipe, tente mudar aquele trecho para se adequar as boas práticas. Caso não haja tempo para isto(maldito orçamento apertado), ao menos coloque um aviso alertando para que na próxima oportunidade você ou o desenvolvedor que pegará o software dar um &#8220;trato&#8221; naquele código.</p>
<p>Custará um poquinho de tempo, mas refatoração sempre agrega valor ao software. Pode ser em horas do suporte economizadas até tempo de processamento <img src='http://eliasgranja.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Elias,<br />
Um programador que conversa com seu gato antes de falar com seu cliente.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2012/04/a-teoria-da-janela-quebrada/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Desenvolver aplicações para Android e iOs</title>
		<link>http://eliasgranja.com/2012/04/desenvolver-aplicacoes-para-android-e-ios/</link>
		<comments>http://eliasgranja.com/2012/04/desenvolver-aplicacoes-para-android-e-ios/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 02:07:30 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=170</guid>
		<description><![CDATA[Há algum tempo tenho procurado uma solução para o desenvolvimento mobile, pois nos dias de hoje cada fabricante tende a manter uma forma de se escrever apps para sua plataforma. Enquanto o Android usa Java o iOS usa object-c. Sem nenhum tipo de framework é necessário escrever duas vezes sua aplicação, fazendo-se necessário perder seu [...]]]></description>
			<content:encoded><![CDATA[<p>Há algum tempo tenho procurado uma solução para o desenvolvimento mobile, pois nos dias de hoje cada fabricante tende a manter uma forma de se escrever apps para sua plataforma. Enquanto o Android usa Java o iOS usa object-c.</p>
<p>Sem nenhum tipo de framework é necessário escrever duas vezes sua aplicação, fazendo-se necessário perder seu precioso tempo ou recurso.</p>
<p>Como ainda estava apenas paquerando o Android, não tinha nenhuma preferência por linguagem, assim quando comecei minha busca por um framework que compilasse para as duas plataformas tive os seguintes paramêtros:</p>
<p>1 &#8211; Usar recursos da plataforma de forma simples.</p>
<p>2 &#8211; Confiabilidade na continuidade do projeto.</p>
<p>Assim cheguei a três frameworks:</p>
<ol>
<li><strong><a href="http://developer.anscamobile.com/downloads/coronasdk" target="_blank">Corona</a><br />
</strong>O Corona SDK, escrito em Lua(uma linguagem brasileira diga-se por passagem), é deverás poderoso quando falamos em jogos. É a base de jogos como Angry Birds e compila para Android e iOS de forma bem simples. Porém não existe nenhuma IDE para ele e achei as IDEs para Lua bem fracas. Até mesmo o poderoso Eclipse com plugin para Lua deixou a desejar na minha opinião.<br />
Ainda sim, é a ferramenta necessário se você precisa criar jogos, em poucas horas é possível aprender o framework e já ter um jogo simples montado.</li>
<li><strong><a href="http://www.appcelerator.com/" target="_blank">Appcelerator</a><br />
</strong>Utilizei dele muito pouco, as aplicações dele são escritas em javascript e não vi a possibilidade de se escrever a interface em html. Além disso, o achei completamente diferente do desenvolvimento web que seria a vantagem de se utilizar um framework baseado em javascript. Compila para iOS e Android.</li>
<li><strong><a href="http://www.phonegap.com/" target="_blank">Phonegap</a><br />
</strong>Tenho utilizado ele em meus estudos e na minha opinião é o ganhador quando se fala de desenvolvimento de aplicações mobile. Utilizando-se de html5 + javascript, qualquer desenvolvedor web se sente em casa. Suporta o uso de outros frameworks javascripts famosos, como o jquery ou mesmo o Sencha. Via javascript é possível acessar os recursos nativos do aparelho.<br />
Só peca um pouco na velocidade, já que é basicamente um navegador rodando no celular do usuário. Foi recentemente comprado pela Adobe.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2012/04/desenvolver-aplicacoes-para-android-e-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[SLIDES] Internacionalização com o Drupal</title>
		<link>http://eliasgranja.com/2011/11/slides-internacionalizacao-com-o-drupal/</link>
		<comments>http://eliasgranja.com/2011/11/slides-internacionalizacao-com-o-drupal/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 16:52:51 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Linguagens de Programação]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[apresentação]]></category>
		<category><![CDATA[drupal]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=165</guid>
		<description><![CDATA[Na empresa onde trabalho temos o costume de toda a segunda-feira separar uma hora do dia para alguém ensinar ao grupo alguma matéria que envolva ferramentas do nosso trabalho. Já que estamos trabalhando com drupal 6 para nosso cliente, a matéria que requisitaram para mim foi Internacionalização com o Drupal. A matéria está num ods [...]]]></description>
			<content:encoded><![CDATA[<p>Na empresa onde trabalho temos o costume de toda a segunda-feira separar uma hora do dia para alguém ensinar ao grupo alguma matéria que envolva ferramentas do nosso trabalho. Já que estamos trabalhando com drupal 6 para nosso cliente, a matéria que requisitaram para mim foi Internacionalização com o Drupal.<br />
A matéria está num ods e em inglês, a parte prática da coisa foi feita na hora, porém acredito que a parte teórica esteja boa o suficiente para apresentar o caminho das pedras.<br />
O conteúdo foi baseado no livro &#8220;Drupal&#8230;.&#8221;  e em vivências dentro do projeto.<br />
Para o bem ou para o mau não deixem de comentar.</p>
<p><a rel="attachment wp-att-166" href="http://eliasgranja.com/2011/11/slides-internacionalizacao-com-o-drupal/i18n_drupal/">Baixar i18n_drupal.<br />
</a></p>
<p>[]&#8216;s</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/11/slides-internacionalizacao-com-o-drupal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manifesto pela educação superior</title>
		<link>http://eliasgranja.com/2011/10/manifesto-pela-educacao-superior/</link>
		<comments>http://eliasgranja.com/2011/10/manifesto-pela-educacao-superior/#comments</comments>
		<pubDate>Fri, 21 Oct 2011 01:53:52 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Mundo Acadêmico]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=161</guid>
		<description><![CDATA[Durante toda minha vida escolar aprendi que na faculdade seria me dado apenas um norte e teria que me aprofundar nos assuntos por minha conta. Quando finalmente cheguei ao segundo ano do meu curso superior aprendi que tudo isso é mentira e que caso me aprofunde nos assuntos e me diferencie dos demais serei punido [...]]]></description>
			<content:encoded><![CDATA[<p>Durante toda minha vida escolar aprendi que na faculdade seria me dado apenas um norte e teria que me aprofundar nos assuntos por minha conta. Quando finalmente cheguei ao segundo ano do meu curso superior aprendi que tudo isso é mentira e que caso me aprofunde nos assuntos e me diferencie dos demais serei punido nas provas por sair do padrão.</p>
<p>Sem entrar em detalhes técnicos que não são interessantes para quem não é da área, em uma questão multi-escolha de uma prova onde haviam duas respostas corretas, sendo a unica diferença entre elas o usuário e senha de conexão com o banco de dados., dado que nenhuma delas quebrava regra alguma nessa diferença, as respostas de diversos alunos divergiram entre as duas.</p>
<p>No momento da correção o professor fez questão de enfatizar que só deveria ser usado o padrão do laboratório(apesar de momento algum isso estar explícito na prova) e considerou por que foi &#8220;bonzinho&#8221;. Ainda finalizou dizendo que aquela alternativa foi marcada por quem estuda por fora, pois seria a unica maneira de saber que aquela alternativa também estava certa. Sim, quem teve a dedicação de estudar por fora não foi punido por isso por que o professor foi &#8220;bonzinho&#8221;.</p>
<p>Uma coisa é cobrar algo em um nível que foi dado em sala de aula e outra completamente diferente é PUNIR quem foi além do esperado ou mesmo quem trabalha na área. Ter conhecimento a mais e se destacar do padrão é motivo de vergonha, de castigo.</p>
<p>A cada aula, a cada explicação, vejo que empurram os &#8220;enlatados dos USA&#8221; para nós como já dizia o eterno Renato Russo e somos obrigados a aceitar. Essa foi a gota d&#8217;agua, mas com certeza não é nem a ponta do Iceberg dos erros da nossa educação superior.</p>
<p>Somos ensinados a não questionar e sim aceitar, não por culpa dos professores, mas por culpa de algo muito maior que também cegou a eles. Não há necessidade de criar e inovar no Brasil, nossas provas e ensino podem se basear simplesmente em APIs de java, para que precisamos saber o por trás? Para que saber a base? Deixe para os engenheiros do MIT.</p>
<p>Tudo o que vamos precisar no dia a dia é sermos bons robôs &#8220;apertadores&#8221; de botões, basta você entrar de boca fechada no serviço se sentar em sua mesa com um sorriso no rosto e apertar os botões exatamente como foi ensinado. Não robô idiota, nem pense em perguntar o por que de você apertar o azul antes do vermelho. Você é pago para apertar e não pensar. Quando quisermos ter pensadores iremos contratar algum estrangeiro. Fique no seu lugar.</p>
<p>Exatamente por isso, somos cobrados pelo famoso &#8220;decoreba&#8221; e não pela lógica por trás das questões. Ah, sim, mas este &#8220;decoreba&#8221; não começou aqui, começou lá atrás quando estudavamos para o vestibular. Professores enfatizavam o que caia no vestibular e ensinavam o que deveríamos decorar e o que deixar para trás.</p>
<p>Posso contar nos dedos de uma mão quais foram os professores em toda a minha vida escolar que amavam a matéria que davam e explicavam com brilho no olho. Esse prazer em dar aula que contagiava a todos e fazia com que até mesmo o mais &#8220;bagunceiro&#8221; da turma sentasse e ouvisse o que aquele grande Mestre tinha a dizer.</p>
<p>Um desses Mestres um dia me disse que ele poderia dar a formula para um aluno que nunca estudo aquela matéria e ele iria acertar, pois aplicar a formula é simples. O importante de verdade era o conceito por trás daquilo, o por que de V = d * t e não saber essa formula.</p>
<p>Onde estão esses Mestres? E por que deixamos de questionar?</p>
<p>Elias, um robô rebelde.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/10/manifesto-pela-educacao-superior/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Machine Learning] (Un)Supervised learning</title>
		<link>http://eliasgranja.com/2011/10/machine-learning-unsupervised-learning/</link>
		<comments>http://eliasgranja.com/2011/10/machine-learning-unsupervised-learning/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 16:49:37 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Mundo Acadêmico]]></category>
		<category><![CDATA[definições]]></category>
		<category><![CDATA[Machine Learning]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=158</guid>
		<description><![CDATA[[Nota: Usarei os termos técnicos em inglês por não saber exatamente a tradução correta para eles em português] No campo de estudo de Machine Learning nós temos dois tipos mais usados de algoritmos, os de &#8220;Supervised learning&#8221; e o&#8221;Unsupervised learning&#8220;. O primeiro se dá quando  damos para o software  termos de entrada e o que [...]]]></description>
			<content:encoded><![CDATA[<p>[Nota: Usarei os termos técnicos em inglês por não saber exatamente a tradução correta para eles em português]</p>
<p>No campo de estudo de Machine Learning nós temos dois tipos mais usados de algoritmos, os de &#8220;<em>Supervised learning</em>&#8221; e o&#8221;<em>Un</em>supervised learning<em>&#8220;.</em></p>
<p>O primeiro se dá quando  damos para o software  termos de entrada e o que esperamos na saída(&#8220;damos as respostas certas&#8221; para o computador se basear). Assim &#8220;treinamos&#8221; a máquina para seguir este padrão de saída. Ao usarmos o algoritmo &#8220;treinado&#8221; em problemas reais ele se baseará nos valores dados previamente e seguirá o padrão para dar o resultado.</p>
<p>Podemos classificar esse tipo em mais duas categorias, aqueles cujo o problema é um problema de classificação, exemplo: Saber se um tumor é ou não é maligno. Neste exemplo só há duas saídas possíveis, ou seja, temos que <strong>classificar</strong> o objeto de saída.</p>
<p>Temos também os &#8220;regression problems&#8221; cujo os valores de saída variam de acordo com o objeto de entrada. Temos neste exemplo o preço de uma casa dada a a partir do tamanho dela. Não é possível mais classificar o objeto de saída, apenas dar seu valor, pois não temos mais grupos distintos. Então esperamos simplesmente que o software siga o padrão dado previamente.</p>
<p>Quanto ao grupo de Unsupervised learning, nós não separamos as respostas, simplesmente as colocamos para o computador e ele mesmo terá que definir padrões e separar as respostas conforme o algoritmo achar melhor.</p>
<p>Um exemplo de unsupervised learning é o google news que pega centenas de milhares de notícias e agrupa elas automaticamente apenas olhando o padrão dos textos.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/10/machine-learning-unsupervised-learning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[nota] concatenação de listas em haskell</title>
		<link>http://eliasgranja.com/2011/09/nota-concatenacao-de-listas-em-haskell/</link>
		<comments>http://eliasgranja.com/2011/09/nota-concatenacao-de-listas-em-haskell/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 03:01:35 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[haskell]]></category>
		<category><![CDATA[notas]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=152</guid>
		<description><![CDATA[A partir deste final de semana reservarei algumas horas do meu dia para estudar e escrever aqui um pouco sobre haskell, neste final de semana o tema será concatenação de listas e algumas coisinhas mais. Para começar, devemos deixar claro que strings são listas, definir a seguinte função texto = "ola" é equivalente a declarar: [...]]]></description>
			<content:encoded><![CDATA[<p>A partir deste final de semana reservarei algumas horas do meu dia para estudar e escrever aqui um pouco sobre haskell, neste final de semana o tema será concatenação de listas e algumas coisinhas mais.</p>
<p>Para começar, devemos deixar claro que strings são listas, definir a seguinte função</p>
<pre class="haskell">texto = "ola"</pre>
<p>é equivalente a declarar: texto = ['o','l','a']. Ou seja, qualquer coisa passada aqui poderá ser usada com strings.</p>
<p>Para concatenar duas lista podemos usar o operador ++, como no seguinte exemplo:</p>
<pre class="haskell">[1,2,3,4] ++ [5,6,7,8].</pre>
<p>Dessa forma haskell andará por toda a primeira lista adicionando os elementos a uma terceira lista e depois fará o mesmo com a segunda lista. Isso parece ser banal para uma lista com poucos elementos, mas se tivermos uma lista enorme com todos os alunos de uma universidade, por exemplo, o haskell demorará vários minutos para terminar essa operação.</p>
<p>Uma outra forma de adicionar elementos a uma lista que não demande tanto esforço é usar o operador : que adiciona UM elemento no começo da lista, por exemplo:</p>
<pre class="haskell">1  :  [2,3,4]</pre>
<p>Atenção para o fato de que o operador ++ só aceita duas listas, enquanto que o operador : aceita UM elemento e UMA lista.</p>
<p>Mais uma coisa que vale adicionar essa nota é que caso queiramos &#8220;pegar&#8221; um elemento da lista temos que usar o operador !!, por exemplo em java se queremos imprimir o quinto elemento de um vetor usamos:</p>
<pre class="java">System.out.println(nomeVetor[5]);</pre>
<p>Já em haskell como dito anteriormente usamos o !!</p>
<pre class="haskell">listaDeExemplo !! 6</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/09/nota-concatenacao-de-listas-em-haskell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma visão geral de Hooks</title>
		<link>http://eliasgranja.com/2011/08/uma-visao-geral-de-hooks/</link>
		<comments>http://eliasgranja.com/2011/08/uma-visao-geral-de-hooks/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 02:44:30 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Linguagens de Programação]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[design partner]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[hook]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=147</guid>
		<description><![CDATA[Comecei recentemente a trabalhar com programação para aplicações web com Drupal e durante o treinamento/leitura de materiais sobre esse CMS o que eu mais via era a palavra hooks, mas o que são hooks? O conceito lembra muito um event listener, pois é executado quando uma &#8220;ação&#8221; acontece. Porém a ideia por trás dele é [...]]]></description>
			<content:encoded><![CDATA[<p>Comecei recentemente a trabalhar com programação para aplicações web com <a href="http://drupal.org/">Drupal</a> e durante o treinamento/leitura de materiais sobre esse CMS o que eu mais via era a palavra hooks, mas o que são hooks?</p>
<p>O conceito lembra muito um<a href="http://download.oracle.com/javase/tutorial/uiswing/events/intro.html"> event listener</a>, pois é executado quando uma &#8220;ação&#8221; acontece. Porém a ideia por trás dele é interceptar funções, mensagens e eventos de componentes do software e alterar eles conforme a vontade do programador.</p>
<p>Então se eu quero adicionar uma funcionalidade ao core do Drupal, ao invés de eu modificar o código e ter que verificar erros/modificar novamente a cada atualização, eu posso usar uma hook. O próprio Drupal tratará de executar a minha função hook quando for o momento certo e ela alterará o core da forma que eu desejar/for permitido.</p>
<p>Para criarmos uma no Drupal, basta que criar uma função com o nome do modulo &#8220;underline&#8221; nome da hook, por exemplo se quisermos alterar o <a href="http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_menu/6">menu</a> do Drupal para o nosso módulo &#8220;fotos&#8221;, basta fazer: &#8220;function fotos_modulo(){}&#8221; e fazer as modificações necessárias de acordo com a api do framework.</p>
<p>Hooks também podem ser muito úteis para debugar códigos, emular interação com o usuário e até mesmo gerar códigos maliciosos.</p>
<p>Além do Drupal, o Emacs também usa hooks para definir os &#8220;modes&#8221;(como php-mode). Porém a forma de faze-lo é um pouco diferente por estarmos falando de uma linguagem funcional. Caso fique interessado nas hooks de emacs lisp, <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html">aqui tem uma introdução legal</a> ou se quiser saber <a href="http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7">sobre as hooks do Drupal tem esse do site oficial</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/08/uma-visao-geral-de-hooks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ainda falando em primos &#8211; Python</title>
		<link>http://eliasgranja.com/2011/07/ainda-falando-em-primos-python/</link>
		<comments>http://eliasgranja.com/2011/07/ainda-falando-em-primos-python/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 13:46:36 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[matemática]]></category>
		<category><![CDATA[números primos]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=137</guid>
		<description><![CDATA[No último post sobre números primos, citei uma forma que ainda utiliza fatoração, que não é uma maneira rápida de se descobrir se um número é ou não primo, apesar das várias formas de &#8220;pular&#8221; alguns números. Como voltei a ler o livro Algoritmos do Dasgupta, Sanjoy et al. achei mais uma forma de se [...]]]></description>
			<content:encoded><![CDATA[<p>No último<a href="http://eliasgranja.com/?p=16"> post sobre números primos</a>, citei uma forma que ainda utiliza fatoração, que não é uma maneira rápida de se descobrir se um número é ou não primo, apesar das várias formas de &#8220;pular&#8221; alguns números.</p>
<p>Como voltei a ler o livro Algoritmos do Dasgupta, Sanjoy et al. achei mais uma forma de se fazer isso pulando a parte chata da fatoração.<br />
Essa formula se baseia no fato que para todo número primo p e todo a, 1&lt;= a &lt; p tem a seguinte afirmação como verdade:</p>
<p>a^( p &#8211; 1 ) mod p = 1 mod p</p>
<p>Dessa forma pode-se evitar a fatoração que é algo absurdamente lento. Em python ficaria da seguinte forma:</p>
<pre class="py">def primo( num ):
	if( 2**(num-1) % num == 1 % num):
		print "primo"
	else:
		print "nao primo"</pre>
<p>O problema do teorema é que ele não afirma que &#8220;se e somente se&#8221; a igualdade for verdadeira teremos um número primo, ou seja, poderia haver números compostos que passariam no teste. E existem.  Os números de Carmichael passam no teste e por isso, <a href="http://pt.wikipedia.org/wiki/N%C3%BAmero_de_Carmichael">de acordo com a wikipedia</a>, eles também são chamados de pseudoprimos. Porém eles são raros e dependendo de tão grande é o primo que você necessita, como na criptografia RSA, vale a pena o risco de se usar um pseudoprimo ao invés de fatorar um número gigantesco.</p>
<p>Além disso, existem casos em que o valor de a também deixaria a igualdade verdadeira para números compostos, Sanjoy afirma que metade dos valores possíveis de a fazem isso se desconsiderarmos os números de Carmichael.</p>
<p>Uma forma de se evitar falsos positivos é testar o número com diferentes e aleatórios valores para a. Quanto mais testes, menor é a probabilidade de erro. Testar 100 valores para a faria com que seja mais fácil um raio cósmico queimar o computador do que obter um falso positivo, brinca Sanjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/07/ainda-falando-em-primos-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Importando códigos em php</title>
		<link>http://eliasgranja.com/2011/06/importando-codigos-em-php/</link>
		<comments>http://eliasgranja.com/2011/06/importando-codigos-em-php/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 00:52:37 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Linguagens de Programação]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[import]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=133</guid>
		<description><![CDATA[Não sei se é o caso de todo mundo, mas quando aprendi php, o aprendi da forma mais suja possível. Sempre usava programação funcional e algumas vezes coisas das quais não me orgulho muito. Por causa disso, a forma como aprendi a importar código foi usando include e nem imaginava que haveria outras formas. Quando [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se é o caso de todo mundo, mas quando aprendi php, o aprendi da forma mais suja possível. Sempre usava programação funcional e algumas vezes coisas das quais não me orgulho muito. Por causa disso, a forma como aprendi a importar código foi usando include e nem imaginava que haveria outras formas.</p>
<p>Quando conheci o paradigma(ou sub-paradigma) de orientação a objetos tentei traze-lo para o php. Mas notei que os includes necessários para fazer duas classes funcionarem juntas estavam se repetindo e dando erro de reescrita de funções.</p>
<p>Mais tarde fiquei conhecendo as outras três maneiras de importar códigos em php, que são:</p>
<ol>
<li><strong>include()<br />
</strong>Tenta importar o arquivo que foi instruído a fazer, caso não o encontre ele é simplesmente ignorado. Caso seja um arquivo de funções e que você use alguma delas, você terá o erro alertando da falta da definição dela.</li>
<li><strong>require()<br />
</strong>Tenta importar o arquivo, caso não o encontre ele &#8220;mata&#8221; a aplicação e o interpretador para de rodar. Tem funcionalidade igual ao de um include() or die().</li>
<li><strong>include_once()</strong><br />
Mesma funcionalidade do include, exceto que ele verifica se o arquivo já foi incluído antes, caso fora ele não faz nada.</li>
<li><strong>require_once()</strong><br />
Basicamente a mesma coisa que o include_once, porém trava se o arquivo não foi encontrado e nem fora incluído antes.</li>
</ol>
<p>Para classes sempre escolho usar o include_once() ou o require_once() para evitar redefinir classes, porém vejo mais gente usando o require_once() do que o include_once(), já para adicionar conteúdo estáticos, como html ou imagens, prefiro usar o include().</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/06/importando-codigos-em-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

