Mostrando postagens com marcador performance. Mostrar todas as postagens
Mostrando postagens com marcador performance. Mostrar todas as postagens

quarta-feira, 20 de setembro de 2017

WP Paypal não funciona com W3 Total Cache

Implementei o plugin WP Paypal no WordPress, mas ele parou de funcionar de repente.

Isso aconteceu depois q instalei e ativei várias coisas no plugin W3 Total Cache (que é muito bom alías).

Quando eu inativava o W3 Total Cache, o WP Paypal voltava a funcionar...

Por fim, identifiquei que o bastava desativar o "Minify" e "Browser Cache" em:

Admin do Wordpress > Performance > General Settings

-----------

Quando identifiquei isso fiquei feliz pq descobri, mas fiquei puto, pq queria manter o Minify e Browser Cache habilitados... Para fazer isso tive que fazer o seguinte:

-----------

Identifiquei que eu posso manter o "Browser Cache" enabled, desde que eu desative o "Prevent caching of objects after settings change" em:

Admin do Wordpress > Performance > Browser Cache > General

Fonte da dica: https://premium.wpmudev.org/forums/topic/exception-for-w3-total-cache-browser-cache


-----------

Identifiquei que eu posso manter o "Minify" enabled, desde que eu coloque o nome da página "/nomedapagina" (sem as aspas) em:

Admin do Wordpress > Performance > Minify > Advanced > Never minify the following pages:

Fonte da dica: Tentativa e erro :D

Abraços!
Adriano Schmidt

terça-feira, 13 de setembro de 2016

Load balancer com WildFly 10

Esse passo a passo mostra como montar um ambiente com um Apache HTTP Server como loadbalancer e vários WildFly 10 atrás utilizando sempre o modo standalone.

Bom, trabalho com JBoss/WIldFly desde a versão 3 e já montei ambientes load balancer e cluster em mais de 20 ambientes... Esse mês montei novamente utilizando o WildFly 10 para um cliente que estou dando consultoria.

Antes de mais nada agradeço a todos do JBug Brasil. Sem a galera desse grupo eu não saberia nem iniciar o WildFly :) Entrem lá, recomendo!

O ambiente será assim:




Standalone ou domain?
Resolvi usar o modo standalone pois acredito que o modo domain adiciona um pouco mais de complexidade que não é necessária para ambientes com poucos servidores WildFly....

o domain serve apenas para centralizar as configurações em uma máquina só... caso queira fazer usando o modo domain, basta seguir esse tutorial e depois alterar para o modo domain....


Load balancer e/ou cluster

Aqui mostro apenas o como fazer um Load Balancer... não mostro como fazer um cluster... mas em muitos (talvez na maioria) dos ambientes, o cluster não é necessário....

O Load balancer serve para permitir escalabilidade... então atrás do Apache vai ter vários WildFly e você pode adicionar mais caso necessário (caso aumente o número de usuários por exemplo)

O Load balancer serve para redundância... se cair um WildFly, outro WildFly vai assumir....

"Tá Adriano, então pra que serve o cluster?"

O cluster serve para permitir o compartilhamento de dados de sessão.. por exemplo... no load balancer se vc estiver logado e de repente o WildFly cair, outro WildFly vai assumir, mas você voltará para a tela de login e terá q fazer login de novo... pois dados de sessão não são compartilhados no load balancer....

Para permitir que o usuário continue logado, você teria que ter um cluster...

Como os WildFly não vão cair o tempo inteiro... e se quando cair não for um problema tão grande o usuário ter q fazer login de novo... você não precisa de cluster....

Se você quiser fazer um cluster tudo bem.... não é muuuito dificil, é só seguir esse tutorial e depois alterar mais algumas coisinhas para implementar o cluster, mas não vou mostrar isso neste post...

Ahhh... E caso você esteja usando Amazon ou Digital Ocean... fazer um cluster vai ser um pouco mais difícil pois eles não permitem multicast (q é como as máquinas do cluster se comunicam) e você teria que fazer isso de outra forma... o q não é tããão simples...

Post passo-a-passo

Talvez (ou não) vc esteja se perguntando:
"Este passo-a-passo é completo e é só seguir que vai dar certo?"

Não! Esse passo-a-passo provavelmente não vai estar 100% claro e talvez falte algum detalhe... Foram anotações que fiz quando estava montando esse ambiente...

Não achei nenhum passo-a-passo mostrando como montar um load balancer com WildFly 10... por isso resolvi postar aqui mesmo que falte algum detalhe...

Até pq quando você for usar talvez vc use alguma versão diferente do que usei ou talvez seja diferente na sua infra ou no seu S.O.

Já montei load balancers e clusters em mais de 20 ambientes... e todas as vezes deu algum problema diferente...

"Tá Adriano, mas se não tá completo então esse post é inútil"

Acredito que é útil sim! talvez vc vai ter alguma dificuldade em algum ponto... aí vc abre um chamado no JBug Brasil e eu e outros caras que são bem legais vamos tentar te ajudar.


