Menssagem de erro

  • O login com OpenID falhou.
  • O login com OpenID falhou.
  • O login com OpenID falhou.
  • O login com OpenID falhou.
  • O login com OpenID falhou.

artigo

Dynasty Warriors

Dynasty Warriors DS

Hoje mais uma grande franquia de jogos faz aniversário. Trata-se da Dynasty Warriors, uma franquia de jogos de estratégia tática criada pela Tecmo Koei, inspirada no Romance dos Três Reinos, que completa 15 anos hoje.

Nos jogos da série, você escolhe um entre três reinos (Wu, Shu ou Wei) e segue china afora derrotando rivais menores e, por fim, derrotando os genearais dos outros dois reinos. Para isso, usa-se estratégia do avanço através do mapa, combinado com ação nos momentos de confronto, contra os soldados e arqueiros do oponente. O objetivo final é conseguir a unificação da China.

O título mais recente da série é o Dynasty Warriors 7, para Playstation 3, Xbox 360 e Windows. O curioso é que apenas a partir do segundo, o jogo passou a ter esse formato hoje conhecido. O primeiro título era um jogo de luta tipo Tekken, tanto que a série de estratégia no Japão se chama Shin Sangokumusou e tem uma contagem diferente da ocidental: por exemplo, Dynasty Warriors 3 lá é Shin Sangokumusou 2.

  1. Dynasty Warriors (1997) - Playstation
  2. Dynasty Warriors 2 (2000) - Playstation 2
  3. Dynasty Warriors 3 (2001) - Playstation 2 e Xbox
  4. Dynasty Warriors 4 (2003) - Playstation 2, Xbox e Microsoft Windows
  5. Dynasty Warriors (2004) - Playstation Portable
  6. Dynasty Warriors Advance (2005) - GameBoy Advance
  7. Dynasty Warriors 5 (2005) - Playstation 2, Xbox e Microsoft Windows
  8. Dynasty Warriors Vol. 2 (2006) - Playstation Portable
  9. Dynasty Warriors DS: Fighter's Battle (2007) - Nintendo DS
  10. Dynasty Warriors 6 (2007) - Playstation 3, Playstation 2, Playstation Portable, Xbox 360 e Microsoft Windows
  11. Dynasty Warriors: Strikeforce (2009) - Playtation 3, Playstation Portable, Xbox 360
  12. Dynasty Warriors Next (2011) - Playstation Vita
  13. Dynasty Warriors 7 (2011) - Playstation 3, X-Box 360 e Microsoft Windows

A série se estende por vários títulos mais, inclusive com uma variante (com vários títulos também) onde se joga com mechas (aqueles robôs gigantes controláveis dos animes e mangás): Dynasty Warriors Gundam.

Aqui está o trailler do Dynasty Warriors 7:

Detalhe que no Japão eles não devem comemorar esses 15 anos, já que a série Shin Sangokumusou só começou no ano 2000, no que há dois anos eles comemoraram 10 anos da série.

Special: 

Como funciona um blog, para leigos

Antes de mais nada, este artigo foi escrito para leigos, que não sabem o que é isso de CMS ou sistema de Blog. Se você sabe o que é CMS, pode ignorar este artigo sem peso na consciência.

Anos 1990

Para entendermos como tudo isso funciona, precisamos voltar no tempo para a década de 1990. Com o início da popularização da Internet, veio a ideia de que qualquer pessoa pode compartilhar algo com o mundo inteiro. Isso era feito, naquele tempo, através de homepages, que eram parecidos com blogs e sites atuais no sentido de que a gente os acessava através de um endereço. Se você pagasse o necessário e tivesse conhecimento de HTML (ou pagasse alguém que tivesse esse conhecimento) poderia ter o endereço minhapagina.com. Parecido com os blogs de hoje, mas com algumas diferenças muito importantes.

1) Você não poderia alterar facilmente o conteúdo das páginas. Tudo era feito diretamente nessa linguagem HTML. Precisaríamos de um programa para acessar o servidor remotamente (geralmente um gerenciador de arquivos remotos via FTP), editar a página em um programa específico (Netscape Composer?), salvar e reenviar para o servidor. Claro que não é tão simples e alguns preferiam pagar pra alguém fazer isso. Claro que se você pagasse pra alguém pra que fizesse isso por você, você ficava preso e teria que recorrer a essa pessoa sempre que precisasse atualizar a sua homepage.

