Blog

  • Otimização de Sites: uma questão de padrões e usabilidade

    As principais funções dos sites de busca são: localizar, indexar, classificar conteúdo e disponibilizar um mecanismo de busca para que seus usuários sejam capazes de localizar informações específicas dentro do seu banco de dados.

    Um dos indiscutíveis benefícios que se obtém com a Otimização de Sites (ou Search Engine Optimization – SEO) é que, cada vez mais, as melhores práticas de SEO cruzam-se com as recomendações da World Wide Web Consortium (W3C), organização internacional que define os padrões e regras do HTML, “linguagem” utilizada para a criação de páginas web. A esse conjunto de normas e definições, do que fazer e como fazer, se dá o nome de Web Standards ou “padrões web”.

    Ao seguir os Web Standards, você facilita a vida dos robôs dos sites de busca. Objetivam o desenvolvimento de um site de forma correta, possibilitando que seu conteúdo fique acessível a diversas pessoas, independente de suas necessidades ou equipamentos utilizados para ter acesso à ele.

    Entre os benefícios de construir um site seguindo os Web Standards, estão velocidade – para carregar as páginas -, compatibilidade com todos navegadores (browsers) e, o principal, pode melhorar seu posicionamento nos sites de busca. Sites que atendem aos Web Standards tendem a ter um melhor posicionamento nos sites de busca, por apresentarem estrutura propícia a um fácil e eficaz indexamento, além deste aspecto ser cada vez mais valorizado pelos sites de busca, como o Google.

    Não há problema em se dizer o contrário, que um dos benefícios de seguir os Web Standards é que você acaba otimizando, no mínimo parcialmente, o seu web site. Porém, é preciso deixar claro que, um site que segue 100% os Web Standards, pode ficar muito mal posicionado, enquanto que um site 100% otimizado é bem provável que fique muito bem posicionado, mesmo sem seguir boa parte dos padrões web.

    Mas… por que? Porque ter o site indexado por um site de busca é importante, mas o fundamental é ser encontrado por seus usuários, e você precisa fazer os usuários acharem seu site pelo conteúdo que seu site apresenta. Criar um bom conteúdo, construir páginas relevantes, facilitar o caminho que leva o internauta à compra, entender seu comportamento, saber quem visita suas páginas, que horas e por que escolhe o seu produto, e tantos outros fatores importantes, você não obtém simplesmente fazendo um site nos padrões web, e sim com uma competente consultoria de SEO.

    Já foi a época em que otimizar um site para os buscadores era simplesmente apresentar um relatório 100% técnico. Em geral, o posicionamento de um site é influenciado e definido pelos seguintes aspectos:

    • Quantidade e qualidade do conteúdo
    • Popularidade (número de páginas que linkam para uma página)
    • Arquitetura de navegabilidade (estrutura dos links internos)
    • Meta informações
    • Layout e programação

    Mas veja que todos aspectos estão intimamente ligados com os padrões web. Porque tudo, no final das contas, vai virar código HTML. E se ficar mal escrito, ou escrito sem qualquer preocupação com suas normas, é bom contar com uma excepcional popularidade, que realmente é um critério muito forte, onde as vezes resolve sozinho muitos problemas de posicionamento.

    Você pode até aprender a construir web sites seguindo os Web Standards e sem saber nada de otimização, porém se você quiser construir um site otimizado, terá que conhecer bem os padrões web.

    Você deve estar se perguntando: afinal, devo ou não devo refazer meu site seguindo os Web Standards? a resposta é: depende. Depende do porte do seu site, do tempo e custo que isto vai lhe gerar, do objetivo que você quer atingir, dos problemas que seu site apresenta hoje, da sua concorrência no posicionamento nos resultados de busca, enfim, de todos fatores envolvidos no contexto da comunicação digital que sua empresa possui.

  • Backup Recover Full

    Caros usuários, saudações! Nesse artigo iremos abordar uma recuperação
    full do banco de dados. Para isso, utilizaremos o RMAN no procedimento
    de backup e restore.

    É INADMISSÌVEL a um profissional Oracle desconhecer
    essa ferramenta. Se você desconhece, minha sugestão é que
    você procure obter informações a respeito
    do funcionamento dela.

    É possível acessá-la de duas maneiras:

    . Com
    catálogo
    . Sem catálogo

    Esse artigo se restringe ao acesso SEM USO DO CATÁLOGO,
    mas, sempre que possível, faça uso do catálogo
    ro RMAN. Para isso é necessário que, em outra máquina
    você possua um banco de dados para armazenar o catalogo.
    O colunista Rodrigo Almeida está disponibilizando um
    excelente material sobre o catálogo do RMAN.

    Mãos a obra…

    Preparação do Ambiente

    A primeira coisa a fazer, é confirmar a utilização
    do banco de dados no modo archivelog. Para isso, utilizando o
    SQLPLUS, siga conforme abaixo:

    C:\>sqlplus /nolog

    SQL*Plus: Release 10.2.0.1.0 – Production on Mon
    Dec 25 20:01:03 2006

    Copyright (c) 1982, 2005,
    Oracle.  All rights
    reserved.

    SQL> conn / as sysdba
    Connected.
    SQL> archive log list;
    Database log mode              Archive
    Mode
    Automatic archival             Enabled
    Archive destination            C:\oracle\archive
    Oldest online log sequence     1
    Next log sequence to archive   3
    Current log sequence           3
    SQL>

    Caso não esteja, é necessário ativá-lo,
    para isso, consulte o artigo publicado anteriormente.

    De forma a melhor mostrar a utilização da restauração
    do banco de dados, iremos criar uma tabela com a seguinte estrutura:

    SQL> desc estudo.insert_time;
     Name                               Null?    Type
     ———————————- ——–
    —-
     DATA_INSERCAO                      NOT
    NULL DATE

    SQL> select count(1) from estudo.insert_time

      COUNT(1)
    ———-
             0

    1 row selected.

    Essa tabela será utilizada para a geração
    de registros a cada minuto, de forma a melhor exemplificar o recover
    database until time
    .

    Iremos utilizar o script abaixo para fazer a inserção
    do registro no banco de dados.

    insert_time.sql
    insert into estudo.insert_time(data_insercao)
    values (sysdate);
    commit;
    exit;

    O script abaixo, é apenas uma forma de facilitar a chamada
    para a inserção dos registros.

    script_insert.bat
    sqlplus "/ as sysdba" @c:\imasters\insert_time.sql

    É preciso fazer um backup full de um momento anterior
    ao do provável problema.

    Ex: Você precisa voltar o banco de dados da empresa para
    o estado em que ele se encontrava no dia 21/12/2006 às
    08:00. Imaginando que seus backups são realizados todos
    os dias às 19:00, significa dizer que é necessário
    voltar o backup que foi disparado no dia 20/12/2006 às
    19:00 e aplicar os archivelogs até o dia 21/12/2006 às
    08:00.

    Nesse momento, iremos precisar do RMAN para realizar o backup.

    Para acessar o utilitário, através da console,
    execute:

    C:\>rman target /

    Recovery Manager: Release 10.2.0.1.0 – Production
    on Mon Dec 25 19:55:07 2006

    Copyright (c) 1982, 2005,
    Oracle.  All rights
    reserved.

    connected to target database: ORCL (DBID=1125663715)

    RMAN>

    O comando SHOW ALL, revela informações
    interessantes.

    RMAN> show all;

    RMAN configuration parameters are:
    CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
    CONFIGURE BACKUP OPTIMIZATION OFF; # default
    CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
    CONFIGURE CONTROLFILE AUTOBACKUP OFF;
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘%F’;
    CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO
    BACKUPSET; # default
    CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO
    1; # default
    CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK
    TO 1; # default
    CONFIGURE MAXSETSIZE TO UNLIMITED; # default
    CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
    CONFIGURE ENCRYPTION ALGORITHM ‘AES128’; # default
    CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
    CONFIGURE SNAPSHOT CONTROLFILE NAME TO     ‘C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\SNCFORCL.ORA’;
    # default

    RMAN>

    Existem alguns pontos a serem observados na configuração
    do RMAN. É de muita importância o backup do controlfle
    e do spfile. Para isso você deve configurar o autobackup
    do controlfile.

    RMAN> CONFIGURE CONTROLFILE
    AUTOBACKUP ON;

    old RMAN configuration parameters:
    CONFIGURE CONTROLFILE AUTOBACKUP OFF;
    new RMAN configuration parameters:
    CONFIGURE CONTROLFILE AUTOBACKUP ON;
    new RMAN configuration parameters are successfully
    stored

    RMAN>

    Isso automatiza o backup do controlfile, é recomendado
    que esteja ON.

    Outra configuração importante é a localização
    do backup do controlfile. Para isso configure a localização
    do backup do controlfile.

    RMAN> CONFIGURE CONTROLFILE
    AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘C:\BACKUP
    \%F’;

    old RMAN configuration parameters:
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE
    TYPE DISK TO ‘%F’;
    new RMAN configuration parameters:
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE
    TYPE DISK TO ‘C:\BACKUP\%F’;
    new RMAN configuration parameters are successfully
    stored

    Conforme a configuração realizada no RMAN, o backup
    do arquivo de controlfile é composto por quatro informações:

    C – Significa que o arquivo armazena o backup do controlfile
    e spfile

    9999999999 –  É o DBID da instância,
    muito utilizado quando é preciso recuperar o spfile.

    YYYYMMDD – Ano,
    mês e dia de geração
    do arquivo.

    99 – Seqüência de geração
    do arquivo, inicia em 00. A seqüência é zerada
    a cada dia.

    Confirmando as modificações no RMAN.

    RMAN> SHOW ALL;

    RMAN configuration parameters are:
    CONFIGURE RETENTION POLICY TO REDUNDANCY 1; #
    default
    CONFIGURE BACKUP OPTIMIZATION OFF; # default
    CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
    CONFIGURE CONTROLFILE AUTOBACKUP ON;
    CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE
    TYPE DISK TO ‘C:\BACKUP\%F’;
    CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE
    TO BACKUPSET; # default
    CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE
    DISK TO 1; # default
    CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE
    DISK TO 1; # default
    CONFIGURE MAXSETSIZE TO UNLIMITED; # default
    CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
    CONFIGURE ENCRYPTION ALGORITHM ‘AES128’; # default
    CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
    CONFIGURE SNAPSHOT CONTROLFILE NAME TO ‘C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\S
    NCFORCL.ORA’; # default

    Realizando o backup full

    RUN {
      ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
      ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
      BACKUP AS COMPRESSED BACKUPSET
        DATABASE TAG ‘DB_LEVEL0_WHOLE’
        FORMAT ‘c:\backup\%d_%I_level0_%s_%p_%u.bkp’
        PLUS ARCHIVELOG TAG ‘ARCHIVEDLOGS’
        FORMAT ‘c:\backup\%d_%I_arch_%s_%p_%u.bkp’;
      RELEASE CHANNEL c1;
      RELEASE CHANNEL c2;
    }

    No exemplo acima, são utilizados dois canais C1 e C2.
    Percebam que, dependendo das características do hardware
    pode ser utilizado um número maior de canais, mas isso
    deve ser avaliado com cuidado para não gerar uma carga
    excessiva no ambiente.

    Após alocar os canais, foi utilizado o comando para a
    realização do backup, perceba também a utilização
    do comando COMPRESSED, é de se imaginar que esse comando
    irá compactar o backup. Isso irá gerar uma carga
    a mais no momento da recuperação, uma vez que será necessário
    descompactar o backup.

    Ao backup dos datafiles foi data uma TAG DB_LEVEL0_WHOLE, essa é uma
    forma de localizar o backup utilizando comandos do RMAN. A cláusula
    format determina onde os backups dos datafiles devem ser armazenados.

    O comando PLUS ARCHIVELOG executa o switch logfile de forma
    automática ao final do backup, e dessa forma armazenar
    os archives gerados após o início do backup.

    Perceba uma ligeira diferença na cláusula format
    dos archivelogs, isso foi feito de forma a facilitar a identificação
    do tipo de arquivo armazenado.

    allocated channel: c1
    channel c1: sid=141 devtype=DISK

    allocated channel: c2
    channel c2: sid=140 devtype=DISK

    Starting backup at 25-DEC-06
    current log archived
    channel c1: starting compressed archive log backupset
    channel c1: specifying archive log(s) in backup
    set
    input archive log thread=1 sequence=1 recid=6
    stamp=610047133
    input archive log thread=1 sequence=2 recid=7
    stamp=610047422
    input archive log thread=1 sequence=3 recid=8
    stamp=610047490
    input archive log thread=1 sequence=4 recid=9
    stamp=610111910
    channel c1: starting piece 1 at 25-DEC-06
    channel c2: starting compressed archive log backupset
    channel c2: specifying archive log(s) in backup
    set
    input archive log thread=1 sequence=9 recid=1
    stamp=609959261
    input archive log thread=1 sequence=10 recid=2
    stamp=609960115
    input archive log thread=1 sequence=11 recid=3
    stamp=609960185

    Foi criada uma tarefa no windows de forma a executar o arquivo script_insert.bat a
    cada minuto, durante 1 hora. Isso irá gerar 60 registros
    na tabela INSERT_TIME.

    SQL> select count(1)
    from estudo.insert_time

      COUNT(1)
    ———-
            60

    1 row selected.

    Agora que estamos com o ambiente preparado, vamos iniciar o
    processo de recuperação.

    A primeira coisa a fazer é restaurar o controlfile do último
    backup full, ou seja, o que foi realizado algumas linhas acima.

    C:\>cd \backup

    C:\backup>dir
     Volume in drive C has no label.
     Volume Serial Number is D4CF-5E81

    Directory of C:\backup

    25/12/2006  20:55    <DIR>          .
    25/12/2006  20:55    <DIR>          ..
    24/12/2006  17:38         7.143.424
    C-1125663715-20061224-00

    25/12/2006  11:32         7.143.424
    C-1125663715-20061225-00

    25/12/2006  20:55         7.143.424
    C-1125663715-20061225-01

    24/12/2006  17:37         2.748.928
    ORCL_1125663715_ARCH_15_1_0FI5P5DV.BKP
    24/12/2006  17:37         2.514.944
    ORCL_1125663715_ARCH_16_1_0GI5P5DV.BKP
    24/12/2006  17:37         1.861.120
    ORCL_1125663715_ARCH_17_1_0HI5P5E2.BKP
    24/12/2006  17:38            12.800
    ORCL_1125663715_ARCH_20_1_0KI5P5G2.BKP
    25/12/2006  11:12         4.742.144
    ORCL_1125663715_ARCH_22_1_0MI5R386.BKP
    25/12/2006  11:12         4.579.840
    ORCL_1125663715_ARCH_23_1_0NI5R386.BKP
    25/12/2006  11:12           143.872
    ORCL_1125663715_ARCH_24_1_0OI5R38B.BKP
    25/12/2006  20:54         4.742.144
    ORCL_1125663715_ARCH_24_1_0OI5S5B8.BKP
    25/12/2006  20:54         4.579.840
    ORCL_1125663715_ARCH_25_1_0PI5S5B8.BKP
    25/12/2006  20:54         1.681.920
    ORCL_1125663715_ARCH_26_1_0QI5S5C3.BKP
    25/12/2006  11:13             7.680
    ORCL_1125663715_ARCH_27_1_0RI5R3AB.BKP
    25/12/2006  20:55            79.360
    ORCL_1125663715_ARCH_29_1_0TI5S5E3.BKP
    24/12/2006  17:38        86.245.376
    ORCL_1125663715_LEVEL0_18_1_0II5P5E5.BKP
    24/12/2006  17:38        38.780.928
    ORCL_1125663715_LEVEL0_19_1_0JI5P5E6.BKP
    25/12/2006  11:13        86.269.952
    ORCL_1125663715_LEVEL0_25_1_0PI5R38E.BKP
    25/12/2006  11:13        39.034.880
    ORCL_1125663715_LEVEL0_26_1_0QI5R38E.BKP
    25/12/2006  20:55        86.253.568
    ORCL_1125663715_LEVEL0_27_1_0RI5S5C6.BKP
    25/12/2006  20:55        38.912.000
    ORCL_1125663715_LEVEL0_28_1_0SI5S5C6.BKP
                  21
    File(s)    424.621.568 bytes
                   2
    Dir(s)  11.710.783.488 bytes free

    Fazendo o Restore do Controlfile

    O controlfile possui principalmente informações
    referentes ao caminho dos datafiles, além de outras informações
    necessárias a recuperação. A primeira coisa
    a fazer é realizar o shutdown do banco
    de dados:

    C:\>rman target /

    Recovery Manager: Release 10.2.0.1.0 – Production
    on Tue Dec 26 19:06:02 2006

    Copyright (c) 1982, 2005,
    Oracle.  All rights
    reserved.

    connected to target database: ORCL (DBID=1125663715)

    RMAN> shutdown immediate;

    using target database control file instead of
    recovery catalog
    database closed
    database dismounted
    Oracle instance shut down

    RMAN>

    Em seguida, inicie o banco no modo nomount:

    RMAN> startup nomount;

    connected to target database (not started)
    Oracle instance started

    Total System Global Area     293601280
    bytes

    Fixed Size                     1248624
    bytes
    Variable Size                 79692432
    bytes
    Database Buffers             209715200
    bytes
    Redo Buffers                   2945024
    bytes

    RMAN>

    Execute a recuperação do controlfile:

    RMAN> restore controlfile
    from ‘c:\Backup\C-1125663715-20061224-00’;

    Starting restore at 26-DEC-06
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=157 devtype=DISK

    channel ORA_DISK_1: restoring control file
    channel ORA_DISK_1: restore complete, elapsed
    time: 00:00:03
    output filename=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL
    Finished restore at 26-DEC-06

    RMAN>

    Vale lembrar que, o controlfile recuperado deve ter sido gerado
    em um backup anterior ao problema. Quanto mais distante do momento
    que se deseja recuperar o banco de dados, mais arquivos de logs
    precisaram ser aplicados.

    Agora vamos iniciar o banco no modo mount:

    RMAN> startup force
    mount;

    Oracle instance started
    database mounted

    Total System Global Area     293601280
    bytes

    Fixed Size                     1248624
    bytes
    Variable Size                 79692432
    bytes
    Database Buffers             209715200
    bytes
    Redo Buffers                   2945024
    bytes

    RMAN>

    Ainda no RMAN, vamos recuperar o banco de dados até o
    seu estado no dia 24/12/2006 às 18:30:00.

    run
    {
      ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
      ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
      set until time "TO_DATE(’24-12-2006
    18:30:00′,’DD-MM-YYYY HH24:MI:SS’)";
      RESTORE DATABASE;
      RELEASE CHANNEL c1;
      RELEASE CHANNEL c2;
    }

    allocated channel: c1
    channel c1: sid=156 devtype=DISK

    allocated channel: c2
    channel c2: sid=155 devtype=DISK

    executing command: SET until clause

    Starting restore at 26-DEC-06

    channel c1: starting datafile backupset restore
    channel c1: specifying datafile(s) to restore
    from backup set
    restoring datafile 00002 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
    restoring datafile 00003 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
    restoring datafile 00005 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
    channel c1: reading from backup piece C:\BACKUP\ORCL_1125663715_LEVEL0_19_1_0JI5
    P5E6.BKP
    channel c2: starting datafile backupset restore
    channel c2: specifying datafile(s) to restore from
    backup set
    restoring datafile 00001 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
    restoring datafile 00004 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
    restoring datafile 00006 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_ESTUDO_01.
    DBF
    channel c2: reading from backup piece C:\BACKUP\ORCL_1125663715_LEVEL0_18_1_0II5
    P5E5.BKP
    channel c1: restored backup piece 1
    piece handle=C:\BACKUP\ORCL_1125663715_LEVEL0_19_1_0JI5P5E6.BKP
    tag=DB_LEVEL0_WH
    OLE
    channel c1: restore complete, elapsed time: 00:00:49
    channel c2: restored backup piece 1
    piece handle=C:\BACKUP\ORCL_1125663715_LEVEL0_18_1_0II5P5E5.BKP
    tag=DB_LEVEL0_WH
    OLE
    channel c2: restore complete, elapsed time: 00:01:04
    Finished restore at 26-DEC-06

    released channel: c1

    released channel: c2

    RMAN>

    Restauramos os datafiles
    e agora iremos fazer o recover, que nada mais é do que a aplicação
    dos archivelog

    RMAN> RECOVER DATABASE until time "TO_DATE(’24-12-2006
    18:30:00′,’DD-MM-YYYY HH24:MI:SS’)";

    Starting recover at 26-DEC-06
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK

    starting media recovery

    archive log thread 1 sequence 3 is already on
    disk as file C:\ORACLE\ARCHIVE\ARC
    00003_0609963499.001
    archive log filename=C:\ORACLE\ARCHIVE\ARC00003_0609963499.001
    thread=1 sequence
    =3
    archive log filename=C:\ORACLE\ARCHIVE\ARC00004_0609963499.001
    thread=1 sequence
    =4
    media recovery complete, elapsed time: 00:00:04
    Finished recover at 26-DEC-06

    RMAN>

    Agora iremos abrir o banco com RESET LOGS.
    O comando ALTER DATABASE OPEN RESETLOGS, irá criar
    os arquivos de redologs, de acordo com a configuração
    armazenada no controlfile.

    RMAN> alter database
    open resetlogs;

    database opened

    RMAN>

    select to_char(max(data_insercao),’DD-MM-YYYY
    HH24:MI:SS’)
     from estudo.insert_time;

    TO_CHAR(MAX(DATA_IN
    ——————-
    24-12-2006 18:29:00

    1 row selected.

    Caso você deseje se aproximar um pouco mais do momento
    do problema, precisará restaurar o controlfile novamente,
    restaurar os datafiles, e recuperar o banco informando uma hora
    mais próxima.

    Vamos voltar o banco ao estado em que ele se encontrava as 18:45
    do dia 24/12/2006.

    RMAN> shutdown immediate;

    database closed
    database dismounted
    Oracle instance shut down

    RMAN>

    RMAN> startup nomount;

    connected to target database (not started)
    Oracle instance started

    Total System Global Area     293601280
    bytes

    Fixed Size                     1248624
    bytes
    Variable Size                 79692432
    bytes
    Database Buffers             209715200
    bytes
    Redo Buffers                   2945024
    bytes

    RMAN>

    Restaure o controlfile mais próximo.

    RMAN> restore controlfile
    from ‘c:\Backup\C-1125663715-20061224-00’;

    Starting restore at 26-DEC-06
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=157 devtype=DISK

    channel ORA_DISK_1: restoring control file
    channel ORA_DISK_1: restore complete, elapsed
    time: 00:00:01
    output filename=C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL
    Finished restore at 26-DEC-06

    RMAN>

    Inicie o banco no modo mount.

    RMAN> startup force
    mount;

    Oracle instance started
    database mounted

    Total System Global Area     293601280
    bytes

    Fixed Size                     1248624
    bytes
    Variable Size                 79692432
    bytes
    Database Buffers             209715200
    bytes
    Redo Buffers                   2945024
    bytes

    RMAN>

    Faça o restore dos datafiles.

    run
    {
      ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
      ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
      set until time "TO_DATE(’24-12-2006
    18:45:00′,’DD-MM-YYYY HH24:MI:SS’)";
      RESTORE DATABASE;
      RELEASE CHANNEL c1;
      RELEASE CHANNEL c2;
    }

    allocated channel: c1
    channel c1: sid=156 devtype=DISK

    allocated channel: c2
    channel c2: sid=155 devtype=DISK

    executing command: SET until clause

    Starting restore at 26-DEC-06

    channel c1: starting datafile backupset restore
    channel c1: specifying datafile(s) to restore
    from backup set
    restoring datafile 00002 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
    restoring datafile 00003 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
    restoring datafile 00005 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
    channel c1: reading from backup piece C:\BACKUP\ORCL_1125663715_LEVEL0_19_1_0JI5
    P5E6.BKP
    channel c2: starting datafile backupset restore
    channel c2: specifying datafile(s) to restore from
    backup set
    restoring datafile 00001 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
    restoring datafile 00004 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
    restoring datafile 00006 to C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TBS_ESTUDO_01.
    DBF
    channel c2: reading from backup piece C:\BACKUP\ORCL_1125663715_LEVEL0_18_1_0II5
    P5E5.BKP
    channel c1: restored backup piece 1
    piece handle=C:\BACKUP\ORCL_1125663715_LEVEL0_19_1_0JI5P5E6.BKP
    tag=DB_LEVEL0_WH
    OLE
    channel c1: restore complete, elapsed time: 00:00:48
    channel c2: restored backup piece 1
    piece handle=C:\BACKUP\ORCL_1125663715_LEVEL0_18_1_0II5P5E5.BKP
    tag=DB_LEVEL0_WH
    OLE
    channel c2: restore complete, elapsed time: 00:01:03
    Finished restore at 26-DEC-06

    released channel: c1

    released channel: c2

    RMAN>

    Faça o recover até o momento desejado.

    RMAN> RECOVER DATABASE until time "TO_DATE(’24-12-2006
    18:45:00′,’DD-MM-YYYY HH24:MI:SS’)";

    Starting recover at 26-DEC-06
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: sid=156 devtype=DISK

    starting media recovery

    archive log thread 1 sequence 3 is already on
    disk as file C:\ORACLE\ARCHIVE\ARC
    00003_0609963499.001
    archive log filename=C:\ORACLE\ARCHIVE\ARC00003_0609963499.001
    thread=1 sequence
    =3
    archive log filename=C:\ORACLE\ARCHIVE\ARC00004_0609963499.001
    thread=1 sequence
    =4
    media recovery complete, elapsed time: 00:00:04
    Finished recover at 26-DEC-06

    Abra o banco com resetlogs.

    RMAN> alter database
    open resetlogs;

    database opened

    RMAN>

    Fazendo o mesmo select feito anterior, teremos:

    select to_char(max(data_insercao),’DD-MM-YYYY
    HH24:MI:SS’)
    from estudo.insert_time

    TO_CHAR(MAX(DATA_IN
    ——————-
    24-12-2006 18:44:00

    1 row selected.

    Acredito que demonstramos uma boa utilização do
    RMAN em processos de recover point in time.

    Vale lembrar que em bases relativamente grandes é preciso
    ter um certo cuidado em relação ao tempo informado
    para a recuperação. Imagine você restaurar
    300GB de datafiles, e depois de 2, 3 ou 4 horas executar o comando
    recover com uma hora posterior ao momento desejado, você terá que
    fazer todo o processo novamente e talvez a empresa não
    possua mais janela para realizar a operação.

    Espero ter ajudado um pouco na descoberta do RMAN, uma ferramenta
    excelente, e muito útil.

  • Milhares de pequenos negócios saudáveis e excluídos

    Numa
    noite dessas, navegando pela rede, tive o prazer de assistir
    a uma entrevista  com o colega de profissão Michel
    Lent Schwartzman para uma tv online.

    Esse rapaz, com sobrenome difícil, que soa alemão
    (apesar dele ser carioca legítimo),  é um
    dos mais antigos profissionais de web do País. Michel
    tem apenas 36 anos e um currículo bem extenso:
    Agency.com, EURO/RSCG, Medialab,  DM9DDB e hoje é diretor
    da 10′minutos, uma das
    principais agências interativas do Brasil.

    Na entrevista,
    Lent abordou assuntos relacionados a publicidade online, ao mercado,  a
    internet atual e projeções
    para o futuro. Fiquei ali assistindo, vendo o entrevistado e
    os entrevistadores falando tantas palavras inglesas como expertise,
    job, target, interactive, web standards e outras firulas
    que soam bonito. 

    Em determinado momento, Michel mostra o quanto é barato
    realizar uma campanha pela internet, quando comparado com
    a mídia tradicional. Cita alguns
    valores como referência, dizendo que com 80, 100, 200 mil
    reais dá pra
    fazer uma boa campanha e que de fato um valor como esse seria
    irrisório para uma campanha em meios como
    TV, rádio e outdoor. 

    Revela ainda que o foco de sua empresa está justamente
    aí, no médio empreendedor.

    Sobre as pequenas empresas que podem investir de 5 a 10 mil
    reais, ele dá algumas soluções para
    aquele que quer se destacar na internet como por exemplo o Google
    Adwords e seus links patrocinados.

    É sobre esse médio e pequeno empreendedor que
    quero abordar nesse artigo. Muitos webdesigners chegam para
    mim e perguntam: “Bruno, quanto devo cobrar?
    Quanto?”. Vejam aí o que nosso amigo 

    Michel disse. Um médio empreendedor pode investir até 200
    mil reais numa campanha incluindo hotsites, banners e idéias
    criativas. Percebam que o mercado dele está concentrado
    no eixo São Paulo – Rio. Agora levanto a seguinte questão:
    será que uma média empresa de Roraima, Piauí ou
    Tocantins teria 200 mil reais para investir em publicidade online? 

    Respondo: não.

    Esse Brasil, de tamanho quase continental,
    concentra grandes disparidades. Uma delas é essa, as disparidades
    de mercado. Vamos visualizar alguns números.
    Segundo o IBGE, em 2005, 39 milhões de brasileiros acessaram
    a internet. Apenas 18,6% da população tem computador
    em casa. Sendo 13% apenas tem acesso a internet. 

    Agora só para se ter uma idéia, em 2000 esse número
    era de 8%.

    Sabe o que isso quer dizer? Que com o barateamento dos computadores
    e ao acesso a internet teremos a sua massificação.
    E tem mais, internet já fugiu dos limites do monitor e já é cada
    vez mais presente em celulares, aparelhos estes cada vez mais
    baratos.

    O rumo é certeiro: em breve teremos tantas pessoas
    conectadas na internet que chegaremos a mais de 100 milhões
    de brasileiros.

    Agora, o que fazer com aquele empreendedor de
    Roraima, que lá é tido
    como um médio empreendedor, mas pelas disparidades econômicas
    não
    tem 200 mil para investir? E aquela panificadora do meu bairro,
    que com a popularização da internet já encontram
    seus clientes pela rede, porém não tem ninguém
    qualificado disposto a fazer um bom site ou uma boa campanha publicitária
    online por 2 mil reais?  O que ele deve fazer?

    Será que estamos criando uma enorme contingência
    de pequenos empresários que querem estar na internet  mas
    não tem como? Do que adianta links patrocinados se
    o site a qual está linkado de nada serve, por  tão
    mal feito que é?

    É fato, o que tem mais nesse país são pessoas
    de baixa renda (jeito bonito de dizer “pobres”).
    Existe sim gente querendo investir em internet fora de São
    Paulo. De Fortaleza a Caxias do Sul, de Cuiabá a Salvador,
    existe uma quantidade enorme de pessoas desejando entrar na web
    de maneira decente, confiável e promissora mas não
    encontram agências e profissionais capazes de atendê-los
    por um valor compatível
    a sua realidade.

    Ferramentas como Joomla, Xoops, WordPress e outros
    CMS semelhantes chegaram com a promessa de democratizar o acesso
    a ferramentas poderosas de edição
    de sites que antes somente grandes empresas tinham a capacidade
    financeira de possuir. Mas quem já teve
    a oportunidade de encarar um CMS sabe que mesmo assim existem
    dificuldades principalmente para um leigo. Fico imaginando o
    dono da padaria do meu bairro tentando criar um site com o Joomla.
    Complicado. Inevitavelmente ele precisará de alguém
    para ajudá-lo. 

    E os templates prontos? Outra tentativa
    de democratizar esse acesso, disponibilizando bonitos layouts
    para aqueles que não tem como investir em layouts próprios.
    Resultado: sites iguais, sem personalidade, indo contra a maré da
    personificação
    como diferencial de mercado. Ponto negativo para imagem da empresa,
    sendo percebida apenas meses depois do site ir ao ar.

    Então, é isso o que vejo. Milhares de excluídos,
    donos de pequenos negócios, que dão certo no meio
    offline mas no online não conseguem ter acesso por falta
    de um bom trabalho por valores compatíveis. 

    Péssimos
    profissionais que vendem sites ruins por 200, 500 reais, sabemos
    que existem aos montes. Mas bons profissionais com boas
    soluções para
    esses pequenos empresários? Difícil de encontrar.

    Aqui
    fica a polêmica. Sei que muitos irão dizer
    que o bom profissional deve cobrar caro mesmo pois é merecido.
    Outros vão dizer que o mercado está prostituído.
    Alguns vão falar ainda que há bons profissionais
    cobrando  valores módicos e outros dizendo que se
    não
    tem dinheiro para pagar, que fique fora da internet.

    O objetivo
    desse artigo não foi responder mas provocar.
    Pensem no que disse, tire suas conclusões e se possível
    reparta com a gente. Estamos todos no mesmo barco e esse tipo
    de discussão
    só vem a somar. Pelo que se viu, na internet, existe
    muita vida fora da Av. Paulista. 

    Para o alto e avante! 

  • Técnica de Túnel

    Olá amigos. Hoje estudaremos um efeito abstrato bastante
    utilizado em design gráfico e para internet, utilizando
    o Photoshop CS2. Alguns conhecem este efeito como "Túnel".

    Aproveitando, gostaria de desejar um feliz ano novo com muita
    paz, saúde, felicidade e sorte para que consigamos alcançar
    todos os nossos objetivos.

    Vamos ao artigo:

    Crie um novo arquivo conforme
    a imagem abaixo. Vamos usá-la para criar um novo Padrão
    (Pattern).

    Em uma nova camada(layer),
    vamos preencher a metade do nosso arquivo com a cor preta. A
    outra metade poderá ficar sem preenchimento.

    No menu principal,
    selecione: Edit > Define Pattern. Nomeie
    o arquivo como quiser. No meu caso, utilizei "tunel"(sem
    acento mesmo).

    Com o nosso Padrão
    criado, vamos criar um novo arquivo conforme a imagem abaixo:

    No menu principal,
    selecione: Edit > Fill (Shift
    + F5 ). Em Contents, na caixa de seleção, escolha
    a opção: Pattern (Padrão). Em Custom
    Pattern
    , selecione o nosso Padrão que acabamos
    de criar.

    Nossa imagem deverá ficar assim:

    No menu prinipal, selecione: Filter (Filtro) > Distort (Distorcer) > Polar
    Coordinates
    (Coordenadas Polares). Marque a opção: Retangular
    to Polar

    Em seguida, altere o valor da opacidade para 5%. Aí está a
    nossa imagem final:

    Imagens criadas que utilizaram a mesma técnica:

    Bem pessoal, agora é só usar a criatividade. Um
    grande abraço a todos.

    Fiquem com Deus e até a
    próxima!

  • Metodologias de qualidade em TI

    O setor de Tecnologia da Informação transforma-se
    rapidamente a cada dia, criando e recriando conceitos, paradigmas,
    formas diferentes de se analisar antigos problemas. Estas mudanças
    estimulam o surgimento de metodologias, com novos padrões
    de qualidade organizacional.

    Atualmente, quando se aborda a questão da gerência
    de projetos, se pensa rapidamente em PMI (Project Management
    Institute) e em sua conceituada certificação PMP
    (Project Management Professional), concedida a profissionais
    que atuam na área. O fato é que a valorização
    das certificações deve-se, sobretudo, ao reconhecimento
    que o mercado profissional oferece aos profissionais que estão
    alinhados com as melhores práticas disseminadas pelo mundo.

    Sob esta ótica, mais vale um profissional conhecedor
    das práticas nas grandes empresas do que um mestre (ou
    doutor), que possui um grande reconhecimento no meio acadêmico,
    mas nem sempre consegue acompanhar ou estar alinhado com os exercícios
    de mercado. Portanto, uma questão que surge desta análise é sobre
    o conteúdo adquirido por uma pessoa que se capacitou e
    conseguiu a certificação PMP; e o conteúdo
    adquirido por um mestre em TI. Porém, antes de responder
    esta pergunta, é preciso expandir o universo de investigação.

    Devido ao crescente investimento em qualidade em TI, existem
    hoje várias outras metodologias disseminadas e aplicadas
    nas organizações. Analisando as metodologias padrões
    amplamente implementadas não só em TI, mas também
    em outros setores, identificam-se as normas ISO (promoção
    do desenvolvimento da normalização), o Six Sigma
    (programa de qualidade), o CMMI (definição das
    melhores práticas de engenharia de software), a ITIL (modelo
    de biblioteca de conhecimento em TI) e o RUP (processo de desenvolvimento
    de software), dentre outras.

    Por trás destas metodologias, há um órgão
    padronizador do conteúdo, que visa, não apenas
    a definir modelos, como a promover sua evolução,
    através do conhecimento adquirido pela aplicação
    dessas técnicas no mundo real. Uma empresa pode possuir
    um certificado ISO 9001, avaliação CMMI nível
    3 ou superior, implementação de práticas
    da ITIL e iniciativas de melhorias baseadas em Six Sigma. Para
    a organização, isto não se trata de um diferencial
    competitivo, mas algo necessário para se manter ou se
    expandir.

    Porém, as empresas têm focado cada vez mais a prática
    de contratar pessoas qualificadas e certificadas nessas metodologias.
    Por isto, é dado um grande valor a algumas certificações
    profissionais, como PMP, Black Belt, Master Black Belt, Green
    Belt, ITIL Foundation e CFPS (Certified Function Point Specialist),
    dentre outras. E, certas vezes, é mais útil para
    uma organização um profissional certificado ITIL
    do que um mestre ou doutor em TI.

    Num processo de licitação ou participação
    numa RFP (Request For Proposal), por exemplo, uma empresa obtém
    grande pontuação se possuir certificados e contar
    com pessoas certificadas nessas metodologias globais em seu quadro
    de funcionários. Porém, vale ressaltar que títulos
    de mestre e doutor ou funcionários que possuem MBA’s
    ou outras especializações em centros de ensinos
    de renome não são vilipendiados pelo mercado. Há,
    sim, um grande reconhecimento aos profissionais que têm
    tais títulos, e as organizações também
    ganham pontos por manter mestres e doutores muito bem qualificados
    em seus quadros.

    Dessa forma, profissionais devem equilibrar investimentos em
    educação formal e certificações de
    mercado. Entretanto, acima de tudo, devem adquirir experiência
    em empresas que possuem um sistema de gestão da qualidade
    implementado e que investem em seus funcionários.

    Observando a estrutura de cada uma das metodologias mencionadas
    anteriormente, pode-se verificar um denominador comum entre elas.
    Todas tratam, em primeiro lugar, de processos. Qualquer organização
    bem-sucedida possui processos muito bem definidos, com seus fluxos
    documentados. Também deve possuir métricas que
    lhe permitam avaliar sua eficiência e indicadores de seus
    processos que suportem as tomadas de decisão táticas
    e estratégicas. E, para garantir que os processos sejam
    seguidos e os indicadores coletados conforme planejado, há que
    se ter uma gerência efetiva nas organizações. É preciso,
    também, que sejam realizadas estimativas e a criação
    de baselines. Há que se executar, ainda, o processo
    para, posteriormente, fazer seu monitoramento e controle, através
    de suas métricas.

    Ou seja, por trás de todas estas metodologias – PMI,
    ISO, Six Sigma, CMMI, RUP, ITIL – estão antigos conceitos
    fundamentais. A questão é: toda e qualquer metodologia
    possui um grande valor agregado por trás de suas teorias,
    que proporciona uma amplitude de visão para tratar os
    antigos problemas e, possivelmente, novos problemas gerados pela
    evolução tecnológica ou necessidade crescente
    por níveis mais elevados de qualidade. Pequenas empresas,
    que geralmente não conseguem investir nestas certificações
    oficiais devido aos seus valores impeditivos, podem focar na
    trilogia Processos-Métricas-Gerência para se estruturar
    e apresentar qualidade em suas operações.

    Dessa forma, para uma empresa obter êxito sob todos
    os aspectos de qualidade, esta deve possuir um grande direcionamento
    em seus processos, com métricas que suportem tomadas de
    decisão e uma gerência pró-ativa. E isto
    só se atinge com experiência, com definição
    de processos enxutos, que realmente reflitam o que é feito
    nas organizações e não sejam meramente documentos
    administrativos. É preferível utilizar poucos indicadores
    que dizem muito sobre a organização a muitos indicadores
    que retratam pouco sobre a empresa. E, sobretudo, é necessário
    atuar com profissionais certificados e boa formação
    acadêmica em todas as áreas da empresa.

  • Unificando a Web com haXe

    Com a febre da RIA (Rich Internet Applications), inúmeras
    plataformas começaram a ser integradas para que os aplicativos
    pudessem funcionar.

    Por exemplo, o Ajax mistura JavaScript com
    alguma linguagem Server-side, como PHP, nos possibilitando
    requisitar dados de um banco; o Flash pode comunicar-se tanto
    com o servidor, quanto com o JavaScript e vice-versa, garantindo
    bastante flexibilidade. Há, entretanto, um ponto negativo: é preciso
    aprender três (mais?) linguagens diferentes dependendo
    do projeto.

    (mais…)

  • Modelagem de Dados (Parte 04) – Abordagem Relacional

    A grande maioria dos Sistemas Gerenciadores de Banco de Dados
    (ou simplemente SGBD’s) são Relacionais. Os bancos Relacionais
    são compostos por Tabelas ou Relações. Este
    termo “Relações” é mais usado na literatura
    original sobre abordagem relacional (daí a denominação “Relacional’),
    enquanto que “Tabela” é um termo mais prático e mais
    usado em produtos comerciais. Para não haver confusão
    de conceitos, vou me usar a terminologia “Tabela”.



    Uma Tabela é um conjunto não ordenado de linhas ou
    (tuplas – terminologia original) e cada linha possui campos (atributos).
    Cada campo é identificado por um nome de campo (ou nome
    de atributo) e o conjunto de linhas de uma tabela, que possuem
    o mesmo nome chama-se coluna. Para muitos, nada disso é novidade,
    mas não nos custa nada lembrar os conceitos.



    Algumas características específicas de uma tabela
    de banco de dados:

    – As linhas da tabela não são ordenadas.
    A recuperação
    de linhas em uma tabela acontece arbitrária, ou seja,
    a recuperação será da forma como está no
    banco e pronto, a não ser que a ordem seja especificada
    pelo programador na sua consulta.

    – Os valores de campo de uma
    tabela de banco de dados são
    mono-valorados. Pode-se apenas ter 1 valor em um campo,
    não
    sendo possivel armazenar “coleções” como Arrays
    (ou Vetores) por exemplo.

    – A linguagem de consulta ao banco
    de dados permite o acesso por qualquer critério envolvendo
    os campos de uma ou mais linhas. Em um arquivo de dados por exemplo é necessário
    um índice ou esquema de ponteiros para buscar algum valor.
    Na verdade índices também existem nos bancos
    de dados, mas isso não é considerado pelo programador
    nas consultas ás tabelas.



    Um item primordial quando falamos entre relacionamento entre
    linhas de tabelas é a CHAVE.  A chave primária é formada
    por um ou mais campos de uma tabela e serve como identificador
    de uma linha. Porém a chave primária deve ser sempre
    mínima, ou seja, ser composta pelo menor número de
    campos possível (no mínimo 1). Veremos mais adiante
    o uso de chaves com mais de um campo, que recebem o nome de “chave
    composta”.



    Vistos os conceitos básicos de um banco relacional, temos
    que considerar alguns pontos antes de iniciarmos a transformação
    de um modelo ER em um modelo físico para o banco de dados:


    O modelo ER não considera implementação
    com nenhum SGBD. É muito comum, surgirem modificações
    no esquema lógico para possibilitar a criação
    do modelo físico e usar os recursos do SGBD.

    – Ao construir
    o seu banco físico, voce deve considerar
    fatores como:

        – Diminuir o número de
    acessos a disco: A cada consulta á tabela, todas os campos
    da linha são
    carregados para a memória, mesmo que voce utilize apenas
    1 deles)

        – Evitar junções: Em
    muitas consultar a banco, são feitas junções
    de dados em várias
    linhas de tabelas. Utilize todos os dados necessários
    de preferencia em uma única linha diminuindo o número
    de junções, pois uma junção acaba
    envolvendo vários acessos a disco.

        –
    Diminuir o número de chaves primárias:
    Fatalmente voce acabará juntado algumas tabelas que você dividiu
    durante a modelagem lógico. Isso porque a presença
    de chaves em locais diferentes, armazenando a mesma informação
    acaba virando mais espaço em disco utilizado e mais processamento.

        –
    Evitar campos opcionais: Técnicamente
    um campo vazio no banco de dados não ocupa espaço
    em disco, devido ás técnicas de compressão
    de dados existentes nos SGBDs de hoje. Mas o problema surge quando
    a obrigatoriedade ou não do preenchimento de um campo
    depende do valor de outro campo.

    Este fator acaba sendo resolvido
    via programação,
    ou seja, pelo sistema que vai acessar aquele banco e isso deve
    ser evitado. Algumas medidas de integridade de dados podem ser
    tomadas ja no banco, deixando o mínimo de campos que podem
    assumir o valor NULL.



    A transformação do modelo ER em um modelo relacional
    segue as seguinte etapas:

    – Tradução de Entidades
    e Atributos

    – Tradução de Relacionamentos e respectivos atributos

    – Tradução de generalizações/especializações



    Inicialmente, a tradução de entidades é razoávelmente
    obvia: uma entidade gera uma tabela. Cada atributo da entidade
    gera uma coluna e os atributos identificadores da entidade tornam-se
    chave primária. Essa é uma tradução
    inicial. No decorrer da transformação entre modelos,
    algumas tabelas ainda poderão ser fundidas ou divididas.



    Mesmo assim, não recomendável apenas transcrever
    os nomes de atributos como nomes dos campos. Lembre que agora estamos
    falando de tabela física, de campos que serão acessados
    via programação ou seja, temos agora uma nova visão
    da situação. É nessa fase que, por questões
    de boa prática e organização no processo de
    modelagem deseja-se que sejam definidos alguns “padrões” para
    nomes de campos, abreviaturas e sempre primar por nomes curtos
    para os campos, ou seja das colunas da tabela.



    Para deixar mais claro a forma como voce deve fazer isso, vou
    mostrar um exemplo:

    Tem-se a entidade Pessoa com os atributos:
    Codigo, Nome, Endereço
    e Data de Nascimento. Código é o atributo identificador.
    Um exemplo de “tradução” dos campos seria:



    Tabela: Pessoa – Campos: CodPessoa, NomePess, EnderecoPess,
    DataNascPess



    Utilizei o seguinte padrão:

    – Para a chave primária,
    utilizei o prefixo “Cod” + o nome
    da tabela.

    – Para os demais campos utilizei o mesmo nome + o sufixo “Pess” em
    todos eles, identificando-os como sendo da tabela Pessoa.



    Mas há uma boa justificativa para esse sufixo “Pess” nos
    nomes:

    Ipotéticamente em uma instrução SQL pode haver
    uma junção da tabela Pessoa com a tabela Departamento. Departamento
    também possui um campo Nome. É recomendável
    não utilizar o mesmo nome de campo em tabelas diferentes
    para não gerar a seguinte situação:



    SELECT Pessoa.Nome, Departamento.Nome FROM Pessoa, Departamento
    (…);

    Na seleção SQL de campos o mesmo nome, deve-se
    especificar o nome da tabela de origem, o que pode tornar a cláusula
    muito longa, visto que consultas muitos mais complexas que essa
    são feitas com muita frequencia.



    SELECT NomePess, NomeDept FROM Pessoa, Departamento (…); 

    A utilização do sufixo para os mesmos campos de tabelas
    diferentes, nos poupa o trabalho de incluir o nome da tabela de
    origem, tornando a cláusula SQL mais limpa e legível,
    além de tornar o campo reconhecido em qualquer consulta:
    (Todos os campos com final “Pess” serão reconhecidos como
    sendo da tabela Pessoa)

    Esse exemplo mostra que vários fatores estão envolvidos
    na transformação para o modelo relacional. No proximo
    artigos seguiremos com a proxima etapa da tradução:
    Relacionamentos e Atributos.. 

    Grande abraço e até lá.

  • Firebug: a extensão do Firefox para desenvolvedores

    Atualmente encontramos um mar de
    extensões para o navegador
    Firefox, mas um que ultimamente tem se destacado é o Firebug
    na sua versão
    1.0 beta. Essa extensão funciona como uma ferramenta de
    monitoração
    e edição
    da codificação existente em uma página Web.
    Na sua versão anterior era somente possível
    monitorar o código, mas na nova versão beta também é possível
    alterar os códigos em HTML e CSS, em tempo real.

    Essa ferramenta
    hoje também possui um validador HTML e CSS,
    um console Javascript padrão Firefox e um DOM inspector.
    Outra funcionalidade que integra a extensão é inspeção
    de XMLHttpRequest, usada no desenvolvimento AJAX, sendo possível
    identificar erros de relacionados a esse serviço.

    A instalação é muito
    simples, como a de uma extensão convencional, e uma vez
    ativada, divide a tela pela metade. Na parte superior encontra-se
    a página
    visitada e embaixo o console do FireBug, como é mostrado
    na figura abaixo:

    O recurso de edição “online” se
    apresenta como uma ótima solução para um
    acabamento de design da página em um projeto, podendo
    verificar possíveis problemas e testar soluções.
    A manipulação do CSS,
    por exemplo, se torna muito prático, precisando apenas
    abrir o console, clicar na aba CSS, que mostrará a
    listagem dos arquivos .css.

    Selecione o desejado e o código
    será mostrado. Conforme
    a alteração é feita, será mostrado
    o resultado em tempo real. Na figura abaixo mostra o console
    para edição do CSS, ativando a modificação
    da propriedade color:

    Outros recursos da extensão:

    . Visualização
    de métricas CSS
    : Exibe
    todas as medidas de propriedades padding e margin, alinhamentos
    de elementos e marcações através
    de um display próprio, sendo possível da alteração
    dos valores dinamicamente.

    . Depurador de erros:
    Trabalha como se fosse um ambiente convencional de programação,
    mostrando resumo de erros, marcação
    para anulação e busca específica através
    de filtros.

    . Monitor de atividades:
    Para sistemas que usam AJAX, fornece informações
    sobre performance de carregamento de atividades e monitoramento
    do XMLHttpRequest.

    . Debug Javascript: É possível
    buscar por scripts facilmente, interromper ou anular execuções,
    executar por etapas e outros recursos de um ambiente de
    programação.

    Enfim, o FireBug é uma extensão
    essencial para um desenvolvedor web, tanto no design quanto na
    programação. Como ainda está na
    versão beta, pode-se encontrar alguns problemas, mas no
    geral a ferramenta atende tudo o que promete. E espere por mais
    atualizações!

    Para saber mais, acesse o site oficial
    do Firebug. Abraços!

  • Dicas para agilizar os trabalhos com o Photoshop

    Olá amigos!
    Este é meu primeiro artigo aqui no iMasters e, sendo assim,
    partirei de informações mais abranjentes sobre
    esse nosso maravilhoso programa que é o Photoshop. Espero
    que gostem e os auxiliem muito as dicas que vou passar.


    Primeiramente uma introdução:

    Durante
    a resolução de um problema, há um
    desgaste cognitivo devido à discrepância temporal
    entre o raciocínio de como a resolução
    é traduzida em passos a serem seguidos e a execução
    dos mesmos. Em outras palavras, temos um desgaste quando precisamos
    desenvolver uma tarefa e a execução da mesma é mais
    lenta que a velocidade de nosso raciocínio (o pensamento
    realmente é rápido).


    Sendo assim, um dos grandes desafios dos desenvolvedores de
    softwares é justamente possibilitar aos consumidores de
    seus produtos desenvolver tarefas complexas em menor tempo, por meio de
    um número menor passos.

    Os atalhos (dos
    programas), a meu ver, funcionam como uma espécie de amenizador desse
    desgaste, uma vez que podemos executar as
    tarefas mais rapidamente, muitas vezes quase que automaticamente,
    chegando próximo de acompanhar nosso pensamento (quando
    utilizamos os atalhos dos programas, desenvolvemos uma tarefa
    muito mais rápida e tranquilamente).


    De fato, vejo a grande importância da utilização
    de atalhos para pessoas que utilizam os programas com maior freqüência.
    Creio que este seja o caso de nós, leitores e articulistas
    do iMasters.


    Venho, neste primeiro artigo, apresentar algumas formas de
    facilitar nossa vida na utilização do Photoshop.
    Espero que gostem. Abraço à todos!!


    Foi mal a introdução
    mais teórica. Achei interessante dar respaldo à importância
    do artigo.





    Ferramentas Hand (mão) e Zoom:

    Quando vocês estiverem
    utilizando qualquer ferramenta (como o pincel ou a pen tool),
    vocês podem alternar
    entre a ferramenta selecionada e a ferramenta HAND simplesmente
    pressionando a barra de espaço. No memento em que a barra
    de espaço estiver pressionada, vocês estarão
    utilizando a ferramenta Hand, podendo
    movimentar-se ao longo da imagem, sendo que ao soltarem a barra
    de espaço,  voltarão
    a utilizar a ferramenta que estava previamente selecionada.


    O mesmo ocorre para a utilização de zoom (mais
    e menos). Ainda com a barra de espaço pressionada, pressione
    juntamente o Ctrl (para obter zoom +) ou o Alt (para
    obter zoom -), clicando com o mouse a fim de obter a visualização
    ampliada ou reduzida.


    Desta forma, vocês não precisarão soltar
    a mão do mouse para clicar na tecla de + ou de – do
    teclado para obter o zoom nos atalhos (Ctrl + Mais / Ctrl + Menos).

    Abrir Documentos:

    Um modo rápido de abrir documentos é dar
    duplo-clique na área
    vazia
    da área de trabalho do Photoshop.


    – Duplo-clique = Abrir
    documento (= Ctrl+O)


    – Duplo-clique + Ctrl = Abrir Novo Documento (= Ctrl+N)


    Seleção:

    – Para selecionar tudo que estiver na Camada (Layer), Aperte CTRL+A

    (Select ALL)

    – Para inverter uma Seleção,
    aperte Ctrl+Shift+I (InverseSelection)

    – Para Transformar essa
    seleção, aperte Ctrl+T
    quando algo estiver selecionado (caso algo
    não estiver selecionado, ele fará a transformação
    de todo o conteúdo da Camada (Layer)
    selecionada.

    – Para desfazer uma seleção, a melhor opção é apertar
    Ctrl+D.

    Sempre que nós tivermos feito
    uma seleção
    e ainda estivermos em alguma ferramenta de seleção:

    – Pressionando o Shift, fica acionada a opção
    Adicionar à Seleção
    (Add to Selection)

    – Pressionando o Ctrl, fica acionada a opção
    Subtrair da Seleção (Subtract from Selection)


    Pressionando o Ctrl+Shift, fica acionada a opção
    Interseccionar com a Seleção
    (Intersect with Selection).

    OBS:Lembrando sempre que, ao
    deixar de pressionar essas teclas, volta-se para a opção
    previamente marcada.

    Transformar:

    Vocês também podem acessar todas
    as opções de
    transformação através da transformação
    livre (Free Transform = Ctrl+T). Quando estiverem na transformação
    livre, basta clicar com o botão
    direito do mouse em cima da transformação. Ele
    abrirá uma
    janela contendo as opções de Transformação.

    Duplicar:

    Sempre que quisermos duplicar uma Camada (Layer)
    o atalho é Ctrl+J.
    Se quisermos duplicar um objeto, com a ferramenta Move Tool (tecla
    de atalho = V) selecionada, pressionamos o Alt, clicamos no objeto
    da camada selecionada e arrastamos para o local desejado. A duplicação
    será feita
    em outra camada prontamente criada.

    A outra forma é o nosso velho e conhecido Ctrl+C (para copiar), Ctrl+V
    (para copiar). O objeto, que precisa ser anteriormente selecionado com uma ferramenta
    de seleção, será copiado em outra camada prontamente criada.

    Abraço!

  • Sistema de busca utilizando a biblioteca Prototype

    Neste artigo vamos estudar uma forma simples e objetiva de
    criar um sistema de busca utilizando os recursos da biblioteca
    Prototype.

    Para saber mais sobre a biblioteca Prototype, visite o site
    oficial: http://prototype.conio.net.
    A documentação não é um ponto forte
    do site, mas você pode encontrar uma boa referência
    no site do Sérgio Pereira: http://www.sergiopereira.com/articles/prototype140.js.ptBR.html.

    Com o Prototype é possível desenvolver de forma
    simples e direta. Essa biblioteca encapsula diversas funções
    do Javascript. Neste artigo daremos ênfase aos métodos
    $(), $F(), Event.observe e principalmente à classe Ajax.Request.

    Começaremos pela tela do usuário, página
    totalmente em HTML, onde há a inclusão dos arquivos prototype.js e request.js.
    No arquivo resquest.js estão as funções
    construídas para realizar a busca de livros.

    figura1_index_html_cod.jpg

    Figura 1.1 Interface
    com o usuário,
    a primeira parte do sistema a ser construída.

    Repare que no botão de pesquisa (Linha 16) não
    há o onclick, comumente utilizado para
    chamadas de funções Javascript. Isso é possível
    porque o sistema está utilizando Javascript não-obstrutivo.
    Em outras palavras você não precisa modificar seu
    código html para fazer chamadas a funções
    Javascript. A função responsável em iniciar
    o processo de busca ao clicarmos no botão de pesquisa
    está no arquivo request.js.

    Ao realizar uma busca utilizando, por exemplo, o termo ajax,
    deverá retornar uma tela como a da Figura 1.2.
     
    figura2_index_html_tela.jpg

    Figura 1.2 Tela
    HTML com retorno da pesquisa realizada pela palavra-chave ajax.

    Na figura 1.3
    temos o código-fonte do arquivo request.js:

    figura3_request_js.jpg

    Figura 1.3 Arquivo
    request.js, com todas as funções Javascript construídas pelo desenvolvedor,
    necessárias para a comunicação entre a tela
    HTML e o script de busca.

    Examinando o arquivo request.js:

    Linha 1: início da função
    responsável pelo processo de chamada do arquivo de busca
    que realizará a pesquisa no banco de dados.

    Linha 2: informamos qual o nome da página
    responsável por ir ao banco de dados e trazer as informações.

    Linha 3: é declarada a variável termo onde
    será armazenado o que foi digitado pelo usuário
    no campo de busca. A função $F() do Prototype
    que captura o valor do elemento identificado na linha 15 da
    página index.html.

    Linha 4: é declarada a variável
    contendo o parâmetro que será enviado para a
    página debusca (busca.php).

    Linhas 5 a 7: aqui instanciamos a classe Ajax.Request.
    O método de envio é post. Quando a requisição
    terminar (onComplete) é chamada a função
    listaLivros().

    Linha 8: função $() do Prototype,
    faz o papel do document.getElementById(). O innerHtml Insere
    a mensagem Buscando livros… no div divResultados,
    mensagem que será posteriormente sobrescrita quando
    o script chegar na Linha 10.

    Linha 10: Função responsável
    em inserir no div divResultados o retorno HTML  da
    página busca.php, armazenado em responseText.

    Linhas 14 a 16: função observadora
    Init() contendo o Event.observe do Prototype, cujo papel é observar
    o elemento btnBusca (linha 16 do arquivo index.html).
    Quanto acionado o botão de busca, será chamada
    a função buscaLivros().Aqui é aplicado
    o conceito do Javascript não-obstrutivo, citado anteriormente.

    Linha 17: Dessa vez o Event.observe tem como
    objetivo chamar a função Init() ao término
    do carregamento da página (window, load). É importante
    a compreensão desse trecho, pois os elementos da página index.html,
    identificados pelos seus respectivos ids, passam a existir
    apenas depois que a página é totalmente carregada.
    Pesquise sobre o padrão Observer do Javascript para
    melhor entendimento.

    Finalmente a página de busca:

    figura4_busca_php.jpg

    Figura 1.3 Página
    de busca. Um script comum em PHP, que devolve o resultado do
    banco de dados.

    Essa página não tem segredo. Ela foi construída
    em PHP e por funcionar de forma independente pode ser reescrita
    em qualquer outra linguagem, como JSP ou ASP.

    Na linha 2 é instanciada a classe mysqli, que estabelece  a
    conexão com o MySQL. A linha 7 recupera o parâmetro
    enviado pela Ajax.Resquest (linha 5 do arquivo request.js).

    Nas
    linhas 14 a 17 o script varre o resultado da consulta imprimindo
    os dados no formatado HTML que serão exibidos no div divResultado da
    página index.html. Caso nenhum registro seja
    resultado, retornará a mensagem da linha 20.

    O objetivo da requisição com HttpResquest é que
    o tráfego das informações ocorra em background,
    sem que o usuário precise esperar a página inteira
    ir com a requisição e depois voltar com a resposta,
    como acontece na navegação clássica.

    Para fins didáticos, não utilizei orientação
    a objetos com arquitetura em camadas, mas recomendo que você construa
    seus aplicativos com base na arquitetura MVC: separação
    da lógica de banco (persistência), negócio,
    controle e visualização. Para quem desenvolve em
    PHP, recomendo para a camada de visualização o
    uso do template Smarty (http://smarty.php.net).

    Espero
    que você tenha um bom proveito da biblioteca Protrotype. É uma
    biblioteca segura e amplamente usada e certamente ela vai agilizar
    seu desenvolvimento em Javascript.