segunda-feira, 19 de fevereiro de 2007

Robustez no Delphi


O usuário, após preencher os campos de uma tela, clica no botão “Confirmar”. Inesperadamente o sistema trava, a máquina congela. Todo o trabalho foi perdido, diante de uma mensagem propagada com o seguinte conteúdo: “Ocorreram erros”, ou “Erro fatal, catastrófico”.
Quem não se deparou com essa situação? Acho que, infelizmente, isso ocorre com tanta freqüência que muitos nem dão a devida importância para este tipo de situação.
Considero que desenvolver aplicações robustas é uma questão que transcende valores como “capricho”, “elegância” e “cuidado com a qualidade”. Para mim, a robustez de um software está intrinsecamente relacionada à ética profissional. Principalmente porque o custo que esse cuidado demanda não justifica sua ausência. O que, na minha opinião, torna mais grave esse tipo de falta.
Nenhum argumento vai ter validade para o usuário, quando ele descobrir que determinada ação, equivocadamente, por ele efetuada, poderia não ter causado tanto estrago ao seu trabalho, se o programador tivesse protegido o bloco de código executado naquela funcionalidade.
Sabendo trabalhar com exceções, desenvolvedores e analistas podem otimizar seu trabalho tanto no que se refere ao custo de codificação, quanto no que tange a robustez da aplicação desenvolvida. As Exceções tornam os sistemas mais robustos porque favorecem uma padronização ao notificar e manipular possíveis erros, fluxos alternativos e situações inesperadas. Quanto ao esforço de codificação, uma boa prática de programação através das exceções, pode tornar seu programa mais simples, por isso fácil de escrever, ler, entender, e conseqüentemente, de depurar. Ou seja, o melhor dos mundos! O Desenvolvedor ganha, o projeto ganha e o usuário do produto final também ganha. Portanto, vamos gastar um tempinho pra falar sobre como tornar seus programas mais robustos.

Tentarei mostrar também como isso pode reverter pra vc com vários benefícios decorrentes das técnicas que discutiremos a seguir.

Um recurso muito importante, que é subutilizado pelos programadores no Delphi ,é o suporte a exceções. De maneira objetiva, o suporte a exceções, tanto no Delphi , quando nas demais linguagens de programação, permite que você separe o código de tratamento de erros do código que compõe o fluxo principal, no módulo que você esta programando. Melhorando a organização do seu código, conseqüentemente tornando a manutenção do mesmo muito mais fácil.
O que são Exceções? (Conceito)
Exceções são o que chamamos de erros ocorridos durante a execução de algum programa. Ou melhor, erros que podem o correr no programa, fazendo com que ele falhe ao executar uma determinada tarefa. Esses erros podem comprometer tanto o funcionamento do programa, quanto o funcionamento do sistema opercional, aumentando o transtorno sofrido pelo usuário do computador.
Pequenos detalhes que por ventura deixem de ser considerados podem ocasionar problemas de grandes proporções para uma corporação. Uma data inválida digitada por engano, pode comprometer o processamento de uma folha de pagamento se um determinado trecho de código não tiver sido preparado para evitar tal engano, por exemplo.

Evitá-las, ou tratá-las?

Em outras palavras, devemos evitar esses “erros”, essas exceções, ou devemos usá-las? Quando uma exceção é propagada, isso deve ser encarado com positivo ou negativo para o programador? Ao contrário do pensamento predominante, o mecanismo de disparo de exceções não é um inimigo, ele é aliado do desenvolvedor. De fato, em algumas situações, erros de programação podem originar exceções. Contudo, de forma alguma é correto concluir que a causa, de toda e qualquer exceção propagada, seja sempre essa. Será que em reflexo a prática de evitar erros em seus códigos, algum programador possa, por indução, ao associar a idéia do substantivo “erro”, julgar adequado evitar exceções ao ponto de evitar também trabalhar com exceções? Esse tipo de confusão não deveria acontecer. Erros de programação não são o que chama-se de “exceções”. Nem todos os erros que acontecem em programação são erros de programação. Os erros de programação não devem ser evitados. Eles não podem existir. As “exceções” também não devem ser evitadas, pois elas trabalham a seu favor. As exceções devem sim ser prevenidas e tratadas.

