31 de Março – Dia da Liberdade dos Documentos. Grade!

Saudações! Está fechada a grade do DFD. Local: Vitória/ES – Rua Anselmo Serrat, 199. FAESA, Campos I. Mini-auditório Data: 31/03/2010 (Quarta-feira) Mapa: http://migre.me/nQ5T 19:00 – 19:40 – Palestra: Soluções Livres! [Guilherme Chaves de Oliveira Barbosa] 19:40 – 20:20 — Palestra: Construindo uma publicação com software livre e formatos abertos: Um case da Revista Espírito Livre [João Fernando Costa Junior] 20:20 – 21:00 [...]

Como uma mancha cresce

Como uma mancha cresce

Eu já comentei aqui, o problema do caminho aleatório (Random Walk). Falei no post do O azeite bêbado e fiz algumas simulações com o Processing.js, disponíveis na página do curso de Física Estatística que estou ministrando neste semestre. A experiência que eu quero realizar é medir como o diâmetro de uma mancha de tinta em uma folha de papel varia com o tempo. Vale ressaltar que este probleminha é inspirado em um outro que mostrou que átomos existem, ou comportamentos em mercados de ações, como um gás venenoso se espalha pelo ar, etc.

O que eu fiz foi o seguinte: filmei uma gota de tinta que cai no papel.

Agora eu retiro frames do vídeo, em intervalos regulares. O vídeo foi gravado a 30 fps, com uma câmera digital comum. O problema que eu enfrentei é que eu não quero todos os frames (são 7 segundos de filme, com 30 por segundo seriam 210 para analisar e eu queria por volta 15). Os programas que havia testado ou retiravam todos os frames ou só faziam snapshots de 1 em 1 segundo. A dica para resolver isto foi passada pelo Armando M. Baratti, na lista do Arch Linux. O que devemos fazer pelo ffmpeg é o seguinte: ele só tira frames de 1 em 1s, mas podemos mudar a velocidade do filme. Se repassarmos o filme em 15 fps por segundo, então 0.5s do filme original vai ser 1s do filme repassado. A sintaxe então é simples:

ffmpeg -i mvi_6484.avi -r 10 -ss 00:00:04 -t 00:00:06 extracted_images/images%03d.png
que faz o seguinte: pega o arquivo mvi_6484.avi, a partir do quarto segundo, com duração de seis segundos e tira 10 fotos por segundo. As fotos são salvas no diretório extracted_images, e com um rótulo que indica a ordem do frame. Eu pego cada foto e uso o Gimp para medir o tamanho da mancha. Depois uso o Gnuplot para medir o tamanho em função do número do frame (nem precisa saber quanto tempo em unidades tradicionais como minuto ou segundo). O resultado está no gráfico abaixo do tamanho em pixels versus o índice do frame

Observe que a gota não cresce com velocidade constante, mas é mais lenta à medida que o tempo passa. Na verdade, o raio da gota cresce com a raiz quadrada do tempo (como mostrado por Einstein em 1905). Eu não vou dar detalhes aqui pois isto é um trabalho para os estudantes da disciplina :) . Prometo que depois eu conto o resto.

Primeiro Aniversário do Blog

Há exatamente 365 dias era publicado o primeiro post deste blog. Este post inaugurou também o início da minha acabativa para a sua criação. Este dia não foi escolhido a toa já que também é dia do meu Aniversário, e assim como o dia do meu nascimento este blog se tornou muito importante para mim.
Foi um período muito interessante de aprendizagem, horas de dedicação e alguns momentos de stress também. Mas, fico muito feliz por ter redescoberto o prazer de escrever e ter feito tantas amizades virtuais. Alias, esse é o maior presente: ligar (desbloquear já que só fica ligado) o computador e ler os comentários de vocês, saber que pessoas de diversos lugares passaram por aqui, leram o que escrevi, serviu de ajuda para alguém e deram sua opinião.
Estou muito feliz por isso, pois este é objetivo do blog, oferecer um conteúdo útil visando sempre a troca de informação referente a tecnologia,  meu dia-a-dia e outros assuntos que compartilhamos o mesmo interesse.

Obrigado por fazerem parte desse meu mundo!

Clécio Oliveira
@cleciooliveira

Programação – Linguagem C

