<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Cyberspace Strikes Back...</title>
	<atom:link href="http://universemachine.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://universemachine.wordpress.com</link>
	<description>The Universe is a Machine</description>
	<lastBuildDate>Mon, 30 May 2011 02:40:23 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='universemachine.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Cyberspace Strikes Back...</title>
		<link>http://universemachine.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://universemachine.wordpress.com/osd.xml" title="Cyberspace Strikes Back..." />
	<atom:link rel='hub' href='http://universemachine.wordpress.com/?pushpress=hub'/>
		<item>
		<title>OrionSocket &#8211; Exemplo de POST</title>
		<link>http://universemachine.wordpress.com/2011/01/23/orionsocket-exemplo-de-post/</link>
		<comments>http://universemachine.wordpress.com/2011/01/23/orionsocket-exemplo-de-post/#comments</comments>
		<pubDate>Sun, 23 Jan 2011 07:44:40 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[orionsocket]]></category>

		<guid isPermaLink="false">http://universemachine.wordpress.com/?p=519</guid>
		<description><![CDATA[Abaixo um exemplo simples da utilização de POST com OrionSocket. #include &#60;stdio.h&#62; #include &#60;orion/socket/http.h&#62; void handleResponse(char* buffer, _uint32 len); int main(int argc, char** argv) { orion_httpRequest* request = NULL; orion_initHttpRequest(&#38;request); orion_setHttpRequestHost(request, &#34;registro.br&#34;, 80); orion_setHttpRequestPath(request, &#34;/cgi-bin/whois/&#34;); orion_setHttpRequestMethod(request, &#34;POST&#34;); orion_setHttpRequestQuery(request, &#34;qr=www.bugsec.com.br&#34;); orion_setHttpRequestOption(request, ORION_OPTDEBUG_REQUEST); orion_setHttpRequestHeader(request, &#34;User-Agent&#34;, &#34;Mozilla/1.0&#34;); orion_httpGet(request, handleResponse, 1024); orion_cleanupHttpRequest(request); return 0; } void handleResponse(char* buffer, _uint32 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=519&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Abaixo um exemplo simples da utilização de POST com OrionSocket.</p>
<pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;orion/socket/http.h&gt;

void handleResponse(char* buffer, _uint32 len);

int main(int argc, char** argv)
{
    orion_httpRequest* request = NULL;
    orion_initHttpRequest(&amp;request);
    orion_setHttpRequestHost(request, &quot;registro.br&quot;, 80);
    orion_setHttpRequestPath(request, &quot;/cgi-bin/whois/&quot;);
    orion_setHttpRequestMethod(request, &quot;POST&quot;);
    orion_setHttpRequestQuery(request, &quot;qr=www.bugsec.com.br&quot;);
    orion_setHttpRequestOption(request, ORION_OPTDEBUG_REQUEST);
    orion_setHttpRequestHeader(request, &quot;User-Agent&quot;, &quot;Mozilla/1.0&quot;);

    orion_httpGet(request, handleResponse, 1024);

    orion_cleanupHttpRequest(request);

    return 0;
}

void handleResponse(char* buffer, _uint32 len)
{
    printf(&quot;%s&quot;, buffer);
}
</pre>
<p>[BugSec Team]<br />
i4k, m0nad, Cooler, _mlk_</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/519/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/519/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/519/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=519&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2011/01/23/orionsocket-exemplo-de-post/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>OrionSocket &#8211; Usando orion_httpResponse</title>
		<link>http://universemachine.wordpress.com/2010/08/20/orionsocket-usando-orion_httpresponse/</link>
		<comments>http://universemachine.wordpress.com/2010/08/20/orionsocket-usando-orion_httpresponse/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 03:25:05 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[orionsocket]]></category>

		<guid isPermaLink="false">http://universemachine.wordpress.com/?p=493</guid>
		<description><![CDATA[Vou falar de outra forma interessante de manipular a resposta HTTP com OrionSocket, através da estrutura orion_httpResponse e a função orion_httpReqRes(). No post anterior eu mostrei como receber a resposta numa string do tipo C. Mas é possivel também ter a resposta já numa estrutura. A estrutura orion_httpResponse tem a seguinte declaração: header &#60;orion/socket/http.h&#62; typedef [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=493&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Vou falar de outra forma interessante de manipular a resposta HTTP com OrionSocket, através da estrutura orion_httpResponse e a função orion_httpReqRes().</p>
<p>No post <a href="http://universemachine.wordpress.com/2010/08/15/orionsocket-biblioteca-basica-de-sockets-em-c/">anterior</a> eu mostrei como receber a resposta numa string do tipo C. Mas é possivel também ter a resposta já numa estrutura.</p>
<p>A estrutura orion_httpResponse tem a seguinte declaração:</p>
<p><span id="more-493"></span><br />
header &lt;orion/socket/http.h&gt;</p>
<pre class="brush: cpp;">
typedef struct
{
    _uint8 version;         /* HTTP version. 1.0 || 1.1 */
    _uint16 code;            /* Status Code              */
    char* message;          /* Server Message           */
    char* serverName;       /* Server Name              */
    char* date;             /* Date                     */
    char* expires;          /* Expires time             */
    char* location;         /* Location.                */
    char* mime_version;     /* MIME-VERSION             */
    char* content_type;     /* Content-Type             */
    char* charset;          /* Charset                  */
    _uint32 content_length;   /* Length of the content;   */

    nameValue *header;      /* HTTP Headers             */
    _uint8 headerLen;       /* Number of headers        */

    nameValue *cookie;      /* Set Cookie               */
    _uint8 cookieLen;       /* Number of cookies        */

    char* body;             /* Body of the response     */
} orion_httpResponse;
</pre>
<p>A função que faz a requisição e retorna as informações nessa estrutura é a orion_httpReqRes(), o protótipo dela é o seguinte:</p>
<p>_uint8 orion_httpReqRes(orion_httpRequest* req, orion_httpResponse** res2);</p>
<p>O primeiro parametro é a estrutura com as informações da requisição e o segundo o ponteiro para o ponteiro da estrutura resposta.</p>
<p>Abaixo um exemplo simples com a forma de utilização:</p>
<pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;orion/socket/http.h&gt;

int main(int argc, char** argv)
{
    orion_httpRequest* req = NULL;
    orion_httpResponse* res = NULL;
    int i;

    // Inicializa a requisição
    orion_initHttpRequest(&amp;req);

    orion_setHttpRequestHost(req, &quot;www.unicheck.com.br&quot;, 80);

    // Não há a necessidade de inicializar res (orion_httpResponse)
    int code = orion_httpReqRes(req, &amp;res);

    // or if (!code)
    if (code == ORIONSOCKET_OK)  // ORIONSOCKET_OK = 0x00
    {
        /**
         * A resposta encontra-se na estrutura orion_httpResponse *res
         */
        printf(&quot;################################\n&quot;);
        printf(&quot;# HEADERS:\n&quot;);

        printf(&quot;# Http Version: 1.%d\n&quot;, res-&gt;version);
        printf(&quot;# Http Status Code: %d\n&quot;, res-&gt;code);
        printf(&quot;# Server Message: %s\n&quot;, res-&gt;message);
        printf(&quot;# Server Name: %s\n&quot;, res-&gt;serverName);
        printf(&quot;# Server Date: %s\n&quot;, res-&gt;date);
        printf(&quot;# Todos os Headers: \n&quot;);
        for (i = 0; i &lt; res-&gt;headerLen; i++)
        {
            printf(&quot;# %s: %s\n&quot;, res-&gt;header[i].name, res-&gt;header[i].value);
        }

        printf(&quot;################################\n&quot;);
        printf(&quot;# Body Content: \n&quot;);
        printf(&quot;%s\n&quot;, res-&gt;body);
    }

    // Desaloca a memória da requisição e da resposta
    orion_cleanupHttpRequest(req);
    orion_cleanupHttpResponse(res);

    return 0;
}
</pre>
<p>Tenho muita coisa pra fazer ainda, mas já dá pra brincar <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/493/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/493/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/493/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=493&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2010/08/20/orionsocket-usando-orion_httpresponse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>OrionSocket &#8211; Biblioteca básica de sockets em C</title>
		<link>http://universemachine.wordpress.com/2010/08/15/orionsocket-biblioteca-basica-de-sockets-em-c/</link>
		<comments>http://universemachine.wordpress.com/2010/08/15/orionsocket-biblioteca-basica-de-sockets-em-c/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 03:39:59 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[orionsocket]]></category>
		<category><![CDATA[sockets]]></category>

		<guid isPermaLink="false">http://universemachine.wordpress.com/?p=464</guid>
		<description><![CDATA[Pois é, faz tempo que não posto nada por aqui&#8230; Mas estou voltando e vou voltar a escrever sobre algumas coisas que ando desenvolvendo nas horas vagas. OrionSocket é uma biblioteca (ainda bem simples e em desenvolvimento) em alto nível para manipulação de sockets em C em Linux/*BSDs. O foco dela é mais agilizar o [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=464&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pois é, faz tempo que não posto nada por aqui&#8230; Mas estou voltando e vou voltar a escrever sobre algumas coisas que ando desenvolvendo nas horas vagas.</p>
<p>OrionSocket é uma biblioteca (ainda bem simples e em desenvolvimento) em alto nível para manipulação de sockets em C em Linux/*BSDs. O foco dela é mais agilizar o desenvolvimento de aplicações cliente/servidor para os protocolos HTTP, FTP, etc. Ainda há muita coisa a ser feita, portanto vou postando aqui as funcionalidades que forem sendo adicionadas com o tempo.<br />
<span id="more-464"></span><br />
O projeto é opensource e também está hospedado no <a href="http://code.google.com/">google code</a> no link <a href="http://orionsocket.googlecode.com/">http://orionsocket.googlecode.com/</a>.</p>
<p><a href="https://code.google.com/p/orionsocket/downloads/detail?name=orionsocket-1.0.4.tar.gz&amp;can=2&amp;q=#makechanges">Download</a></p>
<p>Depois de baixar, o modo de instalação é o velho conhecido dos usuários linux/BSDs:<br />
$ tar zxvf orionsocket-1.0.4.tar.gz<br />
$ cd orionsocket-1.0.4<br />
$ ./configure &#8211;prefix=/diretorio/para/instalar<br />
$ make<br />
$ sudo make install</p>
<p>Agora vamos ver como utilizar a biblioteca.</p>
<p>Exemplo 1:</p>
<pre class="brush: cpp;">
/**
 * Author: Tiago Natel de Moura
 * Date: 14/08/2010
 */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
// Library OrionSocket
#include &lt;orion/socket/http.h&gt;

int main(int argc, char** argv)
{
	orion_httpRequest *req = NULL;
	char *response = NULL;
	int code;

	const char* domain = &quot;universemachine.wordpress.com&quot;;
    // Inicializa a estrutura orion_httpRequest
    orion_initHttpRequest(&amp;req);
    // Ajusta o host e a porta alvo
    orion_setHttpRequestHost(req, domain, 80);
    // Ajusta o PATH da requisição, por default é /
    orion_setHttpRequestPath(req, &quot;/&quot;);

    // Ajusta um Header qualquer, no caso o User-Agent
    orion_setHttpRequestHeader(req, &quot;User-Agent&quot;, &quot;Anakin SkyWalker&quot;);

    // Faz a requisição HTTP e retorna a resposta do servidor na variavel response
    code = orion_httpRequestPerform(req, &amp;response);

    if (code == ORIONSOCKET_OK)
    {
        printf(&quot;%s\n&quot;, response);
        free(response);
    }

    // Desaloca a memória da estrutura
    orion_cleanupHttpRequest(req);

    return 0;
}
</pre>
<p>Para compilar utilize:</p>
<p>$ gcc -Wall exemplo1.c -o exemplo1 -lorionsocket</p>
<p>O exemplo acima está bem documentado e mostra como é simples e rápido fazer um cliente http. Mas a função orion_httpRequestPerform nem sempre é uma boa opção, pois ela faz a requisição no servidor e armazena toda a resposta na variavel passada como buffer para ela. Para fazer isso, ela lê todo o socket e só depois traz a resposta. Em alguns casos, por exemplo quando a resposta for muito grande ou em servidores que não retornam todo o buffer de uma vez (google.com), sua aplicação pode ficar vários segundos à espera da resposta sem ter feedback do que está ocorrendo.<br />
Pra resolver esse problema, existe uma outra função muito útil chamada orion_httpGet que utiliza de um callback, deixando assim o desenvolvedor manipular o buffer de resposta.</p>
<p>Abaixo um exemplo utiiizando orion_httpGet().</p>
<p>Exemplo 2:</p>
<pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;orion/socket/http.h&gt;

void myCallBack(char* buffer, unsigned int count)
{
    printf(&quot;%s\n&quot;, buffer);
}

int main(int argc, char** argv)
{
    orion_httpRequest* req = NULL;

    orion_initHttpRequest(&amp;req);
    orion_setHttpRequestHost(req, &quot;universemachine.wordpress.com&quot;, 80);

    // Realiza a requisição no host especificado em req e envia o buffer
    // para a função myCallBack
    int code = orion_httpGet(req, myCallBack, 100);

    if (code == ORIONSOCKET_OK)
        printf(&quot;\n[+] requisição realizada com sucesso.\n&quot;);
    else
        printf(&quot;\n[-] erro ao fazer requisição...\ncodigo de erro=%d\n&quot;, code);        

    orion_cleanupHttpRequest(req);
    return 0;
}
</pre>
<p>$ gcc -Wall -o exemplo2 exemplo2.c -lorionsocket</p>
<p>A assinatura da função orion_httpGet é:<br />
_uint8 orion_httpGet(orion_httpRequest* req, void (* callback)(char*,_uint32), _uint32 count)</p>
<p>Em breve disponibilizarei uma documentação online (doxygen) do projeto.</p>
<p>Se voce achar realmente necessário, voce pode  baixar o nível e trabalhar diretamente com o socket da seguinte forma:</p>
<pre class="brush: cpp;">
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;sys/socket.h&gt;

#include &lt;orion/socket/socket.h&gt;

#define LEN 1024

int main(int argc, char** argv)
{

    if (argc &lt; 2)
    {
        fprintf(stderr, &quot;[ERROR] Usage: %s &lt;host&gt; &lt;port&gt;\n&quot;, argv[0]);
        return 0;
    }

    char temp[LEN];
    int n;

    // Inicializa um socket TCP/IP e conecta no alvo
    // Retorna o socket criado e conectado
    int sockfd = orion_tcpConnect(argv[1], atoi(argv[2]));

    bzero(temp, LEN);
    if (send(sockfd, &quot;GET / HTTP/1.1\nHost: xxx\n\n&quot;, 26, 0) &lt; 0)
    {
        fprintf(stderr, &quot;[-] Erro ao enviar os dados.\n&quot;);
        close(sockfd);
        return 1;
    }

    while ((n = read(sockfd, temp, LEN-1)) &gt; 0)
    {
        printf(&quot;%s\n&quot;, temp);
        bzero(temp, LEN);
    }

    close(sockfd);

    return 0;
}
</pre>
<p>$ gcc -Wall -o exemplo3 exemplo3.c -lorionsocket</p>
<p>É isso aí, os exemplos estão comentados. Conforme a API for ganhando forma eu vou postando aqui as formas de utilização.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/464/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/464/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/464/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=464&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2010/08/15/orionsocket-biblioteca-basica-de-sockets-em-c/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>Hacking the Core of PHP: Escrevendo extensões</title>
		<link>http://universemachine.wordpress.com/2009/11/22/hacking-the-core-of-php-escrevendo-extensoes/</link>
		<comments>http://universemachine.wordpress.com/2009/11/22/hacking-the-core-of-php-escrevendo-extensoes/#comments</comments>
		<pubDate>Sun, 22 Nov 2009 21:30:57 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[core]]></category>
		<category><![CDATA[engine]]></category>
		<category><![CDATA[extensões]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=413</guid>
		<description><![CDATA[Hacking the core of PHP. No ano passado eu estudei PHP-GTK e adorei. Muito fácil desenvolver uma aplicação com um ambiente agradável em poucas linhas de código. Só que o PHP é uma linguagem voltada para a web então muitos dos recursos que seriam necessários à uma aplicação gráfica não estão disponíveis. Por isso que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=413&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://php.net/manual/en/internals2.ze1.zendapi.php" class="link" target="_blank">Hacking the core of PHP.</a></p>
<p>No ano passado eu estudei PHP-GTK e adorei. Muito fácil desenvolver uma aplicação com um ambiente agradável em poucas linhas de código. Só que o PHP é uma linguagem voltada para a web então muitos dos recursos que seriam necessários à uma aplicação gráfica não estão disponíveis. Por isso que na época acabei me interessando em entender como se escreve uma extensão para o PHP. E descobri que é muito fácil.<br />
Há tempos que estava querendo escrever sobre isso.<br />
<span id="more-413"></span></p>
<h3>Fractais em PHP</h3>
<p>Não vou ensinar a fazer o chato do hello world mas sim uma extensão que cria fractais. Depois de a extensão pronta poderemos chamar a função orion_fractal() como se fosse uma função nativa do PHP.<br />
Esse código PHP:</p>
<pre class="brush: php;">
&lt;?php

print orion_fractal();
</pre>
<p>Imprimirá na tela:<br />
<a href="http://www.uploaddeimagens.com.br/imagem/ver/fractal1.jpg"><img src="http://www.uploaddeimagens.com.br/imagem/ver/fractal1.jpg" alt="fractal1" title="fractal1" width="533" height="533" class="aligncenter size-full wp-image-448" /></a></p>
<h3>Configurando um ambiente de desenvolvimento <span style="color:green;">[LINUX]</span></h3>
<p>No linux já temos um ambiente de desenvolvimento em C nativo, então tudo que precisaremos é do código fonte do PHP.<br />
<a href="http://www.php.net/downloads.php" class="link" title="Source">Código fonte do PHP</a></p>
<p>Eu fiz este tutorial com o PHP 5.3.1 mas deve funcionar normalmente em qualquer versão do PHP &gt;= 5.2.0.<br />
Eu utilizei o diretório $HOME/php/dev para o desenvolvimento, assim:</p>
<pre class="brush: bash;">
# cd $HOME/php/dev
# svn checkout http://svn.php.net/repository/php/php-src/branches/PHP_5_3 php-src-5.3
# cd php-src-5.3
# pwd
$HOME/php/dev/php-src-5.3
</pre>
<p>Da outra vez que mechi com extensões para o php eu usava o fedora e não tive nenhum problema com as compilações, mas desta vez (archlinux) tive um pequeno problema, vou explicar:<br />
Você não conseguirá rodar o <b>buildconf</b> para gerar o <b>configure</b> com qualquer variação de versão das ferramentas <b>autoconf</b>, <b>automake</b> e <b>libtool</b>. As combinações de versões que certamente funcionarão são:</p>
<ul>
<li>autoconf 2.13, automake 1.4 and libtool 1.4.3</li>
<li>autoconf 2.13, automake 1.5 and libtool 1.4.3</li>
<li>autoconf 2.63, automake 1.11 and libtool 2.2.6 (Com vários warnings)</li>
</ul>
<p>Leia aqui: http://www.php.net/svn.php#buildconf_fail<br />
Como eu tinha o autoconf 2.64, o automake 1.4 e a libtool 2.2.6 eu decidi ir pela terceira alternativa e instalar o autoconf 2.63. E conforme na tabela foram vários warnings mas deu pra trabalhar tranquilamente.</p>
<p>As extensões do PHP ficam dentro do diretório <b>ext</b>. Ali estão os fontes de todas as extensões, é legal dar uma olhada.<br />
O PHP provê uma ferramenta para automatizar/facilitar o processo de criação de extensões, ela se chama <b>ext_skel</b>:</p>
<pre class="brush: bash;">
# cd ext
# ./ext_skel --help
./ext_skel --extname=module
             [--proto=file]
             [--stubs=file]
             [--xml[=file]]
             [--skel=dir]
             [--full-xml]
             [--no-help]

  --extname=module   module is the name of your extension
  --proto=file       file contains prototypes of functions to create
  --stubs=file       generate only function stubs in file
  --xml      generate xml documentation to be added to phpdoc-cvs
  --skel=dir         path to the skeleton directory
  --full-xml  generate xml documentation for a self-contained extension
                (not yet implemented)
  --no-help   don't try to be nice and create comments in the code
                  and helper functions to test if the module compiled
</pre>
<p>O único parametro que nos importa no momento é o obrigatório <b>&#8211;extname</b> que dará o nome da sua extensão.<br />
Vamos iniciar a criação da extensão, digite:</p>
<pre class="brush: bash;">
# ./ext_skel --extname=orion
</pre>
<p>Dê o nome que quiser para sua extensão, mas lembre-se que este deve ser um nome único, não deve haver outra extensão com este nome.<br />
Ao rodar este comando será criado o esqueleto (skel) da sua extensão dentro de um diretório com o mesmo nome escolhido para o módulo, dentro de ext. No meu caso criou-se o diretório &#8220;$HOME/php/dev/php-src-5.3/ext/orion&#8221;.<br />
Entre nesse diretório e vamos ver o que foi criado.</p>
<ul>
<li><b>orion.c</b>: Arquivo fonte da sua extensão</li>
<li><b>orion_php.h</b>: Header da extensão</li>
<li><b>config.m4</b>: Macros do GNU/M4</li>
<li><b>orion.php</b>: Arquivo PHP para testar a extensão</li>
<li><b>tests/001.phpt</b>: TEST</li>
</ul>
<p>O próximo passo é habilitarmos a extensão no arquivo config.m4.<br />
O config.m4 é o arquivo de macros do programa GNU/m4. Com esse programa podemos usar macros de substituição para diversas tarefas, seu uso é geral do mesmo modo que o make. As macros dos arquivos m4 geralmente são usadas para criar os arquivos de configuração <b>configure.ac</b> que por sua vez gerará o <b>configure</b>.<br />
Esses arquivos m4 aparentemente são bem difíceis mas na verdade eles ajudam muito e facilitam a tarefa mais argilosa que seria manipular um projeto grande diretamente pelos <b>Makefile</b>&#8216;s.<br />
A sintaxe do m4 é parecida com shell script. Mas no m4 comentários são dados por &#8220;<b>dnl </b>&#8220;. Todas as linhas que iniciarem com &#8220;dnl&#8221; são comentários.<br />
Abra o arquivo config.m4  procure por esse trecho de código:</p>
<pre class="brush: bash;">
dnl PHP_ARG_ENABLE(orion, whether to enable orion support,
dnl Make sure that the comment is aligned:
dnl [  --enable-orion           Enable orion support])
</pre>
<p>Aqui era a linha 16.<br />
Você deve descomentar deixando assim:</p>
<pre class="brush: php;">
PHP_ARG_ENABLE(orion, whether to enable orion support,
dnl Make sure that the comment is aligned:
[  --enable-orion           Enable orion support])
</pre>
<p>Agora vamos gerar um novo <b>configure</b>. Toda vez que você alterar o arquivo config.m4 você deverá rodar o script <b>buildconf</b> na raiz do projeto.<br />
Rodando o buildconf:</p>
<pre class="brush: bash;">
# pwd
$HOME/php/dev/php-src-5.3
# ./buildconf --force
</pre>
<p>Esse script é um pouco demorado. Se der algum erro, veja as versões das suas ferramentas de compilação como falei na tabela lá em cima. Autoconf, Automake e libtool devem ter alguma daquelas combinações de versões.</p>
<p>Se deu tudo certo foi gerado um novo <b>configure</b>.<br />
Para habilitar sua extensão rode o configure com a opção &#8211;enable-[SUA-EXTENSÃO].<br />
No meu caso seria: <b>./configure &#8211;enable-orion</b><br />
E depois compile com <b>make</b>.<br />
Não rode o &#8220;make install&#8221; pois isto instalará o PHP e não é o que a gente quer. Só queremos compilá-lo. O binário do php, depois de compilado (dãã) fica em <b>sapi/cli/php</b>.<br />
Para testar se a sua extensão foi compilada com sucesso rode o script <b>orion.php</b> (minha_extensao.php) gerado automaticamente dentro de ext/orion/orion.php.</p>
<p># sapi/cli/php ext/orion/orion.php<br />
Se aparecer a sua extensão na tela e a função <b>confirm_orion_compiled</b> é porque está tudo certo !</p>
<p><b><span style="color:green;">Pronto, seu ambiente de desenvolvimento de extensões para o PHP está pronto !</span></b></p>
<h3>Introdução à API do PHP</h3>
<p>É sempre recomendado utilizar a API que o PHP dispõe para criar as extensões, porque dessa maneira o núcleo do PHP irá poder controlar o fluxo da aplicação, a memória, etc. É claro que você pode usar funções das bibliotecas nativas do C como <b>printf()</b>, <b>scanf()</b>, <b>fopen()</b>, etc, mas não é recomendado. Primeiro porque muitas destas funções não são seguras e depois porque o PHP provê todas estas funções de uma maneira integrada com o core. A maoria destas funções são binary-safe, portanto é sempre bom utilizá-las quando for manipular dados vindos do usuário.</p>
<p>A maioria (ou todas?) destas funções da API são MACROS e estão definidas em <b>Zend/zend_API.h</b>, vale a pena dar uma olhada. No começo vai parecer bem bagunçado, mas com o tempo você se acostuma.<br />
Neste header, a maioria das MACROS estão definidas como ZEND_*, mas você verá os tutoriais na net mandando chamar MACROS como PHP_*, isso é porque lá no header <b>main/php.h</b> você verá vários #define&#8217;s como:<br />
#define PHP_FUNCTION ZEND_FUNCTION<br />
#define PHP_METHOD ZEND_METHOD<br />
Então tanto faz qual nomenclatura você utilizar, mas vale lembrar que as extensões que bisbilhotei lá no ext/* usam PHP_*.</p>
<p>A macro mais importante para o nosso caso é a <b>PHP_FUNCTION</b>. É com ela que criaremos as funções da nossa extensão. Ela recebe apenas <b>um</b> argumento, o nome da função.</p>
<pre class="brush: cpp;">
...
PHP_FUNCTION(minha_funcao)
{
    RETURN_STRING(&quot;Essa é a minha primeira função.&quot;, 1);
}
...
</pre>
<p>Isso é uma função válida. Como falei, utilizamos apenas a API, se você usar <b>return</b> na função, você retornará um código para o core do PHP e não será a definição do retorno da sua função. Deixa eu explicar melhor:<br />
Como estamos tratando de duas linguagens, extendendo a linguagem PHP a partir do C, temos que usar a interface da ZEND para se comunicar corretamente com o PHP. Então ao invés de usar <b>return</b> para retornar um valor da função que estou criando, deve-se usar as macros RETURN_STRING, RETURN_LONG, RETURN_*, etc, pois desta forma o core do PHP saberá o que fazer.<br />
Existe uma macro para cada tipo que você deseja retornar, veja a tabela abaixo:</p>
<p><b>RETURN_RESOURCE(resource)</b> = Retorna um resource.<br />
<b>RETURN_BOOL(bool)</b> = Retorna um valor booleano.<br />
<b>RETURN_NULL()</b> = Retorna nada (NULL).<br />
<b>RETURN_LONG(long)</b> = Retorna um Long (Inteiro).<br />
<b>RETURN_DOUBLE(double)</b> = Retorna um ponto flutuante de dupla precisão.<br />
<b>RETURN_STRING(string, duplicate)</b> = Retorna uma string. A <b>flag</b> duplicate indica se a string deve ser duplicada com estrdup().<br />
<b>RETURN_STRINGL(string, length, duplicate)</b> = Retorna uma string de determinado tamanho <b>length</b>.<br />
<b>RETURN_EMPTY_STRING()</b> = Retorna uma string vazia.<br />
<b>RETURN_FALSE</b> = Retorna o booleano false.<br />
<b>RETURN_TRUE</b> = Retorna o booleano true.</p>
<p>Pode-se retornar arrays ou objetos também, mas para isso deve-se usar as funções <b>array_init()</b> e <b>object_init()</b></p>
<p>Existe duas maneiras de se pegar os parametros passados para a sua função. Você pode usar a função <b>zend_parser_parameters</b> ou pegar diretamente pela macro TSRMLS_CC. A primeira alternativa é bem mais fácil e funciona da seguinte maneira:</p>
<pre class="brush: cpp;">
...
PHP_FUNCTION(minha_funcao)
{
    int argc;
    char *argv;

    if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &quot;s&quot;, &amp;argv, &amp;argc) == FAILURE)
    {
        return;
    }

    RETURN_STRING(argv, 1);
}
...
</pre>
<p>O primeiro parâmetro nunca mudará, o segundo indica o tipo do argumento. No caso &#8220;s&#8221; indica que deve ser do tipo STRING. Veja os tipos possíveis:</p>
<ul>
<li>l &#8211; long</li>
<li>d &#8211; double</li>
<li>s &#8211; string (com possíveis bytes nulos) e o seu tamanho (length)</li>
<li>b &#8211; boolean</li>
<li>r &#8211; resource, armazenado em zval*</li>
<li>a &#8211; array, armazenado em zval*</li>
<li>o &#8211; object (of any class), armazenado em zval*</li>
<li>O &#8211; object (de uma classe específica), armazenado em zval*</li>
<li>z &#8211; zval* atual</li>
</ul>
<p>Você pode usar eles em conjunto para setar todos os parâmetros da função, por exemplo: &#8220;sl&#8221; recebe como primeiro parâmetro uma string e segundo um inteiro. &#8220;ssb&#8221; recebe três parametros, string, string e booleano.<br />
Existe outros três caracteres modificadores importantes:</p>
<ul>
<li>| (pipe) &#8211; Indica que os próximos tokens (parâmetros) são opcionais. ex.: &#8220;s|b&#8221; torna &#8220;b&#8221; opcional</li>
<li>/ &#8211; Chamará SEPARATE_ZVAL_IF_NOT_REF() para pegar a cópia do parâmetro.</li>
<li>! &#8211; O parâmetro pode ser de um tipo específico ou NULL. Somente se aplica à &#8220;a&#8221;, &#8220;o&#8221;, &#8220;O&#8221;, &#8220;r&#8221; e &#8220;z&#8221;.</li>
</ul>
<p>Se zend_parse_parameter for chamado da maneira como acima, o PHP emitirá um WARNING se o usuário tentar passar um número de diferente de parâmetros para a função ou se um dos tipos não coincidirem.</p>
<p>Agora que já sabemos como pegar um parâmetro passado para a função e como retornar um valor da função, é só escrever a lógica da sua função e pronto.</p>
<h3>Escrevendo a função orion_fractal()</h3>
<p>Como vimos lá no começo, o script ext_skel cria a estrutura básica de arquivos que a extensão precisará, incluindo um header <b>php_MINHA-EXTENSAO.h</b>, no meu caso php_orion.h. Nesse arquivo, devemos colocar os cabeçalhos das nossas funções. Então vamos lá, abra esse arquivo:</p>
<p>php_orion.h</p>
<pre class="brush: cpp;">
/*
  +----------------------------------------------------------+
  | PHP Version 5                                                              |
  +----------------------------------------------------------+
  | Copyright (c) 1997-2008 The PHP Group                            |
  +----------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license, |
  | that is bundled with this package in the file LICENSE, and is  |
  | available through the world-wide-web at the following url:    |
  | http://www.php.net/license/3_01.txt                                |
  | If you did not receive a copy of the PHP license and are unable to |
  | obtain it through the world-wide-web, please send a note to  |
  | license@php.net so we can mail you a copy immediately.    |
  +---------------------------------------------------------+
  | Author: Tiago Natel de Moura                                  |
  +---------------------------------------------------------+
*/

/* $Id: header 252479 2008-02-07 19:39:50Z iliaa $ */

#ifndef PHP_ORION_H
#define PHP_ORION_H

extern zend_module_entry orion_module_entry;
#define phpext_orion_ptr &amp;orion_module_entry

#ifdef PHP_WIN32
#	define PHP_ORION_API __declspec(dllexport)
#elif defined(__GNUC__) &amp;&amp; __GNUC__ &gt;= 4
#	define PHP_ORION_API __attribute__ ((visibility(&quot;default&quot;)))
#else
#	define PHP_ORION_API
#endif

#ifdef ZTS
#include &quot;TSRM.h&quot;
#endif

/**
 * Limites dos Buffers usados na função orion_fractal()
 */
#define FRACTAL_BUF 3000
#define ASCII_BUF 80

PHP_MINIT_FUNCTION(orion);
PHP_MSHUTDOWN_FUNCTION(orion);
PHP_RINIT_FUNCTION(orion);
PHP_RSHUTDOWN_FUNCTION(orion);
PHP_MINFO_FUNCTION(orion);

/**
 * Aqui definimos os cabeçalhos das funções.
 * Essa função &quot;confirm_orion_compiled()&quot; é criada
 * automaticamente com o ext_skel().
 */
PHP_FUNCTION(confirm_orion_compiled);	/* For testing, remove later. */
PHP_FUNCTION(orion_fractal);  /** cabeçalho da nossa função */

/*
  	Declare any global variables you may need between the BEGIN
	and END macros here:

ZEND_BEGIN_MODULE_GLOBALS(orion)
	long  global_value;
	char *global_string;
ZEND_END_MODULE_GLOBALS(orion)
*/

/* In every utility function you add that needs to use variables
   in php_orion_globals, call TSRMLS_FETCH(); after declaring other
   variables used by that function, or better yet, pass in TSRMLS_CC
   after the last function argument and declare your utility function
   with TSRMLS_DC after the last declared argument.  Always refer to
   the globals in your function as ORION_G(variable).  You are
   encouraged to rename these macros something shorter, see
   examples in any other php module directory.
*/

#ifdef ZTS
#define ORION_G(v) TSRMG(orion_globals_id, zend_orion_globals *, v)
#else
#define ORION_G(v) (orion_globals.v)
#endif

#endif	/* PHP_ORION_H */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim&lt;600: noet sw=4 ts=4
 */
</pre>
<p>A maioria desse arquivo foi gerado automaticamante. As únicas alterações ali foram duas macros que utilizarei lá na função e o cabeçalho que incluímos.</p>
<p>Além de definirmos o cabeçalho da função em php_orion.h também temos que registrá-la no core do zend. Para isso procure pela seguinte linha em <b>minha_extensao.c</b>:</p>
<pre class="brush: cpp;">
const zend_function_entry orion_functions[] = {
	PHP_FE(confirm_orion_compiled,	NULL)		/* For testing, remove later. */
	{NULL, NULL, NULL}	/* Must be the last line in orion_functions[] */
};
</pre>
<p>No meu caso é orion.c.<br />
É nesse array que dvemos registrar todas as funções da extensão. Para adicionar uma nova função faça:</p>
<pre class="brush: cpp;">
const zend_function_entry orion_functions[] = {
	PHP_FE(confirm_orion_compiled,	NULL)
	PHP_FE(orion_fractal, NULL)
        PHP_FE(orion_outra_funcao, NULL)
        PHP_FE(orion_outra_outra_funcao, NULL)
	{NULL, NULL, NULL}	/* Must be the last line in orion_functions[] */
};
</pre>
<p>Note que não há &#8220;virgulas&#8221; entre cada função, apenas insira elas dentro da macro PHP_FE(). O final desse array deve ser {NULL, NULL, NULL}, do contrário haverá erros.</p>
<p>Depois de registrar suas funções, é só codá-las. Aqui a minha função <b>orion_fractal()</b>:</p>
<p><b>orion.c</b></p>
<pre class="brush: cpp;">
...

/**
  * @param   ascii    opcional
  * return STRING
  */
PHP_FUNCTION(orion_fractal)
{
	char *ascii;
	int ascii_len = 0;
	char str[FRACTAL_BUF];
	char b[ASCII_BUF] = &quot; .:-;!/&gt;)|&amp;IH%*#&quot;;
	float i,j,r,k,x,y=-16;
	int t,idx=0;

        /**
         * A função aceita um parâmetro do tipo string opcional.
         * Se passado um valor para a função o algoritmo usará essa
         * string para imprimir o ascii ao invés de b[].
         */
	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &quot;|s&quot;, &amp;ascii, &amp;ascii_len) == FAILURE) {
		return;
	}

	if(ascii_len == 0)
	{
                /**
                  * Use emalloc ao invés do malloc, isso garante que o Zend Engine
                  * possa controlar a memória alocada.
                  */
		if(! (ascii = (char *) emalloc(ASCII_BUF*sizeof(char))))
		{
			printf(&quot;Extension \&quot;orion\&quot; error: Não foi possivel alocar memória.\n&quot;);
			exit(1);
		}

		ascii = b;
	}

	while ((str[idx] = '\n') &amp;&amp; y++&lt;15)
	{
		idx++;
		for( x=0; x++ &lt; 84; str[idx] = ascii[(int)k &amp; 15] )
		{
			if(isascii(str[idx]) &amp;&amp; str[idx] != &#039;&#039;)
				idx++;

			for(i=k=r=0; j=r*r-i*i-2+x/25, i=2*r*i+y/10, j*j+i*i &lt; 11 &amp;&amp; k++ &lt; 111; r=j);

			if(idx == (FRACTAL_BUF-1))
			{
				printf(&amp;quot;ERROR: Estouro de buffer.\n&amp;quot;);
				exit(1);
			}
		}
	}

	str[idx] = &#039;\n&#039;;
	str[++idx] = &#039;&#039;;

	RETURN_STRINGL(str, strlen(str), 1);
}

...
</pre>
<p>Pronto, criada a sua função, com protótipo devidamente declarado e registrada &#8220;zend_function_entry&#8221; podemos compilar a extensão. Para isso volte no diretório principal do PHP e rode o <b>make</b>:</p>
<pre class="brush: bash;">
# pwd
$HOME/php/dev/php-src-5.3
# make
</pre>
<p>Não rode o &#8220;make install&#8221; pois isto instalará o php no PATH e pode substituir o seu outro PHP (se for o caso).<br />
Compilado!!! Para testar crie o seguinte arquivo PHP:</p>
<p>ext/orion/exemplo_fractal.php</p>
<pre class="brush: php;">
&lt;?php

print orion_fractal();
print orion_fractal(strrev(&quot; .:-;!/&gt;)|&amp;IH%*#&quot;));

?&gt;
</pre>
<p>Para rodar este exemplo use o comando:<br />
# sapi/cli/php ext/orion/exemplo_fractal.php</p>
<p>Bom, é isso. É um exemplo bem simples mas a partir daqui você já pode criar suas extensões. Claro que terá que estudar mais a API do core, mas a .introdução está dada.<br />
Pretendo dar um exemplos mais avançados quando tiver um tempo.</p>
<p>Até a próxima !</p>
<p> <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
</p>
<p>Referências/Links/Documentação:<br />
<a href="http://devzone.zend.com/node/view/id/1021" class="link">http://devzone.zend.com/node/view/id/1021</a><br />
<a href="http://br2.php.net/manual/pt_BR/internals2.ze1.zendapi.php" class="link">http://br2.php.net/manual/pt_BR/internals2.ze1.zendapi.php</a><br />
<a href="http://www.tuxradar.com/practicalphp/20/0/0" class="link">http://www.tuxradar.com/practicalphp/20/0/0</a><br />
<a href="http://docstore.mik.ua/orelly/webprog/php/ch14_07.htm" class="link">http://docstore.mik.ua/orelly/webprog/php/ch14_07.htm</a><br />
<a href="http://www.edgeofnowhere.cc/viewtopic.php?t=239515" class="link">http://www.edgeofnowhere.cc/viewtopic.php?t=239515</a><br />
<a href="http://www.php.net/svn.php#buildconf_fail" class="link">http://www.php.net/svn.php#buildconf_fail</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/413/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/413/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/413/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=413&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/11/22/hacking-the-core-of-php-escrevendo-extensoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>

		<media:content url="http://www.uploaddeimagens.com.br/imagem/ver/fractal1.jpg" medium="image">
			<media:title type="html">fractal1</media:title>
		</media:content>
	</item>
		<item>
		<title>[PHP] Testes unitários com MAKE no VIM/Kate/gedit/&#8230;</title>
		<link>http://universemachine.wordpress.com/2009/11/17/php-testes-unitarios-com-make-no-vimkategedit/</link>
		<comments>http://universemachine.wordpress.com/2009/11/17/php-testes-unitarios-com-make-no-vimkategedit/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 11:15:32 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[Kate]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Testes Unitários]]></category>
		<category><![CDATA[VIM]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[simpletest]]></category>
		<category><![CDATA[unit tests]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=347</guid>
		<description><![CDATA[Quem programa orientado a testes sabe do problema de ter que testar a aplicação com uma IDE que não tenha um plugin para isso. Pois deste modo temos que fazer os testes na linha de comando ou direto no navegador. Eu desenvolvo com o VIM e com o kate e eles não possuem um plugin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=347&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quem programa orientado a testes sabe do problema de ter que testar a aplicação com uma IDE que não tenha um plugin para isso. Pois deste modo temos que fazer os testes na linha de comando ou direto no navegador.</p>
<p>Eu desenvolvo com o <a href="http://pt.wikipedia.org/wiki/Vim" class="link" title="VIM">VIM</a> e com o <a href="http://pt.wikipedia.org/wiki/Kate_%28KDE%29" class="link" title="Kate KDE">kate</a> e eles não possuem um plugin para testes como no eclipse/netbeans etc&#8230; Então, para rodar os testes unitários nestes editores eu uso sempre algum script em shell junto com arquivos Makefile pois daí não preciso criar nenhum plugin para o vim ou kate porque eles já possuem um plugin de compilação.</p>
<p>No VIM é só digitar <b>:make</b> em modo de comando e no kate (se a extensão de comandos do vim estiver desabilitada) é só usar o plugin &#8220;builder&#8221; ou &#8220;construtor&#8221; e teclar <b>ALT+R</b> para compilar, o kate possui uma interface para configurar o comando padrão que rodará no make.</p>
<p>Na verdade, eu uso o make em muito mais coisas com o PHP&#8230; Por exemplo, agora que o PHP 5.3 ainda não está sendo utilizando na maioria das hospedagens e pouca gente migrou eu estou usando o make para compilar meus fontes PHP de modo a ficarem portáveis à PHP 5.2 e 5.3, mas isto pretendo falar em um post em breve.</p>
<h3>Controlando os Testes com Makefile</h3>
<p><a href="http://www.simpletest.org/" class="link" title="SimpleTest">SimpleTest</a> e <a href="http://www.phpunit.de/" class="link">PHPUnit</a> suportam Test Suite para automatizar os testes de toda a aplicação, por exemplo, mas tem uma coisa que não gosto&#8230; Com test suite soma-se todos os <span style="color:green;">&#8220;Passes&#8221;</span> e <span style="color:red;">&#8220;Failures&#8221;</span> como se fosse apenas um teste.<br />
Isto nem sempre é bom. Um dos problemas é que se voce colocar todos os seus testes numa única suíte de testes eles ficarão muito demorados (dependendo do tamanho dos testes).<br />
<span id="more-347"></span><br />
E se cada vez que você rodar seus testes todos forem rodados (até testes que já passaram sem ligação nenhuma com o que se está desenvolvendo no momento) isto é tempo perdido. Numa aplicação pequena isto é imperceptivel, mas se o sistema abusa de I/O e/ou utiliza muitas bibliotecas/frameworks externos, isso é um problema.</p>
<p>Eu gosto de ter todos os meus testes separados. E criar várias rotinas de teste prontas com Makefile. Daí se eu preciso rodar todos os testes eu utilizo:</p>
<p><b>$ make test-all</b></p>
<p>Se quero apenas rodar os testes do DAO, por exemplo, faço:</p>
<p><b>$ make dao</b></p>
<p>E assim por diante, eu acho mais vantajoso e vou mostrar como que faço.</p>
<h3>Makefile</h3>
<p>Na verdade, não precisaria usar o make pra rodar os testes no vim e no kate. Porque podemos abrir o terminal dentro deles  e no caso do vim criar um plugin é relativamente fácil, mas usando makefiles fica tudo mais organizado, não preciso instalar algo novo em cada máquina que irei trabalhar e é mais fácil de fazer manutenção e inserir novos testes.</p>
<p>Bom, não irei me aprofundar em explicar sobre o make, porque seria bem extenso e deveria render um post inteiro.<br />
Mas o make é simples e entender os seus Makefile&#8217;s é mais simples ainda, mas dependendo do que você queira fazer pode ser uma baita dor de cabeça.</p>
<p>Basicamente, o make é um programa inteligente para gerar outros programas. Ele é utilizado 99% das vezes para compilação de programas em C/C++ e quem utiliza linux já está acostumado com eles. Mais o importante saber é que o make pode automatizar qualquer rotina, independente da linguagem. Neste uso com unit tests vamos usar o make somente para chamar o script que testará a aplicação, não será usado nenhum benefício real do make. Sugiro, pra quem não o conhece, dar uma lida sobre ele.</p>
<p>O make lê arquivos de configuração chamados Makefile. Quando rodamos &#8220;make&#8221; na linha de comando ele procura por algum arquivo Makefile no diretório corrente, se encontrar lê e executa as operações. Essas operações são regras que seguem o seguinte formato:</p>
<pre class="brush: bash;">
#   Arquivo Makefile exemplo
#   &amp;quot;#&amp;quot; é um comentário
objetivo: dependencia1 dependencia2
    # Aqui vêm as operações, geralmente a compilação

dependencia1:
    # Criação da dependencia1

dependencia2:
    # Criação da dependencia 2
</pre>
<p>Note que se eu chamar o make com:<br />
$ make objetivo</p>
<p>Ele primeiramente chamará a regra &#8220;objetivo&#8221; que possui duas dependencias, como &#8220;objetivo&#8221; precisa delas para compilar, ele verificará se elas já existem, se não existem e forem mais antigas que a ultima alteração, ele chamará as regras correspondentes antes, no caso &#8220;dependencia1&#8243; e &#8220;dependencia2&#8243;. Depois de criadas as dependencias aí sim compilará &#8220;objetivo&#8221;. Bom, esse é o funcionamento básico.</p>
<p>Vamos agora ver nosso script para rodar os testes</p>
<h3>Automatizando os testes</h3>
<p>O exemplo será composto de três arquivos:</p>
<p>* config_tests    &#8211; Configura os diretórios de testes<br />
* unit_test.sh     &#8211; Script para os testes<br />
* Makefile          &#8211; Para o make</p>
<p>Você precisará ter o Xdialog instalado. Ele já vêm na maioria das distribuição por padrão, mas pode acontecer de não ter vindo, mas ele está em todos os repositórios.<br />
É só fazer <strong>apt-get install Xdialog</strong> ou <b>yum install Xdialog</b>, etc.</p>
<p>No arquivo &#8220;config_tests&#8221; apenas indicamos o diretório do framework de teste e os diretórios que o script deve procurar por testes.</p>
<p>config_tests</p>
<pre class="brush: bash;">
#!/bin/bash
#	@author Tiago Natel de Moura
#	Arquivo de configuração de Testes Unitários

#      Binário do PHP
PHP_BIN=&amp;quot;/opt/php5.3/bin/php&amp;quot;

#	Diretório do Framework de Testes
DIR_FRAMEWORK_TEST=&amp;quot;.:/mnt/www/SimpleTest&amp;quot;

#	Filtro para os arquivos de teste
ER_FILES=&amp;quot;*Test\.php$&amp;quot;

#	Diretórios onde buscar os testes
#      exemplo para essa estrutura:
#      test/
#           controller/
#           model/
#                 dao/
#           view/
#      Os diretórios estão em relação ao diretório de teste (./)
#      mas se for necessário pode colocar o caminho absoluto.
DIR_MODEL_TESTS=&amp;quot;model&amp;quot;
DIR_CONTROLLER_TESTS=&amp;quot;controller&amp;quot;
DIR_VIEW_TESTS=&amp;quot;view&amp;quot;
DIR_DAO_TESTS=&amp;quot;model/dao&amp;quot;

DIR_ALL_TESTS=&amp;quot;$DIR_MODEL_TESTS $DIR_CONTROLLER_TESTS $DIR_VIEW_TESTS $DIR_DAO_TESTS&amp;quot;
</pre>
<p>Agora o Makefile:</p>
<pre class="brush: bash;">
#	Makefile para testes automatizados em PHP
#	@author	Tiago Natel de Moura
#	@date 17/11/2009

#	Script que automatizará os testes
SCRIPT_TEST=unit_test.sh

#	All sempre será chamado quando rodarmos o make sem argumentos
#	$ make
#	Ele chamará a dependencia test-all antes.
all: test-all
	@echo &amp;quot;&amp;quot;
	@echo &amp;quot;Testes rodados com sucesso&amp;quot;

#	Executará todos os testes
test-all:
	@echo &amp;quot;Executando todos os testes&amp;quot;
	@sh $(SCRIPT_TEST) -all

#     .PNONY é utilizado para habilitar as regras virtuais
#     no caso regras que não possuem dependencias
#     é um hack para o nosso propósito.
.PHONY: controller model view dao

controller:
	@echo &amp;quot;Executando os testes nos controllers&amp;quot;
	@sh $(SCRIPT_TEST) -controller

model:
	@echo &amp;quot;Executando os testes nos models&amp;quot;
	@sh $(SCRIPT_TEST) -model

view:
	@echo &amp;quot;Executando os testes na view&amp;quot;
	@sh $(SCRIPT_TEST) -view

dao:
	@echo &amp;quot;Executando os testes no DAO.&amp;quot;
	@sh $(SCRIPT_TEST) -dao
</pre>
<p>E finalmente o script que fará tudo funcionar:</p>
<pre class="brush: bash;">
#!/bin/bash
# @author Tiago Natel de Moura
# Inclui o arquivo de configuração dos testes
. ./config_tests

# Arquivo temporário
TMP_FILE=/tmp/tmp_test

dir_tests=( )
files=( )

# Cria um arquivo vazio
echo &amp;quot;&amp;quot; &amp;amp;&amp;gt;$TMP_FILE

tests() {
	# Opções
	case $1 in
	&amp;quot;-controller&amp;quot;) 	DIR=&amp;quot;$DIR_CONTROLLER_TESTS&amp;quot;;;
	&amp;quot;-model&amp;quot;) 		DIR=&amp;quot;$DIR_MODEL_TESTS&amp;quot;;;
	&amp;quot;-dao&amp;quot;)			DIR=&amp;quot;$DIR_DAO_TESTS&amp;quot;;;
	&amp;quot;-all&amp;quot;) 		DIR=&amp;quot;$DIR_ALL_TESTS&amp;quot;;;
	*) echo &amp;quot;Não foi passado nenhum parametro para o script&amp;quot;; exit 1 ;;
	esac

        # Pega os diretórios e coloca no array $dir_tests
	get_dir_tests $DIR
        # Pega os arquivos de teste e coloca no array $files
	get_files_tests

	if [ ${#files[@]} -eq 0 ]
	then
		echo &amp;quot;Nenhum arquivo de testes encontrado !&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
		echo &amp;quot;Só será executado testes em arquivos com formato: *Test.php&amp;quot; &amp;amp;&amp;gt;&amp;amp;&amp;gt;$TMP_FILE
		echo &amp;quot;Exemplos: &amp;quot; &amp;gt;&amp;gt;$TMP_FILE
		echo -e &amp;quot;\tcadastroControllerTest.php&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
		echo -e &amp;quot;\tfactoryTest.php&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
	fi

	(
		for (( i=0; i &amp;lt; $TMP_FILE
				# testa a sintaxe PHP
				echo &amp;quot;____________________________________________________________&amp;quot; &amp;gt;&amp;gt; $TMP_FILE
				if $PHP_BIN -l ${files[$i]} 2&amp;gt;&amp;amp;1&amp;gt;&amp;amp;-
				then
					echo &amp;quot;Syntax: [OK]&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
				else
					echo &amp;quot;Syntax: [FAILED]&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
					exit 1
				fi
				$PHP_BIN -d include_path=$DIR_FRAMEWORK_TEST -f ${files[$i]} &amp;gt;&amp;gt;$TMP_FILE
			else
				error=1
				echo &amp;quot;File \&amp;quot;${files[$i]}\&amp;quot; not found.&amp;quot; &amp;gt;&amp;gt;$TMP_FILE
				echo &amp;quot;cancelando testes...&amp;quot; &amp;gt;&amp;gt; $TMP_FILE
				exit 1
			fi
			echo $percent
		done
	) | Xdialog --title &amp;quot;running tests...&amp;quot; --gauge &amp;quot;teststs&amp;quot; 0 0 0

	if [ &amp;quot;$error&amp;quot; = 1 ]
	then
		msg=&amp;quot;Houve erros ao rodar os testes.&amp;quot;
	else
		msg=&amp;quot;Testes rodados com sucesso.&amp;quot;
	fi

	for i in `cat $TMP_FILE | egrep &amp;quot;Test cases run&amp;quot; | cut -c 43`
	do
		if [ &amp;quot;$i&amp;quot; -eq 0 ]
		then
			tests=&amp;quot;pass&amp;quot;
		else
			tests=&amp;quot;fail&amp;quot;
			break
		fi
	done

	Xdialog --rc-file &amp;quot;.dialog-$tests.rc&amp;quot; --title &amp;quot;Result of tests: $msg&amp;quot; --msgbox &amp;quot;`cat $TMP_FILE`&amp;quot; 500x300
}

get_dir_tests() {
	if [ $1 ]
	then
		j=0
		for i in $*
		do
			dir_tests[$j]=$i
			j=$(($j+1))
		done
	else
		echo &amp;quot;[FAILED] Nenhum argumento passado para a função get_dir_tests()&amp;quot;
		return 1
	fi
}

get_files_tests() {
	for i in ${dir_tests[@]}
	do
		if test &amp;quot;${i:0:1}&amp;quot; = &amp;quot;/&amp;quot;
		then
			i=&amp;quot;`pwd`/$i&amp;quot;
		fi

		if test -d &amp;quot;$i&amp;quot;;
		then
			j=0
			for t in `ls -1 $i | egrep $ER_FILES`
			do
				files[$j]=&amp;quot;$i/$t&amp;quot;
				j=$(($j + 1))
			done
		else
			echo &amp;quot;[FAILED] O diretório '$i' não foi encontrado&amp;quot;
			exit 1
		fi
	done
}

tests $1

rm -rf &amp;quot;$TMP_FILE&amp;quot;
</pre>
<p>Ah, eu esqueci de falar mais este script vai gerar uma caixa de diálogo verde se o script passar e vermelha caso algum dos testes falhem. Para que as cores funcionem você vai precisar colocar no mesmo diretório do script esses dois arquivos abaixo:</p>
<p>.dialog-fail.rc</p>
<pre class="brush: bash;">
style 'red_background' {
                bg[NORMAL] = { 0.8, 0.0, 0.0 }
                fg[NORMAL] = { 1.0, 1.0, 1.0 }
        }
        widget '*' style 'red_background'
</pre>
<p>.dialog-pass.rc</p>
<pre class="brush: bash;">
style 'green_background' {
                bg[NORMAL] = { 0.0, 0.6, 0.4 }
                fg[NORMAL] = { 1.0, 1.0, 1.0 }
        }
        widget '*' style 'green_background'
</pre>
<p>Pronto, voces podem baixar esse exemplo <a href="http://blog.tiagomoura-design.com.br/wp-content/uploads/2009/11/vim-make.tar.gz" class="link" title="TUTORIAL testes com MAKE">aqui</a>. Esse é um exemplo simples, você pode ir adicionando funcionalidades conforme o seu projeto necessitar.</p>
<p>Agora de dentro do VIM podemos chamar o script com o comando <b>:make</b> e no Kate apertando <b>ALT+R</b>.<br />
Podemos fazer:</p>
<p><b>:make controller</b><br />
Para rodar os testes dos controllers ou<br />
<b>:make model</b><br />
para os testes no model, e assim por diante.</p>
<h3>O Resultado Final</h3>
<p>Testes passando:<br />
<a href="http://universemachine.files.wordpress.com/2009/12/make2.jpg"><img src="http://universemachine.files.wordpress.com/2009/12/make2.jpg?w=300&#038;h=225" alt="" title="make2" width="300" height="225" class="aligncenter size-medium wp-image-451" /></a><br />
Testes falhando:</p>
<p>** Um detalhe: Esse script é só um exemplo, portanto ele funciona perfeitamente com o SimpleTest mas se você usar o PHPUnit, por exemplo, terá que alterar a linha <b>75</b> do arquivo unit_test.sh.</p>
<p>O script automaticamente ajusta o diretório do framework no <a href="http://www.php.net/manual/pt_BR/ini.core.php#ini.include-path" class="link">include_path</a> do php.ini.</p>
<p>É isso aí, qualquer dúvida é só perguntar.</p>
<p>Até mais !</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/347/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=347&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/11/17/php-testes-unitarios-com-make-no-vimkategedit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>

		<media:content url="http://universemachine.files.wordpress.com/2009/12/make2.jpg?w=300" medium="image">
			<media:title type="html">make2</media:title>
		</media:content>
	</item>
		<item>
		<title>Estrutura de Diretórios para Aplicações Web</title>
		<link>http://universemachine.wordpress.com/2009/11/09/estrutura-de-diretorios-para-aplicacoes-web/</link>
		<comments>http://universemachine.wordpress.com/2009/11/09/estrutura-de-diretorios-para-aplicacoes-web/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 08:37:33 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[Orion Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[directory]]></category>
		<category><![CDATA[estrutura de diretórios]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[structure]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=307</guid>
		<description><![CDATA[A estrutura de diretórios da aplicação é um requisito importante para a futura produtividade no projeto, pois se não for bem pensada, seu projeto pode ficar amarrado à pequenos problemas como: Repetição de código, não ter escalabilidade nem flexibilidade, dificil migração, etc. É um ponto que, quando usamos frameworks, não costumamos pensar muito, devido a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=307&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A estrutura de diretórios da aplicação é um requisito importante para a futura produtividade no projeto, pois se não for bem pensada, seu projeto pode ficar amarrado à pequenos problemas como: Repetição de código, não ter escalabilidade nem flexibilidade, dificil migração, etc.<br />
É um ponto que, quando usamos frameworks, não costumamos pensar muito, devido a eles já trazerem uma estrutura de diretórios própria que nem sempre é a melhor para o seu projeto.</p>
<p>Na minha opinião a estrutura de diretórios não deve simplesmente fornecer um padrão para seus projetos, mas sim fornecer flexibilidade, escalabilidade e se possivel produtividade. Alguns frameworks lhe garantem alguns benefícios se você seguir algumas convenções que eles impõem. Mas não gosto da maioria destas convenções e acho que nós devemos programar da maneira que mais nos convém.</p>
<p>Existem inúmeras maneiras de você organizar seu projeto, aqui vou falar de alguns fatores que você poderá pensar na hora de definir sua estrutura de diretórios (independente se usar framework ou não), mas óbvio que isso não significa que é a mais adequada para você ou sua aplicação corrente.</p>
<p>O que será falado vale para qualquer projeto que utilize do padrão MVC. Você terá que adaptar conforme seu framework exigir. Se você não utiliza framework mas programa segundo o padrão MVC esse artigo poderá lhe ajudar.<br />
<span id="more-307"></span></p>
<h3>Estrutura básica</h3>
<p>Uma aplicação MVC é formada basicamente de controllers, models, views, arquivos de configuração e bibliotecas internas/externas.</p>
<p>Óbviamente, separamos os controllers, models e view em seus respectivos diretórios. Esses três diretórios que formam o MVC constituem o principal da sua aplicação e por isso, a maioria dos frameworks costumam inserí-los dentro de um diretório chamado &#8220;applications&#8221; ou &#8220;apps&#8221; ou simplesmente &#8220;app&#8221;. Dentro de app/ estará toda a lógica da sua aplicação.<br />
Mas uma aplicação também necessita de arquivos de configuração.<br />
Em projetos pequenos talvez nem necessite de um diretório específico para arquivos de configuração, mas em médios/grandes e/ou em aplicações que sofrem constantes upgrades esses arquivos podem ser numerosos e precisam de um diretório específico. Alguns frameworks chamam esse diretório de &#8220;Etc&#8221; outros de &#8220;config&#8221;.<br />
Depois vem as bibliotecas ou classes que compõe o sistema. Há um consenso de colocá-las dentro de um diretório chamado &#8220;lib/&#8221; ou &#8220;libs/&#8221;.<br />
Essa estrutura básica ficaria assim:</p>
<pre class="brush: plain">
project/
    app/
        controller/
        model/
        view/
    config/
    libs/
</pre>
<p>Para aplicações em produção por segurança, não é recomendado que seja possivel o acesso pela URL aos arquivos que compõe a lógica e configuração da aplicação. Por isso costumá-se deixar todos os arquivos do projeto fora do <a href="http://httpd.apache.org/docs/2.0/mod/core.html#documentroot" class="link">DocumentRoot</a> exceto os arquivos de apresentação (css+xhtml+img) e um arquivo que lerá a requisição do usuário (costuma ser um arquivo index.php para o frontend e outro para o backend). Esses arquivos, que são visiveis, também necessitam de um diretório. Não há padrão nenhum nos frameworks PHP para o nome deste diretório, alguns o chamam &#8220;public/&#8221;, outros &#8220;web&#8221; ou &#8220;webroot&#8221;. Eu costumo nomeá-lo &#8220;public/&#8221; ou &#8220;www/&#8221;.<br />
O próximo diretório importante é o dos testes unitários, que costuma ser chamado &#8220;tests/&#8221;.<br />
Também há outros diretórios facultativos para informação temporária (&#8220;tmp/&#8221;) como &#8220;cache&#8221;, &#8220;logs&#8221;, etc, que não serão comentados. Você também pode criar um diretório &#8220;scripts/&#8221; ou como desejar para armazenar seus scripts.<br />
A estrutura básica está assim:</p>
<pre class="brush: plain">
project/
    app/
        controller/
        model/
        view/
    config/
    libs/
    public/
        index.php
    tests/
</pre>
<h3>Bibliotecas/Frameworks num diretório único</h3>
<p>Uma coisa que demorei um pouco a aprender foi desacoplar as classes do projeto de uma maneira a poder utilizá-las em outros projetos similares. Por exemplo, por que vamos ter um &#8220;symfony&#8221; dentro de cada projeto de um mesmo sistema? Podemos ter apenas um diretório contendo as classes do symfony e todos os seus projetos que o utilizem podem buscá-lo no mesmo lugar.<br />
1&deg; alternativa:<br />
Por exemplo, antes tinhamos assim:</p>
<pre class="brush: plain">
projects/
    blog1/
        app/
            controller/
            model/
            view/
        config/
        libs/
            Vendor/
                Sf/
        public/
            index.php
        tests/
    blog2
        app/
            controller/
            model/
            view/
        config/
        libs/
            Vendor/
                Sf/
        public/
            index.php
        tests/
</pre>
<p>Mas podemos reduzir o número de arquivos do servidor e facilitar upgrades mantendo apenas um diretório real com seu framework, usando <a class="link" href="http://en.wikipedia.org/wiki/Symbolic_link">Link Simbólico</a> (usuários Windows não podem desfrutar de mais esse recurso) podemos referenciar o framework a partir de nossos projetos, ficando assim:</p>
<pre class="brush: plain">
// Diretório com o Symfony
/home/projects/libs/Vendor/Sf/

projects/
    blog1/
        app/
            controller/
            model/
            view/
        config/
        libs/
            Sf/  --&gt; /home/projects/libs/Vendor/Sf
        public/
            index.php
        tests/
    blog2
        app/
            controller/
            model/
            view/
        config/
        libs/
            Sf/ --&gt; /home/projects/libs/Vendor/Sf
        public/
            index.php
        tests/
</pre>
<p>O bom dessa configuração é que tudo vai funcionar como se realmente existisse as classes do symfony dentro de projects/blogX/libs/Vendor/Sf. O ruim é que, se o framework necessita de uma configuração específica de diretórios para funcionar e ele utilizar, por exemplo, a constante <strong>__FILE__</strong> para se encontrar no seu projeto, esta constante vai apontar para /home/projects/libs/Vendor/Sf e não para o diretório virtual que você criou para ele. Nos frameworks mais comuns isso não é problema, pois eles até recomendam essa configuração.</p>
<p>2&deg; alternativa:<br />
Pode-se também apenas acrescentar o diretório do seu framework ou conjunto de classes no PATH do sistema, assim sendo visualizado por todas as aplicações.<br />
Pode se fazer isso diretamente na aplicação com php:</p>
<pre class="brush: php">
&lt;?php
// Diretório do Simfony
$path_sf = '/home/projects/libs/Vendor/Sf';
// Pega o PATH atual e adiciona o caminho do symfony
$path = get_include_path() . PATH_SEPARATOR .
           str_replace('/', DIRECTORY_SEPARATOR, $path_sf);
// Ajusta o PATH
set_include_path($path);
</pre>
<p>ou no .htaccess:</p>
<pre class="brush: plain">
php_value include_path ".:/home/projects/libs/Vendor/Sf"
</pre>
<p>e ainda no php.ini com include_path=&#8221;.:/home/projects/libs/Vendor/Sf&#8221;</p>
<p>Mas isto vale não somente para o seu framework, uma coisa importante que deveríamos sempre nos preocupar é de desenvolver um código bem desacoplado, com classes desacopladas, programando mais com interfaces. Desta forma podemos utilizar essas classes noutros projetos e, se você tiver várias aplicações no mesmo servidor, poderá buscar essas suas classes todas no mesmo diretório. Isso ajuda muito para organização e manutenção do código.<br />
Por exemplo, imagina que você tenha criado uma boa classe de envio de email, e ela está trabalhando tão bem que você utiliza ela em outros projetos também. Daí depois de algum tempo, você nota que ela poderia ser refatorada num determinado método. O que fazer? Refatorar esta classe em cada projeto?<br />
Quando trabalhamos localmente ou no ambiente de desenvolvimento, é aconselhável manter a prática de programar para interfaces. Quem desenvolve orientado à testes sabe da importância de se criar um sistema desacoplado.<br />
Eu costumo chamar essas minhas classes bem desacopladas de universais e colocá-las num diretório &#8220;universe&#8221;.<br />
Poderia ficar assim:</p>
<pre class="brush: plain">
// Diretório com seu Framework
/home/projects/libs/Vendor/MyFramework/
// Diretório com suas classes universais
/home/projects/libs/universe
projects/
    blog1/
        app/
            controller/
            model/
            view/
        config/
        libs/
            Sf/  --&gt; /home/projects/libs/Vendor/Sf
            universe/   --&gt; /home/projects/libs/universe/
        public/
            index.php
        tests/
    blog2
        app/
            controller/
            model/
            view/
        config/
        libs/
            Sf/ --&gt; /home/projects/libs/Sf
            universe/  --&gt; /home/projects/libs/universe/
        public/
            index.php
        tests/
</pre>
<p>Nestas classes no diretório /libs/universe/ você pode utilizar um controle de versão separado, que poderá ser mantido por todos os  desenvolvedores, criando <a href="http://pt.wikipedia.org/wiki/CVS" class="link">branches</a> quando necessário alguma funcionalidade a mais.</p>
<h3>Aplicação Simples</h3>
<p>Para uma aplicação simples, que não terá um longo histórico de modificações e/ou upgrades, vale mais a pena investir em uma estrutura simples. Como as que vimos anteriormente.</p>
<h3>Aplicações maiores</h3>
<p>Para projetos maiores ou que necessitarão de upgrades e/ou adição de plugins ou funcionalidades é uma boa separar os controllers em módulos.<br />
Isso facilitará a inclusão de novas funcionalidades num projeto já um pouco grande, primeiro porque o deixará muito mais organizado e depois que evitará colisão de nomes de controllers entre os módulos.<br />
Veja esse exemplo:</p>
<pre class="brush: plain">
// Diretório com seu Framework
/home/projects/libs/Vendor/MyFramework/
// Diretório com suas classes universais
/home/projects/libs/universe
projects/
    blog/
        app/
            modules/
                moduleA/
                    controller/
                    model/
                    view
                moduleB/
                    controller/
                    model/
                    view/
        config/
        libs/
            Sf/  --&gt; /home/projects/libs/Vendor/Sf
            universe/   --&gt; /home/projects/libs/universe/
        public/
            index.php
        tests/
</pre>
<p>É isso aí, espero que tenha ajudado de alguma forma a quem está começando a desenvolver com MVC. Mas saiba que para cada desenvolvedor e/ou projeto existe uma estrutura de diretórios melhor. Você deve escolher aquela que se sente melhor ou têm mais produtividade.</p>
<p>Até a próxima. <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/307/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/307/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/307/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=307&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/11/09/estrutura-de-diretorios-para-aplicacoes-web/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>Negativa e Logarítimo de uma imagem com OPENCV</title>
		<link>http://universemachine.wordpress.com/2009/10/31/negativa-e-logaritimica-de-uma-imagem-com-opencv/</link>
		<comments>http://universemachine.wordpress.com/2009/10/31/negativa-e-logaritimica-de-uma-imagem-com-opencv/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 07:55:08 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenCV]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=237</guid>
		<description><![CDATA[Nesse post vou mostrar outro exemplo simples do uso da biblioteca opencv.
Se você não a conhece, <a href="http://pt.wikipedia.org/wiki/Opencv" class="link">opencv</a> é uma biblioteca para <a href="http://pt.wikipedia.org/wiki/Vis%C3%A3o_computacional" class="link">Visão Computacional</a> muito utilizada. Você pode programar com ela em C/C++ ou python.
Para rodar este exemplo voce vai precisar de uma webcam.

Se voce usa o linux é muito fácil instalar, pois o opencv já vêm na maioria dos repositórios das distribuições. Voce vai precisar também do ffmpeg<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=237&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nesse post vou mostrar outro exemplo simples do uso da biblioteca opencv.<br />
Se você não a conhece, <a href="http://pt.wikipedia.org/wiki/Opencv" class="link">opencv</a> é uma biblioteca para <a href="http://pt.wikipedia.org/wiki/Vis%C3%A3o_computacional" class="link">Visão Computacional</a> muito utilizada. Você pode programar com ela em C/C++ ou python.<br />
Para rodar este exemplo voce vai precisar de uma webcam.</p>
<p>Se voce usa o linux é muito fácil instalar, pois o opencv já vêm na maioria dos repositórios das distribuições. Voce vai precisar também do ffmpeg<br />
<span id="more-237"></span><br />
Archlinux:<br />
# pacman -Sy ffmpeg opencv</p>
<p>Debian&#8217;s like:<br />
# apt-get install ffmpeg opencv</p>
<p>Fedora:<br />
# yum install ffmpeg opencv</p>
<p>Como eu não tenho muita sorte, a instalação pelo repositório no meu archlinux não funciona com a minha webcam, portanto eu sempre preciso instalar a partir dos fontes. Você pode pegar os tar-ball aqui:<br />
<a href="http://sourceforge.net/projects/opencvlibrary/" class="link">OPENCV</a><br />
<a href="http://ffmpeg.org/" class="link">FFMPEG</a></p>
<p>Bom vamos lá então, vou partir do pressuposto que esteja estudando a teoria sobre visão computacional, do contrário pegará o bonde andando. Se não sabe nada de visão recomendo uma apostila ou um livro.<br />
<a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAcQFjAA&amp;url=http%3A%2F%2Fs2i.das.ufsc.br%2Fharpia%2Fdownloads%2Fapostila-sistemas-visao.pdf&amp;rct=j&amp;q=apostila+opencv&amp;ei=rMDrSpO6D5OYtgeGlYU_&amp;usg=AFQjCNG069TuWp7KCa43dWZki7RRhQ6faQ&amp;sig2=70WriTy5zhIllNenEV7Wnw" class="link">apostila do projeto Harpia</a><br />
e veja a referencia da própria biblioteca que vêm com o fonte. Ache com o comando:<br />
$ find /usr | grep opencv/doc<br />
No meu caso o caminho é /usr/share/opencv/doc</p>
<p>Aqui o código final:</p>
<pre class="brush: cpp;">
/**
 * @author Tiago Natel de Moura
 * @date 31/10/2009
 */

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

/**
 * inclui as bibliotecas
 * Voce pode colocar somente:
 * #include &lt;cv.h&gt;
 * #include &lt;highgui.h&gt;
 * Mas aí terá que adicionar o caminho da
 * instalação do opencv no path.
 */
#include &lt;opencv/cv.h&gt;
#include &lt;opencv/highgui.h&gt;
#include &lt;unistd.h&gt; // para o getopt()

/**
 * Protótipos
 */
void help(int, char* []);
void negative();
IplImage* negativeImage(IplImage* img);
void logarithm();
IplImage* logarithmImage(IplImage* img, int c);

int optflag = 0;

int main(int argc, char* argv[])
{
    int opcao;
    static char opcoes[] = &quot;nl&quot;;
    int opterr = 0;

    if(argc = 0 )
            break;
    }

    cvDestroyWindow(&quot;capture&quot;);
}

/**
 * Operação: Negativa
 *
 * Inverte-se a intensidade luminosa de cada pixel da imagem.
 * Expressão::
 *
 *
 * Uma imagem f(x,y,i), que possui uma faixa de
 * cores variando de [0,L-1], a negativa é dada por:
 * 		g(x,y,i) = (L-1) - f(x,y,i)
 *
 * 		Onde:
 *  			f(x,y,i) 	é a imagem de entrada,
 * 				x,y			são as coordenadas do pixel
 * 				i			é o canal
 *
 * @param 	IplImage*		Imagem de entrada
 * @return 	IplImage*		Imagem de saída
 */
IplImage* negativeImage(IplImage* img)
{
    int j,i;
	int temp1, temp2, temp3;

	/**
	 * Pega os valores da imagem de entrada
	 */
	int height 	= img-&gt;height;
	int width 	= img-&gt;width;
	int step 	= img-&gt;widthStep;
	int channels= img-&gt;nChannels;
	uchar *data = (uchar*) img-&gt;imageData;

    /**
     * Aqui vamos varrer os pixels da imagem.
     * No for externo percorremos a altura e no
     * interno a largura.
     */
	for(i=0; i &lt; height; i++)
	{
		for(j=0; j = 0 )
            break;
   }

   cvDestroyWindow(&quot;capture&quot;);
}

/**
 * Aplica uma transformação logarítmica à cada ponto de uma imagem.
 * Foi utilizada a seguinte expressão:
 * 			g(x,y,i) = c.Log(1+f(x,y,i))
 */
IplImage* logarithmImage(IplImage* img, int c)
{
	int height 	= img-&gt;height;
	int width 	= img-&gt;width;
	int step 	= img-&gt;widthStep;
	int channels= img-&gt;nChannels;
	uchar* data = (uchar*) img-&gt;imageData;
	int i,j;

	for(i=0; i &lt; height; i++)
	{
		for(j=0; j &lt; width;j++)
		{
            /**
             * Aplicamos a fórmula
             */
			data[i*step + j*channels] 	= c*log(1 + data[i*step + j*channels]);
			data[i*step + j*channels+1] = c*log(1 + data[i*step + j*channels+1]);
			data[i*step + j*channels+2] = c*log(1 + data[i*step + j*channels+2]);
		}
	}
	return img;
}
</pre>
<p>Bom, o código está comentado. Para uma boa compreensão recomendo que veja na documentação a estrutura IplImage, se ainda não estiver claro pode perguntar.<br />
Compile com:<br />
$ gcc -o exemplo exemplo.c -lhighgui<br />
se não encontrar a biblioteca use:<br />
$ gcc -o exemplo exemplo.c -lhighgui -I/caminho/onde/compilou/sua/biblioteca</p>
<p>Esse foi só um examplo simples, nos próximos posts quero mostrar algumas coisas mais avançadas. Se você ainda não sabe o que se pode fazer com essa biblioteca veja um dos videos abaixo:</p>
<p>Real Time pixel based Motion Detector &#8211; OPENCV<br />
<span class='embed-youtube' style='text-align:center; display:block;'><object width='604' height='370'><param name='movie' value='http://www.youtube.com/v/K8h9eb5-yfI?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' /> <param name='allowfullscreen' value='true' /> <param name='wmode' value='opaque' /> <embed src='http://www.youtube.com/v/K8h9eb5-yfI?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' type='application/x-shockwave-flash' allowfullscreen='true' width='604' height='370' wmode='opaque'></embed> </object></span></p>
<p>Controlando o mouse a distancia. Estilo Minority Report<br />
<span class='embed-youtube' style='text-align:center; display:block;'><object width='604' height='370'><param name='movie' value='http://www.youtube.com/v/Okf-EO-R4Q8?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' /> <param name='allowfullscreen' value='true' /> <param name='wmode' value='opaque' /> <embed src='http://www.youtube.com/v/Okf-EO-R4Q8?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' type='application/x-shockwave-flash' allowfullscreen='true' width='604' height='370' wmode='opaque'></embed> </object></span></p>
<p>Face Detection:</p>
<p>http://www.youtube.com/watch?v=V7UdYzCMKvw&#038;feature=related</p>
<p>Eye Tracking<br />
<span class='embed-youtube' style='text-align:center; display:block;'><object width='604' height='370'><param name='movie' value='http://www.youtube.com/v/_KhP3O3GeYs?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' /> <param name='allowfullscreen' value='true' /> <param name='wmode' value='opaque' /> <embed src='http://www.youtube.com/v/_KhP3O3GeYs?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' type='application/x-shockwave-flash' allowfullscreen='true' width='604' height='370' wmode='opaque'></embed> </object></span></p>
<p>Face based Authentication<br />
<span class='embed-youtube' style='text-align:center; display:block;'><object width='604' height='370'><param name='movie' value='http://www.youtube.com/v/t3USMrE7WGE?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' /> <param name='allowfullscreen' value='true' /> <param name='wmode' value='opaque' /> <embed src='http://www.youtube.com/v/t3USMrE7WGE?version=3&rel=1&fs=1&showsearch=0&showinfo=1&iv_load_policy=1' type='application/x-shockwave-flash' allowfullscreen='true' width='604' height='370' wmode='opaque'></embed> </object></span></p>
<p>Isso são só alguns exemplos. É uma área da computação que ainda está começando mais com certeza vai revolucionar a maneira como o homem interage com o computador. Será no estilo <a href="http://pt.wikipedia.org/wiki/Steven_Spielberg" class="link">Spielberg</a>.</p>
<p>Até a próxima.<br />
 <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/237/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/237/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/237/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=237&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/10/31/negativa-e-logaritimica-de-uma-imagem-com-opencv/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>Implementando RC4 em PHP</title>
		<link>http://universemachine.wordpress.com/2009/10/24/implementando-rc4-em-php/</link>
		<comments>http://universemachine.wordpress.com/2009/10/24/implementando-rc4-em-php/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 10:25:55 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[Criptografia]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[algoritimos]]></category>
		<category><![CDATA[cipher]]></category>
		<category><![CDATA[criptologia]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[RC4]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[xor]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=159</guid>
		<description><![CDATA[Eu estava precisando de uma criptografia independente de extensões para o PHP para implementar no framework, depois de uma pesquisada decidi eu mesmo fazer o algoritmo do RC4 em PHP. Uma pequena introdução RC4 é um algoritmo de criptografia de fluxo muito conhecido e respeitado. Foi desenvolvido por Ron Rivest para a empresa RSA Data [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=159&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eu estava precisando de uma criptografia independente de extensões para o PHP para implementar no framework, depois de uma pesquisada decidi eu mesmo fazer o algoritmo do RC4 em PHP.</p>
<h3>Uma pequena introdução</h3>
<p><a title="ARC4" href="http://pt.wikipedia.org/wiki/RC4">RC4</a> é um algoritmo de <a class="link" title="Criptografia de Fluxo" href="http://en.wikipedia.org/wiki/Stream_cipher">criptografia de fluxo</a> muito conhecido e respeitado. Foi desenvolvido por Ron Rivest para a empresa <a class="link" href="http://pt.wikipedia.org/wiki/RSA_Data_Security,_Inc.">RSA Data Security</a>, portanto é privado, mas em <a class="link" title="Cypherpunk mailinglist" href="http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0">1994 foi postado anonimamente uma versão do algoritmo compativel com o original</a>. Esta versão é conhecida como ARCFOUR ou ARC4 (Alleged RC4).</p>
<p>Você quer saber quais protocolos utilizam RC4?</p>
<ul>
<li><a class="link" title="SSL" href="http://pt.wikipedia.org/wiki/SSL">Secure Socket Layers (SSL/HTTPS)</a></li>
<li><a class="link" title="WEP - Redes sem fio" href="http://pt.wikipedia.org/wiki/WEP">WEP</a></li>
<li><a class="link" title="WPA default, pois WPA pode ser configurado usando AES" href="http://en.wikipedia.org/wiki/Wi-Fi_Protected_Access">WPA</a></li>
<li><a class="link" title="BitTorrent" href="http://en.wikipedia.org/wiki/BitTorrent_protocol_encryption">BitTorrent</a></li>
<li><a class="link" title="Microsoft Point to Point" href="http://en.wikipedia.org/wiki/MPPE">Microsoft Point to Point</a></li>
<li><a class="link" title="Secure Shell" href="http://en.wikipedia.org/wiki/Secure_shell">Secure Shell</a></li>
<li><a class="link" title="Veja na WIKI :P" href="http://en.wikipedia.org/wiki/RC4">etc</a></li>
</ul>
<p>Bom antes de ver o code tem um pré-requisito:</p>
<h3>Xor Encription Algorithm</h3>
<p>A criptografia moderna é dividida basicamente em criptografia <a class="link" title="Criptografia Simétrica" href="http://pt.wikipedia.org/wiki/Criptografia_Sim%C3%A9trica">simétrica</a> e <a class="link" title="Criptografia de chave pública" href="http://pt.wikipedia.org/wiki/Criptografia_de_chave_p%C3%BAblica">assimétrica</a>. RC4 é um algoritmo de criptografia simétrico. Os algoritmos simétricos podem ser divididos em <em>algoritmos de blocos</em> e <em>algoritmos de fluxo</em>.<br />
Nos algoritmos simétricos de bloco um tamanho fixo deve ser cifrado de cada vez. Por exemplo, se o algoritmo cifra blocos de 128 bits, somente ocorrerá a cifragem se a mensagem tiver exatamente este tamanho. Ele é mais usado em transações em que os pacotes possuem tamanho fixo. Eles podem ser usados em quaisquer outras aplicações também, mas para cifrar mensagens menores que o tamanho do bloco ele necessita completar a mensagem com um cabeçalho, também chamado de <em>padding</em>.</p>
<p>Os algoritmos de fluxo podem cifrar a mensagem bit-a-bit não importando assim o tamanho da mensagem. O RC4 é um algoritmo simétrico de fluxo, então vamos entender um pouco esse funcionamento.<br />
Num algoritmo de fluxo, os bits de uma mensagem em texto plano são combinados com simples operações de <a class="link" title="XOR" href="http://en.wikipedia.org/wiki/Exclusive-or">Xor</a> contra uma cadeia de bits pseudo-aleatórios (<a class="link" title="pseudorandom" href="http://en.wikipedia.org/wiki/Pseudorandom">pseudorandômicos</a>), também chamados <em>keystream</em>.<br />
O Xor está no centro da maioria dos algoritmos modernos, <a class="link" title="Xor cipher" href="http://en.wikipedia.org/wiki/XOR_cipher">ele</a> sozinho é um tipo de criptografia. Vamos lembrar como funcionam os operadores lógicos AND, OR, NOT e XOR:<br />
<span id="more-159"></span><br />
&amp; (AND)<br />
Os bits que estão ativos tanto em $a quanto em $b são ativados.</p>
<pre class="brush: jscript;">01000 &amp;amp; 00100 = 00000
01000 &amp; 00000 = 00000
10111 &amp; 01010 = 00010
11111 &amp; 11001 = 11001
</pre>
<p>| (OR)<br />
Os bits que estão ativos em $a ou em $b são ativados.</p>
<pre class="brush: jscript;">01000 | 00100 = 01100
01000 | 01100 = 01100
10111 | 01010 = 11111
11111 | 11001 = 11111</pre>
<p>~ (NOT)<br />
Os bits que estão ativos em $a não são ativados, e vice-versa.</p>
<pre class="brush: jscript;">~ 01000 = 10111
~ 10111 = 01000
~ 11111 = 00000
~ 11001 = 00110</pre>
<p>^ (xor)<br />
Os bits que estão ativos em $a ou em $b, mas não em ambos, são ativados.</p>
<pre class="brush: jscript;">01000 ^ 10111 = 11111
11111 ^ 01000 = 10111
10111 ^ 01010 = 11101
00010 ^ 00000 = 00010
00010 ^ 11111 = 11101</pre>
<p>Bom, atentem ao xor, também chamado de <em>&#8220;ou exclusivo&#8221;</em>, ele possui as propriedades de <a class="link" title="Comutatividade" href="http://pt.wikipedia.org/wiki/Comutatividade">comutatividade</a> ,<a class="link" title="Associatividade" href="http://pt.wikipedia.org/wiki/Associatividade">associatividade</a> e principalmente <strong>reversividade</strong>.<br />
Comutatividade:<br />
A ^ B = B ^ A<br />
Associatividade:<br />
A ^ (B ^ C) = (A ^ B) ^ C<br />
Reversividade:<br />
(A ^ B) ^ A = B</p>
<p>A característica mais importante do Xor é a reversibilidade. Se fizermos um xor entre A e B, resultando C e depois apĺicarmos um xor entre C e A retornará B.<br />
Exemplo simples do uso:</p>
<pre class="brush: jscript;">chave = segredo
Mensagem = hello
Em ASCII decimal fica:
chave = (115)(101)(103)(114)(101)(100)(111)
mensagem = (104)(101)(108)(108)(111)
Em Binário fica:
chave = 1110011 1100101 1100111 1110010 1100101 1100100 1101111
mensagem = 1101000 1100101 1101100 1101100 1101111</pre>
<p>Agora vamos cifrar cada caracter da mensagem com o respectivo da chave, isto pode ser feito de qualquer maneira lógica, mas vamos fazer um a um mesmo:</p>
<pre class="brush: jscript;">mensagem ==&amp;gt;        criptografia        ==&amp;gt;   cifrado =&amp;gt;  ASCII
   h          =&amp;gt;    1101000 ^ 1110011  ==&amp;gt;  0011011 = [ESCAPE]
   e          =&amp;gt;    1100101 ^ 1100101  ==&amp;gt;  0000000 = [NULL]
   l          =&amp;gt;    1101100 ^ 1100111  ==&amp;gt;  0001011 = [VERTICAL TAB]
   l          =&amp;gt;    1101100 ^ 1110010  ==&amp;gt;  0011110 = [RECORD SEP]
   o          =&amp;gt;    1101111 ^ 1100101  ==&amp;gt;  0001010 = [LINE FEED]</pre>
<p>A mensagem hello foi cifrada e (nesse caso) não é nem visivel, pois os equivalentes em ASCII são caracteres de controle ou vazios. Para descriptografa-la basta fazer o mesmo processo, iterar os caracteres da mensagem cifrada novamente operando em xor com a chave. Criptografia de xor simples como essa não é segura, mas se bem implementada pode se tornar muito dificil de ser quebrada. Se a mesma chave for usada em várias mensagens é possivel quebrá-la com <a class="link" title="Análise de frequência" href="http://en.wikipedia.org/wiki/Frequency_analysis">análise de frequencia</a>. Vale muito a pena dar uma olhada <a class="link" title="LEIA!!!" href="http://en.wikipedia.org/wiki/Frequency_analysis">nisso</a>.<br />
Mas se a chave for randomica e de tamanho igual ou maior que a mensagem a criptografia de xor é muito segura, podendo até mesmo ser INQUEBRÁVEL (pelo menos teóricamente, rsrs).<br />
Mas como codar isso? Muito simples:</p>
<pre class="brush: cpp;">
/**
  * Linguagem: C
  * Escolha uma chave super aleatória, como
  * essa minha oO
  */
unsigned char key[] = {
	0x45,0x73,0x73,0x61,0x20,
	0xe9,0x20,0x61,0x20,0x6d,
	0x69,0x6e,0x68,0x61,0x20,
	0x63,0x68,0x61,0x76,0x65,
	0x20,0x73,0x75,0x70,0x65,
	0x72,0x20,0x73,0x65,0x63,
	0x72,0x65,0x74,0x61,0x20,
	0x3a,0x29, 0x00
};

/**
 * E agora o grande algorítitmo
 */
char *encryptDecrypt(char input[], char *output)
{
	int i;
	char *c = output;

	for(i = 0;i&amp;lt;strlen(input);i++)
	{
		*c++ = (input[i] ^ key[i]);
	}
	*c++ = '';

	return output;
}</pre>
<p>Note que, como falei, o Xor possui a propriedade de reversibilidade, portanto podemos usar a mesma função para encriptar e desencriptar.</p>
<p>Mas esse foi o esquenta, agora vamos ver o RC4 de perto.</p>
<h3>RC4</h3>
<p>RC4 ou ARC4 utiliza o modelo de <a class="link" title="Vernam Cipher" href="http://en.wikipedia.org/wiki/Vernam_cipher">Vernam Cipher</a>. Esse modelo é hoje caracterizado como um stream cipher, criptografia de fluxo. Este modelo é baseado numa chave simétrica, conhecida por ambos os lados do canal de comunicação. Essa chave é passada para um gerador de números pseudo aleatório <a class="link" title="PRNG" href="http://en.wikipedia.org/wiki/PRNG">(PRNG)</a> que irá gerar uma outra chave que posteriormente irá cifrar a mensagem.</p>
<p>O algoritmo do RC4 pode ser dividido em duas partes:<br />
<b>Key-Scheduling Algorithm  &#8211; KSA</b> e<br />
<b>Pseudo-Random generation algorithm &#8211; PRGA</b></p>
<h4>KSA</h4>
<p>Essa parte do algoritmo, como todos os algoritmos de criptografia, é muito fácil rsrs, somente inicializamos um array de estado S e realizamos diversas permutações baseando-se no array da chave secreta.<br />
Que permutação é essa?<br />
Vamos por partes, primeiro prenchemos um array unidimensional S de tamanho 256 com quaisquer valores. Oficialmente ele é preenchido de 0..255.</p>
<pre class="brush: php;">
/**
 * Language: PHP
 */
$S = array();
for($i=0;$i&amp;lt;256;i++)
    $S[$i] = $i;
</pre>
<p>Tendo uma chave $key prenchemos um outro array $K com essa chave:</p>
<pre class="brush: php;">
$key = array(
    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
);

$K = array();
for($i=0;$i&amp;lt;256;$i++)
      $K[$i] = ($key[$i % count($key)]);
</pre>
<p>Reparem que a atribuição é modular, isso para preencher o array K com a chave mesmo se ela for menor que 256, evitando o estouro do buffer da variavel $key.<br />
Agora a permutação inicial, o importante do KSA.<br />
Os passos do algoritmo são os seguintes:<br />
1 &#8211; Inicializa uma variável ($j) com 0;<br />
2 &#8211; Inicia-se um loop for de 0 à 255;<br />
3 &#8211; Para cada iteração do loop somamos à $j seu próprio valor.<br />
4 &#8211; Para cada iteração do loop somamos à $j o valor do indice atual de S, ou seja $S[$i].<br />
5 &#8211; Para cada iteração do loop somamos à $j o valor do indice atual de K, ou seja $K[$i].<br />
6 &#8211; Aplicamos uma operação modular 256 à $j. [ $j (mod 256) ]<br />
7 &#8211; Invertemos os valores de $S[$i] e $S[$j].</p>
<p>Pronto. Esse é o KSA do RC4. Serve somente para embaralhar o array de estado S com a chave K. Este algoritmo como demonstrado acima não é um padrão e diversas outras criptografias o implementam diferente realizando funções diferentes. Por exemplo, em <a href="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm" class="link">TEA</a> o KSA simplesmente divide a chave de 128 bits em quatro arrays de 32 bits, em DES ele divide uma chave de 56 em duas de 28 bits, etc.<br />
Vamos ao código:</p>
<pre class="brush: php;">
$j = 0;
for($i=0; $i&amp;lt;256; $i++)
{
     $j = ($j + $S[$i] + $K[$i]) % 256;
     swap($S[$i], $S[$j]);
}
</pre>
<p>É só isso mesmo&#8230;<br />
Note que os passos 3,4,5 e 6 foram feitos na mesma linha. Na última linha do for chamamos a função swap. E mais uma vez o Xor, a função swap também é um algoritmo, mais conhecido como <a href="http://pt.wikipedia.org/wiki/Algoritmo_Xor_Swap" class="link">Xor Swap</a>. Ele simplesmente consegue trocar os valores de duas variáveis sem necessitar de armazenamento temporário. A função é assim:</p>
<pre class="brush: php;">
function swap(&amp;amp;$n1, &amp;amp;$n2)
{
      $n1 = $n1 ^ $n2;
      $n2 = $n1 ^ $n2;
      $n1 = $n1 ^ $n2;
}

/**
  * Se não fosse o método acima, teríamos que fazer algo como:
  * $temp = $n1;
  * $n1 = $n2;
  * $n2 = $temp;
  */
</pre>
<p>Pronto. Esse foi o KSA.</p>
<h3>PRGA</h3>
<p>O gerador de números pseudo aleatórios é um algoritmo que irá iterar no array de estado S para gerar uma sequencia de números aproximadamente independente um do outro. O algoritmo do PRGA pode também trabalhar conjuntamente com a cifragem, ele permutando os valores e gerando o byte que será usado na cifragem (com Xor) na mensagem. Após todas as iterações teremos como saída um stream de bytes aleatórios de mesmo tamanho da mensagem que queremos cifrar (isso pode variar).<br />
Algorítmo:<br />
1 &#8211; Inicializamos duas varíaveis ($i e $j, por exemplo) com 0.<br />
2 &#8211; Iniciamos o loop de cifragem da mensagem.<br />
3 &#8211; Incrementamos em 1 o valor de $i e aplicamos o módulo 256.<br />
4 &#8211; Incrementamos o valor de $j com $S[$i] e aplicamos módulo 256.<br />
5 &#8211; Invertemos os valores de $S[$i] e $S[$j].<br />
6 &#8211; Armazenamos o valor de $S[($S[$i] + $S[$j]) % 256].</p>
<p>O passo 6 do algoritmo é o byte que será usado na cifragem. Vamos codar:</p>
<pre class="brush: php;">
$i = 0;
$j = 0;
$output = array();
for($t = 0; $t&amp;lt;count($message);$t++)
{
	$i = ($i + 1) % 256;
	$j = ($j + $S[$i]) % 256;
	swap($S[$i], $S[$j]);
	$output[$t] = $S[($S[$i] + $S[$j]) % 256];
}
</pre>
<p>Pronto, esse é o PRGA.</p>
<h4>Cifrando a mensagem</h4>
<p>Assim:</p>
<pre class="brush: php;">
$message = &quot;Hello World&quot;;
$cipher = array();
for($i=0;$i&amp;lt;strlen($message);$i++)
     $msg[$i] = ord($message{$i});
for($i=0;$i&amp;lt;count($msg);$i++)
     $cipher[$i] = $output[$i] ^ $msg[$i];
</pre>
<p>Fim. Algoritmo criado com sucesso. hehe<br />
Mas como dividi bem pra explicar tem muitas partes que poderiam ser otimizadas, por isso estou disponibilizando uma classe pronta para uso:</p>
<pre class="brush: php;">

class Orion_RC4
{
	/**
	 * Recomenda-se uma chave de pelo menos 128 bits
	 * RC4 com chave menor que 40 bits são facilmente quebráveis.
	 * @var string 	- Chave usada para cifrar a mensagem
	 */
	private $_key = array();

	/**
	 * Array de estado // permutações
	 * @var array 	- Array de permutações
	 */
	private $S = array();

	/**
	 * Array com a chave de permutação
	 * @var array 	- Chave
	 */
	private $K = array();

	public function __construct($key = false)
	{
		if(!empty($key))
			$this-&amp;gt;setKey($key);
	}

	/**
	 * Ajusta a chave como uma string
	 * $rc4-&amp;gt;setKey('MinhaChaveSuperSecretaaaaaaaaa');
	 * @param $key 	string
	 * @return object
	 */
	public function setKey($key = '')
	{
		if(strlen($key) &amp;lt;= 6)
			throw new Exception(&quot;The key length is too small&quot;);

		$this-&amp;gt;_key = array();
		for($i=0;$i&amp;lt;strlen($key);$i++)
			$this-&amp;gt;_key[] = ord($key{$i});
		return $this;
	}

	/**
	 * Ajusta a chave a partir de um array hexadecimal
	 * $rc4-&amp;gt;setKeyHex(array(
	 *		0x75, 0x85, 0x65, 0x23, 0x25,
	 *		0x12, 0x14, 0x99, 0x55, x045
	 * ));
	 * @param $key 	array
	 * @return object
	 */
	public function setKeyHex(array $key)
	{
		$this-&amp;gt;_key = array();
		foreach($key as $k)
			$this-&amp;gt;_key[] = $k;
		return $this;
	}

	/**
	 * O algoritmo para encriptar e desencriptar é o mesmo
	 * mas é muito chato chamar o método encrypt para
	 * desencriptar algo né?
	 * Por isso tem um alias no método Orion_RC4::desencrypt()
	 * @param $message	string
	 * @param $key	string
	 */
	public function encrypt($message, $key = false)
	{
		$msg = array();
		if(is_string($message))
			for($i=0;$i&amp;lt;strlen($message);$i++)
				$msg[$i] = ord($message{$i});
		elseif(is_array($message))
			$msg = $message;
		else
			throw new Exception(&quot;Invalid type of message, should be a string&quot;);

		return implode('', array_map('chr', $this-&amp;gt;rawEncrypt($msg, $key)));
	}

        public function desencrypt($message, $key = false)
	{
		$this-&amp;gt;encrypt($message, $key);
	}

	/**
	 * Encripta a mensagem com o algoritmo ARCFOUR (RC4)
	 * Não há restrições quanto a base dos valores do array
	 * $message, pois ocorrerá uma permutação cíclica.
	 * Se os valores do array $message forem caracteres, será
	 * utilizado a representação numérica deles (ASCII).
	 * @param 	$message	array			- Mensagem de entrada
	 * @param 	$key 		string | array	- Key
	 * @return 	array
	 */
	public function rawEncrypt(array $message, $key = false)
	{
		if(!empty($key))
			if(is_string($key))
				$this-&amp;gt;setKey($key);
			elseif(is_array($key))
				$this-&amp;gt;setKeyHex($key);
			else
				throw new Exception(&quot;Invalid Type of key.&quot;);

		$this-&amp;gt;init();

		$i = 0;
		$j = 0;
		$output = array();
		for($t = 0; $t&amp;lt;count($message);$t++)
		{
			$i = ($i + 1) % 256;
			$j = ($j + $this-&amp;gt;S[$i]) % 256;
			self::swap($this-&amp;gt;S[$i], $this-&amp;gt;S[$j]);
			$output[$t] = $this-&amp;gt;S[($this-&amp;gt;S[$i] + $this-&amp;gt;S[$j]) % 256] ^ $message[$t];
		}

		return $output;
	}

	/**
	 * Inicializa o algoritmo
	 * Key Scheduling Algorithm - KSA
	 * @param void
	 * @return void
	 */
	private function init()
	{
		/**
		 * KSA
		 * Inicializa o array a ser permutado
		 */
		$this-&amp;gt;S = array(
	0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
	16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
	32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
	48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
	64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
	80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
	96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,
	112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
	128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
	144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
	160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
	176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
	192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
	208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
	224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,
	240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
	);
		if(count($this-&amp;gt;_key) == 0)
                throw new Exception(&quot;Deve ajustar a chave antes de encriptar.&quot;);
		for($i=0;$i &amp;lt; 256;$i++)
			/**
			 * Preenche o array K com a chave
			 */
			$this-&amp;gt;K[$i] = $this-&amp;gt;_key[$i % count($this-&amp;gt;_key)];

		/**
		 * Permutação inicial
		 */
		$j = 0;
		for($i=0; $i&amp;lt;256; $i++)
		{
			$j = ($j + $this-&amp;gt;S[$i] + $this-&amp;gt;K[$i]) % 256;
			self::swap($this-&amp;gt;S[$i], $this-&amp;gt;S[$j]);
		}
	}

	/**
	 * Xor Swap. Trocar valores de duas varíaveis sem usar
	 * armazenamento temporário.
	 */
	public static function swap(&amp;amp;$n1, &amp;amp;$n2)
	{
		if(!is_int($n1) &amp;amp;&amp;amp; !is_int($n2))
			throw new Exception('ERROR: invalid type.');
		$n1 = $n1 ^ $n2;
		$n2 = $n1 ^ $n2;
		$n1 = $n1 ^ $n2;

		return;
	}
}
</pre>
<p>Para testar simplesmente faça:</p>
<pre class="brush:php">
$rc4 = new Orion_RC4("S14YYeQ1FA732hEe3uT31C4fSiXHrQ98");
$cipher = $rc4-&gt;encrypt("Orion Framework");
print $cipher."&lt;br&gt;";
print $rc4-&gt;desencrypt($cipher);
/**
 * Isso irá imprimir
 * x¶¼%-º¥ˆ¼$Xž­
 * Orion Framework
 */
</pre>
<p>Bom é isso, você pode copiar a classe <a href="http://blog.tiagomoura-design.com.br/tutoriais/Criptografia/Simetrica/rc4.txt" class="link" title="RC4 em PHP">aqui</a> ou <a href="http://code.google.com/p/orion-framework/source/browse/trunk/Orion/Security/Crypt/RC4.php" class="link" title="RC4 no Orion">aqui</a>.<br />
O RC4 está no coração dos algoritmos mais modernos de criptografia e por ser bem simples é uma ótima forma de estudar essa área da computação que as vezes nos parece tão obscura.</p>
<p>Até mais.<br />
 <img src='http://s1.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/159/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=159&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/10/24/implementando-rc4-em-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>Desenvolvimento ágil com ObjectModels</title>
		<link>http://universemachine.wordpress.com/2009/10/10/desenvolvimento-agil-com-objectmodels/</link>
		<comments>http://universemachine.wordpress.com/2009/10/10/desenvolvimento-agil-com-objectmodels/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 08:41:44 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[Orion Framework]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[models]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[objectmodels]]></category>
		<category><![CDATA[orion]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=126</guid>
		<description><![CDATA[O <a class="link" title="Orion Framework" href="http://code.google.com/p/orion-framework" target="_blank">Orion</a> ainda não tem uma versão estável, mas vou falar de um recurso interessante que, na verdade vêm dos ORM's como o <a title="Doctrine" class="link" href="http://www.doctrine-project.org" target="_blank">Doctrine</a>, mas que tem um papel importante na linha de comando do Orion.

<h3>ObjectModels</h3>
<blockquote>
<i>Isto não tem relaçao com os padrões de Modelos de Objetos, como, Java Object Model ou Document Object Model, trata-se de uma nomenclatura do framework Orion.</i>
</blockquote>

<h2>Introdução</h2>
Quando se utiliza a técnica de desenvolvimento ORM (Mapeamento Objeto-Relacional), cada tabela do banco de dados é representada por uma classe (Model) e os campos da tabela são objetos. Assim, o banco de dados, juntamente com todo o projeto, possuem o paradigma orientado à objetos. Os objetos do banco de dados, portanto, possuem todas as caracteristicas dos objetos nativos da linguagem.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=126&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>O <a class="link" title="Orion Framework" href="http://code.google.com/p/orion-framework" target="_blank">Orion</a> ainda não tem uma versão estável, mas vou falar de um recurso interessante que, na verdade vêm dos ORM&#8217;s como o <a title="Doctrine" class="link" href="http://www.doctrine-project.org" target="_blank">Doctrine</a>, mas que tem um papel importante na linha de comando do Orion.</p>
<h3>ObjectModels</h3>
<blockquote><p>
<i>Isto não tem relaçao com os padrões de Modelos de Objetos, como, Java Object Model ou Document Object Model, trata-se de uma nomenclatura do framework Orion.</i>
</p></blockquote>
<h2>Introdução</h2>
<p>Quando se utiliza a técnica de desenvolvimento ORM (Mapeamento Objeto-Relacional), cada tabela do banco de dados é representada por uma classe (Model) e os campos da tabela são objetos. Assim, o banco de dados, juntamente com todo o projeto, possuem o paradigma orientado à objetos. Os objetos do banco de dados, portanto, possuem todas as caracteristicas dos objetos nativos da linguagem.</p>
<p>ObjectModels para o Orion Framework são objetos abstratos, que podem ser herdados por muitos outros objetos mais específicos e reduzindo muito a programação e manutenção dos Models.<br />
<span id="more-126"></span></p>
<h2>Detalhes</h2>
<p>Imagine que precisamos criar um simples banco de dados para uma escola. Esse banco de dados será formado, entre outras, pelas tabelas &#8220;Student&#8221; e &#8220;Teacher&#8221;.</p>
<p>Veja a estrutura das tabelas Student e Teacher: O Orion utiliza o Doctrine ORM, esse ORM utiliza arquivos YAML para geração do schema do banco de dados :</p>
<pre class="brush:python">
# Models/Student.php
Student:
  columns:
    name:
      type: string(255)
      notnull: true
   nr_register:
      type: string(14)
      notnull: true
   course_id:
      type: integer
      notnull: true
    birth:
      type: date
      notnull: true
    address:
      type: string(255)
      notnull: true
    district:
      type: string(255)
    nr:
      type: integer
    city_id:
      type: integer
    state_id:
      type: integer
    country_id:
      type: integer

# Models/Teacher.php
Teacher:
  columns:
    name:
      type: string(255)
      notnull: true
    birth:
      type: date
      notnull: true
    language_id:
      type: integer
    address:
      type: string(255)
      notnull: true
    district:
      type: string(255)
      notnull: true
    nr:
      type: integer
    city_id:
      type: integer
    state_id:
      type: integer
    country_id:
      type: integer
</pre>
<p>Como estamos falando de objetos, podemos ver que o objeto &#8220;Student&#8221; e o objeto &#8220;Teacher&#8221; possuem muitas semelhanças e é nessas semelhanças que se baseia esse recurso do Orion. Objetos são estruturas hierárquicas, que respeitam propriedades como Herança, Encapsulamento, etc. Esta hierárquia pode ser vista nas tabelas acima, onde as propriedades (campos) &#8220;name, birth, address, district, nr, city_id, state_id, country_id&#8221; são comuns aos dois objetos. Isso mostra que esses dois objetos herdam propriedades de um outro objeto abstrato, que chamaremos de &#8220;PersonTemplate&#8221;. <strong>O sufixo Template é necessário para criar objetos abstratos no Doctrine</strong>. Veja as propriedades deste objeto:</p>
<pre class="brush:python">
# Models/PersonTemplate.php
PersonTemplate:
  columns:
    name:
      type: integer
    birth:
      type: date
    address:
      type: string(255)
    district:
      type: string(255)
    nr:
      type: string(255)
    city_id:
      type: integer
    state_id:
      type: integer
    country_id:
      type: integer
</pre>
<p>Então os objetos Student e Teacher herdam as propriedades de PersonTemplate. Assim podemos notar uma significativa redução de código:</p>
<pre class="brush:python">
# Models/Student.php
Student:
  actAs: [PersonTemplate]
  columns:
    nr_register:
      type: string(14)
      notnull: true
    course_id:
      type: integer
      notnull: true
# Models/Teacher.php
Teacher:
  actAs: [PersonTemplate]
  columns:
    language_id:
      type: integer
</pre>
<p>Pronto. Agora para todos os outros objetos necessários ao projeto, como &#8220;Clients&#8221;, &#8220;Functionary&#8221;, etc, podem simplesmente herdam as propriedades do objeto abstrato PersonTemplate para receberem automáticamente as propriedades de uma pessoa.</p>
<p>Quanto mais estruturado estiver o projeto, mais organizado e rápido será o desenvolvimento. Ainda no exemplo anterior, o objeto abstrato PersonTemplate possue as propriedades &#8220;address, nr, city_id, state_id, country_id&#8221; que também podem estar presentes num outro objeto, &#8220;Company&#8221; por exemplo, assim, poderíamos abstrair essas propriedades e criar um novo objeto abstrato AddressTemplate.</p>
<p>Assim teríamos:</p>
<pre class="brush:python">
PersonTemplate:
  actAs: [AddressTemplate]
... _outras propriedades_
Company:
  actAs: [AddressTemplate]
... _outras propriedades_
</pre>
<p>O Orion Framework vai possuir muitos objetos abstratos para os mais variados projetos, bastando apenas extende-los em seus models.</p>
<p>Até mais. <img src='http://s2.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=126&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/10/10/desenvolvimento-agil-com-objectmodels/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
		<item>
		<title>Exemplo simples de uso do OpenCV</title>
		<link>http://universemachine.wordpress.com/2009/10/10/exemplo-simples-de-uso-do-opencv/</link>
		<comments>http://universemachine.wordpress.com/2009/10/10/exemplo-simples-de-uso-do-opencv/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 10:42:33 +0000</pubDate>
		<dc:creator>i4k</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[realidade virtual]]></category>
		<category><![CDATA[visao computacional]]></category>

		<guid isPermaLink="false">http://blog.tiagomoura-design.com.br/?p=145</guid>
		<description><![CDATA[/** * @author Tiago Natel de Moura * Software simples para visualização de cores com opencv * Se rodá-lo sobre o console ele imprime a cor atual no formato hexadecimal RGB */ #include &#60;stdio.h&#62; #include &#60;string.h&#62; #include &#60;opencv/cv.h&#62; #include &#60;opencv/highgui.h&#62; /** * Nome da janela */ char window[] = &#34;Cores&#34;; /** * Aqui ajustamos os [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=145&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<pre class="brush: cpp;">
/**
 * @author Tiago Natel de Moura
 * Software simples para visualização de cores com opencv
 * Se rodá-lo sobre o console ele imprime a cor atual no formato hexadecimal RGB
 */
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;opencv/cv.h&gt;
#include &lt;opencv/highgui.h&gt;

/**
 * Nome da janela
 */
char window[] = &quot;Cores&quot;;
 /**
  * Aqui ajustamos os valores iniciais das cores
  */
static int B = 100;
static int G = 100;
static int R = 100;

/**
 * No OpenCV uma imagem é um ponteiro para a estrutura IplImage
 */
IplImage* color = 0;

/**
 * Protótipos
 * update(int) atualiza a imagem com a nova cor ajustada
 * pintando(int) ajusta a nova cor
 */
void update(int);
IplImage* pintando(IplImage*,int,int,int);

int main(int argc, char *argv[])
{
        /**  Criamos a imagem  */
	color = cvCreateImage( cvSize(500,500), 8, 3);
        /** ajustamos com as cores iniciais */
	color = pintando(color, B,G,R);

        /** Cria a janela  */
	cvNamedWindow(window, CV_WINDOW_AUTOSIZE);

        /** Anexa a imagem na janela */
	cvShowImage(window, color);

        /** Cria três barras de rolagens para o azul (B), verde (G) e vermelho (R) */
	cvCreateTrackbar(&quot;BLUE&quot;, window, &amp;B, 255, update);
	cvCreateTrackbar(&quot;GREEN&quot;, window, &amp;G, 255,  update);
	cvCreateTrackbar(&quot;RED&quot;, window, &amp;R, 255, update);

	cvWaitKey(0);
	cvDestroyWindow(window);

	return 0;
}

void update(int pos)
{
	printf(&quot;Cor: %.2x%.2x%.2x\n&quot;,R,G,B);
	color = pintando(color, B, G, R);
	cvShowImage(window, color);
}

IplImage* pintando(IplImage* img, int B, int G, int R)
{
        /** Pega as propriedades da imagem */
	int height 	= img-&gt;height;
	int width 	= img-&gt;width;
	int step 	= img-&gt;widthStep;
	uchar* data = (uchar*) img-&gt;imageData;
	int channels= img-&gt;nChannels;

        /**
          * Aqui percorremos todos os pixels da imagem e ajustamos
          * a nova cor
          */
	for(int y=0; y &lt; height; y++)
		for(int x=0;x &lt; width; x++)
		{
			data[y*step + x*channels] 	= B;
			data[y*step + x*channels+1]	= G;
			data[y*step + x*channels+2]	= R;
		}

	return img;
}
</pre>
<p>A quem interessar pode fazer o download <a href="http://bugsec.googlecode.com/files/color_opencv.cpp" class="link">aqui</a>.</p>
<p>Até mais.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/universemachine.wordpress.com/145/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/universemachine.wordpress.com/145/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/universemachine.wordpress.com/145/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=universemachine.wordpress.com&amp;blog=10838994&amp;post=145&amp;subd=universemachine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://universemachine.wordpress.com/2009/10/10/exemplo-simples-de-uso-do-opencv/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dd2b97afb7f60149e78bcc6dafbd3ff3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">universemachine</media:title>
		</media:content>
	</item>
	</channel>
</rss>