2) Não tinha como ter interação com visitantes. Ao invés de comentários, o que geralmente tínhamos eram livros de visitas, que eram como tópicos em um outro site, mas linkados a partir do nosso, e nesse sim as pessoas poderiam comentar.

Resumindo: não havia interatividade.

O que é HTML?

Agora vamos dar uma pausa para explicar melhor o que é isso de HTML afinal.

Quando você digita google.com e dá ENTER, ou bardo.ws, ou fsf.org, ou trezentos.blog.br e dá ENTER, o navegador vai procurar o servidor correspondente a esse endereço. O servidor então enviará ao navegador um código estranho: o HTML. Estranho para nós, não para o navegador, pois esse código diz exatamente como a página deve ser montada. Ele diz que textos estão na página, que estilo cada porção de texto segue, que imagens estão e onde devem aparecer, quais os links e para onde apontam... Enfim, o conteúdo da página é passado para o navegador nesse formato HTML. O navegador lê esse código, coça o queixo e diz: "Ah, entendi!". Então ele reproduz na tela, para você ver, todo o texto e imagens, tudo devidamente diagramado e formatado.

Na Era das Homepages, o que fazíamos era criar páginas em HTML mesmo e deixar lá no servidor. Quando um navegador chegasse procurando por uma página chamada "sobremim.html", existia um arquivo lá no servidor com esse nome exato e que tinha mesmo um código HTML dentro. Todo o trabalho que o servidor tinha era mandar esse arquivo pro navegador, e todos os demais arquivos que fossem sendo pedidos: as fotos que constavam na página, a outra página quando a gente clicasse num link, etc.

Peraí! E se...

Lembra aquele lance de Livro de Visitas de que falei? Pois bem, ele era bem diferente das homepages. Não era uma página salva em HTML que estava nos servidor, mas sim um programa. Um software que era capaz de ler a partir de um arquivo informações organizadas, como uma tabela contendo informações como: nome, email, homepage e comentário. Assim, sempre que o navegador apontava para aquele servidor, esse programa era acionado. O programa lia o arquivo e criava um código HTML, mandando para o navegador, como se fosse uma página estática antiga. Além disso, esse programa era capaz de gravar novos comentários no final na sua tabelinha. O visitante que chegasse depois veria esse novo comentário acrescentado.

Então alguém deve ter pensado: se um programa pode funcionar em um servidor e guardar comentários... E se a homepage todinha fosse na verdade um programa? Um programa mas que o visitante nunca desconfia que é um programa: ele só vê as páginas normais, como era antigamente. Mas poderia ter um banco de dados com as informações das páginas armazenadas e o programa montaria a homepage de maneira dinâmica! E se a gente pudesse editar essas páginas no próprio navegador sem precisar de editor de HTML nem de FTP?

Foi assim que começaram a aparecer gerenciadores de conteúdo. Aí alguém pensou: e se eu fizesse um diário, com os artigos sendo publicados em ordem de defasagem: os mais novos empurrando os mais antigos para baixo? E se cada artigo desses permitisse que os visitantes comentassem, complementando, discordando ou ratificando cada artigo?

Assim foi que a Internet de blogs e sites como conhecemos hoje foi se desenhando. Hoje são raros os endereços que guardam páginas com código HTML. A grande maioria dos endereços hoje encontram programas capazes de gerar esse código dinamicamente. Blogs são programas, wikis são programas. As redes sociais são programas que rodam no servidor. O sistema de busca é um programa

Sistemas de Blog e CMS

Existem sistemas prontos para atender os usuários sem que eles saibam nada sobre programação ou administração de sistemas. E há alguns gratuitos que são assim. O próprio Google oferece o Blogger, nesses moldes.

Para quem tem seu próprio endereço e prefere gerenciar seu site com minúcia, existem bons softwares livres que fazem as vezes de blogs (e wikis, e CMSs...). Os softwares para gerenciar blog mais famosos de hoje em dia creio que sejam o Wordpress, Joomla, Plone e Drupal.