Vamos lá!


Você precisará de 3 máquinas:
- maq01: Apache HTTP Server
- maq02: WildFly Server1
- maq03: WildFly Server2

Sistema operacional
Sugiro o uso do sistema operacional RHEL (Red Hat Entrerprise Linux) ou CentOS (que é igual ao RHEL só que da comunidade).
Mas já implantei isso no Ubuntu também.
No Windows deve dar também... mas esse post vai ser todo focado em linux...


Em todas as máquinas faça esses passos:

- Configure a rede conforme desejado:
/etc/init.d/network stop
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/sysconfig/network
vi /etc/resolv.conf
/etc/init.d/network start

- Teste se a rede está OK
ping www.google.com
ifconfig


Maq01 - Apache HTTP Server

Documentação complementar:
https://docs.jboss.org/mod_cluster/1.1.0/html/native.config.html
https://httpd.apache.org/docs/2.4/howto/access.html

Apache 2.2
Aqui vou falar como implantar com o Apache 2.2... mais pra baixo comento como é com o Apache 2.4

yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y

sudo service httpd start


- Acesse no browser de sua máquina e verifique se o Apache HTTP Server está no ar, só acessar pelo ip: http://<ip da maquina>

- Baixe o mod_cluster (sempre utilize a versão mais atual ao invés de usar o comando abaixo, procure em http://mod-cluster.jboss.org/)
wget http://downloads.jboss.org/mod_cluster//1.3.1.Final/linux-x86_64/mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
tar -zxvf mod_cluster-1.3.1.Final-linux2-x64-so.tar.gz
cp mod_advertise.so /etc/httpd/modules/
cp mod_manager.so /etc/httpd/modules/
cp mod_proxy_cluster.so /etc/httpd/modules/
cp mod_cluster_slotmem.so /etc/httpd/modules/

- Comente a linha do mod_proxy_balancer pois será usado o mod_cluster
cd /etc/httpd/conf.modules.d
vi 00-proxy.conf

- A linha deve ficar assim:
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so


- Crie e adicione o conteúdo do arquivo mod_cluster.conf
cd /etc/httpd/conf.d/
touch mod_cluster.conf
vi mod_cluster.conf

LoadModule cluster_slotmem_module modules/mod_cluster_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

MemManagerFile /var/cache/mod_cluster

Maxcontext 100
Maxnode 100
Maxhost 100

<VirtualHost *:80>

<Directory />
Order deny,allow
Allow from all
</Directory>

<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
#Order deny,allow
#Deny from all
#Allow from all
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0
ServerAdvertise Off
EnableMCPMReceive Off

</VirtualHost>



Apache 2.4
Essa semana instalei esse ambiente no Ubuntu e no Apache 2.4... teve algumas diferenças...

Para fazer isso (Apache 2.4 no Ubuntu) usei esse passo-a-passo:
https://symbiotics.co.za/configure-apache-with-mod_cluster-load-balancer-on-ubuntu/


Se acontecer o erro:

apache2: Syntax error on line 140 of /etc/apache2/apache2.conf:
Syntax error on line 3 of /etc/apache2/mods-enabled/proxy_cluster.load:
Cannot load /usr/lib/apache2/modules/mod_proxy_cluster.so into server:
/usr/lib/apache2/modules/mod_proxy_cluster.so: undefined symbol: ap_proxy_hashfunc



A solução é deixar o arquivo "proxy_cluster.load" dessa forma:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule cluster_slotmem_module /usr/lib/apache2/modules/mod_cluster_slotmem.so
LoadModule manager_module /usr/lib/apache2/modules/mod_manager.so
LoadModule advertise_module /usr/lib/apache2/modules/mod_advertise.so
LoadModule proxy_cluster_module /usr/lib/apache2/modules/mod_proxy_cluster.so


Além disso, aconteceu o erro:

[Thu Aug 25 18:01:33.049309 2016] [proxy:warn] [pid 5911:tid [...] [client 177.101.142.200:58291] AH01144: No protocol handler was valid for the URL /systemprops. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Ali onde estou carregando os módulos então tive que adicionar a seguinte linha:

LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

Mais detalhes em: https://developer.jboss.org/thread/272092. Agradeço ao Ingo e filippe.spolti do JBug Brasil pela ajuda nesse problema.


Além disso, deu o erro:

2016-08-23 19:38:20,417 ERROR [org.jboss.modcluster] (UndertowEventHandlerAdapter - 1) MODCLUSTER000042: Error null sending INFO command to ip-<IP INTERNO DO APACHE>.sa-east-1.compute.internal/<IP INTERNO DO APACHE>:80, configuration will be reset: null


A solução... meu conf do apache estava assim:

<Directory />
     Order deny,allow
     Allow from all
</Directory>

Mas na versão Apache 2.4 tem que ser assim:

<Directory />
    AllowOverride none
    Require all granted
</Directory>

Mais detalhes em: https://developer.jboss.org/thread/272023



- Crie um usuário e senha
htpasswd -c /etc/modclusterpassword admin

- Reinicie o Apache:
sudo service httpd stop
sudo service httpd start

- Teste novamente no browser: http://<ip_da_maquina>

- Teste no browser o mod_cluster: http://<ip_da_maquina>/mod_cluster_manager




Maq02, Maq03

- Instale e configure o Java (Sempre use a versão mais atual)

Aqui está um exemplo de como instalar (no caso Java 7, mas use o 8), mas pode fazer como achar melhor.
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm

rpm -Uvh jdk-7u79-linux-x64.rpm

alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000


- Instale o WildFly (Sempre baixe a versão mais atual):
Aqui está o 8, mas use o 10 ou superior:

wget http://download.jboss.org/wildfly/8.2.0.Final/wildfly-8.2.0.Final.zip

yum install unzip

unzip wildfly-8.2.0.Final.zip  -d /opt/
ln -s /opt/wildfly-8.2.0.Final /opt/wildfly


- Configure um usuário no linux:
groupadd wildfly
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly
chown -R wildfly:wildfly /opt/wildfly-8.2.0.Final
chown -h wildfly:wildfly /opt/wildfly

sudo vi /etc/sudoers
wildfly ALL=(ALL) NOPASSWD:ALL

passwd wildfly
su wildfly


- Inicie o WildFly rodando o standalone.sh da pasta bin passando como parâmetro o profile full-ha
./standalone.sh -server-config=standalone-full-ha.xml

- Veja no log se não deu erros
vi /opt/wildfly/standalone/log/server.log

- Pare o WildFly


- Adicione as linhas de JAVA_OPTS:
vi /opt/wildfly/bin/standalone.conf
JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=<IP MAQUINA>"

Ao invés de IP da máquina você pode usar 0.0.0.0 que é mais genérico



- Configure o mod_cluster no WildFly:
- acesse o arquivo standalone-full-ha.xml
- procure o subsystem modcluster e altere o conteúdo dele para:

<mod-cluster-config advertise-socket="modcluster" proxies="apache1" advertise="false" sticky-session="true" load-balancing-group="arquitetura" connector="ajp">
   <dynamic-load-provider>
     <load-metric type="cpu"/>
   </dynamic-load-provider>
</mod-cluster-config>


-dentro do seu socket-binding-group, você deve colocar isso:

<outbound-socket-binding name="apache1">
<remote-destination host="<IP INTERNO DO APACHE>" port="80"/>
</outbound-socket-binding>

Mais sobre isso: https://developer.jboss.org/thread/272022


- Inicie o WildFly
./standalone.sh -server-config=standalone-full-ha.xml


- Faça deploy de uma aplicação de testes
- Faça o deploy da aplicação systemprops jogando o war na pasta deployments do WildFly: https://dl.dropboxusercontent.com/u/8155843/TDC%20Floripa%202015/systemprops.war

Teste o load balancer
1) Acesse via broser a aplicação pelo apache http server: http://<ip_do_apache>/systemprops
2) A aplicação mostrará em qual host você vai estar: arquitetura-1 ou arquitetura-2. Vai depender de onde o loadbalancer te direcionou
3) Vá até a máquina que você foi direcionado (arquitetura-1 por exemplo) e pare o WildFly
4) Acesse a mesma URL e veja que você foi redirecionado para o arquitetura-2, ou seja, o loadbalancer está funcinando
5) Suba novamente o wildfly


