Ir para o conteúdo
ou

Software livre Brasil

Tela cheia Sugerir um artigo
 Feed RSS

Blogosfera do PSL-Ba

16 de Junho de 2009, 0:00 , por Software Livre Brasil - | 2 pessoas seguindo este artigo.

O Projeto Software Livre Bahia (PSL-BA) é um movimento aberto que busca, através da força cooperativa, disseminar na esfera estadual os ideais de liberdade difundidos pela Fundação Software Livre (FSF), possibilitando assim a democratização do acesso a informação, através dos recursos oferecidos pelo Software Livre. Esta busca tem seus alicerces fundados na colaboração de todos, formando um movimento sinérgico que converge na efetivação dos ideais de Liberdade, Igualdade, Cooperação e Fraternidade.

O Projeto Software Live Bahia é formado pela articulação de indivíduos que atuam em instituições publicas e privadas, empresas, governos ou ONGs, e demais setores da sociedade. Além disso o projeto não é subordinado a qualquer entidade ou grupo social, e não estabelece nenhuma hierarquia formal na sua estrutura interna.


Rafael Gomes: Active Check com multiplos servidores no Zabbix

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

Qualquer administrador de infraestrutura de grandes ambientes ao estudar sobre qualquer solução, seja ela livre ou não, sempre pensa: “Como posso escalar isso?”

E no Zabbix esse interesse sempre existiu, seja na utilização de proxy ou servidores atuando de forma distribuída, porém uma ótima funcionalidade do Zabbix, que é a checagem ativa (Active Check), tinha o limitador de que um agente  podia se comunicar com apenas um predeterminado servidor, ou seja, se você tivesse vários servidores em um ambiente redundante, teria que utilizar softwares externos para prover alta-disponibilidade (tal como heartbeat).

Porém na versão 1.8.12 do Zabbix, será possível utilizar mais do que um servidor para checagens ativas!

No arquivo de configuração do agente, existe um novo parâmetro, que é o ServerActive. Ele funciona da seguinte forma:

Se o parâmetro ServerActive estiver especificado, o parâmetro utilizado anteriormente para informar o servidor (Server) não será usado para checagens ativas, ou seja, apenas para checagens passivas.
Se o parâmetro ServerActive não estiver especificado, a configuração continua como versões anteriores, ou seja, o primeiro host do parâmetro Server será utilizado para checagens ativas.

 

Segue abaixo um exemplo, onde demonstra que pode ser utilizado tanto nome, como endereço IP:

ServerActive=zabbixserver,zabbixproxy1,10.1.13.13

Mas se um dos servidores estiver em uma porta diferente? Apenas coloque a porta após dois pontos, como podemos ver abaixo:

ServerActive=zabbixserver,zabbixproxy1:20051,10.1.13.13

Novamente demonstrando seu interesse pelas tendências, o IPV6 também é suportado, como podemos ver no exemplo abaixo:

ServerActive=zabbixproxy1:20051,[::1]:30051,::1,[::1]

Perceba que como o IPV6 também utiliza dois pontos no seu endereçamento, a utilização de colchetes são necessários para esses casos, ou seja, se não tiver porta a especificar, não precisa necessariamente usar colchete.

Lembrando que caso queira mudar a porta de TODOS os servidores, utilize o parâmetro ServerPort, já presente no seu arquivo de configuração.

Na versão 2.0, que ainda está em beta, existe uma pequena diferença. O parâmetro Server será utilizado APENAS para checagens passivas, ou seja, checagens ativas serão APENAS consideradas no parâmetro ServerActive.

Essa funcionalidade no momento da escrita desse post, ainda estava em teste, sob o nome de 1.8.12rc1.

Por favor, baixe essa versão de teste e reporte possíveis problemas, dessa forma estará ajudando a construir o software que utiliza.

Fonte : Zabbix Blog



Live Blue News: One week to go until LAkademy 2012

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

Hi there,

Two years ago the 1st Akademy-BR took place at Praia do Forte (BA), bringing together roughly 30 KDE Brazilian contributors, from coders to promo and translation. In that time, new regional KDE groups in Minas Gerais, Piauí and Rio Grande do Sul had just been formed and fellows like Lamarque, Filipe, and Aracele are still rocking on KDE. Akademy-BR was a nice opportunity to meet those guys in person and try to balance our efforts in pushing KDE and Brazilian community forward. From that time till now things got somehow stabilized (actually put myself as an outlier for that statistics – PhD last year sucks :) ).