O Wordpress nasceu como um sistema para gerenciar blog, mas hoje suporta diversos outros recursos além desse. O legal é que há um serviço de blog gratuito usando o Wordpress para quem quer usar a feramenta e não quer ter que instalar e gerenciar num servidor próprio: wordpress.com.

Joomla é o grupo dissidente do Mambo. É um gerenciador de conteúdo bem completo, o que quer dizer que oferece recursos de forum, envio de arquivos, dentre vários outros.

Plone é outro bastante completo e muito utilizado aqui em Alagoas, em especial pelo Governo e pela UFAL. Um lado negativo para usuários menores é que a estrutura necessária para fazê-lo funcionar não é exatamente trivial: exige alguns programas mais difíceis de instalar do que os outros que apresentei.

E o Drupal, claro! O Drupal é o CMS que utilizo no Bardo WS. Ele oferece diversos recursos também e tem me atendido desde que comecei a utilizá-lo.

Bom, deu pra entender um pouco como funcionam blogs por dentro? Algumas dúvidas mais? Pode mandar ver!

Special: 

CyanPack - 5 anos e 50 releases!

O CyanPack é um conjunto de softwares livres para Windows similar ao projeto OpenDisc, mas com características bem próprias.

Disponível em dois formatos: CD e DVD. O CD traz softwares livres para Windows apenas em formato executável, enquando a versão em DVD acrescenta o código-fonte de todos esses softwares, além de uma versão sutilmente remasterizada do sistema operacional livre Trisquel.

Tanto o CD como o DVD trazem além de software, material diverso para leitura, incluindo a edição mais recente de revistas digitais como a Revista Espírito Livre, a Revista Programar e a Revista Nintendo Blast. Trazem também alguns livros digitais, dentre eles muitos de Cárlisson Galdino (incluindo cordéis).

A edição mais recente, a 12.0 - Mitromorpha Azorensis - marca o projeto como o quinquagésimo release. Por isso, aqui você verá uma breve história do projeto CyanPack, algumas curiosidades sobre o projeto e a lista de todas as versões já liberadas. Espero que você goste! (E se você estiver na rede social SoftwareLivre.org, não deixe de participar também da comunidade CyanPack)

História

Criado em 2006 para facilitar a instalação de softwares no Campus Arapiraca da UFAL, o projeto NTI-CD reunia softwares gratuitos cujas licenças permitissem redistribuição. Em 2007, passou a ter lançamentos mensais de novas versões. Na versão 7.2 (primeira a ser tornada pública), passou a funcionar também como utilitário, ao incorporar a distribuição GNU/Linux DSL, funcionando como um LiveCD.

Em janeiro de 2008, em sua versão 8.1, o nome do projeto mudou para CyanCD, continuando com edições mensais.

Em janeiro de 2010, o projeto passou a ser bimestral, mas em 2011 sua periodicidade ficou indefinida, tendo versões publicadas com diferença de um ou de dois meses para suas antecessoras.

Em janeiro de 2011, o projeto deixou de trazer softwares gratuitos para Windows para trazer exclusivamente softwares livres. Na versão 11.5 (julho de 2011), ocorreu nova mudança de nome. O projeto, para oferecer ainda mais a seus usuários, mudou de CyanCD para CyanPack.

Curiosidades

Cada edição do CyanPack, desde a época em que se chamava NTI-CD, traz um papel de parede temático. Posteriormente, o pacote passou a trazer duas versões do papel de parede: uma normal e outra sob aplicação de algum efeito. A finalidade do papel de parede de cada edição é para servir de informação visual.

Quando atualizamos os softwares em um computador a partir do CyanPack, nós mudamos o papel de parede do Administrador para o que veio naquela edição do CyanPack. Assim, quando nos depararmos com aquele mesmo computador no futuro saberemos quais softwares precisamos atualizar (considerando que o CyanPack traz memória da última atualização de cada programa, até 3 releases do CyanPack de distância).

