Author Archives: sidroniolima

Sai JSF, entra AngularJS

AngularJS-large

Atualmente utilizo JSF para o front-end mas percebo que nem de perto é tão produtiva quanto Angular. A ideia deste post é mostrar como substituir tags jsf de uma página xhtml que consome dados de um backend em java pelo AngularJS.

Isso implicará na troca da arquitetura monolítica onde a back e front são tratados na própria aplicação para uma onde estarão separados.

Segue um video para introdução ao Angular como sugestão de tutorial para início com o framework javascript MVC AngularJS.

Mais sobre o processo de substituição dos JSF pelo Angular nos próximos posts. Até.

Conteúdo estático no Wildfly em produção

upload-cloud

Neste Post demonstrarei como utilizar de forma eficiente imagens como conteúdo estático em uma aplicação Java Web com JSF que rode em um ambiente Linux e num servidor WildFly 8.x.

A ideia é utilizar imagens no cadastro de produtos, fazendo seu upload e exibindo-as em diversas partes.

upload_1

As ferramentas necessárias são o PuTTy para criação do diretório no servidor e um editor xml para configuração do Handler no arquivo de configuração do WildFly. No meu caso utilizei o próprio Eclise IDE. Claro que assumindo que já exista uma aplicação com as devidas configurações e rodando. Disponibilizarei a classe que utilizo para tratar o upload da imagem também.

Criando a estrutura de diretório: a aplicação está hospedada num servidor integrator.com.br, portanto definia a seguinte estrutura:

upload_2

Para criação dos diretório é necessário pelo PuTTy criar os diretórios a partir da pasta home, assim: /home/<<usuário>>/var/static/images/pecas.

Configurando o handler no WildFly: agora que as pastas estão criadas é necessário mapear esta estrutura no servidor de aplicação para que possamos acessá-lo. Para isso configuramos o arquivo de configuração, standalone.xml, da seguinte forma:

upload_3

O handler mapeará o caminho definido em /imagens/meu-espaco. Para acessar o conteúdo do diretório basta acessar a url http://<<endereço_do_servidor>>/imagens/meu-espaco.  A opção directory-listing permite que seu conteúdo seja listado:

upload_4

A classe para upload da imagem: o mecanismo de upload é simples graças ao componente Upload da biblioteca PrimeFaces. Sua utilização é simples:
upload_5

A classe FotoProdutoBean encaminhará a ação à Camada de Serviço de produto, que utilizará a classe FotoHelper para escrever o conteúdo do download para o diretório definido.

upload_6

A constante CAMINHO_DAS_FOTOS contém o caminho para o nosso diretório de conteúdo estático, isto é, nossas fotos de produtos (peças): /home/meuvisua/var/static/images/pecas/.

Exibindo as imagens: Enfim, para exibir a imagem basta uma tab <img> html com o mapeamento. Desta forma:

upload_7

Só isso! Ao utilizarmos o handler para mapear um diretório fora do servidor de aplicação tornamos nosso conteúdo estático independente. Num cenário de atualização ou substituição do servidor nada será afetado. Ainda, assim evitamos também salvarmos essas imagens direto no banco, impactando a performance.

Se alguém tiver uma solução melhor ou alternativa, comentem.

Até o próximo.

 

LocalDate e LocalDateTime em JSF 2.2 e 2.3

tempo_122-692x360

Com a API Date-Time do Java 8 novos objetos de representação e tratamento de data e tempo foram introduzidos no cotidiano de desenvolvedores que recorriam à implementações diversas, como o Joda Time.

Como caraterística desta API pode ser destacados a facilidade na utilização o que não era presente nas versões anteriores com os objetos java.util.Date e java.sql.Date.

Entretanto a versão JSF 2.2 ainda não proporciona a conversão nativa desses objetos. O que já incorporado na próxima versão, 2.3, programada para ser lançada em 2017 junto a Java EE 8.

Assim, para utilizar os objetos LocalDate e LocalDateTime é necessário criar conversores JSF e atribuí-los ao conversor da tag <h:outputText>. Abaixo o exemplo de utilização.

Os converters devem implementar a interface javax.faces.convert.Converter e ser anotados com javax.faces.convert.FacesConverter, onde é definido o nome (id).

@FacesConverter("localDateTimeFacesConverter")
public class LocalDateTimeFacesConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String stringValue) {

if (null == stringValue || stringValue.isEmpty()) {
return null;
}

LocalDateTime localDateTime = null;

try {

localDateTime = LocalDateTime.parse(
stringValue.trim(),
DateTimeFormatter.ofPattern(“dd/MM/yyyy hh:mm:ss”).withZone(ZoneId.systemDefault()));

} catch (DateTimeParseException e) {

throw new ConverterException(“O formato da data e hora deve ser 13/11/2015 12:00:00.”);
}

return localDateTime;

}

@Override
public String getAsString(FacesContext context, UIComponent component, Object localDateTimeValue) {

if (null == localDateTimeValue) {

return “”;
}

return ((LocalDateTime) localDateTimeValue)
.format(DateTimeFormatter.ofPattern(“dd/MM/yyyy hh:mm:ss”)
.withZone(ZoneId.systemDefault()));
}
}

@FacesConverter("localDateFacesConverter")
public class LocalDateFacesConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String stringValue) {

if (null == stringValue || stringValue.isEmpty()) {
return null;
}

LocalDate localDate;

try {
localDate = LocalDate.parse(
stringValue,
DateTimeFormatter.ofPattern(“dd/MM/yyyy”));

} catch (DateTimeParseException e) {

throw new ConverterException(“O ano deve conter 4 dígitos. Exemplo: 13/11/2015.”);
}

return localDate;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object localDateValue) {

if (null == localDateValue) {

return “”;
}

return ((LocalDate) localDateValue).format(DateTimeFormatter.ofPattern(“dd/MM/yyyy”));
}
}

Os Converters apenas fazem a conversão do objeto para String e vice-versa, não há maiores problemas na implementação. Caso o parse para o padrão definido gere uma exceção esta é lançada como ConverterException e exibida ao usuário. No entanto nos testes e em implementações dessa lógica esta mensagem não chega ao na view e deve ser definido o atributo converterMessage da tag <h:inputText>.

<code><label for=”inputAdmissao”>Data de admissão <span class=”required”>*</span></label>
<h:inputText
class=”form-control input-sm m-bot15″
id=”inputAdmissao”
pt:placeholder=”Admissao ”
value=”#{cadastroFuncionarioBean.funcionario.dataDeAdmissao}”
required=”true”
requiredMessage=”É necessário informar a data de admissão.”
converterMessage=”A data deve estar no formato dd/MM/aaaa”>

<f:converter
converterId=”localDateFacesConverter”
for=”inputAdmissao”/>

<f:ajax
event=”blur”
render=”m_inputAdmissao” />

</h:inputText> </code>

data

A novidade que a versão do JSF 2.3 traz é a adição de type attributes para as classes java.time.LocalDate e java.time.LocalDateTime, respectivamente localDate e localTime. :-p

<code>

<h:inputText value="#{myBean.startTime}">
    <f:convertDateTime type="localDateTime" />
</h:inputText>
<h:outputText value="#{myBean.endDate}">
    <f:convertDateTime type="localDate" pattern="dd.MM.uu" />
</h:outputText>

</code>

É isso. E para saber mais das novidades da nova versão do JSF segue esse link What’s new in JSF 2.3?.

JSF and Bootstrap form modal

Na atualização de versão do software twarehouse além da migração do Tomcat para o Wildfly, a correção de alguns bugs, o refatoramento das classes e outras melhorias resolvi alterar o framework front-end do primefaces para o bootstrap (Twitter).

Tenho enfrentado muitos desafios neste processo já que é grande o trabalho para configurar templates htmls criados com bootstrap.

Somado a isso ainda há algumas incompatibilidades de design e comportamento entre o framework e o JSF, que consomem bastante tempo e neurônios.

Uma dessas dificuldades que enfrentei foi quando surgiu a necessidade de um mensagem de confirmação na exclusão de registros:

Controle na pesquisa dos registro.s

Controle na pesquisa dos registro.

Os “botões” do controle na verdade correspondem ao atributo <a> do html com o atributo jsfc que permite a utilização dos atributos do componente aninhado à tag html, no caso o <a>. Segue abaixo:

