Dec 06 2006

O Senhor das Armas

Autor: Marcos Dell Antonio - Categorias: Filmes

Esse é mais um daqueles filmes que fazem história. A princípio, analisando somente o título, achei que fosse mais uma das histórias no estilo Schwarzenegger ou Chuck Norris. Nada disso. É um excelente filme com uma introdução melhor ainda.

Filme O Senhor das Armas
Compre agora na Submarino

Veja a sinopse (fonte: AdoroCinema):

Yuri Orlov (Nicolas Cage) é um traficante de armas que realiza negócios nos mais variados locais do planeta. Estando constantemente em perigosas zonas de guerra, Yuri tenta sempre se manter um passo a frente de Jack Valentine (Ethan Hawke), um agente da Interpol, e também de seus concorrentes e até mesmo clientes, entre os quais estão alguns dos mais famosos ditadores do planeta.

Veja mais informações sobre este filme na seção presente digital: Filmes sobre a África.

Até +.

Comentários Faça o seu comentário

Dec 06 2006

Presentes de Natal - Ho ho ho!

Autor: Marcos Dell Antonio - Categorias: Cotidiano

Depois de várias horas pesquisando em tudo quanto é site da internet atrás dos melhores presentes para este natal, cheguei a um denominador comum.

Presentes Digitais
Veja uma lista de sugestões de presentes digitais

Não foi fácil, como sempre. Receber presentes é simples. Dar é que é difícil. Você nunca sabe se está totalmente de acordo com os gostos do outro. Mas, é claro, muito melhor arriscar do que deixar a data passar em branco. Abaixo segue a lista dos presentes que comprei e/ou pretendo comprar neste natal.

- Para minha irmã: Titanic e Hamlet

Filme Titanic
Compre agora na Submarino

Segundo ela: “Já assisti 10 vezes e se pudesse assistiria 100″. É professora e estudante de inglês, então é melhor não tentar entender essa mente confusa.

Além desse, vou dar também o filme Hamlet (com Mel Gibson), que é uma adaptação da peça de teatro com mesmo nome escrita por William Shakespeare.

Filme Hamlet
Compre agora na Submarino

- Para meu pai: Primeira temporada de Xena

Ele é fã de seriados, então que seja feita a vossa vontade.

DVD Xena: A Princesa Guerreira 1ª Temporada - Vol. 1
Compre agora na Submarino

- Para minha mãe

O presente ainda é uma incógnita. Ela diz que gosta de ouvir música mas nunca percebi isso nas poucas horas que estou com ela. Também diz que gosta de assistir DVDs mas também nunca vi ela na frente da televisão focada em um filme/show.

A batata quente foi parar na mão da minha irmã que ficou encarregada de comprar alguns presentes em Florianópolis.

Minha sugestão foi o filme Lutero, que conta a história da criação do “Luteranismo” (Reforma Protestante).

Filme Lutero
Compare preços no JáCotei

- Para meu irmão

Um forte abraço! Já ganhou o que tinha pra ganhar no dia de aniversário, então que fique com Deus.

- Para mim

Dois dos meus hobbies são acampar e viajar. Há uns três meses comprei uma barraca da Nautika (modelo Falcon) para duas pessoas.

Barraca da Nautika modelo Falcon para duas pessoas
Compre agora na Submarino

Neste natal pretendo comprar uma mochila. Também da Nautika, o modelo Nebraska 50L é excelente para quem gosta desde tipo de aventura.

Mochila da Nautika modelo Nebraska com 50L
Compre agora na Submarino

É isso aí. Não deixe de conferir as sugestões de Presentes Digitais aqui do blog. Até +

Comentários Faça o seu comentário

Dec 05 2006

MySQL: Ordenando campos VARCHAR como se fossem INTEGER

Autor: Marcos Dell Antonio - Categorias: .NET, Cotidiano, Delphi

Ps: Este post trata da ordenação de campos VARCHAR como se fossem INTEGER utilizando o banco MySQL 3.2.9. Provavelmente a solução apresentada é compatível com as versões mais novas.

É muito comum o uso de campos VARCHAR para armazenar valores inteiros e alfanuméricos. No entanto, um grande problema é como ordenar esse tipo de campo como se fosse INTEGER.

No exemplo deste post, vou usar a seguinte tabela:

1 CREATE TABLE teste 2 ( 3 codigo VARCHAR(20) NOT NULL, 4 descricao VARCHAR(50) NOT NULL, 5 PRIMARY KEY(codigo) 6 )

Veja que a chave primária (campo “codigo”) é do tipo VARCHAR. Para fazer os testes, usarei os seguintes registros:

1 INSERT INTO teste VALUES ('1', 'Teste 1'); 2 INSERT INTO teste VALUES ('2', 'Teste 2'); 3 INSERT INTO teste VALUES ('3', 'Teste 3'); 4 INSERT INTO teste VALUES ('4', 'Teste 4'); 5 INSERT INTO teste VALUES ('5', 'Teste 5'); 6 INSERT INTO teste VALUES ('6', 'Teste 6'); 7 INSERT INTO teste VALUES ('7', 'Teste 7'); 8 INSERT INTO teste VALUES ('8', 'Teste 8'); 9 INSERT INTO teste VALUES ('9', 'Teste 9'); 10 INSERT INTO teste VALUES ('10', 'Teste 10'); 11 INSERT INTO teste VALUES ('11', 'Teste 11'); 12 INSERT INTO teste VALUES ('12', 'Teste 12');

Após populada a tabela, o desafio é fazer um SELECT que retorne os registros ordenados pelo campo “codigo”. O comando SQL mais óbvio para isso é:

1 SELECT * FROM teste ORDER BY codigo;

No entanto, ao executar este SQL o resultado apresentado é este:

Veja que a ordem retornada não é a esperada, ou seja, o registro 10, por exemplo, vem logo após o 1, quando deveria vir após o 9. Isso acontece pois o banco de dados está interpretando o campo “codigo” como VARCHAR.

Uma maneira muito comum para resolver este problema é cadastrar todos os registros prefixados com vários zeros, exemplo: 00001, 00002, 00010, etc. Desta forma, o SQL acima funciona.

No entanto, forçar o usuário a cadastrar suas informações utilizando um prefixo não é nada elegante quando existe outra solução muito mais simples. Veja o comando SQL que resolve este problema:

1 SELECT * FROM teste 2 ORDER BY 3 CONCAT(REPEAT("0", 20 - LENGTH(codigo)), codigo);

O resultado apresentado é este:

As funções CONCAT, REPEAT e LENGTH fazem um tratamento no campo código de tal forma que o banco passa a ordenar considerando um prefixo (neste caso vários zeros).

Para mais informações, nada melhor do que a documentação oficial.

É isso aí! Até +.

Comentários 6 comentários

Dec 05 2006

.NET: Cadê o Intellisense do Web.Config?

Autor: Marcos Dell Antonio - Categorias: .NET

Alguém já ficou sem o Intellisense do Visual Studio 2005 no arquivo Web.Config?

Se ficou, provavelmente é porque usou a ferramenta de administração Web que vem junto com o VS (menu WebSite -> ASP.NET Configuration). Ao utilizá-la, o namespace xmlns é adicionado à tag configuration do Web.Config.

Veja:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

Segundo um post do ScottGu em seu blog, basta remover o xmlns  que tudo voltará ao normal. Deve ficar assim:

<configuration>

Eu não me lembro de ter usado essa ferramenta, no entanto o xmlns estava lá. Removi e funcionou corretamente.

É isso aí! T+

Comentários Faça o seu comentário

Dec 04 2006

NHibernate 1.2.0 Beta 2

Autor: Marcos Dell Antonio - Categorias: .NET

Faz quase um mês que saiu a nova versão do NH. Infelizmente só pude testá-la hoje, pois os projetos usando .NET + NH ficaram em segundo plano neste período.

Ao que tudo indica, muitas melhorias aconteceram desde a versão Alpha até agora (entre estas, saiu a Beta 1, mas não cheguei a testá-la).

O Release Notes do NH 1.2 Beta 2 pode ser encontrado aqui e o download do framework pode ser feito aqui.

Dentre as modificações, algumas estão em destaque:

  1. A versão do XML Schema mudou de 2.0 para 2.2, portanto os desenvolvedores que usam o Intellisense do Visual Studio juntamente com os arquivos hbm.xml, devem modificar o atributo xmlns da tag nhibernate-mapping para 2.2. Veja:
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ...
  3. Atualização da biblioteca Castle.DynamicProxy.

Claro que nem tudo poderia dar certo em uma troca de versão!

Quando fui compilar um código fonte antigo que implementa a  interface IUserType, dois problemas aconteceram:

  1. Parece que foi adicionado um método chamado GetHashCode nesta interface. Esse problema foi facilmente resolvido. Bastou implementar este método de forma simples (somente para testar);
  2. A classe NHibernate.SqlTypes.TimeSqlType não existe mais! Parece estranho, pois assim como eu, muitos outros desenvolvedores devem utilizá-la para mapear os campos TIME da base, pois o NH não oferece um tipo nativo.

    Postei uma thread no fórum do NH para ver o que aconteceu. Ou eles colocaram em outro lugar ou adicionaram um tipo nativo para mapear os campos TIME.

    A thread com as dúvidas é esta aqui.

