Jan 25
MiniCurso: Introdução a Python
Posted by Flávio Ribeiro in Programação, Python on 01 25th, 2009| icon31 Comment »

Olá,

Aqui vão os slides do minicurso de introdução a linguagem de programação Python que ministrei na Avaty!, empresa voltada para soluções em mobilidade e sistemas embarcados (e que usa python em uma de suas soluções) na qual estou trabalhando no momento.

Os slides estão disponiveis para download aqui também, e espero que gostem. :)

Jan 14
Extendendo Python com C
Posted by Flávio Ribeiro in Programação, Python on 01 14th, 2009| icon39 Comments »

Aqui estou novamente, agora tentando mostrar pra vocês como fazer C conversar com Python. Ao invés de explicar passo a passo como fazer e repetir um monte de documentação que já está no oráculo google, vou simplesmente colar um exemplo com algumas funções e comentários.

Esse exemplo pode servir como template pra o que você está tentando fazer.

Primeiro abra um arquivo chamado avatymodule.c. É convenção sempre usar o nome ‘module’ depois do real nome do módulo. Se você for chamar o módulo de tuxcool, o nome do arquivo deverá ser tuxcoolmodule.c.

Abaixo vai o código do avatymodule.c com alguns comentários:

  1. #include "Python.h"
  2. // Assinatura do nosso modulo
  3. void initavaty(void);
  4. // Função principal que embute o python dentro do C.
  5. main(int argc, char **argv) {
  6. // Inicializa o Interpretador python embutido
  7. Py_Initialize();
  8. // Adiciona o nosso modulo
  9. initavaty();
  10. // Sai do interpretador embutido.
  11. Py_Exit(0);
  12. }
  13. /*
  14. Aqui vão as funções do nosso módulo. Todas que fiz seguiram um modelo.
  15. */
  16. /*
  17. Note que o nome da função sempre vem com [NOME_DO_MODULO]_[NOME_DA_FUNCAO].
  18. Esse metodo apenas da um 'hello world' usando o printf e o print do python.
  19. */
  20. static PyObject *avaty_hello_world(PyObject *self, PyObject* args)
  21. {
  22. printf("[C] Opa, aqui eh C, e usei o printf.\n");
  23. PyRun_SimpleString("import time\n");
  24. PyRun_SimpleString("print '[Py] Aqui eh Python:',time.time()");
  25. printf("\n[C] Aqui é C também.\n");
  26. return Py_None;
  27. }
  28. static PyObject *avaty_argumento_numeros(PyObject *self, PyObject* args)
  29. {
  30. long numero1, numero2, soma;
  31. /* A função PyArg_ParseTuple() é responsável pela transição de argumentos
  32. das funções em python para tipos C.
  33. */
  34. if (!PyArg_ParseTuple(args, "ll:addi", &numero1, &numero2)) {
  35. return NULL;
  36. }
  37. // Note que já trato numero1 e numero2 como long C.
  38. printf("[C] Primeiro Argumento: %d\n",numero1);
  39. printf("[C] Segundo Argumento: %d\n",numero2);
  40. soma = numero1 + numero2;
  41. // Transformando e retornando o resultado da soma em um long Python.
  42. return PyLong_FromUnsignedLong(soma);
  43. }
  44. static PyObject *avaty_argumento_string(PyObject *self, PyObject* args)
  45. {
  46. char *str1, str2[15] = "str_c";
  47. if (!PyArg_ParseTuple(args, "s:addi", &str1)) {
  48. return NULL;
  49. }
  50. printf("[C] Recebido array de caracteres: %s\n",str1);
  51. printf("[C] Contatenacao usando strcat() com: %s\n",str2);
  52. strcat(str2, str1);
  53. printf("[C] Retornando resultado pra objeto string python: %s\n",str2);
  54. return PyString_FromString(str2);
  55. }
  56. /*
  57. Aqui vai uma estrutura com todas as funções dos módulos. Observe que é convenção usar
  58. o nome da função python igual a função C.
  59. */
  60. static PyMethodDef avaty_methods[] = {
  61. {"hello_world",avaty_hello_world,METH_NOARGS, "Documentação do hello world!"},
  62. {"argumento_numeros",avaty_argumento_numeros,METH_VARARGS, "Documentação do argumento_numeros"},
  63. {"argumento_string",avaty_argumento_string,METH_VARARGS, "Documentação do argumento_numeros"},
  64. {NULL, NULL} //sentinela
  65. };
  66. /*
  67. Função para importar o módulo dentro do interpretador embutido, que foi inicializado no main.
  68. */
  69. void initavaty(void)
  70. {
  71. PyImport_AddModule("avaty");
  72. Py_InitModule("avaty", avaty_methods);
  73. }
  74.  