[code language=”html”]

<a class="btn btn-danger"
jsfc="h:commandLink"
type="button"
action="#{pesquisaSubgrupoBean.setSubgrupoSelecionado(subgrupo)}"
immediate="true">
<f:setPropertyActionListener
value="#{subgrupo}"
target="#{pesquisaSubgrupoBean.subgrupoSelecionado}"/>

<f:passThroughAttribute name="data-toggle" value="modal" />
<f:passThroughAttribute name="data-target" value="#myModal" />
<f:ajax/>

<i class="icon_close_alt2"></i>
</a>
[/code]

Até ai tudo bem. O problema mesmo era fazer com que o form modal fosse chamado ao clicar no botão. Segue o código do form:

[code language=”html”]

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModal" aria-hidden="true" data-keyboard="false" data-backdrop="static">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<h:form id="myForm">
<div class="modal-header">
<button aria-hidden="true" data-dismiss="modal" class="close" type="button">×</button>
<h4 class="modal-title">Confirmação de exclusão</h4>
</div>
<div class="modal-body">
<h:panelGroup
layout="block"
id="panelDescricao">

Deseja realmente excluir o registro selecionado?

<a type="submit"
class="btn btn-warning btn-sm"
jsfc="h:commandLink"
action="#{pesquisaSubgrupoBean.excluir()}">
Sim
<f:passThroughAttribute name="data-dismiss" value="modal" />
<f:ajax
execute="@this"
render="@form"/>
</a>

<button
id="close"
type="submit"
class="btn btn-info btn-sm">Não</button>
</h:panelGroup>
</div>

</h:form>
</div>
</div>
</div>

[/code]

Após muitas falhas, como Edson, só precisei acertar uma vez. Com a adição dos atributos no código do botão o form passou a ser chamado, mas instantaneamente era fechado:

[code language=”html”]

<f:passThroughAttribute name="data-toggle" value="modal" />
<f:passThroughAttribute name="data-target" value="#myModal" />

[/code]

Form modal chamado pelo botão excluir.

Form modal chamado pelo botão excluir.

Espero que tenha contribuído e ajudado alguém, já que vi algumas tantas dúvidas ainda não respondidas ou que a solução fosse diferente e ineficaz.

Em tempo: ainda tem um pequeno problema. Não consegui a descrição das instância selecionada na mensagem de exclusão. O componente seta a propriedade mas o valor não é exibido. Vou debugar utilizando alguns phaseListeners para identificar o momento de cada ação.

Até!

Site institucional tetra TI no ar.

tetrati-desenvolvimento

Voltando aos posts depois de algum muito tempo, aproveito para lançar o site institucional da empresa tetra TI.

A criação deste site representa dois marcos: a criação do nome, já que o domínio era sidroniolima.com.br, que passará a corresponder a este blog. E a tendência e consolidação do desenvolvimento Web, estático ou dinâmico.