An early attempt to have the 2nd Akademy-BR last year in Minas Gerais couldn’t be successfully acomplished but, as a positive side-effect, that fortunately culminated in the 1st LAkademy: Latin-American KDE Summit. From 27th April to 1st May, we shall meet at Porto Alegre to evaluate our current scenario, plan our actions in 2012-2013 (in particular, I advocate we need a second LA boost like the one we had in Brazil in 2009) and, of course, hacking. KDE contributors from Argentina, Peru, and Brazil are confirmed. Many thanks to CamilaRaw and Henrique for taking care of local arrangements and KDE e.V. and Claudia in particular to support LAkademy.

Stay tuned, see you …




Vicente Aguiar: Inscrições abertas para o III BlogProg em Salvador

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

Coloquem na agenda: o  III Encontro Nacional de Blogueir@s ocorrerá em Salvador, Bahia, nos dias 25, 26 e 27 de maio. O evento reunirá cerca de 500 ativistas digitais de todo o país! A inscrição para encontro vai até o dia 11 de maio e pode ser feita pelo site do Barão de Itararé.

A programação foi definida na reunião da comissão nacional no dia 24 de março. Os contatos já foram feitos, mas nem todos os convidados confirmaram a presença. Segundo a comissão organizadora, o III BlogProg dará maior espaço para as oficinas autogestionadas – os interessados devem apresentar sugestões de temas e de debatedores até 4 de maio e ficam responsáveis pela iniciativa.

Também haverá maior espaço para reuniões em grupo com o objetivo de intercambiar experiências, fazer o balanço das atividades no último período e traçar os próximos passos da blogosfera. Abaixo, a proposta de programação:

 

 

 

Programação

25 de maio, sexta-feira

15 horas – Início do credenciamento;

17 horas – Palestra inaugural: A luta de ideias no mundo contemporâneo

– Convidado: Michel Moore (diretor de cinema e escritor dos Estados Unidos)

19 horas – Ato político em defesa da blogosfera e da liberdade de expressão – Praça Castro Alves

- Convidados: Artistas, lideranças políticas e dos movimentos sociais;

26 de maio – sábado

9 horas – Nas redes e nas ruas pela liberdade de expressão e pela regulação da mídia

Convidados:

- Franklin Martins – ex-secretário da Secretária de Comunicação da Presidência da República;

- Emiliano José – integrante da Frente Parlamentar pelo Direito à Comunicação e pela Liberdade de Expressão;

- Gilberto Gil – ex-ministro da Cultura;

- Barbara Lopes – do movimento blogueiras feministas;

11 horas – A força das redes sociais no mundo

Convidados:

- Ignácio Ramonet – criador do Le Monde Diplomatique e autor do livro “A explosão do jornalismo”;

- Amy Goodman – fundadora do movimento Democracy Now e ativista do Ocupe Wall Street;

- Osvaldo Leon – Diretor da Agência Latino-Americana de Informação (Alai);

15 horas – Oficinas autogestionadas

(Os temas e conferencistas deverão ser propostos até 4 de maio; a organização das oficinas caberá exclusivamente aos seus proponentes);

17 horas – Apresentação e debate da proposta sobre a Associação de Apoio Jurídico à Blogosfera – Rodrigo Vianna e Rodrigo Sérvulo da Cunha;

19 horas – Lançamento oficial do Blogoosfero, Plataforma Livre e Segura para blogosfera e redes sociais

Responsáveis: Fundação Blogoosfero, Colivre, TIE-Brasil e Paraná Blogs

27 de maio – domingo

9 horas – Reuniões em grupo: balanço, troca de experiências e próximos passos da blogosfera;

12 horas – Plenária final: aprovação da Carta de Salvador, definição da sede do IV BlogProg e eleição da nova comissão nacional.

Mobilização e público-alvo

- Meta de 500 participantes de todo o país (300 da Bahia, sendo 100 do interior);

- Público alvo: ativistas digitais, estudantes, acadêmicos e jornalistas.

 

Fonte: Barão de Itararé



JavaBahia: NOSQL-BA: Inscrições abertas!!

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


Abertas as inscrições para o evento NOSQL-BA:
Para saber mais sobre os mini-cursos e palestras acesse:

Seja uma patrocinador: http://nosqlba.com.br/nosql-bahia.pdf