Saudações… Estou estudando esta linguagem porque é um das mais interessantes e um código que com ela irá aprender vários outras. Um breve resumo sobre o C. Retirado da Wikipedia. O desenvolvimento inicial de C, ocorreu no AT&T Bell Labs, entre 1969 e 1973. Não se sabe se o nome “C” foi dado à linguagem porque muitas de [...]

GreenSQL – Protegendo seu MySQL de SQL Injection

O número de aplicações WEB tem aumentado bastante nos últimos anos, mas, infelizmente, os desenvolvedores parecem não se preocupar com a segurança delas.

É cada vez mais comum encontrarmos vulnerabilidades nas páginas WEB e uma das mais populares é a SQL Injection.

Felizmente, existem algumas ferramentas que servem para proteger suas aplicações desta falha. Uma delas é o GreenSQL, um um firewall usado para proteger uma base de dados MySQL de ataques de SQL Injection.

Veja o artigo completo aqui.

FLISOL Fortaleza 2010

Saudações pessoal!

Quem é vivo sempre aparecer…

Não, eu não abandonei o blog. Apenas estava sem recursos para continuar postando. Meu notebook resolveu apresentar problemas sérios depois de 4 anos na luta e acabei tendo de comprar outro. Ainda não chegou, portanto ainda está difícil conseguir postar por aqui.. mas cá estou.

Como todos já devem saber sou militante do movimento de Software Livre e como tal sempre estou engajado em algum projeto/evento que envolva liberdade e compartilhamento de conhecimento. Neste momento estou me focando no FLISOL Fortaleza 2010.

Para quem ainda não conhece o FLISOL, Festival Latinoamericano de Instalação de Software Livre, é um evento anual que acontece, como o próprio nome indica, simultaneamente em toda a América Latina. Mais de 150 cidades sediam o evento com organizações locais que trocam informações e ajuda entre si para tal.

Desde 2005 estou direta ou indiretamente engajado na organização do mesmo aqui em Fortaleza, portanto neste ano não poderia ser diferente. Um dos grandes diferenciais, e minha maior motivação, deste ano é o fato de estarmos, também, comemorando o aniversário de 5 anos da Comunidade Tux-CE.

O evento se baseia em, basicamente, instalar Software Livre nas máquinas dos visitantes que não possuem experiência ou não se sintam seguros para o fazerem sozinhos, porém em algumas cidades, como é o caso aqui em Fortaleza, optamos por fazer mais do que simplesmente instalações. Sempre temos palestras, apresentações, demonstrações, distribuição de mídias com distribuições Linux e outros softwares livres, etc…

Neste ano estamos adotando o recurso de “Páginas Amigas” como uma forma de ajudar e ser ajudado! Bem a cara do Software Livre, certo?!

Se você possui um site, blog ou qualquer coisa que o valha, pode submeter-se como uma página amiga do FLISOL. Com isso você terá um banner de seu site, blog ou coisa que o valha exposto em nossa página do FLISOL em troca de um banner do evento no seu. É uma espécie de ajuda mútua onde ambos se beneficiam. Para conseguir mais detahes sobre como se tornar uma página amiga do FLISOL, visite este link.

Amanhã mesmo teremos uma reunião de organização do evento na qual discutiremos mais alguns detalhes sobre o mesmo.

Em breve volto a publicar maiores detalhes.

Abraços!

Tradução da Arch Linux Newsletter de Março

Aqui: <a href=http://www.archlinux-br.org/alm/2010/Newsletter-2010-Mar.html target=blank>http://www.archlinux-br.org/alm/2010/Newsletter-2010-Mar.html</a> Boa leitura! Agradecimentos ao Leandro Costa que não deu chances ao seus colegas e traduziu a edição desse mês por completo ;-)

Dicas para SQL Relacional

Fonte: http://www.catswhocode.com/blog/10-sql-tips-to-speed-up-your-database

Aproveitando a dica do @pinceladasdaweb, dei uma lida no post e vou fazer uma tradução livre aqui, acrescentando meu ponto de vista e mais algumas dicas sobre SQL em um banco de dados relacional:

1. Defina seu banco de dados com cuidado
Um bom banco de dados é um banco de dados bem desenhado, que não gera tanto trabalho para buscar as informaçoes e que não guarda dados duplicados. É um banco que tem uma estrutura clara e com nomes de tabelas e campos identificáveis.

