Manual de Informática em Cordel - Em desenvolvimento

14 fev 2012

Estou trabalhando em um manual de Informática em cordel. O manual servirá de materia para cursos de treinamento em informática, sendo constituído basicamente por cordéis e imagens auxiliares (como infogramas).

Conteúdo:

CapítuloCordelEstado
Software LivreCordel do Software LivreConcluído
Licensas de Uso de SoftwareDo Livre e do GrátisConcluído
Introdução ao Sistema Operacional GNU/LinuxCordel do GNU/LinuxConcluído
Ambiente de Trabalho GNOMECordel do GNOMEConcluído
Acessando AplicativosCordel dos AplicativosConcluído
Recursos de um Ambiente  
Gerenciamento de Arquivos e Pastas  
Permissões de Acesso  
Noções de Segurança  
Compactação de Arquivos  
Gravação de CDs e DVDs  
Navegação na Internet  
Ferramentas para Desenho  
Ferramentas de Produtividade  
Ferramentas para Entretenimento e Multimídia  
Gerenciamento de Pacotes  

Como vocês podem ver, ainda falta muita coisa, mas a ideia está, aos poucos, evoluindo. Quem tiver infográficos e imagens verticais em geral que possam ajudar a ensinar informática (e puderem ser distribuídas sob licenças livres), me mandem!

Exploradores Espaciais

13 fev 2012

Brancas nuvens no céuLágrima Lunar
O céu não mais importa pra quem pode andar nas nuvens
O espaço é infinito
Mas a sede de aventuras não tem tamanho

Tamanha força que nos empurra
Num mar de flores em nanquim sem forma
Um dia fomos filhos do Sol
Hoje somos exploradores espaciais

Uma caravana ao desconhecido
Sete caravelas em busca de paz
Algo mais
Uma razão pra viver (pra viver, pra viver...)

Eu só quero um bote
Que me leve às estrelas
Pra que eu possa acompanhar a caravana clandestino
Ou siga em busca de meu próprio caminho

Quero ser um sucessor do andarilho
Seguir seus passos traçando os meus próprios
Pra nunca mais ter que seguir os passos de ninguém
E daqui por diante só ser clone de mim mesmo

O infinito é tão longe, e a vida tão curta
Não verei o fim de tudo antes do meu fim
Mas não quero viver a ver
Sempre as mesmas coisas e paisagens, os mesmos lugares

Quero navegar em busca de um cometa
Atrás de uma nebulosa
Ou de uma estrela perfeita
Mas se a perfeição está além da realidade...

Vou pra outro sistema
Vou fugir da guerra
Vou fugir da Terra
Vou construir meu próprio mundo

-- Cárlisson Galdino

Gênero: 
Special: 

Redblade #10 - Patente da Magia

11 fev 2012

Redblade #10 - Patente da Magia

O que não havia
Ou não se sabia
Em um belo dia
Passou a haver

E o povo iludido
Em ganância aturdido
Quer uso exclusivo
Daquele poder

Se alguém merecer
Pode ter certeza
Patente de tudo
É a Mãe Natureza

- Professor? O senhor precisa ver isso: “O Escritório de Patentes e Marcas dos Estados Unidos tem recebido diversos pedidos de patente da Magia.” Que pilantras!

- Não vejo com muito espanto. Esta reação é até esperada.

- Mas “patente da Magia”!? Como se eles tivessem inventado isso!

- E quem inventou certas plantas? Não foi a natureza? E o DNA humano?

- Realmente, professor.

- Veja, Fábio. Nada disso de patentes e de propriedade sobre coisas imateriais que eles inventam tem fundamento. No fundo, sempre se resumiu em uma única intenção: garantir monopólios para as empresas norte-americanas.

- Não entendo.

- Qual o propósito de uma patente?

- Não é registrar pra que possam pagar direitos autorais?

- Não, não! São duas coisas distintas! Uma patente diz que um processo ou um conceito são de uso exclusivo de uma determinada pessoa ou empresa.

- Entendo.

- Por exemplo, se houvesse uma patente do automóvel em vigor e esta fosse minha, somente eu teria o direito de fabricar automóveis. E para a Citroën fabricar automóveis, eles teriam que me pagar o quanto eu pedisse, ou eu os processaria.

- Hmmm... E por que alguém seria tão especial para ter uma “patente do automóvel”?

- O “inventor”. E este é protegido pelo governo durante a vida da patente, percebe?

- Sim.