Os banco de Dados NOSQL (not only SQL) foram criados, principalmente, para resolver problemas com aplicações web que precisam operar com gigantescas cargas de dados além de poder escalar com grande facilidade. Esses tipos de banco de dados vem sendo usados com muita frequência em redes sociais como Twitter, Facebook, além de persistência em aplicações nas nuvens. Outro ponto importante a citar é a crescente adoção destas novas tecnologias, inclusive em mercados mais conservadores, tais como instituições financeiras e agências governamentais, seus motivos são diversos normalmente para solucionar problemas com flexibilidade, escalabilidade, latência e performance. Para demonstrar, compartilhar essas tecnologias foi criado o evento NOSQL-BA.




Live Blue News: Lançado o Qt 5 Alpha

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

Qt 5 Alpha

Por Lars Knoll em 3 de Abril de 2012

O Qt Project tem o orgulho de anunciar o primeiro lançamento do Qt 5 Alpha. Todos os recursos do Qt 5.0 já estão implementados e agradecemos desde já os possíveis testes e feedbacks a serem realizados pelos usuários mais avançados das bibliotecas Qt. Esta é uma versão disponibilizada apenas em código-fonte – consulte a seção “Instalação” abaixo para informações sobre como gerar binários ou encontrar aqueles publicados pela comunidade.

Todo o esforço está sendo colocado agora na estabilização, melhorias no desempenho e documentação. Esperamos comemorar o lançamento final durante o Qt Contributors Summit [qt-project.org] (de 21 a 23 de Junho em Berlin). Toda a sua ajuda é bem vinda!

Download

A versão alpha pode ser obtida em vários formatos no release archive [releases.qt-project.org]

Visão Geral do Qt 5

O Qt 4 foi lançado há quase sete anos e continua hoje totalmente atualizado e competitivo, na sua versão estável 4.8. A próxima grande iteração, 5, aprofunda quatro aspectos essenciais do Qt:

  • Incríveis capacidades gráficas e de desempenho, especialmente manifestadas em ambientes restritos, como dispositivos móveis. O Qt Quick 2 traz um scenegraph baseado em openGL, um sistema de partículas e uma coleção de efeitos de sombreamento. O Qt Multimedia, Qt 3D e Qt Graphical Effects potencializam esses recursos ainda mais.
  • Mais produtividade e flexibilidade para o desenvolvedor, tornando o JavaScript e QML entidades de primeira classe, ao mesmo tempo em que mantém o C++ e o suporte aos Qt Widgets convencionais. O novo backend javascript do Qt, alimentado pelo V8, o Qt JSON DB e o Qt WebKit 2 facilitará a vida dos desenvolvedores HTML5.
  • Portabilidade cross-platform é agora mais simples graças à nova estrutura dos módulos Essentials e Add-Ons, além da consolidação da Qt Platform Abstraction [qt-project.org]. Estamos ansiosos para ver o Qt em execução em todos os tipos de ambientes!
  • Open Development e Open Governance garantem maior participação no desenvolvimento e teste do Qt 5 por uma crescente comunidade de desenvolvedores, incluindo a Nokia, o projeto KDE, Digia, Collabora, Accenture, KDAB e muitas outras empresas e indivíduos. Hoje, todos nós comemoramos !

O que está sendo lançado ?

O Qt 5 Alpha inclui os seguintes módulos:

  • Essentials : Qt 3D, Qt Core, Qt GUI, Qt JS Backend, Qt Location, Qt Multimedia, Qt Network, Qt QML, Qt Quick, Qt SQL, Qt Test e Qt WebKit.
  • Add-Ons : Qt D-Bus, Qt Graphical Effects, Qt Image Formats, Qt OpenGL, suporte a impressão, Qt Publish/Subscribe, Qt Quick 1, Qt Script, Qt Script Tools, Qt Service Framework, Qt SVG, Qt System Info, Qt Tools, Qt Wayland, Qt WebKit Widgets, Qt Widgets, Qt XML e Qt XML Patterns.

Versões futuras podem incluir mais módulos. Veja a lista completa de módulos disponíveis em Módulos do Qt Essentials e Módulos do Qt Add-Ons .

Demos e exemplos

