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

quarta-feira, 31 de dezembro de 2008

Mudanças nesse blog

Olá!


Primeiramente gostaria de desejar um Feliz ano novo!
Que em 2009 todos os sonhos se realizem, com muita saúde, paz e felicidade.


Gostaria de informar também que esse blog no Blogger vai ser desativado, eu vou passar a postar em apenas um blog, o endereço vai continuar www.furutani.com.br e vou migrar o conteúdo do outro blog para esse. Essa mudança é necessária pois vou usar um outro serviço de hosting de site.


Até mais,
Roberto

sábado, 11 de outubro de 2008

Novo site do Submarino usa Java

Olá

É impressão minha ou o Submarino está usando Java no seu site que até pouco tempo era em asp?

Analisando o HTTP header parece que sim:

http://www.submarino.com.br/menu/1061/administracao+e+negocios

GET /menu/1061/administracao+e+negocios HTTP/1.1
Host: www.submarino.com.br
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Referer: http://www.submarino.com.br/menu/1061/administracao+e+negocios
Cookie: SubmarinoPartnerId=PartnerId=102414; Track=CI%3D999848%20P%201%26Department%3DAdministra%E7%E3o%20e%20Neg%F3cios%3A1061%2CLivros%20Nacionais%3A1060%2CFerramentas%3A546%2C%26Search%3Dcamiseta%3A%21%21%5E%26Product%3D21365867%7C1%2C21313131%7C31%2C21393951%7C2; SequenceID=0=556089118OVF444199477; SubmarinoPPCat=SequenceID=556089118OVF444199477; SubmarinoP=Nick=; sbBeta=http://www.submarino.com.br/; JSESSIONID=7LyHLwwpnR02sZG2bVjbrpdHmM5TDyJT1WsknLbsrxT2znf92nFq!406043704; SubmarinoPCat=PartnerId=102414&CI=999848%20P%201&Nick=; SubmarinoS=CI=999848%20P%201&OrderIdDigipix=0&DigipixSessionId=&CustomerEmail=; .ASPXAUTH=

HTTP/1.x 200 OK
Server: Apache
X-Powered-By: Servlet/2.5 JSP/2.1
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 15850
Expires: Sat, 11 Oct 2008 18:53:58 GMT
Cache-Control: max-age=0, no-cache, no-store
Pragma: no-cache
Date: Sat, 11 Oct 2008 18:53:58 GMT
Vary: Accept-Encoding
Set-Cookie: sbBeta=http://www.submarino.com.br/; path=/; domain=.submarino.com.br
X-Cache: MISS from powerlinux.localhost.localdomain
X-Cache-Lookup: MISS from powerlinux.localhost.localdomain:3128
Via: 1.0 powerlinux.localhost.localdomain:3128 (squid/2.6.STABLE13)
Proxy-Connection: keep-alive
Algumas partes ainda estão em ASPX, como por exemplo o login e o carrinho.
Bom independente da tecnologia, o site ficou mais interessante de navegar e mais bonito. Parabéns pro pessoal que desenvolveu.

Até mais,

quinta-feira, 9 de outubro de 2008

Tartarugas feitas em Java!

Olá!

Se o papai e a mamãe dessa tartaruga a fizeram em Java não sei, mas que elas nasceram lá a reportagem deixa claro.

:)

sábado, 30 de agosto de 2008

Sites sobre SOA

Olá!

Fazem mais de 6 meses que entrei no mundo SOA, encarando uma pós-graduação no IBTA com ênfase nessa buzzword do momento todo sábado das 8:30h até as 17:00h. Posso dizer que estou muito satisfeito com o curso e com os professores do IBTA, alias esse curso é o melhor momento da semana toda, por incrível que pareça eu torço para que sábado chegue logo para ir estudar.
Não é nerdisse não, é por que é na pós que a gente aprende coisas novas, troca experiências e se atualiza em assuntos aleatórios. Por exemplo, eu não sabia quem era Donatella e Flora :)

Mas escrevi esse post para deixar 3 blogs de SOA escritos por brasileiros como dica para quem quer ficar atualizado nesse assunto. Lá vai.

  1. Aquele blog de SOA
  2. SOA Corporativa
  3. SOA, Simples Assim!
Até mais,
Roberto

* Eu não coloquei no título Blog sobre SOA, por que tem muito proxy por ai que barra acessos a URL com a palavra blog no meio, é sacanagem pois nem todo blog é de sacanagem.

terça-feira, 15 de julho de 2008

Comparativo de performance entre Java, C++, Ruby, PHP, Groovy e Python

Olá!

Hoje eu recebi um link muito interessante do Thiago Vespa na lista de emails da comunidade Java Noroeste, é um comparativo de desempenho entre várias linguagens.

