<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>protected  * void &#187; Python</title>
	<atom:link href="http://www.danilocesar.com/blog/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danilocesar.com/blog</link>
	<description>Tecnologia, Linux e Software Livre</description>
	<lastBuildDate>Thu, 25 Feb 2010 19:27:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>QT mudando para LGPL</title>
		<link>http://www.danilocesar.com/blog/2009/01/14/qt-mudando-para-lgpl/</link>
		<comments>http://www.danilocesar.com/blog/2009/01/14/qt-mudando-para-lgpl/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 12:28:27 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[Portáteis]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[QT]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[SL]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[N800]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=166</guid>
		<description><![CDATA[Fonte: http://arstechnica.com/news.ars/post/20090114-nokia-qt-lgpl-switch-huge-win-for-cross-platform-development.html Ao menos uma das previsões de 2008 saiu =) [UPDATE 14/01 09:40]]]></description>
			<content:encoded><![CDATA[<p>Fonte: <a href="http://arstechnica.com/news.ars/post/20090114-nokia-qt-lgpl-switch-huge-win-for-cross-platform-development.html" target="_blank">http://arstechnica.com/news.ars/post/20090114-nokia-qt-lgpl-switch-huge-win-for-cross-platform-development.html</a></p>
<p><img class="alignnone size-full wp-image-167" title="Eu já sabia" src="http://www.danilocesar.com/blog/wp-content/uploads/2009/01/eujasabia.jpg" alt="Eu já sabia" width="400" height="300" /></p>
<p>Ao menos <a href="http://www.danilocesar.com/blog/2008/01/28/extra-extra-nokia-adquire-trolltech/">uma das previsões de 2008</a> saiu =)</p>
<p><strong>[UPDATE 14/01 09:40]</strong></p>
<p><object width="480" height="295"><param name="movie" value="http://www.youtube.com/v/IsTIIQocSqs&#038;hl=en&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/IsTIIQocSqs&#038;hl=en&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2009/01/14/qt-mudando-para-lgpl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porquê Java ainda é útil!</title>
		<link>http://www.danilocesar.com/blog/2008/11/26/porque-java-ainda-e-util/</link>
		<comments>http://www.danilocesar.com/blog/2008/11/26/porque-java-ainda-e-util/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 01:03:07 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[QT]]></category>
		<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=161</guid>
		<description><![CDATA[&#60;/joke&#62;]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.danilocesar.com/blog/wp-content/uploads/2008/11/java_amp.jpg"><img class="alignnone size-medium wp-image-162" title="Utilidade de Java" src="http://www.danilocesar.com/blog/wp-content/uploads/2008/11/java_amp-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>&lt;/joke&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/11/26/porque-java-ainda-e-util/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vou-me embora para Pasárgada</title>
		<link>http://www.danilocesar.com/blog/2008/07/11/vou-me-embora-para-pasargada/</link>
		<comments>http://www.danilocesar.com/blog/2008/07/11/vou-me-embora-para-pasargada/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 17:11:03 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Mandriva]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[QT]]></category>
		<category><![CDATA[SL]]></category>
		<category><![CDATA[UFPR]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>
		<category><![CDATA[viagens]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[recife]]></category>
		<category><![CDATA[trabalho]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=144</guid>
		<description><![CDATA[Vou-me embora para Pasárgada Lá sou amigo do Reis Novidades: 1 &#8211; Estou formado em Ciência da Computação pela UFPR. 2 &#8211; Estou deixando Curitiba. Após 22 anos na saudosa Curitiba estou deixando-a, e indo para Recife-PE. Só tenho o que agradecer a esta magnífica cidade, à minha família que fica por aqui, e aos [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Vou-me embora para Pasárgada<br />
Lá sou amigo do <em>Reis</em></p></blockquote>
<p>Novidades:</p>
<p>1 &#8211; Estou formado em <a href="http://pt.wikipedia.org/wiki/Ci%C3%AAncia_da_computa%C3%A7%C3%A3o" target="_blank">Ciência da Computação</a> pela <a href="http://inf.ufpr.br">UFPR</a>.</p>
<p>2 &#8211; Estou deixando <a href="http://pt.wikipedia.org/wiki/Curitiba">Curitiba</a>. Após 22 anos na saudosa Curitiba estou deixando-a, e indo para <a href="http://pt.wikipedia.org/wiki/Recife" target="_blank">Recife-PE</a>.</p>
<p style="text-align: left;">Só tenho o que agradecer a esta magnífica cidade, à minha família que fica por aqui, e aos meus <a href="http://tiagosh.wordpress.com/" target="_blank">colegas</a> <a href="http://blog.cpu.eti.br/">da</a> <a href="http://blog.skyegg.org/" target="_blank">Mandriva</a>, <a href="http://www.gustavoboiko.org/blog/" target="_blank">com</a> <a href="http://felipearruda.com/" target="_blank">os</a> <a href="http://warever.info/sr/blog/">quais</a> <a href="http://www.kdedevelopers.org/blog/74" target="_blank">pude</a> <a href="http://helllabs.org/blog/">aprender</a> <a href="http://caio.ueberalles.net/log/">bastante</a>.</p>
<p>E esperar que este novo <a href="http://www.indt.org.br/" target="_blank">desafio</a> seja tão bom e gratificante quanto <a href="http://wiki.mandriva.com/en/Home" target="_blank">o antigo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/07/11/vou-me-embora-para-pasargada/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Auto-completar no python do Mac OsX</title>
		<link>http://www.danilocesar.com/blog/2008/05/27/auto-completar-no-python-do-mac-osx/</link>
		<comments>http://www.danilocesar.com/blog/2008/05/27/auto-completar-no-python-do-mac-osx/#comments</comments>
		<pubDate>Wed, 28 May 2008 02:56:23 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[SL]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=135</guid>
		<description><![CDATA[Certa vez o Ademar comentou que o python tinha auto-completar por padrão. Pessoalmente nunca tinha percebido isto, e conversando com o Ramiro percebi o porquê: Mac OS X e Windows não inicializam os módulos readline e o rlcompleter sozinhos. Procurando um pouco vi que habilitá-los é fácil. Primeiro edite o arquivo ~/.pythonrc #Enable syntax completion [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez o <a href="http://blog.ademar.org/2008/05/24/adeus-curitiba/">Ademar</a> comentou que o python tinha auto-completar por padrão. Pessoalmente nunca tinha percebido isto, e conversando com o <a href="http://www.ramiroluz.eti.br/">Ramiro</a> percebi o porquê: Mac OS X e Windows não inicializam os módulos <strong>readline</strong> e o <strong>rlcompleter</strong> sozinhos.</p>
<p>Procurando um pouco vi que habilitá-los é fácil.</p>
<p>Primeiro edite o arquivo ~/.pythonrc<br />
<code>
<pre>#Enable syntax completion
try:
    import readline
except ImportError:
    print "Module readline not available."
else:
    import rlcompleter
    readline.parse_and_bind("tab: complete")
</pre>
<p></code></p>
<p>Após isto, em seu ~/.bashrc adicione:<br />
<code><br />
export PYTHONSTARTUP=~/.pythonrc<br />
</code></p>
<p>Agora inicie o python e faça o teste.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/05/27/auto-completar-no-python-do-mac-osx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hello world para Native-Symbian</title>
		<link>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/</link>
		<comments>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/#comments</comments>
		<pubDate>Wed, 07 May 2008 01:00:03 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Quick Tip]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>
		<category><![CDATA[viagens]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=132</guid>
		<description><![CDATA[Certa vez eu quis explicar a um amigo porque escrever código em python para celular era mais legal que escrever código em C (native-symbian e não OpenC). Acho que hoje talvez eu consiga. Segue os exemplos: Python print "Hello World" C++-Epoc // Hello World in C++, Epoc style (for Symbian OS) #include < eikapp.h > [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez eu quis explicar a um amigo porque escrever código em <a href="http://sourceforge.net/projects/pys60" target="_blank">python</a> para celular era mais legal que escrever código em C (<a href="http://forum.nokia.com/main/resources/technologies/symbian/index.html" target="_blank">native-symbian</a> e não <a href="http://www.forum.nokia.com/main/resources/technologies/open_c/index.html" target="_blank">OpenC</a>). Acho que hoje talvez eu consiga.</p>
<p>Segue os exemplos:</p>
<h3>Python</h3>
<p><code>print "Hello World" </code></p>
<h3>C++-Epoc</h3>
<p><code><br />
// Hello World in C++, Epoc style (for Symbian OS)<br />
#include < eikapp.h ><br />
#include < eikdoc.h ><br />
#include < eikappui.h ></p>
<p>class CHelloWorldAppUi;<br />
class CEikApplication;<br />
class CHelloWorldAppView;</p>
<p>class CHelloWorldApplication : public CEikApplication<br />
    {<br />
        public:<br />
            TUid AppDllUid() const;<br />
        protected:<br />
            CApaDocument* CreateDocumentL();<br />
    };</p>
<p>class CHelloWorldDocument : public CEikDocument<br />
    {<br />
        public:<br />
            static CHelloWorldDocument* NewL(CEikApplication&#038; aApp);<br />
            static CHelloWorldDocument* NewLC(CEikApplication&#038; aApp);<br />
            ~CHelloWorldDocument(){};<br />
        public:<br />
            CEikAppUi* CreateAppUiL();<br />
        private:<br />
            void ConstructL() {};<br />
            CHelloWorldDocument(CEikApplication&#038; aApp){};<br />
    };</p>
<p>class CHelloWorldAppUi : public CEikAppUi<br />
    {<br />
        public:<br />
                void ConstructL();<br />
                CHelloWorldAppUi(){};<br />
                ~CHelloWorldAppUi(){};<br />
    };</p>
<p>static const TUid KUidHelloWorldApp = {0x10005B91};</p>
<p>GLDEF_C TInt E32Dll(TDllReason )<br />
    {<br />
    return KErrNone;<br />
    }</p>
<p>EXPORT_C CApaApplication* NewApplication()<br />
    {<br />
    return (new CHelloWorldApplication);<br />
    }</p>
<p>CApaDocument* CHelloWorldApplication::CreateDocumentL()<br />
    {<br />
    CApaDocument* document = CHelloWorldDocument::NewL(*this);<br />
    return document;<br />
    }</p>
<p>TUid CHelloWorldApplication::AppDllUid() const<br />
    {<br />
    return KUidHelloWorldApp;<br />
    }</p>
<p>CHelloWorldDocument* CHelloWorldDocument::NewL(CEikApplication&#038; aApp)<br />
    {<br />
    CHelloWorldDocument* self = NewLC(aApp);<br />
    CleanupStack::Pop(self);<br />
    return self;<br />
    }</p>
<p>CHelloWorldDocument* CHelloWorldDocument::NewLC(CEikApplication&#038; aApp)<br />
    {<br />
    CHelloWorldDocument* self = new (ELeave) CHelloWorldDocument(aApp);<br />
    CleanupStack::PushL(self);<br />
    self->ConstructL();<br />
    return self;<br />
    }</p>
<p>CEikAppUi* CHelloWorldDocument::CreateAppUiL()<br />
    {<br />
    CEikAppUi* appUi = new (ELeave) CHelloWorldAppUi;<br />
    return appUi;<br />
    }</p>
<p>void CHelloWorldAppUi::ConstructL()<br />
    {<br />
    BaseConstructL();</p>
<p>    _LIT(message,"Hello!");<br />
    CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;<br />
    informationNote->ExecuteLD(message);<br />
    }<br />
</code></p>
<p><em>fonte: <a href="href="http://www.roesler-ac.de/wolfram/hello.htm">http://www.roesler-ac.de/wolfram/hello.htm</a> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/05/06/hello-world-para-native-symbian/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pychord 2 saindo do forno</title>
		<link>http://www.danilocesar.com/blog/2008/03/30/pychord-2-saindo-do-forno/</link>
		<comments>http://www.danilocesar.com/blog/2008/03/30/pychord-2-saindo-do-forno/#comments</comments>
		<pubDate>Mon, 31 Mar 2008 00:29:03 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[SL]]></category>
		<category><![CDATA[acordes]]></category>
		<category><![CDATA[cifra]]></category>
		<category><![CDATA[música]]></category>
		<category><![CDATA[N800]]></category>
		<category><![CDATA[pychord]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2008/03/30/pychord-2-saindo-do-forno/</guid>
		<description><![CDATA[Certa vez um colega de trabalho de uma das empresas por onde passei comentou: &#8220;Não basta colocar um filho no mundo, é preciso alimenta-lo, educa-lo e fazer o possível para vê-lo crescido!&#8221; Pois bem, depois de certo tempo resolvi voltar a mexer no abandonado código do pychord e adicionar algumas funcionalidades que eu precisava. Após [...]]]></description>
			<content:encoded><![CDATA[<p>Certa vez um colega de trabalho de uma das empresas por onde passei comentou:</p>
<blockquote><p><strong>&#8220;Não basta colocar um filho no mundo, é preciso alimenta-lo, educa-lo e fazer o possível para vê-lo crescido!&#8221;</strong></p></blockquote>
<p>Pois bem, depois de certo tempo resolvi voltar a mexer no <a href="https://garage.maemo.org/svn/pychord/trunk">abandonado código</a> do <a href="https://garage.maemo.org/projects/pychord/">pychord</a> e adicionar algumas funcionalidades que eu precisava.</p>
<p>Após duas tentativas frustradas (0.4.5 e 0.5) percebi que era necessário re-escrever a biblioteca gráfica. Assim foi feito. Adicionei o conceito de <a href="http://en.wikipedia.org/wiki/Window_%28computing%29">janela</a>, conteiner de <a href="http://en.wikipedia.org/wiki/GUI_widget"><em>widgets</em>,</a> melhorei a herança entre classes, etc.  A interface não mudou muita coisa, <a href="http://www.pygame.org">pygame</a> é meio chato para isso.</p>
<p>Ainda estou usando o padrão <strong>.chr </strong>criado para a <a href="http://labs.danilocesar.com/blog/2007/09/16/pychord-for-maemo-get-your-install-here/">primeira versão</a>, mas pretendo adicionar o formato <a href="http://en.wikipedia.org/wiki/XML">XML</a> <a href="http://www.opensong.org">opensong</a> em breve.</p>
<p>A parte legal, e a novidade mais visível, é que criei uma heurística para decidir quais linhas são acordes e quais não são. Esta heurística pretendo ir melhorando a medida que for encontrando casos em que ela não funcione.</p>
<p>Para resumir: ao nível de usuário, as modificações foram:</p>
<ol>
<li>Heurística para reconhecer/diferenciar acordes de letra de músicas</li>
<li>Mudança de tom</li>
<li>Listas clicáveis e móveis</li>
<li>Suporte ao Maemo OS2008</li>
<li>Controle da luminosidade durante a apesentação das cifras ( o display não apaga durante a mostragem mais )</li>
</ol>
<h4>A parte nerd</h4>
<p>A idéia era que o código da interface pudesse ser reutilizada em outros projetos, logo trabalhei para ter uma GUI mais conscistente do que a anterior. Utilizando melhor o conceito de herança foi possível simplificar a utilização da lib, deixando as coisas com menos cara de gambiarra.</p>
<p>Através do conceito de <em>slots</em> ficou bem simples implementar mais de uma <em>action </em>para um mesmo evento.</p>
<h4>Screenshots</h4>
<p><img src="http://www.danilocesar.com/blog/wp-content/uploads/2008/03/picture-1.png" alt="Pychord-screenshot" height="271" width="466" /></p>
<p>Tela de busca, não mudou muito de como era anteriormente.</p>
<p><img src="http://www.danilocesar.com/blog/wp-content/uploads/2008/03/picture-2.png" alt="Pychord-screenshot2" height="275" width="465" /></p>
<p>Visualização da cifra</p>
<p><img src="http://www.danilocesar.com/blog/wp-content/uploads/2008/03/picture-3.png" alt="Pychord-Screenshot3" height="277" width="464" /></p>
<p>Mudaça de tom.</p>
<p>Como sempre, o arquivo de instalação pode ser pego <a href="/home/daniloeu/labs.danilocesar.com/maemo/pychord">aqui</a>. Ainda não criei um repositório pois o aplicativo está em fase de testes. Mas pretendo fazer isto em breve.</p>
<p><em><strong>[UPDATE 03/03/2008] </strong></em>Por problemas de codificação dentro do módulo sqlite3, os textos devem estar em formato UTF-8&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2008/03/30/pychord-2-saindo-do-forno/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PyChord First Release Candidate. Pegue seu .install aqui!</title>
		<link>http://www.danilocesar.com/blog/2007/10/19/pychord-first-release-candidate-pegue-seu-install-aqui/</link>
		<comments>http://www.danilocesar.com/blog/2007/10/19/pychord-first-release-candidate-pegue-seu-install-aqui/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 20:43:02 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/09/16/pychord-first-release-candidate-pegue-seu-install-aqui/</guid>
		<description><![CDATA[Finalmente, Pychord está pronto! Todas as features (da versão 1.0) ja estão funcionando. Agora eu preciso trabalhar em duas linhas diferentes: Melhoramento do código fonte [1] Bug Fixes[2] [1] Eu não tinha conhecimento suficiente sobre pygame quando iniciei este projeto. Então eu preciso alterar algumas partes do código para corrigir decisões erradas de engenharia que [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente, <a href="https://garage.maemo.org/projects/pychord/" target="_blank">Pychord</a> está pronto!</p>
<p>Todas as <em>features</em> (da versão 1.0) ja estão funcionando. Agora eu preciso trabalhar em duas linhas diferentes:</p>
<ul>
<li><a href="https://garage.maemo.org/pm/?group_id=346" target="_blank">Melhoramento do código fonte</a> [1]</li>
<li>Bug Fixes[2]</li>
</ul>
<p><strong>[1] </strong> Eu não tinha conhecimento suficiente sobre <a href="http://www.pygame.org" target="_blank">pygame</a> quando iniciei este projeto. Então eu preciso alterar algumas partes do código para corrigir decisões erradas de engenharia que tomei anteriormente.<br />
<strong>[2] </strong> Se você for utilizar esta aplicação, por favor, dê-me um <a href="https://garage.maemo.org/tracker/?group_id=346">feedback</a> e eu vou tentar melhorá-la!</p>
<p>Depois disto eu vou iniciar a versão 1.1 ( com as <em>features</em> que prometi anteriormente ).</p>
<p>Caso você precise de informações sobre como utilizar o programa, <a href="http://labs.danilocesar.com/blog/2007/09/16/pychord-for-maemo-get-your-install-here/">leia isto</a>.</p>
<p>Você pode fazer o download do &#8220;.install&#8221; <a href="http://labs.danilocesar.com/maemo/pychord.install" target="_blank">aqui</a>!</p>
<p>Se você tiver problemas para instalar esta aplicação, tente novamente procurando por pychord em <code>ApplicationManager-&gt;Browse Installable Applications-&gt;others-&gt;pychord</code></p>
<p>Se após isto você ainda tiver problemas (ou sugestões), por favor, <a href="https://garage.maemo.org/tracker/?group_id=346">reporte</a>!</p>
<p>[]&#8216;s</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/10/19/pychord-first-release-candidate-pegue-seu-install-aqui/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pychord: minha primeira contribuição ao Maemo.</title>
		<link>http://www.danilocesar.com/blog/2007/09/05/pychord-minha-primeira-contribuicao-ao-maemo/</link>
		<comments>http://www.danilocesar.com/blog/2007/09/05/pychord-minha-primeira-contribuicao-ao-maemo/#comments</comments>
		<pubDate>Wed, 05 Sep 2007 16:51:46 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Portáteis]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/09/05/pychord-minha-primeira-contribuicao-ao-maemo/</guid>
		<description><![CDATA[Estou dando vida à minha primeira contribuição opensource ao projeto Maemo. É o Pychord. PyChord é uma aplicação que ajudará músicos durante ensaios mostrando cifras das músicas. A vantagem é que ele possui função de auto-scroll da tela, além de ter botões relativamente grandes. Bastará ao usuário procurar pelo nome da música e o sistema [...]]]></description>
			<content:encoded><![CDATA[<p>Estou dando vida à minha primeira contribuição opensource ao projeto <a href="http://www.maemo.org">Maemo</a>.</p>
<p>É o <a href="https://garage.maemo.org/projects/pychord/">Pychord.</a></p>
<p>PyChord é uma aplicação que ajudará músicos durante ensaios mostrando cifras das músicas. A vantagem é que ele possui função de <a href="http://en.wikipedia.org/wiki/Scrolling">auto-scroll</a> da tela, além de ter botões relativamente grandes.</p>
<p>Bastará ao usuário procurar pelo nome da música e o sistema mostrará a cifra. Como passei muito tempo brincando com a interface dele (fazer widgets no pygame parecia impossível antes, além do scroll sensível e com impulso), acabou não dando tempo de desenvolver a interface de busca por cifras. Mas estou pensando em usar o SQLite mesmo. De qualquer forma, além da search engine tem algumas <em>features</em> que pretendo desenvolver pra ele:</p>
<ol>
<li>Troca de tom das músicas (muito útil pra caras como eu que custam para lembrar que a diferença entre <em><strong>B</strong></em> e<em><strong> C</strong></em> é de meio tom)</li>
<li>Rotação da tela.</li>
</ol>
<p>De qualquer forma, tenho que agradecer ao <a href="https://garage.maemo.org/projects/pyvirtkey/">Tony Maro</a> que desenvolveu o teclado virtual e ao <a href="http://www.maeceloeduardo.com">Marcelo</a> ao dizer que não é bonito scroll-bars aonde não precisa. =)</p>
<p>O código não está aquela beleza, mas vai ter feriado por aí e eu vou ter bastante tempo livre para arrumar e terminar a aplicação.</p>
<p>Meu inglês não é lá essas coisas, mas fiz um vídeo de demonstração da aplicação que pode ser visto abaixo.</p>
<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/kvi09ODf_Ms"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/kvi09ODf_Ms" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
<p>Com isto estou criando uma versão do meu blog na língua da <a href="http://en.wikipedia.org/wiki/Elizabeth_II_of_the_United_Kingdom">rainha</a>: <a href="http://labs.danilocesar.com">http://labs.danilocesar.com</a>.</p>
<p>E para quem quiser ver o código do PyChord:</p>
<p><code>svn co http://labs.danilocesar.com/pychord/trunk</code></p>
<p>Aceito sugestões!</p>
<p>[]&#8216;s a todos e bom feriado!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/09/05/pychord-minha-primeira-contribuicao-ao-maemo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Gdesklets, um pouco mais que o basicão</title>
		<link>http://www.danilocesar.com/blog/2007/02/11/desenvolvimento-gdesklet-tutorial-da-bovespa/</link>
		<comments>http://www.danilocesar.com/blog/2007/02/11/desenvolvimento-gdesklet-tutorial-da-bovespa/#comments</comments>
		<pubDate>Sun, 11 Feb 2007 13:59:49 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2007/02/11/desenvolvimento-gdesklet-tutorial-da-bovespa/</guid>
		<description><![CDATA[Hoje vou apresentar o aplicativo Gdesklets. Para quem não sabe, este aplicativo permite que o usuário rode pequenas aplicações &#8220;applets&#8221; diretamente no desktop. Possui por padrão vários applets prontos, como relógios, monitores de desempenho de hardware, previsão do tempo, entre outras coisas. Segue uma screenshot do meu desktop: Tá tá! Você usuário linux mediano provavelmente [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje vou apresentar o aplicativo Gdesklets.</p>
<p>Para quem não sabe, este aplicativo permite que o usuário rode pequenas aplicações &#8220;applets&#8221; diretamente no desktop.  Possui por padrão vários applets prontos, como relógios, monitores de desempenho  de hardware, previsão do tempo, entre outras coisas. Segue uma screenshot do meu desktop:</p>
<p> <a class="imagelink" href="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/desktop.jpg" title="Gdesklets Desktop"><img id="image67" src="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/desktop.thumbnail.jpg" alt="Gdesklets Desktop" /></a></p>
<p>Tá tá! Você usuário linux mediano provavelmente já saiba disso: Já conhecia o Gdesklets, e muito provavelmente também já usava, certo? Então o que esse post tem de diferente?</p>
<p>
<h3>Como desenvolver seus próprios Applets</h3>
</p>
<p>Para iniciar, digo que é muito fácil desenvolver aplicativos para o Gdesklet. Para quem está acostumado com HTML, vai lembrar de alguns conceitos como posicionamento, tags, ID&#8217;s, etc&#8230;</p>
<p>O que vou passar aqui pra vocês é o que eu aprendi sobre gdesklets nesta semana.</p>
<p>
<h3>Cada parte do Gdesklets</h3>
</p>
<p>Cada applet consiste em:</p>
<ul>
<li>Uma janela, definida em um <em>arquivo.display</em>, que é, na verdade, um xml.</li>
<li>Um sensor, que é responsável por controlar e retornar dados para o display</li>
</ul>
<p>
<h3>Primeiros Passos com o Display</h3>
</p>
<p>Inicialmente vamos chamar nosso aplicativo de PrimeirosPassos (Sugestivo não?)<br />
Crie uma pasta com <em><strong>~/mkdir .gdesklets/Displays/PrimeirosPassos</strong></em></p>
<p>Dentro desta pasta, crie um arquivo chamado PrimeirosPassos.display com o seguinte conteúdo</p>
<p><code lang="xml"><br />
    < ?xml version="1.0" encoding="UTF-8" ?><br />
    <display id="WPrimeirosPassos"><br />
    </display><br />
</code></p>
<p>E esta aí a estrutura básica de um Display no Gdesklets. Resumidamente, tudo o que você quiser colocar na sua tela você deverá colocar dentro da Tag display</p>
<p>Para incrementar um pouco mais, vamos fazer o clássico HelloWorld</p>
<p><code lang="xml"></p>
<p>< ?xml version="1.0" encoding="UTF-8"?></p>
<p><display id="WPrimeirosPassos"><br />
    <label value="HelloWorld com GDesklets!" font="Serif 20" color="red"/><br />
</display></p>
<p></code></p>
<p>Aprendemos então uma nova Tag no Desklet: A Tag <strong>Label</strong>, que possui as seguintes propriedades:<br />
<br /> <strong><em>color</em></strong>, Permite escolher a cor<br />
<br /> <strong><em>font</em></strong>, Permite escolher a fonte<br />
<br /> <strong><em>value</em></strong>, Define o conteúdo que o label terá na tela.
</p>
<p>Agora vamos ver como o Desklet aparece na tela. <br />
<a class="imagelink" href="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/helloworld.jpg" title="Ola mundo em gdesklets"><img id="image68" src="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/helloworld.thumbnail.jpg" alt="Ola mundo em gdesklets" /></a>
</p>
<p>
<h3>Agrupamentos</h3>
</p>
<p>Na estrutura XML do Desklet, existe também a TAG Group, que é utilizada para agruar elementos da estrutura. Um exemplo seria:<br />
<code lang="xml"><br />
<group x="20" y="20" bg-color="green"><br />
	<label x="0" y="0" value="#2"/><br />
	<label x="0" y="50" value="#3"/><br />
	<label x="50" y="0" value="#4"/><br />
</group><br />
</code>
</p>
<p>Dentro da tag group, vemos também as propriedades X e Y, que logicamente definem o posicionamento X Y do elemento na tela.</p>
<p>
<h3>Posicionamento relativo e âncoras</h3>
</p>
<p>A estrutura desklet permite a existencia do chamado posicionamento relativo. <br />
Posicionamento relativo nada mais é do que o posicionamento XY relativo ao um outro objeto</p>
<p>Por exemplo: o usuário quer que o segundo elemento label fique ao lado do primeiro elemento:<br />
<code lang="xml"><br />
    <label font="Sans 14px" color="white" id="label1" value="Ola " /><br />
    <label relative-to="label1, x" font="Sans 14px" color="green" value="Mundo"/><br />
</code>
</p>
<p>A propriedade relative-to dos elementos recebem dois parametros: O primeiro é o Identificador do objetivo, e o segundo é a que propriedade queremos esta relatividade. Este valor pode ser X, Y ou XY.
</p>
<p>Podemos também definir aonde queremos esta relatividade através da propriedade anchor. O valor default é NW (superior esquerdo). Os outros valores são:</p>
<ul>
<li>nw &#8211; Topo esquerdo</li>
<li>n &#8211; Meio do topo</li>
<li>ne &#8211; Topo Direito</li>
<li>e &#8211; Meio do canto direito</li>
<li>se &#8211; Canto inferior direito</li>
<li>s &#8211; Meio de baixo</li>
<li>sw -Canto inferior esquerdo</li>
<li>w &#8211; Meio da lateral direita</li>
<li>center &#8211; Centro</li>
</ul>
<p>
<h3>Fase dois</h3>
</p>
<p>Bem, precisamos de uma aplicação descente para fazermos nossos testes, certo? Como não quero fazer um applet de previsão do tempo (pois já existem muitos), resolvi fazer um para receber dados de ações diretamente da Bovespa! O nome do projeto será Bovespa (lembre-se de utlizar o nome das pastas como Bovespa).</p>
<p>
<h3>Interface</h3>
</p>
<p>O código da interface é o seguinte:</p>
<p><code lang="xml"><br />
< ?xml version="1.0" encoding="UTF-8"?></p>
<p><display id="win" anchor="ne" window-flags="sticky, below"></p>
<p>    <sensor id="sens" module="Bovespa,posi3"/></p>
<p>    <meta name="Bovespa" version="0.01" category="Misc" author="Danilo Cesar" description="Bovespa's Home Broker utility "/></p>
<p>    <frame id="border"><br />
        <group id="panel" width="5cm" height="2,5cm"><br />
            </group><group id="Titleobjs" width="100%"><br />
                <image id="logo" x="2" y="2" uri="/usr/share/icons/gnome/48x48/stock/document/stock_new-spreadsheet.png"/><br />
                <label relative-to="logo,x" x="1cm" id="title" value="Bovespa" font="Sans 20px" color="black"/><br />
                <label anchor="se" relative-to="title,xy" y=".6cm" watch="value=sens:nome" value="Carregando" font="Sans 20px" color="white"/><br />
            </group><br />
            <group id="values" width="100%" relative-to="Titleobjs, y"><br />
                <label font="Sans 14px" color="white" id="lblo" value="Oscilacao: " /><br />
                <label relative-to="lblo, x" watch="value=sens:oscilacao, color=sens:color" font="Sans 14px" color="green" value="carregando"/><br />
                <label relative-to="lblo, y" font="Sans 14px" color="white" id="lblp" value="Preço:        " /><br />
                <label relative-to="lblp, x" watch="value=sens:price, color=sens:color" font="Sans 14px" color="green" value="carregando"/><br />
            </group></p>
<p>    </frame><br />
</display></p>
<p></code>
</p>
<p>Aqui nós temos duas coisas novas:<br />
A primeira é a tag <em><strong>sensor</strong></em>, que possui 2 argumentos: <br />
id: Que será como o sensor será referenciado pelo display.<br />
module: Que define qual sensor deverá ser utilizado. Queremos o sensor Bovespa, e seu argumento será posi3 (código da positivo informática na Bolsa de São Paulo).
</p>
<p>A outra informação nova é parâmetro watch nos labels, que é um receptor de dados do sensor. Vamos dar um exemplo:<br />
<br />&lt;label watch=&#8221;color=sens:cor&#8221;<br />
Significa que o parâmetro Color do Label será preenchido pela propriedade &#8220;cor&#8221; do sensor &#8220;sens&#8221;. Simples não?
</p>
<p>
<h3>Programação do sensor</h3>
</p>
<p>Os sensores são arquivos criados com o nome __init__.py. No caso do nosso exemplo, criemos um arquivo chamado: <em><strong>~/.gdesklets/Sensors/Bovespa/__init__.py</strong></em> . O arquivo mais básico para um sensor deve conter pelo menos o seguinte conteúdo: </p>
<p><code lang="python"><br />
from sensor.Sensor import Sensor</p>
<p>class Bovespa(Sensor):<br />
    def __init__(self, *args):<br />
        Sensor.__init__(self)</p>
<p>def new_sensor(args): return Bovespa(*args)<br />
</code></p>
<p>A Classe Bovespa extende a classe sensor, por isso dentro dela podemos chamar algumas funções especiais. Listo algumas abaixo:</p>
<p><strong>self._add_timer(tempo,funcao,parametros)</strong> nos permite executar uma função <strong>funcao</strong> e seus <strong>paremetros</strong> a cada <strong>tempo</strong> milisegundos. A função executada deverá retornar sempre true,e caso retorne false, a função deixará de ser executada.</p>
<p><strong>output = self._new_output()</strong> cria uma porta de saída para o display. É a forma que o python tem de enviar seus dados para o display. O objeto output possui um método importante: output.set(<span style="color: '#FFFFFF'; ">&#8216;nome&#8217;</span>, <span style="color: '#FFFFFF'; "> &#8216;valor&#8217;</span>), que grava o argumento <span style="color: '#FFFFFF'; ">&#8216;nome&#8217;</span> com o valor <span style="color: '#FFFFFF'; ">&#8216;nome&#8217;</span>.</p>
<p><strong>self._send_output(output)</strong>, que é o método responsável em enviar uma lista de output&#8217;s para o display.</p>
<p>Com estes conhecimentos poderemos agora desenvolver nosso sensor. Que ficará da seguinte forma:</p>
<p><code lang="python"><br />
from sensor.Sensor import Sensor<br />
from utils.datatypes import *<br />
import re<br />
import urllib</p>
<p>class Bovespa(Sensor):</p>
<p>    def __init__(self, acoes = 'posi3'):</p>
<p>		# call the constructor of the super class<br />
        Sensor.__init__(self)</p>
<p>        self.acoes = acoes[0]</p>
<p>        # Atualização do tipo ONLOAD, que ocorre apenas<br />
        # uma vez pois retorna um False<br />
        self._add_timer(0, self.refresh, False)</p>
<p>        # Atualizações do sistema a cada 60 segundos<br />
        self._add_timer(60000, self.refresh, True)</p>
<p>    def refresh(self, FT):</p>
<p>        f = urllib.urlopen ('http://www.bovespa.com.br/Cotacoes2000/CotacaoRapidaHome.Asp?PaginaReferente=home_right.Asp&#038;txtCodigo=' +self.acoes)<br />
        self._text = contents = f.read()<br />
        f.close()</p>
<p>        self._text = self._text.replace('&nbsp;', ' ')</p>
<p>        # Definindo variáveis para enviar ao Display<br />
        output = self._new_output()<br />
        output.set('nome', self.acoes.upper())<br />
        output.set('oscilacao', self.get_oscilacao())<br />
        output.set('price', self.get_price())<br />
        output.set('color', self.get_color())</p>
<p>        self._send_output(output)</p>
<p>        return FT</p>
<p>	# Procura por expressao regular a string com o preco da acao<br />
    def get_price(self):<br />
        ips = re.search('R\$ [0-9][0-9]{0,3},[0-9]{1,2}',self._text)<br />
        if ips <> None:<br />
            return ips.group(0)<br />
        else:<br />
            return 'Erro!'<br />
    #Procura por ER a string com a ascilacao da acao<br />
    def get_oscilacao(self):<br />
        ips = re.search('(-|\+)?[0-9][0-9]?,[0-9][0-9]%',self._text)<br />
        if ips <> None:<br />
            return ips.group(0)<br />
        else:<br />
            return 'Erro!'<br />
	# Escolhe a cor para mostrar a acao.<br />
	# Vermelhor para erro ou acao negativa<br />
	# verde para acao positiva<br />
    def get_color(self):<br />
        ips = self.get_oscilacao();<br />
        if (ips[0] == '-' or ips == 'Erro!'):<br />
            return 'red'<br />
        else:<br />
            return 'green'</p>
<p>def new_sensor(args): return Bovespa(args)<br />
</code></p>
<p>Nosso applet ficará assim: <br /><img id="image66" src="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/bovespa.jpg" alt="Aplicativo Bovespa" /></p>
<p>Não citei como fazer as seções de configuração e algumas outras coisas porque também ainda não tive tempo de ver. <br />
Aos interessados, podem fazer aqui o download completo do applet Bovespa <a id="p69" href="http://www.danilocesar.com/blog/wp-content/uploads/2007/02/bovespatar.gz" title="Bovespa Desklet completo">aqui</a></p>
<p>Alguns links interessantes são:</p>
<ul>
<li><a href="http://gdesklets.gotdns.org/gDeskletsWiki">http://gdesklets.gotdns.org/gDeskletsWiki</a></li>
<li><a href="http://www.pycage.de/howto_desklets.html">http://www.pycage.de/howto_desklets.html</a></li>
<li><a href="http://develbook.gdesklets.de/">http://develbook.gdesklets.de/</a></li>
<li><a href="http://www.gdesklets.de/">http://www.gdesklets.de/</a></li>
</ul>
<p>E é isso. Espero que vocês tenham boa sorte com seus applets, e melhor sorte do que eu em suas ações!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2007/02/11/desenvolvimento-gdesklet-tutorial-da-bovespa/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Smartphones: aonde podemos parar?</title>
		<link>http://www.danilocesar.com/blog/2006/12/03/smartphones-aonde-podemos-parar/</link>
		<comments>http://www.danilocesar.com/blog/2006/12/03/smartphones-aonde-podemos-parar/#comments</comments>
		<pubDate>Sun, 03 Dec 2006 17:58:56 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[PyS60]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ubuntu-Br]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/2006/12/03/smartphones-aonde-podemos-parar/</guid>
		<description><![CDATA[Tive o prazer de ter em minhas mãos um Nokia 6681 a alguns dias atrás, e tive uma idéia: Imagine uma touchscreen. Agora imagine uma touchscreen sem uma touch-screen =). Imagine poder &#8220;simular&#8221; uma touchscreen no ar usando apenas a camera do seu celular. Pode ser um brinquedo muito interessante não? Pensando nisso fiz um [...]]]></description>
			<content:encoded><![CDATA[<p>Tive o prazer de ter em minhas mãos um <a target="_blank" href="http://forum.nokia.com/devices/6681">Nokia 6681</a> a alguns dias atrás, e tive uma idéia:</p>
<p>Imagine uma <a href="http://en.wikipedia.org/wiki/Touchscreen">touchscreen</a>. Agora imagine uma touchscreen sem uma touch-screen =).<br />
Imagine poder &#8220;simular&#8221; uma touchscreen no ar usando apenas a camera do seu celular.</p>
<p>Pode ser um brinquedo muito interessante não?</p>
<p>Pensando nisso fiz um pequeno aplicativo em <a target="_blank" href="http://www.python.org">Python</a> (<a target="_blank" href="http://pys60.sf.net">pyS60</a>) que localiza um objeto e segue-o. Como se fosse um mouse pointer seguindo uma caneta.</p>
<p>Este aplicativo na verdade é apenas uma <em><a target="_blank" href="http://en.wikipedia.org/wiki/Proof_of_concept">prova de conceito</a></em> demonstrando que pode ser feito. Quando tivermos celulares melhores, algo como 1GHz (O 6681 possui um processador de 220Mhz), e cameras próprias para este tipo de aplicação, talvez tenhamos softwares e smartphones com este conceito em funcionamento.<br />
Seria muito bacana ver soluções assim aplicadas em desktops 3D.</p>
<p>Segue um vídeo de demonstração do aplicativo. Como disse, é apenas uma prova de conceito. Python ainda não é uma linguagem muito rápida quando estamos em celulares. Mas é muito mais fácil programar e testar do que se fosse feito em <a target="_blank" href="http://www.symbian.com/developer/">native symbian</a>, e ainda por cima posso programar em linux =).</p>
<p><sub style="color: #ff0000">Leitores de RSS podem ver o vídeo <a href="http://www.danilocesar.com/blog/2006/12/03/smartphones-aonde-podemos-parar/">aqui</a></sub></p>
<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/sjm_g9MSYPc"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/sjm_g9MSYPc" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>
<h3>Código fonte</h3>
<p><code lang="python"><br />
##############################################<br />
# Produzido por Danilo Cesar [http://www.danilocesar.com]<br />
# Inspirado por:  http://www.bigbold.com/snippets/posts/show/636<br />
# Agradecimento a Enrico Batista<br />
##############################################<br />
from appuifw import *<br />
from graphics import Image<br />
import camera, e32<br />
#import miso    # don't dim the light</p>
<p>app.body = c = Canvas()</p>
<p>running = 1<br />
def quit():<br />
    global running<br />
    running = 0</p>
<p>app.exit_key_handler=quit<br />
app.title = u"O controle"<br />
app.screen = 'full'   # or 'normal', 'large'</p>
<p>def getdata(im, bpp=24):<br />
    import struct, zlib<br />
    im.save('D:\\pixels.png', bpp=bpp, compression='no')<br />
    f = open('D:\\pixels.png', 'rb')<br />
    f.seek(8 +8+13+4)<br />
    chunk = []<br />
    while 1:<br />
        n = struct.unpack('>L', f.read(4))[0]<br />
        if n==0: break  # 'IEND' chunk<br />
        f.read(4) # 'IDAT'<br />
        chunk.append(f.read(n))<br />
        f.read(4)   # CRC<br />
    f.close()<br />
    return zlib.decompress(''.join(chunk))  # '\x00' prefix each line</p>
<p>X = 80<br />
Y = 60<br />
while running:<br />
    if X < 0: X = 0<br />
    if Y< 0: Y = 0<br />
    if X > 160 - 30: X = 160 - 30<br />
    if Y > 120 - 30: Y = 120-30<br />
    im = camera.take_photo('RGB', (160,120))<br />
    im.rectangle([(X,Y),(X+30,Y+30)], 0xff0000)   # red outline<br />
    # check hot spot whether active<br />
    box = Image.new((30,30), 'L')  # gray scale<br />
    box.blit(im, (X,Y,X+30,Y+30))<br />
    data = getdata(box, 8)</p>
<p>    # check black<br />
    for i in range(len(data)):<br />
        if ord(data[i]) < 30 and ord(data[i]) > 0:<br />
            X += i%31 - 15<br />
            Y += int(i/31) - 15<br />
            break<br />
        # Posso passar de 3 em 3 pixels. O código fica mais rápido e a perda<br />
        # de precisão é insignificante<br />
        i = i + 2</p>
<p>    c.blit(im, (0,0), (8,12))   # show camera</p>
<p>    #miso.reset_inactivity_time()</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/12/03/smartphones-aonde-podemos-parar/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Python for S60&#8230; Programar celulares nunca foi tão fácil!</title>
		<link>http://www.danilocesar.com/blog/2006/01/25/phyton-for-s60-programar-celulares-nunca-foi-tao-facil/</link>
		<comments>http://www.danilocesar.com/blog/2006/01/25/phyton-for-s60-programar-celulares-nunca-foi-tao-facil/#comments</comments>
		<pubDate>Wed, 25 Jan 2006 23:26:29 +0000</pubDate>
		<dc:creator>Danilo Cesar</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.danilocesar.com/blog/?p=17</guid>
		<description><![CDATA[A alguns dias atrás estava procurando outros métodos de programação para celulares&#8230; Eu já conhecia o famoso J2ME (JAVA micro edition), também já conhecia o Native Symbian C++. Mas procurava algo mais dinâmico&#8230; Mais prático&#8230;. Numa viagem que fiz pra londrina, brincando com meu celular (Nokia 6600) começei a pensar em como seria útil uma [...]]]></description>
			<content:encoded><![CDATA[<p>A alguns dias atrás estava procurando outros métodos de programação para celulares&#8230; </p>
<p> Eu já conhecia o famoso J2ME (JAVA micro edition), também já conhecia o Native Symbian C++. Mas procurava algo mais dinâmico&#8230; Mais prático&#8230;.<br />
<br />Numa viagem que fiz pra londrina, brincando com meu celular (Nokia 6600) começei a pensar em como seria útil uma linguagem rodando por script, pra realizar tarefas simples, como por exemplo o BASH no linux&#8230;.. Foi ai que eu conheci o <a href="http://opensource.nokia.com/projects/pythonfors60">Python for S60</a>.</p>
<p> Pra começar: Porque Python?<br />
<strong> Pythonis a simple, consistent and effective programming language.</strong> [Manual Getting Started With Pyton]</p>
<p><span id="more-17"></span></p>
<h3>Algumas coisas interessantes antes de começar</h3>
<p>Python for S60 tem algumas peculiaridades interessantes. Dentre todas, quero citar algumas:</p>
<ul>
<li>Instalação simplificada</li>
<li>Possibilidade de programar diretamente no celular</li>
<li>Possibilidade de instalar bibliotecas</li>
<li>Construir aplicações gráficas</li>
<li>Acessar arquivos do cartão de memória/ ou memória do telefone</li>
<li>Construir aplicativos com tecnologia bluetooth</li>
<li>Acessar câmera</li>
<li>SMS</li>
<li>Lista telefônica</li>
</ul>
<p>Como deu pra perceber, é possível construir um número infinito de aplicativos utilizando esta tecnologia.</p>
<h3>Requisitos</h3>
<p><em>Celular Nokia com Symbian S60 ou superior.<br />
Quer saber se seu celular é um S60? Visite a página <a href="http://www.forum.nokia.com/main/1,,150,00.html?page=3&#038;matrixType=s60" target="_blank">http://www.forum.nokia.com/main/1,,150,00.html?page=3&#038;matrixType=s60</a>, mas para ajuda-lo vou colocar aqui os exemplos mais &#8220;pops&#8221;: 6600 3600 7650 N-Gage 6670 6630 7610 N71  E70 entre outros&#8230;</p>
<p>Um computador&#8230; Pois o download do interpretador Symbian para o celular está geralmente em um arquivo .zip. É necessário descompactar o arquivo e instalar o .sys via Pc Suite. Você pode fazer o download dele pelo link <a href="http://www.forum.nokia.com/python">http://www.forum.nokia.com/python</a></p>
<p>E um editorzinho de texto. Seja no computador ou no celular&#8230;.. No PC serve até o notepad, no celular eu gosto de usar o Yedit ou o Notepad. Você pode fazer o download de ambos no <a target="_blank" href="http://symbianbrasil.com">symbianbrasil.com</a></em></p>
<h3>Chega de lenga-lenga! Quero ver funcionar.</h3>
<p>Vamos escrever nosso primeiro script em Python. Será algo extremamente complexo e cansativo. Vamos construir o nosso primeiro &#8220;Hello World&#8221;.<br />
O código será o seguinte:</p>
<p><code lang="python"><br />
print "Hello World"<br />
</code></p>
<p>Só isso? Sim, só isso!<br />
Igualzinho ao nosso bom e velho Python na linha de comando. Para um Hellow World gráfico, o código ficaria:</p>
<p><code lang="python"><br />
import appuifw<br />
appuifw.app.title = u"Hello World"<br />
appuifw.note(u"Hello World", 'info')<br />
</code></p>
<p><center><br />
<img id="image18" src="http://www.danilocesar.com/blog/wp-content/uploads/2006/01/Screenshot0005.jpg" alt="Phyton_hello_world" /><br />
</center></p>
<p>Para rodar o aplicativo, basta renomea-lo para arquivo.py e envia-lo ao celular. Quando o arquivo for executado, o interpretador já saberá que o programa que o executa é o Python.</p>
<h3>Finalizando</h3>
<p>Não quero me extender demais. O básico está ai.<br />
No arquivo de download do Python for S60 tem vários exemplos, PDFs explicativos, entre várias outras coisas.<br />
Breve coloco aqui mais informações, fontes,  e comentários sobre esta linguagem!</p>
<p>Escrevi este POST apenas porque creio que várias outras pessoas além de mim, também já quiseram/pensaram em desenvolver aplicativos de uma forma mais rápida e mais fácil do que java e native symbiam.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danilocesar.com/blog/2006/01/25/phyton-for-s60-programar-celulares-nunca-foi-tao-facil/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
