O PSL-PI tem por objetivo incentivar o uso e a produção de software livre no Piauí como política de combate à exclusão digital. Acreditamos que a distribuição de conhecimentos proporcionada pelo Open Source/Software Livre tornará nossa sociedade mais justa e próspera, exatamente por dar a todos as mesmas condições de conhecimento e desenvolvimento.
Software Livre é uma grande oportunidade de construirmos uma sociedade produtora de ciência, independente e efetivamente competitiva. Estamos reconstruindo as bases da nossa sociedade, não mais calcados nos braços do Estado, mas sim, amparados pela iniciativa própria, pela auto-determinação. Nós somos capazes de nos auto-governar. Somos capazes de construir uma sociedade efetivamente Livre. Esta é a essência do PSL-PI.
O PSL-PI é formado pela articulação de indivíduos que atuam em instituições publicas e privadas, grupos de usuários e desenvolvedores de software livre, empresas, governos ou ONGs, e demais setores da sociedade. O importante é a consciência e disposição para propagar o uso de software livre e a cultura colaborativa nas diferentes esferas da sociedade.
AJ O. Alves: Conexão com múltiplas DBs no Ruby On Rails
27 de Novembro de 2012, 0:00 - sem comentários aindaQue o framework Ruby on Rails é uma mão na roda para várias das situações do cotidiano dos desenvolvedores WEB não é segredo. No entanto algumas vez é necessário fazer algumas tarefas que não são tão comuns, como por exemplo conectar nossa aplicação em vários bancos de dados.
Imagem de www.askqtp.com |
Então, vamos lá! Mostrarei a vocês como fazer o ActiveRecord (Classe para abstrair o nível de Banco de Dados) conectar-se a múltiplos banco de dados relacionais (Em um postagem futuro mostrarei como trabalhar com NoSQL), semelhantes, ou diversos dentre SQLite, MySQL, PostgreSQL, OracleSQL, SQL Server …
Aplicação de Exemplo: Quero cria uma aplicação para gerenciar projetos. No entanto quero que a tabela de usuário fique em uma base da dados externa a aplicação para que outras aplicações futuras também utilizarem essa base de usuários unificada.
Passo 1: Configurar seu database.yml
O primeiro passo, é configurar seu config/database.yml para realizar suas conexões, por exemplo, temos este arquivo:
# SQLite version 3.x# gem install sqlite3## Ensure the SQLite 3 gem is defined in your Gemfile# gem 'sqlite3'development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 # Warning: The database defined as "test" will be erased and# re-generated from your development database when you run "rake".# Do not set this db to the same as development or production.test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000 production: adapter: sqlite3 database: db/production.sqlite3 pool: 5 timeout: 5000
Este é o padrão de criação com uma base no SQLite, por padrão configuradas com o nome dos ambientes de execução, vamos agora montar uma nova configuração, chamei ela de “database_externa_1” note que faremos conexão com um banco MySQL, o que é perfeitamente possível, já que o árduo trabalho de saber como lidar com cada tipo de base de dados é do ActiveRecord. Lembre também de referenciar as GENs dos adapters que estiver utilizando, neste exemplo “gem ‘sqlite3′; gem ‘mysql2′;“
development: adapter: sqlite3 database: db/development.sqlite3 pool: 5 timeout: 5000 test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 timeout: 5000 production: adapter: sqlite3 database: db/production.sqlite3 pool: 5 timeout: 5000 database_externa_1: adapter: mysql2 encoding: utf8 database: test_db pool: 5 username: root password: root host: localhost
Passo 2: Criar uma Classe para manipular a conexão
O segundo passo é criar uma classe que servira para manipular a nova conexão, para isso, primeira vamos criar um arquivo chamado “my_databases.rb” dentro da pasta “config/initializers/“, tudo que precisamos agora é criar uma classe que herde a classe ActiveRecord::Base, por exemplo:
class ProjectDB < ActiveRecord::Base self.abstract_class = true establish_connection Rails.env.to_symend class TestDB < ActiveRecord::Base self.abstract_class = true establish_connection :database_externa_1end
Muita atenção neste ponto!!! Porque eu criei duas classe?!
Basicamente por organização e simplicidade, para que cada modelo fique explicitamente vinculado a qual conexão ele pertence!
A primeira classe “ProjectdDB” faz referência as conexões padrões (:development, :test, :production) em SQLite. Note no valor que é passado ao método “establish_connection” que é Rails.env.to_sym.
A segunda classe “TestDB” faz referência a nossa base de dados externa em MySQL.
Obs:. “self.abstract_class = true” significa dizer que a classe é abstrata, ou seja, não pode ser instanciada só herdada.
Neste ponto já possuímos toda a nossa aplicação configurada para trabalhar com base de dados distintas. Agora mostrarei através de exemplos como devemos trabalhar.
Exemplo 1: Criar a tabela de usuários.
rails generate scaffold user name:string email:string invoke active_record create db/migrate/20121127205353_create_users.rb create app/models/user.rb invoke test_unit create test/unit/user_test.rb create test/fixtures/users.yml invoke resource_route route resources :users invoke scaffold_controller create app/controllers/users_controller.rb invoke erb create app/views/users create app/views/users/index.html.erb create app/views/users/edit.html.erb create app/views/users/show.html.erb create app/views/users/new.html.erb create app/views/users/_form.html.erb invoke test_unit create test/functional/users_controller_test.rb invoke helper create app/helpers/users_helper.rb invoke test_unit create test/unit/helpers/users_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/users.js.coffee invoke scss create app/assets/stylesheets/users.css.scss invoke scss create app/assets/stylesheets/scaffolds.css.scss
Como a tabela de usuários deve ficar na base externa devemos tomar alguns procedimentos:
1º – Alterar o arquivo app/models/user.rb
class User < ActiveRecord::Base attr_accessible :email, :nameend
para:
class User < TestDB attr_accessible :email, :nameend
substituir o ActiveRecord::Base por sua subclasse TestDB, assim, a aplicação se onde encontrar a tabela users que será criada.
2º – Radar a migração de forma apropriada
rake db:migrate RAILS_ENV=database_externa_1 == CreateUsers: migrating ==================================================== -- create_table(:users) -> 0.0711s == CreateUsers: migrated (0.0712s) ===========================================
passando a conexão “database_externa_1” como parâmetro, assim, a tabela será criada no banco externo.
Exemplo 2: Criar a tabela de projetos.
rails generate scaffold project user_id:integer name:string description:text invoke active_record create db/migrate/20121127212538_create_projects.rb create app/models/project.rb invoke test_unit create test/unit/project_test.rb create test/fixtures/projects.yml invoke resource_route route resources :projects invoke scaffold_controller create app/controllers/projects_controller.rb invoke erb create app/views/projects create app/views/projects/index.html.erb create app/views/projects/edit.html.erb create app/views/projects/show.html.erb create app/views/projects/new.html.erb create app/views/projects/_form.html.erb invoke test_unit create test/functional/projects_controller_test.rb invoke helper create app/helpers/projects_helper.rb invoke test_unit create test/unit/helpers/projects_helper_test.rb invoke assets invoke coffee create app/assets/javascripts/projects.js.coffee invoke scss create app/assets/stylesheets/projects.css.scss invoke scss identical app/assets/stylesheets/scaffolds.css.scss
Como a tabela de projetos deve ficar na base local:
1º – Alterar o arquivo app/models/project.rb
class Project < ActiveRecord::Base attr_accessible :description, :name, :user_idend
para:
class Project < ProjectDB attr_accessible :description, :name, :user_id belongs_to :userend
substituir o ActiveRecord::Base por sua subclasse ProjectDB. Note que toda as relações entre os modelos podem ser construídas normalmente, para a aplicação não faz mais diferença a sua localidade ou tipo. Então configure o modelo “user” também:
class User < TestDB attr_accessible :email, :name has_many :projectsend
2º – Radar a migração de forma apropriada
rake db:migrate == CreateUsers: migrating ==================================================== -- create_table(:users) -> 0.0014s == CreateUsers: migrated (0.0015s) =========================================== == CreateProjects: migrating ================================================= -- create_table(:projects) -> 0.0014s == CreateProjects: migrated (0.0015s) ========================================
Veja que não a necessidade de passar a conexão com o parâmetro, pois será utilizada a padrão do ambiente.
Agora, todos os modelos do seu projeto devem herdar de ProjecDB e não mais de ActiveRecord::Base.
Pronto, isso é tudo o que você deve saber para trabalhar com múltiplas base de dados relacionais em seu projeto Ruby on Rails.
Para testar, vá ao terminal:
rails cLoading development environment (Rails 3.2.8)1.9.3p194 :001 > User.create(:name => "AJ Alves", :email => "aj.alves@zerokol.com") (0.1ms) BEGIN SQL (0.3ms) INSERT INTO `users` (`created_at`, `email`, `name`, `updated_at`) VALUES ('2012-11-27 21:37:28', 'aj.alves@zerokol.com', 'AJ Alves', '2012-11-27 21:37:28') (36.6ms) COMMIT => #<user 21:37:28="21:37:28" 2="2" aj.alves="aj.alves" alves="alves" created_at:="created_at:" email:="email:" id:="id:" name:="name:" updated_at:="updated_at:" zerokol.com="zerokol.com"> 1.9.3p194 :002 > Project.create(:user_id => 1, :name => "Teste", :description => "Um projeto de teste") (0.0ms) begin transaction SQL (0.4ms) INSERT INTO "projects" ("created_at", "description", "name", "updated_at", "user_id") VALUES (?, ?, ?, ?, ?) [["created_at", Tue, 27 Nov 2012 21:38:16 UTC +00:00], ["description", "Um projeto de teste"], ["name", "Teste"], ["updated_at", Tue, 27 Nov 2012 21:38:16 UTC +00:00], ["user_id", 1]] (117.6ms) commit transaction => #<project 1="1" 21:38:16="21:38:16" 2="2" created_at:="created_at:" de="de" description:="description:" este="este" id:="id:" m="m" name:="name:" projeto="projeto" teste="teste" updated_at:="updated_at:" user_id:="user_id:"> 1.9.3p194 :003 > u = User.first User Load (0.4ms) SELECT `users`.* FROM `users` LIMIT 1 => #<user 1="1" 21:33:42="21:33:42" aj.zerokol="aj.zerokol" alves="alves" created_at:="created_at:" email:="email:" gmail.com="gmail.com" id:="id:" name:="name:" updated_at:="updated_at:"> 1.9.3p194 :004 > u.projects Project Load (0.2ms) SELECT "projects".* FROM "projects" WHERE "projects"."user_id" = 1 => [#<project 1="1" 21:33:58="21:33:58" created_at:="created_at:" d="d" description:="description:" dsfsdf="dsfsdf" este="este" id:="id:" name:="name:" sdf="sdf" sdfs="sdfs" updated_at:="updated_at:" user_id:="user_id:">, #<project 1="1" 21:38:16="21:38:16" 2="2" created_at:="created_at:" de="de" description:="description:" este="este" id:="id:" m="m" name:="name:" projeto="projeto" teste="teste" updated_at:="updated_at:" user_id:="user_id:">] 1.9.3p194 :005 > p = Project.first Project Load (0.2ms) SELECT "projects".* FROM "projects" LIMIT 1 => #<project 1="1" 21:33:58="21:33:58" created_at:="created_at:" d="d" description:="description:" dsfsdf="dsfsdf" este="este" id:="id:" name:="name:" sdf="sdf" sdfs="sdfs" updated_at:="updated_at:" user_id:="user_id:"> 1.9.3p194 :006 > p.user User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 => #<user 1="1" 21:33:42="21:33:42" aj.zerokol="aj.zerokol" alves="alves" created_at:="created_at:" email:="email:" gmail.com="gmail.com" id:="id:" name:="name:" updated_at:="updated_at:"> 1.9.3p194 :007 >
Aracele Torres: Take Action: Google faz campanha por liberdade na internet
22 de Novembro de 2012, 0:00 - sem comentários aindaA Google acaba de lançar a campanha Take Action para defender a liberdade na internet. A campanha objetiva fazer pressão para impedir que os governos que se reunirão em dezembro durante a World Conference on International Telecommunications (WCIT) imponham restrições e censura à internet. A reunião, que é organizada pelas Nações Unidas, promete tratar do futuro da internet e aprovar propostas secretas para o seu gerenciamento, que ferem o nosso direito à liberdade nesse espaço.
No site da campanha a Google afirma: “Apóie a Internet livre e aberta. Um mundo livre e aberto depende de uma Internet livre e aberta. Os governos por si sós não podem determinar o futuro da Internet. Os bilhões de pessoas em todo o mundo que usam a Internet, bem como os especialistas que a desenvolvem e a mantêm, devem ser incluídos.”
Também há um vídeo promocional no qual pessoas do mundo inteiro dizem em suas línguas nativas: “Uma web livre e aberta depende de mim”.
Filipe Saraiva: URGENTE: pedido de doações para Daniel Nicoletti, aka dantti
9 de Novembro de 2012, 0:00 - sem comentários aindaDaniel Nicoletti é um importante desenvolvedor brasileiro do KDE, criador, mantenedor e principal desenvolvedor do packagekit, Apper (KPackageKit), libdebconf-kde, colord-kde, Print Manager, Photo Book, entre outros.
Em abril de 2011 ocorreu uma tragédia na família do programador: um acidente automobilístico em uma viagem de mudança para a Argentina vitimou sua filha Giovanna, de apenas 1 ano e 4 meses. Na época, a comunidade KDE dedicou o lançamento do KDE 4.6.3 à memória da criança.
No último dia 7 de novembro, dantti saiu de viagem para a República Tcheca com a finalidade de participar do Linux Color Management Hackfest. Entretanto, ele foi detido pela imigração Alemã em Munique, respondendo a um pedido de prisão internacional relacionado ao acidente de carro.
Agora a corte alemã decidirá pela extradição ou não de dantti, em um processo que poderá levar até 6 meses para ser concluído. A esposa do desenvolvedor está tentando ir à Alemanha para auxiliar na coordenação da defesa, entregar todos os documentos relacionados ao caso e acompanhar o marido nesse momento difícil.
Se você puder ajudar, contribua fazendo uma doação financeira nesta campanha no Pledgie. A família de dantti ficará muito grata pelo seu auxílio neste momento complicado pela qual está passando.
Filipe Saraiva: PDF – extensões que quebram o padrão e a “Solução Poppler”
3 de Novembro de 2012, 0:00 - sem comentários aindaRecentemente comprei um tablet com o principal objetivo de utilizá-lo para leituras em geral, em especial de artigos científicos, facilitando assim o gerenciamento, armazenamento e reduzindo o número de impressões que faço deste tipo de documento. Por conta disso, uma das funcionalidades que adoraria utilizar seria a possibilidade de fazer anotações nos arquivos que leio no tablet, manter estas anotações nos arquivos, abrir estes mesmos arquivos em um computador convencional utilizando outro software, e ainda assim conseguir visualizar e manipular as anotações feitas anteriormente.
O formato mais comum destes documentos serem encontrados é o Portable Document Format – ou PDF, que tem como característica a manutenção da formatação do documento independente da plataforma utilizada para lê-lo. O PDF é um formato originalmente desenvolvido pela Adobe em 1993 para sua suíte Acrobat, e por conta da fidelidade de formatação e independência de plataforma tornou-se um dos “padrões de fato” para compartilhamento de arquivos digitais.
As especificações do formato PDF foram durante muito tempo propriedade exclusiva da Adobe, e aqueles que queriam desenvolver alguma solução utilizando o formato tinham basicamente duas opções: ou recorriam ao pagamento de royalties para a empresa ou se empenhavam nas técnicas de engenharia reversa sobre o formato.
Isso perdurou até o ano de 2008, quando a versão 1.7 da especificação do PDF foi submetida pela Adobe à ISO, na tentativa de torná-lo um padrão aberto. Após os trâmites convencionais da organização, o PDF 1.7 entrou para rol dos formatos abertos de documento, publicado pela ISO sob o código 32000-1:2008. Você pode ter acesso ao documento pagando 238 francos suíços (253 Obamas quando este texto foi escrito) ou baixando gratuitamente uma cópia no site da Adobe.
O documento, um verdadeiro calhamaço de 756 páginas, trás as descrições completas do formato e também funcionalidades extras. Temos lá a sintaxe, como tratar gráficos, com tratar fontes, como encriptar o acesso, transparências, como adicionar áudio e vídeo ao PDF (você sabia que isso é possível?), como criar formulários interativos (sabia dessa também?) e, entre muitas outras, temos a descrição do suporte a anotações (seção 12.5).
Entretanto, apesar da existência de um padrão de suporte a anotações em PDFs, a aplicação desta especificação é totalmente dependente da implementação realizada pelos desenvolvedores. Apenas a existência de um padrão internacional ISO, documentado e certificado, não garante que todas as implementações que levam o nome do formato, de fato, estejam implementando aquilo que está especificado no padrão.
E este é um dos grandes problemas que afetam o formato PDF. Diversas implementações seguem apenas um subconjunto da especificação padrão, notadamente a renderização dos arquivos, tratamento de fontes, etc. Demais funcionalidades que permitem o uso dos arquivos desse formato para além da visualização fiel de documentos, ou muitas vezes não são implementadas, ou pior, são implementadas de uma forma que não seguem a especificação do padrão.
Esta tática é comumente utilizada por alguns atores da indústria de software para manter, a força, os usuários nos domínios de seus produtos, impedindo a migração ou mesmo o uso simultâneo de soluções diferentes para um mesmo fim.
Daí decorre a confusão de normalmente acharmos que não há um padrão para o uso de anotações em PDF: na verdade ele existe, mas é sumariamente negligenciado por empresas que desenvolvem softwares nesse campo, onde estas preferem implementar um padrão próprio não compatível com a especificação e não compatível com outros programas similares.
A solução para este problema é um pouco complicada. No mundo ideal, todos os leitores de PDF e bibliotecas associadas deveriam implementar a especificação ISO 32000-1:2008, mas não vivemos nesse mundo. Uma possibilidade seria termos conhecimento a priori se determinado software implementa ou não a especificação padrão, mas dificilmente encontramos esta informação de uma forma fácil.
Portanto, uma das saídas é elencar quais funcionalidades você gostaria de utilizar que não fossem dependentes de apenas um distribuidor, e sair testando a esmo quais delas são compatíveis em quais softwares. Outra saída seria utilizar softwares leitores de PDF baseados em Poppler, que implementem as funcionalidades que você deseja.
Poppler é uma biblioteca livre (GPL 2) multiplataforma voltada para renderização de PDFs, e implementa o padrão ISO 32000-1:2008. Esta biblioteca é um projeto apoiado pela freedesktop.org, iniciativa que provê padrões interoperáveis entre os diversos ambientes desktop livres e unix’s em geral. Poppler atingiu um nível de maturidade suficiente para que a Free Software Foundation retirasse o desenvolvimento da biblioteca GNU PDF de sua lista de projetos de alta prioridade.
O software leitor de documentos universal do KDE, Okular, durante alguns anos teve como o pedido de funcionalidade mais recorrente o suporte a anotações em PDFs. O software até lia anotações que seguiam o padrão ISO, mas não as salvava como metadados do próprio PDF. Até então, o Okular utilizava um “truque” para suportar anotações em todos os tipos de documentos que ele lê criando um formato de projeto .okular onde eram salvos o arquivo em si e os metadados das notas.
Após a adoção da versão 0.20 da biblioteca Poppler no último lançamento do KDE 4.9, o Okular versão 0.15.2 passou a suportar a gravação das anotações no próprio PDF. Para tanto, basta após a realização das anotações, ir em Arquivo -> Salvar Como. Na imagem abaixo, temos o arquivo PDF com duas anotações realizadas no Okular:
Para testar o suporte destas anotações em outro software, abri-o no Evince, o leitor de documentos do Gnome que também usa a biblioteca Poppler. Eu não consegui fazer anotações nesse software (acho que ele não suporta esta funcionalidade), mas ele conseguiu apresentar as anotações anteriormente realizadas no Okular:
Portanto, vale lembrar: Poppler dá suporte a funcionalidades e segue a maneira como estas são especificadas no padrão PDF; entretanto, o software que utiliza Poppler ainda deve prover o acesso a estas funcionalidades. É possível encontrar na página wiki do projeto uma lista de leitores de PDF que utilizam Poppler.
Entretanto, o Poppler deve ser tratado como uma “quase solução” para o problema que relatei no primeiro parágrafo. No Android, até o momento, não temos um bom leitor de PDFs baseado nessa biblioteca. Existe o apdfviewer, mas de acordo com seu repositório faz algum tempo que ele não é mais desenvolvido. Portanto, para o problema de manter anotações em PDFs e compartilhá-las entre distribuições GNU/Linux e Android, a saída seria desenvolver um novo leitor PDF baseado em Poppler, fazer um fork do apdfviewer e implementar o que falta, ou fazer os testes a esmo sobre a compatibilidade dessa funcionalidade.
Portanto, gostaria de convidar quem se interessou pelo tema a compartilhar nos comentários quais os leitores PDF que você utiliza, em qual plataforma os usa, se eles seguem um padrão que permite a você utilizar as funcionalidades em um e outro, e mais assuntos sobre o tema. Inclusive, seria muito útil criarmos uma tabela para visualizarmos quais funcionalidades são compartilhadas por quais softwares leitores de PDF que temos disponíveis por aí. Você pode baixar artigo de uma página com as anotações que utilizei como exemplo neste link.
P.S.: se você não conhece, visite o site pdfreaders.org, mantido pela FSFE, que contém vários softwares livres leitores de PDF. O objetivo é criar um repositório e uma conscientização de que leitor de PDF não é necessariamente Adobe Reader. Aliás, eu fiz a tradução do site para o português nos idos de 2009.
Aracele Torres: Me, Konqi and KDE Brazil at Latinoware 2012
3 de Novembro de 2012, 0:00 - sem comentários aindaOnce again attending the Latinoware! Last year KDE celebrated 15 years of history and I presented it to event attendees. This year I presented a talk about “How to contribute with KDE without to write any code.” The idea was to show people that you don’t need to be a developer to contribute to KDE or any other free software project. The talk was focused on general public and I tried to present the internacional community responsible for 16 years of KDE Project, and the various activities that are necessary to develop a project such this.
The event also was attended by our illustrious mascot Konqi! It was a success at the event and everyone wanted to touch it and take a picture with it.
I liked to present talk about KDE again. Next year I would like to contribute once more because will be especial, KDE will celebrate 5 years of participation at the Latinoware. Latinoware will celebrate ten years and half these KDE Brazil was present. It’s an indication that our community is growing stronger.
More pictures of Latinoware are here!