Language Version Lines of Code Time per iteration (microseconds)
Java Sun JDK 1.6.0.03 101 1.6
C++ 4.1.3 20070929 (prerelease)
(Ubuntu 4.1.2-16ubuntu2)
Compiled with optimisation -O3
86 3
Ruby ruby 1.9.0 (2008-04-14 revision 16006) [i686-linux] 63 114 89
ruby 1.8.6 (2007-06-07 patchlevel 36) [i486-linux] 372 380
jruby : ruby 1.8.6 (2008-05-28 rev 6586) [i386-jruby1.1.2] 84 80
Python 2.5.1 41 225
Jython 2.2.1 on JRE 1.6.0.03 884
Groovy Groovy Version: 1.5.6 JVM: 1.6.0_03-b05 uncompiled 81 363
Compiled to bytecode and run using java 360
UpdateGroovy Version: 1.6-beta-1 JVM: 1.6.0_03 104
PHP PHP 5.2.3-1ubuntu6.3 (cli) 85 593

O mais legal é que essas comparações sempre geram muita polêmica, vide os comentários no link abaixo.

Leia na íntegra no link Performance Comparison - C++ / Java / Python / Ruby/ Jython / JRuby / Groovy

Até mais,

quarta-feira, 7 de maio de 2008

Oracle - PIPELINED Table Function

Olá!


Este é um pequeno artigo sobre o uso de um recurso do banco de dados Oracle que poucas pessoas conhecem, o nome desse recurso é PIPELINED Table Function ou simplesmente PIPELINED Function.
As ferramentas utilizadas nas implementações foram o Oracle SQL Developer e o Oracle 10g Express Edition rodam em Windows Vista.

Smartphone VoIP Livros de Java Apartamentos

###############
1. INTRODUÇÃO

Uma PIPELINED Table Function é uma função capaz de devolver várias linhas de resultados e são chamadas na cláusula FROM de uma instrução SELECT como se fosse uma tabela.
Nada melhor para aprender um novo recurso do que um exemplo bem simples.

O exemplo abaixo implementa um PIPELINED function que devolve a quantidade de linhas informada no parametro qtd_num.


CREATE OR REPLACE PACKAGE pac_fun_PIPELINED AS

type numeros IS TABLE OF NUMBER;

FUNCTION fun_gera_numeros(qtd_num number) RETURN numeros PIPELINED;

END pac_fun_PIPELINED;

CREATE OR REPLACE PACKAGE BODY pac_fun_PIPELINED AS

FUNCTION fun_gera_numeros(qtd_num NUMBER) RETURN numeros PIPELINED IS
BEGIN
FOR cont IN 1 .. qtd_num
LOOP
pipe ROW(cont * cont); -- Eleva ao quadrado
END LOOP;

RETURN;

END fun_gera_numeros;

END pac_fun_PIPELINED;


Para executar a function use a instrução SELECT abaixo:

SELECT * FROM TABLE(pac_fun_PIPELINED.fun_gera_numeros(9));


O resultado é exibido na figura abaixo.

Viu porque essa function pode ser chamada de "virtual table"?


Três itens nesse exemplo são caracteristicas de uma PIPELINED function:
1. A palavra-chave PIPELINED;
2. O comando PIPE ROW que joga o registro no result set;
3. E o comando RETURN; em "branco" apesar do tipo de retorno da function indicar numeros.

Geralmente os types e as functions são implementadas dentra de uma package, nada impede que você as crie fora. Só a titulo de curiosidade, quando uma package é solicitada, tudo o que foi implementada dentro dela sobe para a memória. Então, dependendo das suas necessidades não é interessante implementar uma package.

Apesar de ser permitido, no exemplo não foi indicado se o paramêtro da function é de entrada (IN) ou de saída (OUT).

A vantagem entre uma função PIPELINED e outra não PIPELINED é que a função PIPELINED processa os dados e joga os resultados imediatamente para o result set do SELECT, assim o chamador pode usar os dados mais rapidamente sem ter que esperar todo o processamento.
por outro lado a função que não é PIPELINED processa os dados e vai acumulando os resultados para depois devolver(usando a cláusula RETURN ou usando paramêtro de OUT) os resultados para chamador da função, só então ele poderá usar os dados.

###############
2. USANDO TIPOS DEFINIDOS

Agora será implementado um exemplo usando tipos definidos pelo programador.
Neste exemplo será criado uma function que calcula a tabuada de um número (num_tabuada).

create or replace
PACKAGE pac_fun_PIPELINED AS

type registro is record (
indice number,
multiplicador number,
resultado number
);

type tabuada IS TABLE OF registro;

FUNCTION fun_tabuada(num_tabuada number,
qtd_resultados number)
RETURN tabuada PIPELINED;