Com isso surge então o tetrati.com.br com a apresentação de 3 principais projetos:

  • O software PCP que está em desenvolvimento;
  • O software Twarehouse (foto), já comercializado, para controle de almoxarifado e estoque;
  • Dashboard do Twarehouse.

    Dashboard do Twarehouse.

  • E o software ERP para micro e pequena empresas que será lançado em breve.
  • Para conhecer o Twarehouse basta acessar aqui.

    Em breve novas atualizações!

    Os números de 2012

    Os duendes de estatísticas do WordPress.com prepararam um relatório para o ano de 2012 deste blog.

    Aqui está um resumo:

    600 pessoas chegaram ao topo do Monte Everest em 2012. Este blog tem cerca de 2.100 visualizações em 2012. Se cada pessoa que chegou ao topo do Monte Everest visitasse este blog, levaria 4 anos para ter este tanto de visitação.

    Clique aqui para ver o relatório completo

    Backup Schedule no MySql – Resolvendo

    Saudações!

    Em uma aplicação que estou desenvolvendo me deparei com erro ao criar um backup agendado (Schedule backup) no MySql Administrator.

    Pesquisando eu observei a quantidade de desenvolvedores com o mesmo problema. Algumas soluções propostas não funcionaram e como eu consegui, resolvi postar a solução, que é simples.

    Ao criar um projeto de backup e defini-lo como agendado, o MySql cria um task no windows, mas o problema é que ele não executa e gera o seguinte erro no log de tarefas do windows, o arquivo SchedLgU.Txt:

    (MySQLAdministrator.exe) 12/1/2013 10:10:00 ** ERRO **
    A tentativa de recuperar informações da conta para a tarefa especificada falhou. A tarefa não foi executada. Ocorreu um erro ou não existiam informações de conta para a tarefa.
    O erro específico é:

    0x8004130f: Não foi possível encontrar informações de conta no banco de dados de segurança do agendador de tarefas para a tarefa indicada.

    Cheguei a solução que é necessário marcar a opção Executar somente se conectado nas opções da tarefa (task) criada pelo MySql. Só isso e funcionou.

    Espero ajudar aos muitos que passaram por esse problema.

    Até!

     

    As maiores falhas em softwares

    Esse post vai como curiosidade sobre erros ou falhas em softwares que não foram detectadas ou corrigidas a tempo e que provocaram desastres humanos e prejuízos bilionários.

    Uma dessas falhas é citada em Sommerville 8a Ed., em um dos capítulos sobre Teste de Software.

    O vídeo relata 2 falhas, primeiro sobre o desastre no lançamento do Ariane 5 e depois sobre o PATRIOT, sistema de defasa anti-aérea dos EUA.

    As duas falhas foram provocadas por um erro conhecido como erro de arredondamento, ou roundoff error, onde números infinitos, como dízimas periódicas, são impossíveis de se representar utilizando base binária. E, conforme a quantidade de bits usados para representar esse número são feitos arredondamentos, e dependendo da utilização pode levar a diferença de cálculo.

    O segundo vídeo ajuda a explicar isso, e esse link http://en.wikipedia.org/wiki/Round-off_error também traz uma explicação.

     

    COBIT – Negócio + TI

    Nesse post vamos tratar do alinhamento estratégico da TI, seu papel dentro do ambiente e governança empresarial, seus desafios e uma introdução ao COBIT.

    É comum na realidade empresarial atual tratarmos constantemente da preocupação quanto ao alinhamento estratégico de todas as áreas de negócio. Porém a TI vem se destacando como principal fonte de agregação de valor e posicionamento estratégico.

    A TI evolui de um cenário meramente participativo, fornecendo e suportando processos operacionais, através do puro emprego da tecnologia, para uma função de parceiro estratégico. Hoje, ela proporciona o crescimento do negócio, é inseparável, justifica seus gastos através de investimentos. Enfim, suporta além da tecnologia, o negócio.

    Para garantir que a TI esteja alinhada aos objetivos estratégicos, as diretrizes e ao futuro empresarial faz-se uso de uma camada de união entre negócio e tecnologia, a Governança de TI. Através do COBIT, Control Objectives of Information and Related Techonology, suas áreas de foco e seus processos isso se torna possível.

    As áreas de foco da Governança de TI, no COBIT são 5:

    • Alinhamento estratégico
    • Entrega de valor
    • Gerenciamento de riscos
    • Gerenciamento de recursos
    • Mensuração de Desempenho

    É imprescindível o uso dos processos dentro dessas áreas de foco da Governança de TI para o sucesso do negócio. Os desafios da TI como parceira, através do posicionamento estratégico, são muitos, porém suportados pelo COBIT.

    Em outros tópicos vamos expandir os conceitos do COBIT, suas áreas e processos. Sempre voltado para o conceito de Governança e TI com comprometimento estratégico.

     

     

    Gestão por Processos, um esboço

    O foco atual das organizações sobre a agregação de valores aos clientes pode ser encarado como a principal meta da Gestão por Processos. O cliente já não paga pelo produto ou tão somente por ele, mas sim por uma série de valores intrínsecos e inter-relacionados. Uma softwarehouse não fornece programas de computador a seus clientes, viabiliza soluções e contribui para vantagens competitivas.

    Identificar como esses valores são acrescidos à organização é possível através da otimização contínua dos processos operacionais e estratégicos. Daí a gestão por processos.

    O que são processos?

    Toda organização é uma coleção de processos, ou seja, é um composto de atividades de trabalho logicamente inter-relacionadas, executadas para atingir objetivos de negócios. São compostos por pessoas, instalações de apoio, procedimentos, informações e bens facilitadores, de maneira organizada. Na hierarquia de processos temos o processo em si, os subprocessos, as atividades e as tarefas. Podem ainda, ser classificados em primários, ou chaves, e de suporte, ou apoio.

    Processos chaves

    Estão ligados diretamente à produção do produto que a organização tem por objetivo disponibilizar para seus clientes. São todos os que compõem o conjunto de atividades realizadas para projetar, produzir, comercializar e disponibilizar esse produto. Dentro de uma empresa de software, o levantamento de requisitos pode ser considerado como processo chave, pois é a base para todo o projeto. É através deles que chegaremos a um produto de software condizente com a necessidade do cliente, a custos e esforços compatíveis e de interesse competitivo.

    É importante ressaltar que processos críticos são produzidos sob uma perspectiva do cliente sobre a organização, a partir de resultados insatisfatórios e seu grau de impacto.

    Vantagens do Gerenciamento pro processos

    É possível identificar algumas vantagens na adoção do gerenciamento por processos:

    • Alinhamento estratégico;
    • Foco no cliente;
    • Desempenho controlado;
    • Força de trabalho alinhada aos processos;
    • Maior disponibilidade de recursos;
    • Execução eficiente dos processos;
    • Eliminação de duplicidade;
    • Simplificação;
    • Padronização;
    • Automação e/ou mecanização.

    Para que se faça uso dessa gestão, algumas ações devem ser tomadas: os processos devem ser identificados e mapeados, e controlados, através de indicadores.

    Mapeamento de processos

    A identificação e o desenho do processo é executada aqui. É através dela que objetivos, clientes, fornecedores e resultados esperados são definidos e a documentação e a representação visual são criadas. Desta forma o mapeamento se torna a principal ferramenta de entendimento de um processo.

    Algumas perguntas se tornam importantes no processo de modelagem:

    • O que: o que se faz e qual o objetivo.
    • Por quê ou para quê: questiona-se a validade de cada etapa.
    • Quem: autoridade e responsabilidade de cada etapa.
    • Onde: qual o local e se esse é o mais indicado.
    • Quando: sequência, o momento e a ordem correta.
    • Como: execução das tarefas.

    Indicadores

    De nada adianta identificar se não se pode medir. Os indicadores devem focalizar as questões críticas do negócio da empresa e estão diretamente relacionados com o que o cliente espera (valor) e o que é feito para se atingir isso.

    Representam uma ferramenta para suporte a tomada de decisão gerencial e operacional, utilizada para acompanhar e melhorar os resultados ao longo do tempo.

    Porém, é preciso discernimento na escolha dos indicadores. Mas importante de como medir é o que medir. Fazer uso indiscriminado, ou seja, sem priorização ou hierarquia, ou medir apenas para controle de metas ao invés de enfoque na melhoria, ou apenas para cortar custos, ao invés de melhorar o desempenho e qualidade, pode se tornar um entrave à gestão.

    Os indicadores devem proporcionar aumento no desempenho, na eficiência e eficácia dos processos. E nada mais.

    Voltando ao exemplo do levantamento de requisitos, em uma empresa de software, um exemplo de indicador seria a quantidade de requisitos falhos. Através da análise desse, seria possível identificar falhas na execução do processo e oportunidades de melhorias.

    Otimização

    Significa empregar os resultados dos indicadores na busca pela melhoria contínua dos processos, a fim de torná-los uma vantagem competitiva para a organização. Processos otimizados significam qualidade, que impactarão de forma positiva na expectativa de valor para o cliente. A otimização está presente em termos da TI, como ITIL e Cobit, além de claro no PMBOK, na gestão de projetos.

    Com este pequeno esboço, foi tratado alguns pontos da gestão por processos. A definição de processos de negócio, as três etapas, mapeamento, controle e otimização, que estão interligadas e que são cruciais para o alavancamento da agregação de valor aos produtos.  Também foi demonstrado algumas das vantagens na adoção desse tipo de gestão.

    Em um próximo post espero demonstrar o mapeamento de um processo através do Enterprise Architect, utilizando BPMN.

    Não deixe de comentar.

    Até.