<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Diego Manenti Martins' blog</title>
    <updated>2012-04-23T22:12:04Z</updated>
    <id>http://dmmartins.appspot.com/</id>
    <icon>http://dmmartins.appspot.com/favicon.ico</icon>
    <link rel="alternate" href="http://dmmartins.appspot.com/" title="Diego Manenti Martins' blog" type="text/html"/>
    <link rel="self" href="http://dmmartins.appspot.com/blog/feed" title="Diego Manenti Martins' blog" type="application/atom+xml"/>
    <author><name>Diego Manenti Martins</name></author>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/installing-mod_wsgi-against-python-26-on-mac-osx-107-lion</id>
      <title>Installing mod_wsgi against Python 2.6 on Mac OSX 10.7 (Lion)</title>
      <link href="http://dmmartins.appspot.com/blog/installing-mod_wsgi-against-python-26-on-mac-osx-107-lion" rel="alternate" type="text/html"/>
      <updated>2012-04-23T22:10:53Z</updated>
      <published>2012-04-23T22:01:12Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;If you want to install &lt;a href=&quot;http://code.google.com/p/modwsgi/&quot;&gt;mod_wsgi&lt;/a&gt; on Mac OSX against Python 2.6.7 (default install) the switch &lt;code&gt;--with-python=/usr/bin/python2.6&lt;/code&gt; is not enough.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./configure --with-python=/usr/bin/python2.6
checking for apxs2... no
checking for apxs... /usr/sbin/apxs
checking Apache version... 2.2.21
configure: creating ./config.status
config.status: creating Makefile
$ make
/usr/sbin/apxs -c -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6
-DENABLE_DTRACE -DMACOSX -DNDEBUG -DNDEBUG -DENABLE_DTRACE  
-Wc,&#39;-arch x86_64&#39; -Wc,&#39;-arch i386&#39; mod_wsgi.c -Wl,-F/System/Library/Frameworks -framework Python
-u _PyMac_Error /System/Library/Frameworks/  -arch x86_64 -arch i386 -ldl  -framework CoreFoundation
/usr/share/apr-1/build-1/libtool --silent --mode=compile gcc    -DDARWIN
-DSIGPROCMASK_SETS_THREAD_MASK -I/usr/local/include -I/usr/include/apache2 
-I/usr/include/apr-1   -I/usr/include/apr-1  -arch x86_64 -arch i386
-I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6
-DENABLE_DTRACE -DMACOSX -DNDEBUG -DNDEBUG -DENABLE_DTRACE  -c -o mod_wsgi.lo mod_wsgi.c &amp;amp;&amp;amp; touch mod_wsgi.slo
/usr/share/apr-1/build-1/libtool --silent --mode=link gcc -o mod_wsgi.la  -rpath /usr/libexec/apache2
-module -avoid-version    mod_wsgi.lo -Wl,-F/System/Library/Frameworks -framework Python
-u _PyMac_Error /System/Library/Frameworks/ -arch x86_64 -arch i386 -ldl -framework CoreFoundation
warning: no debug symbols in executable (-arch x86_64)
warning: no debug symbols in executable (-arch i386)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As we can check with &lt;code&gt;otool&lt;/code&gt; it was built against Python 2.7:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ otool -L .libs/mod_wsgi.so
.libs/mod_wsgi.so:
/System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.1)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
(compatibility version 150.0.0, current version 635.19.0)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To build it for Python 2.6 you have to pass also the command &lt;code&gt;--disable-framework&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ./configure --with-python=/usr/bin/python2.6 --disable-framework
checking for apxs2... no
checking for apxs... /usr/sbin/apxs
checking Apache version... 2.2.21
configure: creating ./config.status
config.status: creating Makefile
$ make
/usr/sbin/apxs -c -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6
-DENABLE_DTRACE -DMACOSX -DNDEBUG -DNDEBUG -DENABLE_DTRACE  -Wc,&#39;-arch x86_64&#39; -Wc,&#39;-arch i386&#39; mod_wsgi.c
-L/System/Library/Frameworks/Python.framework/Versions/2.6/lib
-L/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config 
-arch x86_64 -arch i386 -lpython2.6 -ldl  -framework CoreFoundation 
/usr/share/apr-1/build-1/libtool --silent --mode=compile gcc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK
-I/usr/local/include -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -arch x86_64
-arch i386 -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6
-DENABLE_DTRACE -DMACOSX -DNDEBUG -DNDEBUG -DENABLE_DTRACE  -c -o mod_wsgi.lo
mod_wsgi.c &amp;amp;&amp;amp; touch mod_wsgi.slo
/usr/share/apr-1/build-1/libtool --silent --mode=link gcc -o mod_wsgi.la  -rpath /usr/libexec/apache2
-module -avoid-version    mod_wsgi.lo -L/System/Library/Frameworks/Python.framework/Versions/2.6/lib
-L/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config -arch x86_64
-arch i386 -lpython2.6 -ldl -framework CoreFoundation
warning: no debug symbols in executable (-arch x86_64)
warning: no debug symbols in executable (-arch i386)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now it&#39;s compiled for Python 2.6:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ otool -L .libs/mod_wsgi.so
.libs/mod_wsgi.so:
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.7)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
(compatibility version 150.0.0, current version 635.19.0)
&lt;/code&gt;&lt;/pre&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;python&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;mod_wsgi&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;mac&quot; /&gt;
      
    </entry>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/speeding-up-image-resizing-with-python-and-pil</id>
      <title>Speeding up image resizing with Python and PIL</title>
      <link href="http://dmmartins.appspot.com/blog/speeding-up-image-resizing-with-python-and-pil" rel="alternate" type="text/html"/>
      <updated>2012-04-13T20:01:32Z</updated>
      <published>2012-04-13T19:43:41Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;Resizing images some times can take a lot of time when dealing with large files.