END pac_fun_PIPELINED;

create or replace
PACKAGE BODY pac_fun_PIPELINED AS

FUNCTION fun_tabuada(num_tabuada number,
qtd_resultados number)
RETURN tabuada PIPELINED IS
aux registro;
BEGIN

FOR cont IN 1 .. qtd_resultados
LOOP
aux.indice := cont;
aux.multiplicador := num_tabuada;
aux.resultado := cont * num_tabuada;
pipe ROW(aux);
END LOOP;

RETURN;

END fun_tabuada;

END pac_fun_PIPELINED;


Para calcular a tabuada do 7, a function será executada com o comando abaixo:
SELECT * FROM TABLE(pac_fun_PIPELINED.fun_tabuada(7, 10));

O resultado é exibido na figura abaixo.


#############################
3. USANDO JUNTO COM TABELAS DE VERDADE

Para este exemplo será necessário criar uma tabela, dois tipo, uma função e uma package

CREATE TABLE "CAD_PEDIDO_TABUADA"
( "NUM_TABUADA" NUMBER NOT NULL ENABLE,
"DATA_PEDIDO" DATE NOT NULL ENABLE,
"QTD_LINHAS" NUMBER,
"CODIGO" NUMBER,
CONSTRAINT "PK_CAD_PEDIDO_TABUADA" PRIMARY KEY ("CODIGO")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;

Inserindo dados na tabela.

INSERT INTO "CAD_PEDIDO_TABUADA" (NUM_TABUADA, DATA_PEDIDO, QTD_LINHAS, CODIGO) VALUES ('7', TO_DATE('05/05/08', 'DD/MM/RR'), '5', '2');
INSERT INTO "CAD_PEDIDO_TABUADA" (NUM_TABUADA, DATA_PEDIDO, QTD_LINHAS, CODIGO) VALUES ('2', TO_DATE('05/05/08', 'DD/MM/RR'), '11', '1');
Abaixo a package com tudo o que foi criado até agora para os exemplos.

CREATE OR REPLACE PACKAGE pac_fun_PIPELINED AS

-- Exemplo 1
type numeros IS TABLE OF NUMBER;

-- Exemplo 2
type registro IS record(indice NUMBER, multiplicador NUMBER, resultado NUMBER);
type tabuada IS TABLE OF registro;

-- Exemplo 3
type pedido_tabuada IS TABLE OF cad_pedido_tabuada % rowtype;
TYPE tab_refcursor IS REF CURSOR RETURN cad_pedido_tabuada%ROWTYPE;

----------------------------------------------------------
-- Exemplo 1
FUNCTION fun_gera_numeros(qtd_num IN NUMBER) RETURN numeros PIPELINED;

-- Exemplo 2
FUNCTION fun_tabuada(num_tabuada NUMBER, qtd_resultados NUMBER) RETURN tabuada PIPELINED;

-- Exemplo 3
FUNCTION fun_cad_tabuada(cursor_tabuada in tab_refcursor) RETURN tabuada PIPELINED;

END pac_fun_PIPELINED;

create or replace
PACKAGE BODY pac_fun_PIPELINED AS

FUNCTION fun_gera_numeros(qtd_num in NUMBER) RETURN numeros PIPELINED IS
BEGIN
FOR cont IN 1 .. qtd_num
LOOP
pipe ROW(cont * cont); -- Eleva ao quadrado
END LOOP;

RETURN;

END fun_gera_numeros;

FUNCTION fun_tabuada(num_tabuada number,
qtd_resultados number)
RETURN tabuada PIPELINED IS
aux registro;
BEGIN

FOR cont IN 1 .. qtd_resultados
LOOP
aux.indice := cont;
aux.multiplicador := num_tabuada;
aux.resultado := cont * num_tabuada;
pipe ROW(aux);
END LOOP;

RETURN;

END fun_tabuada;

FUNCTION fun_cad_tabuada(cursor_tabuada in tab_refcursor) RETURN tabuada PIPELINED IS
temp cad_pedido_tabuada%rowtype;
aux registro;
erro varchar2(500) := 'ERRO: ';
BEGIN

loop
fetch cursor_tabuada into temp;
exit when cursor_tabuada%notfound;

-- Calcula a tabuada até a quantidade de linhas cadastradas.
for contador IN 1..temp.qtd_linhas loop
aux.indice := contador;
aux.multiplicador := temp.NUM_TABUADA;
aux.resultado := contador * temp.NUM_TABUADA;

PIPE ROW (aux);
end loop;

end loop;

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(erro || sqlerrm);

END fun_cad_tabuada;

END pac_fun_PIPELINED;


Para executar a function use a instrução abaixo:
SELECT indice, multiplicador, resultado
FROM TABLE(pac_fun_PIPELINED.fun_cad_tabuada(
cursor(select NUM_TABUADA,DATA_PEDIDO,DATA_PROCESS,QTD_LINHAS,CODIGO
from CAD_PEDIDO_TABUADA
where codigo = 1)
))

O resultado é exibido na figura abaixo.

Não foi possível percorrer todos os registros da tabela cad_pedido_tabuada retirando a claúsula WHERE, o Oracle sempre processa o primeiro registro somente. Não descobri porque é assim e o motivo dessa limitação.
Não foi possível dar commit dentro da function, também não descobri por que razão a Oracle limitou o uso desse recurso.

###############
4. PARALLEL PIPELINED FUNCTIONS

As funções PIPELINED podem se tornar ainda mais poderosas, pois são paralelizáveis, com isso o processamento dos dados ficam mais rápidos.
Veja nesse link como funciona as PIPELINED and parallel functions.
Para utilizar os recursos de paralelização é preciso seguir algumas regras.
a) A função deve ser assinada com a palavra-chave PARALLEL_ENABLE;
b) A função tem de ser alimentada com um ref cursor.
Esse tópico é apenas para divulgação, até porque eu não possuo conhecimento sobre esse recurso do Oracle.
Para saber mais recomendo acessar o link: Parallel Table Functions.


