<?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>Guax &#187; desenvolvimento</title>
	<atom:link href="http://www.guax.net/category/desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guax.net/blog</link>
	<description>“…is like having your brains smashed out by a slice of lemon wrapped round a large gold brick.”</description>
	<lastBuildDate>Sun, 22 May 2011 14:22:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Bug na compilação do Asterisk no Slackware 13.1+</title>
		<link>http://www.guax.net/blog/2010/11/bug-na-compilacao-do-asterisk-no-slackware-13-1/</link>
		<comments>http://www.guax.net/blog/2010/11/bug-na-compilacao-do-asterisk-no-slackware-13-1/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 16:17:52 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[slackware]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[gambiarra]]></category>
		<category><![CDATA[linker]]></category>
		<category><![CDATA[sobrinhagem]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=453</guid>
		<description><![CDATA[A alguns dias atrás me debati com um problema na compilação do asterisk nas versões 13.1+ do Slackware Linux. Esse problema era causado por um negligência dos desenvolvedores ao linkar os módulos que fazem uso da libcap que causava o seguinte erro ao carrega-los: [Nov 14 14:05:16] WARNING[3840]: loader.c:433 load_dynamic_module: Error loading module 'res_agi.so': /usr/lib/asterisk/modules/res_agi.so: [...]]]></description>
			<content:encoded><![CDATA[<p>A alguns dias atrás me debati com um problema na compilação do asterisk nas versões 13.1+ do Slackware Linux. Esse problema era causado por um negligência dos desenvolvedores ao linkar os módulos que fazem uso da libcap que causava o seguinte erro ao carrega-los:</p>
<pre>[Nov 14 14:05:16] WARNING[3840]: loader.c:433 load_dynamic_module: Error loading module 'res_agi.so': /usr/lib/asterisk/modules/res_agi.so: undefined symbol: cap_set_proc</pre>
<p>Apesar da compilação ser feita com sucesso por conta do link ser feito no binário &#8220;asterisk&#8221; os módulos não são carregados com sucesso. Com o slackware manteve a biblioteca estática no sistema em /usr/lib/libcap.a e este diretório é procurado antes que o /lib pelo GCC na hora de linkar o problema acaba por ocorrer. O certo seria que na compilação dos módulos que fazem uso da libcap estes fossem linkado com o parâmetro -lcap.</p>
<p>A correção mais rápida, fácil e inelegante desse problema é mover a libcap.a para um diretório temporário fora do caminho do linker, compilar o asterisk e devolver ao seu diretório. Para conferir se o seu binário do asterisk foi linkado corretamente com a biblioteca dinâmica da libcap basta usar o comando ldd /usr/sbin/asterisk, o retorno deverá ser semelhante a:</p>
<pre>
        linux-gate.so.1 =>  (0xffffe000)
        libdl.so.2 => /lib/libdl.so.2 (0xb76f2000)
        libcap.so.2 => /lib/libcap.so.2 (0xb76ed000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb76d4000)
        libtermcap.so.2 => /lib/libtermcap.so.2 (0xb76d0000)
        libm.so.6 => /lib/libm.so.6 (0xb76a9000)
        libresolv.so.2 => /lib/libresolv.so.2 (0xb7692000)
        libc.so.6 => /lib/libc.so.6 (0xb752f000)
        /lib/ld-linux.so.2 (0xb7724000)
        libattr.so.1 => /lib/libattr.so.1 (0xb752a000)
</pre>
<p>Caso não tenha dado certo o resultado será semelhante a:</p>
<pre>
        linux-gate.so.1 =>  (0xffffe000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7797000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb777e000)
        libtermcap.so.2 => /lib/libtermcap.so.2 (0xb777a000)
        libm.so.6 => /lib/libm.so.6 (0xb7754000)
        libresolv.so.2 => /lib/libresolv.so.2 (0xb773c000)
        libc.so.6 => /lib/libc.so.6 (0xb75d9000)
        /lib/ld-linux.so.2 (0xb77b0000)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2010/11/bug-na-compilacao-do-asterisk-no-slackware-13-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eu confesso. Eu pogo.</title>
		<link>http://www.guax.net/blog/2010/10/eu-confesso-eu-pogo/</link>
		<comments>http://www.guax.net/blog/2010/10/eu-confesso-eu-pogo/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 18:27:51 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[Telephony]]></category>
		<category><![CDATA[confissao]]></category>
		<category><![CDATA[pog]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=447</guid>
		<description><![CDATA[Uma anedota de como o Asterisk se transformou de nossa melhor solução para nosso maior problema num período de menos de 2 anos. No começo tudo eram flores, as centrais eram instaladas na mão e configuradas com carinho e atenção digno de um artista brincando com uma tela. Esse foi o primeiro grande problema quando estávamos tentando crescer a [...]]]></description>
			<content:encoded><![CDATA[<p>Uma anedota de como o Asterisk se transformou de nossa melhor solução para nosso maior problema num período de menos de 2 anos.</p>
<p>No começo tudo eram flores, as centrais eram instaladas na mão e configuradas com carinho e atenção digno de um artista brincando com uma tela. Esse foi o primeiro grande problema quando estávamos tentando crescer a base instalada e aumentar a estabilidade ao longo de todos os sistemas, o erro aqui não era do Asterisk, mas nosso em acreditar que ele era um pbx. Não é, o asterisk não é mais do que uma plataforma para a construção de soluções de telefonia. Ele é a base dos PBX e não este em si.</p>
<p>Após criarmos uma visão de produto e implementar tudo aquilo que nos faltava, conseguimos maior estabilidade e sincronismo entre as centrais. Nos batemos então com um problema básico e que já foi fonte de reclamações nesse blog a alguns meses atrás. CDR e Transferências. A arquitetura interna do asterisk não possui uma thread para cada canal de ligação, isso faz com que uma &#8220;magia negra&#8221;, como descrito pelos desenvolvedores, seja necessária para que as transferências sejam possíveis: o maskerading. O fato do plano de discagem do asterisk ser baseado em contexto e não em eventos faz com que as aplicações só possam ser executadas no canal que é dono do fluxo atual da ligação. Isso impede por exemplo que uma gravação seja feita em sua totalidade caso haja uma transferência feita pelo originador da chamada e também impede que o log das ligações seja registrados corretamente no banco de dados.</p>
<p>Nesse ponto, nossa especialidade estava em trabalhar com o Asterisk vanilla usando suas APIs públicas para implementar nossas soluções. Com isso se tornou comum as famigeradas &#8220;gambiarras&#8221; no código e na configuração do Asterisk para que esses problemas fossem contornados. A solução de software que nos permitiu criar toda uma familia de produtos se tornou agora nosso calcanhar de Aquiles pois as limitações delas agora estão se sobressaindo sobre as nossas próprias.</p>
<p>Esse é o ponto onde estou no momento em que escrevi o texto. Agora começa a batalha para correção desses problemas no próprio Asterisk ou na substituição do mesmo por softwares com outra abordagem como o FreeSWITCH.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2010/10/eu-confesso-eu-pogo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Web JSF</title>
		<link>http://www.guax.net/blog/2009/10/visual-web-jsf/</link>
		<comments>http://www.guax.net/blog/2009/10/visual-web-jsf/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 01:07:20 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[facepalm]]></category>
		<category><![CDATA[fail]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Visual Web JSF]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=213</guid>
		<description><![CDATA[Tudo que tenho a dizer sobre o Visual Web JSF está representado nesta imagem:]]></description>
			<content:encoded><![CDATA[<p>Tudo que tenho a dizer sobre o Visual Web JSF está representado nesta imagem:</p>
<div class="wp-caption aligncenter" style="width: 563px"><a href="http://guax.net/img/facepalm.jpg"><img class=" " title="Facepalm" src="http://guax.net/img/facepalm.jpg" alt="Sabe das coisas esse capitão." width="553" height="364" /></a><p class="wp-caption-text">Sabe das coisas esse capitão.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2009/10/visual-web-jsf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magia Negra das Threads em Python</title>
		<link>http://www.guax.net/blog/2009/09/magia-negra-das-threads-em-python/</link>
		<comments>http://www.guax.net/blog/2009/09/magia-negra-das-threads-em-python/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 00:42:56 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=108</guid>
		<description><![CDATA[Certo dia estava eu a pensar sobre a vida o universo e tudo mais e antes que 42 viesse a minha mente foi pedido que eu implementasse um disparador de SMS&#8217;s. Para isso eu precisava fazer disparos simultâneos em X canais gsm. Requisito óbvio: preciso de threads. PHP, a linguagem que usamos para quase tudo [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_130" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.guax.net/wp-content/uploads/2009/09/Python_logo1.png"><img class="size-full wp-image-130" title="Python Threads" src="http://www.guax.net/wp-content/uploads/2009/09/Python_logo1.png" alt="Python Threads" width="400" height="120" /></a><p class="wp-caption-text">Python Threads</p></div>
<p>Certo dia estava eu a pensar sobre a vida o universo e tudo mais e antes que 42 viesse a minha mente foi pedido que eu implementasse um disparador de SMS&#8217;s. Para isso eu precisava fazer disparos simultâneos em X canais gsm. Requisito óbvio: preciso de threads. PHP, a linguagem que usamos para quase tudo na aplicação não tem um suporte bom a threads então fui atrás de outra linguagem para o fazer.</p>
<p><a href="http://www.python.org/">Python</a> atravessou meu caminho e nas minhas brincadeiras com a cobra (ui!) eu apanhei, jesus sabe que eu apanhei dessa pseudo-linguagem medonha e caracu (eu xinguei de coisa pior enquanto era humilhado pela até então ignorância na linguagem). Eu apanhei por que o mau costume de só ter usado <a href="http://java.sun.com/">Java</a> (pausa para uivos e pedras&#8230;.) para trabalhar com threads me deixou preguiçoso e mau acostumado a uma declaração bem mais simples de <strong>sincronismo</strong> entre métodos, bastava um synchronized e tudo estava funcionando.</p>
<p>Python ao contrário de Java não é nada thread-safe. Todas as chamadas simples podem ser desastrosas se mexem com <strong>recursos compartilhados</strong> entre as threads.</p>
<h3>Sincronizando</h3>
<p>Já que a python não é thread-safe temos que assumir essa responsabilidade no lugar da linguagem e sincronizar as chamadas com Locks, Semáforos e afins. Não é o fim do mundo, mas que é chato, é. Se quizermos por exemplo fazer a inserção de dados no banco de dados e ter o resultado disso logo após cada insert devemos sincronizar os inserts e commits já que o componente MySQLdb não faz esse controle para nós.</p>
<pre lang="python">class Inserter(object):
    def __init__(self, lck,db):
        self.lock = lck;
        self.db = db

    def insert(self, insert):
        cursor = self.db.cursor()
        try:
            self.lock.acquire()
            cursor.execute(insert)
            cursor.execute("commit")
        finally:
            self.lock.release()</pre>
<h3>Queue</h3>
<p>Outro componente muito útil quando se utiliza threads são as <strong>Filas</strong>. Filas são fifos (first-in first-out) que enfileiram ações que você gostaria que fossem executadas em paralelo por threads ou que simplesmente sejam executadas em determinada ordem.</p>
<pre lang="python"># Importamos o módulo
from Queue import Queue

def run(self):
        while True:
            try:
                self.lock.acquire();
                if self.fila.empty():
                    break
                item = self.fila.get()
            finally:
                self.lock.release()

            self.printer.imprime(item)</pre>
<p>Uma nota sobre Filas é que não se deve usar um <code>if not queue.empty()</code> e depois tentar dar um <code>queue.get()</code> já que no tempo entre esses dois acessos aos métodos outra thread pode pegar o ultimo elemento. É necessário que você simplesmente pegue o elemento e trate a exceção ou use Lock nessa parte do método.</p>
<p>ps. estranho, mas python implementa LIFO (pilha) no modulo Queue. <img src='http://www.guax.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2009/09/magia-negra-das-threads-em-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

