quinta-feira, 3 de junho de 2010

GMP

Quantas vezes você procurou uma biblioteca em C que trate números grandes tipo 128 bits, etc ... Eu precisei disso quando tive que transformar da notação hexadecimal o valor resultante de uma função de hash (MD5) de 128 bits para a notação decimal. A Resposta é usar a biblioteca GMP (http://gmplib.org/). A biblioteca é muito fácil de usar para quem conhece o C pois usa as mesma nomeclatura das funções existentes. Me poupou um tempão ..

int main (int argc, char *agv[]) {
char szValorHexa [200+1];
char szValorDec [200+1];
mpq_t q;

mpq_init (q);

strcpy (szValorHexa, "0x3b274f94d03");

gmp_sscanf (szValorHexa, "%Qi", q);

gmp_sprintf (szValorDec, "%Qd", q);

mpq_clear(q);

printf (szValorDec);
}

sábado, 17 de abril de 2010

Mobile in motion

PessoALL,
Se lembram da época que meia dúzia de pessoas abriam uma empresa para criar um site na internet criando um produtinho para vender pela rede e tentar "dominar" o mundo. Parece que esta época está voltando, mas para uma outra área carente, aplicação mobile. Quantas aplicações mobile imaginamos que poderíamos vender como produto, quantas aplicações existem atualmente que sejam interessantes ?
Outra facilidade é o mercado que podemos atingir que gira em torno de 120 milhões, daqui a pouco os recém nascidos vão ganhar um celular ao acabar de sair de suas mães.
O grande desafio é ter uma aplicação que ao mesmo tempo rode em um número maior de tipos de terminais e utilize o máximo de recursos que a plataforma nos fornece. Por isso, as 3 grandes de telefonia em um evento na Espanha (Telefonica + TIM, Portugal Telecom e America Movil) estão se juntando para criar uma plataforma e canal de sitribuição que facilite a nossa vida, mas também combater principalmente a Apple (iPhone) e Android que comercializam milhões através de seus canais proprietários e não repassam nada para as operadoras (no meu ponto de vista as operadoras tinham que ganhar sobre a utilização da rede).
Existem várias forças nas operadoras e fabricantes de celular para primeiramente combater a Apple e sua Apple store criando várias aplicações para tentar diminuir o gap entre os celulares, não sei o que isso vai dar mas a briga é boa. Se eu fosse conselheiro na Apple o que falaria seria todos que tentaram dominar o mundo se deram mal, ou seja, provavelmente você será mais um.
Outra coisa importante é que cada vez os celulares vão ser barateados, principalmente por causa da pressão chinesa e cada vez estão mais rápidos em processamento e transmissão de dados.
Vamos nos ligar nas oportunidades pois isso acontece a cada 10 anos, que todos estejam preparados.

Segue uns vídeos/links interessantes

Vivo campus party
http://www.youtube.com/campusparty
http://www.youtube.com/watch?v=U8Sf2g26FEM
http://www.youtube.com/watch?v=f0kKn7NUv_g

Terminais
http://odia.terra.com.br/portal/digital/html/2010/4/vivo_lanca_celular_zte_com_tv_digital_por_r_199_75472.html
http://www.gizmodo.com.br/conteudo/htc-evo-4g-e-forte-candidato-ao-titulo-de-melhor-telefone-celular

Veja
"10% das empresas listadas no ranking global Fortune 2000 já lançaram aplicativos para smartphones, segundo a consultoria research2guidance. Esta empresa estima que o mercado de aplicativos móveis cresça 807% nos próximos quatro anos, passando de 1,411 bilhões de euros em 2010 para 11,496 bilhões de euros em 2013.

A pesquisa realizada pela Mowa avaliou que o setor com maior presença móvel é a indústria de Telecomunicações: 31,25% das empresas deste segmento possuem iniciativas nas três frentes avaliadas. Em seguida aparecem as áreas de Eletroeletrônicos (26,32%), Farmacêutica (10%), Indústria Digital (9%) e Automotiva (7,7%)."

terça-feira, 13 de abril de 2010

testes de performance mysql com engine=memory

PessoALL,
Estava testando o uso da persistência in memory do mysql e fiquei muito impressionado com os valores alcançados. Segue eles.
A única coisa ruim é que a mesma não guarda os dados, mas para isso estou colocando e uma base MyISam que é alimentada após a postagem de uma mensagem no apache activemq (em torno de 3.000 tps) por nó. E no reestart do mysql recoloco os dados na memória.


tempo de insert para 40 milhoes de linhas (procedure) - 9 min - 74.000 tps
tempo para 40 milhoes de consultas aleatorias pela PK - 21 min - 31.000 tps
tempo para 40 milhoes de atualizacoes - 17 min - 39.000 tps

Segue o sql
SET max_heap_table_size = 10000000000;
CREATE TABLE tb_sico (cd_ip_addr_v4 char(11)not null, cd_mdn char(12) not null, INDEX USING HASH (cd_ip_addr_v4), INDEX USING HASH (cd_mdn)) ENGINE = MEMORY;


drop procedure prc_popula_sico;
delimiter $$
create procedure prc_popula_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;

SELECT V_CONTADOR_MAXIMO-count(1)
into V_CONTADOR_MAXIMO
from tb_sico;

insert_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE insert_loop;
END IF;

insert into tb_sico values (V_CONTADOR,V_CONTADOR);

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'carga', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP insert_loop;
END
$$
delimiter ;



delimiter ;

drop procedure prc_verifica_sico;
delimiter $$
create procedure prc_verifica_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;
DECLARE V_RANDOM int DEFAULT 0;
DECLARE V_CD_IP_ADDR_V4 CHAR(11);
DECLARE V_COUNT int DEFAULT 0;

select_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE select_loop;
END IF;

SET V_RANDOM = TRUNCATE(RAND()*V_CONTADOR_MAXIMO, 0);
SET V_CD_IP_ADDR_V4 = V_RANDOM;

SELECT count(1)
into V_COUNT
from tb_sico
WHERE CD_IP_ADDR_V4 = V_CD_IP_ADDR_V4;

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'verifica', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP select_loop;
END
$$
delimiter ;



delimiter ;

drop procedure prc_atualiza_sico;
delimiter $$
create procedure prc_atualiza_sico()
BEGIN
DECLARE V_CONTADOR int DEFAULT 0;
DECLARE V_CONTADOR_BLOCO int DEFAULT 0;
DECLARE V_CONTADOR_MAXIMO int DEFAULT 40000000;
DECLARE V_RANDOM int DEFAULT 0;
DECLARE V_CD_IP_ADDR_V4 CHAR(11);
DECLARE V_CD_MDN CHAR(12);

update_loop: LOOP
IF ( V_CONTADOR > V_CONTADOR_MAXIMO ) THEN
LEAVE update_loop;
END IF;

SET V_RANDOM = TRUNCATE(RAND()*V_CONTADOR_MAXIMO, 0);
SET V_CD_IP_ADDR_V4 = V_RANDOM;
SET V_CD_MDN = V_RANDOM;

update tb_sico
set cd_mdn = V_CD_MDN
WHERE CD_IP_ADDR_V4 = V_CD_IP_ADDR_V4;

SET V_CONTADOR_BLOCO = V_CONTADOR_BLOCO + 1;
IF (V_CONTADOR_BLOCO >= 10000) THEN
SELECT 'atualiza', now();
SET V_CONTADOR_BLOCO = 0;
END IF;

SET V_CONTADOR = V_CONTADOR + 1;
END LOOP update_loop;
END
$$
delimiter ;

quarta-feira, 7 de abril de 2010

open ldap no Redhat AS 5

-------------
-- Berkley DB
cd /root/
wget http://download.oracle.com/berkeley-db/db-4.6.21.zip
unzip db-4.6.21.zip
cd db-4.6.21

cd build_unix/
./dist/configure
make
make install

cd /root
rm -rf /root/db-4.6.21

----------------
-- OPEN LDAP
wget ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.21.tgz
tar zxvf openldap-2.4.21.tgz
cd openldap-2.4.21
export CPPFLAGS="-I/usr/local/BerkeleyDB.4.6/include"
export LDFLAGS="-L/usr/local/BerkeleyDB.4.6/lib -R/usr/local/BerkeleyDB.4.6/lib"
export LD_LIBRARY_PATH="/usr/local/BerkeleyDB.4.6/lib:${LD_LIBRARY_PATH}"
./configure --with-whatever-your-options
make
make install

cd /root
rm -rf /root/openldap-2.4.21

----------------
-- CONFIG
vi /usr/local/etc/openldap/slapd.conf

----------------
-- start LDAP
su root -c /usr/local/libexec/slapd

sábado, 27 de fevereiro de 2010

Comunicação inter midlet

PessoALL,
uma coisa que tive que resolver a pouco tempo, foi como fazer comunicação entre dois midlets (rodando no mesmo celular), tentei usar TCP dava erro no tcp get bind info (necessita comunicação de dados com a operadora), ai descobri que a comunicação UDP não precisava do bind info, o que faz funcionar a comunicação entre eles funcionar corretamente (é o mais indicado para este tipo de cenário).
Mas como a maioria sabe a comunicação UDP tem limitação de tamanho do pacote (estava transmitindo um arquivo) e não há garantia dos pacotes serem recebidos na mesma ordem dos pacotes enviados, por isso criei um código que no início do pacote tem a quantidade de pacotes e o número do pacote. Com isso o cliente consegue remontar o arquivo corretamente.


Segue os códigos para J2ME



protected byte[] receiveUDP (DatagramConnection sc) throws IOException {
int posicao = 0;
int tamanho = 0;
byte qtid = 0;
byte id = 0;

byte [] result = null;
byte [] buffer = new byte [sc.getMaximumLength()];

Datagram dgram = sc.newDatagram(buffer, buffer.length);

do {
dgram.setLength(buffer.length);
sc.receive(dgram);

id = buffer[0];

if (qtid == 0) {
qtid = (byte)(buffer[1]-1);
result = new byte [buffer[1]*(sc.getMaximumLength()-2)];
} else {
--qtid;
}
posicao = id*(sc.getMaximumLength()-2);
for (int i = 2; i < dgram.getLength(); ++i) {
++tamanho;
result[posicao+i-2] = buffer[i];
}
} while (qtid > 0);

buffer = new byte[tamanho];
for (int i = 0; i < tamanho; ++i) {
buffer[i] = result [i];
}

return buffer;
}
===============================================================================
protected void sendUDP (DatagramConnection sc, byte [] bArquivo) throws IOException {
int posicao = 0;
int tamanho = 0;

byte [] buffer = new byte [sc.getMaximumLength()];
byte qtid = (byte) ((bArquivo.length-2)/sc.getMaximumLength());
if (((bArquivo.length-2) % sc.getMaximumLength()) > 0) {
++qtid;
}

for (byte id = 0; id < qtid; ++id) {
Datagram dgram = sc.newDatagram(buffer, buffer.length);
tamanho = 2;
buffer[0] = id;
buffer[1] = qtid;

if ((bArquivo.length-posicao) > (buffer.length-2)) {
tamanho = buffer.length;
} else {
tamanho = bArquivo.length-posicao+2;
}
dgram.setLength(tamanho);
for (int i = 0; i < (tamanho-2); ++i) {
buffer [i+2] = bArquivo [posicao];
++posicao;
}
sc.send(dgram);
}
}


segunda-feira, 22 de fevereiro de 2010

Bunda de Urso

PessoALL,
Pra quem não sabe bunda de urso era meu apelido na Losango, se quiser saber porque pergunte a eles.

Quebraram a forma ???

Não sei se estou certo ou errado, mas como está difícil arrumar pessoas com o perfil que a profissão de análise de sistemas requer. Somente encontro pessoas com a capacidade, comprometimento e perseverança após os 30 anos. Os recém formados não querem nada com a hora do Brasil (temos poucas exceções). Quando pedimos para ficar até tarde, botamos uma pressão ou colocamos uma responsabilidade mais pesada sempre o taco espirra.
Não sei se eles estão certos e eu errado, sei que sofro com isso e cada vez a carga fica mais pesada ao invés de leve. Eles querem ter uma vida, o pior que isso eu também concordo e desejo para mim também, mas precisamos dividir o peso.
O Engraçado é que na maioria das faculdades tem uma matéria com o intuito de incentivar uma alma empreendedora. Fomentando a capacidade de trazer para si a responsabilidade. Será que estão ensinando certo ???
Outra coisa também engraçada que é da natureza humana, é que quanto mais facilidades o profissional tem para realizar as suas tarefas, menos capacidade inventiva ele têm. Hoje as pessoas com super computadores em casa não tem a capacidade de compreendê-las e reinventá-las pois tem ferramenta para tudo. Na minha época de faculdade a gente fazia miséria com micros de 4.77Mhz. (Uma coisa boa que com a geração Linux um pouco de compreender o SO está voltando, pois algumas coisas tem que fazer na mão ao invés de monkeys instalations). Atualmente o pessoal programa em .NET sem compreender como funciona a parada por debaixo do pano ou não sabe sql pois sempre usaram Hibernate (quero ver hibernate com milhares de dados no select). Falta base.
Quando peço um bom profissional, a capacidade técnica faz parte da avaliação, mas não é a determinante e sim a garra e perseverança do sujeito.
O Pior que a falta de esse estilo de profissional, não está afetando somente a Informática. Vocês já viram quantos médicos de plantão são formados por ano em comparação aqueles que desejam ficar atendendo em consultórios ????
Muito dessa culpa é nossa por criar um oasis na nossa profissão, mas também das entidades de ensino que não reprovam, não capacitam tudo em prol de formar mais gente e receber no fim do mês. Algumas profissões as pessoas tem que gostar do que fazem, Informática é uma delas.

Eu sei que coloquei muitas idéias e nenhuma solução, pois não a vejo ainda, por enquanto vou ver se conserto a forma dos bons profissionais.