Segurança
- Nunca inicie nada como root
- Não deixe acessível na web o servidor onde está o WildFly (configuração de infra). Resumindo, você não pode conseguir pingar o servidor onde está o WildFly, pois só o servidor do Apache deve estar disponível.
- Use SSL
- Permita o acesso ao mod cluster manager apenas na rede interna (melhor opção) ou apenas para um determinado IP. Algo como:
<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
Order deny,allow
Deny from all
Allow from <seu_ip>
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

Mais sobre segurança em: https://developer.jboss.org/thread/258299


Perfomance
- Com Java 8 já vai aumentar muuuito a performance comparado com versões anteriores..
- o load balancer é bom para performance pois vai distribuir os acessos deixando tudo mais rápido...
- gzip compression no Apache é essencial
- Configure xms e xmx...
- faça testes de desempenho e utilize ferramentas de monitoramento: http://localhost8080.blogspot.com.br/2016/07/monitorar-ambiente-infra-e-jboss-wildfly.html
- Tuning: http://localhost8080.blogspot.com.br/2014/06/tunning-de-aplicacoes-java.html


Integração contínua
Use! :)


Consultoria:
Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: adriano@localhost8080.com.br


Abraço!
Adriano Schmidt

sexta-feira, 5 de agosto de 2016

Uma martelada

Oi :)

Ouvir seu cliente falando "obrigado, agora eu durmo tranquilo" não tem preço :D





Quando eu era pequeno ouvia uma história do cara que cobrou 10 mil reais e ficou um mês consertando um navio.... mas não resolveu o problema!


