Uncategorized

Java Junit – Principais assertivas Asserts

Recentemente realizei o curso de Testes unitários em JAVA: Domine JUnit, Mockito e TDD. Quem tiver interesse, recomendadíssimo:
https://www.udemy.com/testes-unitarios-em-java/

Continuar lendo

Anúncios
Padrão
Uncategorized

Php x Java? Mudanças na minha carreira

Não acredito em verdades absolutas, a seguir vou expressar minhas opiniões. Certamente você pode concordar, ou não, com meus pontos de vista. E claro, isso que torna uma discussão boa!

Após trabalhar por vários anos com php, acabei direcionando minha carreira para a área de análise de sistemas. Deixando de codificar e trabalhando unicamente com análise de sistemas, elaboração de especificações e modelagem de dados.

Mas o php me acompanhou durante essa fase. Mesmo não atuando profissionalmente, sempre mantive meus projetos particulares. E claro, com minha adorada linguagem de programação favorita, o PHP.

Sinceramente, acredito que um bom programador sabe que não é a linguagem de programação que define se um sistema será bom ou não. Além disso, existem prós e contras em cada uma das linguagens.

Eu e minha esposa adquirimos cidadania italiana e pretendemos nos mudar para a Europa. Tendo em vista que meu inglês precisa melhorar bastante, meu caminho óbvio foi direcionar minha carreira novamente para a codificação. E com isso, tive que optar por me especializar em alguma linguagem.

Salários de PHP x JAVA

Observando os sites de empregos europeus (usei bastante o reed.co.uk), monitorei por meses as vagas de PHP e JAVA. As vagas de PHP estavam em torno de 40 mil libras por ano, enquanto as de JAVA se mantinham em 60 mil libras por ano.

Essa realidade não é diferente no Brasil. Java paga melhor.

Certificações 

Se eu quiser me dar bem lá fora, provar que eu tenho domínio sobre alguma tecnologia vai me proporcionar maior facilidade para ser chamado em entrevistas. Sei que muitas pessoas defendem que certificações não ajudam, que conheceram bons programadores sem certificação, que já viram programadores certificados fracos na programação, blá, blá, blá…

A verdade é que concordo que a certificação não vai tornar alguém muito melhor tecnicamente. Entretanto para passar tem que estudar bastante, e todos os meus colegas que acompanhei, após a certificação, aprenderam bastante coisa. Além disso, sem dúvida facilita em momentos de recolocação profissional, como é o meu caso.

Para PHP temos as certificações Zend (Zend PHP Certification), que são de certa forma pouco conhecidas. Eu pelo menos não conhecia, não ouvi falar nos TDCs que participei, não apareceu como requisito em nenhuma vaga de emprego…

Em compensação no java as certificações são mantidas pela Oracle, e possuem ampla aceitação no mercado. Normalmente não são requisitos obrigatórios, mas algumas vezes aparecem nas sessões de “desejável”.

Sobre a linguagem

Quase tudo que dá para fazer em java para web, dá para fazer em php e vice e versa. Entretanto o java possuí padrões estruturais muito bem definidos e seguidos. É comum ver colegas em nível junior de programação seguindo os padrões sem nem mesmo perceber. Isso facilita muito o trabalho com grandes equipes.

Justamente por ser mais flexível, menos engessado em estruturas padronizadas, que o php é uma linguagem mais produtiva. O dobro mais rápido, por ponto de função:

PHP – 5h/PF com variação entre -1h e +7h
Java – 10h/PF com variação entre -3h e +4,5h

Fonte: cmmi produtividade das linguagens em pontos por funcao

Assim, para um projeto novo, com poucas pessoas na equipe, php parece ser uma boa opção. Mas quando se trata de um projeto grande, com uma equipe composta por vários programadores, a estruturação bem definida do java conta a favor.

Reforço que ambas tem pontos positivos e pontos negativos e daria assunto para séculos de discussões.

Frameworks e Comunidade

Ambas as linguagens possuem uma grande variedade de frameworks. Entretanto o java parece ter uma pulverização menor.

Nas descrições das vagas que olhei para programador php, cada uma pedia um framework diferente, com conhecimentos diferentes. Enquanto no java, uma boa parte das vagas pedia conhecimentos nos mesmos frameworks.

A comunidade do php, parece mais viva. Ela pergunta mais e responde mais. Por exemplo, ao acessar o stackoverflow e buscar por “gerar boleto php”, vão existir 14 perguntas, enquanto para java somente 1.

