sexta-feira, 22 de fevereiro de 2008

Queries hierarquicas no Oracle

Olá

O Oracle tem uma função muito interessante chamada connect by.
Com essa função você pode criar queries hierarquicas, muito útil para montar menus, principalmente os menus do tipo árvore (Tree view).

Sintaxe:

START WITH  CONNECT BY [NOCYCLE] 

ou
CONNECT BY [NOCYCLE]  START WITH 


Exemplo:
Eu tenho uma tabela com a seguinte estrutura:
create table TAB_TREE_VIEW(
COD_ITEM_TREE_VIEW NUMBER not null,
COD_ITEM_PAI_TREE_VIEW NUMBER,
DESCRICAO VARCHAR2(20),
URL VARCHAR2(100),
DATA_INCLUSAO DATE not null);

Nessa tabela existe um auto-relacionamento, para adicionar um registro o valor da coluna COD_ITEM_PAI_TREE_VIEW deve existir na coluna COD_ITEM_TREE_VIEW.

Abaixo os constraints da tabela, observe a foreign key:
alter table TAB_TREE_VIEW
add constraint PK_TAB_TREE_VIEW primary key (COD_ITEM_TREE_VIEW)
using index
...
alter table TAB_TREE_VIEW
add constraint FK_TAB_TREE_VIEW foreign key (COD_ITEM_TREE_VIEW)
references TAB_TREE_VIEW (COD_ITEM_TREE_VIEW) on delete cascade;


Depois de inserir alguns dados para testes, eu criei a seguinte consulta:
select cod_item_tree_view,
cod_item_pai_tree_view,
level,
descricao,
url,
data_inclusao
from tab_tree_view
start with cod_item_pai_tree_view is null
connect by prior cod_item_tree_view = cod_item_pai_tree_view
order by level


E ela me retornou:





















COD_ITEM_TREE_VIEWCOD_ITEM_PAI_TREE_VIEWLEVELDESCRICAOURLDATA_INCLUSAO
0
null
1
SITES FAVORITOShttp://www.furutani.eti.br21-Feb-08
13

null
1
IMPORTANTEShttp://www.furutani.eti.br21-Feb-08
1
0
2
BUSCADOREShttp://www.furutani.eti.br21-Feb-08
5
0
2
PORTAIShttp://www.furutani.eti.br21-Feb-08
15
13
2
GLOBOhttp://www.globo.com21-Feb-08
14
13
2
GOOGLEhttp://www.google.com.br21-Feb-08
9
0
2
BLOGShttp://www.furutani.eti.br/blog21-Feb-08
2
1
3
GOOGLEhttp://www.google.com.br21-Feb-08
7
5
3
TERRAhttp://www.terra.com.br21-Feb-08
11
9
3
TESTEhttp://www.TESTE.COM21-Feb-08
12
9
3
BLOGGERhttp://www.blogger.com21-Feb-08
10
9
3
MEUhttp://www.robertofurutani.com21-Feb-08
8
5
3
GLOBOhttp://www.globo.com21-Feb-08
6
5
3
UOLhttp://www.uol.com.br21-Feb-08
3
1
3
CADEhttp://www.CADE.com.br21-Feb-08
4
1
3
MSNhttp://www.MSN.com.br21-Feb-08


O que tem de diferente nessa query?

1. A coluna level - Isso é uma pseudo-coluna que indica qual o nível de hierarquia do registro;
2. A condição start with cod_item_pai_tree_view is null - Especifica a condição de inicio da hierarquia, nesse caso a hierarquica inicia-se com os registros onde cod_item_pai_tree_view é null;
3. A condição connect by prior cod_item_tree_view = cod_item_pai_tree_view - Especifica a condição de ligação entre pais e filhos. Nesse caso o cod_item_pai_tree_view indica de quem o registro é filho.

Abaixo descrevo as pseudo-colunas e operadores relacionados com connect by.


LEVEL - Retorna 1 se é raiz, 2 se é filho da raiz, 3 se é filho o filho da raiz, e assim por diante;
CONNECT_BY_ISLEAF - Retorna 1 se é a ponta da hierarquia, 0 caso contrário;
CONNECT_BY_ISCYCLE - Retorna 1 se o registro tem um filho que também é seu pai.
ORDER SIBLINGS BY - Ordena os filhos de um mesmo pai;
CONNECT_BY_ROOT - Retorna o valor da coluna do pai da linha;
SYS_CONNECT_BY_PATH - Retorna o caminho para a linha atual com o separador informado.

Mais informações acesse: Hierarchical Queries
http://www.psoug.org/reference/connectby.html

Até mais

quarta-feira, 20 de fevereiro de 2008

Conversão de arquivos por email!

Olá

O site KoolWire.com oferece serviço de conversão de arquivos por email e também pela web.