2. Otimize o que for necessário
Nem todos os SQL que utilizaremos devem e podem ser utilizados. Mas várias instruções podem e DEVEM ser otimizadas. Para o banco cada query tem um custo, e utilizando a ferramenta e EXPLAIN, que tem em praticamente todos os bons bancos de dados, podemos ver o que está afetando mais nossa query. Cuide os joins, linhas desnecessárias, igualdades incorretas, falta de indices, etc…

3. Use algo para agilizar
Utilizar um sistema de cache é sempre muito bom, e não apenas para as querys. Pois tudo que tem que ser gerado e processado gera custo e tempo, sendo que se você já tem um resultado pronto, do que você quer, sendo q o mesmo já foi processado a algum tempo atrás é muito bom ! Isto acaba com o tráfego na rede e no processamento do banco.
No site ele cira algumas ferramentas interessantes. E devem ter outras também.

4. Não selecione o que você não precisa
Corretíssimo! Nada de “select * …” por ai heim !
Coloque na projeção do SQL ( aquela parte depois do “select” e antes do “from” ) apenas os campos que você vai precisar. Isto nos além de gerar menos custo para o banco, acaba organizando nosso retorno e padronizando a aplicação.

5. Limite o numero de linhas a serem retornadas
Geralmente o usuário final, aquele que está vendo aquela listagem de algum item na tela, não vai precisar de todos os itens que tem cadastrado na tabela. Então use paginação ! Sempre ! Limitando o número de linhas a serem retornadas do banco o custo cai ser bem menor e a resposta vai ser mais rápida. O uso de Ajax ( para web ) geralmente ajuda bastante nestes casos.

6. Não coloque chamadas ao banco dentro de loops
Organize seu código, que eu duvido que você não conseguirá unir todos os dados necessários em apenas 1 ou 2 chamadas no banco, ao invés de colocar a query em um loop. Lembre-se, que o quanto menos tiver que acessar o banco melhor !

7. Utilize JOINS ao invés de SUBQUERYs
Concordo ! A não ser em casos muito, muito complexos, não utilize subquerys, elas são muito mais pesadas e são executadas 1 vez para cada linha retornada da nossa query pai, gerando assim um custo enorme para o banco. E subquerys na projeção NEM PENSAR ! NUNCA !

8. Utilize os wildcards
Até certo ponto eu levo isto como uma feature mesmo, do SQL ansi, com o comando LIKE, do que um forma de otimização.

9. Utilize UNION ao invés de OR
Bem, eu não entendi direito o pq desta dica, até mesmo pq eu não utilizo o MySql, mas para mim isto não é válido, pois na grande maioria dos casos esta troca causará um aumento de custo ao banco, e não o contrário. Mas sempre teste sua query com mais de uma forma, talvez este seja seu caso.

10. Use Índices
Sim ! Use indices no seu banco. Mas além das PK e os indices para elas criados automaticamente, utilize somente indices em campos e tabelas que necessitarão deles. Se un indice não é utilizado em nenhum momento, em nenhuma query, exclua-o, pois ele estará gerando trabalho em vão para o banco atualizá-lo.
Como eu faço:
- Rodo a query e analiso
- Crio indices onde eu acho que deve ser criado
- Rodo a query e analiso
- Crio, altero e excluo mais algins indices onde eu acho que deve
- Rodo a query e analiso
- Excluo todos os indices que não estão sendo utilizados
- Rodo a query e analiso

- Pronto!

Geralmente estes poucos passos bastam controlar a criação de indices.

11. Triggers – Tome cuidado com elas
Elas podem nos ajudar muito, mas podem deixar o banco de dados lentão e até gerar dead-locks. Então pense bem se é realmente necessário criar tal procedimento como uma trigger.

12. Sequences/Autoincremento
Estes campos nos facilitam muito o controle das PKs e não oneram em trabalho do banco.

13. Procedimentos pesados, Batch
Estes sim eu aconselho a, sempre que possível, serem executados dentro banco.
A linguagem que roda dentro do banco de dados é muito mais ágil ao trabalhar com os dados do que ficar trazendo e enviando dados do banco até a aplicação. E isto em procedimentos que geram informações de cálculos violentíssimos, ou controles com muitos dados, e que podem demorar para rodar, podem ser colocados dentro do banco.
No PostgresSQL por exemplo, temos não somente o Pl/pgSQL, mas sim inúmeras linguagens que trabalham dentro do DB, no Oracle tem o PL/SQL, e assim vai…