Como podemos, então, prevenir estes “erros” quando estamos desenvolvendo o programa, se eles só acontecerão quando o sistema for executado? Em tempo de execução, o Delphi gera mensagens de exceções quando ocorrem erros. As bibliotecas geram exceções quando algo sai errado, seja no código em execução, num componente, ou no sistema operacional. Quando isso acontece, se a linha de código, onde ocorreu o problema, não está preparada para manipular a exceção a própria VCL irá se encarregar disso exibindo uma mensagem de erro padrão. Mensagem essa quase sempre incompreensível para o usuário. Em seguida o Delphi tenta continuar o programa, sem se “preocupar” em eliminar a causa do problema. Ele tentará isso por meio da manipulação da próxima mensagem de sistema, ou solicitação do usuário. Contudo, as chances de fracasso na tentativa de continuidade do programa são consideráveis. Ainda assim, se axceção, eventualmente, não comprometer totalmente, são enormes as chances de pelo menos parte do sistema não voltar a funcionar de forma adequada.

No Delphi existem duas estruturas pelas quais podemos proteger e tratar exceções, evitando que processos sejam interrompidos de forma brusca ou resultem em operações danosas:

     
“try..finally..end;” - Para proteger um bloco de código.

“try..except..end;” - Para tratar exceções.


Elas podem ser usadas separadamente ou juntas. Vejamos agora o mecanismo de emprego dessas estruturas no intuito de tratarmos as exceções, protergermo blocos de ccódigo e com isso alcançarmos um nível de robustez satifsfatório:

try:
 
Delimita o início de um bloco de código protegido.


except:

1° Delimita o final de um bloco de código protegido
2° Delimita o inicio do bloco de código responsável por
manipular as possíveis exceções ocorridas no código
disposto entre o “try” eo “except”.
Ou seja, o except introduz as instruções de manipulação das exceções.


finally:
Garante a execução do bloco de código sempre. Ou seja, especifica o bloco de código que deverá ser executado, mesmo que ocorram exceções. A palavra reservada finally é usada para garantir finalização de processos que dispõe de recursos de sistema, como conexões abertas com SGBDs, fechamentos de arquivos ou tabelas, liberação de objetos, memória, e outros recursos alocados no mesmo fluxo de programa.


raise:
Gera uma exceção. Por meio dessa palavra reservada o desenvolvedor pode chamar o construtor da classe "Exception". para, em tempo de execução, comunicar que algo que não deveria acontecer aconteceu. Para um melhor entendimento construiremos nosso primeiro exemplo.


Exemplificando

No Delphi inicie uma nova aplicação: Menu file New Application.
No Form1 adicione os seguintes componentes e os configure conforme listado abaixo, da palheta Standard:

Edit (TEdit):
propriedade - Name = Edit1
propriedade - Text =
(vazio, sem valor algum. Apague qqr valor que esteja nela.)

Memo (TMemo):
propriedade - Name = Memo1
propriedade - Lines =
(vazio, sem valor algum. Apague qqr valor que esteja nela.)

Button (TButton):
propriedade - Name = Button1
propriedade - Caption = "Processar"





Codifique os seguintes procedimentos:
Na Seção "private" declare: procedure ProcessaNum(Numero: Integer);



Pressionte as teclas: “Ctrl+Shift+C” e codifique o corpo do procedimento.



Codifique o evento OnClick do Button1:



Neste exemplo, podemos observar que se por acaso o usuário não digitar nenhum valor e clickar no botão "Processar" será exibida uma exceção, como conseqüência o cursor do mouse ficará com a ampulheta pra sempre.



Se protegêssemos o código utilizando o “try..finally...end;” poderíamos garantir a normalização do cursor, entretanto, não evitaríamos a mensagem da VCL que não é nada amigável para o usuário. Esse é um exemplo de bloco de código protegido, contudo, sem tratamento de exceção. Veja abaixo:



O código acima não trata a exceção. O que ele faz é tornar o programa mais robusto, de modo que uma exceção não torne o funcionamento do programa irregular. Podemos acrescentar ao nosso código a estrutura “try..except” a fim de manipularmos uma eventual exceção. Neste caso, teremos que usar a palavra reservada “raise para personalizarmos uma mensagem de exceção mais amigável. Para isso teremos de utilizar “finally e “except aninhados.




Embora o código acima já apresente algum nível de proteção ele ainda está longe do ideal. Todavia, ele atende ao objetivo de entendermos como funciona esse mecanismo:

Ocorrendo qualquer exceção no fluxo de código contido no “try” o Delphi interrompe desviado para o “except”. Note que no fluxo do except, a palavra reservada “on” funciona como um desvio condicional onde podemos definir respostas para uma exceção. A estrutura “on .. do”, permite o desenvolvedor manipular a exceção podendo, em tempo de execução obter informações específicas sobre o erro ocorrido. Ora, se o recurso existente no Delphi para tratarmos as exceções é uma classe, logo, podemos concluir que, se pretendemos evocar metodos, acessar propriedades dessa classe, é lógico que precisamos instanciar um objeto dessa classe. Por isso mesmo declaramos uma variável “E” tipada da classe Exception, por isso foi possível acessar o conteúdo da propriedade “message” para exibirmos para o usuário com a função “MessageDlg”. Como isso funciona?

Uma variação da estrutura “on…do”, permite definirmos uma variável, local, temporária para criarmos uma instância da exceção. Portanto, na linha do “on..do”, testa o tipo da exceção, caso verdadeiro, cria uma instância, ou seja, aloca memória, para que possamos acessar a informação que precisamos. No nosso caso, exibindo o valor da propriedade “message” do objeto “E” (E.Message). Conseqüentemente, obtemos tratamento exclusivo para cada tipo de exceção na clausula “on do”. Por exemplo, o código abaixo trata o erro de divisão por zero, através da exceção EDivByZero:


function Divisao (Soma, Numero : Integer): double;
begin
try
Result := Soma / Numero;
except
on EDivByZero do
result 0;
end;
end;

Nesse caso, será exibido para o usuário uma mensagem padrão da VCL. Você pode tornar seu programa mais amigável criando uma mensagem específica de tratamento:


try
If Edit1.Text = ‘’ then
raise Exception.Create(‘Digite um valor.’);
A := StrToInt(Edit1.Text);
except
on Msg: EConvertError do
MessageDlg(‘Erro: ‘+Msg.Message, mtinformation,[mbOk],0);
end;


Além disso, você pode utilizar as exceções genéricas para tratar um erro, em vez de uma exceção específica. Por exemplo, se você quer tratar um erro relacionado a uma operação com inteiros, mas não sabe exatamente o erro, poderá utilizar a exceção EIntError, que é a exceção genérica da qual derivam outras exceções relacionadas a inteiros:

Dissecado a classe Exception

1.1. Seção private

A classe Exception possui dois campos privados:

  • FMessage: String; Armazena o conteúdo da mensagem que será exibida pela exceção.
  • FHelpContext: Integer; Armazena o valor que identifica o tópico do arquivo de help on-line associado a classe.

1.2. Seção public


Uma classe pode definir mais de um construtor, e esta classe possui doze métodos “Create” diferentes. Os construtores são métodos responsáveis pela alocação de memória necessária aos objetos da classe.


constructor Create(const Msg: string);


Recebe como parâmetro uma string que comporá a mensagem da caixa de diálogo exibida quando a exceção ocorrer.


constructor CreateFmt(const Msg: string; const Args: array of const);


Utiliza internamente a função “Format” para compor a mensagem com os valores passados no parâmetro “Args” e o texto passado para o parâmetro “Msg”.

constructor CreateRes(Ident: Integer); overload;