As conversões podem ser feitas:

  1. DOC para PDF: pdf@koolwire.com
  2. PDF para RTF: doc@koolwire.com
  3. MP3 para Wav: wav@koolwire.com
  4. Wav para Mp3: mp3@koolwire.com

O tamanho do arquivo enviado por email tem restrição de 10MB, já pela web o arquivo pode ser maior que 10MB.

Mais informações e conversão pela web acesse o site http://www.koolwire.com/

Até mais

segunda-feira, 18 de fevereiro de 2008

Claro Dados EDGE - Primeiras Impressões

Olá!

Acabei de ler o post "Tim Web – Primeiras Impressões" do vagnerpl no blog Assunto Aleatório e me deu vontade de falar um pouco do Claro Dados EDGE.
Eu contratei esse serviço faz pouco mais de 40 dias em uma revenda da Claro na cidade de Bastos.

Aquisição

Muito simples, fácil e rápido. Na época contratando um pacote de 500MB ganhava a placa ou modem usb grátis (eu optei pela placa GC86 da Sony), o primeiro mês grátis e os 5 próximos com 50% de desconto. O que me deixou descontente foi o primeiro mês gratis, não sei por que diabos não ganhei o mês inteiro, ou seja 30 dias, ganhei apenas 5 dias que são os dias contados da data de ativação até data de fechamento da fatura (calculado conforme a data de opção de vencimento da conta).

Ambiente de instalação

Como só uso windows foi fácil era só clicar em next, next, next e finish.

Performance

É razoável, segundo o site da Claro a velocidade fica entre 130 e 170 kbps (download) mas com o aplicativo que vem junto com a placa consegui observar picos de 115 kbps (download) e usando sites medidores de velocidade a média é de 60 kbps (download). É muito mais que uma conexão discada, mas nem se compara a velocidade da rede 3G descrita no blog da Bia Kunze.
O tempo para encontrar um site é demorado. Mas depois que encontra fica normal.
É suficiente para ver email, acompanhar cotação da bolsa, etc.
Tem seus momentos de instabilidade, as vezes pára de navegar, daí tem que desconectar e conectar novamente.

Pontos positivos

- Todas as citadas pelo vagnerpl, principalmente ficar longe da Telefonica.

Pontos negativos

- Ainda é caro (pelo que oferece em contrato).
- Tem limite de download.
- Instável, as vezes precisa desconectar e conectar de novo pra voltar a navegar.
- Mais instável ainda com o carro em movimento.
- As vezes conecta mas não navega.
- A placa é bloqueada, não dá pra pôr um chip da Tim Web nele.

Conclusão

A idéia é boa, mas o serviço ainda precisa melhorar, principalmente o atendimento que demora muito e nem sempre dá uma resposta precisa, e olha que eu ainda acho o atendimento da Claro melhor que o da Telefonica. Quando acabar o contrato de fidelidade vou cancelar se não melhorar.
Quem sabe com o 3G eu não mude de idéia.

Até mais

Mais cursos gratuitos

Olá

Para complementar o post anterior, na revista Veja (ed. 2048) dessa semana tem uma matéria sobre cursos online das melhores universidades do mundo. Em destaque os cursos da Universidade de Yale. A revista destaca a aula do professor Charles Bailyn sobre buracos negros que pode ser assistida clicando aqui.

Abaixo os links para sites das universidades com cursos:
Universidade de Yale
MIT
Berkeley
Stanford
Instituto de tecnologia de Paris

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.

quinta-feira, 14 de fevereiro de 2008

Utilizando o embelezador de código!

Olá!

Esse post é para que eu possa testar o Javascript code prettifier um script para deixa os posts com código fonte colorido.


/* Código Java */
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CadastrarServlet extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet {

private static final long serialVersionUID = -6487025300712807334L;

public CadastrarServlet() {
super();
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}

protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}