Depois veio outro cara e cobrou 100 mil pra ficar uma semana mas também não consertou o navio!


Por fim veio um cara e resolveu o problema com uma martelada e cobrou 1 milhão... logo reclamaram:

Como 1 milhão por uma martelada? O outro ficou um mês e cobrou 10 mil

E a resposta foi

Cobro 1 real pela martelada e 999.999 por saber onde dar a martelada

Quando o cliente me falou "cara, a gnt não ia achar o problema, estávamos culpando tudo menos isso" eu lembrei dessa história...

a diferença é que não cobrei 1 milhão hahahah

#consultoria #homeoffice

sábado, 16 de julho de 2016

Monitorar Ambiente/Infra e JBoss/WildFly

Segue uma lista de ferramentas e algumas observações para monitorar ambientes e também servidores de aplicação.

Já usei quase todas essas ferramentas e sempre estão surgindo novas. Fiz estas anotações rápidas para uma consultoria que dei e acredito que pode ser útil para outras pessoas.

Para monitorar o ambiente e JBoss/WildFly:

RHQ
- Para monitoar o JBoss/WildFly
- É da própria Red Hat
- Não é na nuvem, precisa de uma máquina pra ele
- É free
- Não é tão facil de instalar/configurar

Javamelody
- É free
- É fácil de instalar

Datadog
- Free até 5 hosts com 1 day retention
- $15 por host com 13 month retention

NewRelic
- $75USD/month per host


Para monitorar infra, máquinas e sistema operacional, pode-se usar umas dessas duas:
Nagios
Zabbix - Cada vez está sendo mais usado


Para centralizar logs de várias máquinas em um só lugar:

Logentries
- Send up to 5GB/month
- 7 day Retention

Log Stash
- Log stash is an open source tool for collecting, parsing, and storing logs for future use
- Kibana 3 is a web interface that can be used to search and view the logs that Logstash has indexed.
- Both of these tools are based on Elasticsearch.
- Elasticsearch, Logstash, and Kibana, when used together is known as an ELK stack.



Lembrando que se precisar dou consultorias nesse assunto e também em questões como performance, arquitetura, integração contínua, montagem de ambientes com load balancer e cluster, etc... Só entrar em contato: adriano@localhost8080.com.br


Agradeço ao Vinícius Fritzen que já utilizou várias destas ferramentas e me ajudou quando eu estava fazendo essa pesquisa.


Abraço!
Adriano Schmidt
adriano@localhost8080.com.br

segunda-feira, 15 de junho de 2015

O usuário está bêbado #01

Fala pessoal, finalmente fiz o primeiro vídeo do "O usuário está bêbado".

Se você ainda não conhece o projeto acesse: http://www.localhost8080.com.br/o-usuario-esta-bebado

Mas basicamente bebo muita cerveja e testo sites, apps ou sistemas em uma perspectiva de Usabilidade/UX e depois faço um vídeo e um relatório do que pode ser melhorado.

Segue abaixo o vídeo e o relatório:



Relatório - O usuário está bêbado - #01 - Site bebidaboa.com.br


O site testado foi o www.bebidaboa.com.br que de um modo geral apresenta uma boa usabilidade, inclusive mobile, e como qualquer site ou pessoa, tem pontos a melhorar. São eles:

Homepage

A sua homepage deve dar foco para explicar o que seu site é, o que ele oferece e quais são seus diferenciais.

Uma pessoa ao acessar o seu site, deve nos primeiros segundos identificar que é um site para bar tenders com receitas oficiais e dicas sobre drinks, etc.

Referências:
http://www.nngroup.com/articles/most-violated-homepage-guidelines/

Otimizar imagens

Percebi uma leve demora para a exibição das imagens no site, como o site tem muitas imagens é interessante utilizar uma ferramenta como o www.jpegmini.com para reduzir o tamanho (bytes) das imagens sem perder a qualidade.
Em imagens que sempre terão o mesmo tamanho (que não mudam de tamanho na exibição do celular e de um PC por exemplo) é interessante colocar fixo a largura e altura das imagens.

Referências:
http://browserdiet.com/pt/

Carrossel

Carrossel é um assunto que pode gerar muita discussão, existem vários artigos interessantes sobre isso, mas vou dar duas recomendações simples:
- Deixe o carrossel estático, ele deve ir para o lado apenas se o usuário clicar no botão para trocar de slide.
- Diminua os textos de cada slide do carrossel, seja mais sucinto, talvez apenas o título e imagem.

Motivos:
- O movimento do carrossel sem o comando do usuário pode irritá-lo;
- O usuário não tem tempo suficiente para ler toda a informação antes do carrossel se movimentar;
- Mesmo se for pouca informação, existem pessoas que leem mais devagar, que podem não entender uma palavra, ou por exemplo uma pessoa que não seja brasileira e demore mais tempo para ler um texto simples;
- Prejudica a acessibilidade pois usuários com determinadas deficiências podem ter dificuldade para conseguir pausar o carrossel ou clicar no “Leia Mais”;
- Usuários podem ignorar o carrossel por imaginarem que não conseguirão lê-lo a tempo.