- Pois bem. Agora digamos que eu tenha um país que inventou toda esta baboseira e agora incentivo todo mundo do meu país a apostar suas fichas em patentes. O que há de ocorrer?

- Não sei... As coisas ficarão mais caras?

- Não, Fábio! Não estás a ver o cerne da questão! Agora digamos que eu queira forçar os outros países a adotarem do mesmo esquema. O que acontece então?

- Deixa ver... Empresas de outros países podem ser impedidas de trabalhar em coisas que elas já vinham trabalhando.

- Exato! E isso não é pelas minhas empresas terem inventado as coisas antes, mas porque as minhas empresas as registraram antes! E as outras, mesmo que tenham inventado antes, serão impedidas! Vê a face cruel das patentes no mundo globalizado?

- Acho que agora entendo.

- Trata-se, Fábio, de uma forma de proteção, de subsídios, De deslealdade!

- Agora que o senhor falou...

- Entende porque não é tão absurdo que muita gente queira registrar a “patente da Magia”? Ninguém sabe como isso tudo funciona, mas eles percebem que já é algo importante, que está a afetar o mundo. E aí todos hão de chutar como a magia funciona, como numa loteria. Aquele que acertar será milionário neste mundo torto que eles próprios criaram.

- Entendo...

De fato agora faz sentido. Patentes então são uma forma de garantir monopólios sobre certas ideias. Bem, então olhando mais além...

- Professor? E como se registra uma patente?

- Eles contratam advogados e os advogados escrevem o texto da patente em sua linguagem apropriada.

- Advogados? Mas não era pra ser científico?

- Era, mas as patentes são escritas para advogados lerem.

- Caramba...

- Então são submetidas a avaliação e só depois o escritório dá o veredito se a patente foi ou não aceita.

- Mas isso deve custar caro!

- Geralmente sim.

- E quem registra patentes no fim das contas?

- Mais grandes corporações, Fábio. É o outro lado sombrio dessa coisa de patentes.

- Nossa...

“...pedidos por semana. Na falta de uma legislação clara sobre como proceder nestas circunstâncias, várias 'patentes da Magia' já foram concedidas. O advogado Joseph Moriah alerta para a possibilidade de existência de patentes primordias nesta questão. 'Pelo menos duas patentes relacionadas a magia já se tornaram conhecidas. São patentes mal redigidas, mas que nos deixam clara a possibilidade de haver mais, e de todas essas patentes novas perderem seu valor.' 'E como essas pessoas todas podem ter certeza de que não estão jogando dinheiro fora ao querer patentear a magia?' 'Não há forma alguma de ter certeza. Se alguém registrou há muito tempo uma patente que cubra essa nova realidade, certamente será uma patente submarino. Virá à tona quando seu detentor achar que é o momento mais lucrativo.' 'Isso é uma loteria?' 'É como se fosse. Não desencorajamos nossos clientes a fazerem suas apostas na Patente da Magia, mas esperamos que entendam que se trata exatamente disto: uma aposta.'” Caramba...

P. S.: Publicado inicialmente na Revista BrOffice #21.

As pessoas não querem produtos

10 fev 2012

Ano passado participei do I ESLAPE, Encontro de Software Livre do Agreste Pernambucano. Organizado por Marcelo Santana, o evento foi muito bom, apesar de alguns contratempos.

É comum haver contratempos. Nós planejamos o evento com atenção a todos os detalhes e no dia simplesmente algumas coisas terminam dando errado. É gente da equipe que adoece, são parceiros que não cumprem acordos (por esquecimento ou desleixo). Nós que já organizamos eventos (apesar de menores) sabemos bem como é. O que importa é que no final o evento foi muito bom e pretendo ir para uma eventual edição 2012.

Mas o que quero comentar aqui é sobre parte da palestra do Maddog Hall, diretor executivo da Linux International, o braço direito de Linus Torvalds.

Tive de voltar para casa logo depois da palestra por conta de um compromisso no dia seguinte, durante o dia. Por conta disso terminei não podendo acompanhar a palestra inteira, só um pedaço mesmo.

Uma parte que me lembro claramente e achei muito interessante, entretanto, diz respeito ao mundo atual, ao capitalismo, à indústria e o consumo, não estando preso ao "Linux" ou ao Software Livre. Ele disse que as pessoas não querem produtos, elas querem serviços.

Pode parecer estranho, mas se analisar bem isso é verdade. Há produtos que marcam e há pessoas que são fãs de certos produtos ou de certas tecnologias. Esses querem realmente os produtos. A maioria da população, porém, não é assim.

As pessoas não compram um carro porque querem ter o produto. O que elas querem ter é transporte de qualidade no momento em que for preciso. Isso se estende a muitas outras áreas e serve como base para justificar a importância cada vez maior da Computação nas Nuvens.

Pense bem: qual a vantagem de pensarmos em produtos, especialmente hoje num dia a dia de obsolecência programada e extrema? Claro: o fator econômico. Por isso faz mais sentido comprar um carro do que contratar serviço de uma empresa.

Outra coisa interessante que ele falou foi sobre commodities. Ele disse que a indústria tem usado o termo commodity de maneira inapropriada. Arroz é commodity, mas carro não é. Quando se vai comprar arroz, você não sabe dizer com clareza a diferença entre um produto e outro. Na prática, você termina levando em conta fatores como preço e afinidade com fabricante. Quando vai comprar um automóvel, você tem muitas características para avaliar: conforto, consumo, manutenbilidade, além do preço. Em sua visão, pra resumir, um commodity não é só um tipo de produto muito popular, mas um produto que não sabemos tanto a diferença entre os modelos no mercado. Você pode dizer para alguém "compre arroz para mim" e não se importar com a marca, mas dificilmente vai dizer para alguém "eu preciso de um carro: compre um pra mim".

É isso. Só umas ideias interessantes que vi na palestra e gostaria de compartilhar aqui com vocês. Apesar de ter levado um bom tempo para isso, finalmente aqui estão.

Special: 

Topo Gigio e o Computador

9 fev 2012

Cara! Eu me lembro dessa musiquinha! Prestem atenção na letra: o que era um "computador" para a sociedade naquela época.

Eu não tenho tantas recordações do Topo Gigio, mas me lembro dele. Acho que eu era criança naquela época. De qualquer forma, eu tinha um vinil dele e essa música sobre computador era A música. :-)

Criando PDFs em Python com Reportlab

7 fev 2012

Se você não tem nada a ver com programação, nem tem interesse no assunto, simplesmente ignore este artigo.


Mike Driscoll tem um blog dedicado a Python chamado The Mouse vs. the Python e eventualmente há excelentes artigos por lá. Artigos estilo receita de bolo. Já traduzi um deles em outros tempos, falando sobre edição de registros do Windows: Editando o Registro do Windows em Python com o _winreg.

No final do ano passado, o Mike publicou um Top 10 de seus artigos. Aproveitei a lista e traduzi o artigo mais visitado de seu blog em 2011. Não é somente questão de popularidade, o artigo é muito bom e fala sobre como gerar arquivos PDF em Python: A Simple Step-by-Step Reportlab Tutorial.

Esta é uma tradução livre e modifiquei sutilmente algumas coisas, incluindo os exemplos. Agradeço ao Mike pelos excelentes artigos e me desculpo pelas liberdades que tomei na tradução (incluindo a mudança no nome do artigo). Vamos a ele!


O subtítulo deste artigo poderia facilmente ser "Como criar PDFs com Python", mas o Wordpress não suporta isso. De qualquer forma, a melhor biblioteca é a Reportlab.. Ela não é distribuída junto com a biblioteca padrão, de modo que você precisará baixá-la para poder executar com sucesso os exemplos deste tutorial. Você vai se deparar com pelo menos um exemplo de como colocar uma imagem no PDF, que quer dizer que você também precisará da Python Imaging Library (PIL). Pelo que entendi, Reportlab é compatível com Python 2.x, IronPython e Jython. Eles Eles estão trabalhando em um port para Python 3.x (ou estarão muito em breve)

Instalação

Reportlab suporta a maioria dos métodos de instalação em Python. Você tem a opção de baixar o código-fonte e rodar “python setup.py install” ou rodar um instalador de binário (em Windows). Havia uma discussão recente na lista de email que indicava que eles adicionariam suporte a pip também. A discussão que eu li sobre suporte do Reportlab ao easy_install é confusa, de modo que eu não estou certo se eles já dão suporte àquele método ou não. (Nota do Tradutor: em Trisquel ou outra distribuição GNU/Linux baseada em Debian, você pode instalar facilmente o Reportlab e o PIL com o comando "apt-get install python-reportlab python-imaging")

Criando um PDF simples

Reportlab tem uma documentação decente. O que eu quero dizer com isso é que a documentação nos dá aquilo de que precisamos para começar, mas quando você acha alguma coisa um tanto mais complexa para fazer, você tem correr com suas próprias pernas. Só recentemente eles adicionaram uma sessão Code Snippets ao site, que espero que venha a agrupar receitas, dicas e truques, de modo que melhore essa questão. Mas basta disso. Vamos ver como se cria alguma coisa.

No Reportlab, o componente de nível mais baixo que é usado regularmente é o objeto canvas do pacote pdfgen. As funções nesse pacote lhe permitem "pintar" um documento com seu texto, suas imagens, linhas ou o que você quiser. Eu

In Reportlab, the lowest-level component that’s used regularly is the canvas object from the pdfgen package. The functions in this package allow you to “paint” a document with your text, images, lines or whatever. Já ouvi algumas pessoas descreverem isso como escrever em Postscript. Eu tenho minhas dúvidas se isso é realmente tão ruim assim. Pela minha experiência, é bem parecido com você usar um toolkit para fazer interface gráfica em regiões específicas, com posicionamentos absolutos. Vejamos como o objeto canvas funciona:

from reportlab.pdfgen import canvas
 
c = canvas.Canvas("ola.pdf")
c.drawString(100,750,"Bem-vindo ao Reportlab!")
c.save()

Você terminará com um arquivo PDF parecido com isso:

PDF do exemplo, de Olá Mundo

A primeira coisa a se notar sobre esse código é que se quisermos salvar o PDF, precisamos fornecer um nome de arquivo ao objeto Canvas. O endereço para o arquivo pode ser um caminho tanto absoluto como relativo. Nesse exemplo, o PDF será criado no mesmo lugar onde você está quando chamar o script. A próxima peça do quebra-cabeças é o método drawString. Ele desenhará o texto do jeito que você mandar. Quando usamos o objeto canvas, ele começa no canto inferior esquerdo da página. Assim, para este exemplo, pedimos para desenhar o texto a 100 pontos da margem esquerda e a 750 pontos do canto inferior da página (1 ponto equivale a 1/72 polegada). Você pode mudar esse padrão no construtor do Canvas passando um zero ao parâmetro bottomup. Entretanto, eu não tenho muita certeza do que acontecerá se você fizer isso, já que o guia de usuário do Reportlab não é muito claro a esse respeito. A peça final do código que foi apresentado é a que salva o seu PDF.

Isso foi fácil! Você já criou um PDF simples! Note que o tamanho por padrão do Canvas já é A4, de modo que se você for estadunidense provavelmente desejará mudá-lo para o formato letter. É fácil fazer isso no Reportlab. Tudo o que você precisa fazer é o seguinte:

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
 
canvas = canvas.Canvas('arquivo.pdf', pagesize=letter)
width, height = letter

A principal razão para pegar a largura e altura da página é que você pode definir margens, além de poder usá-las para fazer cálculos e decidir quando adicionar uma quebra de página. Vamos dar uma olhada por alto no construtor da classe Canvas para ver que opções nós temos mais:

def __init__(self,filename,
    pagesize=letter,
    bottomup = 1,
    pageCompression=0,
    encoding=rl_config.defaultEncoding,
    verbosity=0
    encrypt=None):

Esse código foi tirado diretamente do Guia de Usuário do Reportlab (68), página 11. Você pode ler sobre outras opções nesse guia se você quiser os detalhes completos.

Agora vamos fazer algo um pouco mais difícil e útil.

Um Pequeno Formulário, uma Pequena Função

Formulário em PDF

Neste exemplo, criaremos um formulário imprimível parcial. Até onde eu sei, o Reportlab não suporta aqueles formulários preenchíveis na tela, os que foram adicionados aos produtos Adobe no decorrer dos anos. De qualquer modo, vamos ao código!

from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
 
canvas = canvas.Canvas("form.pdf", pagesize=letter)
canvas.setLineWidth(.3)
canvas.setFont('Helvetica', 12)
 
canvas.drawString(30,750,'COMUNICADO OFICIAL')
canvas.drawString(30,735,'EMPRESAS ACME')
canvas.drawString(500,750,"12/12/2011")
canvas.line(480,747,580,747)
 
canvas.drawString(275,725,'SALDO DEVEDOR:')
canvas.drawString(500,725,"R$ 1.000,00")
canvas.line(378,723,580,723)
 
canvas.drawString(30,703,'RECEBIDO POR:')
canvas.line(130,700,580,700)
canvas.drawString(130,703,"JOHN DOE")
 
canvas.save()