/**
* Processa a requisição, insere no banco e faz um select na tabela para
* recuperar os dados cadastrado anteriormente
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
private void doProcess(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String campo1 = request.getParameter("campo1");
String campo2 = request.getParameter("campo2");
String campo3 = request.getParameter("campo3");

Connection connection = null;
try {
// Carregando o JDBC Driver
String driverName = "com.mysql.jdbc.Driver";
Class.forName(driverName);
// Criando a conexão com o Banco de Dados

String url = "jdbc:mysql://localhost:3306/dados"; //
String username = "root";
String password = "123456";
connection = DriverManager.getConnection(url, username, password);

PreparedStatement ps = connection
.prepareStatement("INSERT INTO TAB_EXEMPLO(campo1, campo2, campo3) VALUES (?,?,?)");
ps.setString(1, campo1);
ps.setString(2, campo3);
ps.setString(3, campo2);

ps.execute();

ps.close();


request.getRequestDispatcher("/resultado.jsp").forward(request,
response);
}
}


// Java Script
function getCookieVal(offset){
var endstr = document.cookie.indexOf(";",offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape( document.cookie.substring(offset, endstr) );
}


-- PL SQL
DECLARE
number1 NUMBER(2);
number2 NUMBER(2) := 17;
text VARCHAR2(12) := 'Hello world';
text DATE := SYSDATE; -- current date and time
BEGIN
SELECT street_number
INTO number1
FROM address
WHERE name = 'Smith';
END;


Até mais!

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, 12 de fevereiro de 2008

Esses são os eleitores do nosso Brasilzão!!

Olá!!!



*Um sujeito comprou uma geladeira nova e pra se livrar da velha, colocou-a
em frente à casa com o aviso: "De graça. Se quiser, pode levar". *

*A geladeira ficou três dias, sem receber um olhar dos passantes. Ele
chegou à
conclusão que as pessoas não acreditavam na oferta. Parecia bom demais pra
ser verdade, e ele mudou o aviso: "Geladeira à venda por R$ 50,00". *

*No dia seguinte, ela tinha sido roubada!

Cuidado! Esse tipo de gente vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Olhando uma casa para alugar, meu irmão perguntou à corretora de imóveis
de que lado era o Norte, porque não queria que o sol o acordasse todas as
manhãs. *

*A corretora perguntou: "O sol nasce no norte?" Quando meu irmão explicou
que o
sol nasce no Leste (aliás, há um bom tempo isso acontece) ela disse: *

* "Eu não me mantenho atualizada a respeito desse tipo de coisa ".

Ela também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Antigamente, eu trabalhava em suporte técnico num centro de atendimento a
clientes em Manaus. Um dia, recebi um telefonema de um sujeito que perguntou
em que horário o centro de atendimento estava aberto. Eu disse a ele: "O
número que o senhor discou está disponível 24 horas por dia, 7 dias por
semana." Ele perguntou: "Pelo horário de Brasília ou pelo horário de
Manaus?" Pra acabar logo com o assunto, respondi: "Horário de Manaus."

Ele vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Meu colega e eu estávamos almoçando no restaurante self-service da
empresa, quando **ouvimos uma das assistentes administrativas falando *

*a respeito das **queimaduras de sol que ela havia tido, ao ir de carro ao
litoral. *

*Estava num conversível, por isso, "não pensou que ficaria queimada, pois o
*

*carro estava em movimento."

Ela também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Minha cunhada tem uma ferramenta salva-vidas no carro, projetada para
cortar o cinto de segurança, se ela ficar presa nele. *

*Ela guarda a ferramenta no porta-malas!

Minha cunhada também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Meus amigos e eu fomos comprar cerveja para uma festa e notamos que os
engradados tinham desconto de 10%. Como era uma festa grande, copramos 2
engradados. O caixa multiplicou 10% por 2 e nos deu um desconto de 20%.

Ele também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Saí com uma amiga e vimos uma mulher com um aro no nariz, atrelado a um
brinco, por meio de uma corrente. Minha amiga disse: *

*"Será que a corrente não dá um puxão a cada vez que ela vira a cabeça?"
Expliquei que o nariz e a orelha de uma pessoa permanecem à mesma
distância, independente da pessoa virar a cabeça ou não.

Minha amiga também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Eu não conseguia achar minhas malas na área de bagagens do aeroporto. Fui,
então, até o setor de bagagem extraviada e disse à mulher que minhas malas
não tinham aparecido. Ela sorriu e me disse para não me preocupar, porque
ela era uma profissional treinada e eu estava em boas mãos.
"Apenas me informe... o seu avião já chegou?"

Ela também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Esperando ser atendido numa pizzaria observei um homem pedindo uma pizza
para viagem. Ele estava sozinho e o pizzaiolo perguntou se ele preferia que
a pizza fosse cortada em 4 pedaços ou em 6. Ele pensou algum tempo, antes de
responder: "Corte em 4 pedaços; acho que não estou com fome suficiente para
comer 6 pedaços."

Isso mesmo, ele também vota!

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
*
*Agora, você sabe QUEM elege esses políticos. *
**

segunda-feira, 11 de fevereiro de 2008

Cálculo de tempo com Oracle PL/SQL

Olá

Vou postar um exemplo de código em PL/SQL para somar e subtrair segundos, minutos e horas de um campo date.
Espero que seja útil.

declare
horas_dia integer := 24;
minutos_hora integer := 60;
segundos_minuto integer := 60;

total_horas_dia integer;
total_minutos_dia integer;
total_segundos_dia integer;
atual date;
begin

total_horas_dia := horas_dia;
total_minutos_dia := minutos_hora * horas_dia;
total_segundos_dia := segundos_minuto * minutos_hora * horas_dia;

atual := sysdate;


dbms_output.put_line('Data atual...: ' || to_char(atual, 'dd/mon/yyyy hh24:mi:ss'));

-- Somando 15 horas a data corrente
dbms_output.put_line('+ 15 horas...: ' || to_char(atual + (15 / total_horas_dia), 'dd/mon/yyyy hh24:mi:ss'));

-- Subtraindo 15 horas a data corrente
dbms_output.put_line('- 15 horas...: ' || to_char(atual - (15 / total_horas_dia), 'dd/mon/yyyy hh24:mi:ss'));


-- Somando 15 minutos a data corrente
dbms_output.put_line('+ 30 minutos.: ' || to_char(atual + (15 / total_minutos_dia), 'dd/mon/yyyy hh24:mi:ss'));

-- Subtraindo 15 minutos a data corrente
dbms_output.put_line('- 30 minutos.: ' || to_char(atual - (15 / total_minutos_dia), 'dd/mon/yyyy hh24:mi:ss'));


-- Somando 20 segundos a data corrente
dbms_output.put_line('+ 20 segundos: ' || to_char(atual + (20 / total_segundos_dia), 'dd/mon/yyyy hh24:mi:ss'));

-- Subtraindo 20 segundos a data corrente
dbms_output.put_line('- 20 segundos: ' || to_char(atual - (20 / total_segundos_dia), 'dd/mon/yyyy hh24:mi:ss'));



A saída será parecida com essa:

Data atual...: 11/feb/2008 11:23:00
+ 15 horas...: 12/feb/2008 02:23:00
- 15 horas...: 10/feb/2008 20:23:00
+ 30 minutos.: 11/feb/2008 11:38:00
- 30 minutos.: 11/feb/2008 11:08:00
+ 20 segundos: 11/feb/2008 11:23:20
- 20 segundos: 11/feb/2008 11:22:40


Até mais

domingo, 10 de fevereiro de 2008

Oracle

Olá

Esse post é apenas para ressaltar dois ótimos post's que li na semana passada, os dois post que li foram sobre Oracle:

1. Índices no Oracle, escrito pelo Boaglio
2. Queries hierárquicas em Oracle, escrito pelo Ruben

Parabéns ao Fernando Boaglio e ao Ruben.

Até mais

sábado, 9 de fevereiro de 2008

Ele vai acabar!!!

Olá

Exatamente no dia 16 de fevereiro de 2008 à meia noite ele vai acabar, eu me refiro ao horário de verão. Neste dia devemos atrasar os relógios em uma hora.
Não tenho nada contra o horário de verão, ele ajuda e muito o sistema elétrico do Brasil no horário de pico das cidades (entre as 17 e 20 horas), o meu problema é a transição entre um horário e outro.
Aqui dicas para se adaptar (ou se desadaptar) ao horário de verão.
Afinal, qual é o problema de manter o horário de verão o ano inteiro?

Até mais

sexta-feira, 8 de fevereiro de 2008

Convertendo String para representação Unicode

Olá!


Eu estava brincando com o Netbeans 6 e percebi que ele converte automaticamente caracteres especiais como acentos e ç em representação unicode. Por exemplo: ã é convertido para \u00e3
é claro que no JFrame o que aparece é ã. Isso é muito útil para manter a compatibilidade com os sistemas de arquivos dos sistemas operacionais que muitas vezes não reconhecem esses caracteres e transformam em ? ou em caracteres totalmente estranhos, aconteceu comigo esses dias ao copiar um fonte java do unix para o windows simplismente Débitos virou Débitos. As vezes isso acontece ao gravar um arquivo texto/xml.
Codifiquei um programinha para converter String com caracteres especiais para sua representação unicode.

public class Teste {

/**
* @param args
*/
public static void main(String[] args) {
String original = "ATENÇÃO! Pedimos que troque o pão francês para pão sírio.";
StringBuilder output = new StringBuilder();

for (int idx = 0; idx < original.length(); idx++) {
char c = original.charAt(idx);

if (!Character.isWhitespace(c) && !Character.isDigit(c)
&& !(c >= 33 && c <= 125) ){
output.append("\\u" + charToHex(c));
} else {
output.append(c);
}
}
System.out.println(output.toString());
}

static public String charToHex(char c) {
// Returns hex String representation of char c
byte hi = (byte) (c >>> 8);
byte lo = (byte) (c & 0xff);
return byteToHex(hi) + byteToHex(lo);
}

static public String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] };
return new String(array);
}
}


Vale a pena dar uma lida nos links abaixo:

Byte Encodings and Strings
Unicode - Wikipedia
Entendendo Unicode e os Character Encodings

Espero que seja útil.

Até mais