Conclusão

Se fosse para eu iniciar uma startup, talvez eu preferisse seguir com php.  Entretanto eu optei por java, pois, os números que eu enxerguei me mostraram que para mim, no meu momento de vida atual, era a melhor opção.

Padrão
Uncategorized

Atualizando servidor centos com git e bitbucket

Quem trabalha com php já deve ter enfrentado a dificuldade em atualizar arquivos via ftp. Sempre são muitos arquivos e o controle de qual arquivo foi envaido é difícil.

Utilizando o git, as coisas ficam mais fáceis. É possível configurar o repositório no bitbucket e realizar um “auto-deploy”.

Para começar é necessário configurar o git no servidor centos:

sudo yum install git
git --version
git config --global user.name "joaoverisssimoribeiro"
git config --global user.mail "joao-verissimo@hotmail.com"

Continuar lendo

Padrão
Uncategorized

Centos mysql problema daemon already running | Another MySQL daemon already running with the same unix socket

Hoje um dos meus servidores caiu. Ao tentar reiniciar o serviço de mysql estava apresentando a mensagem: “Another MySQL daemon already running with the same unix socket”.

A solução é mover o arquivo .sock do mysql e depois reiniciar normalmente.


# mv /var/lib/mysql/mysql.sock /var/lib/mysql/mysql.sock.bak

# service mysqld start

Padrão
Uncategorized

SQL para verificar períodos – Verificar período dentro de período em SQL

Para verificar períodos entre datas, o bet

if (this.filtro.isUsaDatas()) {
Date dateInicialSemHora = DateUtils.getDateSemHora(filtro.getDtInicio());
Date dataFinalUltimaHora = DateUtils.highDateTime(filtro.getDtFinal());
sql.appendFiltro(” and ( “);
sql.appendFiltro(” ( ? between dtprevista and dtPrevistaTermino ) “, dateInicialSemHora);
sql.appendFiltro(” OR ( dtprevista between ? and ? )”, dateInicialSemHora, dataFinalUltimaHora);
sql.appendFiltro(” ) “);
}

 

drop table esgptemp_joao;

create table esgptemp_joao (
cd decimal (2,0),
dataini date,
datafim date
);

delete from esgptemp_joao;
insert into esgptemp_joao values (1,TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (2,TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (3,TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’20/04/2014′, ‘dd/mm/yyyy’));

insert into esgptemp_joao values (4,TO_DATE(’20/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’21/04/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (5,TO_DATE(’21/04/2014′, ‘dd/mm/yyyy’), TO_DATE(’06/05/2014′, ‘dd/mm/yyyy’));
insert into esgptemp_joao values (6,TO_DATE(’09/05/2014′, ‘dd/mm/yyyy’), TO_DATE(’12/05/2014′, ‘dd/mm/yyyy’));

insert into esgptemp_joao values (7,TO_DATE(’12/06/2014′, ‘dd/mm/yyyy’), TO_DATE(’15/06/2014′, ‘dd/mm/yyyy’));

/*testa selecionar o primeiro periodo completo: espera registros 1*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’03/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 01/04/2014 e 08/04/2015: espera registros 1, 2*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 02/04/2014 e 09/04/2015: espera registros 1,2 */
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’02/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’02/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 09/04/2014 e 11/04/2015: espera nenhum registro*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’09/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’11/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’11/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 08/04/2014 e 12/04/2015: espera nenhum registro*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’08/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’12/04/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 24/04/2014 e 03/05/2015: espera registro 5*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’24/04/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’24/04/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’03/05/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’03/05/2014′, ‘dd/mm/yyyy’)));

/*testa selecionar um periodo entre 01/06/2014 e 30/06/2015: espera registro 7*/
select * from esgptemp_joao h where 1=1
and ((H.dataini >= TO_DATE(’01/06/2014′, ‘dd/mm/yyyy’) AND H.dataini TO_DATE(’01/06/2014′, ‘dd/mm/yyyy’) AND H.datafim <= TO_DATE(’30/06/2014′, ‘dd/mm/yyyy’)) OR
(H.dataini = TO_DATE(’30/06/2014′, ‘dd/mm/yyyy’)));

Padrão
Uncategorized

php Medindo o tempo e memória de execução de uma página | Melhorando o desempenho com o Serialize

Estou trabalhando em um projeto que irá exibir um select com todas as cidades do Brasil. É provável que a solução mais comum fosse usar um autocomplete. Porem neste caso o site possui foco em otimização de desempenho o que inviabilizaria as várias requisições ao servidor de um autocomplete.