No celular o carrossel não funcionou muito bem, as imagens estão muito grandes, os textos também e a navegação está um pouco confusa.

Referências:
http://www.nngroup.com/articles/auto-forwarding/
http://www.smashingmagazine.com/2015/02/09/carousel-usage-exploration-on-mobile-e-commerce-websites/

Esses dois artigos são bem interessantes, o primeiro não fala muito bem de carrossel e o segundo mostra um bom uso dele. A partir deles você obterá outras referências de artigos também.

Analisando o carrossel da amazon.com percebe-se que o carrossel se move automaticamente, porém, duas coisas são interessantes:
- O carrossel passa por todos os slides apenas uma vez, depois ele para no primeiro. Ele não fica se movendo eternamente.
- Os textos em cada slide são bem curtos.

Público alvo

Se o público alvo são apenas bar tenders profissionais, é preciso deixar claro isso logo ao entrar no site, pois um bar tender ao entrar no site pode achar que é só mais um site qualquer de receitas de bebidas, ele precisa perceber nos primeiros segundos ao entrar no site que pode encontrar muito conteúdo interessante ali.

Mas se também tem o interesse em focar em qualquer pessoa que esteja em casa e queira fazer uma bebida diferente, pessoas como:
- Universitários numa festa com amigos;
- Um divorciado de 30 anos que quer beber algo diferente com sua namorada;
- Uma mulher querendo servir uma bebida para as amigas;

Então você tem que pensar que essas pessoas não conhecem de bebida, então elas tem poucos ingredientes em casa por exemplo e não conhecem determinados termos.
É necessário melhorar os filtros e menus (isso até para bar tenders profissionais vai ajudar).
Outra coisa: Eu não encontrei o campo "Tipo de Medida" no meu primeiro teste para poder trocar para "Caseira". E mesmo na medida caseira, eu não sei quanto é 30 ml, talvez pensar em uma forma de facilitar isso.

No início do site poderia aparecer uma pergunta como "Quem é você?"
-Trabalho como bar tender ou estou estudando isso
-Quero aprender como fazer uma bebida legal em casa
E com base nessa pergunta você poderia alterar o site oferecendo uma experiência diferente para cada perfil.

Mas talvez você veja que não valeria o esforço, que o seu foco é bar tender e quem está estudando isso.
Às vezes uma pequena seção para quem não sabe nada poder estudar um pouco e ter o conhecimento base para navegar no site chamaria bastante atenção, talvez até mais do que preparar todo o site para quem não conhece muito do assunto.

Notícias

Colocar um link para algo relacionado dentro do site logo nos primeiros parágrafos da notícia funciona muito bem.

Seção “Destaque”

Retirar a seção de "destaque", pois:
-Parece que você está vendendo algo
-Parece spam, se você tiver como analisar, perceberá que quase ninguém clica
-Quanto mais informação na tela, maior a carga de trabalho

Referências:
www.nngroup.com/articles/banner-blindness-old-and-new-findings
Para um melhor entendimento, recomendo a leitura do artigo do Jacob Nielsen sobre “Banner Blindness” onde ele fala que usuários quase nunca olham para qualquer coisa que pareça um anúncio. Nessa imagem também mostrada no vídeo mostra que os usuários raramente olham para os anúncios:


Formulário de cadastro

O formulário está muito grande e isso dificulta que as pessoas cheguem até o fim, elas pode desistir de continuar o cadastro ao ver que o formulário é extenso ou desistir no meio caso qualquer coisa a distraia.

Campos como "Apelido", "Sexo", "Data de nascimento", "foto", todos os campos de endereço e números de telefone talvez não sejam necessários no primeiro cadastro. Possibilite o preenchimento desses dados em um outro momento.
Talvez retirar o campo "Profissão" e seguir a ideia do "Sou Bartender Profissional" e exibir 3 campos para seleção:
- Sou bartender profissional
- Quero ser um bartender
- Gosto de apreciar boas bebidas

Retire a seção de "Bebidas mais acessadas" do lado do formulário, isso pode distrair o usuário, além de que se o usuário clicar ali, ele sairá do cadastro sem finalizar o preenchimento.

Mobile

Não fiz uma análise muito aprofundada do mobile, apesar de ser muito importante, mas posso dar três dicas:
- Imagem do logo ocupa boa parte da tela, diminuir imagem ou talvez retirar;
- Carrossel dificultou a navegação, talvez para mobile exibir as notícias de outra forma, ou simplificar o carrossel.
- O menu é um pouco difícil de clicar, principalmente para quem tem o dedo mais gordinho como o Homer Simpson


Conclusão

Foi um prazer testar esse site e mais legal ainda ver que essas dicas estão sendo colocadas em prática.
O site oferece uma boa usabilidade, mas como qualquer site tem pontos a serem melhorados.
Eu recomendaria esse site a um amigo bartender e também para amigos que queiram fazer alguma bebida especial. Eu mesmo me tornarei usuário assíduo deste site.