Isso é baseado no recibo atual que eu criei no trabalho. A principal diferença entre este e o exemplo anterior é o uso do método canvas.line. Você pode usá-lo para desenhar linhas no seu documento passando pares X-Y. Eu usei esta funcionalidade para criar grades, embora isso seja um saco. Outros pontos interessantes nesse código incluem o comando setLineWidth(.3), que diz ao Reportlab quão grossas devem ser as linhas; e o comando setFont('Helvetica', 12), que nos permite especificar a fonte e tamanho.

Nosso próximo exemplo vai envolver o que aprendemos até agora e nos introduzirá nos fluidos.

Indo com o Fluxo

Se você é um publicitário ou faz algum tipo de trabalho com cartas, então Reportlab será um excelente acréscimo ao seu arsenal. Nós o usamos para criar cartas de formulário para pessoas com bilhetes de estacionamento vencidos. O exemplo a seguir é baseado em algum código que eu escrevi para essa aplicação, embora a carta seja um tanto diferente. (Note que o código abaixo não rodará se você não tiver a Python Imaging Library instalada).

# -*- coding: UTF-8 -*-
import time
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
 
doc = SimpleDocTemplate("form_letter.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18)
Story=[]
logo = "python-logo.png"
magName = "Pythonista"
issueNum = 12
subPrice = "99.00"
limitedDate = "03/05/2010"
freeGift = "Bisão de pelúcia"
 
formatted_time = time.ctime()
full_name = "Mike Driscoll"
address_parts = ["411 State St.", "Marshalltown, IA 50158"]
 
im = Image(logo, 2*inch, 2*inch)
Story.append(im)
 
styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
ptext = '<font size=12>%s</font>' % formatted_time
 
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
 
# Create return address
ptext = '<font size=12>%s</font>' % full_name
Story.append(Paragraph(ptext, styles["Normal"]))
for part in address_parts:
    ptext = '<font size=12>%s</font>' % part.strip()
    Story.append(Paragraph(ptext, styles["Normal"]))
 
Story.append(Spacer(1, 12))
ptext = '<font size=12>Caro(a) %s:</font>' % full_name.split()[0].strip()
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
 
ptext = '<font size=12>Gostaríamos de recebê-lo na nossa base de assinantes da Revista %s! \
        Você receberá %s edições pelo excelente preço inicial de $%s. Por favor responda até\
        %s para começar a receber nossa publicação e ainda levar esse maravilhoso presente: %s.</font>' % (magName,
                                                                                                issueNum,
                                                                                                subPrice,
                                                                                                limitedDate,
                                                                                                freeGift)
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
 
 
ptext = '<font size=12>Agradecemos muito e esperamos seu retorno para lhe servir.</font>'
Story.append(Paragraph(ptext, styles["Justify"]))
Story.append(Spacer(1, 12))
ptext = '<font size=12>Atenciosamente,</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 48))
ptext = '<font size=12>Ima Sucker</font>'
Story.append(Paragraph(ptext, styles["Normal"]))
Story.append(Spacer(1, 12))
doc.build(Story)

Bem, aqui teve muito mais código do que nos nossos exemplos anteriores. Precisaremos olhá-lo com calma para entendermos tudo o que está sendo feito. Quando você estiver pronto, simplesmente continue lendo. (N. T. Como traduzi o código do exemplo e o adaptei sutilmente, fez-se necessário o uso daquela primeira linha de comentário no código, que diz ao Python que o código a seguir está em Unicode. Se você salva seus arquivos em ISO-8859-1, basta colocar esse código no lugar de UTF-8 que está tudo bem).

A primeira parte que precisamos olhar são as novas linhas de importação:

from reportlab.lib.enums import TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

De enums, importamos “TA_JUSTIFY”, que permite que nossas strings tenham formatação justified. Há várias outras constantes que podemos usar: alinhamento à direita, à esquerda e algumas outras coisas divertidas. Em seguida temos o módulo platypus (que vem de Page LAyout and TYPography Using Scripts. N. T.: platypus também significa "ornitorrinco"). Ele contem um monte de módulos, mas provavelmente os mais importantes deles são os fluidos, como o Paragraph. Um fluido tem tipicamente os seguintes atributos: wrap, draw e algumas vezes split. Eles são usados para escrever com facilidade parágrafos, tabelas e outras construções de múltiplas páginas.

A classe SimpleDocTemplate nos permite definir em só lugar margens, tamanho da página, nome do arquivo e uma pá de outras configurações para o nosso documento. Um "Spacer" é bom para adicionar uma linha em branco, como uma quebra de parágrafo. A classe Image utiliza a Python Image Library para nos permitir inserir e manipular facilmente uma imagem no nosso PDF.

O getSampleStyleSheet pega um conjunto de estilos padrão que podemos usar no nosso PDF.  ParagraphStyle é usado para definir o alinhamento do nosso parágrafo nesse exemplo, mas pode fazer muito mais do que isso (veja a página 67 do guia de usuário). Pra terminar, inch (polegada) é uma unidade de medida para ajudar no posicionamento de itens no seu PDF. Você pode vê-lo em ação quando nós posicionamos o logo: Image(logo, 2*inch, 2*inch). Isso quer dizer que o logotipo estará a duas polegadas do topo e a duas polegadas da esquerda.

Não recordo a razão para que os exemplos do Reportlab usem uma lista Story, mas é como nós faremos aqui também. Basicamente você cria uma linha de texto, uma tabela e imagem ou o que você quiser e as anexa à Story list. Você verá isso por todo o nosso exemplo. A primeira vez que fizemos isso foi quando adicionamos a imagem. Antes de prosseguir, precisamos olhar como adicionamos um estilo ao nosso objeto de estilos.

styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))