###############
5. LINKS PARA SABER MAIS

http://www.codeguru.com/cpp/data/mfc_database/oracle/article.php/c4285/
http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dcitblfns.htm

http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm
http://download.oracle.com/docs/cd/B14117_01/appdev.101/b10800/dcitblfnxemp.htm

Até mais,

Carro novo
Blue-ray
Monitor
Notebooks
Playstation 3
Celular
Música

terça-feira, 6 de maio de 2008

Java na veia!

Olá!

Para quem não conheçe, está aí a foto da cachaça Java tirada por mim no museu da cachaça em Tupã/SP.




Neste museu é possível achar pérolas como a cachaça "Na Bunda".


E você já tomou "Na Bunda"?

Até mais,

domingo, 6 de abril de 2008

Design Patterns

Olá

Rodrigo Panachi irá apresentar no seu blog alguns dos design patterns mais usados. Ele começou com o Singleton.
Eu já fiz muito singletons, tinha até template para isso no Eclipse, mas depois de um probleminha de concorrência deixei ele de lado.

Até mais,

sexta-feira, 28 de março de 2008

Opa! Cadê o Sistema Operacional?

Olá

Abaixo um postpublicado por Guilherme Schäffer que achei interessante, e referencia-lo aqui no meu blog.

Ainda em 2007 a BEA anunciou o lançamento de uma versão do seu servidor de aplicação Weblogic e de sua JVM JRockit que dispensa o uso de sistema operacional, e roda diretamente sobre o hypervisor da VMware. Esta é uma iniciativa muito interessante, de boa visão, e que deve marcar o início de um novo ciclo na TI.

Leia na integra.



Até mais,

domingo, 17 de fevereiro de 2008

Mini cursos virtuais da Unicamp

Olá


A Unicamp oferece alguns mini cursos virtuais básicos (bem básicos) no endereço http://www.ead.unicamp.br/minicurso/

  1. CSS - Cascading Style Sheets
  2. Busca na Web
  3. CVS - Concurrent Version System
  4. Conceitos Básicos sobre Videoconferência
  5. Criação de homepage com o Netscape Composer
  6. HTML Ilustrado - Hypertext Mark-up Language
  7. Gravando com Webcam
  8. Editando imagens com Irfanview
  9. Tecnologia XML
Se você estiver interessado em estudar bio-engenharia, algebra linear ou mesmo Java pode acessar o site do projeto MIT OpenCourseWare onde são oferecidos mais de 1800 cursos em diversas áreas.

quarta-feira, 13 de fevereiro de 2008

Servidor HTTP light no Java 6?

Olá

Um recurso interessante que o Java 6 possuí e eu não sabia até ler este blog é um HTTP Server light.

Fonte: Servidor HTTP light e descomplicado no Java 6

Até mais

terça-feira, 22 de janeiro de 2008

Chegou o certificado!!!

Olá!



Depois de mais de um mês esperando o certificado de SCBCD, finalmente ele chegou. Ele é um pouco diferente dos certificados de SCJP e SCWCD que recebi em 2004 e 2005 respectivamente no que se refere as cores usadas no layout do cartão, broche e do certificado. Usaram um tom de verde musgo com um azul petróleo. Eu achava o modelo antigo mais bonito, que era azul e amarelo.



Eu publiquei como foi a prova e o score da prova no outro site, acessem clicando aqui.

Obrigado e boa noite!