Arquivos mensais: julho 2012

Como excluir (definitivamente) perfil do Facebook

Nesse post será ensinado como excluir o perfil do Facebook, na maioria dos post na internet apenas ensinam a desativar o perfil, sendo que, digitando o usuário e senha, a conta volta como estava antes. O procedimento deste post é irreversível, você excluirá definitivamente o seu Facebook.

Para ficar mais simples eu já peguei o endereço da página para excluir o perfil, então com o Facebook aberto copie e cole no seu navegador o link abaixo, esse link já vai te direcionar à página para excluir o perfil.

https://www.facebook.com/help/delete_account

A página que vai aparecer é a seguinte:

Depois disso você receberá um email informando que a conta será excluída no prazo de 14 dias.

Injeção de Dependência: comparação de desempenho

No presente post procurar-se-á demonstrar uma comparação entre injeção de dependência de dois grandes Frameworks, o JSF e o Spring. Para efeito de comparação também foi testada uma versão do aplicativo web com JSF sem o uso de injeção de dependência.

No desenvolvimento Web, diferentemente do desenvolvimento de aplicativos para Desktop, os sistemas muitas vezes possuem dezenas de milhares de usuários simultaneamente, isso exige um grande desempenho das aplicações.

Sendo assim a verificação do desempenho de diferentes formas de implementações, utilizando JSF com e sem injeção de dependência, que é uma forma de IoC (Inversion of Control – Inversão de Controle), e Spring, é importante e aponta para possibilidades mais adequadas, considerando as diferenças de desempenho entre os frameworks citados.

Os sistemas serão submetidos a testes de stress e desempenho. Para realização desses testes foi utilizado a ferramenta JMeter, uma ferramenta que diante das crescentes necessidades por performance vem sendo muito utilizada. Apache JMeter pode ser usado para testar o desempenho tanto em recursos estáticos quanto dinâmicos (arquivos, Servlets, scripts Perl, Java Objects, Bases de Dados, Consultas SQL, servidores FTP e muito mais).

Para o presente trabalho foram realizados dois testes para cada sistema desenvolvido, primeiro com 1000 usuários e o segundo com 4000 usuários. Esses dois testes foram realizados da mesma maneira com os três sistemas desenvolvidos (Spring com IoC, JSF com e sem IoC). Foram realizados testes com o máximo de 4000 mil usuários pois, o sistema após esse número apresentava a exceção “java.lang.OutOfMemoryError: Java heap apace” tornando impossível a realização de testes com maior número de usuários.

Como pode ser visto logo abaixo, o JMeter permite entre outras características as seguintes:

Tempo da amostra – tempo de resposta da aplicação;

Desvio – dispersão dos valores em relação à média;

Porcentagem de erro – porcentagem de problemas nas respostas;

Vazão – o número de operações que o sistema é capaz de completar em um dado período de tempo;

Carga Máxima do servidor – uso do processador pelo servidor;

Memória Máxima do servidor – uso de memória pelo servidor.

Tabela 1: Comparativo de desempenho com 1000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 75ms 74ms 39ms
Desvio 49ms 40ms 19ms
% de erro 0 % 0% 0%
Vazão 19,8/seg 19,8/seg 19,8/seg
Carga Máx. servidor ~37% ~60% ~50%
Memória Máx. servidor ~75% ~100% ~98%

 

Tabela 2: Comparativo de desempenho com 4000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 41ms 39ms 39ms
Desvio 89ms 25ms 18ms
% de erro 0%  0% 0%
Vazão 18,1/seg 19,6/seg 19,8/seg
Carga Máx. servidor ~48% ~35% ~48%
Memória Máx. servidor 95% ~80% ~90%

Através dos dados obtidos com os testes é possível identificar onde cada abordagem de desenvolvimento obteve um melhor desempenho com respeito à performance. Na tabela 1 e 2, foram agrupados os principais quesitos com respeito ao desempenho da aplicação para que pudéssemos analisar de forma mais clara.
Tempo da Amostra – Com relação a tempo, que seria o tempo de resposta da aplicação, na tabela acima temos a média de cada um. Observamos que o JSF sem Injeção de Dependência obteve resultados um pouco melhores, sendo em média mais rápido.
A porcentagem de erro ou problemas ao acessar a aplicação foi de zero por cento em todas as abordagens apresentadas.
A Vazão não foi muito diferente entre um e outro ficando novamente o JSF sem IoC um pouco à frente dos demais, mas apenas no teste com 4000 usuários, sendo praticamente insignificante a diferença haja vista que a própria rede pode apresentar oscilações na transferência de dados.
Agora com relação ao servidor de aplicações Tomcat, a carga do sistema obteve resultados na faixa de 35% a 60%, entretanto, não somos capazes de inferir nada com relação, pois em todos os testes houve oscilações durante o intervalo observado, sendo, que o Spring conseguiu se manter mais estável. Com relação ao uso da memória também não houve muita diferença.
Os testes foram realizados com o grupo máximo de 4000 usuários devido a estouro de memória no sistema quando utilizado por um grupo maior de usuários, apresentando a seguinte exceção: “java.lang.OutOfMemoryError: Java heap apace”. Com o número de usuários máximo utilizado nos testes, embora tenha havido algumas diferenças nos resultados, os sistemas se comportaram bem, não gerando gargalos nem indisponibilidade. Podemos perceber diante disso que com a melhora cada vez maior das técnicas de desenvolvimento de Frameworks e linguagens de programação o nível de qualidade se mantém quase igual, claro havendo algumas metodologias e facilidades diferenciadas em cada um.