O papel de parede com aplicação de efeito vem do uso do Firefox para atualizar um computador. Primeiro, fazemos download a partir do CyanPack de todos os programas que precisamos atualizar. Ao terminarmos esse passo, nós mudamos o papel de parede para o temático-alterado. Assim, se precisarmos interromper as atualizações por uma razão qualquer, ao nos depararmos com o computador saberemos: primeiro, que ele não está atualizado, pois parou no meio de uma atualização; segundo, qual a versão que estava sendo atualizada no momento. Se a versão era a mais recente, então basta abrir o Firefox e continuar a execução dos programas salvos. Apagando cada instalador da lista de download tão logo sua execução seja concluída.

Outra curiosidade é sobre os nomes de versão. Muitas vezes vinham estudantes ao NTI pedindo para modificar a senha. O Sistema Acadêmico da época nos permitia criar novas senhas provisórias (daquelas que, ao primeiro login, obrigam o usuário a definir uma nova senha). Era prática comum naquele tempo se colocar senhas provisórias como “12345”. A ideia de usar codinomes para o CyanPack na época foi para aproveitar esse nome como “senha provisória”. Quem mudou a senha em setembro de 2007 tinha como senha provisória “pedras”.

Com o tempo essa estratégia passou a ser não apenas desnecessária, como impraticável. Já pensou tentar explicar ao usuário como escrever uma senha provisória “kraepelini” ou “sophiae”?

Nomes de versão

Nomear projetos e dar codinome de versão é um tipo de atividade muitas vezes necessária. Para isso terminei criando até mesmo um projeto próprio: o Multiverso.

Falando especificamente de CyanCD/CyanPack, a nomeação das versões não existia a princípio, depois passou por uma fase solta até 2008, quando passou a ter temas anuais. Cada ano o CyanCD/CyanPack tem um macrotema, um universo de nomes, e as versões daquele ano seguirão esse universo como guia.

Em 2008 tivemos a família vegetal Monardela; em 2009 foi a série Invent, homenageando inventores diversos; em 2010 foi a vez dos pilotos brasileiros de Fórmula 1; enquanto este ano de 2011 os nomes seguiram a série da família de formigas Technomyrmex. O universo de 2012 é dos moluscos Mitromorpha

Release

Versão

Mês de Lançamento

Codinome

Distibuição incluída

1

07/02/11

Fevereiro de 2007

Não tinha

DSL

2

07/04/11

Abril de 2007

Não tinha

?

3

07/05/11

Maio de 2007

Não tinha

?

4

07/06/11

Junho de 2007

Não tinha

Puppy Linux

5

07/07/11

Julho de 2007

Disco

Puppy Linux

6

07/08/11

Agosto de 2007

NTI

Puppy Linux

7

07/09/11

Setembro de 2007

Pedras

Puppy Linux

8

07/10/11

Outubro de 2007

Cogumelo

Puppy Linux

9

07/11/11

Novembro de 2007

Ilha

Puppy Linux

10

07/12/11

Dezembro de 2007

Natal

Puppy Linux

11

08/01/11

Janeiro de 2008

Monardela Antonina

Puppy Linux

12

08/02/11

Fevereiro de 2008

Monardela Cinerea

Puppy Linux

13

08/03/11

Março de 2008

Monardela Crispa

Puppy Linux

14

08/04/11

Abril de 2008

Monardela Glauca

Puppy Linux

15

08/05/11

Maio de 2008

Monardela Lanceolata

Puppy Linux

16

08/06/11

Junho de 2008

Monardela Linoides

Puppy Linux

17

08/07/11

Julho de 2008

Monardela Macrantha

Puppy Linux

18

08/08/11

Agosto de 2008

Monardela Nana

Puppy Linux

19

08/09/11

Setembro de 2008

Monardela Odoratissima

Puppy Linux

20

08/10/11

Outubro de 2008

Monardela Subglabra

Puppy Linux

21

08/11/11

Novembro de 2008

Monardela Undulata

Puppy Linux

22

08/12/11

Dezembro de 2008

Monardela Villosa

Puppy Linux

23

09/01/11

Janeiro de 2009

Adolph Rickenbacker

Puppy Linux

24

09/02/11

Fevereiro de 2009

Alberto Santos Dumont

Puppy Linux

25

09/03/11

Março de 2009

Alexander Grahan Bell

Puppy Linux

26

09/04/11

Abril de 2009

Bartolomeo Cristofori

Puppy Linux

27

9.4i (flisol)

Abril de 2009