If you are using &lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;PIL&lt;/a&gt; (although I think this should work with other image libraries too), you can do a &quot;two passes&quot; resize, first with the faster algorithm and the second with the best quality algorithm, increases significantly the operation speed.&lt;/p&gt;

&lt;p&gt;For example, lets convert a 30MB image, resizing it to 800x600 pixels. First we convert it to the double of the target size using the fastest algorithm, then we convert the result to the target size using the ANTIALIAS filter.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import Image
&amp;gt;&amp;gt;&amp;gt; import datetime
&amp;gt;&amp;gt;&amp;gt; im = Image.open(&#39;bigimage.png&#39;)
&amp;gt;&amp;gt;&amp;gt; start=datetime.datetime.now();\
... im.thumbnail((1600, 1200));\
... im.thumbnail((800, 600), Image.ANTIALIAS);\
... print &#39;%d seconds&#39; % (datetime.datetime.now() - start).seconds
6 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Convert the image directly to the target size increases the time.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; im = Image.open(&#39;bigimage.png&#39;)
&amp;gt;&amp;gt;&amp;gt; start=datetime.datetime.now();\
... im.thumbnail((800, 600), Image.ANTIALIAS);\
... print &#39;%d seconds&#39; % (datetime.datetime.now() - start).seconds
28 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It takes about 4x more time!
Six seconds is not a good time yet if you want to resize it on a web application but it&#39;s far better than 28 seconds.&lt;/p&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;python&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;PIL&quot; /&gt;
      
    </entry>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/pil-e-libjpeg-no-snow-leopard-mac-os-x-106</id>
      <title>PIL e libjpeg no Snow Leopard (Mac OS X 10.6)</title>
      <link href="http://dmmartins.appspot.com/blog/pil-e-libjpeg-no-snow-leopard-mac-os-x-106" rel="alternate" type="text/html"/>
      <updated>2012-04-23T22:12:04Z</updated>
      <published>2010-12-18T00:06:20Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;Tentando instalar a Python Imaging Library (&lt;a href=&quot;http://www.pythonware.com/products/pil/&quot;&gt;PIL&lt;/a&gt;) no Mac OS X 10.6 obtia o seguinte erro:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Symbol not found: _jpeg_resync_to_restart
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois de pesquisar um pouco e não achar nada que resolvesse o problema, resolvi tentar compilar a &lt;a href=&quot;http://www.ijg.org/&quot;&gt;libjpeg&lt;/a&gt; para x86_64.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ CC=&quot;gcc -arch x86_64&quot; ./configure --enable-static --enable-shared
$ make
$ sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois é só instalar a PIL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python setup.py build
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Verifique se o suporte a JPEG foi habilitado, então:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo python setup.py install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Utilizei a versão padrão do python no sistema (2.6), &lt;a href=&quot;http://www.ijg.org/files/jpegsrc.v8b.tar.gz&quot;&gt;libjpeg 8b&lt;/a&gt; e &lt;a href=&quot;http://effbot.org/downloads/Imaging-1.1.7.tar.gz&quot;&gt;PIL 1.1.7&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Agora tudo funcionando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ python
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import PIL
&amp;gt;&amp;gt;&amp;gt; import Image
&amp;gt;&amp;gt;&amp;gt; import _imaging
&amp;gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;python&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;PIL&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;mac&quot; /&gt;
      
    </entry>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/dosbox</id>
      <title>DOSBox</title>
      <link href="http://dmmartins.appspot.com/blog/dosbox" rel="alternate" type="text/html"/>
      <updated>2010-04-29T05:30:05Z</updated>
      <published>2010-04-12T12:42:57Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;Descobri o &lt;a href=&quot;http://www.dosbox.com&quot;&gt;DOSBox&lt;/a&gt; quando precisei rodar um programa em modo DOS no
Windows Vista e descobri que este não suporta console DOS fullscreen.&lt;/p&gt;

&lt;p&gt;Funciona bem, inclusive com o conversor USB/Serial, já que o programa que eu
precisava rodar usa a porta serial para enviar dados para um CNC.&lt;/p&gt;

&lt;p&gt;Para quem, em 2010, ainda precisa usar softwares mal feitos em DOS é uma mão
na roda.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.dosbox.com&quot;&gt;http://www.dosbox.com&lt;/a&gt;&lt;/p&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;DOSBox&quot; /&gt;
      
    </entry>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/arduino-e-lcd</id>
      <title>Arduino e LCD</title>
      <link href="http://dmmartins.appspot.com/blog/arduino-e-lcd" rel="alternate" type="text/html"/>
      <updated>2011-07-13T22:48:36Z</updated>
      <published>2010-04-12T11:01:21Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;Depois de botar pra funcionar meu &lt;a href=&quot;http://dmmartins.appspot.com/blog/arduino-feito-em-casa&quot;&gt;arduino feito em casa&lt;/a&gt; abri o exemplo da biblioteca LiquidCrystal, que vem na instalação padrão do arduino.&lt;/p&gt;

&lt;p&gt;A utilização da biblioteca é bem simples, basta indicar os pinos RS, RW, EN e os pinos de dados. Pode ser utilizado o controle em 4 bits e 8 bits.&lt;/p&gt;

&lt;p&gt;Liguei os pinos do LCD no arduino, configurado para controle com 4 bits, baixei o programa e … não funionou! Azarado.&lt;/p&gt;

&lt;p&gt;Verifiquei as ligações, tudo certo. Resetei a placa algumas vezes e o tal do
&#39;hello, world!&#39; apareceu.&lt;/p&gt;

&lt;p&gt;Olhando o código da LiquidCrystal, vi que faltavam alguns comandos de inicialização para o controlador do display (HD44780). Deixei uma mensagem no forum Bugs &amp;amp; Sugestions mas não teve nenhuma resposta.&lt;/p&gt;

&lt;p&gt;Resolvi os problemas de inicialização do LCD e coloquei o código em &lt;a href=&quot;http://code.google.com/p/arduinolcd/&quot;&gt;http://code.google.com/p/arduinolcd/&lt;/a&gt;. Para utilizar baixe o arquivo ZIP, descompacte e copie a pasta &#39;HD47660′ para a pasta &#39;hardware/libraries/&#39; da instalação do Arduino.&lt;/p&gt;

&lt;p&gt;Depois de instalada a biblioteca, vamos aos exemplos.&lt;/p&gt;

&lt;p&gt;Abra o exempl HelloWorld em &#39;File&gt;Sketchbook&gt;Examples&gt;Library&gt;HD44780&amp;gt;HelloWorld&#39;,  baixe para a placa, …&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://lh5.googleusercontent.com/-R2zdJ4R5OBQ/Th4f1t0cjRI/AAAAAAAAAQg/Msb2DJBNc7c/s640/23-03-09_1613.jpg&quot; alt=&quot;HD44780&quot; title=&quot;HD44780&quot; /&gt;&lt;/p&gt;

&lt;p&gt;… agora sim. :)&lt;/p&gt;

&lt;p&gt;O exemplo SerialDisplay também funcionou. Demorei um pouco pra testar pois não tinha achado ainda um cristal de 16 MHz e queria também testar a porta serial. Como moro em Santa Catarina e longe da capital, não é muito fácil encontrar componentes eletrônicos por aqui. Não estava disposto a pagar mais pelo frete que pelo componente  e não tinha nenhuma compra em vista para incluir alguns cristais. Achei em uma placa &lt;a href=&quot;http://www.evbplus.com/minidragonplus_hc12_68hc12_9s12_hcs12.html&quot;&gt;MiniDrangon&lt;/a&gt; que tenho aqui e agora posso testar as bibliotecas corretamente (as que utilizam temporização e porta serial).&lt;/p&gt;

&lt;p&gt;Estou esperando chegar os fios para wire wrap para montar a placa ethernet e ver o que dá pra fazer com o Arduino na rede.&lt;/p&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;arduino&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;embedded&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;lcd&quot; /&gt;
      
    </entry>
  
    <entry>
      <id>http://dmmartins.appspot.com/blog/arduino-feito-em-casa</id>
      <title>Arduino feito em casa</title>
      <link href="http://dmmartins.appspot.com/blog/arduino-feito-em-casa" rel="alternate" type="text/html"/>
      <updated>2010-04-30T00:06:40Z</updated>
      <published>2010-04-09T20:35:32Z</published>
      <content type="xhtml" xml:base="http://dmmartins.appspot.com/">
        <div xmlns="http://www.w3.org/1999/xhtml">
          &lt;p&gt;Há algum tempo estava querendo testar o Arduino, pelo menos descobrir o que era e por que chamava tanto a atenção do pessoal.&lt;/p&gt;

&lt;p&gt;Depois de descobrir do que se tratava, a vontade de testar passou um pouco, não comprei um arduino pronto, pois mesmo o preço não sendo muito alto lá fora, com os impostos de importação  mais o frete acaba ficando um preço bem alto por uma placa tão simples.&lt;/p&gt;

&lt;h2&gt;Montagem&lt;/h2&gt;

&lt;p&gt;Decidi montar meu próprio arduino. Tinha um Atmega8 sobrando, uma placa padrão para montagem do circuito e o resto é regulador de tensão, alguns resistores e um max232 para comunicação serial (no arduino oficial usa apenas alguns transistores, mas eu prefiro soldar um max232 :). Ah, acrescentei um display LCD e algumas chaves que também tinha à disposição.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4057/4506349866_54a6d0253b.jpg&quot; alt=&quot;componentes&quot; title=&quot;Componentes utilizados para montagem do Arduino.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Depois de algumas horas soldando, cortando fios, resoldando, mudando componentes de lugar, surge o Arduino:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4049/4506400040_b022d88bcc.jpg&quot; alt=&quot;frente&quot; title=&quot;A parte &amp;quot;bonita&amp;quot;.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;E o trabalho sujo:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4002/4506384462_5e87dd23ce.jpg&quot; alt=&quot;13-03-09_0013&quot; title=&quot;A parte feia.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As fotos ficaram bem ruins, estava sem câmera e utilizei a do celular. Mas dá pra ter uma idéia do trabalho.&lt;/p&gt;

&lt;h2&gt;Problemas&lt;/h2&gt;

&lt;p&gt;Depois de montado, o primeiro problema. Eu não tinha um cristal de 16Mhz. No lugar dele, usei um de 12Mhz, mas o arquivo hex do bootloader não funcionaria. Tudo bem, só recompilar, certo? Errado!&lt;/p&gt;

&lt;p&gt;Já tinha o avr-gcc instalado, tinha o código fonte, botei pra compilar e:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;../../avr/bin/ld.exe: address 0x205e of ATmegaBOOT.elf section .text is not with in region text

make: *** [ATmegaBOOT.elf] Error 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isto é,  o arquivo bootloader ultrapassava a memória do arduino. Pesquisei em alguns fóruns e vi que era culpa da versão mais nova do gcc que gerava arquivos maiores. Resolvi utilizar o gcc que vem no arduino e descobri que era a mesma versão que eu tinha instalado.&lt;/p&gt;

&lt;p&gt;Mais algumas pesquisas e resolvi mudando uma linha do Makefile. Onde tem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;OPTIMIZE = -Os
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Substituí por:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;OPTIMIZE = -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \

    -ffunction-sections -fdata-sections -fno-split-wide-types -Wl,--relax \

    -fno-inline-small-functions -mcall-prologues
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Resolvido o problema, funcionou o bootloader e comecei a brincadeira, que contarei outra hora.&lt;/p&gt;

&lt;h2&gt;Conclusão&lt;/h2&gt;

&lt;p&gt;Confesso que tinha um certo preconceito contra o Arduino. Depois de mexer um pouco com ele, descobri que a brincadeira é bem divertida.&lt;/p&gt;

&lt;p&gt;Uma coisa interessante no Arduino, é que as bibliotecas são escritas em C++, pelo menos as que dei uma olhada. Nos meus projetos microcontrolados, uso sempre C e, quando não tem outra saída, assembly.  Usar orientação a objetos, mesmo que minimamente, parece interessante.&lt;/p&gt;

        </div>
      </content>
      
      &lt;category term=&quot;user-tag&quot; label=&quot;arduino&quot; /&gt;
      
      &lt;category term=&quot;user-tag&quot; label=&quot;embedded&quot; /&gt;
      
    </entry>
  
</feed>