Recebe como parâmetro um inteiro que identifica uma string armazenada no arquivo de recursos (.res) do seu aplicativo. Ou seja, a string que será armazenada no campo FMessage é obtida pela função “LoadStr” que retorna um texto armazenado no arquivo de extesão “.res”.


constructor CreateRes(ResStringRec: PResStringRec); overload;


Este é a versão sobrecarregada do método anterior. O Parâmetro “ResStringRec” é um ponteiro para o Resource String. Os chamados “Resources” são arquivos que não pertencem, não fazem parte do seu projeto, entretanto, eles são ligados a aplicação quando ela é compilada.


constructor CreateResFmt(ResStringRec: PResStringRec; const Args: array of const); overload;


Este construtor é uma composição dos construtores “CreateFmt” mais o “CreateRes”. Ou seja através do valor, inteiro, passado para “Ident” carrega um texto armazenado num arquivo “.res”, e utliza a função “Format” para formatar a mensagem com os valores contidos no array “Args”.

constructor CreateResFmt(ResStringRec: PResStringRec; const Args: array of const); overload;


Versãp sobrecarregada do construtor anterior cujo aúnica diferença é: “ResStringRec” é um ponteiro para o resource string. Veja, a idéia é essa:
const sMyNewErrorMessage = 'Valor inválido: %d';

Exception.CreateResFmt(@sMyNewErrorMessage, [‘– 1’]);

O que acontece nos bastidores é isso:

constructor Exception.CreateResFmt(Ident: Integer; const Args: array of const);
begin
FMessage := Format(LoadResString(ResStringRec), Args);
end;

Ou seja: Format(LoadResString(@sMyNewErrorMessage), [‘- 1’]);

constructor CreateHelp(const Msg: string; AHelpContext: Integer);


Recebe como parâmetro uma string que comporá a mensagem da caixa de diálogo exibida quando a exceção ocorrer, além de um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe.


constructor CreateFmtHelp(const Msg: String; const Args: array of const; AHelpContext: Integer);


Recebe como parâmetro uma string que comporá a mensagem da caixa de diálogo exibida quando a exceção ocorrer. Além de um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe. Utiliza internamente a função “Format” para compor a mensagem com os valores passados no parâmetro “Args” e o texto passado para o parâmetro “Msg”.

constructor CreateResHelp(Ident: Integer; AHelpContext: Integer); overload;


Recebe como parâmetro um inteiro que identifica uma string armazenada no arquivo de recursos (.res) do seu aplicativo. Semelhante ao construtor “CreateRes” e um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe.


constructor CreateResHelp(ResStringRec: PResStringRec; AHelpContext: Integer); overload;


Recebe como parâmetro um ponteiro para a resource string. Semelhante ao construtor “CreateRes” e um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe.

constructor CreateResFmtHelp(ResStringRec: PResStringRec; const Args: array of const; AHelpContext: Integer); overload;


Recebe como parâmetro um ponteiro para a resource string. Semelhante ao construtor “CreateRes” e utliza a função “Format” para formatar a mensagem com os valores contidos no array “Args”. um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe. Além disso, um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe.


constructor CreateResFmtHelp(Ident: Integer; const Args: array of const; AHelpContext: Integer); overload;


Através do valor, inteiro, passado para “Ident” carrega um texto armazenado num arquivo “.res”, e utliza a função “Format” para formatar a mensagem com os valores contidos no array “Args”. Além disso, um valor numérico inteiro, “AHelpContext”, que identifica o tópico do arquivo de Help on-line associado a classe. Veja o código abaixo:






property HelpContext: Integer read FHelpContext write FHelpContext;


Como pode ser observado no código exibido na figura anterior, o campo interno “FHelpContext” armazena o valor inteiro que identifica o tópico do arquivo de Help on-line associado a classe.

property Message: string read FMessage write FMessage;


Através da propriedade “Message” podemos ler o valor do campo interno “FMessage” o qual contém o texto com a mensagem informativa sobre a exceção, a mesma que foi passada como parâmetro no construtor.