Carlos Morimoto

Puppy Linux

28

09/05/11

Maio de 2009

Cornelius Drebbel

Puppy Linux

09/06/11

Junho de 2009

Não houve

 

29

09/07/11

Julho de 2009

Hans Lippershey

Puppy Linux

30

09/08/11

Agosto de 2009

Igor Sikorsky

Puppy Linux

31

09/09/11

Setembro de 2009

Louis e Auguste Lumière

Puppy Linux

32

09/10/11

Outubro de 2009

Martin Cooper

Puppy Linux

33

09/11/11

Novembro de 2009

Otto Wichterle

Puppy Linux

34

09/12/11

Dezembro de 2009

Robert Adler

Puppy Linux

35

10/01/11

Janeiro de 2010

Ayrton Senna

Puppy Linux

36

10/03/11

Março de 2010

Emerson Fittipaldi

Puppy Linux

37

10.4i (flisol)

Abril de 2010

Supertux Kart

Puppy Linux

38

10/05/11

Maio de 2010

Felipe Massa

Puppy Linux

39

10/07/11

Julho de 2010

Nelson Piquet

Puppy Linux

40

10/09/11

Setembro de 2010

José Carlos Pace

Puppy Linux

41

10/11/11

Novembro de 2010

Rubens Barrichello

Puppy Linux

42

11/01/11

Janeiro de 2011

Technomyrmex Albipes

Puppy Linux

43

11/02/11

Fevereiro de 2011

Technomyrmex Fulvus

Puppy Linux

44

11/03/11

Abril de 2011

Technomyrmex Ilgi

MacPup

45

11/04/11

Maio de 2011

Technomyrmex Jocosus

MacPup

46

11/05/11

Julho de 2011

Technomyrmex Kraepelini

Trisquel

47

11/06/11

Setembro de 2011

Technomyrmex Madecassus

Trisquel

48

11/07/11

Outubro de 2011

Technomyrmex Pallipes

Trisquel

49

11/08/11

Dezembro de 2011

Technomyrmex Sophiae

Trisquel

5031/01/12Fevereiro de 2012Mitromorpha AzorensisTrisquel
Special: 

As pessoas não querem produtos

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: 

Criando PDFs em Python com Reportlab

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, 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!

Cyber Editor e os tutoriais receita-de-bolo

<yber Edi+or

Quando cursava Computação na UFAL, terminei me deparando certo dia com uma revista que trazia o Delphi. O Delphi 1, para ser mais exato. Claro, estava bem desatualizado, já que o Delphi estava na versão 5, se não me engano. Claro que eu poderia conseguir uma cópia pirata, até mesmo com os colegas de turma, mas eu me preocupava com essas coisas. Pensava assim: se eu não sou capaz de respeitar direitos do outros, como posso exigir que respeitem os meus quando eu me formar?

Hoje o que penso sobre pirataria como um todo mudou bastante, mas não em relação a software. Continuo contra pirataria de software, apesar de as razões para isso terem mudado. Hoje eu sei que ao usarmos softwares piratas, nós estamos nos capacitando no uso daquelas ferramentas e isso se torna um problema com o tempo. Ficamos dependentes.

Mas não é disso que quero falar hoje: é dos tutoriais estilo receita de bolo.

Naquela revista com o Delphi 1, veio um tutorial exeplicando passo a passo como construir um editor de textos. Ensinava como montar a janela e o menu (isso é até intuitivo), mas ensinava também que códigos usar para abrir e salvar um documento, para copiar e colar e para procurar textos. Com base nisso, fiz um editor de textos simples e depois comecei a personalizá-lo. Assim nasceu o Cyber Editor (ou <yber Edi+or, para ser mais exato), o editor para a quem só o texto importa.

Ele tinha dois modos de apresentação: o modo normal e o modo Cyber. No normal, ele era uma janela simples; no Cyber ele mudava para tela cheia, aumentando a área útil para edição. Seu visual com texto verde sobre o fundo preto era algo de que eu gostava bastante naquele tempo.

Eu me lembro também de ter implementado duas funcionalidades interessantes para ele.

A primeira era a opção de adicionar comandos, como um editor para programador. Você poderia definir, por exemplo, um comando no menu que abriria o navegador web com a página que você está editando no momento, ou um compilador.

