<?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>Tas Blog: Tiago Silva</title>
	<atom:link href="http://tas.eti.br/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://tas.eti.br/blog</link>
	<description>PHP, PostgreSQL, Linux, jQuery, JavaScript e Carreira</description>
	<lastBuildDate>Fri, 09 Mar 2012 00:51:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>PostgreSQL: Funções que retornam conjuntos de registros</title>
		<link>http://tas.eti.br/blog/2012/03/postgresql-funcoes-que-retornam-conjuntos-de-registros/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=postgresql-funcoes-que-retornam-conjuntos-de-registros</link>
		<comments>http://tas.eti.br/blog/2012/03/postgresql-funcoes-que-retornam-conjuntos-de-registros/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 04:37:43 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=102</guid>
		<description><![CDATA[Olá mentes ávidas do amanhã! Algumas vezes eu me deparei com o problema de retornar mais de um resultado com uma função, um conjunto de resultados, e o Postgres nos favorece com alguns artifícios para tal. De fato não são exatamente muito simples de se manejar, mas também não é um bicho de sete cabeças. Tal como [...]]]></description>
			<content:encoded><![CDATA[<p>Olá mentes ávidas do amanhã!</p>
<p>Algumas vezes eu me deparei com o problema de retornar mais de um resultado com uma função, um conjunto de resultados, e o <a title="Mais posts sobre o PostgreSQL" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">Postgres</a> nos favorece com alguns artifícios para tal. De fato não são exatamente muito simples de se manejar, mas também não é um bicho de sete cabeças. Tal como fizemos quando <a href="http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/" target="_blank">manipulamos triggers</a>, aqui iremos utilizar a linguagem <a href="http://pgdocptbr.sourceforge.net/pg80/plpgsql.html" target="_blank">PL/pgSQL</a> para construirmos nosso trabalho, que consistirá em quatro maneiras. Outra informação importante é que enquanto eu escrevia esse post estava usando a versão 8.3 para realizar os testes nos códigos.</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png"><img class="aligncenter" title="logo_w_elephant" src="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png" alt="" width="250" height="198" /></a></p>
<p>Eu encontrei duas  maneiras de executar esse trabalho, e após <a href="http://www.linkedin.com/groupAnswers?viewQuestionAndAnswers=&amp;discussionID=99757301&amp;gid=2748187&amp;commentID=71833875&amp;trk=view_disc&amp;ut=3c0NY2q61cz581" target="_blank">compartilhar</a> o post no <a href="http://www.linkedin.com/groups?home=&amp;gid=2748187&amp;trk=anet_ug_hm" target="_blank">grupo PostgreSQL  Brasil</a> no LinkedIn, o Fabrízio que orientou mais duas maneiras que veremos a seguir, e se você souber de mais alguma sinta-se livre para contribuir, por exemplo, enquanto eu estava escrevendo a primeira versão minha doce namorada Bruna me deu várias luzes. Bom mas abordando o nosso tema, inicialmente tomemos vejamos as seguintes linhas de código que representam a tabela que será a base das nossas consultas:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TABLE pessoa_fisica (
	id_pessoa SERIAL,
	nome VARCHAR(80),
	sobrenome VARCHAR(200),
	sexo CHAR(1),
	cpf CHAR(11),
	PRIMARY KEY(id_pessoa)
);</pre>
<p>Agora vamos aos métodos de retorno dos dados que estão dentro desta tabela (presumo que você tenha abastecido ela), como mencionei vou abordar quatro maneiras.</p>
<p>&nbsp;</p>
<p><strong>1) Tipo retorno RECORD</strong></p>
<p>Um tipo &#8220;genérico&#8221;, bem mais comum nas buscas na internet, este é o tipo mais comentado, mas existe um empecilho, o qual é necessário especificar as colunas que iremos resgatar quando chamarmos a função, veja o código abaixo na linha 8:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE FUNCTION blog_get_pessoas() RETURNS SETOF RECORD AS $$
BEGIN
	RETURN QUERY SELECT id_pessoa, nome, sobrenome, sexo, cpf FROM pessoa_fisica;
	RETURN;
END;
$$ LANGUAGE 'plpgsql';

SELECT * FROM blog_get_pessoas() AS (id_pessoa INTEGER, nome VARCHAR, sobrenome VARCHAR, sexo CHAR, cpf CHAR)</pre>
<p>Veja que quando defini o tipo de retorno da função eu determinei dois parâmetros, <strong>SETOF</strong> que indica que a função irá retornar um conjunto de itens, ao invés de um único item e RECORD que está me dizendo que o retorno será um conjunto de resultados. Perceba que utilizei a instrução <strong>RETURN QUERY</strong> e logo após um <strong>SELECT</strong> tradicional para &#8220;capturar&#8221; os dados, o RETURN QUERY foi introduzido no Postgres na versão 8.3.</p>
<p>Observe que a instrução RETURN (sozinha, na linha 4) é que irá realizar o retorno do nosso conjunto. Agora note a forma estranha que chamamos a função, como se fosse uma tabela realizamos o select e em seguida empreendemos um &#8220;alias&#8221; especificando quais campos vieram na query realizada (estranho, não?), enfim se você não colocar todos os campos, conforme a query que foi realizada na função, haverá problemas.</p>
<p>&nbsp;</p>
<p><strong>2) Retornando os campos de uma dada Tabela</strong></p>
<p>Agora se os dados de retorno da sua função forem oriundos de apenas uma tabela, você pode setar o tipo de retorno como sendo exatamente o da tabela trabalhada, veja que no nosso exemplo que coloquei <strong>pessoa_fisica</strong>, como o tipo de retorno:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE FUNCTION blog_get_pessoas2() RETURNS SETOF pessoa_fisica AS $$
BEGIN
	RETURN QUERY SELECT * FROM pessoa_fisica
	RETURN;
END;
$$ LANGUAGE 'plpgsql'

SELECT * FROM blog_get_pessoas2();</pre>
<p>Aqui temos como retorno possível todos os campos da nossa tabela de teste, no caso <strong>pessoa_fisica</strong>, claro que ao chamar a função você poderia selecionar os campos que vão lhe interessar. Repare que ao contrário do primeiro exemplo não precisamos especificar quais campos eventualmente viriam na query, essa na minha opinião é uma das maneiras mais práticas, mas ai vai da sua necessidade.</p>
<p>&nbsp;</p>
<p><strong>3) Tipo de retorno RETUNS TABLE</strong></p>
<p>Apensar de eu não conseguir testar o <strong>RETURNS TABLE</strong> (porque a versão 8.3 ainda não suportava esse recurso) ela existe, veja <a href="http://www.postgresql.org/docs/current/static/sql-createfunction.html" target="_blank">aqui na documentação oficial do Postgres</a>. Dê uma olhada de como ficaria o código da nossa função:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE FUNCTION blog_get_pessoas3() RETURNS TABLE (id_pessoa INT,
						   nome VARCHAR,
						   sobrenome VARCHAR,
						   sexo CHAR,
						   cpf CHAR) AS $$
BEGIN
	RETURN QUERY SELECT * FROM pessoa_fisica;
	RETURN;
END;
$$ LANGUAGE 'plpgsql'

SELECT * FROM blog_get_pessoas3();</pre>
<p>Repare que declaramos os atributos, que serão os &#8220;nomes de coluna&#8221; quando chamarmos nossa função. É muito útil quando vamos retornar dados de mais de uma tabela, ao contrário de tudo que já vimos anteriormente, dessa maneira podemos expressar no corpo da função, explicitamente, quais serão as tuplas no retorno. Uma observação importante: repare que na linha 7 eu estou selecionando todos os campos, você deve atentar-se para que todos os campos coincidam com os determinados no tipo de retorno.</p>
<p>&nbsp;</p>
<p><strong>4) Criando um tipo específico de retorno, o CREATE TYPE</strong></p>
<p>Já a quarta opção, é que criamos o tipo de retorno da função &#8220;personalizado&#8221;, exatamente como nesta instrução:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TYPE type_pessoa_fisica AS (
	id_pessoa INT,
	nome VARCHAR,
	sobrenome VARCHAR,
	sexo CHAR,
	cpf CHAR
);</pre>
<p>Repare que a instrução <strong>CREATE TYPE</strong> é bem semelhante a instrução para criação de tabelas, com ela é possivel criar um &#8220;mix&#8221; de duas tabelas por exemplo, ai vai da sua imaginação, aqui no meu exemplo ficou bem simples, mas agora que vem a parte interessante, veja como ficou a nossa função:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE FUNCTION blog_get_pessoas4() RETURNS SETOF type_pessoa_fisica AS $$
DECLARE
	dados_pessoa type_pessoa_fisica;
BEGIN
	FOR dados_pessoa IN SELECT id_pessoa, nome, sobrenome, sexo, cpf  FROM pessoa_fisica LOOP
		RETURN NEXT dados_pessoa;
	END LOOP;
	RETURN;
END;
$$ LANGUAGE 'plpgsql'