Continua no próximo artigo.

Artigo completo (View Full Post)

quinta-feira, 15 de fevereiro de 2007

Métodos? Variáveis?

Olá a todos. Este post traz algo legal: métodos chamados através de variáveis.

Métodos? Variáveis? Isso!

Primeiro vamos ver um método simples:

<?
function quadrado($numero) {
return $numero * $numero;
}
?>

Certo. método que retorna o quadrado do número informado.

Agora vamos chamar este método:

<?
$quadrado = quadrado(4);
// $quadrado será 16
?>


Assim é o padrão. vamos agora ver como chamamos este método através de variável.

O PHP permite a execução de uma variável como método desde que o conteúdo da variável corresponda a um método definido e ele tenha os parâmetros corretamente.

<?
$metodo = "quadrado";

$quadrado = $metodo(4);
// $quadrado será 16 do mesmo jeito
?>


Viu? Legal, né xD

Tá legal Felipe... mais uma coisa que só você vê utilidade... -_-

Hehe dessa vez vou mostrar uma utilidade:

Vocês já precisaram implementar uma rotina que chame um método dentro de um loop (passagem por registros de um record set por exemplo) e poder usar de forma genérica para que dê para usar a mesma rotina em situações diferentes? Então... Esta é a solução.

Hmmmmmmmm..... Tá..... ...... ...... Não entendi.

Ok, Ok. Exemplo:

Eu tenho um método que faz uma consulta no banco de dados e retorna resultados em um array multidimensional (para minha aplicação não ficar acoplada ao banco de dados). Se a consulta retornar resultados demais o buffer não agüenta e o script é abortado.

Então eu criei um método que executa o comando SQL, faz um loop no resultado e a cada passagem chama o método que foi definido no parâmetro e passa para este método o registro corrente para o método fazer o que deve fazer com o registro.

Com isso podemos definir métodos diferentes e executar ações diferentes para a mesma consulta. E sem precisar repetir os loops.

Hmmmmmmmm..........Tá quase.....

Ok, Ok.


Implementação do método chave (este fica na biblioteca principal):

<?
function executarMetodoDuranteSelecao($sql, $metodo) {
$resultado = mssql_query($sql);
while($registro = mssql_fetch_array($resultado)) {
$metodo($registro);
}
}
?>


Agora um método para uma consula específica (este fica no objeto de negócio):

<?
function consultarLivros($metodo) {
$sql = "select id, nome from livros";
executarMetodoDuranteSelecao($sql, $metodo)
}
?>


Finalmente a implementação no seu script:

<?

function mostrarLivro($registro) {
echo "<p><div>$registro[id]</div>";
echo "<div>$registro[descricao]</div></p>":
}


$instanciaObjNegocio->consultarLivros("mostrarLivro");
?>


Legal. Quando executar o método consultarLivros este vai enviar o comando SQL para o método da biblioteca executarMetodoDuranteSelecao que vai executar o comando SQL, fazer o loop e a cada passagem do loop executaro método definido na variável $metodo, que vai, a cada registro, mostrar duas div contendo os campos id e descricao.

Este assunto não é muito simples. Espero que eu tenha colocado de forma que todos possam entender. A seção de comentários é aberta para qualquer dúvida ou sugestão (nada de reclamações, por favor xD).

Abraços a todos.

Artigo completo (View Full Post)

Desculpas a todos

Olá meus queridos freqüentadores do blog.

Quero pedir desculpas a todos que todos os dias - mais de uma vez por dia - acessam o blog só para ver se eu postei alguma coisa maravilhosa!

Hehe, agora sem brincadeiras. Essa semana está um pouco pesada e eu não tenho tido muito tempo nem para tomar aquele café depois do almoço.

Vou trabalhar no resto desta semana em um post sobre um assunto maneiro.

Depois. (<<< uma piada sem graça imitando o que o pessoal em inglês escreve "Later". Se você não entendeu não tem problema xD )