Outra funcionalidade bastante útil eram os SSC, os scripts de Substituições Sucessivas Cyber. Havia comandos para acrescentar linhas no início e no fim do arquivo, para remover linhas e, claro, para substituir. Assim, poderíamos transformar HTML em texto, texto em HTML, texto em RTF e outras brincadeiras mais, utilizando simplesmente esse script.

O <yber Edi+or era meu editor padrão no Windows naqueles tempos e senti saudade dele à medida em que fui vivendo cada vez mais em GNU/Linux. Não havia Lazarus para portar.

Uma coisa muito legal sobre o <yber Edi+or é que ele apareceu um dia no caderno especial da Revista Veja. Aquele caderno que eles lançavam pelo menos uma vez por ano, trazendo recomendações de download diversas, divididas por categoria. Certo dia eu vejo o <yber Edi+or lá, na página de Editores de Texto! "Se só o texto importa, o Cyber Editor é uma opção". Bons tempos aqueles!

Isso tudo que estou falando hoje é para reforçar a importância de tutoriais estilo "receita de bolo". São muito bons! Se a gente consegue fazer o básico e entendê-lo completamente, fica fácil expandir esse básico e incorporar novas ideias. Não tenho visto com frequência tutoriais tão bons quanto aqueles e realmente gostaria de ver. Faço então um apelo: se você domina uma ferramenta de desenvolvimento, por que não fazer um tutorial desses? Explique como funciona uma calculadora básica, como fazer um jogo de quebra-cabeças básico, como criar um desklet que leia notícias a partir de um RSS, ou um cliente básico de Twitter. Você pode, sem perceber, estar contribuindo para o nascimento de um novo grande software.

Quanto ao <yber Edi+or? Bom, depois das substituições sucessivas e tudo o mais, eu tinha muitas boas ideias. Acontece que ele havia sido feito de um jeito "tão Delphi", sem muita organização, que eu planejei refazê-lo do início. Era o Projeto Simbionte: um editor que se integraria completamente ao usuário, um projeto ousado, modular, complexo. Nunca escrevi uma linha de código efetiva para o Simbionete. Este projeto morreu antes mesmo de nascer, por excesso de planejamento e de diagramas.

Special: 

Homebrew nos Videogames

O mundo dos videogames sempre foi um mundo excessivamente restrito. No início somente o fabricante do console podia lançar jogos no mercado. O tempo foi passando e hoje existem várias softwarehouses por aí desenvolvendo jogos para os diversos consoles de videogame. O problema é que para desenvolver um jogo de console você precisa da autorização do fabricante. Uma autorização que inclui as ferramentas de software necessárias para ajudar no desenvolvimento e que custa uma fortuna.

Acontece que os fãs hackers dos videogames sempre dão um jeito de resolver esses problemas. Desenvolvem-se bibliotecas alternativas a partir de engenharia reversa e desbloqueios dos aparelhos, de modo a permitirem que desenvolvedores pequenos criem seus próprios programas.

Você pode se perguntar: Quais as vantagens disso? Primeiro, que aplicativos desse tipo podem permitir outros usos do videogame. Pode-se usar um Nintendo DS como uma agenda pessoal, rodar filmes em DVD no Wii ou usar o PSP como controle remoto da TV. Há players multimídia, editores de texto, organizadores pessoais, leitores de livros digitais, ferramentas de internet, enfim, um universo de programas para estender a utilidade dos videogames muito além do que seus fabricantes pretendiam.

O problema principal disso são justamente os fabricantes. Como se não bastasse muitas vezes os hackers terem que se virar para descobrir como se faz um programa para aquela arquitetura, ainda têm que enfrentar bloqueios e algumas vezes até mesmo ataques judiciais. A principal causa da insatisfação dos fabricantes com esses hackers diz respeito à pirataria: se é permitido escrever qualquer programa para um console, é fácil fazer com que um programa o engane e o faça aceitar jogos piratas. Os próprios emuladores são uma dificuldade, especialmente para a Nintendo, que tem como estratégia de negócios emular consoles antigos e vender jogos através de download.

