Slackpkg Notifier

A algum tempo atrás fiz um programinha que mantém um icone na systray para notificar se havia alguma atualização para o Slackware. Feito em python e pyGTK usando o código do wicd como base ele funciona em usermode e fica bonitinho no XFCE. Coloquei o código no github para algum interessado. :)

Repositório: https://github.com/guax/slackpkg-notifier

De volta ao ar

Depois de uma semana e meia resolvi colocar as coisas devolta no ar.

Muito obrigado a pessoa especial que mija colorido que me forçou a tirar o blog no ar explorando uma vulnerabilidade do wordpress. Deus te ama meu filho.

SOAP vs. REST

SOAP:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 299

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header>
  </soap:Header>
  <soap:Body>
    <m:GetStockPrice xmlns:m="http://www.example.org/stock">
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>

REST:

GET /stocks/getPrice?stockname=IBM HTTP/1.1
Host: www.example.org

Importante: eu sei que são coisas diferentes. Mas ainda assim a comparação é interessante. O ponto é: SOAP é complexo demais, grande demais e feio demais para a maioria das aplicações.

Bug na compilação do Asterisk no Slackware 13.1+

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: undefined symbol: cap_set_proc

Apesar da compilação ser feita com sucesso por conta do link ser feito no binário “asterisk” 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.

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:

        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)

Caso não tenha dado certo o resultado será semelhante a:

        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)

Eu confesso. Eu pogo.

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 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.

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 “magia negra”, 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.

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 “gambiarras” 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.

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.

Enrolando…

Até tenho coisas legais que gostaria de escrever para colocar aqui, mas como o tempo anda curto fica aqui dois vídeos inúteis no lugar.

Troll Arruda

Depois do debate da Band entre os candidatos a presidente eu percebi que o comportamento e aparência de um deles era muito semelhante a um famoso personagem da internet :P

Troll Arruda

Esse sorriso nunca me enganou.

Tempos sem postar nada por que as férias estavam boas.

Sem omelete não se faz ovos

Já dizia o grande comentarista Galvão Bueno.

Ele nunca me enganou com essa carinha. aeuheuahue

Bubble para quotes do twitter

Meus quotes do twitter no blog nunca mais serão os mesmos :D

♻ @microcontoscos  Alô vc q está assistindo a Copa no seu MP15 comprado no camelódromo. Torça pelo Paraguai, pelo menos por gratidão.

CSS devidamente kibado daqui.

SVN Branching e Manutenção

É comum não compreender como funciona o conceito de branching em um repositório SVN, fiz um diagrama para exemplificar como funciona o branching para manutenção de uma versão antiga de software em um repositório SVN. Sintam-se a vontade para editar/imprimir redistribuir ou qualquer coisa.

SVN Branching

Você pode baixar a versão para impressão 300 DPI A4 landscape Abaixo

Você pode editar o SVG original (gziped) usando o Inkscape. Ou a versão para impressão.