SELECT * FROM blog_get_pessoas4();</pre>
<p>A primeira coisa que notamos a ler é o tipo de retorno da função, o <strong>type_pessoa_fisica</strong> que já especifica quais os campos que serão retornados, posteriormente temos o <strong>DECLARE</strong> onde construimos uma variável chamada <strong>dados_pessoa</strong> que irá conter o conteudo da nossa query, note que tem o<strong> mesmo tipo de retorno da função</strong>, exatamente porque é esta variável que vamos retornar. Em seguida, para abastecer a nossa variável com os registros da tabela temos a instrução <strong>FOR-IN-SELECT</strong> que é m looping que a cada iteração &#8220;coloca uma linha na variável&#8221;, repare que a instrução <strong>RETURN NEXT</strong> é que &#8220;abastece&#8221; nossa variável, e apesar de ser um <strong>&#8220;RETURN&#8221;</strong> não encerra a execução do código naquele instante, note que há a instrução <strong>RETURN</strong> após o fim do loop (<strong>END LOOP</strong>), esta sim irá terminar a função.</p>
<p>E na <strong>linha 12</strong> temos a chamada da função, bem mais amigável que em comparação com o experimento 1, e é (quase) exatamente como a chamada de uma tabela, lá você pode introduzir as clausulas <strong>WHERE</strong> e <strong>LIMIT</strong> por exemplo.</p>
<p>Espero que tenham gostado! Façam os testes e não deixem de comentar, e conheça também a <a href="http://www.facebook.com/tasblog" target="_blank">fã page do blog no Facebook</a>.</p>
<p>&nbsp;</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://www.postgresql.org/docs/8.3/static/sql-createfunction.html" target="_blank">PostgreSQL Documentation &#8211; Create Function</a></li>
<li><a href="http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/PlpgSQL" target="_blank">WikiBooks &#8211; Funções em PL/pgSQL</a></li>
<li><a href="http://postgresqlbr.blogspot.com/2008/12/retornando-registros-de-consultas.html" target="_blank">PostgreSQL Brasil &#8211; Retornando registros de consultas genéricas com RETURN QUERY</a></li>
</ul>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/03/postgresql-funcoes-que-retornam-conjuntos-de-registros/&via=tiagotas&text=PostgreSQL: Funções que retornam conjuntos de registros&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F03%2Fpostgresql-funcoes-que-retornam-conjuntos-de-registros%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/03/postgresql-funcoes-que-retornam-conjuntos-de-registros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vídeo Aulas: Redes, IP, Máscara de Rede e Gateway</title>
		<link>http://tas.eti.br/blog/2012/03/video-aulas-redes-ip-mascara-de-rede-gatewa/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=video-aulas-redes-ip-mascara-de-rede-gatewa</link>
		<comments>http://tas.eti.br/blog/2012/03/video-aulas-redes-ip-mascara-de-rede-gatewa/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 04:39:44 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Mestrado]]></category>
		<category><![CDATA[UFSCar]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=1030</guid>
		<description><![CDATA[Olá Amigos! Ainda estudando frenecamente para o mestrado na UFSCar, hoje eu trago para vocês uma dica que vi no Facebook do meu ex-Prof Avelino Pimenta, ele postou o link de algumas vídeo aulas do Kretcheu, eu dei uma conferida nelas e digo que me ajudaram muito com a minha matéria de redes. As vídeo [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Amigos!</p>
<p>Ainda estudando frenecamente para o <a href="http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/" target="_blank">mestrado na UFSCar</a>, hoje eu trago para vocês uma dica que vi no Facebook do meu ex-Prof Avelino Pimenta, ele postou o link de algumas vídeo aulas do Kretcheu, eu dei uma conferida nelas e digo que me ajudaram muito com a minha matéria de redes.</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg"><img class="aligncenter  wp-image-879" title="ufscar" src="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg" alt="" width="240" height="167" /></a></p>
<p>As vídeo aulas são bem explicativas e vão falar sobre protocolos das redes, ip, máscara de rede e gateway, apesar de serem muito boas são bem curtinhas, totalizando quase uma hora de aula, e mais, aconselho você a dar uma olhada no <a href="http://www.youtube.com/user/kretcheu2001" target="_blank">canal do YouTube</a> que está repleto de material sobre software livre e derivados, vale a pena <img src='http://tas.eti.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Abaixo estão dos vídeos, na ordem que eu vi, espero que gostem:</p>
<p><iframe src="http://www.youtube.com/embed/EYQu7uNKvYg" frameborder="0" width="450" height="315"></iframe></p>
<p>Em seguida, veja este:</p>
<p><iframe src="http://www.youtube.com/embed/yLgansF_h1w" frameborder="0" width="450" height="315"></iframe></p>
<p>Abraços,</p>
<p><a href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/03/video-aulas-redes-ip-mascara-de-rede-gatewa/&via=tiagotas&text=Vídeo Aulas: Redes, IP, Máscara de Rede e Gateway&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F03%2Fvideo-aulas-redes-ip-mascara-de-rede-gatewa%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/03/video-aulas-redes-ip-mascara-de-rede-gatewa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conhecendo o operador Similar To no PostgreSQL</title>
		<link>http://tas.eti.br/blog/2012/03/conhecendo-o-operador-similar-to-no-postgresql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=conhecendo-o-operador-similar-to-no-postgresql</link>
		<comments>http://tas.eti.br/blog/2012/03/conhecendo-o-operador-similar-to-no-postgresql/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 02:05:02 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[Expressões Regulares]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=690</guid>
		<description><![CDATA[Olá Amigos! Prazer em revê-los novamente aqui no blog, e inicialmente eu gostaria de agradecer a audiência que vem crescendo a cada mês! Já estamos indo para 7 meses de blog e meus posts sobre o PostgreSQL estão sendo bem recebidos pela comunidade! Meu muito obrigado a vocês que fazem o blog acontecer! Tratando agora do nosso [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Amigos!</p>
<p>Prazer em revê-los novamente aqui no blog, e inicialmente eu gostaria de agradecer a audiência que vem crescendo a cada mês! Já estamos indo para<strong> 7 meses</strong> de blog e meus posts sobre o <a href="http://tas.eti.br/blog/category/postgresql/" target="_blank">PostgreSQL</a> estão sendo bem recebidos pela comunidade! Meu muito obrigado a vocês que fazem o blog acontecer!</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png"><img class="wp-image-569 aligncenter" style="border-style: initial; border-color: initial;" title="logo_w_elephant" src="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png" alt="" width="200" height="158" /></a></p>
<p style="text-align: left;">Tratando agora do nosso assunto, em um post anterior sobre a <a href="http://tas.eti.br/blog/2011/09/operador-ilike-e-voce-ainda-esta-usando-a-funcao-upper/" target="_blank">utilização do operador iLIKE</a> eu mencionei a particularidade do Postgres em realizar buscas discernindo os caracteres upper-case de low-case, no entanto há também a possibilidade de inserir expressões regulares a fim de refinar a busca, e para tal utilizamos o operador<strong> Similar To</strong>.</p>
<p>Para ilustrar o funcionamento desse operador, tome como base este problema: &#8220;Recuperar o nome das pessoas que terminam em &#8220;Silva&#8221; ou &#8220;Souza&#8221;. Aqui vocês irão me dizer que poderíamos utilizar os operados que já conhecemos como o LIKE e o iLIKE, e claro que sim, poderíamos e inclusive eu fiz algumas comparações com o desempenho, veja só:</p>
<pre class="brush: sql; gutter: true; first-line: 1">SELECT * FROM pessoas WHERE sobrenome LIKE '%SILVA' OR sobrenome LIKE '%SOUZA' -- Gastou 150 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome iLIKE '%silva' OR sobrenome iLIKE '%souza' -- Gastou 250 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome SIMILAR TO '(%SILVA|%SOUZA)' -- Gastou 350 ms com 1961 resultados
SELECT * FROM pessoas WHERE sobrenome SIMILAR TO '%(SILVA|SOUZA)' -- Gastou 300 ms com 1961 resultados</pre>
<p>Pelo menos aqui nos meus testes o Similar To se mostrou o operador mais lento, apesar de não existir nenhuma referência sobre o desempenho dele no manual. Por natureza isso se deve acontecer porque ele mescla o funcionamento dos outros operadores testados com a implementação e expressões regulares <a href="http://pt.wikipedia.org/wiki/POSIX" target="_blank">POSIX</a>. Eu não encontrei uma maneira de fazer o Similar To funcionar como o iLIKE, então se alguém tiver alguma sugestão sinta-se livre para comentar =)</p>
<p>Listei aqui abaixo os artivicios que você utlilizar para realizar junto com o Similar To como está no manual do Postgres:</p>
<ul>
<li><strong>|</strong> representa alternância (uma das duas alternativas).</li>
<li><strong>*</strong> representa a repetição do item anterior zero ou mais vezes.</li>
<li><strong>+</strong> representa a repetição do item anterior uma ou mais vezes.</li>
<li>Os parênteses <strong>()</strong> podem ser utilizados para agrupar itens em um único item lógico.</li>
<li>A expressão de colchetes <strong>[...]</strong> especifica uma classe de caracteres, do mesmo modo que na expressão regular POSIX.</li>
</ul>
<p>Seria muito interessante você dar uma lida no Manual do Postgres, lá você irá encontrar material mais completo, nas referências abaixo você tem o link que está em inglês, se preferir <a href="http://pgdocptbr.sourceforge.net/pg80/functions-matching.html" target="_blank">aqui está a versão em português</a>, só que da versão 8.0 (apensar da versão em inglês não mudar muita coisa).</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://www.postgresql.org/docs/9.0/static/functions-matching.html" target="_blank">PostgreSQL Documentation &#8211;  Parttern Matching</a></li>
<li><a href="http://www.network-theory.co.uk/docs/postgresql/vol1/SIMILARTORegularExpressions.html" target="_blank">Network Theory &#8211; Similar To Regular Expressions</a></li>
</ul>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/03/conhecendo-o-operador-similar-to-no-postgresql/&via=tiagotas&text=Conhecendo o operador Similar To no PostgreSQL&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F03%2Fconhecendo-o-operador-similar-to-no-postgresql%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/03/conhecendo-o-operador-similar-to-no-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 5.4 liberado! Novas funcionalidades e facilidades!</title>
		<link>http://tas.eti.br/blog/2012/03/php-5-4-liberado-novas-funcionalidades-e-facilidades/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=php-5-4-liberado-novas-funcionalidades-e-facilidades</link>
		<comments>http://tas.eti.br/blog/2012/03/php-5-4-liberado-novas-funcionalidades-e-facilidades/#comments</comments>
		<pubDate>Sat, 03 Mar 2012 02:04:39 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=1000</guid>
		<description><![CDATA[Olá meus caros leitores! Acho que vocês já estão acostumados com a minha ausência aqui então vamos ao que interessa! Ontem (01/03) foi liberado o PHP 5.4 e hoje estou aqui para comentar um pouco das novas funcionalidades, como a nova maneira de declarar um array, traits e um console para rodar códigos PHP diretamente! [...]]]></description>
			<content:encoded><![CDATA[<p>Olá meus caros leitores!</p>
<p>Acho que vocês já estão acostumados com a minha ausência aqui então vamos ao que interessa! Ontem (01/03) foi liberado o PHP 5.4 e hoje estou aqui para comentar um pouco das novas funcionalidades, como a nova maneira de declarar um array, traits e um console para rodar códigos PHP diretamente!</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/10/logo_php_big.jpg"><img class="aligncenter  wp-image-561" title="logo_php_big" src="http://tas.eti.br/blog/wp-content/uploads/2011/10/logo_php_big.jpg" alt="" width="255" height="134" /></a></p>
<p><strong>Novidades nos Arrays</strong></p>
<p>Quem geralmente trabalha com <a href="http://tas.eti.br/blog/category/javascript/" target="_blank">JavaScript</a> estava acostumado a uma declaração mais curta, usando os <strong>[]</strong>, assim eu peguei emprestado um exemplo do manual do PHP, dê uma olhada como é possível declarar arrays agora:</p>
<pre class="brush: php; gutter: true; first-line: 1">&lt;?php

// Antes tinha que ser assim:
$array = array(
    "foo" =&gt; "bar",
    "bar" =&gt; "foo"
);

// Agora pode ser assim também!
$array = [
    "foo" =&gt; "bar",
    "bar" =&gt; "foo"
];
?&gt;</pre>
<p>E além da nova forma de declaração também foi implementado a <strong>Array Deferencing</strong> que em outras palavras é o acesso direito de um membro do array diretamente no retorno de um método/função caso este retorne um array:</p>
<pre class="brush: php; gutter: true; first-line: 1">&lt;?php
function getArray() {
    return array(1, 2, 3);
}

// Como podemos fazer agora
$secondElement = getArray()[1];

// Como fazíamos "antigamente"
$tmp = getArray();
$secondElement = $tmp[1];

// ou assim
list(, $secondElement) = getArray();
?&gt;</pre>
<p>Bacana não é? isso vai deixar o código mais limpo e a programação mais divertida (saudades do meu tempo de programação PHP hehe).</p>
<p>&nbsp;</p>
<p><strong>Traits</strong></p>
<p>E agora para deixar mais interessante, na versão 5.4 o PHP passa a implementar Traits, que aparecem para suprir aquelas problemas que você acredita  que seriam possíveis de resolver com herança múltipla no PHP, o que os Traits fazem é uma herança horizontal, sugiro que você dê uma lida <a href="http://programe.me/traits-em-php-heranca-horizontal/" target="_blank">no post do Hélio</a> sobre isso, lá ele explicou de maneira muito proveitosa. Em todo caso abaixo você vê um exemplo da implementação deles no PHP, o exemplo foi tirado do <a href="http://php.net/traits" target="_blank">Manual do PHP</a>:</p>
<pre class="brush: php; gutter: true; first-line: 1">&lt;?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o-&gt;sayHello(); // Exibirá "Hello World"
?&gt;</pre>
<p>&nbsp;</p>
<p><strong>Build-in Web Server </strong></p>
<p>Agora o PHP implementa nativamente no seu núcleo um web server que você pode acessar via linha de comando no Linux, Windows e Mac. Dê uma olhada na <a href="http://php.net/manual/en/features.commandline.webserver.php" target="_blank">documentação oficial dele aqui</a>.</p>
<p>&nbsp;</p>
<p><strong>Melhorias Acrescentadas</strong></p>
<ul>
<li><a href="http://docs.php.net/manual/en/session.upload-progress.php" target="_blank">Informações sobre <strong>Progresso de Upload</strong> em variável $_SESSION</a> (até que enfim!!)</li>
<li>Adição de tipo de número binários</li>
<li>Suporte para sintaxe Class::{expressão}()</li>
<li>Short open tags &lt;? agora são suportadas sem necessidade de alterar o arquivo ini</li>
<li>Otimização do consumo de memória</li>
</ul>
<p>&nbsp;</p>
<p><strong>Funcionalidades Removidas</strong></p>
<ul>
<li>Register_globals, safe_mode e magic_quotes removidos.</li>
<li>y2k_compliance no arquivo ini</li>
<li>Funções de sessão: session_is_registered(), session_register() e session_unregister()</li>
<li>Extensão do sqlite agora está no <a href="http://pecl.php.net/" target="_blank">PECL</a></li>
</ul>
<div></div>
<div></div>
<p><strong>Bugs Resolvidos</strong></p>
<ul>
<li><a href="http://bugs.php.net/60879">#60879</a> unserialize() não chama  __wakeup() do objeto).</li>
<li>Correção da incompatibilidade de binários com PDO</li>
<li> <a href="http://bugs.php.net/48877">#48877</a>  &#8220;bindValue&#8221; e &#8220;bindParam&#8221; agora funcionam para o PDO Firebird</li>
<li><a href="http://bugs.php.net/55801">#55801</a> Comportamento de unserialize() mudou para melhorar performance</li>
</ul>
<div></div>
<p>Se você quiser ver toda a lista de novas funcionalidades e bugs resolvidos, olhe <a href="http://php.net/ChangeLog-5.php" target="_blank">neste link</a>.</p>
<p>Bom gente, esse foi meu simples review sobre os novos atributos da nossa querida linguagem, espero que vocês tenham gostado, e deem uma olhada na página oficial do PHP, lá vocês poderão encontrar informações e muitos mais exemplos no manual da linguagem.</p>
<p>&nbsp;</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://docs.php.net/manual/en/language.types.array.php" target="_blank">Manual do PHP &#8211; Arrays</a></li>
<li><a href="http://php.net/traits" target="_blank">Manual do PHP &#8211; Traits</a></li>
<li><a href="http://php.net/manual/en/features.commandline.webserver.php" target="_blank">Manual do PHP &#8211; Build-in Web Server</a></li>
<li><a href="http://programe.me/traits-em-php-heranca-horizontal/" target="_blank">hlegius - Traits em PHP – herança horizontal</a></li>
<li><a href="http://www.4linux.com.br/noticias/2011/webcast-tutorial-sobre-php-54-futuro.html" target="_blank">4Linux - Webcast Tutorial: Sobre o PHP 5.4 e o futuro</a></li>
<li><a href="http://duodra.co/post/php-5-4-saiba-o-que-vem-por-ai/" target="_blank">Duodraco - PHP 5.4 – saiba o que vem por aí</a></li>
</ul>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/03/php-5-4-liberado-novas-funcionalidades-e-facilidades/&via=tiagotas&text=PHP 5.4 liberado! Novas funcionalidades e facilidades!&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F03%2Fphp-5-4-liberado-novas-funcionalidades-e-facilidades%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/03/php-5-4-liberado-novas-funcionalidades-e-facilidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vídeo Aulas: Gramáticas, Autômatos, Expressões Regulares e Máquina de Turing</title>
		<link>http://tas.eti.br/blog/2012/02/video-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=video-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing</link>
		<comments>http://tas.eti.br/blog/2012/02/video-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 05:17:25 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Mestrado]]></category>
		<category><![CDATA[estrutura de dados]]></category>
		<category><![CDATA[Estudo]]></category>
		<category><![CDATA[Expressões Regulares]]></category>
		<category><![CDATA[UFSCar]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=979</guid>
		<description><![CDATA[Olá novamente meus amigos! Sei que estou um pouco sumido das postagens, mas é por uma boa causa, depois que ingressei no mestrado da UFSCar estou tendo que estudar para alguns temas que serão abordados nas disciplinas do programa, e sendo assim hoje estou trazendo alguns assuntos que estou estudando, e hoje trago para vocês [...]]]></description>
			<content:encoded><![CDATA[<p>Olá novamente meus amigos!</p>
<p>Sei que estou um pouco sumido das postagens, mas é por uma boa causa, depois que ingressei no<a href="http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/" target="_blank"> mestrado da UFSCar</a> estou tendo que estudar para alguns temas que serão abordados nas disciplinas do programa, e sendo assim hoje estou trazendo alguns assuntos que estou estudando, e hoje trago para vocês os assuntos da disciplina de <a href="http://ppgcc.dc.ufscar.br/disciplinas/obrigatorias/CCO-410%20-%20Aspectos%20Formais%20da%20Computacao.docx/view" target="_blank">Aspectos Formais da Computação</a>.</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg"><img class="aligncenter  wp-image-879" title="ufscar" src="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg" alt="" width="240" height="167" /></a></p>
<p>Além de estudar com alguns livros (achei esse livro disponível: <a href="http://www.ebah.com.br/content/ABAAAAtNMAL/introducao-a-teoria-computacao" target="_blank">Introdução a Teoria da Computação</a>, muito didático, vale a pena dar uma olhada),  apostilas e apresentações (<a href="http://www.slideshare.net/marcoarthur/teoria-da-computacao-cap-1-presentation" target="_blank">Slides Teoria da Computação &#8211; USP</a> e <a href="http://www.slideshare.net/wab030/aula-5-linguagens-regularese-automatosfinitosnodeterministico" target="_blank">Teoria da Computação</a> (mais simplificada), estou me utilizando de vídeo aulas, que estão sendo bem esclarecedoras. E assim como fiz no <a href="http://tas.eti.br/blog/2011/12/vamos-aprender-sobre-a-zend-framework/" target="_blank">post sobre a Zend Framework</a> eu separei as vídeo aulas que estão me ajudando a compreender os assuntos da disciplina, em destaque para as aulas do <a href="https://sites.google.com/site/eaoufpe/" target="_blank">Prof. Eduardo</a>, no seu <a href="http://www.youtube.com/user/eaoufpe/videos" target="_blank">canal do YouTube</a> encontrei 8 vídeos publicados que tratam desde os conceitos básicos de conjuntos, alfabetos e cadeias, até Máquina de Estados Finitos com Expressões Regulares, veja:</p>
<ul>
<li><a href="http://www.youtube.com/watch?v=6djUgfpa5-E&amp;feature=plcp&amp;context=C3989e7fUDOEgsToPDskLlgi02kFflwK6-P94yVm-y" target="_blank">Vídeo Aula 1 &#8211; Formalismos, Classes de Linguagens e Autômato Finito Determinístico</a></li>
<li><a href="http://www.youtube.com/watch?v=4LjtgA64RXU&amp;feature=plcp&amp;context=C3e409ffUDOEgsToPDskIZCWRgvkm8zppC_22vKxO6" target="_blank">Vídeo Aula 2 &#8211; Máquina de Estados Finitos</a></li>
<li><a href="http://www.youtube.com/watch?v=ijbR_irWzGY&amp;feature=plcp&amp;context=C32c548cUDOEgsToPDskJEsmjYUjB0Atc7cvCkiEaf" target="_blank">Vídeo Aula 3 &#8211; Autômato Finito Determinístico (continuação)</a></li>
<li><a href="http://www.youtube.com/watch?v=LGApONHq8LI&amp;feature=plcp&amp;context=C384d324UDOEgsToPDskIsDHakGPdOS03uN0mr7_CL" target="_blank">Vídeo Aula 4 &#8211; Autômato Finito Determinístico vs. Autômato Finito Não Determinístico</a></li>
<li><a href="http://www.youtube.com/watch?v=V4I7EBrMYmY&amp;feature=plcp&amp;context=C371db71UDOEgsToPDskIbnl5GD7vmY6nFKza2AbRS" target="_blank">Vídeo Aula 5 &#8211; Equivalência Autômato Finito Determinístico e Não Determinístico</a></li>
<li><a href="http://www.youtube.com/watch?v=H3oBiwQFKbs&amp;feature=plcp&amp;context=C3ea2d30UDOEgsToPDskJCxkrJsApmyIsf2zMgnotm" target="_blank">Vídeo Aula 6 &#8211; Autômato Finito Não Determinístico com transições ε</a></li>
<li><a href="http://www.youtube.com/watch?v=49KheYbQ_RQ&amp;feature=plcp&amp;context=C3b63ad9UDOEgsToPDskJyZT_czrtTSHwMjonRs-YZ" target="_blank">Vídeo Aula 7 &#8211; Linguagens e Expressões Regulares</a></li>
<li><a href="http://www.youtube.com/watch?v=6Bm-JGhRw_w&amp;feature=plcp&amp;context=C33b41efUDOEgsToPDskIowcj5skbgPbcgwEUK1VxU" target="_blank">Vídeo Aula 8 &#8211; Autômatos Finitos e Expressões Regulares</a></li>
</ul>
<p>Veja aqui outros vídeos interessantes que estou estudando:</p>
<ul>
<li><a href="http://www.youtube.com/watch?v=zqUU-fXdfos" target="_blank">Máquina de Turing, UFAL</a> (a explicação no vídeo não é muito didática, mas a animação ajuda no entendimento)</li>
<li><a href="http://www.youtube.com/watch?v=phEBQ-tyLGs&amp;feature=player_embedded" target="_blank">Autômatos com pilhas</a>, 1:35 hrs de aula, em espanhol (<strong>!!!</strong>)</li>
<li><a href="http://www.youtube.com/watch?v=e8tdtnDmUpE" target="_blank">Curso de Estrutura de Dados (USP)</a>, vale a pena dar uma olhada no<a href="http://www.youtube.com/user/labpib/videos" target="_blank"> canal do YouTube</a></li>
</ul>
<p>Então é isso ai galera, conforme eu for tendo tempo, vou postando algo para vocês!</p>
<p>Abração,</p>
<p><a title="Quem mantem este blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/02/video-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing/&via=tiagotas&text=Vídeo Aulas: Gramáticas, Autômatos, Expressões Regulares e Máquina de Turing&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F02%2Fvideo-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/02/video-aulas-gramaticas-automatos-expressoes-regulares-e-maquina-de-turing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculando previsão de vendas com PHP e PostgreSQL</title>
		<link>http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calculando-previsao-de-vendas-com-php-e-postgresql</link>
		<comments>http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 03:44:49 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[postgresql]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=676</guid>
		<description><![CDATA[Olá Amigos! Hoje eu vou tratar de um assunto da época da faculdade, o cálculo da previsão de vendas de um determinado produto, com base nas vendas anteriores, para tal iremos utilizar o PostgreSQL e PHP. Mas antes de mais nada, estou disponibilizando um documento do Excel com os mesmos dados da figura abaixo, juntamente com [...]]]></description>
			<content:encoded><![CDATA[<p>Olá Amigos!</p>
<p>Hoje eu vou tratar de um assunto da época da <a title="Veja o post sobre a Fatec Mococa" href="http://tas.eti.br/blog/2011/11/fatec-mococa-12-melhor-faculdade-publica-do-pais/" target="_blank">faculdade</a>, o cálculo da previsão de vendas de um determinado produto, com base nas vendas anteriores, para tal iremos utilizar o <a title="Mais posts sobre PostgreSQL" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">PostgreSQL</a> e <a title="Mais posts sobre PHP" href="http://tas.eti.br/blog/category/php/" target="_blank">PHP</a>.</p>
<p style="text-align: center;"><a style="text-align: center;" href="http://tas.eti.br/blog/wp-content/uploads/2012/01/postgres-php.jpg"><img class="size-full wp-image-956 aligncenter" style="border-style: initial; border-color: initial;" title="postgres-php" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/postgres-php.jpg" alt="" width="254" height="147" /></a></p>
<p>Mas antes de mais nada, estou disponibilizando um <a title="Faça o donwload do exemplo aqui!" href="http://tas.eti.br/blog/wp-content/uploads/2012/01/Modelo-de-Previsão-de-Vendas.xls" target="_blank">documento do Excel</a> com os mesmos dados da figura abaixo, juntamente com um gráfico contendo os resultados e informações importantes como o valor do r² e a equação do nosso modelo. Também achei importante disponibilizar os <a title="Download dos slides" href="http://tas.eti.br/blog/wp-content/uploads/2012/01/Análise-de-Regressão-aplicação-a-custos.ppt" target="_blank">slides utilizados</a> pelo Prof. Darlan quando este assunto foi ministrado, lá você irá encontrar mais conteúdo e uma bagagem teórica solida e enxuta.</p>
<p>Primeiramente vamos ao nosso problema:</p>
<blockquote><p><em>Quanto eu devo investir em publicidade para ter um determinado ganho em vendas?</em></p></blockquote>
<p>Quando nós chegarmos ao ponto de extrair os dados do Postgres perceberemos que na modelagem do banco estes dados (investimento e vendas) não tem nenhuma correlação, veja bem, do ponto de vista da modelagem. Por isso é muito importante que você compreenda bem nosso problema, e para simplificar na tabela abaixo temos os investimentos (ou gastos) com publicidade representado pela<strong> variável x</strong>, e as vendas representadas pela <strong>variável y</strong>. Note que além desses dados temos outros como <strong>x²</strong>, <strong>y²</strong> e<strong> xy</strong>, que iremos utilizar posteriormente.</p>
<p><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_tabela.jpg"><img class="aligncenter size-full wp-image-943" title="previsao_vendas_formula_tabela" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_tabela.jpg" alt="" width="439" height="136" /></a></p>
<p>Veremos estes mesmos dados a seguir quando estivermos trabalhando no banco de dados, coloquei a tabela de ante-mão para abstrair melhor nosso trabalho, e  na seção seguinte do post iremos abordar os conceitos matemáticos envolvidos e os nomes das colunas (as variáveis) irão aparecer nas fórmulas, e como já vimos estruturadamente, ficará mais fácil.</p>
<p>O objetivo então é que possamos construir uma aplicação que nos informe qual será o valor que iremos vender, baseando-se no valor que iremos investir em publicidade.</p>
<p>Ahh, antes que os mais críticos se envolvam, gostaria de dizer que este é um exemplo simples, se você quiser pode melhora-lo de acordo com a sua necessidade <img src='http://tas.eti.br/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p><strong>A matemática por traz do cálculo</strong></p>
<p>Antes que muitos torçam o nariz ou pulem essa parte, já vou adiantando que nossa matemática será breve e simples. É fundamental que você entenda essas fórmulas (além de ler os slides que falei acima) para entender como funciona o nosso modelo.</p>
<p>E por falar em modelo, aqui temos um estatístico probabilístico, de <strong>regressão linear simples</strong>. Veja a representação do nosso modelo de equação abaixo:</p>
<p style="text-align: center;"><a style="text-align: center;" href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_modelo_regressao_simples.jpg"><img class="size-full wp-image-944 aligncenter" style="border-style: initial; border-color: initial;" title="previsao_vendas_modelo_regressao_simples" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_modelo_regressao_simples.jpg" alt="" width="221" height="64" /></a></p>
<p>Aqui temos que a variável y é <strong>explicada</strong> pela variável x, que por sua vez é <strong>explicativa</strong>. Então veja que, se estamos representando os gastos com publicidade por x, e as vendas por y, temos que os gastos com publicidade é que vão <strong>determinar</strong> o valor das vendas.</p>
<p>Note também que temos dois coeficientes, chamados de <strong>a</strong> e <strong>b</strong>. As duas fórmulas a seguir irão utilizar os nossos dados que estão na tabela (conforme a figura da primeira seção), que na  verdade iremos regastar do Postgres. Veja que abaixo temos a representação da fórmula onde iremos encontrar o <strong>valor de a</strong>:</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_a.jpg"><img class="size-full wp-image-941 aligncenter" title="previsao_vendas_formula_a" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_a.jpg" alt="" width="166" height="70" /></a><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg"><br />
</a></p>
<p>Você deve ter percebido que para calcular o valor de a, antes é necessário obter o valor de b, pois bem, abaixo está a fórmula para o cálculo, veja um detalhe importante: o valor de <strong>n</strong> é exatamente o número de linhas da nossa tabela (ou o número de registros no banco de dados).</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg"><img class="size-full wp-image-942 aligncenter" style="border-style: initial; border-color: initial;" title="previsao_vendas_formula_b" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_b.jpg" alt="" width="252" height="76" /></a></p>
<div></div>
<p>Agora que você já tem as duas fórmulas poderá chegar na equeção linear do nosso modelo, que será parecida com esta:</p>
<blockquote><p> y = 2,0754 + 2,0884.x</p></blockquote>
<p>&nbsp;</p>
<p><strong>Como saber se o modelo é confiável?</strong></p>
<p>Para sabermos se o nosso modelo é confiável contaremos com o <a href="http://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_Pearson" target="_blank">Coeficiente de Correlação de Person</a>, ou o famoso <strong>r²</strong>. Podemos calcular o valor do nosso coeficiente com a singela fórmula abaixo:</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_r_quadrado.jpg"><img class="size-full wp-image-940 aligncenter" title="previsao_vendas_formula_r_quadrado" src="http://tas.eti.br/blog/wp-content/uploads/2012/01/previsao_vendas_formula_r_quadrado.jpg" alt="" width="381" height="64" /></a></p>
<p>O resultado de r², irá variar entre -1 e 1, de forma que dependendo da variação, ela terá estes significados:</p>
<ul>
<li><strong>r² = -1</strong> : Existe uma correlação inversa entra as variáveis, ou seja, quando uma aumenta a outra diminui.</li>
<li><strong>r² = 0</strong> : Modelo ruim, quanto mais próximo de 0, menos acertivo será seu modelo.</li>
<li><strong>r² = 1</strong> : Significa que seu modelo é muito bom! Ou seja, quanto mais próximo de 1, melhor!</li>
</ul>
<p>No nosso exemplo, r² é de aproximadamente <strong>0,93</strong> e observe que ele está bem próximo de 1, o que nos indica que nosso<strong> modelo é consistente</strong>.</p>
<p>&nbsp;</p>
<p><strong>Construção das tabelas, queries, e dados no <a title="Veja mais posts sobre o PostgreSQL" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">PostgreSQL</a></strong></p>
<p>Este é o ponto mais importante do trabalho, aqui é onde iremos armazenar os dados que servirão de base para construírmos o modelo estatístico de previsão, para isso tome como base as duas tabelas a seguir conforme o modelo mostrado anteriormente:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TABLE investimento_publicidade (
	cod_investimento SERIAL,
	valor_investimento DOUBLE PRECISION NOT NULL,
	data_realizacao TIMESTAMP NOT NULL DEFAULT NOW(),
	PRIMARY KEY (cod_investimento)
);</pre>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TABLE vendas (
	id_produto SERIAL,
	nome VARCHAR(100) NOT NULL,
	preco_unitario DOUBLE PRECISION NOT NULL,
	quantidade_vendida INTEGER NOT NULL,
	PRIMARY KEY (id_produto)
);</pre>
<p>Agora iremos abastacer o nosso modelo com os mesmos dados que utilizamos acima. Para agilizar e para podermos testar depois, disponibilizei o script SQL com as instruções INSERT abaixo:</p>
<pre class="brush: sql; gutter: true; first-line: 1">INSERT INTO investimento_publicidade (valor_investimento) VALUES (3);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (4);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (8);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (12);
INSERT INTO investimento_publicidade (valor_investimento) VALUES (14);

INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto A', 7 , 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto B', 14, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto A', 15, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto C', 28, 1);
INSERT INTO vendas (nome, preco_unitario, quantidade_vendida) VALUES ('Produto C', 32, 1);</pre>
<p>Muito bem! Agora temos os nossos dados, e neste ponto vamos extaí-los do banco para elaborarmos a equação do nosso modelo de previsão com o PHP!</p>
<p>Então, considere as duas queries abaixo, primeiramente a query que nos retornará os valores investidos em publicidade:</p>
<pre class="brush: sql; gutter: true; first-line: 1">SELECT SUM(valor_inestimento) AS x_somatoria_invest_publicidade, SUM(valor_inestimento^2) AS x_quadrado
FROM investimento_publicidade</pre>
<p>Veja o que estamos retornando nesta query: a nossa <strong>variável x</strong>, que é a somatória dos valores investidos em publicidade e o <strong>x²</strong>, que iremos utilizar nas fórmulas.</p>
<p>E agora a query com os valores das vendas:</p>
<pre class="brush: sql; gutter: true; first-line: 1">SELECT SUM((preco_unitario*quantidade_vendida)) AS y_somatoria_vendas, SUM((preco_unitario*quantidade_vendida)^2) AS y_quadrado
FROM vendas</pre>
<p>Ok, temos retorno das <strong>variáveis y e y²</strong>, repare que eu fiz umas brincadeirinhas, como a multiplicação do valor vendido pelo preço unitário, se você quiser pode brincar um pouco com os modelos depois alterando estes valores diretamente na tabela vendas.</p>
<blockquote><p><strong>NOTA:</strong> Eu poderia realizar toda a previsão de vendas somente dentro do Postgres, mas aqui quero utilizar o máximo de ferramentas possíveis, a previsão de vendas somente no PostgreSQL fica para um próximo post ok? =)</p></blockquote>
<p>&nbsp;</p>
<p><strong>Exibição do modelo e simulação de dados com <a title="Veja mais posts sobre o PostgreSQL" href="http://tas.eti.br/blog/category/php/" target="_blank">PHP</a></strong></p>
<p>Veja abaixo o código de uma classe que irá realizar tanto os cálculos quanto as queries no Postgres, os comentários no código já explicam o que está acontecendo:</p>
<pre class="brush: php; gutter: true; first-line: 1">class PrevisaoVendas
{
	/**
	 * Atributo estático onde armazenaremos nosso objeto PDO para nossa comunicação com o banco de dados.
	 */
	private static $conn;

	/**
	 * Construtor da classe onde criamos e armazenamos nosso objeto PDO.
	 */
	public function __construct()
	{
		$opcoes_conexao = array(PDO::ATTR_ERRMODE    =&gt; PDO::ERRMODE_EXCEPTION,
								PDO::ATTR_PERSISTENT =&gt; true);

		self::$conn = new PDO("pgsql:host=127.0.0.1 dbname=PREVISAO_VENDAS", "postgres", "senha", $opcoes_conexao);
	}

	/**
	 * Método responsável por retornar um objeto (stdClass) com os valores do x e x quadrado (investimento em publicidade)
	 */
	private function getValoresInvestimentosX()
	{
		$sql = "SELECT SUM(valor_inestimento) AS x_somatoria_invest_publicidade, SUM(valor_inestimento^2) AS x_quadrado "
		     . "FROM investimento_publicidade";

		$stmt = self::$conn-&gt;prepare($sql);
		$stmt-&gt;execute();

		return $stmt-&gt;fetchObject();
	}

	/**
	 * Método responsável por retornar um objeto (stdClass) com os valores do y e y quadrado (vendas)
	 */
	private function getValoresVendasY()
	{
		$sql = "SELECT SUM((preco_unitario*quantidade_vendida)) AS y_somatoria_vendas, SUM((preco_unitario*quantidade_vendida)^2) AS y_quadrado "
			 . "FROM vendas";

		$stmt = self::$conn-&gt;prepare($sql);
		$stmt-&gt;execute();

		return $stmt-&gt;fetchObject();
	}

	/**
	 * Método que calcula o valor de xy, a dica é você olha no manual do PHP as funções array_combine e array_sum
	 */
	private function getValorXY()
	{
		/**
		 * Obtendo os valores de x;
		 */
		$stmt = self::$conn-&gt;prepare("SELECT valor_inestimento AS x FROM investimento_publicidade LIMIT 5");
		$stmt-&gt;execute();

		$x = array();

		while($rows = $stmt-&gt;fetchObject())
			$x[] = $rows-&gt;x;

		/**
		 * Obtendo os valores de y;
		 */
		$stmt = self::$conn-&gt;prepare("SELECT preco_unitario*quantidade_vendida AS y FROM vendas LIMIT 5");
		$stmt-&gt;execute();

		$y = array();

		while($rows = $stmt-&gt;fetchObject())
			$y[] = $rows-&gt;y;

		/**
		 * Calculando o valor da soma de xy
		 */
		$xy_aux = array_combine($x, $y);

		$xy = array();

		foreach($xy_aux as $key =&gt; $value)
			$xy[] = $key * $value;

		return array_sum($xy);
	}

	/**
	 * Obtem o número de registros de vendas, o "n" utilizado nas equações, observe que o número de vendas poderá não ser igual ao número de
	 * investimentos, caberá a você criar um mecanismo para definir que sempre os dados analizados estarão na mesma proporção e consistentes,
	 * uma dica é a utilização de LIMIT e OFFSET.
	 */
	private function getNumVendas()
	{
		$sql = "SELECT COUNT(*) FROM vendas";

		$stmt = self::$conn-&gt;prepare($sql);
		$stmt-&gt;execute();

		return $stmt-&gt;fetchColumn();
	}

	/**
	 * Método onde estamos resolvendo a equação para encontrar o valor de "a".
	 */
	private function getValorEquacaoA()
	{
		$x = $this-&gt;getValoresInvestimentosX();
		$y = $this-&gt;getValoresVendasY();
		$n = $this-&gt;getNumVendas();
		$b = $this-&gt;getValorEquacaoB();	

		$a = ($y-&gt;y_somatoria_vendas - ($b * $x-&gt;x_somatoria_invest_publicidade)) / $n;

		return $a;
	}

	/**
	 * Método onde estamos resolvendo a equação para encontrar o valor de "b".
	 */
	private function getValorEquacaoB()
	{
		$x  = $this-&gt;getValoresInvestimentosX();
		$y  = $this-&gt;getValoresVendasY();
		$n  = $this-&gt;getNumVendas();
		$xy = $this-&gt;getValorXY();		

		$b = (($n * $xy) - ($x-&gt;x_somatoria_invest_publicidade * $y-&gt;y_somatoria_vendas)) / (($n * $x-&gt;x_quadrado) - pow($x-&gt;x_somatoria_invest_publicidade, 2));

		return $b;
	}

	/**
	 * Método para a identificação do valor de r quadrado, onde veremos que conforme o valor do índice teremos o nível de confiabilidade do modelo.
	 */
	public function getValorRQuadrado()
	{
		$x  = $this-&gt;getValoresInvestimentosX();
		$y  = $this-&gt;getValoresVendasY();
		$n  = $this-&gt;getNumVendas();
		$xy = $this-&gt;getValorXY();	

		$r = (($n * $xy) - ($x-&gt;x_somatoria_invest_publicidade * $y-&gt;y_somatoria_vendas)) / (sqrt(($n * $x-&gt;x_quadrado) - pow($x-&gt;x_somatoria_invest_publicidade, 2)) * sqrt(($n * $y-&gt;y_quadrado) - pow($y-&gt;y_somatoria_vendas, 2)));

		$r_quadrado = pow($r, 2);

		return $r_quadrado;
	}

	/**
	 * Método para obteção de uma string contendo a fórmula do modelo.
	 */
	public function getStringFormulaModeloPrevisor()
	{
		$a = $this-&gt;getValorEquacaoA();
		$b = $this-&gt;getValorEquacaoB();

		$string = "y = " . number_format($a, 4, ",", "") . " + " . number_format($b, 4, ",", "") . ".x";

		return $string;
	}

	/**
	 * Método que capta um dado valor em investimento de publicidade, e por meio do nosso modelo, retorna a previsão das vendas.
	 */
	public function getValorSimuladoVendas($valor_invest_publicidade)
	{
		$a = $this-&gt;getValorEquacaoA();
		$b = $this-&gt;getValorEquacaoB();

		$y = $a + ($b * $valor_invest_publicidade);		

		return $y; // Nosso valor estimado das vendas.
	}
}</pre>
<p>Veja um exemplo de utilização da classe:</p>
<pre class="brush: php; gutter: true; first-line: 1">$preview = new PrevisaoVendas();

$preview-&gt;getStringFormulaModeloPrevisor(); // Irá nos retornar a fórmula.
$preview-&gt;getValorRQuadrado();              // Valor do r quarado com a precisão do nosso modelo.
$preview-&gt;getValorSimuladoVendas(10.0);     // Retorna o valor das vendas, se no caso, invesrtirmos $ 10,00 em propaganda.</pre>
<p>Então amigos, é isso ai, espero que vocês tenham gostado da simplória abordagem. Eu gostaria muito de saber das experiências de vocês, então fiquem a vontade para comentar!</p>
<p>&nbsp;</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://tas.eti.br/blog/wp-content/uploads/2012/01/Análise-de-Regressão-aplicação-a-custos.ppt" target="_blank">Análise de Regressão &#8211; Slides</a></li>
<li><a href="http://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_Pearson" target="_blank">Wikipedia &#8211; Coeficiente de Correlação de Person</a></li>
<li><a href="http://www.php.net/manual/pt_BR/function.pow.php" target="_blank">PHP Documentation &#8211; Função pow()</a></li>
<li><a href="http://www.php.net/manual/pt_BR/function.sqrt.php" target="_blank">PHP Documentation &#8211; Função sqrt()</a></li>
<li><a href="http://php.net/manual/pt_BR/function.array-combine.php" target="_blank">PHP Documentation &#8211; Função array_combine()</a></li>
<li><a href="http://www.php.net/manual/pt_BR/function.array-sum.php" target="_blank">PHP Documentation &#8211; Função array_sum()</a></li>
</ul>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/&via=tiagotas&text=Calculando previsão de vendas com PHP e PostgreSQL&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F01%2Fcalculando-previsao-de-vendas-com-php-e-postgresql%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/01/calculando-previsao-de-vendas-com-php-e-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adeus 2011, que venha 2012!</title>
		<link>http://tas.eti.br/blog/2012/01/adeus-2011-que-venha-2012/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=adeus-2011-que-venha-2012</link>
		<comments>http://tas.eti.br/blog/2012/01/adeus-2011-que-venha-2012/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 03:01:59 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[Cotidiano]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=907</guid>
		<description><![CDATA[Olá novamente meus caros amigos! Este é o meu primeiro post de 2012! E primeiramente gostaria de agradecer a todos vocês que vem acompanhando meu trabalho desde o começo, nesses 4 meses  de blog, e digo que nesse curto período de tempo já obtive uma ótima experiência compartilhando um pouco do meu conhecimento e dia [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-top */
google_ad_slot = "2716329990";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<p>Olá novamente meus caros amigos!</p>
<p>Este é o meu primeiro post de 2012! E primeiramente gostaria de agradecer a todos vocês que vem acompanhando meu trabalho desde <a title="Meu primeiro post!" href="http://tas.eti.br/blog/2011/09/comecando/" target="_blank">o começo</a>, nesses 4 meses  de blog, e digo que nesse curto período de tempo já obtive uma ótima experiência compartilhando um pouco do meu conhecimento e dia a dia aqui com vocês.</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/feliz-ano-novo.jpg"><img class="aligncenter  wp-image-908" title="feliz-ano-novo" src="http://tas.eti.br/blog/wp-content/uploads/2011/12/feliz-ano-novo.jpg" alt="" width="252" height="242" /></a></p>
<p>Neste novo ano que se inicia minha vida passará por grandes mudanças, estou deixando a vida corporativa para me dedicar a carreira acadêmica, como vocês já devem ter visto no post sobre <a title="Veja o post de quando entrei no mestrado" href="http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/" target="_blank">meu mestrado</a>, e assim estou finalizando 2011 muito feliz e realizado, apesar de não ter sido um dos anos mais produtivos da minha vida, no entanto tenho a esperança de agora em 2012 poderei realizar tudo que sonhei. Tenho certeza que meu trabalho na UFSCar vai render bons frutos e me colocar onde eu sempre quis estar.</p>
<p>Quanto ao blog acredito que irei blogar o resto da vida, a experiência é fantástica e animadora quando se começa a colher os resultados do trabalho, e estou me referindo ao reconhecimento e renome que esta atividade traz. E falando mais sobre o blog, eu fiz uma especie de &#8220;raio-x&#8221; dos resultados e coloquei abaixo, e dedico o sucesso a você, meu caro leitor que acompanha meu trabalho!</p>
<p>&nbsp;</p>
<p><strong>O Blog em Números</strong></p>
<p>Separei para vocês alguns números do blog, não são exagerados mas considero um bom resultado. Hoje estamos com cerca de 40 posts publicados com conteúdos novos ou releituras de temas mais batidos, além de mais de 90 rascunhos já titulados de assuntos que pretendo tratar aqui com vocês! E claro irão existir muitos que ainda virão no decorrer do ano.</p>
<p>Quanto ao tráfego não tenho do que reclamador em termos de números, estamos crescendo bem! Segundo o Google Analytics, em torno de <strong>150%</strong> ao mês em <strong>visitas únicas</strong>, no mês de dezembro foram <strong>700</strong>! As visualizações de página também evoluem de acordo, e posso dizer que o plugin do WordPress chamado <a title="Veja o site do Plugin!" href="http://alphasis.info/developments/wordpress-plugins/related-posts-via-categories/" target="_blank">Related Posts via Categories</a> ajudou muito, pois além de baixar a taxa de rejeição de cerca de <strong>70% para 49%</strong> no mesmo período, ainda expandiu as pageviews para mais de <strong>2000</strong>!</p>
<p>Tenho que destacar também a indexação dos <a title="Veja a lista de posts publicados!" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">posts sobre PostgreSQL</a> por parte do <a title="Veja outros blogs indexados!" href="http://planeta.postgresql.org.br/" target="_blank">Planeta PostgreSQL</a>. Além de ajudar muito na geração de novas visitas, também é uma honra, já que agora estamos dentro da Comunidade Oficial do PostgreSQL no Brasil, estou ficando muito feliz pois os dados revelam que o pessoal tem gostado da minha abordagem sobre o tema!</p>
<p>No entanto nem tudo são flores, existem dados que quero mudar em 2012, um deles é a origem do tráfego, sendo que hoje cerca de 80% é provida pelos sites de referência, e ai incluem-se também as redes sociais, e a porcentagem de visitas oriundas do Google é de  apenas 10% das visitas, e ainda o dado mais alarmante é que em todo o período do blog ainda não registrei visitas de outros buscadores, apesar de todos os relatórios apontarem que todo conteúdo está indexado. Dessa maneira eu gostaria de inverter essa proporção, para o blog &#8220;andar mais sozinho&#8221;.</p>
<p>Outro ponto que está me incomodando muito é a nota do Page Rank, que atualmente é de um <strong>bem redondo ZERO</strong>! Estou trabalhando para mudar, no fechamento do ano a Ferramenta para Webmasters do Google me retornava que haviam cerca de 1000 links para os conteúdos do blog, e espero que este ano suba cada vez mais!</p>
<p>&nbsp;</p>
<p><strong>O que esperar para 2012?</strong></p>
<p>Como mencionei acima tenho muita coisa para escrever ainda e compartilhar com vocês! E espero que o conteúdo seja tão relevante para vocês quando é para mim! Sendo assim, o que esperar do blog para 2012? Um novo layout, a abordagem de <strong>novos temas</strong> como Java e <a title="Veja os posts sobre a Zend Framework" href="http://tas.eti.br/blog/category/php/zend-framework/" target="_blank">Zend Framework</a>. Também estou pensando seriamente em submeter alguns trabalhos no formato de palestras para os simpósios semestrais da <a title="Veja mais sobre a Fatec Mococa neste post!" href="http://tas.eti.br/blog/2011/11/fatec-mococa-12-melhor-faculdade-publica-do-pais/" target="_blank">Fatec Mococa</a> (o que vocês acham disso fatecanos?) e claro disponibilizar o material aqui.</p>
<p>Assim espero que vocês que já acessam continuem e que possam trazer novos visitandes compartilhando do nosso conhecimento!</p>
<p>Abraços e um Feliz Ano Novo!</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-button */
google_ad_slot = "5761791599";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2012/01/adeus-2011-que-venha-2012/&via=tiagotas&text=Adeus 2011, que venha 2012!&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2012%2F01%2Fadeus-2011-que-venha-2012%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2012/01/adeus-2011-que-venha-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipulando Triggers no PostgreSQL</title>
		<link>http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=manipulando-triggers-no-postgresql</link>
		<comments>http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 03:01:53 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[postgresql]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=100</guid>
		<description><![CDATA[Olá novamente caros leitores! Primeiramente me desculpem pela demora para liberar uma nova postagem sobre o Postgres, é que as últimas semanas foram muito movimentadas, realizei minha entrevista na UFSCar para o ingresso no programa de mestrado do Departamento de Computação e ainda na semana retrasada recebi a notícia da minha aprovação, então imaginem o [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-top */
google_ad_slot = "2716329990";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<p>Olá novamente caros leitores!</p>
<p>Primeiramente me desculpem pela demora para liberar uma nova <a title="Veja mais posts sobre o PostgreSQL" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">postagem sobre o Postgres</a>, é que as últimas semanas foram muito movimentadas, realizei minha entrevista na UFSCar para o ingresso no programa de <a title="Veja meu post sobre a entrada no mestrado" href="http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/" target="_blank">mestrado</a> do Departamento de Computação e ainda na semana retrasada recebi a notícia da minha aprovação, então imaginem o tamanho da felicidade e a correria com as festas de fim de ano.</p>
<p style="text-align: center;"><a style="text-align: center;" href="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png"><img class="aligncenter" style="border-style: initial; border-color: initial;" title="logo_w_elephant" src="http://tas.eti.br/blog/wp-content/uploads/2011/11/logo_w_elephant.png" alt="" width="250" height="198" /></a></p>
<p>Bom, mas vamos ao que interessa, hoje irei falar sobre as triggers, ou funções de gatilho, como você queria chamar. Uma das coisas mais interessantes da implementação das funções no <a title="Aqui você pode encontrar mais conteúdo!" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">Postgres</a> é que você pode escolher qual linguagem vai usar para programar sua trigger! Isso mesmo, então antes de mais nada, eu separei abaixo a lista de algumas linguagens, e o link para mais informações sobre elas, veja:</p>
<ul>
<li><a title="Manual da Linguagem em Português" href="http://pgdocptbr.sourceforge.net/pg80/plpgsql.html" target="_blank">PL/PGSQL</a></li>
<li><a title="Mais informações sobre a PL/TCL (in english)" href="http://www.postgresql.org/docs/devel/static/pltcl.html" target="_blank">PL/Tcl</a></li>
<li><a title="Mais informações sobre a PL/Perl (in english)" href="http://www.postgresql.org/docs/9.1/interactive/plperl.html" target="_blank">PL/Perl</a></li>
<li><a title="Mais informações sobre a PL/Python (in english)" href="http://www.postgresql.org/docs/current/static/plpython.html" target="_blank">PL/Python</a></li>
<li><a title="Veja mais neste link" href="http://pgfoundry.org/projects/pljava/" target="_blank">PL/Java</a> (veja <a title="Na versão 8.3 do PostgreSQL" href="http://marcelocosta.wordpress.com/2008/02/19/pljava-postgresql-83/" target="_blank">aqui</a> ou <a href="http://seiti.eti.br/blog/2009/instalando-pljava-no-postgresql" target="_blank">aqui</a> como instalar a <a title="Download do pacote de instalação aqui!" href="http://pgfoundry.org/projects/pljava/" target="_blank">PL/Java</a>)</li>
</ul>
<p>Agora que você já sabe dessa maravilha do Postgres irei dizer que aqui, iremos exemplificar as triggers <strong>utilizando a PL/pgSQL</strong>. Mas antes da prática no código fonte, iremos trabalhar um pouco sobre a definição e funcionamento das triggers no PostgreSQL.</p>
<p>Você deve saber que os nossos gatilhos funcionam baseados em eventos, dois: <strong>before</strong> (antes de alguma coisa) e <strong>after</strong> (depois de alguma coisa). Explicando: você pode determinar que uma trigger dispare após (after) a inserção em determinada tabela do banco ou antes (before) da tal inserção, por exemplo.</p>
<p>É muito importante que você dê uma olhada abaixo na lista de variáveis que podem ser utilizadas dentro da estrutura da função da sua trigger, vale a pena dar uma lida, no entanto existem duas que a leitura é obrigatoria, que são a <strong>new</strong> e a <strong>old</strong>. Elas são usadas da seguinte maneira:</p>
<ul>
<li><strong>NEW</strong>: No caso da trigger ser disparada por um INSERT a variável NEW irá abrigar os valores a ser inseridos, e caso seja um evento do tipo UPDATE, NEW irá conter a nova versão dos valores a serem atualizados (veja o exemplo no código abaixo).</li>
<li><strong>OLD</strong>: Esta variável é utilizada no caso do evento DELETE armazena os dados que estão sendo excluídos, e no caso do UPDATE a versão antiga dos dados.</li>
</ul>
<p>O acesso dos dados se dá em ambas as variáveis dessa maneira: NEW.COD_CLIENTE, por exmplo. Abaixo você verá o exemplo de uma trigger.</p>
<p>&nbsp;</p>
<p><strong>Outras variáveis especiais que você pode usar:</strong></p>
<ul>
<li><strong>TG_NAME</strong>: Contém o nome do trigger que foi disparado.</li>
<li><strong>TG_WHEN</strong>: Contem quando o evento foi disparado, sendo BEFORE ou AFTER.</li>
<li><strong>TG_LEVEL</strong>: Diz em qual ponto da trigger.</li>
<li><strong>TG_OP</strong>: Tipo de operção que está sendo executada: INSERT, UPDATE ou DELETE.</li>
<li><strong>TG_RELID</strong>: Contém a ID do objeto que está disparando o gatilho.</li>
<li><strong>TG_RELNAME</strong>: Nome da tabela que disparou o gatilho (obsoleto).</li>
<li><strong>TG_TABLE_NAME</strong>: Nome da tabela que disparou o gatilho.</li>
<li><strong>TG_NAME_SCHEMA</strong>: Nome do <a title="Veja meu post sobre Schemas!" href="http://tas.eti.br/blog/2011/09/utilizando-schemas-no-postgresql/" target="_blank">schema</a> onde está a tabela que disparou a trigger.</li>
<li><strong>TG_NARGS</strong>: Número de argumentos fornecidos para a Stored Function do trigger.</li>
<li><strong>TG_ARGV[]</strong>: Os argumentos que foram fornecidos.</li>
</ul>
<p>&nbsp;</p>
<p><strong>Perguntas (quase) nunca feitas sobre triggers:</strong></p>
<ul>
<li><em>Sabe-se que pode atrelar mais de uma trigger por tabela, então qual a ordem de execução das triggers?</em><br />
R: A ordem de execução é alfabética.</li>
<li><em>Triggers podem ser recursivas?</em><br />
R: Sim! Os gatilhos podem executar comandos SQL, e os mesmos podem disparar outras triggers. Este cenário é conhecido como <strong>cascateamento de triggers</strong>, assim pode ser que a trigger passe a se &#8220;auto disparar&#8221;, ou seja, chamadas recursivas da própria trigger, <strong>fique atento a recursões infinitas!</strong></li>
</ul>
<p>&nbsp;</p>
<p><strong>Triggers na Prática</strong></p>
<p>Agora vamos a parte pática irei realizar um único exemplo, <a title="Mais exemplos do funcionamento das triggers" href="http://ecoapre.blogspot.com/2011/12/disparadores-triggers-en-postgresql.html" target="_blank">neste link</a> você e encontrar mais exemplos de triggers. No nosso, considere as duas tabelas abaixo:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TABLE funcionarios (
	ID_FUNCIONARIO SERIAL,
	NOME VARCHAR(255),
	IDADE INTEGER,
	FUNCAO VARCHAR(150),
	PRIMARY KEY(ID_FUNCIONARIO)
);

CREATE TABLE FUNCIONARIOS_LOG (
	COD_ALTERACAO SERIAL,
	USUARIO VARCHAR(150) NOT NULL,
	TIPO_ACAO VARCHAR(25) NOT NULL,
	DATA_ALTERACAO TIMESTAMP NOT NULL,
	PRIMARY KEY (COD_ALTERACAO)
);</pre>
<p>Repare que na construção da tabela<strong> funcionarios</strong> eu não coloquei nenhuma regra de validação, como por exemplo not null, foi de propósito! Nossa trigger irá realizar a (simples) validação da entrada de dados na tabela e em seguida guardar que tipo de operação foi feita, por quem e a data na tabela <strong>funcionarios_log</strong>.</p>
<p>Agora a construção da <strong>stored function</strong> que será &#8220;chamada&#8221; pela trigger e sua agregação como trigger:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE FUNCTION valida_dados_funcionario() RETURNS TRIGGER AS $valida_dados_funcionario$
BEGIN
	IF NEW.NOME IS NULL THEN
		RAISE EXCEPTION 'Por Favor, digite o nome do funcionario!';
	END IF;

	IF NEW.IDADE IS NULL THEN
		RAISE EXCEPTION 'Por favor, informe a idade!';
	END IF;

	IF NEW.IDADE &lt; 0 THEN
		RAISE EXCEPTION 'Desculpe, o funcionario não pode ter % anos', NEW.IDADE;
	END IF;

	IF NEW.FUNCAO IS NULL THEN
		RAISE EXCEPTION 'Por favor, informe qual a função do funcinário!';
	END IF;

	-- Aqui iremos gravar no log o tipo de ação que foi realizada
	INSERT INTO FUNCIONARIOS_LOG (USUARIO, TIPO_ACAO, DATA_ALTERACAO) VALUES (CURRENT_USER, TG_OP, CURRENT_TIMESTAMP);

	RETURN NEW;
END;
$valida_dados_funcionario$
LANGUAGE plpgsql;</pre>
<p>Note que realizei as devidas validações utilizando o operador NEW, porque agora iremos atrelar a trigger a tabela dizendo que ela será executada durante um insert ou update. Observe também que o declaramos um return &#8220;trigger&#8221; e especificamos os delimitadores $$, você pode encontrar mais informações sobre a estruturação de procedures de triggers na <a title="Como construir trigger procedures" href="http://www.postgresql.org/docs/8.0/static/plpgsql-trigger.html" target="_blank">documentação do PostgreSQL</a>, e por fim note que especificamos qual<strong> linguagem é utilizad</strong>a para a construção da trigger, no caso <strong>plpgsql</strong>.</p>
<p>Veja abaixo como definimos a trigger, chamando a procedure que construímos anteriormente:</p>
<pre class="brush: sql; gutter: true; first-line: 1">CREATE TRIGGER validacao_insert BEFORE INSERT OR UPDATE ON funcionarios
FOR EACH ROW EXECUTE PROCEDURE valida_dados_funcionario();</pre>
<p><strong>Pronto</strong>! Agora sua trigger já está funcionando nos eventos INSERT e UPDATE na tabela funcionario, faça os testes!</p>
<p>Agora para ilustrar ainda mais nosso exemplo irei alterar o nome da trigger, veja:</p>
<pre class="brush: sql; gutter: true; first-line: 1">ALTER TRIGGER validacao_insert ON funcionarios RENAME TO a_validacao_insert</pre>
<p>Para desabilitar (para habilitar troque o DISABLE por ENABLE) uma determinada trigger:</p>
<pre class="brush: sql; gutter: true; first-line: 1">ALTER TABLE  funcionarios DISABLE TRIGGER a_validacao_insert</pre>
<p>Ou para <strong>desabilitar todas</strong> as triggers de uma tabela:</p>
<pre class="brush: sql; gutter: true; first-line: 1">ALTER TABLE  funcionarios DISABLE TRIGGER ALL</pre>
<p>Agora, se eu desejar remover a trigger:</p>
<pre class="brush: sql; gutter: true; first-line: 1">DROP TRIGGER a_validacao_insert ON funcionarios</pre>
<p>Repare que não postei a imagem dos resultados para induzir <strong>você a testar o código</strong>! Faça os scripts de insert e update e veja as saídas produzidas pelo SGBD, acredito que você irá se divertir muito com os resultados!</p>
<p>Se você quiser saber mais sobre os triggers e sobre o <a title="Existem muito mais posts para você ler aqui!" href="http://tas.eti.br/blog/category/postgresql/" target="_blank">PostgreSQL</a> eu recomendo um livro (se você também for chegado a papel) que utilizei na minha <a title="Neste post você pode fazer o download dela!" href="http://tas.eti.br/blog/2011/12/download-da-minha-monografia/" target="_blank">monografia</a>, intitulado <em>PostgreSQL: Guia do Desenvolvedor</em>, de André Milani.</p>
<p>Como você que leu (conseguiu chegar até aqui) triggers são um assunto muito extenso para se tratar aqui no blog, <strong>recomendo que você leia as referências</strong> e pesquisa mais sobre o assunto, é um tema muito interessante e útil para o dia a dia!</p>
<p>&nbsp;</p>
<p><strong>Referências:</strong></p>
<ul>
<li><a href="http://www.postgresql.org/docs/8.1/static/triggers.html" target="_blank">PostgreSQL Documentation &#8211; Triggers</a></li>
<li><a title="Manual em Inglês" href="http://www.postgresql.org/docs/8.0/static/plpgsql-trigger.html" target="_blank">PostgreSQL Documentation &#8211; Trigger Procedures</a></li>
<li><a href="http://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/Triggers" target="_blank">Wikibooks &#8211; PostgreSQL &#8211; Triggers</a></li>
<li><a href="http://imasters.com.br/artigo/10644/postgresql/triggers_no_postgresql/" target="_blank">iMasters &#8211; Triggers no PostgreSQL</a></li>
<li><a href="http://ecoapre.blogspot.com/2011/12/disparadores-triggers-en-postgresql.html" target="_blank">Ecoapre &#8211; Disparadores triggers en PostgreSQL (en espanhol)</a></li>
</ul>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago</a>.</p>
<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-button */
google_ad_slot = "5761791599";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/&via=tiagotas&text=Manipulando Triggers no PostgreSQL&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2011%2F12%2Fmanipulando-triggers-no-postgresql%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2011/12/manipulando-triggers-no-postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Download da minha Monografia</title>
		<link>http://tas.eti.br/blog/2011/12/download-da-minha-monografia/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=download-da-minha-monografia</link>
		<comments>http://tas.eti.br/blog/2011/12/download-da-minha-monografia/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 05:24:30 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[fatec]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=892</guid>
		<description><![CDATA[Olá meus Leitores! Estou disponibilizando para vocês o download da minha monografia, que apresentei para a obtenção do título de Tecnólogo em Informática para Gestão de Negócios pela Fatec Mococa em 2010. Claro que o objetivo de eu estar colocando ela aqui é para consulta e pesquisa, nada de plágio porque nenhum professor é bobo [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-top */
google_ad_slot = "2716329990";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<p>Olá meus Leitores!</p>
<p>Estou disponibilizando para vocês o <a title="Aquivo PDF, abre em nova janela" href="http://tas.eti.br/blog/wp-content/uploads/2011/12/Monografia-Tiago-Antônio-da-Silva.pdf" target="_blank">download da minha monografia</a>, que apresentei para a obtenção do título de Tecnólogo em Informática para Gestão de Negócios pela <a title="Veja o post que fiz sobre a Fatec Mococa" href="http://tas.eti.br/blog/2011/11/fatec-mococa-12-melhor-faculdade-publica-do-pais/" target="_blank">Fatec Mococa</a> em 2010.</p>
<p>Claro que o objetivo de eu estar colocando ela aqui é para consulta e pesquisa, nada de plágio porque nenhum professor é bobo ok?</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/11/FATEC-logo1.jpg"><img class="size-full wp-image-600 aligncenter" title="FATEC-logo1" src="http://tas.eti.br/blog/wp-content/uploads/2011/11/FATEC-logo1.jpg" alt="" width="288" height="166" /></a></p>
<p>O trabalho intitulado &#8220;<em>E-business, uma abordagem sobre o business-to-business com o desenvolvimento de uma plataforma de negócios baseado na metodologias Web 2.0</em>&#8220;, sob a orientação do <a title="Link para o currículo Lattes" href="http://buscatextual.cnpq.br/buscatextual/visualizacv.do?id=K4742690H9" target="_blank">Prof. MSc. Geraldo Henrique Neto</a>.</p>
<p>Veja o resumo do trabalho:</p>
<blockquote>
<pre>Este estudo busca realizar uma investigação sobre o funcionamento da classe B2B
(Business-to-Business), termo contido no conceito de e-Business, que por sua vez
foi abordado em uma análise que teve por escopo identificar e expor termos como
e-ERP, e-CRM, e-SCM, e-Procurement, e-BI, e e-Commerce. Em seguida investigase
os impactos da implantação do e-Business na organização, com ênfase na classe
B2B, quando aborda-se ainda os aspectos envolvidos na terceirização da
implantação do conceito. E por fim, como componente da análise busca-se
desenvolver um modelo de plataforma B2B on-line, que sugere uma alternativa para
as interações entre empresas, ou seja, a empresa com seus fornecedores ou
parceiros, durante o desenvolvimento buscou-se utilizar metodologias de
desenvolvimento web 2.0, juntamente com alternativas open source, tais como PHP
(Hypertext Processor) e PostgreSQL.
<strong>Palavras-chave</strong>: e-Business. Business-to-Business. Modelo. Plataforma. Web 2.0.</pre>
</blockquote>
<p>Você pode fazer o download <a title="Aquivo PDF, abre em nova janela." href="http://tas.eti.br/blog/wp-content/uploads/2011/12/Monografia-Tiago-Antônio-da-Silva.pdf" target="_blank">clicando aqui</a>!</p>
<p>Espero que seja útil!</p>
<p>Abraços,</p>
<p><a title="Quem é o autor desse blog?" href="http://tas.eti.br/blog/sobre" target="_blank">Tiago</a>.</p>
<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-button */
google_ad_slot = "5761791599";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/download-da-minha-monografia/&via=tiagotas&text=Download da minha Monografia&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2011%2F12%2Fdownload-da-minha-monografia%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2011/12/download-da-minha-monografia/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mestrado na UFSCar? Tô dentro!</title>
		<link>http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mestrado-na-ufscar-to-dentro</link>
		<comments>http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 05:24:27 +0000</pubDate>
		<dc:creator>Tiago Silva</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Mestrado]]></category>
		<category><![CDATA[UFSCar]]></category>

		<guid isPermaLink="false">http://tas.eti.br/blog/?p=876</guid>
		<description><![CDATA[Meus Amigos! Hoje é um dia de muita felicidade! Hoje meu nome estava entre os que foram aprovados para o Programa de Mestrado 2012 do Departamento de Computação da Universidade Federal de São Carlos! Não tenho palavras para representar a alegria que sinto! Depois de tantas batalhas, paciência, estudo, ansiedade, enfim a recompensa! Irei fazer [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-top */
google_ad_slot = "2716329990";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<p>Meus Amigos!</p>
<p>Hoje é um dia de muita felicidade! Hoje meu nome estava entre os que foram aprovados para o <a title="Mais informações sobre o Processo Seletivo" href="http://ppgcc.dc.ufscar.br/mestrado-1/selecao-para-o-mestrado/processo-seletivo" target="_blank">Programa de Mestrado 2012</a> do <a title="Veja o site do Departamento de Computação" href="http://ppgcc.dc.ufscar.br/" target="_blank">Departamento de Computação</a> da<a title="Conheça mais sobre a UFSCar" href="http://ufscar.br/" target="_blank"> Universidade Federal de São Carlos</a>!</p>
<p>Não tenho palavras para representar a alegria que sinto! Depois de tantas batalhas, paciência, <a title="Como foi o Poscomp 2011" href="http://tas.eti.br/blog/2011/10/o-dia-seguinte-do-poscomp-2011/" target="_blank">estudo</a>, ansiedade, enfim a recompensa! Irei fazer mestrado em <a title="Mais informações sobre a linha de pesquisa que irei atuar" href="http://ppgcc.dc.ufscar.br/linhas-de-pesquisa/engenharia-de-software" target="_blank">Engenharia de Software</a>, realmente estou muito feliz!</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/LogoUfscar.gif"><br />
</a><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg"><img class="aligncenter size-full wp-image-879" title="ufscar" src="http://tas.eti.br/blog/wp-content/uploads/2011/12/ufscar.jpg" alt="" width="320" height="222" /></a><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/UFSCar.jpg"><br />
</a></p>
<p>No momento em que soube pelo da minha aprovação pelo site do Departamento, e logo após minha vibração (!!!) liguei para todos os que me ajudaram e contribuíram para minha chegada até a UFSCar! Um abraço especial para Prof. Dr. Darlan Marcelo Delgado que foi o responsável pela minha iniciação científica, para o Prof. Dr. Jean Miler Scatena  que me orientou muito e forneceu cartas de recomendação, para o meu orientador nos tempos de monografia, Prof. MSc Geraldo Henrique Neto que aconselhou sobre a vida acadêmica e que sempre esteve presente quando precisei de cartas de recomendação e para o Prof. MSc. Fernando Duarte que me apoiou e me incentivou especialmente para o mestrado na UFSCar, também fornecendo cartas de recomendação. Meu muito obrigado a todos vocês e a todos os outros professores que fizeram parte até agora da minha trajetória acadêmica.</p>
<p>E claro não posso deixar de agradecer, do fundo do meu coração minha Mãe, Dona Helena, Meu Pai Sr Antônio e minha namorada Letícia que tanto me apoiaram na fase de estudos e seleção, além dos meus amigos mais próximos que sempre ouviram meus planos sobre a vida acadêmica, mais uma vez muito obrigado!</p>
<p style="text-align: center;"><a href="http://tas.eti.br/blog/wp-content/uploads/2011/12/UFSCar.jpg"><img class="size-full wp-image-878 aligncenter" style="border-style: initial; border-color: initial;" title="UFSCar" src="http://tas.eti.br/blog/wp-content/uploads/2011/12/UFSCar.jpg" alt="" width="400" height="300" /></a></p>
<p>Realmente agora é um tempo de muita alegria, mas também de pensar em todo o trabalho de pesquisa que terei pela frente, e é claro ele também será postado aqui junto com o meu dia a dia na Universidade! Espero que todos que estejam acompanhando o blog apreciem essa minha nova empreitada e sorte a todos nós em 2012, que esse ano já vai se iniciar prometendo muito!</p>
<p>Muito obrigado a todos que estavam torcendo por mim!</p>
<p>Abraços,</p>
<p><a title="Quem faz o blog?" href="http://tas.eti.br/blog/sobre/" target="_blank">Tiago.</a></p>
<p><span style="color: #ff0000;"> <script type="text/javascript"><!--
google_ad_client = "ca-pub-7113648014835203";
/* ad-post-button */
google_ad_slot = "5761791599";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></span></p>
<div style="float: left; margin-left: 10px;"><a href="http://twitter.com/share?url=http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/&via=tiagotas&text=Mestrado na UFSCar? Tô dentro!&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="AWD_facebook_likebutton "><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Ftas.eti.br%2Fblog%2F2011%2F12%2Fmestrado-na-ufscar-to-dentro%2F&amp;send=false&amp;layout=standard&amp;width=190&amp;show_faces=false&amp;action=like&amp;colorscheme=light&amp;font=&amp;height=35&ref=" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:190px; height:35px;" allowTransparency="true"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://tas.eti.br/blog/2011/12/mestrado-na-ufscar-to-dentro/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