Numa olhada geral, há distribuições GNU/Linux que rodam em Nintendo Wii e outras que rodam no Sony Playstation 3, não sei quanto à família X-Box. A propósito, a notícia de um Playstation (primeiro) rodando GNU/Linux é antiga e foi bem divulgada na época.

Sei é que, no fim das contas, apesar de muitas vezes nos animarem com belos trabalhos de entretenimento, todas essas empresas são nocivas para a nossa liberdade, infelizmente.

P. S.: Foto do post, de Ken Gerrard.

Special: 

Você conhece o Pitfall?

Pitfall

2012 marca o aniversário de 25 anos de 3 grandes franquias dos videogames: Mega Man, Metal Gear e Street Fighter. Acontece que uma outra franquia milionária chega este ano a uma casa ainda mais impressionante e, apesar de ter perdido muito da atenção do público, ainda se pode dizer que existe: o clássico Pitfall.

Um dos grandes jogos da Activision pro antigo Atari, foi um dos jogos mais populares para o console. Um dos primeiros, talvez, a trazer um estilo de aventura, numa época em que os jogos não traziam desafios claros: eram meros brinquedos que usávamos na tentativa de atingir a maior pontuação possível Não era comum o "zerar o jogo". Pitfall ia contra esse padrão ao trazer, já de cara, o relógio marcando 20 minutos em contagem decrescente.

Pitfall completa este ano 30 anos de vida e - creio que pouca gente saiba disso - teve sequência para outros consoles, até para o Wii (o trabalho mais recente). Eu gostava muito do jogo original, apesar de nunca tê-lo zerado, e recentemente tive contato com a versão do Mayan Adventure para Mega Drive. Gostaria de conhecer a versão para Wii e espero ter esse prazer ainda este ano.

Foram seis títulos, no total, até o momento:

  1. Pitfall (para Atari, em 1982)
  2. Pitfall II: Lost Caverns (também para Atari, em 1984)
  3. Super Pitfall (para Nintendinho, em 1986 - espero que entenda que Nintendinho não é um nome carinhoso, mas uma referência ao console de 8 bits, que antecedeu o Super Nintendo)
  4. Pitfall: The Mayan Adventure (para Super Nintendo, em 1994)
  5. Pitfall 3D: Beyond the Jungle (para Playstation, em 1998)
  6. Pitfall: The Lost Expedition (para diversos consoles, em 2004)

Cada um desses títulos apareceu em muitos consoles. Desde o original, que também pintou em console Commodore, Intellivision e Sega, até o mais recente, lançado para GameCube, PlayStation 2, Game Boy Advance, Xbox, Windows e na versão Wii, lançada em 2008, chegou a mudar de nome para Piftall: The Big Adventure. Ou seja: tem pra todos os gostos! Eu posso estar enganado, mas esse jogo mais novo da franquia parece bem divertido. Vejam o video abaixo.

Não sei se a Activision preparou alguma comemoração especial para a data, seria bacana. De qualquer forma, parabéns para eles e para Pitfall Harry! E, se você quiser matar a saudade da versão original para Atari (ou mesmo conhecer, se nunca teve oportunidade antes), há como jogá-la no navegador mesmo no site Jogos de Atari.

O engraçado é que aquele ser que aparece embaixo da terra eu sempre pensei que fosse uma "caveirinha" e só hoje descobri que era um escorpião. Esse mundo de Atari... kkkkkkkkk

Top 100 - Jogos livres

Fiz uma listinha com os jogos livres mais baixados do Sourceforge. A lista não está completa. Senti falta de Pingus, Wormux e Battle for Wesnoth (por isso os acrescentei nas 3 últimas posições), embora vários outros estejam faltando, inclusive muitos dos mais baixados podem estar faltando (é a desvantagem de um projeto ter recursos próprios e não usar o Sourceforge). Bem, Acrescentei aos números os downloads do repositório estável do Ubuntu.

Reforçando: definitivamente não é fácil traçar as estatísticas de download de um software livre com precisão, especialmente se ele é popular. Um software gratuito tradicional para Windows pode muito bem ser baixado prioritariamente de um só lugar: o site do fabricante. Quando o software é livre e, principalmente, tem versão para GNU/Linux e é popular, ele acaba sendo oferecido nos repositórios de várias distribuições. Imagine um software livre que seja instalado por padrão em todos os Linux Mint, por exemplo. Isso, por si só já é um número bastante respeitável. É muito vantajoso usar repositórios de pacotes e em nenhuma circunstância eu recomendaria seu abandono. Porém, há efeitos colaterais e este é um deles.