A razão para isso é importante e é para que você possa utilizar a lista de estilo para vários parágrafos de texto do seu documento. No código anterior, criamos um estilo de parágrafo chamado "Justify". Tudo o que ele faz é justificar nosso texto. Você verá um exemplo disso depois no texto. Por ora, vamos ver um exemplo rápido

ptext = '<font size=12>%s</font>' % formatted_time
Story.append(Paragraph(ptext, styles["Normal"]))

Para a nossa primeira linha de texto, usamos a classe Paragraph. Como você pode ver, a classe Paragraph aceita algumas tags estilo HTML. Aqui nós definimos o tamanho da fonte para 12 e usamos o estilo normal (que é alinhado à esquerda, entre outras coisas). O resto do exemplo é basicamente a mesma coisa, só que com espaçadores (Spacers) colocados aqui e ali. No fim, nós chamamos doc.build para criar o documento.

Resumindo

Agora você sabe o básico sobre criação de PDFs em Python usando Reportlab. Nós nem sequer arranhamos a superfície daquilo tudo que podemos fazer com Reportlab. Alguns exemplos incluem tabelas, gráficos, paginação, sobreposição de cores, links, gráficos e muito mais. Eu recomendo bastante que você baixe o módulo junto com o guia de usuário e mande ver!

Viagem a Marte

6 fev 2012

Que hão de buscar eles lá no MarteLágrima Lunar
Se há tanto pra verem onde passem
Que vinte mil anos não bastassem
Pra que a Terra vissem: cada parte

Que força que os move desse jeito?
Talvez o mistério acumulado?
Ou o náutico coração herdado
Bate incandescente em nosso peito?

Se de içar há mesmo, o astrobote
Só desejo que por vosso plano
O vosso caminho tenha volta

Se um dia o Sol brilhar bem mais forte
Se ouvirá talvez de um marciano
"Que hão de fazer lá na Terra morta?"

-- Cárlisson Galdino

Special: 

Promoção Super5

3 fev 2012

Super5

Acreditem ou não o Twitquero ainda está com problemas, desde domingo!

O site funciona totalmente, menos a opção de login. Então, temos o problema: como eu faço para sortear os kits sem poder fazer login na minha conta?

A solução foi vindo aos poucos. Eu realmente gostaria de sortear o 5 kits no mesmo dia, e que esse dia fosse o dia 29 de janeiro. Esperei 24 horas e nada, então sorteei os 3 kits do nBardo.

Então, hoje, 5 dias depois do dia planejado, rastreei manualmente e sorteei por conta própria os dois kits restantes, método que detesto, tanto pela auditabilidade quanto pela praticidade. Enfim, foi o jeito.

Os ganhadores são: @ed_rodrigues3 e @marcos_tti. Aqui seguem, então, os 5 sorteados:

  1. marciopedro@...
  2. poetalimajunior@...
  3. deboraaniel@...
  4. @ed_rodrigues3
  5. @marcos_tti

Dois já responderam ao contato, mas ainda não enviei nenhum dos kits. Devo colocar ao menos esses dois nos correios na próxima segunda-feira, lembrando que o pendrive de 4G já vai com o CyanPack 12.0!

Obrigado a todos que participaram! E continuem acompanhando o Bardo WS!

Special: 

Páginas