Alguns exemplos visuais e ilustrativos para os apressadinhos :)

 

  • Livecoding video effects with Qt 5 [do youtube.com] - Mostra o Big Buck Bunny como você nunca viu antes, com Qt Quick 2 em ação.
  • Pimp my video: efeitos de sombreamento e multimídia [labs.qt.nokia.com] - Veja os efeitos de vídeo do Qt 5 neste blog.
  • Qt Graphical Effects no Qt Qt Labs [labs.qt.nokia.com] - O mesmo que acima, porém aplicado a imagens estáticas.
  • Raspberry Pi, Qt 5, QML, Shaders [do youtube.com] - Um vídeo criativo mostrando efeitos GL e codificação on-the-fly utilizando uma placa de somente 35 dólares.
  • Novas características do Qt 3D [do youtube.com] - Vídeo não tão recente, mas ainda útil para ver o que os designers 3D podem fazer com o Qt.
  • Qt MediaHub [qt-project.org] - grande exemplo do poder e da conveniência do Qt Quick. Demonstração funcional e com código disponível, para você aprender as melhores práticas ao utilizar Qt / QML.
  • Compilando o Qt 5 para o Playbook - Instruções para testar o Qt 5 e executar seus aplicativos no tablet Blackberry.
  • QtonPi [wiki.qt-project.org] - projeto de ponta para a construção de um sistema operacional mínimo e um SDK, otimizados tanto para o Qt 5 quanto para a placa Raspberry Pi.
  • Snowshoe [snowshoe.cc] - navegador baseado no Qt 5 utilizável agora no Nokia N9.
  • Quasi Engine [indt.github.com] - Uma estrutura baseada no Qt 5 para facilitar o desenvolvimento de jogos 2D fornecendo elementos QML que representam entidades necessárias na maioria dos jogos.

O que há de novo ?

Aqui está só um resumo. A lista completa de funcionalidades pode ser encontrada em Características do Qt 5.

Outros detalhes estão disponíveis em: http://qt.gitorious.org/qt/qtbase/blobs/master/dist/changes-5.0.0

Qt Quick

  • O Qt Quick é agora um módulo do grupo essentials, contendo o scenegraph baseado em OpenGL e todos os itens usuais.
  • Novo suporte para efeitos de sombreamento baseados em openGL e partículas.
  • O QML e o suporte a JavaScript ganharam módulos próprios dentro do grupo essentials.
  • O Qt Quick, como no Qt 4.x, está disponível em um módulo Add-On totalmente compatível com o Qt Quick 1.

Qt JS Backend

  • Novo módulo com a engine V8 JavaScript, proporcionando um desempenho muito melhor.
  • Novas classes QJSEngineQJSValue.

Qt QML

  • Novo módulo que contento a engine QML.
  • Muitas melhorias no desempenho e algumas melhorias para suporte a idiomas.
  • Em sua maioria é source-compatible, mas quando desenvolvendo itens QML em C++ algumas mudanças são necessárias devido a nova scenegraph.

Qt 3D

Qt WebKit

  • O módulo Qt WebKit agora é baseada em WebKit2. As APIs C++ não foram modificadas.
  • Muitas melhorias de desempenho e melhor conformidade com o HTML5.
  • O módulo baseado no WebKit1, como no Qt 4.x, agora é chamado Qt WebKit Widget e está disponível como um add-on.

Qt Core

  • Classe QStandardPaths disponibilizando locais padrão para arquivos.
  • Reconhecimento automático de tipos MIME.
  • Verificação em tempo de compilação da sintaxe de conexão de sinais e slots.
  • Novo mecanismo para expressões regulares, baseado no Perl.
  • Muitas estruturas de dados foram reescritas e otimizadas para um melhor desempenho.
  • Suporte ao C++11 onde possível (mas o Qt continua a compilar e funcionar com compiladores C++98).

Qt Gui

  • Suporte para superfícies de alto nível através da classe QWindow.
  • Suporte nativo a OpenGL.

Qt Network

  • Suporte para pesquisas de DNS.
  • Classes QHttp e QFtp removidos (eles estão disponíveis stand-alone quando necessário).

Qt Location

  • Classes relacionadas a mapas e geolocalização que anteriormente faziam parte do Qt Mobility agora estão contidos em um módulo próprio.

Qt Widgets

  • Todas as classes QWidget antigas, baseados no Qt Gui, foram separadas em uma nova biblioteca Qt Widgets.
  • Portados para a nova Qt Platform Abstraction.
  • Funcionarão normalmente como no Qt 4.x.