Um grande abraço ao meu amigo Marcelo, o primeiro cliente do "O usuário está bêbado", todo sucesso do mundo e muitos usuários satisfeitos na sua vida!

Valeu galera!
Adriano Schmidt

quarta-feira, 25 de junho de 2014

Tunning de aplicações Java

Pessoal.. vou postar aqui alguns itens que sempre recomendo para melhorar o desempenho de uma aplicação Java.

Fazer testes de desempenho ou analisar as aplicações com JMeter, NewRelic, VisualVM, jConsole é o mundo ideal! Através disso é possível identificar os gargalos da aplicação! Os pontos que mais utilizam recursos computacionais como memória e processador por exemplo.

Configurar adequadamente a memória utilizada.. ou seja, estude xms, xmx, maxpermgen..
Uma dica é sempre colocar o xms e o xmx igual em ambiente de produção. E o ideal não é simplesmente colocar o valor mais alto possível, é preciso analisar qual é o valor ideal, e isso é descoberto através de testes e monitoramento, ou através do feeling e analisando com o tempo como a aplicação se comporta.

Recomendo utilizar a JRockit como JVM. Ela é mantida pela Oracle também e tem um gerenciamento de memória muito melhor que das outras JVMs, o garbage collector funciona bem melhor.
Mas só tem pra Java 6, mas em todos os clientes que atuo, sempre que possível, implanto a JRockit, é notável o ganho obtido no uso de recursos computacionais como memória.

Dá pra fazer tunning também de acordo com a tecnologia que você está usando.. JSF... JMS... pool de EJB... Banco de dados...

Dá pra monitorar a aplicação pelo jenkins também, fazer um job que checa a memória e qualquer avisa a equipe de infra ou até reinicia, dá pra usar o nagios...

Etc... Existem milhões de outras coisas que podem ser feitas, mas como escrevi esse texto para ajudar um amigo, resolvi postá-lo aqui para talvez ajudar outras pessoas também.

Abraços!
Adriano Schmidt

segunda-feira, 25 de novembro de 2013

Tuning EJB Pool JBoss 7

Pessoal..

Hoje eu tive o erro: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".

Isso aconteceu pois estourou o pool de EJBs..

Basicamente ele funciona assim... tem 20 instâncias no pool..

Cada vez que uma pessoa está usando o sistema e aperta em um botão ou entra em uma tela que chama um serviço EJB, uma instância é tirada do pool..

Se 20 pessoas fizerem isso ao mesmo tempo, acessando o mesmo serviço, as 20 instâncias estarão ocupadas, então se uma 21ª pessoa precisar chamar o serviço EJB, ela vai ter que esperar alguma instância parar de ser utilizada e voltar ao pool... se isso levar mais de 5 minutos, acontece o erro do log: "JBAS014516: Falha ao adquirir uma permissão com 5 MINUTES".

Se tiver 50 pessoas acessando ao mesmo tempo, a 50ª terá que esperar 30 instâncias serem liberadas.

Esse valor de 20 instâncias e o tempo de timeout são configuráveis.

No caso de um sistema, ou de um jboss que tenha vários sistemas, que tenha muitos usuários simultâneos é interessante aumentar o pool de EJBs.

Para saber o melhor valor existem três alternativas:
1) Deve ser feito monitoramento do pool através do JBoss CLI ou de algum profiler que tenha essa funcionalidade
2) Testes de desempenho com JMeter (ou outra ferramenta) e avaliar o desempenho da aplicação com diferentes valores de pool.
3) Seguir o feeling e aumentar de 20 para 30 ou 40 e ir sentindo como a aplicação se comporta com o tempo.

Para alterar os valores do pool você pode fazer isso:
- Direto no standalone.xml ou domain.xml
- No Web Console
- Via JBoss CLI

Infelizmente apenas conseguimos definir o pool para o subsystem inteiro, não conseguimos definir por aplicação ou até mesmo por Serviço EJB.

Existem 3 pool que podem ser alterados:
- slsb-strict-max-pool > é utilizado pelos stateless service bean (foi esse que causou meu erro)
- mdb-strict-max-pool > MDB, utilizado por serviços JMS
- thread-pools > é usado pelo EJB Timer, pelo Asynchronous EJB e para fazer chamadas de EJB remotos.. Caso você use estas funcionalidades e sinta necessidade, esse pool pode ser alterado também. Nesse caso você pode até criar pools separados pois estas 3 funcionalidades compartilham o mesmo pool.

Mais detalhes sobre o subsystem EJB: https://docs.jboss.org/author/display/AS71/EJB3+subsystem+configuration+guide

É isso aí : ) abraço!
Adriano Schmidt

segunda-feira, 24 de junho de 2013

Caixa de ferramentas do arquiteto Java


Gosto de uma definição antiga que pode ser usada até hoje:

