<?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>Meninão</title>
	<atom:link href="http://caelgomes.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://caelgomes.wordpress.com</link>
	<description>powered by Cael</description>
	<lastBuildDate>Sun, 15 Feb 2009 04:28:13 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='caelgomes.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/9f3795f153addcb8e141a249373d2007?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Meninão</title>
		<link>http://caelgomes.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://caelgomes.wordpress.com/osd.xml" title="Meninão" />
	<atom:link rel='hub' href='http://caelgomes.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Threads em C usando win32api</title>
		<link>http://caelgomes.wordpress.com/2009/02/15/threads-em-c-usando-win32api/</link>
		<comments>http://caelgomes.wordpress.com/2009/02/15/threads-em-c-usando-win32api/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 04:13:25 +0000</pubDate>
		<dc:creator>caelgomes</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://caelgomes.wordpress.com/?p=34</guid>
		<description><![CDATA[Hi there! Se tinha uma coisa que me segurava quando estava começando a programar era subdividir meu programa. Sério. Até que isso se tornou insuportável quando tive que fazer um trabalho na facu, e escolhi usar OpenGL. DIgo, o usuário precisava digitar o que ele queria desenhar, entrar com os valores das medidas, e eu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=34&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Hi there!</p>
<p>Se tinha uma coisa que me segurava quando estava começando a programar era subdividir meu programa. Sério. Até que isso se tornou insuportável quando tive que fazer um trabalho na facu, e escolhi usar <a href="http://pt.wikipedia.org/wiki/OpenGL" target="_blank">OpenGL</a>. DIgo, o usuário precisava digitar o que ele queria desenhar, entrar com os valores das medidas, e eu precisava desenhar. Oh Gosh! Minha saída foi usar <em>threads</em>, no que foi meu primeiro contado com Win32 API.</p>
<p>Sim, o trabalho ficou muito bom. Aliás, foi um puta trabalho em conjunto, meu, do <a href="http://twitter.com/vsportella" target="_blank">Ports</a> e do <a href="http://twitter.com/TRBaldim">Baldim</a>.</p>
<p>Tinha feito na época um .c todo comentado, tim-tim por tim-tim, até para futuras consultas. Pois bem, segue abaixo:</p>
<p><pre class="brush: cpp;">

 /*
    só para constar:
        DWORD = double word;
    ora, WORD é um tipo do tamanho básico da sua máquina;
    assim sendo, se vc tá programando para uma máquina x86 (32 bits), uma WORD terá 32 bits [4 bytes]
    e adivinha? uma variável do tipo DWORD terá o dobro!! (nesse caso, 64 bits, ou 8bytes)

    Agora, se vc é fodão e tá programando para uma plataforma 64 bits, então vc pega tudo oq eu falei acima,
    e multiplica por 2 !
    =)

    ooooutra coisa
        LPVOID = void *

    simples assim.
    */

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;
#define WIN32_LEAN_AND_MEAN //para deixar a importação da windows.h mais 'light'
#include &lt;windows.h&gt; //todas funções aqui listadas estão no windows.h.
using namespace std;

DWORD WINAPI Thread(LPVOID);
/*
    Defini a função que será minha thread. O nome Thread não é reservado, ou seja, se eu quisesse que minha
    thread chamasse pnc, faria:
        DWORD WINAPI pnc(LPVOID);
    sem problemas.

    Como vc pode ver, a API do Windows utiliza ponteiros para controlar uma Thread. Por isso que vc passa um ponteiro na
    chamada. Segue abaixo a definição oficial:

    DWORD (WINAPI *LPTHREAD_START_ROUTINE)(LPVOID)

*/

int main(int argc, char *argv[])
{
    DWORD id_da_thread;
    HANDLE manipulador_thread = CreateThread(0,0,Thread,0,CREATE_SUSPENDED,&amp;id_da_thread); //retorna 0 se não criou, e o handle se criou
    int estado;
/*

    HANDLE WINAPI CreateThread(
    LPSECURITY_ATTRIBUTES ThreadAtt,
    SIZE_T Tamanho_da_Stack,
    LPTHREAD_START_ROUTINE sua_thread,
    LPVOID argumento,
    DWORD flags,
    LPDWORD id_da_sua_thread
    );  

    ThreadAtt:
    ponteiro para uma estrutura do tipo LPSECURITY_ATTRIBUTES que contém atributos de segurança da Thread.
    Se passado como ZERO, a Thread é criada com atributos padrões.

    Tamanho_da_Stack:
    tamanho que vc precisarah inicialmente da stack em bytes. Se ZERO, o sistema 'define' um tamanho padrão.
    Só é bom vc mexer nisso se vc souber oq vc tá fazendo...

    Argumento:
    um argumento opcional para a sua thread.

    Flags:
    Esse é importante: define o comportamento da Thread logo após ser criada.
    Vc pergunta: 'Mas como assim??'
    Eu digo:
        Se vc coloca um zero nisso, sua thread será 'executada automaticamente' ao ser criada...
        Ou seja, vai começar a executar o código que vc colocou lá, 'sozinha'.
        Agora, se vc colocar &quot;CREATE_SUSPENDED&quot; (sem as aspas, por favor), acontecerá o seguinte: a thread será criada,
        mas ela estará no 'pause', ou seja, ele existirá lá, bonitinha, e esperará vc dizer: 'rode filha, rode&quot;.
        Vc diz: &quot;Meu Deus, como eu faço pra dizer 'rode filha, rode' ???
        Fácil. Graças a Deus tem uma função chamada ResumeThread(HANDLE manipulador_thread) que faz isso pra vc!
        Ficou com dúvidas sobre o ResumeThread()? Tem a sintaxe lá embaixo..!!

    ThreadId:
    ponteiro (sim, ponteiro.. por isso que usei o '&amp;') para uma variável do tipo DWORD que irá armazenar a identificação
    da Thread. Se ZERO, o argumento é ignorado. 

    A função CreateThread() retorna um Handle para a thread criada, do contrário, é retornado um Handle Nulo, ou seja, ZERO.
*/

    if ( manipulador_thread == 0 ){ // não criou, manipulador é zero
        cout &lt;&lt; &quot;Não pude criar a thread&quot; &lt;&lt; endl;
        return 0;
    }

    cout &lt;&lt; &quot;Legal, criei a thread, vou exibir uma janela da sua main..&quot; &lt;&lt; endl;
    system(&quot;pause&quot;);
    MessageBox(0,&quot;MENSAGEM DA MAIN&quot;,&quot;Minha primeira Thread&quot;,0);

    cout &lt;&lt; &quot;Ok, agora vou \&quot;resumir\&quot; a thread...&quot; &lt;&lt; endl ;
    cout &lt;&lt; &quot;Fica esperto que assim que eu resumir, abrira um messagebox... &quot; &lt;&lt; endl;
    system(&quot;pause&quot;);

    if ( (ResumeThread(manipulador_thread)) == 0 ){
        cout &lt;&lt; &quot;Não consegui resumir a thread!!&quot; &lt;&lt; endl;
        exit(-1);
    }
    cout &lt;&lt; &quot;Thread resumida com sucesso...&quot; &lt;&lt; endl;

    cout &lt;&lt; &quot;Bye!&quot; &lt;&lt; endl;

    WaitForSingleObject(manipulador_thread, INFINITE);
/*
    DWORD WINAPI WaitForSingleObject(HANDLE manipulador_thread,DWORD tempo);

    manipulador_thread:
    manipulador da Thread;

    tempo:
    tempo em milisegundos que o programa deve aguardar.
    Caso a constante &quot;INFINITE&quot; seja especificada, o programa aguarda o tempo necessário até que a Thread seja finalizada,
    retornando um valor.

    é como se fosse um timer..
    ele vê: &quot;Hum, já se passaram XXX milisegundos.. hora de 'matar' a thread..!&quot;
*/

/*

    Então temos algumas funções importantes:

    *********************************
    BOOL  TerminateThread ( HANDLE seu_manipulador_thread, DWORD codigo_saida );

    OK, aqui é fácil, certo?
    vc vai terminar a Thread cuja seu manipulador manipula (foda-se a redundância), e vc também saberá
    se vc obteve sucesso no que vc tava rodando nela.. (basicamente é o return que vc implementou nela.)

    foda né?
    mas não é só isso...
    se vc reparou, essa função tem um retorno booleano! Se vc receber 0 é pq vc NÃO conseguiu 'matar' a thread.
    Bom, isso significa que vc se fodeu? Provavelmente sim, mas não necessariamente.
    MAS, se vc receber um 0 (false) é pq deu tudo certo (torça por isso...+) ).
    *********************************

    ****************
    CloseHandle(th);

    Esse acho que não precisa dizer mais nada, a não ser que é um pseudo-free().
    Lembre-se: chame-a por último... seja esperto.
    ****************
    */

    system(&quot;pause&quot;);
    TerminateThread(manipulador_thread,0);
    CloseHandle(manipulador_thread);
    return 0;

}
/* FUNCOES IMPORTANTES:

**************
    DWORD WINAPI SuspendThread(HANDLE manipulador_thread);

     maipulador_handle:
            manipulador da thread que se deseja pausar;

        A função retorna 1 se a thread especificada for interrompida corretamente,
        ou retorna 0, se o processo falhar.
*************

*************
DWORD WINAPI ResumeThread(HANDLE manipulador_thread);

     manipulador_thread:
            manipulador da thread que se deseja resumir;

    A função retorna o valor 1 se a thread for resumida corretamente,
    ou retorna 0, se falhar.
**************

*/

//aqui começa minha thread

DWORD WINAPI Thread(LPVOID valor)
{
    MessageBox(0,&quot;Mensagem da Thread&quot;,&quot;Aprendendo a mexer com Thread&quot;,0);
    return 0;
}

</pre></p>
<p>Espero que isso te ajude. É realmente muito simples&#8230; você cria, cria uma thread &#8211; mandando como parâmetro sua função, e então só controla seu funcionamento &#8211; pausa, suspende, continua, mata, etc&#8230;</p>
<p>Esse post é para aqueles que acham que foi o &#8220;Java que inventou as threads&#8221;. Tsc tsc&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/caelgomes.wordpress.com/34/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/caelgomes.wordpress.com/34/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/caelgomes.wordpress.com/34/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=34&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://caelgomes.wordpress.com/2009/02/15/threads-em-c-usando-win32api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">caelgomes</media:title>
		</media:content>
	</item>
		<item>
		<title>Netooth</title>
		<link>http://caelgomes.wordpress.com/2009/02/13/netooth/</link>
		<comments>http://caelgomes.wordpress.com/2009/02/13/netooth/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 17:16:42 +0000</pubDate>
		<dc:creator>caelgomes</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://caelgomes.wordpress.com/?p=31</guid>
		<description><![CDATA[Olá a todos, After a long time ago, estou de volta. O post não é inédito, mas é legal até, por isso está sendo postado aqui. Vou apenas dar uma limpada, porque é pertinente do ser humano sempre mudar, evoluir. &#8220;Como esse é meu post inicial, a boa conduta manda que seja postado algo legal. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=31&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Olá a todos,</p>
<p>After a long time ago, estou de volta. O <a href="http://blogs.myspace.com/index.cfm?fuseaction=blog.view&amp;friendID=427817961&amp;blogID=447714420" target="_blank">post não é inédito</a>, mas é legal até, por isso está sendo postado aqui. Vou apenas dar uma limpada, porque é pertinente do ser humano sempre mudar, evoluir.<br />
&#8220;Como esse é meu post inicial, a boa conduta manda que seja postado algo legal. Então assim o farei (ignorando que algo &#8220;legal&#8221; seja relativo). Hoje perdi duas horas e meia da minha vida para tentar usar minha banda larga (mero Speedy® de 1 Mb &#8211; pra não dizer outra coisa&#8230;) no meu notebook, usando uma rede bluetooth® . Levando em conta que hoje em dia, literalmente, o tempo é escasso, pode-se dizer que apanhei (ah sim, a palavra escasso se torna ainda mais impactante se você considerar que nessa próxima semana terei prova de Análise Numérica II e trabalho de Engenharia de Software &#8211; trabalho esse que faço nesse exato momento, em Alttab), mas valeu a pena. Vejamos o domínio do problema:</p>
<p>Preciso compartilhar meu Speedy® (ahh, chega, não vou usar mais o marca registrada) &#8211; que de speedy não tem nada &#8211; para também poder acessar a rede-mãe (vulva Internet) no meu note. Ahh, claro, mas não tenho roteador wifi. O meu Speedy está diretamente ligado ao meu PC, que também está equipado com um nobre adaptador bluetooth do gray market (lê-se Santa Ifigênia) &#8211; de vinte e cinco pilas. Meu note tem um bluetooth integrado da Dell (é divulgado como masterblaster, mas whatever, ainda é só um bluetooth).</p>
<p>OS note: Vista Basic &#8211; não me xinguem, tá no dual boot.</p>
<p>OS PC: WinXP SP2</p>
<p>Vou fazer um shortcut, porque se eu for contar tudo o que fiz, vou fazer você também perder 2,5h.</p>
<p>O primeiro que se tem a fazer é parear os dois dispositivos.. Easy easy, but ele não queria parear fácil. Descobri que se eu parear do Vista para o XP é mais sussa &#8211; de primeira.</p>
<p>Depois tem-se que listar e selecionar os serviços que o bluetooth do PC dispõe. Seleciona todos, evite trabalho futuro <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Vai no PC, compartilha seu Speedy (sabe aquela conexão de Banda Larga, que você conectava como internet@speedy.com.br, e que agora não mais [deve ter feito sua continha no Terra-like] ?). Botão direito, última aba, todos checkbox. Importante: Resete a merda do modem. Perdi 40 minutos para descobrir que sem isso, as alterações não vingam. Ótimo, já deu um grande avanço.</p>
<p>Agora faltam duas coisas importantes:</p>
<p>i. Configurar seu serviço bluetooth de Rede no WinXP (vamos chamá-lo de Host, já que a Banda Larga está nele). Isso pode variar da versão do Software usado para seu bluetooth adapter. Usa-se comumente WIDCOM. Ok, liste seus serviços disponíveis, escolha PAN Bluetooth, diga que outros dispositivos se conectarão a Internet utilizando essa rede, e só aplicarok.</p>
<p>Depois disso, conecte (a+a) sua Banda Larga.</p>
<p>ii. Client side (Vista, no meu caso): &#8220;Configurar uma conexão ou uma rede&#8221; , &#8220;Conectar a uma PAN Bluetooth&#8221;. Ele vai te listar os Pontos de Acesso (deverá aparecer sua PAN configurada no WinXP). Conecte-se a ela (</p>
<p>i. Seu host dirá que alguém está tentando se conectar a sua rede, permita.</p>
<p>ii. Sua rede será efetivamente criada. [Definirá um IP address, etc]. Estará pronta quando, obviamente, aparecer: Conectado a .. , velocidade 700kbps [sim, estamos limitados a essa velocidade...].</p>
<p>iii. Finalmente seu client se mostrará conectado. Inicialmente, dirá ter disponível apenas &#8220;Acesso Local&#8221;, mas não demorará nada para ele reconhecer que tem acesso a Internet nesse rede!! <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pronto, cá estamos&#8230;</p>
<p>Usando meu laptop no quarto, enquanto minha irmã baixa o Dr. House dela na sala. Lembre-se:</p>
<p>i. Um dispositivo bluetooth pode conectar-se a outros sete. Pode parecer pouco. Mas só parece. Pesquise por <a href="http://en.wikipedia.org/wiki/Piconet" target="_blank">piconet</a>.</p>
<p>ii. Ainda tenho minha rede limitada a 700 kbps. Isso porque meu adaptador que uso no PC é da versão 1.2. Mas tudo bem, já que meu Speedy é de 1 Mb. Se você mora em São Paulo, e fora da &#8220;área de cobertura&#8221; do Vírtua, deve me entender que, em medidas speedyanas, Banda Larga de 1 Mb == 2 Mb == 4 Mb. Isso porque a QoS da Telefônica é péssimo, vergonhoso. Então, embora você ganhe alguns kbps de down, ainda assim é patético.</p>
<p>Fazer o quê? Não tem cão, caça com o gato. Não tem roteador wifi, navega com NAP Bluetooth + Shared Broadband.&#8221;</p>
<p><a href="http://img528.imageshack.us/my.php?image=naphe3.jpg" target="_blank"><img src="http://img528.imageshack.us/img528/8425/naphe3.th.jpg" border="0" alt="" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/caelgomes.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/caelgomes.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/caelgomes.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=31&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://caelgomes.wordpress.com/2009/02/13/netooth/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">caelgomes</media:title>
		</media:content>

		<media:content url="http://img528.imageshack.us/img528/8425/naphe3.th.jpg" medium="image" />
	</item>
		<item>
		<title>Making it easy! Executando query utilizando valores ascii.</title>
		<link>http://caelgomes.wordpress.com/2009/01/03/makingiteasy-executando-query-utilizando-valores-ascii/</link>
		<comments>http://caelgomes.wordpress.com/2009/01/03/makingiteasy-executando-query-utilizando-valores-ascii/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 02:47:11 +0000</pubDate>
		<dc:creator>caelgomes</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Injection]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[#fúteis]]></category>

		<guid isPermaLink="false">http://caelgomes.wordpress.com/?p=22</guid>
		<description><![CDATA[Feliz &#8217;09. Sim, simples assim. Estava tentando dominar o mundo exercitando minhas habilidades em SQL injection, té que me intriguei com uma tentativa de [pífia] evitar esse atentado-violento-ao-pudor-sem-pudor. Enfim, algo que developers WEB deveriam estar skinhead de saber (ou não),  existe algo chamado magic quotes, que de tão ineficiente, foi retirado do PHP 6.0 or [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=22&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Feliz &#8217;09. Sim, simples assim.</p>
<p>Estava <span style="text-decoration:line-through;">tentando dominar o mundo</span> exercitando minhas habilidades em SQL injection, té que me intriguei com uma tentativa de [<em>pífia</em>] evitar esse atentado-violento-ao-pudor-sem-pudor. Enfim, algo que developers WEB deveriam estar <em>skinhead</em> de saber (ou não),  existe algo chamado <a href="http://br.php.net/magic_quotes">magic quotes</a>, que de tão ineficiente, foi retirado do PHP 6.0 or newer.</p>
<p>Se trata de adicionar uma barra [\] antes do ['] (vulgo apóstrofe).</p>
<p>Exemplo</p>
<pre><strong>'banana nanic%'
</strong>ficaria
\'banana nanic%\'</pre>
<p>Bom, isso é um problema. Não podemos mais personalizar nossa query! (Notem o eufenismo sapeca).</p>
<p>Pois é, mas se pode rodar query também utilizando o <a href="http://pt.wikipedia.org/wiki/ASCII">valor decimal ascii</a> do(s) caractere(s) (sim, pode-se também utilizar hexa :B ).</p>
<p>Isso significa que algo do gênero:</p>
<p><strong>select * from cadastro LIMIT 1,1</strong></p>
<p>ficaria:</p>
<p><strong>concat(<br />
char(115),char(101),char(108),char(101),char(99),char(116),char(32),<br />
char(42),char(32),char(102),char(114),char(111),char(109),char(32),<br />
char(99),char(97),char(100),char(97),char(115),char(116),char(114),<br />
char(111),char(32),char(108),char(105),char(109),char(105),char(116),<br />
char(32),char(49),char(44),char(49))</strong></p>
<p>Pegou?</p>
<p>Assim sendo, segue código em C que te faz essa conversão:</p>
<p><pre class="brush: cpp;">
/* 
TODO: backspace treatment
*/
#define MAX 100 //define tamanho máximo de caracteres de entrada

int main (void){
    char c;
    int i, *vetor;
    int efetivo=0; //tamanho real da query

    vetor = (int *) malloc (sizeof(int) * MAX);
    for (i=0; i&lt;MAX; ++i){
         *(vetor+i) = getch();
         //pra debug
         printf(&quot;%c&quot;,vetor[i]);
         if ( *(vetor+i) == 13 ) //vai lendo até [ENTER]
            break;
         efetivo++;
    }
    printf(&quot;concat(&quot;);
    for (i=0; i&lt;efetivo; ++i){
        if (i+1 == efetivo){
            printf(&quot;char(%d))&quot;,vetor[i]);
            break;
        }
        printf(&quot;char(%d),&quot;,vetor[i]);
    }
    getchar();     
    return 0;
}
</pre><br />
Get funny.</p>
<p>Entenda sobre essa e outras técnicas mais efetivas <a href="http://wagnerelias.com/2008/12/01/sql-injection-e-as-funcoes-de-escape-no-php/">aqui.</a></p>
<p>Por hoje é só, fiquem com Deus, e até amanhã.</p>
<pre></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/caelgomes.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/caelgomes.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/caelgomes.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=22&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://caelgomes.wordpress.com/2009/01/03/makingiteasy-executando-query-utilizando-valores-ascii/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">caelgomes</media:title>
		</media:content>
	</item>
		<item>
		<title>Twitter-who?</title>
		<link>http://caelgomes.wordpress.com/2008/12/26/twitter-who/</link>
		<comments>http://caelgomes.wordpress.com/2008/12/26/twitter-who/#comments</comments>
		<pubDate>Fri, 26 Dec 2008 15:43:33 +0000</pubDate>
		<dc:creator>caelgomes</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Orkut]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://caelgomes.wordpress.com/?p=3</guid>
		<description><![CDATA[Whoa! Todos sabemos o que é o Twitter, e sim, gostamos pra caramba dele! Não tem a poluição gentalha gente feia inconveniência costumeira do Orkut, e só por esse fato já deveria ser adorado. Enfim, isso é opinião, e a minha &#8211; e como você está no meu blog, por favor, respeite. Senta que lá [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=3&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Whoa!</p>
<p>Todos sabemos o que é o <a href="http://twitter.com/" target="_blank">Twitter</a>, e sim, gostamos pra caramba dele! Não tem a <span style="text-decoration:line-through;"><span>poluição</span> <span>gentalha</span> <span>gente feia</span></span> inconveniência costumeira do Orkut, e só por esse fato já deveria ser adorado. Enfim, isso é opinião, e a minha &#8211; e como você está no meu blog, por favor, respeite.</p>
<p>Senta que lá vem a história: Há tempos que queria fazer uma integração C com Java. Bom, então surgiu uma grande oportunidade, uma vez que a biblioteca mais digna que acessa a biblioteca do Twitter que achei foi a <a href="http://www.winterwell.com/software/jtwitter.php">JTwitter</a>, que realmente é muito boa e fácil de usar. Enfim, já tinha feito, há algum tempo (em tempos remotos de Infra na Amdocs), um código em C++ que listava os processos que estavam rodando. (De certo modo, acho que é meio redundante a última frase, mas whatever)</p>
<p>Lá vai um resumo: Tranformei meu código em C++ numa dll e, utilizando um negócio bem porco (como Java, em geral), chamado JNI (<a href="http://en.wikipedia.org/wiki/Java_Native_Interface">Java Native Interface</a>), fiz a integração do meu código em Java &#8211; que também utilizava a biblioteca JTwitter. Fiz um enhancement tolo para que reconhecesse <a href="http://help.twitter.com/index.php?pg=kb.page&amp;id=15">mensagens enviadas diretamente</a> para mim no Twitter, assim minha gororoba auto interagia com o meu suposto amigo, respondendo-o se eu estava ou não rodando tal processo  no momento. Sabe, falando agora, parece-me uma idéia tão ridícula&#8230; Mas foda-se.</p>
<p>Ingredientes:</p>
<p>- <a href="http://msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx">Saber como</a> se acessa a API do WindowsX para listar processos. Tão ridículo que me dá comichões. Mas isso é assunto para outra hora.<br />
- <a href="http://www.cygwin.com/cygwin-ug-net/dll.html">Saber como</a> criar uma dll  &#8211; basicamente:</p>
<pre><em>gcc -shared -o minhadll.dll meuobjeto.o</em></pre>
<p>- <a href="http://forums.sun.com/thread.jspa?threadID=399184">Saber como</a> fazer a integração de C com Java.</p>
<p>Acho que o que vale explorar é esse último tópico. É facil &#8211; verdade &#8211; mas precisa de atenção. Vou descrever, depois mostro na prática.</p>
<p>Basicamente, você cria um código em Java que carrega uma dll &#8211; ignore o fato de ela não existir; pelo menos por enquanto. Ao tentar rodá-lo, <strong>obviamente</strong> você terá um erro de linkagem. Mas não queremos que funcione! Queremos só ver como seria feita a chamada dessa dll em C. Rápido demais? Certo. Repare que, mesmo dando erro, seu <em>javac</em> gerou um .class! Amazing. Mas isso não justifica minha fala agorinha. Não? Claro que sim!</p>
<p>Existe um utiliário que a Sun bota na JDK dela, se não me engano desde a 1.1, chamado <a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javah.html">Javah</a> (esse nome definitivamente me lembra os trocadilhos com Java, em tempos de técnico), que basicamente te gera headers e códigos em C a partir de uma .class.</p>
<p>Agora sim! Tudo se encaixa. Pseudo-criamos um código em Java com linkagem para nossa futura dll, vemos como fica a chamada em C/C++ usando o <em>javah</em>, fazemos um merge com nosso código na dll, compilamos-a, e enfim recompilamos nossa classe em Java que terá acesso ao Twitter!</p>
<p>Boralah, mãos a obra!</p>
<p>Código da DLL:</p>
<p>nomeei carinhosamente de <strong>TesteTwitter.cpp</strong></p>
<p><pre class="brush: cpp;">
#include &lt;jni.h&gt;
#include &quot;TesteTwitter.h&quot;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;windows.h&gt;
#include
&lt;psapi.h&gt;
#define     SIZE    1024

//some prototypes
int update_processes_array( DWORD *processes_array,
                            DWORD array_size,
                            DWORD *hm_processes,
                            DWORD bytes_returned);
int imprime_processo(DWORD pid);                            

/*
Procura o processo $nome. Se estiver rodando retorna seu PID, senão retorna 0
*/
int procura_processo(char * nome_processo){
    DWORD  * processes_array ; //array de processos, contem PIDs, e é do tamanho de SIZE
    DWORD  bytes_returned; //quantos processos tem no processes_array
    DWORD  array_size; //double word que armazenará o SIZE definido
    DWORD  hm_processes; //how many processes ;)
    HANDLE handle_processo;
    int i; //contador
    char nome[1024]; //armazenará o nome do módulo, null se der pau
    char *nome_upper; //diferencas de case
    //char * nome_processo_upper;
    nome_upper = (char *) malloc(sizeof(char)*1024);
    //nome_processo_upper = (char *) malloc(sizeof(char)*1024);

    if (nome_processo == NULL || strlen(nome_processo) &lt; 4 )
    // evita burrice, lembre-se: vc tá no windows, o strlen(processo) mínimo que vc tem é 4,
    // ou seja, .xxx  - extensão, meu fillho!
    {
        return 0; //fala que não achou
    }
    strcpy(nome,&quot;null&quot;);//como dito ;)
    array_size = SIZE; //blah
    //alloc memory for processes' array
    processes_array = ( DWORD * ) malloc( sizeof(DWORD) * SIZE );
    //atualiza o array de processos ;)
    if ( hm_processes = update_processes_array(processes_array, array_size, &amp;hm_processes, bytes_returned) ){
        printf(&quot;Array de Processos atualizado com sucesso&quot;);
    }else{
        printf(&quot;Erro ao atualizar lista de processos&quot;);
        return 0;
    }

    printf(&quot;\nNo momento, temos %d processos.&quot;, hm_processes);
    for (i=0; i&lt;hm_processes; i++){
        //tenta pegar um handle pro processo, but retorna null se der pau
         handle_processo = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processes_array[i]);
         //consegui? então pega o moduleBaseName!
         if( handle_processo != NULL){
             HMODULE vetor_handle_modulo;
             DWORD tamanho;
             if(EnumProcessModules(handle_processo, &amp;vetor_handle_modulo, sizeof(vetor_handle_modulo), &amp;tamanho)){
                 GetModuleBaseName( handle_processo, vetor_handle_modulo, nome, sizeof(nome)/sizeof(char));
             }
        }

        nome_upper = strupr(strdup(nome));
        nome_processo = strupr(strdup(nome_processo));
        if(! strcmp(nome_processo,nome_upper) ){  //ve se o processo atual (processes_array[i]) é o processo que estamos looking for.
            printf(&quot;\nAchei o %s&quot;, nome);
            CloseHandle(handle_processo);
            return (int)processes_array[i];
        }
    }
    printf(&quot;\nProcess %s not found!&quot;,nome_processo);
}

bool get_Processes( DWORD * processes_array,
                    DWORD size_processes_array,
                    DWORD *bytes_returned)
{

    if ( EnumProcesses( processes_array , size_processes_array , bytes_returned ) )
        return true;
    else
        return false;

}

/*
Recebe um PID e imprime (ou pelo menos tenta imprimir) seu module name
*/
int imprime_processo( DWORD pid ){
     //armazenará o nome do módulo, null se der pau
     char nome[1024];
     strcpy(nome,&quot;null&quot;);
     //tenta pegar um handle pro processo, but retorna null se der pau
     HANDLE handle_processo = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
     //consegui? então pega o moduleBaseName!
     if( handle_processo != NULL){
         HMODULE vetor_handle_modulo;
         DWORD tamanho;
         if(EnumProcessModules(handle_processo, &amp;vetor_handle_modulo, sizeof(vetor_handle_modulo), &amp;tamanho)){
             GetModuleBaseName( handle_processo, vetor_handle_modulo, nome, sizeof(nome)/sizeof(char));
         }
    }
    printf(&quot;%u  -  %s&quot;, pid, nome);
    CloseHandle(handle_processo);
    if(pid)
        return pid;
    return 0;
}

/*
returns:
    &lt; -1  &gt;     -    if fails on get_processes function
    &lt; &gt;= 0 &gt;    -    how many processes are running at this moment
*/
int update_processes_array( DWORD *processes_array,
                            DWORD array_size,
                            DWORD *hm_processes,
                            DWORD bytes_returned){
    if (! get_Processes( processes_array , array_size , &amp;bytes_returned) )
            return -1;
        else
            return *hm_processes = bytes_returned / sizeof(DWORD) ;

}

JNIEXPORT jint JNICALL Java_TesteTwitter_escreve(JNIEnv *env , jobject obj, jstring processo)
{
//Meu Deus, que palavras feias são essas! Pois é, também acho. Isso vem do .h gerado ao vc rodar o javah
//que, aliás, não disse comofas:
// javah classe_java
//ele vai te gerar um .h. A partir dele, vc se vira.
        int resultado = 0;
        jboolean iscopy; //boolean do java
        const char  *nome_processo = (env) -&gt; GetStringUTFChars(processo,&amp;iscopy);
        if (nome_processo == NULL){
            return 0; // erro em alocação de memória
        }
        printf(&quot;\n%s\n&quot;,nome_processo);
        resultado = procura_processo((char *)nome_processo);
        return resultado;
}
</pre></p>
<p>Seria legal se você tirasse, depois de entender o código e vê-lo rodar, todos os printf()&#8217;s da DLL. Isso não se faz.</p>
<p>Você também vai precisar de um arquivo <a href="http://msdn.microsoft.com/en-us/library/28d6s79h(VS.80).aspx">.def</a>, contendo informações básicas, tipo:</p>
<p>Java_Programa_método-a-ser-exportado</p>
<p><pre class="brush: cpp;">

EXPORTS
Java_TesteTwitter_escreve
</pre></p>
<p>Agora, bora compilar isso. Pay attention here!!</p>
<p>Primeiro você vai gerar um .o, nos moldes simples:</p>
<p><pre class="brush: cpp;">

gcc -c -I&quot;path que vc quiser incluir (onde estiverem libraries que vc botou no include, por exemplo)&quot; -o nome_do_objeto.o sourcecode.cpp

</pre></p>
<p>Importante você saber que, como você está usando a JNI.h, você precisa colocar o Path de seu header e implementação (JDK_folder\include e JDK_folder\include\win32). Ficaria algo do gênero:</p>
<p><pre class="brush: cpp;">

gcc -c -I&quot;C:\Arquivos de programas\java\jdk1.6.0_11\include&quot; -I&quot;C:\Arquivos de programas\java\jdk1.6.0_11\include\win32&quot; -o TesteTwitter.o TesteTwitter.cpp

</pre></p>
<p>Agora que você já tem seu nome_do_objeto.o, mande bala:</p>
<p><pre class="brush: cpp;">

gcc -shared -o&quot;meu_path\minhadll.dll&quot; &quot;meu_path\nome_do_objeto.o&quot; &quot;meu_path\meu_file_de_definicao.def&quot; -lpsapi

//ou, pegando na sua mão,

gcc -shared -o&quot;C:\Users\Cael\TesteTwitter.dll&quot;  &quot;C:\users\Cael\TesteTwitter.o&quot; &quot;C:\Users\cael\TesteTwitter.def&quot; -lpsapi

//coisa que vc precisa saber: -lpsapi diz ao gcc que vc está usando rotinas da biblioteca PSAPI. Óbvio.

</pre></p>
<p>Se tudo der certo, você tem sua DLL!</p>
<p>Agora vamos a parte do Java (eu sei, eu sei, fazer o quê.. <img src='http://s0.wp.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  )</p>
<p><pre class="brush: java;">

import java.util.List;
import winterwell.jtwitter.*; //dando import na library JTwitter
import winterwell.jtwitter.Twitter.Message;

public class TesteTwitter {
    static long ultimo=45871821; //ID da mensagem que, a partir dela, o código irá responder
    public native int escreve(String processo);   
    static{
    System.load(&quot;C:/Users/Cael/TesteTwitter.dll&quot;);
    System.out.println(&quot;Loaded&quot;);
    }
    public static void main(String[] args) {
        int PID;
        List&lt;Message&gt; lista;
        Message mensagem;
        Twitter cael = new Twitter(&quot;meu_login&quot;,&quot;minha_senha&quot;); //preciso te lembrar de alterar?
        while (1==1){
            try {
                Thread.currentThread().sleep(60000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(cael.getRateLimitStatus());
            lista=cael.getDirectMessages();
            if (lista.size() &gt; 0){
                mensagem = lista.get(0);
                System.out.println(mensagem.getText());
                if (mensagem.getId() != ultimo){

                    /*DEBUGGER*/

                    System.out.println(&quot;Mensagem nova!&quot;);
                    System.out.println(&quot;DE: &quot; + mensagem.getSender());
                    System.out.println(&quot;TEXTO: &quot; + mensagem.getText());

                    /*END*/

                    PID = new TesteTwitter().escreve(mensagem.getText());
                    if (PID !=0){
                        cael.setStatus(&quot;@&quot; + mensagem.getSender().screenName +  &quot; Sim, estou rodando o &quot; + mensagem.getText() + &quot;. PID &quot; + PID);
                    }else{
                        cael.setStatus(&quot;@&quot; + mensagem.getSender().screenName +  &quot; Não estou rodando o &quot; + mensagem.getText() + &quot;. Retorno da API (PID) &quot; + PID );

                    }
                    ultimo = mensagem.getId();
                    System.out.println(&quot;Twitter respondido!&quot;);
                    System.out.println(&quot;Para &quot; + mensagem.getSender());
                    System.out.println(&quot;ULTIMO = &quot; + ultimo);
                }           
            }
        }
    }
}

</pre></p>
<p>Warnings:</p>
<p>- O Twitter tem uma política de acesso aos seus dados via API. Sugiro que você dê uma pesquisada, antes que tenha sua conta bloqueada (como eu) por algumas horas. Isso te explica o Sleep() no código.</p>
<p>- Sim, o código tá muito verbose. Portanto, altere-o do jeito que você quiser.</p>
<p>- A variável estática <em>ultimo</em> está sendo atualizada durante a execução. E somente durante. Você pode alterá-la, salvá-la, armazená-la do jeito que você quiser após rodar o código. Senão, toda vez que você rodar, ele vai responder tudo de novo. Eu ainda estou no CTRL+C/V, pois não quero gastar muito tempo com esse assunto, e porque, principalmente, odeio Java.</p>
<p>Fiz uns updates para criar e matar processos remotamente, coisa fácil. Vá na pagina do msdn que te passei o link, comece a fuçar por lá. Mas cuidado com isso, não deixe ninguém rodar processo remotamente na sua máquina. Ou deixe. <img src='http://s2.wp.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Dúvidas, sugestões, declarações de amor ou xingamentos, comente.</p>
<p>Abraços,</p>
<p>Cael</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/caelgomes.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/caelgomes.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/caelgomes.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=caelgomes.wordpress.com&amp;blog=5690278&amp;post=3&amp;subd=caelgomes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://caelgomes.wordpress.com/2008/12/26/twitter-who/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">caelgomes</media:title>
		</media:content>
	</item>
	</channel>
</rss>