Logo foi identificado também um gargalo, ao selecionar as mais de 5.000 cidades unidas por um left join ao seus respectivos estados, a página demorava para carregar.

O ponto de partida desse script foi “medir” o tempo e memória consumidas pela página. Para isso foi usado esse script de luders.com.br, com as adaptações o código ficou:


// Iniciamos o "contador"
list($usec, $sec) = explode(' ', microtime());
$script_start = (float) $sec + (float) $usec;

require_once ‘./lib/config.php’;

$cidades = dbCidade::listar(“”, “”);

// Terminamos o “contador” e exibimos
list($usec, $sec) = explode(‘ ‘, microtime());
$script_end = (float) $sec + (float) $usec;
$elapsed_time = round($script_end – $script_start, 5);
echo ‘Elapsed time: ‘, $elapsed_time, ‘ secs. Memory usage: ‘, round(((memory_get_peak_usage(true) / 1024) / 1024), 2), ‘Mb’;

O dbCidade::listar executa um select de todos os campos de cidade + campos de estado. O resultado foi:

Elapsed time: 3.92842 secs. Memory usage: 54.25Mb

Então editei a função dbCidade::listar para usar a função serialize. Utilizo duas funções arquivoCriar e arquivoLer que criam e leem arquivos no sistema.


class dbCidade extends dataTable {
public static function listar() {
//Tenta ler o cache
$retorno = arquivoLer("cache/dbCidadeAll.cache");
if ($retorno) {
return unserialize($retorno);
}

$sql = “SELECT cidade.*, estado.regiao AS estado_regiao…….;

$dados = dataExecSqlDireto($Conexao, $sql, true);
arquivoCriar(serialize($dados), “cache/dbCidadeAll.cache”);
return $dados ;
}
}

A classe e a função listar foram simplificadas para facilitar a leitura. O resultado foi:

Elapsed time: 0.18529 secs. Memory usage: 45Mb

Uma diferença de 3.8 segundos no carregamento. Cabe lembrar que a primeira execução irá demorar. Também deve-se cuidar com cache infinito: dependendo da base de dados pode-se preencher facilmente 40 gb com cache, em especial quando o google bot achar seu sitemap.

Padrão
Uncategorized

Centos Tarefa Cron para Verificar se myqsl/Mariadb está rodando

Hoje vou falar sobre uma coisa simples que fiz no linux, porem poupou bastante trabalho. Estamos usando um servidor na digital ocean. A instância é pequena, e o banco de dados um pouquinho grande.

Ocasionalmente, uma ou duas vezes por mês o banco de dados mysql “cai”. Então é necessário fazer via ssh e reiniciar o servidor. Usando do bash + crontab foi automatizada a verificação, se o mysql não estiver rodando o serviço é reiniciado.

Não sou especialista, por isso pode ser que alguém com mais bagagem possa contribuir. Dentro da pasta ~/executaveis, criei o arquivo checa_mysql.sh:


cd ~/executaveis/
nano checa_mysql.sh
chmod 775 checa_mysql.sh

O chmod altera as permissões para que esse arquivo possa ser executado. O conteúdo de checa_mysql.sh ficou:


if service mysqld status | grep -q 'dead\|stopped'
then service mysqld restart
else echo "mysqld ok"
fi

O comendo service mysqld status verifica se o mysql está rodando. Através do grep verificamos se o retorno do status possui dead ou stopped. Se possuir reinicia através de service mysqld restart, se não, imprime que mysql está ok.

Para adicionar ao cron, bastou:


crontab -e

E no arquivo do cron adicionar a linha:

00 * * * * ~/executaveis/checa_mysql.sh

Será executado todo dia de hora em hora (hora cheia), para salvar o arquivo do cron:


ESC, e digite :wq para salvar


Script cron para Mariadb

Aproveitando para complementar, estou usando em alguns servidores o mariadb. O processo é semelhante:

Arquivo sobe-maria.sh

#!/bin/bash

if systemctl is-active mariadb.service | grep -q ‘inactive\|failed’
then
service mariadb restart
echo “$(date) mariadb sobe” >> “sobe-maria.log”
else
echo “mariadb ok”
fi

E no crontab:

5 * * * * /var/www/sobe-maria.sh

Melhorando o script anterior, agora é gravado o log de execução do serviço. Também o crontab é executado a cada 5 minutos.

Padrão