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

quarta-feira, 16 de janeiro de 2019

HoldenRH - Oportunidades Java: São Paulo, Porto Alegre, Alemanha e Lisboa

Vagas em São Paulo - 
Desenvolvedor  java Júnior /Pleno e Sênior em empresa da área financeira localizada na Av Paulista
Desenvolvedor Java  para  a Alemanha (  com  cidadania européia)
Desenvolvedor Java Sênior/Devops - Lisboa  ( sem necessidade de cidadania)
Vagas em São Paulo e fora do Brasil  verifique em nosso site, ou fale com um dos gestores da área em São Paulo ( Jonas Kaffka - jonas@holdenrh.com.br



Desenvolvedor ETL/JAVA - Integrações
Desenvolvedor Java - Produtos


Desenvolvedor  Integrações/Java - Região de Porto Alegre/RS

Atividades: Desenvolver soluções para captação, transformação, carga e disponibilização dos dados, visando atender as demandas técnicas requisitadas, utilizando os padrões estabelecidos pela empresa ou propondo alternativas tecnologicamente viáveis, de qualidade e escaláveis.

Requisitos:
•    Experiência com Scala ou Java, SQL, ETL, SSIS, Visual Studio;
•    Conhecimento de Bancos de dados e controle de versão utilizando GIT;
•    Domínio em Lógica de Programação e desenvolvimento Orientado a Objetos;
•    Conhecimento em Metodologia Ágil;

Contratação CLT + pacote completo de benefícios
Remuneraçao estimada( 4K a 6K)

Desenvolvedor Pleno JAVA– Região de Porto Alegre / RS

Requisitos:

Experiência em desenvolvimento de sistemas corporativos web e conhecimentos em orientação a objetos, Padrões de projetos e Java/JEE;
Conhecimentos em EJB, Hibernate, SQL, XML, JSF, HTML, CSS, Javascript, Maven, Struts, WebLogic, Junit/, webservices -REST;
Superior cursando em áreas relacionadas à tecnologia.

Cliente:  Empresa de porte em crescimento , passando por joint venturue com  grande player do mercado de tecnologia.

Contratação CLT + VT/Esstacionamento+ VR/VA( 1000,00)+ saude, odonto, PPR( 1 salario) e condições de crescimento
Remuneração estimada ( 5K a 7k)


Caso tenha alguma indicaçao , ou puder replicar para sua rede, fique a vontade,

Atenciosamente,
Janice von Muhlen
Headhunter -  IT
fone/whats: 51-993996090
janice@holdenrh.com.br

terça-feira, 23 de fevereiro de 2016

Verificação de internet ativa para carregar libs JS remotas ou locais

Normalmente libs JS fornecem um caminho CDN e é uma boa prática usá-la porque como o browser faz cache do que baixa se outra aplicação usar a mesma lib o seu carregamento será mais rápido já que esta lib já está no cache do browser.

E hoje normalmente é mais difícil ficar sem internet, mas para evitar contratempos, ainda mais se você trabalha remoto com algum deslocamento é bom verificar se a internet está ativa e pegar as libs do CDN ou local.

Segue abaixo algumas sugestões variando conforme as linguagens de programação utilizadas:

PHP:
$internetON = @fsockopen("www.google.com", 80);

JS:
Algumas libs como jQuery e Angular criam um objeto que pode ser verificado. Esta metodologia não gosto muito porque se tiver que carregar um CSS do bootstrap por exemplo irei ter que tentar carregar a lib js na tab head e depois o css, sendo que, a boa prática recomenda carregar os CSS na tag head e os JS antes do fechamento da tag body.

<script src="http://code.jquery.com/jquery-1.11.3.min.js"/>
<script>
var internetON = (window.jQuery !== undefined);
if (internetON) {
      document.write('<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" >');
} else {
      document.write('<link rel="stylesheet" type="text/css" href="css/libs/bootstrap-3.3.6-dist/css/bootstrap.min.css">');
}
</script>

JSP / JAVA:
ApplicationUtil.java
    public static boolean internetON() {
        try {
            URL url = new URL("http://www.google.com");
            HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
            Object objData = urlConnect.getContent();
        } catch (Exception e) { 
            return false;
        }
        
        return true;
    }

JSP
<%@ page import="br.com.lexsis.improvement.ApplicationUtil" %>
<%
    boolean internetON = false;
    if (request.getLocalName().equalsIgnoreCase("localhost")) {
        internetON = ApplicationUtil.internetON();
    } else {
        internetON = true;
    }
%>
...
<% if (internetON) { %>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<% } else { %>
<link rel="stylesheet" type="text/css" href="js/libs/bootstrap-3.3.6-dist/css/bootstrap.min.css">
<% } %>

JS / JAVA / RESTfull:
Aqui seria uma mescla do JS com JSP / JAVA. Fazer o load do AngularJS e fazer uma requisição RESTful para verificar se a internet está ON, se tiver faz a carga dos demais CSS e JS.


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.


segunda-feira, 22 de julho de 2013

Auditoria em PostgreSQL

Uns anos atrás na Sadig onde trabalhava precisei alterar o produto BI para fazer com que as chamadas a banco de dados que já "conversavam" com dbf, SQL Server e Oracle para também rodarem em PostgreSQL, gostei muito desse banco, e cada vez tenho aprendido mais sobre ele.

Agora num cliente, a Lexsis, precisamos implementar o recurso de auditoria no PostgreSQL. Se estivéssemos usando Hibernate poderíamos usar o Envers o qual usando a anotação @Audited na classe com a anotação @Entity cria uma nova tabela com atributos adicionais no banco para gravar as alterações na tabela da entity

Outra opção é ter uma única tabela e gravar o DTO serializado num campo dessa tabela, mas não seria fácil de identificar só utilizando a console do banco.

Usamos JDBC puro, então, uma opção que foi definida em reunião foi criar um schema para auditoria com uma cópia de cada tabela com campos adicionais específicos para auditoria da aplicação usando triggers
Bem, mas para cada tabela se precisa criar a trigger / function e um script para criar a tabela de auditoria, o que na primeira vez se torna trabalhoso e repetitivo pelo número de tabelas existentes em cada aplicação que irá usar a auditoria, porque a trigger é vinculada a uma única tabela e a uma function. Usar uma única function é uma ideia mas não cheguei a um código que contemplasse o meu cenário, mas não perdi muito tempo pois sempre achei interessante ser o mais independente do banco, caso seja necessário migrar para outro.

A ideia de ter uma tabela de espelho num schema separado é interessante por ser mais fácil a visualização, não necessitando de uma interface apropriada. Usando este formato e pensando em otimizar o processo me foquei em dois pontos: como otimizar a criação das tabelas espelhos e como não precisar das triggers.

Referente a criação das tabelas, dando uma olhada no create table do PostGreSQL vi que existe as cláusulas INHERITS e LIKE, o primeiro permite herdar a estrutura de uma ou mais tabelas (multi-herança), onde qualquer alteração nas estruturas das tabelas herdadas como alteração de um campo ou inclusão afeta as tabelas filhas o que resolve a situação de ter os mesmos campos de auditoria em todas as tabelas, enquanto que o LIKE permite pegar a estrutura de outra tabela, mas diferente do INHERITS, alterações na tabela de origem não se propaga para a tabela de destino. O LIKE não copia os valores default da tabela de origem (EXCLUDING DEFAULTS) só o faz com a adição de INCLUDING DEFAULTS.

Referente a segunda opção, para ficar independente de banco de dados utilizei introspection / reflection e anotações. Em cada DTO / entity marquei com uma anotação para identificar a tabela (equivalente o @Entity do Hibernate) do banco e outra anotação para identificar o campo id (primary key - PK) na tabela (equivalente o @Id do Hibernate). Com isso passo o DTO para uma classe com mais alguns parâmetros da aplicação que via introspection / reflection monta um insert...select para popular a tabela de auditoria, ficando assim independente de banco de dados e se for necessário migrar para outro banco só se altera uma classe. 
O único cuidado que se tem que ter com o insert...select é que a ordem dos campos da cláusula select tem que fechar com a ordem dos campos da tabela do insert, pois não vincula o campo / valor da tabela do select com o campo na tabela de destino, podendo dar erro de tipo inválido ou gravar um valor de um campo em outro por estarem na mesma ordem e terem o mesmo tipo de dados.

Com esta metodologia, usando introspection / reflection e anotações, consegui montar um início de um ORM, passando o DTO consigo fazer a exclusão, agora o próximo passo é fazer o insert, update passando o DTO e a listagem lendo os valores da tabela e populando os DTOs necessários.


sábado, 6 de abril de 2013

sábado, 16 de março de 2013

Concatenação de Strings e Cálculo com precisão

Dois tópicos aparentemente simples que esbarramos seguidamente programando em Java é qual a melhor forma de concatenar Strings, usando o operador +, StringBuilder ou StringBuffer e o outro tópico é como fazer cálculos com precisão.

Já aplico estes conceitos já faz algum tempo e quando um colega me pergunta tento explicar da melhor forma, colocando a minha leitura em dia encontrei dois posts da Caelum que explicam muito bem estes pontos, posts que indicarei a leitura toda vez que um colega me perguntar sobre o assunto.



sexta-feira, 14 de maio de 2010

Sombreamento de Classe

Conforme meu post anterior fiquei com poucas alternativas para contornar o meu problema:
  • Mudar o HTTPService.resultFormat para e4x.
  • Setar HTTPService.xmlDecode.
  • Alterar a classe SimpleXMLDecoder no SDK e compilar.
  • Esperar o Flex Team alterar SimpleXMLDecoder.simpleType no SDK para poder sobreescrever este método e tratar os dados da forma mais adequada para minha aplicação.
As duas primeiras opções seriam trabalhosas porque teria que fazer o mesmo que a classe SimpleXMLDecoder faz, isto é, transformar o resultado em object e isto seria necessário para evitar um impacto maior na minha aplicação já que esta espera este tipo de retorno. A terceira é delicada porque todo novo SDK teria que aplicar minhas alterações, compilar e distribuir para a equipe. E a última opção é a mais demorada.

Aí me lembrei de um conceito não muito utilizado, o Sombreamento ou Shadowing que também se aplica para Java. O que faria neste caso, criaria na minha aplicação o pacote mx.rpc.xml e nele copiaria a classe SimpleXMLDecoder do SDK e na primeira linha do método simpleType(val:Object) colocaria return val; com isso não seria feito o cast deixando sempre como String o que para minha aplicação atende plenamente. O detalhe aqui é que todo HTTPService que eu usar irá utilizar esta classe do meu projeto e não a sua correspondente no SDK e toda vez que sair um novo SDK terei que aplicar as alterações o que com o uso do SVN fica fácil identificar o que foi alterado e também a equipe ao atualizar o projeto já veria esta classe e suas atualizações.

terça-feira, 2 de março de 2010

Organizando Favoritos

Estou organizando os meus favoritos no FireFox e como sempre sincronizei os meus favoritos de casa com o trabalho e vice-versa de uma forma braçal perguntei para os meus colegas se não conheciam um add-on que deixasse esse sincronismo mais automático, me recomendaram, então o Xmarks. Para usar ele é criada uma conta free onde é possível consultar seus favoritos pela internet ou em qualquer máquina com este addon através do sincronismo dos favoritos.

Percebi também que possuía muitos favoritos duplicados e "quebrados". Para facilitar o trabalho de identificar estes favoritos criei uma classe java a qual deixo disponível.

quarta-feira, 15 de julho de 2009

Getters and Setters

Para quem vem de Java vai ser mais fácil se familarizar com Flex / ActionScript.
Por exemplo, getters e setters tem o mesmo conceito mas tem uma diferença grande.

No Java um método getter ou setter é um método como qualquer outro método onde o nome se convencionou que seja: get/setAtributo, onde a primeira letra do nome do atributo fica maiúscula:
Ex.:
private String nome;

public String getNome() {
return this.nome;
}

public function setNome(String value) {
this.nome = value;
}
Enquanto, que no Flex temos métodos especiais get e set o que torna o código mais intuitivo pois podemos fazer referência direta a propriedade como se esta fosse pública. Ex.:
private var _nome:String;

public function get nome():String {
return this._nome;
}

public function set nome(value:String):void {
this._nome = value;
}
E via código podemos usar:
var nome:String = obj.nome; // em vez de obj.getNome();
obj.nome = "Fabio"; // em vez de obj.setNome("Fabio");

terça-feira, 14 de julho de 2009

Action Script 3 para Programadores Java

Achei um artigo interessante para quem está iniciando, principalmente para quem estiver vindo do Java.
Dá noções básicas sobre AS3. Muito bom.

O link é este: http://www.infoq.com/br/articles/actionscript-java

JPAUtil

Estou disponibilizando uma classe utilitária para o uso de JPA.

Tudo começa no método init onde deve ser passado como parâmetro o nome da Persistent Unit que será utilizada pelo restante da classe.

Ela pode ser baixada aqui.

quinta-feira, 23 de abril de 2009

Servlet Filter

Servlet Filters é um recurso do Java EE para interceptar uma requisição web antes do recurso final ser atingido, este recurso pode ser um servlet, um arquivo, entre outros.

Filtros são muito úteis quando precisamos configurar o ambiente para o recurso a ser atingido, como por exemplo, abrir e fechar a sessão do hibernate (openSessionInView), verificar se o usuário está logado ou se tem permissão de fazer a requisição, permitindo ou não acessar o recurso.

Para usar Servlet Filter é necessário:

1. Criar uma classe que será utilizada como filtro pela sua aplicação. Esta classe precisa implementar a interface javax.servlet.Filter. Ex.: public class MyFilter implements Filter

2. Declarar sua classe filtro no web.xml da sua aplicação. Ex.:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/restrito/*</url-pattern>
</filter-mapping>
3. Implementar os métodos init, destroy e doFilter da interface Filter.

É no método doFilter onde tudo acontece. Ex.:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Executado antes de ir para o servlet
JPAUtil.createEntityManager();
chain.doFilter(request, response);
// Executado após o servlet ser executado
JPAUtil.closeEntityManager();
}
Este método é executado toda vez que é realizada uma requisição a um recurso que se encaixa na
tag url-pattern configurada no web.xml.
Dependendo das validações realizadas você pode impedir que o recurso seja atingido, para isso é só não executar
chain.doFilter(request, response);
FilterChain chama o próximo recurso da sequência. Você pode ter mais de um filtro para o mesmo url-pattern ou um recurso chamando outro.

No web.xml você também pode espeficicar em quais situações o filtro deve ser aplicado, usando a tag <dispatcher>. Ex.:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
  • REQUEST: Quando o arquivo é acessado diretamente pelo navegador.
  • FORWARD: Quando o arquivo é acessado através de um forward de um servlet.
  • INCLUDE: Quando o arquivo é acessado através de um include do jsp (jsp:include).
  • ERROR: Quando o arquivo é um página de erro. Ex: <%@ page isErrorPage="true" %>

quinta-feira, 16 de abril de 2009

Bloco Static

No Java existe o bloco static:

static {
}

O bloco static é como se fosse um init, é o primeiro código que será executado quando se fizer referência a classe, com new ou acessando algum método static. Dentro do método estático só pode ser acessado atributos e métodos também estáticos.

No AS3, se tem algo parecido:

public class Classe {
metodoStatic();
trace("class criada");

public static function metodoStatic():void { }
}

AS3 permite incluir no corpo de uma classe não somente declarações de atributos mas também comandos que serão executados somente uma vez. É executado primeiro a declaração de atributos e depois os comandos encontrados no corpo da classe. E estes comandos como no Java só podem acessar atributos e métodos também estáticos.

sexta-feira, 10 de abril de 2009

JavaMagazine nº 67 - JavaFX

Li artigo na JavaMagazine atual nº 67 um artigo falando do JavaFX.
Sinceramente, acho a forma de codificação muito pouco intuitiva. Mesmo sendo integrada com o Java, o que é uma vantagem, acredito que a curva de aprendizado será muito grande.

Tem bastante o que evoluir ainda, na minha opinião, objetos de menu e grid ainda não existem na versão atual.

SilverLight, não me lembro de ver exemplos, mas tb é recente e já li alguns posts falando que uma aplicação feita no .Net Framework de versão anterior não roda direito na versão mais nova, o velho problema de compatibilidade com versões anteriores, o que é bem comum nos softwares na Microsoft.

O JavaFX tem a versão Mobile que está para sair, se evoluir bastante neste ponto poderá pegar um mercado promissor. O Flex neste ponto tem o Flash Light, mas até onde li só suportará o ActionScript 2 e não o 3, o que limitará os recursos disponíveis.

Nesta corrida, na minha opinião, o Flex ainda sai ganhando, por ter um código bem intuitivo, bem documentado, ótimos recursos visuais, bastante maduro (está na versão 3.3, enquanto os sesus concorretes recentemente forão lançados), mas é necessário que a Adobe fique de olho nos seus adversários.