No mais é o seguinte:

  • Sempre teste suas querys com mais de uma forma, trocando campos de lugar, trocando a ordem dos joins e das filtragens.
  • Quantos aos frameworks de banco, leia bastante na documentação como fazer para agilizar as pesquisas.
  • Aprenda a alterar as principais configurações do seu banco de dados para que ele trabalhe melhor para sua aplicação, sendo que ela faz mais gravação de dados ou mais leitura de dados.
  • A infra estrutura do ambiente de produção todo é muito relevante, tanto para a aplicação como para o banco. Sempre ter o banco em uma máquina separada da aplicação é ótimo!

Campanha contra óculos 3D

>

O médico Canrobert Oliveira, do Hospital Oftalmológico de Brasília, relata ter recebido pacientes com ardência nos olhos após terem visto filmes tridimensionais. Ele fez sugestões à Anvisa (Agência Nacional de Vigilância Sanitária) pedindo uma ação conjunta com o CBO (Conselho Brasileiro de Oftalmologia) para fiscalizar a higienização nos cinemas.

"[Os óculos] são veículos de contaminação de conjuntivite por não serem individualizados ou higienizados para passarem de um espectador a outro", diz. Oliveira sugere que os espectadores passem álcool em gel nas lentes, hastes e armações antes da sessão.

A Cinemark, líder do mercado de exibição no Brasil, com 412 salas, afirma que todos os óculos são higienizados após o uso. Na Grande São Paulo, 20 salas da empresa exibem filmes 3D atualmente.

A questão também preocupa autoridades na Europa. Em fevereiro, o Ministério da Saúde da Itália recolheu mais de 7.000 óculos em cinemas do país alegando "razões de higiene". E promete recolher mais nos próximos dias.


Publicado: Quarta-feira, 10 de Março, 2010.
Fonte: Folha Online 

ExtJS – Namespaces

Continuando uma série de posts sobre o ExtJS, vou falar agora sobre uma feature existente em algumas linguagens também, que é o “namespace”.

Pela wikipedia “namespace” é: “In general, a namespace is an abstract container providing context for the items (names, or technical terms, or words) it holds and allowing disambiguation of homonym items having the same name (residing in different namespaces).”
Traduzingo ( mal e porcamente, se puder me ajude! heheh ): “Em geral, um namespace é um recipiente genérico que contextualiza os itens (nomes ou termos técnicos, ou palavras) que contém, permitindo desambiguação de itens homônimos que tem o mesmo nome (que residem em espaços diferentes).”

No ExtJS não é diferente. Como com o Ext acabamos por gerar muitos e muitos componentes, telas, painéis e páginas completas em vários arquivos javascript, nada mais justo que organizar tudo isto separando-os em namespaces. Vejamos alguns exemplos: Digamos nosso usuario_novo.js

Ext.ns("App.NovoUsuario"); //Ext.ns é uma contração para a função Ext.namespace

App.NovoUsuario.janela = new Ext.Window({
 //...
});

E depois nosso usuario_edicao.js

Ext.ns("App.EditarUsuario");

App.EditarUsuario.janela = new Ext.Window({
 //...
});

Aqui criamos duas Windows ( não coloquei todas as propriedades pois não é o foco ) dentro de dois namespaces diferentes. Conseguimos facilmente contextualizar o que cada objeto criado faz. Isto organiza nosso código e ainda dá um limite de escopo para as variáveis e objetos ali criados.

Outra forma de utilizar o namespace é assim:

var NS = Ext.namespace("App.Modulo");
  NS.PainelDeTeste = function(cfg){
    NS.PainelDeTeste.superclass.constructor.call ... etc
  };

E

Ext.ns("App","App.Edicao","App.Criacao");
App.storegenerico = new Ext.data.Store({
 //...
});
App.Edicao.janela = new Ext.Window({
 //...
});
App.Criacao.janela = new Ext.Window({
 //...
});

Ao dar uma olhada na documentação do proprio Ext, temos uma árvore a esquerda e os dados informativos a direita.Esta árvore representa toda a estrutura montada através dos namespaces do core. E também, quando encontrarmos alguns plugins e widgtes criados por usuários, que não estão na distro padrão do Ext, geralmente estes pertencem ao ns Ext.ux, ficando assim padronizados e organizados.

Resumindo, os namespaces dão organização e legibilidade ao nosso código além de definir escopos.

até+

Links: