Ir para o conteúdo
ou

Software livre Brasil

Tela cheia Sugerir um artigo
 Feed RSS

Projeto Software Livre - Piauí

15 de Janeiro de 2010, 0:00 , por Software Livre Brasil - | Ninguém está seguindo este artigo ainda.

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, por Software Livre Brasil - 0sem comentários ainda

Que 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, por Software Livre Brasil - 0sem comentários ainda

A 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”.

A campanha convida os internautas do mundo inteiro para defenderem seus direitos e  registrar no site sua opinião.
Não há dúvida de que a Google enquanto uma grande empresa de tecnologia está preocupada em defender seus interesses, mas campanhas como essas são sempre úteis e importantes para impedir o avanço da censura na internet, e devemos saber aproveitá-las ao nosso favor. Coisas como o Transparency Report e o apoio da Google ao protesto contra SOPA/PIPA ajudam nessa árdua batalha por uma internet livre e aberta. Toda ajuda aqui será importante! Até porque tentativas de controlar a internet são, e sempre serão, recorrentes, essa é uma guerra que talvez nunca cessará.
Aqui está um vídeo que esclarece melhor essa situação de ameaça. Esse vídeo foi produzido pela Fight for the future, que também trabalha em projetos de defesa da liberdade na internet:
Países como China, Irã e Rússia estão interessadíssimos em impor ainda mais censura ao conteúdo da web em seus territórios, é importante que nós nos mobilizemos para impedir que essa situação se agrave. Na verdade, é necessário uma mobilização para que a censura que já exista seja contornada e para que os governos não consigam estabelecer um controle sobre o ambiente aberto da internet. Seja através de apoio a campanhas como essa da Google, seja criando novas campanhas ou formas de resistência, precisamos nos opor!



Filipe Saraiva: URGENTE: pedido de doações para Daniel Nicoletti, aka dantti

9 de Novembro de 2012, 0:00, por Software Livre Brasil - 0sem comentários ainda

Daniel 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, por Software Livre Brasil - 0sem comentários ainda

Recentemente 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, por Software Livre Brasil - 0sem comentários ainda

Once 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.

Photo: Jean Pavão/PTI

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.

KDE Brazil and Konqi! =)

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. :D 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! ;-)



Tags deste artigo: projeto software livre - piauí psl-pi piauí psl-nordeste