Artigo completo (View Full Post)

terça-feira, 13 de fevereiro de 2007

Integrando a ReBirth com o Sonar

Ribirth com Sonar

O Sonar é um software para gravação, edição e mixagem de áudio. Com ele vc pode desenvolver projetos de CDs, trilhas sonoras, multimídia. Além de todos os recursos de gravação multipista (multrack), para edição de áudio, e do seqüenciador MIDI, já presentes na suas versões anteriores, o popular Cakewalk Pro Áudio. Essa nova versão, o Sonar, traz uma grande quantidade de inovações comparada aos seus antecessores.

Esse software é utilizando tanto a nível profissional, quanto amador (os home studios da vida) proporcionado a criação de trabalhos musicais com um resultado bem satisfatório.

Uma característica muito legal no Sonar é a fácil usabilidade. Sua interface é bem amigável, comparado a outros softwares similares, e intuitiva. Ele permite uma ótima integração com outros softwares seqüenciadores, como a ReBirth e o Rason. Funcionalidade indispensável para as produções de música digital desde das duas últimas décadas. Nosso objetivo neste post é mostrar o quanto é fácil integrar o Sonar com a ReBirth.

No sonar, vamos iniciar um novo projeto:
Quando vc abre o Sonar aparece o Quick Start, uma forma rápida de vc selecionar abrir um Projeto anteriormente iniciado, abrir o último aberto, ou iniciar um novo projeto.

Selecione “Create a New Project”. Agora, vc deverá escolher a configuração do projeto que vc está iniciando, escolha Normal.


Como vc pode notar na imagem acima, ele abre automaticamente alguns canais de audio (para gravar Wave), alguns canais de MIDI e em baixo o máster, um sub Grupo e um de Efeito. Para utilizar algum programa de Loop, como a ReBirth ou o Reason, sempre no menu principal, opção “Insert”, irá constar numa das sub-opções uma específica para o programa de sequencer que estará instalado na sua máquina. O próprio Sonar reconhece esses programas.
Nesse momento vamos utilizar a funcionalidade do Sonar que integra com a ReBirth, contudo, para que isso seja feito com sucesso, ceritifique-se que a ReBirth esteja fechada na sua máquina.
Feito isso, no menu principal:
Insert ReWire Device ReBirth Audio.


Um parêntese: Quando fiz o upload das imagens pude notar que ficaram bem
ruins aqui no blog. Mas, se vc clickar sobre elas poderá visualizá-las
com mais nitidez.

Voltando: Provavelmente, se vc nunca fez esse procedimento antes, será necessário ainda uma configuração. Defina como vc deseja que as Tracks sejam criadas (Se vc quer uma para cada instrumento da ReBirth ou todas mixadas em Stereo) e se vc vai querer que uma janela com as propriedades do Synth e/ou outra com o rack. A parte mais relevante para mim nesta configuração é que cada instrumento da ReBirth seja endereçado para um canal. Veja na figura como eu sempre trabalho. Dessa forma tenho mais flexibilidade para mixar os instrumentos. Conseqüentemente, consigo uma sonoridade que mais me agrada, embora isso dê mais trabalho.

Agora vc tem os novos tracks (canais) um para cada respectivo instrumento da ReBirth.


Agora execute a ReBirth, abra algum arquivo que vc já tenha finalizado, ou não, um loop (ou song). Retorne para o Sonar pressione Play, pronto a Rebirth ja deve estar tocando na sua máq através do Sonar.

A ReBirth vem com vários exemplos sequanciados, no diretório de instalação dela vc deve encontrar um pasta, Demo Songs:

So, then .... enjoy yourself

Artigo completo (View Full Post)

quinta-feira, 8 de fevereiro de 2007

Seu site no celular

Olá. Este post traz algo interessante: Configurar o Servidor Web Apache para usar scripts PHP em páginas WML.

Para quem ainda não sabe WML é a linguagem de marcação para WAP.