Problemas conhecidos

  • A compilação do Qt WebKit está desabilitada no Windows, pois sua compilação neste momento é bastante complexa. Estamos trabalhando para tê-la re-ativada e em pleno funcionamento para a versão beta.
  • Traduções ainda não funcionam; aplicações Qt aparecerão sempre em Inglês.

Instalação

Esta versão inclui apenas os pacotes fontes, sem binários oficiais. Os desenvolvedores devem construir seus próprios binários – ver Instruções de compilação do Qt 5 Alpha.

Você pode procurar também os binários não oficiais publicados pela comunidade.

Veja também Compilando o Qt 5 a partir do Git [qt-project.org].

Portando código existente

Veja Transição do Qt 4 para Qt 5 [wiki.qt-project.org].

Documentação

A documentação da API para o alpha está disponível em documentação Qt 5.0 [qt-project.org].

Comentários

Os desenvolvedores que usam Qt estão convidados a aderir a lista de discussão para compartilhar impressões e buscar ajuda da comunidade.




Guilherme Jr.: Criando tablespace e usuário no Oracle

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

Dica rápida de como criar tablespace e usuário no Oracle.

CRIANDO TABLESPACE

# mkdir /Oracle
# chown -R oracle.dba /Oracle/
# sqlplus SYSTEM/
SQL> CREATE TABLESPACE NOME_DA_TABLESPACE LOGGING DATAFILE '/Oracle/NOME_DA_TABLESPACE.dbf' SIZE 100m AUTOEXTEND ON NEXT 100m EXTENT MANAGEMENT LOCAL;

CRIANDO USUÁRIO

SQL> CREATE USER usuario IDENTIFIED BY senha DEFAULT TABLESPACE NOME_DA_TABLESPACE QUOTA UNLIMITED ON NOME_DA_TABLESPACE;
SQL> GRANT CREATE SESSION, ALTER SESSION, CREATE TABLE, CREATE PROCEDURE, CREATE VIEW, CREATE MATERIALIZED VIEW, CREATE TRIGGER, CREATE SEQUENCE, CREATE ANY DIRECTORY, CREATE TYPE, CREATE SYNONYM TO usuario;



Guilherme Jr.: Instalando Oracle 10g, apache2.2 e php5 com pdo_oci no Debian squeeze

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

Na última semana peguei um projeto novo que será desenvolvido em PHP e Oracle. Tive alguma dificuldade em achar material de referencia para instalar o PHP com pdo_oci e o Oracle 10g no Debian, por isso escrevi esse passo a passo para facilitar minha vida se eu precisar fazer isso de novo mais tarde e para ajudar quem precise montar um ambiente desses.

ORACLE 10g

Primeiro adicione no fim do arquivo /etc/apt/source.list

deb http://oss.oracle.com/debian unstable main non-free

Depois siga esses passos:

# wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | apt-key add -
# apt-get update
# apt-get install oracle-xe oracle-xe-client
# /etc/init.d/oracle-xe configure

Após digitar o último comando aparecerá essa mensagem

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:

Dê ENTER

Specify a port that will be used for the database listener [1521]:

ENTER novamente

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:

Digite a senha

Confirm the password:

Confirme a senha

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:

y se você quer que o Oracle 10g inicie automaticamente no boot

Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to "http://127.0.0.1:8080/apex"

Pronto, o Oracle 10g está instalado. Na minha instalação tive um problema na hora de rodar o sqlplus por isso tive que rodar esse comando abaixo.

# chmod 6751 /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle

LIBERANDO ACESSO REMOTO AO APEX

Se você, como eu, precisar acessar o APEX de outra máquina siga os seguintes passos:

# source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
# sqlplus SYSTEM/senha
SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);
SQL> exit
# /etc/init.d/oracle-xe restart

APACHE 2.2

Instalando o Apache 2.2

# wget http://apache.mirror.pop-sc.rnp.br/apache//httpd/httpd-2.2.22.tar.bz2
# tar -jxvf httpd-2.2.22.tar.bz2
# cd httpd-2.2.22/
# ./configure --enable-suexec --enable-rewrite --enable-so
# make
# make install

Agora edite o arquivo /usr/local/apache2/conf/httpd.conf e modifique p User e Group para www-data

User www-data
Group www-data

Modifique o dono da pasta /usr/local/apache2/htdocs/ para www-data

# chown www-data.www-data-R /usr/local/apache2/htdocs/

PHP 5.4

Instalando o PHP 5.4

