sexta-feira, 11 de dezembro de 2015

BlazeDS + HTTPS + Load Balancer

Quando se usa BlazeDS sobre HTTPS se recomenda usar esta configuração no services-config.xml:

<channel-definition id=”my-amf-secure” class=”mx.messaging.channels.SecureAMFChannel“>

<endpoint url=”https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure” class=”flex.messaging.endpoints.SecureAMFEndpoint “/>

Só que se você tiver um Load Balancer como foi meu caso numa aplicação de cliente na Amazon, a aplicação não vai subir. Para você saber se o servlet do Blaze (MessageBrokerServlet) subiu corretamente é só digitar no browser https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure deverá aparecer uma tela em branco.

No meu caso, não apareceu nenhuma informação na log.

Pesquisando encontrei esse link: LCDS with SSL Termination with Load Balancer fails que recommend usar AMFEndpoint em vez de SecureAMFEndpoint, isto porque a requisição do cliente até o Load Balancer irá usar HTTPS normalmente mas do Load Balancer para o servidor de aplicação normalmente será HTTP.


sábado, 3 de outubro de 2015

UTF-8 em Strings Java

Nesse post gostaria de deixar a dica de ao usar o método getBytes de String ou new String(byte[]) utilizem passando o charset UTF-8:

"qualquerString".getBytes("UTF-8");
new String("qualquerString".getBytes("UTF-8"), "UTF-8");

Enquanto estiver trabalhando no mesmo sistema operacional não terá problema, mas pode gerar comportamentos estranhos quando em sistemas operacionais diferentes.

Foi o meu caso que estava usando uma criptografia para senhas e ao mudar o server de Linux para Windows começou a retornar como senha inválida, como a aplicação só tinha mudado de servidor enquanto que o banco de dados não teve alteração estava claro que estava pegando o charset da máquina, não levou muito tempo mas já gerou um retrabalho.

Então fica dica, usem sempre UTF-8.


terça-feira, 29 de setembro de 2015

quinta-feira, 3 de setembro de 2015

Adicionando jars externos com Maven

Num projeto de Pagamento On-line que desenvolvi para um cliente não tinha usado maven, mas agora com uma demanda nova coloquei-o. Mas esse projeto depende de outros dois projetos que também tinha criado sem maven e um terceiro jar de um fornecedor externo, para não perder mais tempo procurei como poderia usar esses jars de forma mais direta.

Encontrei esse link Adding external/custom jars into Maven project, e fui direto aplicar a primeira dica: usando dependência de sistema. Ao gerar o build e publicar vi que o .war gerado não tinha os jars dos projetos externos, cheguei a conclusão que esta opção não os leva mesmo, li o artigo depois da primeira dica e afirmava o que já suspeitava.

Fui então para a segunda dica: instalando jars no repositório local do maven. Rodei o mvn install:install-file para cada um e no pom.xml removi as tags scope e systemPath e agora funcionou como queria.

Fica aí o toque, use a opção: instalando jars no repositório local do maven.


sexta-feira, 28 de agosto de 2015

AngularJS Directives

Para quem está se aprofundando em AngularJS recomendo o canal no YouTube do Rodrigo Branas.

Boa didática e direto ao assunto. Muito bom todos vídeos mas destaco o Criando diretivas parte 2 e 3.


domingo, 5 de julho de 2015

Performance com AngularJS

Palestra da InfoQ que recomendo:

Alguns destaques:
* Use $emit em vez de $broadcast para troca de mensagens entre scopes
* Use two-way data binding somente quando realmente necessário, caso não seja, utilize one-way data binding. O one-way data-binding foi implementando na 1.3 e faz o valor ser renderizado uma só vez não sendo mais visitado pelo dirty checking. Para isso use ::, como em {{::valor}}. Tome cuidado somente ao usar one-way em valores dentro de um ng-repeat que possa vir a ser filtrado para não ter valores apresentados de forma incorreta.
* use ng-if em vez de ng-show. O ng-if inclui o elemento no DOM somente quando a condição for atendida enquanto que ng-show só oculta (display: none), com isso o dirty checking irá verificar o elemento com ng-show mais vezes do que com ng-if tendo um custo maior.
* use com moderação os filters, porque toda vez que um atributo two-way data binding é alterado o dirty checking repassa toda a árvore DOM revalidando todos os bindings. Sugestões aqui é já trazer o atributo já formatado ou manipular o array formatando-o usando o método map de Array (quando o filter foi utilizado para formatar) ou outra forma.
* nos ng-repeat utilize track by $index, isso irá otimizar o loop:
           ng-repeat="item in items track by $index"
* Uso de ng-model-options, também feature nova da 1.3, informa o tempo ou em que momento o model deve ser atualizado.

Veja também:
Exploring Angular 1.3: One-time bindings
Exploring Angular 1.3: ng-model-options

terça-feira, 16 de junho de 2015

Web Design Responsivo - Premissas

Não se preocupe com tamanho da tela ou marca do dispositivo, se foque na resolução.

Os tipos de medidas % e em são escaláveis e px é fixa. Use px somente quando necessário, tipo um input que terá uma data, não tem necessidade de ficar maior que o texto de uma data se a resolução for maior. 