Calma, calma. Eu sei que o highlight ficou uma bosta e você não tá conseguindo entender nada. Coloquei o código aqui no pastebin.com e aqui pra você baixar também.

Agora, tudo que você precisa fazer é gerar um script de build, que nesse exemplo chamarei de buildscript.py (gostou do nome? :) )

flavio@avaty:~/dev/bindings$ cat buildscript.py
from distutils.core import setup, Extension

setup(name=”avaty”, version=”1.0″, ext_modules=[Extension("avaty", ["avatymodule.c"])])

flavio@avaty:~/dev/bindings$

Pronto, agora é só dar:

flavio@avaty:~/dev/bindings$ python buildscript.py build_ext -i
running build_ext
building ‘avaty’ extension
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-i686-2.5/avatymodule.o -o avaty.so
flavio@avaty:~/dev/bindings$ file avaty.so
avaty.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

Note que um avaty.so vai ter sido criado. Agora é só experimentar se o negócio funcionou mesmo:

flavio@avaty:~/dev/bindings$ python
Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import avaty
>>> dir(avaty)
['__doc__', '__file__', '__name__', 'argumento_numeros', 'argumento_string', 'hello_world']
>>> avaty.hello_world()
[C] Opa, aqui eh C, e usei o printf.
[Py] Aqui eh Python: 1231955166.34

[C] Aqui é C também.
>>> avaty.argumento_numeros(4,30)
[C] Primeiro Argumento: 4
[C] Segundo Argumento: 30
34L
>>> retorno = avaty.argumento_string(”_to_py”)
[C] Recebido array de caracteres: _to_py
[C] Contatenacao usando strcat() com: str_c
[C] Retornando resultado pra objeto string python: str_c_to_py
>>> print retorno
str_c_to_py
>>> print type(retorno)
<type ’str’>
>>>

Ainda preciso olhar melhor o argumento format da função PyArg_ParseTuple() mas acredito que o conteúdo desse post já serve como pontapé inicial pra muita gente. :)

Pra finalizar, indico a leitura da Python/C API, pra facilitar no uso de funções de transformação de valores C <-> Python.

UPDATE: O link pra download do modulo agora funciona. :)

Jan 12
Arduino, agora tenho um!
Posted by Flávio Ribeiro in Eletrônica, Programação, Sistemas Embarcados on 01 12th, 2009| icon35 Comments »

Olá pessoas!

Para iniciar o ano com o pé direito irei escrever sobre o presente de aniversário que me dei, um Arduino Duemilanove! Ele chegou já tem uns dias, mas como pedi junto com um amigo e a encomenda chegou lá só pude pegar hoje.

Já haviamos comentado sobre essa plataforma, e inclusive o trabalho final da disciplina de Arquitetura de Computadores - sim, esse dirigivel que estou escrevendo aqui no blog e ainda estou devendo 2 posts - motivou a gente ainda mais a entrar nesse mundo da eletrônica, que, por enquanto, é apenas um hobby.

Entramos em uma lista de discussão de pessoas que estão se divertindo com eletrônica e principalmente com arduino chamada hardhacking e lá vimos uma thread que indicava uma loja pra comprar o duemilanove. Compramos e em cerca de 10~15 dias o arduino já estava na casa do meu amigo.

Esse é meu arduino, em minhas mãos :)

Só não gostei de uma coisa, não vieram cabos (de alimentação e USB) e apesar do ambiente ser facilmente baixado na internet, eu ia ficar feliz se viesse um cdzinho personalizado :-) Tive que ir agora no Manaíra Shopping e comprei um USB da Clone por apenas R$3,00.

Sobre valores, os dois duemilanove ficaram por $58,80 e o frete ficou por $7.20. Não tivemos problemas com alfândega e etc.

Agora é ter idéias legais pra brincar com ele. Inicialmente vou tentar usar o módulo sonar da tato que compramos pra o dirigível e não conseguimos “regular” ele direitinho. Pelo pouco que vi, o A\D do arduino é bem abstraído e funciona muito bem, ou seja, as coisas ficarão mais faceis com o sonar.

Misturando arduino com sonar pode até sair algum robôzinho de sumô, ou um que desvia de obstáculos..

PS: Só pra deixar registrado, o módulo sonar da tato não tem datasheet e o ’suporte’ que me deram não valeu de nada.  :P