O meu exemplo é usando o Debian GNU/Linux sarge, Apache 2 e PHP 4. Acredito que em todos os sistemas operacionais que suportam Apache/PHP isso funcione.

No arquivo de configuração do Apache (/etc/apache2/apache2.conf) adicione esta linha junto de outras semelhantes (você pode colocar esta linha no fim do arquivo também, mas sempre procure organização):

AddType application/x-httpd-php .wml


O significado desta linha é que o servidor interprete extensão wml como um script PHP e use o interpretador do PHP para processar a página antes dela ir para o cliente.

Extendendo um pouquinho do assunto vou mostrar a estrutura básica de um arquivo wml:

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd">
<wml>
<card>
Aqui entra o conteúdo WmL que aparece no navegador WAP
</card>
</wml>


Com essa configuração do servidor esta página padrão WML não vai funcionar. Por quê?! Simples: qual é a marcação de script PHP? Hein? Isso! <? ?>. Infelizmente a tag do xml usa o mesmo ponto de interrogação; então o interpretador do PHP acha que é uma abertura de bloco, mas desconhece este "xml" que vem logo depois. Como resolver isso, então? Simples: é só fazer isso como um echo dentro de tags PHP. E não se esqueça de \"escapar\" as aspas:

<?
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>";
?>


Pronto.

Eu próprio vou começar a fazer uns módulos do site aqui da empresa em WAP. Quando tiver algo pronto eu posto aqui no blog. Abraços a todos!

Artigo completo (View Full Post)

Novidades Reloaded

Olá a todos novamente!

A mais nova novidade chegou! (ou está chegando). Acabei de achar o software para montar os posts em vídeo. Vou tentar fazer o primeiro hoje à noite.

Aguardem.

Artigo completo (View Full Post)

quarta-feira, 7 de fevereiro de 2007

Criando meus próprios toques para o Celular (.MP3).

Atende o Telemóvel, com mais estilo.

Ok, ok!!!
Estou levando pancada, vou tentar diminuir os posts ..... heheheh (Coeee, Felipe!! Bricadeira, sei que vc ta querendo mater um clima descontraido na área. Fica tranq!)
Existem toques maneiros ... mas, eu tenho idéias, embora não tenha tempo pra todas. Eu gosto da ReBirth, ela tem uma sonoridade que me agrada muito. É razoavelmente flexível e posso integrá-la tanto ao Cubase, quanto a outros, como o Nuendo ou o Sonar (veja qui!).

Acabei de sequenciar um loop, gostei do resultado, estou carregando para ser toque do cel.




Como isso funciona?

A idéia é construir patterns. Cada Banco pode ter até 8 patterns diferentes. Cada Módulo de sequencer, vou chamar assim, possui 4 bancos. Cada pattern é sub-dividido em 16 partes iguais de tempo. Cada Módulo pode tocar um som, ou não, em cada 1/16 parte do tempo. Com o slide vc liga o som de um 1/16 no outro. O accent como o próprio nome já diz acentua o som emitido na quele “step” ( Ou seja 1/16 parte do tempo). Cada 1/16 parte é ordenada e vc pode identifica - lá por um display cujo o título é “Edit Step”. Ali vc está editando um dezesseis avos qualquer do patern. Poder ser o 1°, ou o 2° ..... até o 16°.

A ReBirth vem com vário exemplos de paterns e songs seqüenciados. Os dois primeiros módulos são melódicos. A maioria dos exemplos usa sempre um deles para programar um riff de bass. Mas possui uma boa extensão possibilitando explorar sons agudos tb. Infelizmente, tem que mexer na afinação para explorar toda a extensão. Isso dificulta um pouquinho, admito.Cada um dos dois módulos melódicos possui botões para configuração da edição da afinação, timbre, acentuação e decay (não sei traduzir isso .. hehhe). Ah! Ainda pode escolher a forma da onda. Pois é, só duas eu sei mas ....