Para layouts usar sempre %, width e height por exemplo. % pega como referência a largura do componente pai, por exemplo, se o browser tem 800px uma div com 50% terá 400px e uma div dentro dessa div com 50% terá 200px.

Em fontes, font-size usar em, o padrão nos browsers é 16px, então se você quiser um texto com 24px então use 1.5em (24 / 16). Esse também sempre pega como referência o componente pai.

domingo, 14 de junho de 2015

JsonIgnore e XmlTransient

Estou fazendo uma aplicação RESTful, e tinha alguns parâmetros que não queria que fossem parseados para JSON. Estava usando @JsonIgnore e o atributo ia igual.

Depois de muita pesquisa na web, me lembrei do @XmlTransient que funcionou como esperado. Mas precisa ter a seguinte anotação sobre a classe @XmlAccessorType(XmlAccessType.FIELD)

Fica a dica, para não ficarem como eu um tempão pesquisando na web.

quarta-feira, 10 de junho de 2015

Mobile Summit - Porto Alegre / RS - 26/09

Fique por dentro das oportunidades e novidades no desenvolvimento mobile.

O evento terá de 8 à 9 palestras, sobre desenvolvimento, ferramentas e melhores práticas.

Eu vou e vc?

Compre seu ingresso R$ 65,00 o 1o lote: Mobile Summit

terça-feira, 9 de junho de 2015

Webinar Design de APIs RESTful

Mais um ótimo material sobre RESTful.
Abrange todos os tópicos necessários para ter uma aplicação realmente RESTful e de uma forma bem clara.


Fonte: Kleber Bacili da Sensedia

Veja também: 

quarta-feira, 27 de maio de 2015

PostGreSQL - Conexões idle

Uns dois meses atrás uma aplicação que tinha desenvolvido para um cliente usando JDBC e hospedada na Amazon, estava dando erro de conexão.

Pesquisando vi que existe o comando:

select * FROM pg_stat_activity

que informa os states das conexões.

E este para fechar as conexões (use com cuidado):

select pg_terminate_backend(pg_stat_activity.pid)
from pg_stat_activity
where pg_stat_activity.datname = 'database' AND pid <> pg_backend_pid();

Pesquisando ainda, encontrei vários links informando para usar o método close nos objetos: Connection, ResultSet e PreparedStatement. Revisei o código adicionando o método close sempre que necessário o que resolveu o meu problema.

Segue então aí a dica de sempre usar close quando estiver usando JDBC.

Nota: Prefira PreparedStatement em vez de Statement para evitar SQL Injection.

terça-feira, 6 de janeiro de 2015

Erro ao gerar pdf com JasperReports

Numa aplicação de um cliente numa parte da app gerava um pdf e o enviava anexado a um email. No ambiente de desenvolvimento que no meu caso é Windows ou Mac funcionava corretamente ao colocar no servidor de produção que é Linux a mesma rotina retornava os erros:

Could not initialize class 
net.sf.jasperreports.engine.util.JRStyledTextParser
ou
Could not initialize class 
net.sf.jasperreports.engine.export.MatcherExportFilterMappingExtensionsRegistryFactory

Buscando pela web encontrei vários links sobre esse assunto, uso de fonte específica no jasper o que não era o meu caso, setar um valor num jasperreports.properties na pasta class entre outros.

Estava usando o jasperreports-4.1.1 enquanto que a versão atual é a 6.0.0. Olhei os fontes do jasper para ver se vinha uma luz, não tendo uma solução clara preferi atualizar o jar do jasper com a expectativa que o erro em relação ao sistema operacional já estivesse corrigido.

Como o projeto não usa Maven, atualizei manualmente e a cada teste dava um novo erro devido a falta de alguma dependência. Nunca senti tanta falta do Maven

Mas por fim fui gratificado com solução do problema.


domingo, 4 de janeiro de 2015

LIMIT do PostgreSQL != ROWNUM do Oracle

Numa aplicação de um cliente, Flex+Java+JDBC+PostgreSQL, estou ajudando a converter para usar Oracle.

Numa olhada rápida trocamos o comando LIMIT do PostgreSQL nas instruções sql para ROWNUM (no where) por acharmos serem equivalentes.

Na maioria das alterações funcionou corretamente pois tínhamos LIMIT 1, então trocando para WHERE ROWNUM = 1 se obteve o resultado esperado comparando o retorno da aplicação usando PostgreSQL e Oracle.

Mas em outros casos o resultado não foi o esperado, tipo LIMIT 10 trocando para ROWNUM = 10, retornava 1 registro ou nenhum enquanto que o PostgreSQL retornava até 10 registros.

Olhando a documentação dessas instruções se percebeu que não são equivalentes, o LIMIT "limita" a quantidade de registros retornados até o número informado, podendo retornar menos, enquanto que o ROWNUM é uma pseudo coluna que o Oracle "cria" para cada linha retornada, nesse caso ROWNUM = 10 irá retornar somente a linha 10 ou nenhuma caso o restante do WHERE retornasse menos de 10 linhas.

A solução foi fácil, ROWNUM <= 10. 

Veja também: