<?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.</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>Sat, 19 Nov 2011 16:52:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<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 "Drupal...."  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>[]'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 "bonzinho". 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 "bonzinho".</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 "enlatados dos USA" para nós como já dizia o eterno Renato Russo e somos obrigados a aceitar. Essa foi a gota d'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 "apertadores" 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 "decoreba" e não pela lógica por trás das questões. Ah, sim, mas este "decoreba" 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 "bagunceiro" 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 "Supervised learning" e o"Unsupervised learning". 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 "<em>Supervised learning</em>" e o"<em>Un</em>supervised learning<em>".</em></p>
<p>O primeiro se dá quando  damos para o software  termos de entrada e o que esperamos na saída("damos as respostas certas" para o computador se basear). Assim "treinamos" a máquina para seguir este padrão de saída. Ao usarmos o algoritmo "treinado" 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 "regression problems" 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 "pegar" 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 "ação" 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 "ação" 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 "underline" 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 "fotos", basta fazer: "function fotos_modulo(){}" 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 "modes"(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 "pular" 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 "pular" 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 - 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 "se e somente se" 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 "mata" 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>
		<item>
		<title>Copiando vetores em C</title>
		<link>http://eliasgranja.com/2011/06/copiando-vetores-em-c/</link>
		<comments>http://eliasgranja.com/2011/06/copiando-vetores-em-c/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 17:27:58 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Linguagens de Programação]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=130</guid>
		<description><![CDATA[Este semestre tive na faculdade a matéria de estrutura de dados e junto com ela veio a obrigação de implementar algoritmos de ordenação de dados tanto em Java como em C e acabei tendo de resolver o mesmo dilema já explicado neste post. Para isto resolvi usar o memmove que funciona da seguinte maneira: memmove( [...]]]></description>
			<content:encoded><![CDATA[<p>Este semestre tive na faculdade a matéria de estrutura de dados e junto com ela veio a obrigação de implementar algoritmos de ordenação de dados tanto em Java como em C e acabei tendo de resolver o <a href="http://eliasgranja.com/?p=126">mesmo dilema já explicado neste post</a>.</p>
<p>Para isto resolvi usar o memmove que funciona da seguinte maneira:</p>
<p>memmove( (int*) vetor_destino, (int*) vetor_origem, sizeof(int) * tamanho_do_vetor );</p>
<p>Lembrando que a função pode ser usada para qualquer tipo de ponteiro, então é só trocar o int pelo tipo da váriavel que você está usando.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/06/copiando-vetores-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copiando vetores em Java</title>
		<link>http://eliasgranja.com/2011/05/copiando-vetores-em-java/</link>
		<comments>http://eliasgranja.com/2011/05/copiando-vetores-em-java/#comments</comments>
		<pubDate>Thu, 26 May 2011 17:12:32 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens de Programação]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[unip]]></category>
		<category><![CDATA[vetores]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=126</guid>
		<description><![CDATA[Em java, toda variável de instância aponta para um objeto no HEAP. Funcionalidade parecida com a de ponteiros em C, assim, se queremos copiar por exemplo o valor de um vetor para outro(lembrando que arranjos são objetos) não podemos colocar um sinal de igual dessa forma: int vetor[] = new vetor[2]; novo_vetor = vetor; Pois [...]]]></description>
			<content:encoded><![CDATA[<p>Em java, toda variável de instância aponta para um objeto no HEAP. Funcionalidade parecida com a de ponteiros em C, assim, se queremos copiar por exemplo o valor de um vetor para outro(lembrando que arranjos são objetos) não podemos colocar um sinal de igual dessa forma:</p>
<p>int vetor[] = new vetor[2];</p>
<p>novo_vetor = vetor;</p>
<p>Pois ao invés de estarmos copiando o valor do vetor, estamos copiando a referência ao vetor. Ou seja, novo_vetor e vetor apontam(são) para o mesmo objeto.</p>
<p>Localizei na internet várias formas de fazer isso, mas a maioria envolvia percorrer o vetor ou usar algum método da classe System. Por fim achei um local que usava o método clone contida em qualquer objeto(pois vem da classe Object). Seu uso consistem em converter o valor para o tipo do objeto proposto depois de usa-lo, dessa forma:</p>
<p>novo_vetor = (int[]) vetor.clone();</p>
<p>E assim temos dois vetores <strong>diferentes</strong> com valores iguais.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/05/copiando-vetores-em-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lista encadeada genérica em C[Parte 1 de 2]</title>
		<link>http://eliasgranja.com/2011/03/lista-encadeada-generica-em-cparte-1-de-2/</link>
		<comments>http://eliasgranja.com/2011/03/lista-encadeada-generica-em-cparte-1-de-2/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 02:36:14 +0000</pubDate>
		<dc:creator>Elias</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[lista encadeada]]></category>
		<category><![CDATA[ponteiro]]></category>

		<guid isPermaLink="false">http://eliasgranja.com/?p=117</guid>
		<description><![CDATA[Afim de evitar ficar usando vetores durante os exercícios da faculdade, decidi criar um header com métodos e uma struct de lista encadeada. Logo de cara percebi que não ia ser uma boa idéia criar structs para cada tipo de dado que poderia um dia usar em sala de aula. Em C++, java e outras [...]]]></description>
			<content:encoded><![CDATA[<p>Afim de evitar ficar usando vetores durante os exercícios da faculdade, decidi criar um header com métodos e uma struct de lista encadeada. Logo de cara percebi que não ia ser uma boa idéia criar structs para cada tipo de dado que poderia um dia usar em sala de aula.</p>
<p>Em C++, java e outras linguagens orientadas a objetos, podemos resolver isso com polimorfismo, sobrecarga de métodos e outras coisinhas muito úteis, mas um tanto distantes do mundo C.</p>
<p>Assim,  depois de alguma pesquisa descobri a existência do ponteiro void, que pode apontar para qualquer tipo de variável, contanto que você faça casting antes de usa-lá, como é possível ver <a href="http://theoryx5.uwinnipeg.ca/programming/node87.html">neste exemplo</a>.</p>
<p>Tudo muito bonito, mas ainda seria necessário saber o tipo da variável para fazer o casting antes de compara-las numa função para procurar um valor na lista, por exemplo. Ou seja, consigo criar apenas uma struct, porém as dezenas de métodos repetidos para os principais tipos de dados continua existindo.</p>
<p>Porém, existe outra função bem legal no gcc que se chama typeof, sua sintaxe se parece muito com o typedef:</p>
<pre class="c">int inteiro;
typeof(inteiro) novoInteiro;</pre>
<p>Agora sim me livrei das dezenas de funções, né? Bom, infelizmente não. Ao colocar o ponteiro diretamente como em:</p>
<pre class="c">void *inteiro;
int t = 0;
inteiro = &amp;t;
typeof(*inteiro) novoInteiro;</pre>
<p>Ou ainda:</p>
<pre class="c">void *inteiro;
int t = 0;
inteiro = &amp;t;
typeof(inteiro) novoInteiro;</pre>
<p>O resultado obtido nunca era o esperado(do "novoInteiro" se tornar realmente um inteiro).</p>
<p>Dessa vez, fui pedir ajuda para saber se teria alguma forma de fazer alguma combinação de typeof e void * para eliminar funções extras. O <a href="http://asynchronicity.wordpress.com/">Andrei Formiga</a> deu a ideia de guardar em cada nó um inteiro com o tamanho do dado  que void * aponta, assim poderia utilizar o typeof com este valor e ter a minha tão sonhada variável "genérica".</p>
<p>Basicamente:</p>
<pre class="c">void variavel(void *gen){
  int tamanho = sizeof(*gen);
  typeof(tamanho) variavelGenerica;
}</pre>
<p>E assim, um nerd conseguiu criar sua tão sonhada lista encadeada genérica em C. No próximo post disponibilizo o código e detalho o que fiz.</p>
]]></content:encoded>
			<wfw:commentRss>http://eliasgranja.com/2011/03/lista-encadeada-generica-em-cparte-1-de-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