“O arquiteto ideal deve ser uma pessoa erudita, um matemático, familiarizado com estudos históricos, um estudioso aplicado de filosofia, conhecedor de música, que não desconheça medicina, detentor de saber jurídico e familiarizado com astronomia e cálculos astronômicos.“ (Vitruvius, 25 A.C.)

Eu tenho trabalhado como consultor em muitos clientes e tenho que tomar diversas decisões arquiteturais sobre tecnologias e ferramentas e também sobre ALM (Application Lifecycle Management). Estou fazendo este post para falar de algumas ferramentas que temos à nossa disposição e que devemos conhecer.

Vale lembrar que a escolha das tecnologias e ferramentas sempre depende de inúmeras variáveis, é necessário entender a aplicação, requisitos, objetivos e limitações para tomar a melhor decisão.

E ferramentas, na verdade, são úteis apenas com a definição de técnicas e de processos de forma adequada.

Enfim, vamos lá! Separei algumas ferramentas por tópicos:

Análise de requisitos, arquitetura e design

O mais importante na análise de requisitos são as técnicas utilizadas, conseguir obter o máximo de informações e detalhá-las conforme necessidade.

Uma ferramenta bem robusta é o Enterprise Architect (EA), porém, gasta-se muito tempo para trabalhar com esta ferramenta.

Existe a possibilidade de trabalhar com arquivos de texto como o Word, porém, não são documentos vivos, uma ideia interessante é utilizar uma ferramenta de wiki, como o xwiki por exemplo. O Confluence da Atlassian é muito bom também para documentação e compartilhamento de conhecimentos.

É interessante o uso de ferramentas para criação de fluxos e diagramas como o Astah (antigo Jude) e o Bizagi.

Para criação de protótipos eu sempre utilizo o Balsamiq Mockups, ele é fantástico! Existem outras opções como o Axure, que é um mais robusto, mas o Balsamiq é mais simples e atente em quase todas as situações.


Gerenciamento de Projetos

O MS Project é ótimo para gerar e organizar cronogramas.

O Jira (ou RedMine, que é basicamente uma versão free do Jira) é muito bom para gerenciar as atividades de um projeto. Você cadastra um projeto, coloca as atividades e o número de horas, delega para os responsáveis, e tem um visão bem clara de tudo que está acontecendo. Estas ferramentas também servem para registrar bugs, é possível visualizar quantos erros aconteceram, de qual tipo, tem diversos gráficos e formas de visualização. Você também pode criar um workflow com todos os passos e responsáveis para cada atividade. Caso você vá usar RedMine, sugiro a instalação do plugin Monitoramento e Controle para melhor visualização das atividades.

Se você for trabalhar com Agile o GreenHopper é uma ótima opção. O Trello é um software de kanban muito eficiente em que você pode organizar seus projetos, atribuir responsáveis, entre outras funcionalidades.

Se você precisa de um produto que seja integrado com a folha de pagamento, que gera relatórios para enviar aos clientes, você pode procurar sistemas próprios para isso, porém, talvez exista a necessidade de customização.


Criação de código (IDE)

Sou adepto da ideia que cada desenvolvedor deve ser livre para escolher sua IDE.

Eu sempre trabalho com o Eclipse, ou com o JBoss Developer Studio (que é o Eclipse com diversos plugins da JBoss), mas caso o desenvolvedor queira usar NetBeans, ou alguma outra IDE (IntelliJ IDEA por exemplo), ou até mesmo um editor de textos qualquer ele deve poder! Para isso deve ser utilizado o Maven, que, entre outras coisas, organiza o projeto para que ele possa ser utilizado com qualquer IDE, ou sem nenhuma.


Repositório de fontes

Há muito tempo era utilizado o CVS, porém, com o surgimento do SVN ele não é mais recomendado.

O SVN é simples de usar e muito eficiente e eficaz.

Caso você tenha uma equipe entusiasta por tecnologia e que abrace a ideia, é uma excelente ideia utilizar o GIT. Ele é mais complexo e mais difícil de aprender, no entanto, traz inúmeras vantagens.

Outra opção é o TFS para versionamento de fontes, mas acredito que ele é extremamente eficiente para projetos com tecnologias Microsoft, mas não para projetos Java, mesmo as versões mais novas do TFS.

Existe ainda o Mercurial, este eu não conheço muito, não conheço muitas empresas que o utilizam.

Existem diversos padrões, utilizados mundialmente, para versionamentos, criação de tags e branches, é de extrema importância definir este processo.


Build automation e Integração contínua

Recomendo a utilização do Jenkins, nele você pode rodar compilação automática, rodar scripts de testes, de validação de código e atualizar ambientes.

O Jenkins é free e opensource, ele sempre me atendeu 100%. Outra opção é o Bamboo, da Atlassian.


Qualidade

Para garantir a qualidade, além dos testes manuais (abrir a tela e verificar se está funcionando) existem outras formas de manter a qualidade como validação de fontes, testes unitários e testes de interface.

