[jabá] Treinamento Python e Django
Postado por Osvaldo Santana
A Triveos está lançando o seu treinamento de Desenvolvimento Web Ágil com Python e Django e por isso pega carona nesse conceituado blog (que por coincidência é um dos sócios da Triveos) para anunciar este lançamento.
Eu não costumo fazer esse tipo de post (jabá) por aqui mas este é um caso especial por dois motivos: o produto anunciado foi criado pela minha empresa (como eu já havia dito); e porque que até o momento são poucas as empresas que ministram esse curso no Brasil.
Esse treinamento é o primeiro entre muitos que planejamos desenvolver no próximo ano sempre com algumas características:
- treinamentos in-company — isso nos dá mobilidade e permite que o treinamento seja ministrado em qualquer lugar do Brasil e não somente no eixo Rio-São Paulo.
- treinamentos de curta duração — achamos que tecnologias precisam ser simples e que se elas forem realmente simples não seria necessário investir meses num treinamento. O treinamento de Python e Django precisa de 5 dias apenas para ser ministrado com grande tranquilidade para pessoas que já desenvolvem em alguma linguagem OO.
- treinamentos personalizáveis — a linha principal do treinamento é mantida mas algumas modificações podem ser feitas para adequar o treinamento aos requisitos das empresas. Exemplos: dedicar um tempo do treinamento à implantação do Django, apresentar alguma biblioteca Javascript para desenvolvimento de RIAs, ministrar só o módulo Django, etc.
- materiais de qualidade — nada de apostilas contendo só slides impressos. Disponibilização de todo o material usado em aula (Slides, repositório de códigos, etc).
- instrutores qualificados — não posso falar muito mais sobre isso. Sou um dos instrutores :D
Quem tiver interesse no treinamento pode entrar em contato com a gente através do site ou diretamente comigo.
Update: Pessoal, não tinha ficado claro mas, a Triveos só trabalha com treinamentos in-company, ou seja, não temos infra-estrutura para ministrar esse treinamento em nossa empresa. Fazemos isso dentro da sua empresa (ou da empresa onde você trabalha). De qualquer maneira estamos avaliando um modo de atender às demandas que estão surgindo.
[offtopic] Corinthians no Orkut
Postado por Osvaldo Santana
Meus amigos sabem que sou corintiano. Torcedor que acompanha o time, assiste aos jogos (menos no estádio por questões de segurança), veste a camisa e tudo o mais. Também sabem que trabalho com desenvolvimento de software e que sou heavy user de Internet.
Graças a esses contatos na rede fui um dos primeiros brasileiros a receber um convite para participar de um site novo do Google conhecido por “Orkut”. Era uma época onde comíamos dezenas (centenas até) de “donut’s” que não eram entregues aos servidores.
Os primeiros usuários do Orkut no Brasil estavam localizados no Sul (majoritariamente Porto Alegre) e em São Paulo (majoritariamente na Capital). A primeira comunidade que eu criei foi a “Corinthians” quanto só existia a do Internacional e do Grêmio. Sério! As primeiras comunidades de time de futebol do Brasil foram a do Colorado e a do Tricolor Gaúcho. Depois que eu criei a comunidade do Corinthians abriram as porteiras do Orkut (podiamos usá-lo sem convites) e outras comunidades foram criadas.
Como era de se esperar as comunidades do Flamengo e do Corinthians cresceram mais do que as outras. Mas a comunidade do Corinthians, contradizendo certas pesquisas feitas por cariocas, sempre teve mais membros do que a do Flamengo.
Como era de se esperar não demorou muito para começar as pixações. As ferramentas de moderação e de administração de comunidades do Orkut se limitavam à aprovação um a um dos inscritos na comunidade e a exclusão dos baderneiros (sem opção de banir).
A coisa ficou “feia” quando chegamos a 600.000 integrantes e uma média de 300 novos inscritos por *dia*. Todos devidamente moderados somente por mim num processo que me obrigava a visitar perfil por perfil dos novos usuários para ver se o usuário já não estava em outra comunidade de time de futebol (o torcedor entra pra comunidade do seu clube antes de entrar na dos clubes adversários para pixar).
Não dava mais. Eu passava o dia inteiro mexendo só com isso num trabalho não-remunerado (ter uma comunidade desse tamanho, naquela época, não rendia dinheiro algum).
Chegou a hora de tomar algumas medidas: pedir ajuda na moderação e criar regras para lidar com os arruaceiros que chegavam às centenas após um jogo.
Chamei meus amigos corintianos Érico (que torce pro Juventus nas horas vagas) e Márcio Medrado para me ajudar na moderação. Na época só um usuário podia administrar uma comunidade. Criamos o usuário “Gilmar Giovanelli” para essa função e distribuímos a senha entre nós. Esse problema estava resolvido faltava resolver o problema das pixações.
Entrei em contato com os moderadores das comunidades do Flamengo, Palmeiras, Santos e São Paulo pra perguntar a eles como faziam para resolver o problema dos “ataques” e me disseram que lidavam com aquilo caso-a-caso numa hercúlea tarefa de enxugar gelo. Exatamente o que estávamos fazendo.
Conversa vai, conversa vem, sugeri criar regras comunitárias válidas para todas as nossas comunidades. Essas regras eram discutidas na comunidade “Clube dos 13″.
A regra mais importante dizia que quando, por exemplo, um flamenguista invadia a comunidade do Corinthians para tumultuar ele era banido da comunidade do Corinthians e uma solicitação era feita no Clube dos 13 para ele ser banido da comunidade do seu próprio clube. Isso funcionou lindamente por muito tempo. Só não sei se ainda funciona.
Chegamos a 800.000 membros, a segunda maior comunidade da categoria “Sports & Recreations” do Orkut. Só perdiamos para “Eu adoro praia” (concorrência desleal :D). Os outros seguiam: Flamengo, São Paulo, Palmeiras e Santos.
Mas a história teve um final triste: por conta de um bug no Orkut (um?) as comunidades perderam os moderadores e uma mensagem “become a moderator” surgiu na comunidade do Corinthians (na do Flamengo também). No caso do Flamengo um usuário pegou a moderação e transferiu devolta para o antigo dono. No nosso caso o usuário que assumiu a moderação brigou com alguns membros porque não queria devolvê-la ao “Gilmar” e apagou a comunidade.
Tentamos de todas as formas contatos com a equipe do Orkut para pegar devolta a comunidade mas nada feito.
Não demorou muito e outra comunidade Corinthians foi criada. As pessoas foram voltando, mas mesmo assim não era mais “aquela” comunidade. O lado bom disso: o trabalho era grande, difícil e não-remunerado. Tiramos um peso muito grande das costas.
Por outro lado, imagina a “influência” que teríamos hoje, em tempos de “Marketing Social”, ter uma comunidade com cerca de um milhão de membros? :)
(PS. esse post surgiu a partir da minha ideia de recriar a comunidade Corinthians no novo Orkut. Mas para isso eu preciso de um convite :P)
É mais fácil pedir desculpas do que permissão
Postado por Osvaldo Santana
Diferente do que escrevi no post Dicas para um bom programa em Python, onde eu dou dicas de como proceder para ter um programa Python melhor, desta vez vou falar sobre um estilo que prefiro. Não quero dizer que estou certo ou errado, apenas que prefiro assim.
It’s easier to ask forgiveness than it is to get permission — Grace Hopper
Recentemente, dentro do tempo que me sobrava, comecei a desenvolver uma biblioteca pra fazer requisições HTTP para uma API REST. Essa biblioteca seria usada para criar testes automatizados do projeto que iremos começar a desenvolver aqui na empresa.
Essa biblioteca faria basicamente o mesmo que a httplib e httplib2 do Python mas com algumas conveniências: (de)serialização de JSON/XML, conteúdo calculado no momento da request (ex. assinatura da requisição), e uma classe “TestCase-like” com funções que auxiliassem no desenvolvimento de testes.
Eu tinha só algumas idéias do que essa biblioteca faria e quase nada de código quando vi o lançamento do Bolacha, desenvolvido pelo Gabriel Falcão, no Planeta Globo.com. Guardei o link pra conferir depois pois poderia ser útil para o que eu queria fazer.
Ontem eu tive um tempo para analisar e vi que ele não só seria útil como já fazia a parte mais essencial do que eu precisava (requisições GET/POST/PUT/DELETE/…).
Como o projeto esta hospedado no github.com tratei logo de fazer um fork para criar as outras funcionalidades que eu precisava. Código legal, código simples, código bem feito, mas… quando encontrei os primeiros…
def request(self, url, method, body=None, headers=None): if not isinstance(url, basestring): raise TypeError, 'Bolacha.request, parameter url must be ' \ 'a string. Got %s' % repr(url) if not isinstance(method, basestring): raise TypeError, 'Bolacha.request, parameter method must be ' \ 'a string. Got %s' % repr(method) if method not in HTTP_METHODS: raise TypeError, 'Bolacha.request, parameter method must be ' \ 'a valid HTTP method. Got %s. %s' % (method, RFC_LOCATION) # ...continua
… notei que o estilo do Gabriel divergia do meu. Nada errado com isso. Tanto que, mesmo assim, continuarei a usar e melhorar o Bolacha mantendo (dentro do possível) o mesmo estilo original do autor para que ele possa aceitar minhas contribuições.
O que não gosto desse estilo é que, com ele, sempre estamos pedindo permissão, ou seja, verificando de antemão alguma informação no lugar de usá-la imediatamente e, só em caso de erro, considerá-las inválida. Nesse caso estamos adicionando um overhead desnecessário (muito pequeno neste exemplo) até mesmo para casos de uso correto do método.
Outro problema que temos nesse estilo reside no fato de que estamos usando o mecanismo de herança da linguagem como um sistema de criação de interface para o objeto. Se eu quiser passar um objeto que se comporta exatamente como uma string mas que não seja uma classe derivada de basestring() para o método .request() acima eu não vou poder.
Eu removeria todas as verificações de isinstance() e deixaria o código assim:
def request(self, url, method, body=None, headers=None): if method not in HTTP_METHODS: raise TypeError, 'Bolacha.request, parameter method must be ' \ 'a valid HTTP method. Got %s. %s' % (method, RFC_LOCATION) # ... continua
Mais adiante nesse código vemos o uso de uma função chamada is_file() que é implementada da seguinte forma:
def is_file(obj): return hasattr(obj, 'read') and callable(obj.read)
Mais uma vez, nada de errado. Mas também não é muito o meu estilo. No meu estilo essa função sequer existiria porque, mais adiante, quando fosse necessário usar obj que, no código em questão, pode ser uma string ou um file object, eu faria algo assim:
try: lines.extend(encode_file(obj)) except AttributeError: lines.extend([ '...' ])
Mais uma vez eu quero deixar claro que é só uma questão de diferença de estilo e que eu usei o código do Bolacha somente para ilustrar essa diferença. Dentro do estilo do Gabriel o código está perfeito (tá, não existe código perfeito, mas o dele tá muito bom).
Como leitura complementar sobre essas diferenças eu recomendo o artigo isinstance() considered harmful, Duck Typing, Permission and Forgiveness e PEP-3119 – Introducing Abstract Base Classes (funcionalidade de suporte ao estilo usado no Bolacha).
Por último, ao meu estilo, gostaria de pedir desculpas ao Gabriel Falcão por ter usado o código do Bolacha para ilustrar esse artigo sem permissão. :)
PythonBrasil [5]
Postado por Osvaldo Santana
Os preparativos para a 5ª edição do encontro brasileiro da comunidade Python já estão a todo vapor (o evento era conhecido anteriormente como PyConBrasil).
A PythonBrasil[5] acontecerá em Caxias do Sul – RS nos dias 10, 11 e 12 de setembro no campus da Universidade de Caxias do Sul (UCS).
As inscrições já estão abertas e é possível adquirí-los com o desconto máximo até o dia 07 de agosto. Depois disso os valores vão aumentando. Estudante, membros da Associação Python Brasil, da Abraweb e da SBC contam ainda com descontos.
Além das inscrições a Chamada para Trabalhos também estará aberta até o dia 26 de Julho (domingo agora! Não perca tempo!) para palestras e treinamentos.
Eu, como não podia deixar de ser, participei de todas as edições da conferência e posso dizer: é fantástico. O encontro com os amigos, as palestras surpreendentes e a interação com o público (que é fácil por conta do tamanho do evento) fazem esse evento único.
Gostaria de pedir pros leitores do meu blog que ajudem na divulgação do mesmo. Vocês encontrarão o material para isso no próprio site.
Dicas para um bom programa em Python
Postado por Osvaldo Santana
Oi pessoal, desta vez eu vou pular as ‘desculpas’ por ter demorado tanto para postar aqui no blog e vamos direto ao assunto.
Recentemente eu tenho trabalhado bastante com Python (dã!) desenvolvendo projetos de diversos tipos e resolvi escrever aqui sobre algumas coisas que pratico enquanto desenvolvo.
Código mais robusto
Deu certo ou errado?
O que você faz quando acontece algo errado na execução do seu método? O que você responde à requisição que lhe foi feita?
Eu tenho visto em muito código por aí os desenvolvedores retornando valores sentinela (None, null, 0, -1, etc.) para avisar que algo incorreto aconteceu na execução do método.
def f(arg): if not arg: return None return [ "resultado", "de", "um", "processamento" ]
Algumas linguagens de programação não possuem estruturas de tratamento de exceção e, neste caso, o uso de sentinelas é válido. Mas quando a linguagem de programação te disponibiliza essa funcionalidade é bom usá-la.
def f(arg): if not arg: raise ValueError("Argumento Invalido") return [ "resultado", "de", "um", "processamento" ]
Deixem as exceções fluirem.
Isso mesmo. A menos que você saiba exatamente o que você deve fazer quando uma exceção aparece deixe-a exceção “subir”. Pode ser que “lá em cima” alguém saiba cuidar dela adequadamente.
Quando não fazemos isso estamos ocultando informação importante para os usuários do nosso código (sejam eles usuários, outros desenvolvedores ou nós mesmos).
def f(): try: return conecta() except ExcecaoQueDeveriaSerErro: return None
Quando eu implemento esse tipo de método/função eu faço assim (na verdade eu não implementaria f() e chamaria conecta()):
def f(): return conecta()
O que seu método/função retorna?
Código que eu encontrei recentemente:
def get_fulanos(): q = Q("select * from patuleia where alcunha like 'fulano%'") ret = [ str(fulano['nome']) for fulano in q ] if len(ret) == 1: return ret[0] return ret
Perceberam o que está errado? O seu método retorna uma lista de Fulanos ou retorna Fulano?
Isso está conceitualmente errado e pode fazer você perder horas preciosas do seu dia tentando achar um bug causado por esse tipo de código.
Aconteceu comigo. Note que str() implementa uma interface de sequence da mesma forma que list(). Então o erro passa silenciosamente no caso abaixo:
old_fulanos = [ "Ze Ruela", "Ze Mane" ] old_fulanos.extend(get_fulanos()) print old_fulanos
Rodando esse código você vai obter ['Ze Ruela', 'Ze Mane', 'q', 'u', 'a', 'c', 'k'] sendo que, em mais de 90% dos casos, o que você gostaria de ter seria: ['Ze Ruela', 'Ze Mane', 'quack'].
“Nada” é diferente de “alguma coisa”.
Essa dica é só uma complementação da primeira e da segunda dica.
Quando o seu método/função retorna uma collection (seqüência, conjunto, hash, etc) vazia você deve retorná-la vazia e não um valor sentinela (como None). Isso facilita a vida de quem vai usar o seu método/função:
def vazio(): return [] for elemento in vazio(): pass #... faz algo se o conjunto contiver dados ...
Se você retorna um valor sentinela:
def vazio(): return None elementos = vazio() if elementos: for elemento in elementos: pass # ...
Notou que tivemos que criar uma variável com o resultado da operação (para não precisar chamá-la duas vezes) e tratar a sentinela com um “if“? Se eu esqueço de tratar a sentinela meu programa vai quebrar.
Lembre-se sempre que uma collection vazia tem valor booleano “False“.
Todo ‘elif‘ tem um irmão ‘else‘.
Sempre que você precisar usar uma construção if/elif coloque uma cláusula ‘else‘.
Além de usar a cláusula ‘else‘ eu geralmente faço com que ela gere uma exceção. Desta forma eu sou obrigado a trabalhar todas as possibilidades nos ‘if/elif‘ evitando ocultar uma situação que pode ser inválida.
class InvalidCommand(Exception): pass def minihelp(comando): if comando == "print": return u"""Imprime dados na tela. Deixará de ser comando no Python 3.0""" elif comando == "assert": return u"""Certifica se uma condição é verdadeira e gera uma excessão em caso contrário" elif comando == "...": pass # ... else: raise InvalidCommand(u"Comando %s inválido." % (comando,))
Eu gosto dessa prática mas isso não significa que você deva seguí-la sempre. Existem situações onde ter um “valor default” é necessário e nestes casos o uso do else sem levantar exceção se faz necessário.
if comando == "if": print "Vai usar elif?" elif comando == "elif": print "Muito bem. Agora falta o else" else: print "Pronto. Agora está bom."
“Pythonismos”
Use mais atributos públicos do que atributos protegidos (“_“).
Programadores acostumados com Java utilizam muito as cláusulas ‘private‘ e ‘protected‘ para encapsular os atributos de um objeto para logo depois implementarem os getters e setters para acessar esses atributos.
Essa prática é aconselhada em Java porque em algum momento do futuro você, talvez, precise validar esses dados ou retornar valores calculados. Nestes casos os programadores apenas implementam essa lógica nos métodos que acessam o atributo privado.
Mas em Python isso não é necessário. Em Python você pode transformar seu atributo público em uma “property” que não muda a forma de se acessar o atributo e permite o acrescimo de lógica ao acesso do mesmo.
Evite usar “__“.
Por convenção, em Python, todo método ou atributo iniciado com um “_” é considerado privado (equivalente ao protected em Java) e não deve ser acessado de fora da classe mesmo sendo possível fazê-lo.
Dito isso parece meio óbvio que não precisamos usar “__” para dificultar ainda mais o acesso à esse atributo/método. Além disso o uso do “__” traz alguns incoveninentes para quem quer derivar a sua classe e acessar este método/atributo já que o Python o renomeia acrescentando o nome da classe ao seu nome (__attr vira Classe__attr).
Não sobrescreva builtins.
Python disponibiliza várias funções e classes builtins que facilitam muito o uso da linguagem e economizam digitação. Mas esses builtins tem nomes muito “comuns” e frequentemente a gente usa os nomes dos builtins como nomes de identificadores. Eu mesmo vivo (vivia) fazendo isso.
O problema é que em certos momentos alguns problemas podem acontecer quando você tenta chamar um buitin que já não é mais um builtin. Na maioria das vezes o problema “explode” logo e você rapidamente conserta mas em alguns casos você pode perder muitas horas tentando achá-lo.
Algumas pessoas usam um “_” no fim do nome do identificador (ex. “id” vira “id_”) mas eu acho isso um pouco feio então uso só quando não encontro uma alternativa melhor.
Vou colocar aqui uma tabela de equivalências que eu costumo usar para substituir o nome dos builtins mais comumente sobrescritos:
- id – ident, key
- type – kind, format
- object – obj
- list – plural (lista de element vira elements)
- file – fd, file_handler
- dict – dic, hashmap
- str – text, msg
Análise estática economiza seu tempo.
Eu uso o pylint, mas conheço algumas pessoas que preferem o pyflakes ou o PyChecker.
A dica é essa: usar um programinha de análise estática como esses pode diminuir consideravelmente aqueles errinhos chatos de sintaxe, ou de digitação. Pode limpar os ‘import’ desnecessários do seu software, etc, etc.
É lógico que esse tipo de ferramenta não substitui uma boa política de testes mas é um bom complemento para ela.
Challenge yourself
Máximo de 3 níveis de indentação. (ou 4 se estiver dentro de uma classe)
Ao se esforçar para que seu código não fique muito aninhado você está trabalhando melhor a implementação dos seus métodos e funções. Nem sempre é possível (ou aconselhável) restringir tanto o nível de identação do seu código mas muitas vezes isso melhora a sua implementação.
Máximo de 2 indireções.
Recebeu um objeto como parâmetro? Chame apenas métodos dele e evite ao máximo chamar métodos do retorno desses objetos:
def f(obj): obj.metodo() # legal! obj.metodo().outro_metodo() # ruim!
Quando você chama um método pra um objeto retornado por outro método você está aumentando o acoplamento entre as classes envolvidas impedindo que uma delas seja substituída (ou reimplementada) ‘impunemente’.
Essa regrinha é uma das regrinhas da Lei de Demeter.
Máximo de 0 ‘if/elif/else’s.
Polimorfismo é isso. No mundo OO ideal, perfeito e utópico praticamente não precisaríamos do comando “if” e usaríamos somente polimorfismo. Mas… como não conseguimos isso tão facilmente* devemos, ao menos, usar o “if” com moderação.
Conclusão
Esta é uma lista incompleta de dicas para programadores Python. Se futuramente eu lembrar ou aprender algo novo eu volto aqui para falar sobre o assunto.
Alguns desenvolvedores podem não concordar com as dicas. Neste caso eles podem enriquecer ainda mais esse texto argumentando sobre o as suas restrições no espaço para comentários.
Se você tiver alguma dica para compartilhar com a gente coloque nos comentários. Se ela for boa mesmo eu coloco ela no corpo principal do blog.
* eu mesmo só consegui fazer uma aplicação OO funcional sem usar um único if. Era uma implementação do joguinho de adivinhação de animais (aquele que pergunta “Vive na água? (s/n)”) em Smalltalk.
PyConBrasil 2009 na sua cidade. O prazo está acabando!
Postado por Osvaldo Santana
Dia 10 de novembro termina o prazo para envio das candidaturas à cidade-sede da PyConBrasil 2009!
Se você mora numa cidade com uma comunidade pythônica entusiasmada, com uma boa infra-estrutura para sediar o evento e gostaria de ver reunida a ‘nata’ do Python no Brasil (e no mundo) é a sua chance de candidatá-la para sediar a próxima edição do maior evento de Python da América Latina!
Para candidatar é fácil. Basta preencher um formulário e seguir as dicas do Manual do Big Kahuna que as suas chances aumentam.
Os critérios para escolha da cidade variam bastante entre os participantes da banca de avaliação mas parece haver um consenso de que passam por:
- Participação, importância do Big Kahuna na comunidade e sua capacidade de coordenação
- Força do GruPy local
- Disposição de ambos para trabalhar duro durante quase um ano na organização do evento
- “Potencial pythonico” da cidade (quantos desenvolvedores python conseguiremos ‘converter’)
- Infra-estrutura pro evento
- Infra-estrutura da cidade-sede (transporte, acesso aéreo/terrestre)
- Mais alguns outros critérios que, com certeza, esqueci…
Os resultados serão divulgados no dia 25 de novembro. A banca de avaliação ainda não foi formada mas logo que tivermos mais detalhes eu aviso por aqui.
Latinoware 2008, eu fui…
Postado por Osvaldo Santana
Como sempre faço quando vou à um evento vou relatar aqui a minha primeira experiência participando da Latinoware 2008.
A decisão sobre a minha participação só foi tomada dois dias antes do evento pois quem iria patrocinar a minha viagem (INdT) conseguiu viabilizar o treinamento de Python para Maemo bem em cima da hora. Participei apenas do primeiro dia do evento.
Cheguei em Foz do Iguaçu na quinta-feira (30/10/2008) de madrugada e tinha um serviço de transfer no aeroporto para carregar os palestrantes até os hotéis onde ficariam hospedados. O meu nome não constava na lista mas isso era justificável por minha decisão tardia. De qualquer maneira bastou uma conversa rápida com o responsável pelo transporte e eu já estava dentro da Van em direção ao hotel.
Quando cheguei no hotel avistei uma placa avisando que um ônibus passaria lá às 8hs da manhã em direção à Latinoware. Às 7h30 eu estava na frente do hotel juntamente com mais 3 outras pessoas que também iriam para o evento.
Desistimos de esperar às 8h30 e dividimos um taxi até o local do evento. Descobri depois que o ônibus sequer havia passado no hotel.
Ao chegar no posto de credenciamento que estava instalado num estacionamento de Itaipu avistamos as filas para pegar crachás. Me dirigi à fila de crachás para “Palestrantes, Imprensa e Autoridades”.
A fila estava pequena (umas 8 pessoas) mas não andou 1 milímetro sequer até que um dos organizadores nos retirou da fila para entregar os crachás que estavam com ele. Mas o meu crachá, afinal, não estava com ele e tive que me contentar com um crachá em branco onde preenchi à mão o meu nome e RG.
Os palestrantes então deveriam entrar num ônibus que estava estacionado ao nosso lado pois seriamos levados até o “Parque Tecnológico de Itaipu” onde a estrutura do evento estava montada.
Esperamos por mais alguns minutos (que pareceram horas) até que um grande amigo meu entra pela porta do ônibus e comenta algo que eu já havia notado: “Esse é o evento mais desorganizado dentre todos os de informática dos quais já participei.” Note que em meu caso e no dele isso significa muitos eventos.
O ônibus saiu com lotação total de pessoas sentadas e em pé. Detalhe: faltavam poucos minutos para as atividades do evento começarem e uma parte considerável dos palestrantes ainda estava em um ônibus saindo da área de credenciamento.
Poucos metros dali o ônibus para e todos que estavam de pé tiveram que trocar de ônibus. A troca foi feita sob a vigilância atenta de um dos seguranças de Itaipu que olhava atentamente para nossos crachás preenchidos à mão para ver se não detectava alguma fraude :D Eita segurança…
Finalmente nos salões onde as atividades do evento iriam ocorrer tratei logo de ir para a sala de palestrantes ou para o stand da Associação Python Brasil para me conectar à Internet e terminar o material do meu treinamento…
Vencida a falta de sinalização do lugar fui até a sala de palestrantes mas ela já estava completamente lotada.
Fui então à caça do stand da APyB e ao chegar lá descobri que o ponto de rede estava com problemas. A sorte foi que o Ramiro levou um roteador wireless para conectar no ponto de rede do pessoal do Debian Brasil.
O almoço era razoável e foi ‘di grátis’. Servido apenas até as 14hs fez com que os instrutores dos mini-cursos da manhã tivessem que improvisar suas refeições já que seus treinamentos eram de 4hs (sem intervalo) e terminariam somente às 15hs.
No meu treinamento deu quase tudo certo. Mas nesse caso específico a culpa pelas falahas foram majoritariamente minhas (o ambiente necessário para o treinemento não estava instalado nas máquinas do laboratório pois eu não havia feito a solicitação em tempo hábil). Faltou um flip-chart/quadro branco na sala de aula também.
Terminado o treinamento fui dar uma bisbilhotada no pessoal da Robótica Livre que estava montando plaquinhas Severino sob a orientação do Prof. Paulo Gonçalves. O Severino é uma implementação brasileira do Arduino. Queria ter ficado lá mas tive que ir para a palestra de abertura e depois para um coquetel no mirante de Itaipu onde veríamos o acendimento das luzes da barragem. Um show que eu recomendo. Itaipu é uma daquelas coisas que temos pra mostrar as virtudes do nosso povo.

Aquele quadrado no centro é um prédio de 6 andares
Já o coquetel… Eu comi dois “canapés” minguados e não bebi nada (nem água). E os canapés foram doados pelo Ramiro que se comoveu com a minha fome :)
Depois do coquetel voltamos para o hotel onde eu dormi um pouco até ir para o aeroporto embarcar de volta para Curitiba onde iria preparar minha ida para São Paulo (desta vez de carro) GP Brasil de F1. Sobre isso eu conto no próximo post.
Curiosidade nas crianças
Postado por Osvaldo Santana
Quando eu era criança eu era daquele tipo que desmontava brinquedos pra ver como funcionava por dentro, mandava cartas para a seção ‘Perguntas Superintrigantes’ para a revista Superinteressante (nenhuma foi publicada :/) e consultava todo tipo de livro ou enciclopédia que pudesses esclarecer minhas dúvidas.
Toda essa introdução serviu pra ilustrar uma coisa que se repete desde a minha mais remota infância: a curiosidade.
A minha curiosidade para aprender e entender como as coisas funcionam sempre foi enorme. A minha disposição para executar experimentos também. Cheguei ao ponto de ter incendiado o meu quarto por conta de um curto-circuito na rede elétrica.
Com cerca de 5 anos eu estava experimentando se ao dar um nó no fio a corrente elétrica ainda fluiria pelo condutor. Descobri que sim. :D Ok, foi burrice isso! Mas eu tinha só 5 anos!. Eu poderia ter simplesmente perguntado ao meu pai se isso funcionaria mas o ensinamento não teria sido tão contundente :)
E acreditem, essa experiência me rendeu alguns frutos positivos no futuro (pequenos se a gente comparar com o estrago). Essa experiência me garantiu uma vantagem durante as aulas de física elétrica quando o professor falava sobre “corrente de curto-circuito” e para o meu entendimento da Lei de Ohm (U = R.I ou I = U/R). Para simplificar imagine que na minha experiência R≅0, logo, I≅∞. Se potência é o produto de tensão por corrente (P = U.I) imagine o estrago (agravado por um disjuntor que não funcionou)…
Mas voltando ao motivo principal deste post…
Eu tenho 3 casos diferentes de crianças próximas de meu convívio. Meu filho que tem 4 anos de idade é uma criança tranquila, que brinca bastante com seus brinquedos e até já navega sozinho nos joguinhos do site da Discovery Kids.
Ainda não consegui perceber traços de uma criança curiosa nele. Tenho receio que seja em razão da sua pouca idade ou porque suas análises e experimentos passem desapercebidos por mim.
Ainda não dá pra fazer um comparativo comigo porque minha memória só vai até meus 5 anos e ainda assim é incompleta e só está presente para registrar as grandes descobertas (ou incêndios se preferirem).
Esse tipo de comparação entre pai e filho também deve ser evitada porque faz mal para ambos.
A outra criança é a minha sobrinha que tem 12 anos e estuda no melhor colégio que uma criança poderia estudar em São Paulo. Os pais dela (meu cunhado e cunhada) são extremamente presentes e acompanham os estudos dela de perto.
Também dão apoio e suporte nos assuntos, temas e matérias onde ela sente maior dificuldade ajudando pessoalmente quando possível ou através de atividades complementares pagas.
A minha sobrinha enfrenta dificuldades na(s) escola(s) ano após ano e meus cunhados até já a submeteram à avaliações para detecção de algum tipo de distúrbio neurológico como o DDA. Os resultados foram negativos.
Uma das características que observei nela é a ausência total de curiosidade.
Eu e o meu cunhado trabalhamos em áreas relacionadas à TI e graças a isso temos acesso constante a diversas tecnologias novas e à Internet. Sempre temos em mãos aparelhos, computadores, softwares, livros, filmes e até mesmo brinquedos que deveriam despertar a curiosidade das crianças.
Não adianta. Ela continua levando a vida dela e apenas recebendo as informações sem nunca tentar “caçá-las”.
O terceiro caso já não é mais de uma “criança”. Ele fez 18 anos no mês passado. Mas eu já convivo com ele desde os 12 porque ele é primo “caçula” da minha esposa.
A curiosidade dele é o que eu chamo de “curiosidade on-demand”. Pois ele até vai atrás de entender o funcionamento das coisas mas só quando aquilo servirá para resolver um problema prático do presente.
Po exemplo: ele sabe arrumar alguns aparelhos eletrodomésticos só porque trabalhou alguns meses fazendo isso.
Ele entende o funcionamento de um ferro de passar roupas até o ponto de saber que se o fio do chicote está partido o ferro não vai funcionar, mas nunca ao ponto de associar que o ferro de passar roupas é uma resistência elétrica que transforma a energia elétrica em energia na forma de calor.
A curiosidade dele nunca tenta romper a barreira da necessidade.
Algumas observações: tanto minha sobrinha quanto do primo da minha esposa são extremamente vaidosos e se preocupam com a aparência. Além disso eles são facilmente seduzidos por coisas fúteis e são extremamente vulneráveis aos apelos consumistas (celular da moda, roupa da moda, seriado da moda, …).
No caso do primo da minha esposa pedir pra ele ler alguma coisa é quase o mesmo que pedir pra ele se matar. Ele assiste DVD dublado pra não ter que ler a legenda.
Com isso descrito eu parto pro questionamento:
- Todas as crianças das últimas gerações são assim ou minhas amostras estão contaminadas?
- Vocês conhecem crianças curiosas? (pais corujas, por favor, sejam objetivos nas respostas)
- Vocês acham que as crianças de hoje não são mais curiosas porque elas não precisavam mais ‘caçar’ as informações pois basta ficar parado na frente da TV/Internet para obtê-las?
- Os pais podem estimular a curiosidade de seus filhos?
- Como fazer isso?
Empreendedores do meu Brasil
Postado por Osvaldo Santana
Em abril deste ano eu saí de um dos melhores lugares pra se trabalhar nesse país afim de realizar um antigo sonho: construir uma empresa.
Desde que eu era criança eu já demonstrava essa vocação de empresário e tinha uma “empresa” que vendia seguro para as bicicletas de meus amigos. Já tinha um sócio nessa época (meu grande amigo Wagner Longo).
Em 2001 eu fundei a Haxent Consultoria juntamente com outros 5 sócios (Sérgio Bruder, Guilherme Manika, Rudá Moura, Alfredo Kojima e Eliphas Levy) e a empresa estava indo bem no começo até que alguns tropeços foram dados e fui obrigado a sair da sociedade. A Haxent ainda vai bem e atualmente tem como sócios apenas o Sérgio Bruder e o Guilherme Manika.
Como vocês podem ver em todas as minhas empreitadas sempre tive a figura do “sócio”. Não só por porque é uma espécie de “obrigação legal” (é mais fácil abrir empresas de sociedade limitada) mas porque compartilhar decisões e trabalho é sempre uma coisa muito saudável na administração de uma empresa.
Já faz uns 4 meses que fundei a Triveos Tecnologia Ltda. (por favor, perdoem-me pelo site :D) e tenho como sócia a minha esposa (apenas para cumprir o aspecto legal já citado). Montei a empresa sozinho para depois procurar por um sócio que compartilhasse da vontade de tocá-la junto comigo.
A Triveos trabalha atualmente com Consultoria em TI nas áreas de desenvolvimento Linux Embedded e em desenvolvimento Web (feitos pra garantir o fluxo de caixa) mas o plano de longo prazo é ter produtos voltados à Web (e Web móvel).
No passado eu já enfrentei todo tipo de problema para construir uma empresa: falta de dinheiro, falta de trabalho/clientes, falta de mão de obra e até mesmo falta de um projeto para ela.
A Triveos, atualmente, não está com problema de falta de dinheiro (apesar de estar com os “cintos apertados”), não está com falta de clientes ou trabalho (eles aparecem aqui e ali pontualmente), não está com falta de mão de obra (porque a demanda ainda não pede a contratação de funcionários) e não está com falta de projetos para o futuro (tenho pelo menos 1 projeto grande e uma mão cheia de projetos menores esperando pelo aval de um sócio) mas não consigo achar sócios para a empresa. Não sei qual é a razão mas espero compreendê-la em breve.
Não é sempre que um empreendedor vai encontrar uma empresa nova, com projetos, com clientes, com um pouco de dinheiro, constituída legalmente e com todos os aspectos fiscais/contábeis impecáveis precisando apenas de alguém para trabalhar com afinco (ou ter dinheiro para se tornar um sócio-investidor).
No plano de negócios que está sendo gradualmente construído (na minha cabeça ele está pronto mas preciso passá-lo para o papel para poder verificar a sua viabilidade) eu avalio a necessidade de um sócio que saiba desenvolver software e de um sócio que saiba lidar com outro aspecto importante dos produtos que iremos desenvolver: o design.
A empresa está sediada em Curitiba mas não vejo problemas com trabalho remoto (desde que eventualmente os sócios possam se reunir presencialmente). Também não vejo problemas se o pretendente a sócio também estiver estudando ou precise continuar num trabalho que lhe garanta o sustento desde que ele comprometa uma parte do seu tempo na criação e execução de projetos para a empresa.
Esses cenários (trabalho remoto ou part-time) não são o ideal mas tendo em vista a dificuldade de se encontrar candidatos a empresários no Brasil…
Eu já mantive contato com umas 5 pessoas e por razões diversas (pessoais, estudo, dinheiro ou carreira) a coisa não funcionou. Espero que com esse post algumas pessoas apareçam.
Mas notem: estou procurando um sócio e não um funcionário!
Quero uma pessoa disposta a correr riscos e a se dar mal caso a empresa não funcione direito. Quero uma pessoa disposta a trabalhar muito e ganhar pouco (ou nada). Quero uma pessoa cujo gênio “bata” com o meu (mas que não seja muito parecida comigo). Quero alguém pra concordar, discutir e brigar comigo. Portanto, não me enviem currículos. Me envie um e-mail dizendo tudo aquilo que você acha necessário dizer para me convencer a ser seu sócio (projetos, idéias, desejos, planos de negócio, …).
Atualização: Estou enviando esse e-mail automático para todos que se candidataram à vaga:
From: Osvaldo Santana Neto <osantana triveos.com> Subject: Vaga para sócio na Triveos Tecnologia Ltda. [eu não gosto de respostas automáticas mas nesse caso foi necessário] Olá, Eu agradeço o seu interesse em ser meu sócio. Como você deve presumir, ao colocar um anúncio procurando por parceiros nessa empreitada em meu blog fez com que eu recebesse e ainda continue recebendo diversas propostas de candidatos à 'vaga'. Alguns dos proponentes compreenderam que eu estava procurando por um *sócio* e não por um funcionário. Outros não entenderam direito essa idéia. O primeiro e-mail que recebi foi de um candidato de Curitiba que trabalhou na Conectiva (Mandriva) e que atualmente trabalha em uma outra empresa de tecnologia daqui. Seguimos adiante com as conversas e até o momento as coisas estão num ritmo interessante. A sociedade ainda não está 'sacramentada' porque tanto eu quanto ele achamos que devemos esperar um pouco mais para isso. Até lá vamos tocando um dos projetos da empresa em parceria. Esse e-mail então serve pra dizer que, até que se prove o contrário, eu já encontrei um sócio desenvolvedor. Em todo caso irei guardar todos os e-mails que recebi para que no futuro, se as coisas não funcionarem com esse candidato, eu volte a contactá-los. Mais uma vez, perdoem-me pelo e-mail extremamente "impessoal" e automático para uma questão tão séria e pessoal como esta mas recebi muitos e-mails e respondê-los um a um tomaria muito tempo de um jovem empresário que, nesta etapa do negócio, tem um monte de trabalho difícil pra fazer. Obrigado pelo interesse, Osvaldo Santana Neto Triveos Tecnologia Ltda.
Persevere.
A Lição Final
Postado por Osvaldo Santana
Dia desses eu estava trabalhando e ao olhar na barra do meu Google Talk eu vi que o Guido van Rossum (criador da linguagem Python) havia colocado o endereço de um vídeo no Youtube. Achei que era algum vídeo legal sobre Python e resolvi abrir.
Era o vídeo de uma palestra de um professor norte-americano que trabalhava na área de tecnologia de realidade virtual. Até aí nada de mais (eu sequer me interesso pelo assunto).
Continuei a assistir o vídeo por mais um tempo mais por “fé” na indicação do Guido do que por qualquer outra razão. Em certo momento do início da apresentação o professor, chamado Randy Paysch, mostra um Raio-X do fígado dele onde se conta 10 tumores e ele diz que tem entre 3 e 6 meses de vida.
Ele então começa a falar sobre sonhos e sobre como realizá-los. Sua habilidade como orador é invejável. Continuo assistindo a palestra. Me emociono.
Semanas depois leio na revista Época que esse vídeo havia se tornado uma febre no Youtube e que o professor Pausch estava preparando um livro com o conteúdo dessa mesma palestra juntamente com um amigo. Pensei (me esquecendo que o cara estava condenado à morte): pronto, mais um livro de auto-ajuda que vai deixar o autor rico.
A algumas semanas atrás fiquei sabendo que o professor faleceu e em uma de minhas passeadas em livrarias pude ver que uma tradução do livro já estava disponível no Brasil. Voltando do Rio de Janeiro, onde havia participado da PyConBrasil 2008, resolvi comprar o livro pra ler durante a viagem de volta.
A coincidência
Lendo o capítulo “24. O tolo que se redimiu”, onde o professor conta a história de um de seus alunos (chamado Tommy) que era fã de Guerra nas Estrelas e sonhava em trabalhar na produção dos filmes da saga, eu esbarro no seguinte trecho (página 135):
Quando me transferi para a Carnegie Mellon, todos os membros da equipe da Universidade da Virgínia me acompanharam — menos Tommy. Ele não podia se mudar. Por quê? Porque fora contratado pela Industrial Light & Magic, a companhia do produtor/diretor George Lucas. E note-se que ele foi contratado não por causa do seu sonho, mas sim por suas habilidades. No período em que participou do nosso grupo de pesquisa, Tommy se tornou um destacado programador de linguagem Python (grifo meu), por sorte dele a linguagem escolhida pela empresa de Lucas. E sorte mesmo é quando o preparo se une à oportunidade.
Não é coincidência? Eu conheço o cara através do criador do Python e voltando de uma conferência de Python eu leio que um dos alunos do cara realizou o sonho de trabalhar na Industrial Light & Magic porque conhecia Python.
O livro
No geral o livro é um complemento ao vídeo e foi escrito, segundo o autor, como uma forma de deixar uma mensagem para os seus filhos.
Seria um típico livro de auto-ajuda se não fosse a biografia de um professor que deixou uma mensagem muito bonita para sua família pouco antes de morrer. É um livro onde se encontra muitos “clichês”, muitos momentos piegas e que muitas vezes emociona o leitor (principalmente aqueles que já são pais).
Ele tem uma encadernação muito bonita com capa dura e um tamanho reduzido que o torna excelente para presentear os amigos. Por se tratar de um livro barato cuja leitura é muito rápida (li ele em 1 dia) eu recomendo a todos que tem seus sonhos e gostariam de realizá-los. Mais ainda àqueles que tem filhos.
Para comprar:
Submarino (mais barato no momento em que faço esse post)
Livraria Cultura
Lojas Americanas (dica do Prof. Marco André)
- A Lição Final (apenas R$9,90!)







![PythonBrasil[5]](http://www.pythonbrasil.org.br/2009/saiba-mais/apoio-divulgue/pythonbrasil-halfbanner.gif)