Os dois últimos módulos são rítmicos, bateria eletrônica. Cada instrumento da bateria está micro-abreviado: BD, logicamente não é banco de dados, é Bass Drum, ou seja, bumbo. SD Snare Drum, caixa. LT, Low Ton. MT, Middleton. HT, Highton (são os ton-tons da bateria, aquele som da segunda parte do message in a bottle, Os Paralamas tb exploraram esses sons em muitas levadas, alias eles copiavam o Police a rodo. Ok, ok!! Muito bem copiado. Tb acho). RS, é a clave (não lembro o nome em inglês). CP, claps. CH, Close Hi-Hat. OH, Open Hi-Hat. CC, Campana do Ride (Prato de condução, tocado na campana). RC, Ride. Chega ... acho que é isso. Não sou baterista.

Cada Módulo possui um controle de pan, volume, deley e efeitos (distorção e etc ..). Cada efeito tb pode ser configurado.

Você cria loops ou canções a partir dos patterns. Uma canção pode possuir um loop, ou ao contrário. Como vc Preferir.

O menu “edit” te permite copiar, cortar, colar (pardrão windows) nos patterns, aterá-los, shifta-los , randomizá-los automaticamente. No menu “edit” você inicia um loop ou canção apartir de um pattern criado.

È isso ai ... dá pra juntar com o sonar e adiciona guitarra, sax, teclado. Eu já fiz vários cds, quando trabalha em studio de gravação, usando a ReBirth . Muitos discos famosos usaram sequencers montados nela.

No menu “File” vc exporta para .wav depois converte para .mp3. Simples, rápido, show!

Exemplos criados por mim , postei aqui no Estação ZN.

Agora, o mais maneiro dessa história:

Vcs podem fazer douwnload da ReBirth, Mods e add-ons pra ela em: http://www.rebirthmuseum.com

Descobri essa parada agora, tem uma comunidade e tudo ... boladaum a situ.

Artigo completo (View Full Post)

Novidades a caminho!

Olá caríssimos freqüentadores do nosso blog.

Venho anunciar um plano que eu e o Gerson discutimos no almoço e que realmente vai ficar muito legal no blog.

Em vez de continuar fazendo estes posts quilométricos vamos começar a fazê-los em vídeos. Vídeos?! Isso, vídeos!

A idéia é colocar os vídeos no YouTube e exibi-los aqui também. Então, se necessário, colocaremos o arquivo de texto como anexo para download.

Estou procurando um software para isso. Como não sou muito rico preciso de um software grátis; se alguém souber ou encontrar algum por favor poste o comentário para eu começar o quanto antes.

Então é isso: Posts no blog e vídeos no YouTube - Web 2.0 na veia! Até mais!

Artigo completo (View Full Post)

Vídeo sobre Web 2.0

Olá a todos os nossos assíduos visitantes.

Estava eu no YouTube... Ia procurar um clipe do Massacration quando eu vi um link para um vídeo falando de Web 2.0 - The machine is us/ing us <<< Olha que doido! Por aí já temos uma prévia do que vem por aí. Um dos melhores vídeos que eu já vi no YouTube (acho que para mim foi o melhor):



Para quem quer ver o link no site é esse aqui:

Link para o vídeo.

Bem, é isso. grande abraço a até a próxima.

Artigo completo (View Full Post)

Extra! Extra! Novos remédios pra conjuntivite: MOST WANTED e CS!

Falae, galera!

Essa notícia vai para os viciados em games de plantão (Felipe, essa vc vai gostar):

O Videogame faz bem para os olhos!!!

Uns pesquisadores desocupados lá dos Estados Unidos, os mesmos que descobrem aqueles animais em extinção que passam no Jô, descobriram que jogar videogame faz bem para a visão.

Eles fizeram um estudo que mostrou que, durante um mês, aqueles que jogam games de ação melhoraram a sua visão em até 20%!!!

A Fonte da informação veio do site da Info e a matéria pode ser vista na íntegra clicando aqui.

Vou terminando o post por aqui pq o Most Wanted acabou de carregar e eu to querendo curar a minha conjuntivite...

Valeu, galera!

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br