É isso aí! Até +.

    Comentários Faça o seu comentário

    Dec 02 2006

    Tira a mão daí .NET!

    Autor: Marcos Dell Antonio - Categorias: .NET

    Hoje ao clicar no botão Enviar de um form a seguinte mensagem apareceu:

    A potentially dangerous Request.Form value was detected from the client (_txtMessage=”Teste <a href=”teste.pph”>…”).

    Após uma rápida pesquisa no Google, descobri que o .NET Framework é inteligente o suficiente para interceptar um submit que contenha tags html.

    Para ele não interferir nesse processo e a validação ficar por conta do usuário, basta definir a diretiva ValidateRequest da nossa página:

    <%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”default.aspx.cs” Inherits=”_default” ValidateRequest=”false” %>

    Outra solução é definir o ValidateRequest globalmente no Web.config:

    <pages validateRequest="false" />

    Com essa diretiva desabilitada, existem basicamente duas possibilidades de tratar o texto digitado:

    - Remover todas as tags HTML do texto:

    string str = Regex.Replace(_txtMessage.Text,@”<(.|\n)*?>”,string.Empty);

    - Permitir tags HTML e utilizar uma função de Encode:

    string str = HttpUtility.HtmlEncode(_txtMessage.Text);

    É isso aí! Estou com problemas no add-in para inserir código no blog, mas de qualquer forma foi no modo mais simples. :)

    T+

    Comentários Faça o seu comentário

    Dec 01 2006

    Tentativa de Singleton usando Delphi

    Autor: Marcos Dell Antonio - Categorias: Delphi

    O design pattern Singleton garante que somente uma instância de determinada classe estará disponível durante todo o ciclo de vida da aplicação.

    Hoje precisei implementá-lo em uma aplicação servidora. Tenho uma estrutura assim:

    • Arquivo de configuração XML (Configuracoes.xml);
    • Classe que faz read/write neste arquivo (TXMLCfgClass);
    • Classes que utilizam a TXMLCfgClass para acessarem as suas configurações (TServidorCfgClass, TBackupCfgClass, TBancoDadosCfgClass, etc.).

    O mesmo arquivo XML será compartilhado pelas três classes de acesso às configurações, ou seja, uma única instância do objeto TXMLCfgClass deverá estar disponível para as três classes. Aqui é que entra o Singleton: ele garante que somente uma instância da classe TXMLCfgClass existirá durante todo o ciclo de vida da aplicação.

    Tudo muito bonito e interessante na teoria. Na prática a coisa é um pouquinho diferente.

    Tentei criar uma propriedade (ou field) privado e estático na classe TXMLCfgClass, mas não consegui. Uma solução semelhante é utilizar uma variável na seção implementation, desta forma:

    Declaração da variável
    1 implementation 2 3 var 4 xmlCfg: TXMLCfgClass;

    Implementação do Singleton (método estático e público):
    class function TXMLCfgClass.GetInstance: TXMLCfgClass; begin // GetInstance if (xmlCfg = nil) then xmlCfg := TXMLCfgClass.Create; Result := xmlCfg; end;

    A abordagem é muito interessante, pois se bem utilizada (chamando somente o método GetInstance) funcionará. No entanto, ainda é possível instanciar um objeto TXMLCfgClass utilizando o constructor Create.

    Outra forma de implementar o Singleton é fazendo um override no método NewInstance da classe TObject. Encontrei este exemplo que é específico para o Delphi 5, no entanto, fiz os testes com o Delphi 6 e funcionou também.

    Aqui também não são só flores. De acordo com o help do Delphi 6, ao fazer o override do NewInstance não devemos chamar inherited NewInstance no final, mas sim InitInstance. No exemplo que fiz, utilizei o inherited NewInstance e funcionou perfeitamente. O único detalhe é que não deve-se chamar o FreeAndNil após utilizar o objeto.

    Veja o exemplo:

    Declaração pública:
    class function NewInstance: TObject; override;

    Implementação:
    class function TCliente.NewInstance: TObject; begin if (cliente = nil) then cliente := TCliente(inherited NewInstance); Result := cliente; end;

    No fim das contas, acabei optando pela primeira opção. Faça os testes e escolha uma delas. ;)

    É isso aí! T+

    Comentários Faça o seu comentário

    « Página anterior