Resumindo: definitivamente, esta lista não está completa. Tanto em itens faltantes quanto em downloads não computados. De qualquer forma, não deixa de ser um bom ponto de partida para quem quer conhecer um pouco do mundo dos jogos que são softwares livres.

Para quem não conhece as siglas: FPS são jogos de tiro em primeira pessoa; RTS são jogos de estratégia em tempo real; TBS são jogos de estratégia baseados em turno.

    

PosiçãoJogoGênero
1ZSNESEmulador
2Visual Boy AdvanceEmulador
3Frets on FireMúsica
4StepManiaMúsica
5AssaultCubeFPS
6Rigs of RodsDrive
7TremulousFPS
8Secret Maryo ChroniclesPlataforma
9Tux RacerCorrida
10Armagetron AdvancedBatalha
11TORCSCorrida
12OpenTTDSimulador
13PouetChessXadrez
14SimutransSimulador
15BZFlagBatalha
16GlestRTS
17PokerTHCartas
18Scorched 3DRTS/TBS
19VdriftCorrida
20Vega StrikeSimulador
21Doom LegacyFPS
22NetHackTBS
23Billard GLSinuca
24FreeColSimulador
25glTronBatalha
26GcomprisInfantil
27Warzone 2100RTS
28Digital Paint: PaintballFPS
29UFO: Allien InvasionTBS
30Cannon SmashBatalha
31Danger from the DeepSimulador
32Tux TypingEstudo
33gbrainyPuzzle
34Aleph One: MaratonFPS
35LgamesColeção
36Scrabble 3DTabuleiro
37Super TuxPlataforma
38OpenLieroXWorm
39ArmagetronBatalha
40FCEUXEmulador
41GensEmulador
42YabauseEmulador
43X-MotoPlataforma
44PrBoomFPS
45Open UniverseSimulador
46Open SonicPlataforma
47RiskTabuleiro
48DominationTBS
49BolzplatzSport
50Brutal ChessChess
51MegaMekTBS
52EgobooRPG
53Speed DreamsCorrida
54WidelandsRTS
55NetHack – Falcon EyeRPG
56Extreme Tux RacerCorrida
57Ultimate StuntsCorrida
58SENEeSeEmulador
59CrossfireRPG
60Alex the AllegatorPlataforma
61OpenMortalLuta
62ChildsplayEstudo
63Brain WorkshopPuzzle
64Big SolitairesCartas
65Blobby Volley 2Esporte
66Dungeon Crawl RefRPG
67Abuse 2Plataforma
68FreeOrionTBS
69Yodda SoccerEsporte
70The Mana WorldMMORPG
71OFSETEducação
72Battle TanksBatalha
73VavoomFPS
74UFO2000TBS
75OpenTibiaRPG
76The Emilia PinballPinball
77Advanced Strategic CommandTBS
78Wesnoth for OLPCTBS
79WorldforgeMMORPG
80No GravityFPS
81VBA-MEmulador
82Tux of Math CommandEstudo
83Dark OberonRTS
84FreeDroidRPG
85Slash'emRPG
86Bygfoot Football ManagerEsporte
87nQuakeFPS
88GL-117Simulator
89Crosswords for HandheldsPuzzle
90QuadraPuzzle
91Excalibur: Morgana's RevengeFPS
92TrophyCorrida
93xu4RPG
94BomberCloneArcade
95Pocket CitySimulador
960 A. D.RTS
97The Transfusion ProjectFPS
98Battle for WesnothTBS
99PingusPuzzle
100WormuxWorms

Quanto a conclusões sobre uma olhada nesta lista, deixo para depois. Quem quiser adiantar, pode colocar as suas próprias como comentário.

Special: 

Páginas

Subscribe to RSS - artigo

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library '/opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll' - /opt/php56/lib/php/extensions/no-debug-non-zts-20131226/php_pdo_odbc.dll: cannot open shared object file: No such file or directory in Unknown on line 0