# wget http://br2.php.net/distributions/php-5.4.0.tar.bz2
# tar -jxvf php-5.4.0.tar.bz2
# cd php-5.4.0/
# apt-get install libxml2-dev zlib1g-dev libbz2-dev libjpeg62-dev libpng12-dev libmcrypt-dev
# ./configure --enable-bcmath --enable-calendar --enable-dba --enable-exif --enable-ftp --enable-mbstring --enable-shmop --enable-sigchild --enable-soap --enable-sockets --enable-sqlite-utf8 --enable-sysvmsg --enable-wddx --enable-zip --with-apxs2=/usr/local/apache2/bin/apxs --with-bz2 --with-config-file-path=/usr/local/apache2/conf --with-gd --with-gettext --with-mcrypt --with-oci8=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client --with-pdo-oci=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client --with-xmlrpc --with-zlib
# make
# make install
# cp php.ini-development /usr/local/apache2/conf/php.ini

Crie o arquivo /usr/local/apache2/conf/extra/httpd-php5.conf com o conteúdo abaixo.

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

PHPIniDir "/usr/local/apache2/conf"

Mais uma vez edite o arquivo /usr/local/apache2/conf/httpd.conf

Adicionar no fim

Include conf/extra/httpd-php5.conf

Modificar

<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>

Pronto :)



Lucas Almeida Rocha: Performance Tips for Android’s ListView

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

I’ve been messing around with Android-based code for a few months now while hacking on Native Firefox for Android. I noticed that the performance tips for ListViews are a bit scattered in different sources. This post is an attempt to summarize the ones I found most useful.

I’m assuming you’re already familiar with ListViews and understand the framework around AdapterViews. I’ve added some Android source code pointers for the curious readers willing to understand things a bit deeper.

How it works. ListView is designed for scalability and performance. In practice, this essentially means:

  1. It tries to do as few view inflations as possible.
  2. It only paints and lays out children that are (or are about to become) visible on screencode.

The reason for 1 is simple: layout inflations are expensive operationscode. Although layout files are compiled into binary form for more efficient parsingcode, inflations still involve going through a tree of special XML blockscode and instantiating all respective views. ListView solves this problem by recyclingcode non-visible views—called “ScrapViews” in Android’s source code—as you pan around. This means that developers can simply update the contents of recycled viewscode instead of inflating the layout of every single row—more on that later.

In order to implement 2, ListView uses the view recycler to keep adding recycled views below or above the current viewport and moving active views to a recyclable pool as they move off-screencode while scrolling. This way ListView only needs to keep enough views in memory to fill its allocated space in the layout and some additional recyclable views—even when your adapter has hundreds of items. It will fill the space with rows in different ways—from top, from bottom, etc—depending on how the viewport changedcode. The image below visually summarizes what happens when you pan a ListView down.

With this framework in mind, let’s move on to the tips. As you’ve seen above, ListView dynamically inflates and recycles tons of views when scrolling so it’s key to make your adapter’s getView() as lightweight as possible. All tips resolve around making getView() faster in one way or another.

View recycling. Every time ListView needs to show a new row on screen, it will call the getView() method from its adapter. As you know, getView() takes three arguments arguments: the row position, a convertView, and the parent ViewGroup.

The convertView argument is essentially a “ScrapView” as described earlier. It will have a non-null value when ListView is asking you recycle the row layout. So, when convertView is not null, you should simply update its contents instead of inflating a new row layout. The getView() code in your adapter would look a bit like:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);
    }

    TextView text = (TextView) convertView.findViewById(R.id.text);
    text.setText(&#34Position &#34 + position);

    return convertView;
}

View Holder pattern. Finding an inner view inside an inflated layout is among the most common operations in Android. This is usually done through a View method called findViewById(). This method will recursively go through the view tree looking for a child with a given IDcode. Using findViewById() on static UI layouts is totally fine but, as you’ve seen, ListView calls the adapter’s getView() very frequently when scrolling. findViewById() might perceivably hit scrolling performance in ListViews—especially if your row layout is non-trivial.

The View Holder pattern is about reducing the number of findViewById() calls in the adapter’s getView(). In practice, the View Holder is a lightweight inner class that holds direct references to all inner views from a row. You store it as a tag in the row’s view after inflating it. This way you’ll only have to use findViewById() when you first create the layout. Here’s the previous code sample with View Holder pattern applied:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.your_layout, null);

        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);

        convertView.setTag(holder);
    } else {
        holder = convertView.getTag();
    }

    holder.text.setText("Position " + position);

    return convertView;
}