Estes testes e validações podem ser rodados automaticamente na integração contínua através do Maven, dessa forma você pode verificar a cada commit se algum teste parou de funcionar ou se alguma política de validação de fonte foi desreipeitada. Caso isso ocorra é enviado um e-mail para quem fez o commit e para os responsáveis pelo projeto.

Para validação de fontes recomendo a utilização de PMD e Checkstyle. Essas ferramentas verificam vários problemas no código. Existem plugins para o eclipse para utilização destas ferramentas. E elas também são rodadas via Maven (ou seja, independem de IDE). Para uma melhor visualização de tudo isso deve ser utilizado o Sonar, que oferece uma tela web para visualização de todos os problemas de código.

Para testes unitários o Arquillian é excelente! É interessante utilizar uma ferramenta que verifica quantas e quais linhas do seu fonte estão sendo cobertas pelos testes, para isso pode ser utilizado o Sonar ou o EclEmma ou o Atlassian Clover ou ainda alguma outra ferramenta.

Se o sistema for SAAS (ou se tiver uma grande preocupação com performance), é importante também escrever testes de desempenho utilizando ferramentas como JMeter, NewRelic, VisualVM, jConsole, entre outras.

Para testes de interface eu já utilizei o Visual Studio para projetos Java Web, achei muito bom, porém, a licença é cara. Quem conhece Java não terá dificuldade para trabalhar com ele, é utilizado C# para escrever os testes de tela. Uma opção free e bem semelhante às ferramentas de teste da Microsoft é o Selenium.

O ideal é estabelecer um processo de desenvolvimento onde sempre se escrevem testes automatizados e uma política de PMD e Checkstyle. Então para liberar uma versão, todos os testes automatizados devem rodar sem erros e a política estabelecida de PMD e Checkstyle deve ser atendida. Com certeza também é importante sempre fazer testes manuais, os próprios desenvolvedores podem testar o que outros desenvolvedores testaram, ou pode ser criada uma equipe de qualidade ou definir uma pessoa para ser tester.


Criação de Help On-line

Com um código bem documentado, é bacana a geração e publicação do JavaDoc. Através das ferramentas de validação de código é possível verificar se os códigos estão ou não documentados.

Mas é possível criar um help on-line de outras formas também, o xwiki é uma opção bacana!

Para a criação de help por página sistema de forma automática talvez exista alguma ferramenta para isso. É possível criar um mecanismo de links, tive que fazer isso em um produto e criei eu mesmo uma estrutura de documentação seguindo alguns padrões que eu defini.


I18n

Pode-se utilizar arquivos de textos, que é a opção mais simples. Porém, já trabelhei salvando as traduções em um banco de dados, é possível trabalhar com cache para melhorar a performance e fica muito bom também. Existem outras estratégias para corrigir problemas de performance com traduções.

Existe ainda a possibilidade de trabalhar com as traduções na Cloud, com a ferramenta transifex por exemplo.

Existem diversos padrões para serem seguidos com relação a tradução, para evitar problemas de formatos de campos, documentos, entre outras coisas.


Conclusão

Primeiro temos que definir ideias, definir o que queremos e o que é preciso de verdade. Após isso deve-se pensar em ferramentas para atender as necessidades.

Temos à nossa disposição inúmeras ferramentas, mas temos que entender melhor cada situação para utilizarmos as ferramentas adequadas.

Um grande abraço!
Adriano Schmidt

sábado, 22 de junho de 2013

JSF 2.2

E aí pessoal..

Hoje estava em um cliente que tem uma aplicação com JSF 2.1 e EJB 3.1 rodando no JBoss AS 7.

Essa aplicação tem centenas de acessos simultâneos e estávamos com problemas de uso de memória e de performance.

Sei que JSF talvez não seja a tecnologia mais adequada para projetos como esse, mas não poderíamos mudar isso agora.

Nós migramos a aplicação de JSF 2.1 para JSF 2.2 e tivemos muitos ganhos! O consumo de memória diminuiu consideravelmente! O GC conseguiu rodar melhor e limpar o heap bem mais do que fazia no JSF 2.1! Não sei se foi apenas por consequência do melhor uso da memória, mas a performance aumentou muito também!

Tudo isso foi constatado pelos próprios usuários e também por testes com o JMeter e com análises utilizando o VisualVM.

Enfim, fica a dica pessoal, usem o JSF 2.2!

Para implantar ele no JBoss AS 7 foi bem tranquilo! Nós seguimos este tutorial: http://www.marcusschiesser.de/2013/01/how-to-use-jsf-2-2-with-jboss-7-1/

Só um porém.. alguns componentes na aplicação tinham update="@form" ou update="idDeUmForm" e isso parou de funcionar no JSF 2.2 :/

Não sei o motivo.. aqui eram poucos casos e resolvemos alterando o update para atualizar o componente que devia ser atualizado e não todo o form.

Ao invés de update="@form" usamos update="idDoComponenteDentroDoFormQueTinhaQueSerAtualizado" : )

Abraços!!
Adriano Schmidt