CONCLUSÃO

Com todas as metodologias e técnicas utilizadas atualmente no desenvolvimento de ferramentas para auxílio dos programadores de sistemas, e até mesmo a maior especialização e estudo por parte das pessoas envolvidas nesse processo de desenvolvimento, tornou-se possível, excluindo algumas especificidades, que os níveis dessas ferramentas, como já dito anteriormente, quanto a desempenho se tornem muito parecidas, não havendo uma diferença muito grande.

O presente trabalho mostrou exatamente que as funcionalidades básicas, como é o caso da injeção de dependência, já estão bem consolidadas na maior parte dos Frameworks, logo, salvo funcionalidade muito específica, que seja provida por apenas um Framework, qualquer um dos Frameworks demonstrados aqui seria muito importante para um sistema em desenvolvimento e não haveria grandes problemas por adotar um ou outro, notando apenas que a injeção de dependência é um padrão de projeto e como tal já foi provado por anos de experiência em desenvolvimento de software, que é a forma mais indicada para desenvolvimento de sistemas complexos por facilitar muito o trabalho, tendo sido utilizada uma versão sem injeção de dependência no trabalho apenas por questões comparativas (mesmo que fosse muito mais eficiente não seria indicada por muitos outros fatores).

 

Hudson – Integração Contínua

Hudson é uma ferramenta de integração continua que monitora a execução de trabalhos que envolvem diversas mudanças em um mesmo projeto de software. A ferramenta Hudson foca na construção e experimentação de projetos de software continuados, assim tornando mais fácil o trabalho de desenvolvedores na integração de alterações em seus projetos. Sendo que esta construção continua integrada faz com que aja um aumento de produtividade.

O Hudson também tem como foco a monitoria dos trabalhos, de forma completa, sendo eles locais ou externos, fazendo do Hudson uma ferramenta administrativa de suma importância no desenvolvimento e controle do software. Proporcionando um controle de qualidade eficiente.

Testes

Uma das principais funcionalidades do Hudson é a realização de testes nos sistemas submetidos à integração continua. Testes unitários tomam muito tempo do programador, às vezes se tornam complexos e demorados, ou às vezes são muitos com complexidade reduzida. O Hudson vem neste contexto como um legitimo servidor de testes, que pode receber inúmeros projetos, de vários servidores externos ou internos, que fazem a build de projetos.

Construção de projetos

Hudson suporta a construção e integração de inúmeros projetos, sendo assim várias equipes de desenvolvedores poderão fazer uso do mesmo servidor e aplicação Hudson, mas trabalhando em tarefas distintas. Também contando com diversos recursos automatizados como atualizar a sua cópia de trabalho antes de executar uma compilação, assegurando que um projeto desatualizado não seja novamente compilado na mesma versão.
Agendamento de tarefas e construções de projetos podem ser automatizadas, de forma que com uma configuração simples, tarefas básicas são executadas sem mais nenhuma configuração. Tarefas como a construção de projetos a cada intervalo de tempo determinado, fazer com que projetos não sejam construídos ao mesmo tempo, evitando conflitos, entre outros fatores que tornam a integração continua dinâmica e autônoma, economizando tarefas que seriam executadas manualmente por uam equipe de desenvolvimento.

Plugins

Ferramentas de verificação de erros e melhoria de desempenho, como o PMD, JUnit e outras ferramentas se fazem presentes no Hudson em forma de plugins. Esses plugins são facilmente encontrados dentro da própria plataforma, e podem ser integradas a qualquer construção de projeto, aumentando o repertorio de informações sobre determinada construção que foi realizada.
O Hudson nos proporciona um vasto campo de informações necessárias para o acompanhamento da produção. Geração de relatórios de utilização, testes unitários, tarefas entre outros fazem parte desse meio de integração. Assim podendo remeter arquivos externos para outras aplicações, por emails entre outras formas de compartilhamento de dados.

Controle de usuários

Por se tratar de um servidor que pode ser acessado por diversos usuários em uma rede interna ou externa, o Hudson também conta com um bom sistema de controle de usuários que acessarão a aplicação. A fim de conter quaisquer intrusos ou alterações irregulares nas tarefas. Sendo que a forma como o usuário usa a ferramenta pode ser analisada, através de diversas estatísticas.
O Hudson pode facilmente suprir a necessidade de projetos de pequeno e médio porte, executando até mesmo as tarefas mais básicas que economizam tempo do desenvolvedor e melhoram a qualidade do sistema. Mas o Hudson também é com certeza uma ferramenta completa para projetos de grande porte, suportando até mesmo vários servidores de projetos em paralelo. Centralizando toda a administração em apenas um servidor Hudson.

Site oficial: http://hudson-ci.org/