private static class ViewHolder {
    public TextView text;
}

Async loading. Very often Android apps show richer content in each ListView row such as images. Using drawable resources in your adapter’s getView() is usually fine as Android caches those internallycode. But you might want to show more dynamic content—coming from local disk or internet—such as thumbnails, profile pictures, etc. In that case, you probably don’t want to load them directly in your adapter’s getView() because, well, you should never ever block UI thread with IO. Doing so means that scrolling your ListView would look anything but smooth.

What you want to do is running all per-row IO or any heavy CPU-bound routine asynchronously in a separate thread. The trick here is to do that and still comply with ListView‘s recycling behaviour. For instance, if you run an AsyncTask to load a profile picture in the adapter’s getView(), the view you’re loading the image for might be recycled for another position before the AsyncTask finishes. So, you need a mechanism to know if the view hasn’t been recycled once you’re done with the async operation.

One simple way to achieve this is to attach some piece of information to the view that identifies which row is associated with it. Then you can check if the target row for the view is still the same when the async operation finishes. There are many ways of achieving this. Here is just a simplistic sketch of one way you could do it:

public View getView(int position, View convertView,
        ViewGroup parent) {
    ViewHolder holder;

    ...

    holder.position = position;
    new ThumbnailTask(position, holder).execute();

    return convertView;
}

private static class ThumbnailTask extends AsyncTask {
    private int mPosition;
    private ViewHolder mHolder;

    public ThumbnailTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
    }

    @Override
    protected Cursor doInBackground(Void... arg0) {
        // Download bitmap here
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (mHolder.position == mPosition) {
            mHolder.thumbnail.setImageBitmap(bitmap);
        }
    }
}

private static class ViewHolder {
    public ImageView thumbnail;
    public int position;
}

Interaction awareness. Asynchronously loading heavier assets for each row is an important step to towards a performant ListView. But if you blindly start an asynchronous operation on every getView() call while scrolling, you’d be wasting a lot of resources as most of the results would be discarded due to rows being recycled very often.

We need to add interaction awareness to your ListView adapter so that it doesn’t trigger any asynchronous operation per row after, say, a fling gesture on the ListView—which means that the scrolling is so fast that it doesn’t make sense to even start any asynchronous operation. Once scrolling stops, or is about to stop, is when you want to start actually showing the heavy content for each row.

I won’t post a code sample for this—as it involves too much code to post here—but the classic Shelves app by Roman Guy has a pretty good example. It basically triggers the async book cover loading once the GridView stops scrolling among other things. You can also balance interaction awareness with an in-memory cache so that you show cached content even while scrolling. You got the idea.

That’s all! I strongly recommend watching Roman Guy and Adam Powell’s talk about ListView as it covers a lot of the stuff I wrote about here. There’s nothing new about the tips in this post but I thought it would be useful to document them all in one place. Hopefully, it will be a useful reference for hackers getting started on Android development.



Mapas Livres e Humanitarismo

2 de Abril de 2012, 15:38, por Software Livre Brasil - 0sem comentários ainda

Cartaz do evento Mapas Livres e Humanitarismo

Estou organizando um evento no dia 10 de abril na UFRB, em Cachoeira-BA. Contaremos com uma palestra de Séverin Menard, integrante francês do Time Humanitário do OpenStreetMap (HOT) e aproveitaremos para fazer o lançamento do site do projeto MapaRec (Mapeamento Colaborativo do Recôncavo).

Séverin vem atuando no Haiti desde o terremoto acontecido no início de 2010, realizando trabalhos de mapeamento do país e de capacitação da população local para produção e uso de mapas.



Wille Marcel: Mapas Livres e Humanitarismo

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

Cartaz do evento Mapas Livres e Humanitarismo

Estou organizando um evento no dia 10 de abril na UFRB, em Cachoeira-BA. Contaremos com uma palestra de Séverin Menard, integrante francês do Time Humanitário do OpenStreetMap (HOT) e aproveitaremos para fazer o lançamento do site do projeto MapaRec (Mapeamento Colaborativo do Recôncavo).

Séverin vem atuando no Haiti desde o terremoto acontecido no início de 2010, realizando trabalhos de mapeamento do país e de capacitação da população local para produção e uso de mapas.



Tags deste artigo: nordeste psl bahia