tag:blogger.com,1999:blog-60036751572165443832024-02-21T04:59:15.188-03:00WormholeUma modesta central de dicas e truques sobre as linguagens de programação JAVA, C# e muito mais...Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-6003675157216544383.post-18859321357228317362010-01-17T04:10:00.001-02:002010-01-17T04:10:50.641-02:00Experiência do usuário com interfaces by Dilbert<p>Essa é uma tira rapidinha, mas que demonstra muito bem a realidade (infelizmente) na grande maioria dos projetos de software:</p> <p> </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcmJCZs1ewiIQOTrQRSwzBHk3SLaEVeZRo8h7sl-xOvxHpbu20Wtyef6FpHupB3IzbgTPENF8I8vImySuFsdWnRThDsUCLUCym7Aqc6955OB-ihJ-TyHypo4zpbrwK5CztmeRhBAfBchQ/s1600-h/image%5B2%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibg_4wnK-hNf22JzD1R0Bj1Agl5OolGB-I00C2M4vrRrKiBFdguQdl5I7MAje04Xtfxqk4m7M-sViw_VVyjs3Evw0hibCLICif5Hd83oxV2asPDx-bE5xhcCWvyLpxZiNdjhWbz89JRn0/?imgmax=800" width="474" height="215" /></a></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-23457212214309610922010-01-17T02:29:00.003-02:002010-01-17T02:51:34.460-02:00Importando uma planilha Excel no SQL Server<p>O objetivo desse script é importar de uma forma bem simples, uma planilha XLS do Excel para o Banco de Dados.</p> <p> <br />O procedimento é útil principalmente quando o cliente já possui, por exemplo, uma base de dados legada e a única fonte é uma planilha do Excel.</p> <p> <br />Para isso, utilizaremos a função <i>OPENROWSET</i>.</p> <br /> <pre class="brush:sql">/*
* Projeto: Importação de planilhas Excel no SQL Server
* Autor: Luis Fernando de Souza Santos
* Data: 17/01/2010
* Versão SQL Testada: 2008 Express Edition
**/
-- Habilitando as opções avançadas
-- Por default e por questões de segurança, essas
-- opções vêm desabilitadas.
sp_configure
'show advanced options', 1
reconfigure
sp_configure
'Ad Hoc Distributed Queries', 1
reconfigure
-- Criando a tabela com os meus atributos da planilha
create table funcionario(
Código INT NOT NULL PRIMARY KEY,
Nome VARCHAR(100) NOT NULL,
Admissão SMALLDATETIME NULL,
Departamento VARCHAR(100) NULL
);
-- Comando para importar a planilha na tabela
INSERT INTO FUNCIONARIO SELECT
* FROM OPENROWSET ('Microsoft.Jet.OleDB.4.0',
'EXCEL 8.0;Database=C:\departamento.XLS',Func$
);
-- Em "Database=C:\departamento.XLS',Func$", deve-se informar
-- o nome do arquivo, seguido do nome da "planilha" + $.
-- Exemplo: Arquivo DEPARTAMENTO.XLS, Planilha Func.
-- Pronto! Aí para visualizar, é só dar um SELECT na tabela.</pre>
<br />
<p>Para saber mais: <u><a href="http://msdn.microsoft.com/en-us/library/ms190312.aspx">http://msdn.microsoft.com/en-us/library/ms190312.aspx</a></u></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-66467048348460046322010-01-16T18:43:00.001-02:002010-01-16T18:43:21.191-02:00Você tem dificuldades em ver certas cores?<p>Você deveria ser capaz de ver números dentro dos círculos na imagem abaixo. Se você não consegue vê-los talvez seja cego para algumas cores. Faça o teste.</p> <p>Essa estranha característica é quase sempre uma herança genética e é mais comum em homens.</p> <p>Mas não se preocupe, por mais estranho que parece isso é bem comum.</p> <p> </p> <p><strong></strong><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdrDobY5FCjZ_K6us5kp5vQfIotMJgQ7Id_drD8snucGFl4Zqb9HxKzmH0Wv30sKzoqrzlLevSK38yPVfgSYNR4Aluj2RwORPUUuw2bSotVNFfzWO0z9EUViyNOTcisLhm4Sk5PrjcTOQ/s1600-h/colour_test%5B2%5D.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="colour_test" border="0" alt="colour_test" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp3p-7mBAopCD6NpIEicEZlCtYYDCrRxBVZYNT3WLZ_5t7poz0QAekFZgxNtJYBhvO4VtSQJBKBqRjt2Ru2MY7qQdrSF1PnPAguok_eOHVD0_pooF9fFCGElALVzX9TxxAXVu8-e-pdYo/?imgmax=800" width="354" height="381" /></a></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-90266985640000883932010-01-16T18:21:00.001-02:002010-01-16T18:21:24.592-02:00[vídeo] Acidentes engraçados<p> </p> <p>Mais um daqueles milhares de vídeos de acidentes engraçados... haha, mas é engraçado!! e a musica é legal.</p> <div style="width: 498px; background: #000000; height: 423px"><embed flashVars="playerVars=showStats=yes|autoPlay=no|videoTitle=Mais um daqueles milhares de videos de acidentes engraçados... haha, mas é engraçado!! e a musica é legal." src="http://www.metacafe.com/fplayer/573725/beast_funny_clip_compilation.swf" width="498" height="423" wmode="transparent" allowFullScreen="true" allowScriptAccess="always" name="Metacafe_573725" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed> <div style="font-size: 12px"><a href="http://www.metacafe.com/watch/573725/beast_funny_clip_compilation/">Assitir no site original</a> - <a href="http://www.metacafe.com/">Metacafe</a></div> </div> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-882759960308929352010-01-15T15:36:00.001-02:002010-01-16T02:10:25.849-02:00Hibernate Tools Eclipse Plugin<p><a href="http://marketplace.eclipse.org/content/hibernate-tools">Hibernate Tools Eclipse Plugin</a>  </p> <p>O Hibernate Tools facilita muito o desenvolvimento de aplicativos com Hibernate no Eclipse.</p> <p>Algumas características são:</p> <ul> <li>* Engenharia reversa </li> <li>* Configurador do hibernate.cfg.xml </li> <li>* Editor de Hibernate HQL com intelisense </li> <li>* Execução de consultas e seus resultados </li> <li>* Gera código SQL </li> <li>* Ajuda a configurar arquivos hbm.xml ...e muito mais... </li> </ul> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-56483974879179153002010-01-13T04:41:00.007-02:002010-01-16T01:36:06.418-02:00Implementação Explícita de Interface em C#<p>Alguns livros, como por exemplo o Visual C# 2008 passo-a-passo, recomendam fortemente o uso de implementação explícita de interface. </p> <p>Considere o código; <br /></p> <pre class="brush:csharp">interface IExemplo
{
void imprime();
}
class ClasseA : IExemplo
{
public void imprime() { }
public void carrega() { }
}
class ClasseB : IExemplo
{
void IExemplo.imprime() { }
public void carrega() { }
}
class Program
{
static void Main(string[] args)
{
ClasseA a = new ClasseA();
a.imprime();
a.carrega();
IExemplo b = new ClasseB();
b.imprime();
// O método "carrega()" é inacessível a "b"!
}
}</pre>
<p>A questão é: dessa forma, o objeto “b” não pode acessar o método “carrega()”, então, eu perco o acesso aos métodos próprios da classe ClasseB?</p>
<p>Não é bem assim...</p>
<p>Essa implementação é boa para o caso de uma classe implementar várias interfaces que podem ter métodos com a mesma assinatura.</p>
<p>Acompanhe mais um exemplo;</p>
<pre class="brush:csharp">interface IExemplo
{
void imprime();
}
class Classe : IExemplo
{
void IExemplo.imprime()
{
Console.WriteLine("Impressão da IExemplo");
}
void imprime()
{
Console.WriteLine("Impressão da classe");
}
static void Main(string[] args)
{
IExemplo ex = new Classe();
ex.imprime();
(ex as Classe).imprime();
Console.ReadKey();
}
}</pre>
<ul>
<li><font color="#008000">output </font></li>
<li><font color="#008000">Impressão da IExemplo </font></li>
<li><font color="#008000">Impressão da classe</font> </li>
</ul>
<ul>Não, você não perde acesso aos métodos da classe, mas programar com <strong>abstração</strong> leva a esse tipo de "problema" (se é que podemos chamar isso de problema).</ul>
<ul>O que você pode fazer é, já que a variável é do tipo interface, e a classe implementa essa interface, a variável pode sofrer casting pro tipo da classe, fazendo você "ganhar" acesso a tudo que a classe tem de métodos.</ul>
<ul>E sim, é muito mais limpo programar DESTA forma, do que criar um bilhão de classes com vários métodos diferentes e sair criando levas de objetos pra poder acessar métodos distintos quando tudo que você tem de fazer é criar uma abstract class ou uma interface. </ul> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com1tag:blogger.com,1999:blog-6003675157216544383.post-24906841922468747812010-01-13T03:09:00.001-02:002010-01-13T03:09:45.232-02:00Instalando Javadocs do Hibernate 3 no Netbeans<p><em><strong><strike><font color="#ce0000">*** Pode ter certeza, você NÃO vai achar uma dica dessas facilmente por aí!!! ***</font></strike></strong></em></p> <p>A <a title="https://www.hibernate.org/5.html" href="https://www.hibernate.org/5.html" target="_blank">documentação</a> do Hibernate é riquíssima e muito consistente, mas é ridículo ser obrigado a parar bruscamente o seu trabalho para recorrer ao website/pdf/chm, ou seja lá qual o meio de acesso que você usa para buscar informações ou tirar dúvidas, muitas vezes simples, na vasta documentação deste poderoso framework.</p> <p>Eu já cheguei a desistir de entender melhor as características de um determinado método depois de me perder nos milhares de tópicos.</p> <p>Esse processo trabalhoso se torna ainda mais desnecessário quando usamos uma ferramenta de rápido desenvolvimento, as famosas IDEs, como por exemplo o <a title="http://www.netbeans.org/" href="http://www.netbeans.org/" target="_blank">Netbeans</a>. Isso porque elas nos dão a possibilidade de acessar a documentação de qualquer biblioteca ou projeto diretamente no código, sem a necessidade de quebrar a linha de raciocínio só para descobrir quais são as sobrecargas (overload) para um determinado método. É fácil perceber isso quando usamos objetos da API do próprio Java, um exemplo seria o String.</p> <p>Aqui vai uma print screen com o javadoc do Hibernate já funcionando;</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiILDfwLqymycI3GYYJq3Jhuz79LPScyxoKcdydd40DMxRTAuSxQRquEKtYMbSxEUqzBKJSexQFb22_jUg75jShN-kbbW7UCSPzVfXwvYzH5qSt6zGU-5GqbI_mlptbNH53WSLaRGq6u3M/s1600-h/image%5B10%5D.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-dYrNHNRmTCTVqVlRA34gpuKCt_d4DIG2UtEYbpYc-FQAaUFEO-9cZfZc_poRMxPK4XFWApEaUsac04cQIQA6Uqx5VnF9O0U63BtxJLMtnNjFDIg3n28SFppGpeZ3YKnKBWP9Z5vk6FM/?imgmax=800" width="647" height="483" /></a> </p> <p>Resolvi fazer este tutorial quando percebi que não é fácil encontrar a documentação mais nova e muitos fóruns tem tópicos e tópicos com dúvidas sobre isso.</p> <p>Bom, chega de enrolação, vamos ao que interessa.</p> <p>Ferramentas usadas neste tutorial;</p> <ul> <li>* Netbeans 6.8 </li> <li>* Hibernate-distribution-3.3.2.GA </li> </ul> <p>Para fazer uso da documentação diretamente no código você precisa associar sua biblioteca (library) ou projeto a um arquivo Javadoc (.jar contendo toda a documentação) <u><font color="#0000ff">específico</font></u> daquela biblioteca ou projeto.</p> <p>Deste a versão 3.2.6 o Hibernate não vem com seu Javadoc (não me pergunte porque) e muitos fazem uso da documentação antiga, já seria de grande ajuda e claro que quebra o galho, mas eu não fiquei satisfeito e tratei de procurar pela versão mais nova.</p> <p>Ela se encontra aqui ==> </p> <p><a title="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-javadoc.jar" href="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-javadoc.jar">hibernate-core-3.3.2.GA-javadoc.jar</a></p> <p>Se quiser, aproveite também pra pegar o código fonte aqui ==> </p> <p><a title="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-sources.jar" href="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-sources.jar">hibernate-core-3.3.2.GA-sources.jar</a></p> <p>Crie um projeto no Netbeans e adicione as bibliotecas do Hibernate como de costume.</p> <ul> <li>Agora clique com o botão direito sobre o Projeto </li> <li>Selecione a opção Propriedades (Properties) </li> <li>Clique em Bibliotecas (Libraries). </li> </ul> <p>Muita atenção nessa parte...</p> <ul> <li>Clique sobre a biblioteca com a qual você quer adicionar o javadoc </li> <li>No caso do Hibernate 3.3.2 é a hibernate3.jar </li> <li>Do lado direito dessa mesma tela tem a opção Editar (Edit), clique nela </li> <li>Agora ficou fácil, né? é só clicar em Procurar (Search) </li> <li>Selecione o arquivo <a title="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-javadoc.jar" href="http://repository.jboss.org/maven2/org/hibernate/hibernate-core/3.3.2.GA/hibernate-core-3.3.2.GA-javadoc.jar">hibernate-core-3.3.2.GA-javadoc.jar</a> </li> <li>Marque OK em todas as telas e pronto! </li> </ul> <p>É só isso! Seu projeto já está pronto, faça os testes.</p> <p>Se tiver qualquer dúvida comente aqui que eu respondo o mais rápido possível.</p> <p>Obrigado pela visita e boa sorte!!!</p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com5tag:blogger.com,1999:blog-6003675157216544383.post-64693835229138069102010-01-12T01:07:00.005-02:002010-01-12T01:15:21.102-02:00Auto-Incremento no PostgreSQL<p>O banco de dados PostgreSQL não possui nativamente um tipo auto-incremento, mas podemos usar da malandragem pra dar um “jeitinho”...</p><p>Analise o código;</p><pre class="brush:sql">create table Produtos (
    id integer not null,
    descricao char(60),
    preco decimal (15,2),
    constraint primary key (id_produto)
);
</pre><p>Esse código compila normalmente numa base de dados do PostgreSQL, mas o campo <font color="#0000ff">id</font> da tabela <font color="#0000ff">Produtos</font> não será auto-incremento, ele apenas não aceita valores repetidos.</p><p>Existem, basicamente, duas maneiras de se criar um campo que gear um valor automaticamente.</p><p>1 - Você pode criar uma <font color="#0000ff">sequence</font>, da seguinte forma:</p><br />
<pre class="brush:sql">create sequence nome_da_sequence;
create table produtos (
    id_produto integer defeault nextval('nome_da_sequence') not null,
    descricao char(60),
    preco decimal (15,2),
    constraint primary key (id_produto)
);</pre><p>2 – Com a ajuda dos tipos seriais. Os tipos de dados <font color="#0000ff">serial</font> e <font color="#0000ff">bigserial</font> não são tipos verdadeiros, mas meramente uma notação conveniente para definir colunas identificadoras únicas (semelhante à propriedade AUTO_INCREMENTO existente em alguns outros bancos de dados).</p><pre class="brush:sql">create table Produtos (
    id serial not null,
    descricao char(60),
    preco decimal (15,2),
    constraint primary key (id_produto)
);</pre><p><br />
Isso fará com que uma <font color="#0000ff">sequence</font> seja criada automaticamente com o seguinte nome: produtos_id_seq. Você pode ver a estrutura da <font color="#0000ff">sequence</font> digitando no banco o comando: \d produtos_id_seq.</p><p>Boa Sorte!!!</p>Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-905662162229064272010-01-12T00:46:00.001-02:002010-01-12T00:46:56.833-02:00PostgreSQL no Windows Seven<p>Olá, recentemente eu estava fazendo alguns testes com um framework para persistência de dados em Java, o <strong><a title="Homepage do Hibernate" href="https://www.hibernate.org/" target="_blank">Hibernate</a></strong> (logo mais eu posto alguma coisa sobre ele) e percebi que um dos melhores bancos de dados neste cenário seria o <strong><a title="Homepage do PostgreSQL" href="http://www.postgresql.org/" target="_blank">PostgreSQL</a></strong>.</p> <p>O PostgreSQL sempre teve muita fama de ser o mais robusto banco de dados de código aberto, mas muitos, inclusive eu, acreditam que tamanha performance só pode ser alcançada em servidores Linux, mesmo assim têm de ser muito bem configurados. Ele também se sai bem em ambiente Windows, mas a diferença é enorme em comparação ao Linux.</p> <p>Bom, mas não é exatamente isso que quero propor neste post. </p> <p><em>Here i go</em>… Tive um pequeno contra-tempo durante a instalação deste banco no meu PC com <strong>Windows Seven</strong> e, apesar de simples, não foi fácil encontrar a resposta para o problema.</p> <p>Tentei por duas vezes e o instalador apresentava o mesmo erro;</p> <blockquote> <p><em>Não foi possível ler o arquivo postgresql.config. A instalação pode não ter sido completada com sucesso!</em></p> </blockquote> <p>A versão que eu usei foi a seguinte: <a href="http://www.enterprisedb.com/getfile.jsp?fileid=810" target="_blank">postgresql-8.4.2-1-windows.exe</a>.</p> <p>Apesar da incômoda mensagem de erro, o instalador terminou o processo, mas não iniciou o serviço do PostgreSQL automaticamente e, qual não foi a minha surpresa, ao tentar fazer isso manualmente simplesmente não dava, tentei até com usuários diferentes, mas era impossível, o serviço não iniciava e em virtude disso, é claro, não foi possível fazer nenhuma conexão com meu mais novo banco de dados.</p> <p>Acontece que o culpado<strike><em>, de novo,</em></strike> é nosso “grande amigo” UAC – User Account Control, mas calma!! Não precisa desativa-lo só pra uma simples instalação. Basta clicar com o botão direito sobre o instalador do PostgreSQL e selecionar a opção “Executar como Administrador”, pronto agora é possível terminar o processo de instalação com sucesso, ufa.</p> <p>Ah, e ele inicia o serviço automaticamente, não se preocupe com isso. XD</p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com2tag:blogger.com,1999:blog-6003675157216544383.post-45390389892362773642010-01-07T23:47:00.001-02:002010-01-07T23:47:42.240-02:00Como funciona o Windows<p> </p> <p>Um vídeo superdivertido que achei por aí. É bem didático até, mostra como “exatamente” é o funcionamento do Sistema Operacional Microsoft Windows.</p> <p>O interessante é a maneira totalmente descontraída e descompromissada que o vídeo narra os procedimentos “dentro” de um computador.</p> <p>Só pra se ter uma idéia da doidera, o carinha que parece um feijão preto aí embaixo representa o processador e corre pra lá e pra cá freneticamente tentando solucionar os problemas para o usuário e, claro, nem tudo dá certo...</p> <p> </p> <div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:95eb432f-58fb-4382-8600-ecf8a5a6322d" class="wlWriterEditableSmartContent"><div id="67c291d5-2e9f-4b1b-8a98-0fc3c8e1c6d6" style="margin: 0px; padding: 0px; display: inline;"><div><a href="http://www.youtube.com/watch?v=GPyhEz-XEFo" target="_new"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2YnsVx1oregAq-7lAMlkww54JK4ukjSXAT8YHSOBa_TUTcOcYczhMh3OfONzBb6kbqxVGDAq0XEjj5xTvmx0KxAlCVPd9PflmXi6HCSxRljcNFxCIf31AQ7ox6fx67sV5TNxfIP9GViI/?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('67c291d5-2e9f-4b1b-8a98-0fc3c8e1c6d6'); downlevelDiv.innerHTML = "<div><object width=\"425\" height=\"355\"><param name=\"movie\" value=\"http://www.youtube.com/v/GPyhEz-XEFo&hl=en\"><\/param><embed src=\"http://www.youtube.com/v/GPyhEz-XEFo&hl=en\" type=\"application/x-shockwave-flash\" width=\"425\" height=\"355\"><\/embed><\/object><\/div>";" alt=""></a></div></div></div> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-20042335017651935742010-01-07T23:16:00.001-02:002010-01-07T23:29:50.252-02:00LOST: A última ceia<p>Aproveitando que falta menos de um mês para a 6ª e última temporada de <strong>LOST</strong>, a <strong>ABC</strong> liberou uma imagem que está deixando fãs malucos mundo afora.</p> <p>Uma alusão à <strong>Santa Ceia</strong> de <strong>Leonardo Da Vinci</strong> foi criada com os principais personagens, na frente de uma ruína das Estações Dharma, com a comida obviamente sendo da <strong>Iniciativa Dharma</strong>.</p> <p>Que comecem as teorias!</p> <p> </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2OO8XLsvjV01LxKfp9sdVQmckTrnc3rwmhSWB4APjPOTBoHgtTL3I3bWjugPp3KbcFEEIzrPH0iYesmfHvz7iQSaA67BlEXfASZ3WB9Ti44Cr05sJnSO-wyiSxjIin6_n8GICWSNjWfM/s1600-h/image%5B7%5D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="Clique para ampliar a imagem" border="0" alt="Clique para ampliar a imagem" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNAZ7HleKVbpWOdnyjBqJxUFHGycttuHXqhpX9HQ6u_jBsPzuicDu2FlULsa3rsx3tc4kCuBazc4HxCtrhiOgjihjgjinKcgp2924eOjW4PAYwYjb1S8HLBBMh20LTsLYmEVZ3syQCNmc/?imgmax=800" width="644" height="431" /></a></p> <p><em>(clique para ampliar)</em></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-35919256372738647932010-01-07T22:48:00.001-02:002010-01-07T22:48:22.565-02:00Chines joga uma bicicleta contra dois assaltantes em uma Scooter<p>Hahaha, essa foi demais, após um assalto dois meliante fogem com a ajuda de uma Scooter, mas eles não contavam com astúcia de homem.</p> <p>Reparem no vídeo, ele esperou o momento exato para simplesmente jogar sua bicicleta contra os assaltantes...</p> <p>Se fosse por aqui no Brasil, duvido muito que alguém teria tanta coragem.</p> <p> </p> <div style="padding-bottom: 0px; padding-left: 0px; width: 425px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:b99f0149-69b6-4578-80a9-1309cac0d96e" class="wlWriterEditableSmartContent"><div id="66443fb7-e9bc-4c6d-b02d-07e45938264b" style="margin: 0px; padding: 0px; display: inline;"><div><a href="http://www.youtube.com/watch?v=tqdZFuGt1I4" target="_new"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirPXhrVARs49v4JCtN8Ix-LZZcZqD1DljDKq9H8Mg8FoR6_ETngbPMY9-I7U_6iF7MPTTlQnL1WYmC20h4JwaJr6JvXImnxKFCnCORDTukrUnVL7QmZJfwIhn2A2hBvGFWUyyZrKIgNbo/?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('66443fb7-e9bc-4c6d-b02d-07e45938264b'); downlevelDiv.innerHTML = "<div><object width=\"425\" height=\"355\"><param name=\"movie\" value=\"http://www.youtube.com/v/tqdZFuGt1I4&hl=en\"><\/param><embed src=\"http://www.youtube.com/v/tqdZFuGt1I4&hl=en\" type=\"application/x-shockwave-flash\" width=\"425\" height=\"355\"><\/embed><\/object><\/div>";" alt=""></a></div></div><div style="clear:both;font-size:.8em;">Chines joga uma bicicleta contra dois assaltantes em uma Scooter</div></div> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-35065392084318932372010-01-07T22:25:00.001-02:002010-01-07T23:33:04.215-02:00FinanceDesktop - Software gratuito para gestão financeira<p>E aqui vai mais uma dica legal, dessa vez é um programa interessante para quem gostar de manter suas contas em dia e de fácil acesso através do computador.</p> <p>O FinanceDesktop é um software gratuito para gestão financeira, com opções que vão além da gestão de gastos familiares, com funções para organizar investimentos e aplicações, múltiplas contas e dados que são atualizados constantemente.</p> <p> <br />O software requer um cadastro no site e conexão de internet ativa, já que vários dados e até notícias são carregados automaticamente pelo programa, centralizando todas as informações e tarefas financeiras do usuário.</p> <p> <br />O FinanceDesktop possui um calendário, permitindo que todos os compromissos e gastos do usuário sejam definidos com precisão. Para não errar nas contas, o software possui o ícone de calculadora, que na verdade é um atalho para a calculadora do Windows.</p> <p> <br />Mesmo com uma interface limpa, o funcionamento do FinanceDesktop não é dos mais intuitivos, exigindo dedicação do usuário para se familiarizar com seu funcionamento, mas não se assuste com isso, depois de pegar o jeito, o que não deve levar mais do que alguns minutos, fica fácil a manutenção do dados.</p> <p>Um dos trunfos é com certeza o sistema de relatórios totalmente personalizável como se pode ver na tela abaixo.</p> <p>Financedesktop - Site do fabricante: <a title="http://www.financedesktop.com.br/" href="http://www.financedesktop.com.br/">http://www.financedesktop.com.br/</a></p> <p> <a title="Financedesktop - Site do fabricante" href="http://www.financedesktop.com.br/" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; border-top: 0px; border-right: 0px" title="Financedesktop - Site do fabricante" border="0" alt="Financedesktop - Site do fabricante" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqJaRF8FtTu4cf2U2bIDXY34Ajeio3atcHPRmAGFdM8To9tsLLc8iJELAd0hV2BQE7YjC_4fCrRBqVy7uwgJ9TFU_fM6bgP3oF_AayLZXTH3ull6WzEwSHRGBitnJsTUvTzp9h3lsGj-s/?imgmax=800" width="644" height="459" /></a></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-16125144825379825192010-01-05T23:54:00.001-02:002010-01-05T23:54:26.608-02:00Entendendo o Garbage Collector<p>Estava lendo o blog do <a href="http://weblogs.asp.net/andrenobre">André Nobre</a> e achei ótimos artigos sobre o funcionamento do Garbage Collector, é obrigatório para todo desenvolvedor entender o funcionamento do GC e para quem não entende ou ainda ficou alguma dúvida é leitura obrigatória.</p> <p><a href="http://weblogs.asp.net/andrenobre/archive/2008/09/29/windbg-memory-ii-garbage-collector-i.aspx">Garbage Collector I</a> <br /><a href="http://weblogs.asp.net/andrenobre/archive/2008/10/20/windbg-memory-ii-garbage-collector-ii.aspx">Garbage Collector II</a></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-11323013380650862702010-01-05T14:47:00.001-02:002010-01-05T14:47:11.386-02:00Gerador CPF / CNPJ / Cartão de Crédito<p>No <a title="Gerador de CPF e CNPJ para testes de software" href="http://wormholebr.blogspot.com/2010/01/gerador-de-cpf-e-cnpj-para-testes-de.html">último post</a> eu falei sobre um <a title="Gerador de CPF e CNPJ para testes em sistemas" href="http://www.geradordecpf.com.br/">Gerador de CPF e CNPJ</a> muito interessante, mas era um serviço online e não permitia acesso ao código fonte.</p> <p>E como eu sou bastante curioso, pesquisei bastante e encontrei um <a title="Gerador CPF / CNPJ / Cartão de Crédito" href="http://www.javadesk.org/?p=108">projeto</a> construído em JAVA, é um projeto simples, mas poderoso e de código aberto.</p> <p>Ah, e ele também gera números de cartão de crédito! Impressionante.</p> <p>Descrição do <a title="Gerador CPF / CNPJ / Cartão de Crédito" href="http://www.javadesk.org/?p=108">autor</a>:</p> <blockquote> <p>Como diz o ditado: a necessidade faz o sapo pular, precisei fazer este programa, primeiro como é de costume, busca no google para ver se já não existe algo pronto, acabei encontrado um conjunto de classes intitulada: <strong>utilities4</strong>, que até agora não sei quem é ou são os desenvolvedores, muita coisa pronta, algumas pequenas modificações para adaptar a realidade do que eu precisava e feito, um programa para gerar CPF, CNPJ e números de Cartões de Crédito. O Projeto foi desenvolvido utilizando o <a href="http://www.netbeans.org/downloads/index.html">Netbeans 6.5</a>, utilizei alguns conceitos e classes interessantes para que quiser aprender um pouco mais de JAVA, principalmente a utilização de Thread´s e controle da Área de Transferência. Estou disponibilizando o sistema com o código fonte, se alguém tiver uma sugestão de melhoria, ou melhorar o código, poste seu comentário. Lembrando que a recomendação da utilização deste projeto é somente para aprendizagem e de testes.</p> </blockquote> <p> </p> <p>Disponibilizei pra download no seguinte <a title="Gerador CPF / CNPJ / Cartão de Crédito" href="http://cid-6b7b6c2e5a4c94ae.skydrive.live.com/self.aspx/.Public/GerDoc.zip">link</a> (183 KB):</p> <p><iframe style="padding-bottom: 0px; background-color: #fcfcfc; padding-left: 0px; width: 98px; padding-right: 0px; height: 115px; padding-top: 0px" title="Preview" marginheight="0" src="http://cid-6b7b6c2e5a4c94ae.skydrive.live.com/embedicon.aspx/.Public/GerDoc.zip" frameborder="0" marginwidth="0" scrolling="no"></iframe></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-46710508681631914762010-01-05T14:24:00.001-02:002010-01-05T14:24:43.526-02:00Gerador de CPF e CNPJ para testes de software<p>Aqui vai mais uma preciosa dica, o <a title="Gerador de CPF e CNPJ para testes de software" href="http://www.geradordecpf.com.br" rel="lalala">Gerador de CPF e CNPJ</a> possibilita a criação aleatória de Humanos (nome e CPF válido), e Empresas (razão social e CNPJ válido) para testes em sistemas.</p> <p>O projeto foi desenvolvido para auxiliar o preenchimento de cadastros de pessoa física e jurídica em sistemas. Todas as informações geradas pelo gerador são fictícias, claro, mas é uma mão na roda na hora fazer testes de validação de dados em sistemas.</p> <p>Projetos parecidos existem aos montes por aí, mas vai ser difícil encontrar outro tão rápido e consistente. Ele permite gerar até 10 indivíduos de cada vez, incluindo os nomes.</p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-73489954190945514112010-01-05T03:26:00.001-02:002010-01-07T21:21:15.132-02:00Windows 7 GodMode<p>Se eu der somente UMA dica em 2010 e for esta, já terá valido o ano. </p> <p>É uma espécie de ovo de páscoa muito ÚTIL, escondido pela Microsoft e que facilita muito a vida de um usuário do Windows 7: <strong>GodMode</strong>. Não tem “dá munição infinita” e “todas as armas”, mas fora isso...</p> <p>O truque é simples: Crie uma pasta, em qualquer lugar. Renomeie para:</p> <blockquote> <p><strong><em></em></strong></p> <p><strong><em>GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}</em></strong></p> <p><strong><em></em></strong></p> </blockquote> <p>ou, se preferir, o nome abaixo tem o mesmo efeito<strike><em>, porém, menos charmoso</em></strike>;</p> <blockquote> <p><em><strong></strong></em></p> <p><em><strong>SuperControlPanel.{ED7BA470-8E54-465E-825C-99712043E01C}</strong></em></p> <p><strong><em></em></strong></p> </blockquote> <p>Pronto. Você passa a ter um ícone que abre uma lista de todas as ações de administração e manutenção de seu computador, em uma única, simples e objetiva listagem. Posso calcular JÁ que isso irá me economizar horas e horas até o final do ano.</p> <p> </p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSfcIEvCadYYZSmsxhO2dVF7IvFeGPqAmkFISAMnozFeqe5gABIV1zkr0bNYEbGwbKY7JleeIXNJIEgTycCxkya4jx4_vhbjYqGsyqVyzIlYcNAJT5smrXmBpjn6YT9WmrozInDmANoQI/s1600-h/ScreenShot001%5B63%5D.jpg"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="ScreenShot001" border="0" alt="ScreenShot001" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNNRJ4VTYaJ1iRKwyl9LXycE_wPBo49c4bfR2Hq-lEqz7LWbgbce0ie3oWdzYxCa9X73V8d_IifjCRXGr0UyhySWGKxY_EwduAy4iNgmofJXB0uKYbFwO-0eGiMYtVHTuwUZlA0jtyvmQ/?imgmax=800" width="604" height="484" /></a></p> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-10695054437964083402010-01-04T18:55:00.001-02:002010-01-05T02:43:05.591-02:00Tipos anônimos e Linq queryNem sempre tipos anônimos são a melhor opção para armazenar o resultado de uma Linq query. <br /> <br />Os tipos anônimos (Anonymous Types) são realmente muito práticos numa ling query. Mas e quando você precisa retornar um elemento dessa query? <br /> <br />Criar um método para retornar um tipo anônimo poderia ser uma solução, mas eu prefiro manter a característica mais marcante da linguagem C#, o “strong typed language” ou “linguagem fortemente tipada”. <br /> <br />No exemplo abaixo, eu estou criando uma nova classe (ResultSet) que vai servir apenas para armazenar o resultado de uma linq query sobre uma lista de fornecedores personalizada. <br /> <br /> <br /> <pre class="brush:csharp">using System;
using System.Collections.Generic;
using System.Linq;
namespace TiposAnonimos
{
class Program
{
//Classe de persistencia
class Fornecedor
{
public int ID { get; set; }
public string Nome { get; set; }
public string CNPJ { get; set; }
public string Telefone { get; set; }
public string Rua { get; set; }
public string Bairro { get; set; }
public string Cidade { get; set; }
public string CEP { get; set; }
public string Estado { get; set; }
}
//Defina uma classe para conter o resultado da linq query
class ResultSet
{
public int Codigo { get; set; }
public string Nome { get; set; }
public string CNPJ { get; set; }
}
public static void Main(string[] args)
{
Fornecedor f1 = new Fornecedor();
//Populando uma lista de fornecedores
//Não vou preencher todos os dados por uma questão de espaço
List<Fornecedor> lista = new List<Fornecedor>()
{
new Fornecedor()
{ID=1, Nome="Fornecedor1", CNPJ="11.111.111/1111-11"},
new Fornecedor()
{ID=2, Nome="Fornecedor2", CNPJ="22.222.222/2222-22"},
new Fornecedor()
{ID=3, Nome="Fornecedor3", CNPJ="33.333.333/3333-33"},
new Fornecedor()
{ID=4, Nome="Fornecedor4", CNPJ="44.444.444/4444-44"},
new Fornecedor()
{ID=5, Nome="Fornecedor5", CNPJ="55.555.555/5555-55"},
new Fornecedor()
{ID=6, Nome="Fornecedor6", CNPJ="66.666.666/6666-66"},
new Fornecedor()
{ID=7, Nome="Fornecedor7", CNPJ="77.777.777/7777-77"},
new Fornecedor()
{ID=8, Nome="Fornecedor8", CNPJ="88.888.888/8888-88"},
new Fornecedor()
{ID=9, Nome="Fornecedor9", CNPJ="99.999.999/9999-99"},
};
//Em fim, a ling query que retorna apenas alguns dados essenciais
//Ideal para preencher um DataGridView, por exemplo
var query = (from f in lista
select new ResultSet()
{
Codigo = f.ID,
Nome = f.Nome,
CNPJ = f.CNPJ
}).ToList();
//Mostra os resultados na tela
query.ForEach(f =>
{
Console.WriteLine("Codigo: {0} || Nome: {1} || CNPJ: {2}",
f.Codigo, f.Nome, f.CNPJ);
});
Console.ReadKey();
}
}
}//desconsidere essa linha, é um bug do HTML (O_o)</pre> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0tag:blogger.com,1999:blog-6003675157216544383.post-74623139221125453702010-01-04T17:25:00.001-02:002010-01-05T02:07:09.685-02:00Validar CPF em Java 2<pre class="brush:java">
/**
* ValidaCPF.java
*
* Criado em 4 de janeiro de 2010, 16:00
*/
package utils;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JTextField;
/**
* A classe ValidaCPF é usada para a validação de CPF em campos de
* textos em uma interface gráfica. Esta classe deve ser usada
* como o verificador de entrada de dados em componentes como um
* JTextField.
*
* @author Luis Fernando de Souza Santos
*
*/
public class ValidaCPF extends InputVerifier {
/** (non-Javadoc)
* @see javax.swing.InputVerifier#verify(javax.swing.JComponent)
*/
@Override
public boolean verify(JComponent component) {
return verificaCampo(component);
}
/**
* O método verificaCampo faz a efetiva verificação do CPF.
*
* @param component o componente do tipo JTextField.
* @return true se o CPF é válido, false caso contrário.
*/
protected boolean verificaCampo(JComponent component) {
boolean eValido = false; // Assume que o CPF é inválido
String cpf = null;
if (component instanceof JTextField) {
JTextField tmp = (JTextField) component;
cpf = tmp.getText();
}
else {
return eValido;
}
// Os caracteres do CPF
char[] caracteres = cpf.toCharArray();
// Transformados em dígitos
int[] digitos = new int[caracteres.length];
// Variáveis temporárias
int somaNove = 0, somaDez = 0;
// Os dígitos de verificação do CPF
int digitoDez = 0, digitoOnze = 0;
if (caracteres.length != 11) {
return eValido; // O CPF deve ter exatamente 11 dígitos.
}
for (int count = 0; count < caracteres.length; count++) {
if (!Character.isDigit(caracteres[count])) {
return eValido; // Se não for um dígito não é um CPF válido.
}
}
// Transforma os caracteres em dígitos numéricos
for (int count = 0; count < caracteres.length; count++) {
digitos[count] = Character.getNumericValue(caracteres[count]);
int valor = 0;
// Soma os nove primeiros dígitos multiplicados
// por um valor determinado.
if (count < 9) {
valor = digitos[count] * (11 - (count + 1));
somaNove += valor;
}
}
// Usa a soma para calcular o primeiro dígito verificador.
digitoDez = 11 - (somaNove % 11);
if (digitoDez > 9) {
digitoDez = 0;
}
// Se o décimo dígito calculado for diferente do décimo dígito passado
// o CPF não é válido.
if (digitoDez != digitos[9]) {
return eValido;
}
// Soma os 10 primeiros dígitos multiplicados por um valor
// determinado.
for (int count = 0; count < digitos.length; count++) {
int valor = 0;
if (count < 10) {
valor = digitos[count] * (12 - (count + 1));
somaDez += valor;
}
}
// Usa a soma para calcular o segundo dígito verificador.
digitoOnze = 11 - (somaDez % 11);
if (digitoOnze > 9) {
digitoOnze = 0;
}
// Se o décimo primeiro dígito for diferente do dígito passado,
// o CPF não é válido.
if (digitoOnze != digitos[10]) {
return eValido;
}
// Se passou por todos os testes o CPF é válido
eValido = true;
return eValido;
}
}</pre> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com2tag:blogger.com,1999:blog-6003675157216544383.post-24223365271193983082009-10-28T03:28:00.000-02:002010-01-05T01:57:13.260-02:00Validar CPF em Java 1<p>Classe Java com os métodos de validação de um CPF, conforme as regras da Receita Federal. Para usá-la faça as adaptações de acordo com o seu projeto. </p> <br /> <br /> <pre class="brush:java">
import java.util.*;
/**
* Classe com método para validação de CPF
*
* Pode ser utilizada livremente e modificada para se integrar à sistemas
* mais complexos.
*
* @version 1.0
* @since 05/06/2003
*/
public class Cpf {
/** Realiza a validação do CPF.
*
* @param strCPF número de CPF a ser validado
* @return true se o CPF é válido e false se não é válido
*/
static public boolean CPF (String strCpf )
{
int d1, d2;
int digito1, digito2, resto;
int digitoCPF;
String nDigResult;
d1 = d2 = 0;
digito1 = digito2 = resto = 0;
for (int nCount = 1; nCount < strCpf.length() -1; nCount++)
{
digitoCPF = Integer.valueOf (strCpf.substring(nCount -1,
nCount)).intValue();
//multiplique a ultima casa por 2 a seguinte por 3 a
//seguinte por 4 e assim por diante.
d1 = d1 + ( 11 - nCount ) * digitoCPF;
//para o segundo digito repita o procedimento incluindo
//o primeiro digito calculado no passo anterior.
d2 = d2 + ( 12 - nCount ) * digitoCPF;
};
//Primeiro resto da divisão por 11.
resto = (d1 % 11);
//Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito é
//11 menos o resultado anterior.
if (resto < 2)
digito1 = 0;
else
digito1 = 11 - resto;
d2 += 2 * digito1;
//Segundo resto da divisão por 11.
resto = (d2 % 11);
//Se o resultado for 0 ou 1 o digito é 0 caso contrário o digito
//é 11 menos o resultado anterior.
if (resto < 2)
digito2 = 0;
else
digito2 = 11 - resto;
//Digito verificador do CPF que está sendo validado.
String nDigVerific = strCpf.substring
(strCpf.length()-2, strCpf.length());
//Concatenando o primeiro resto com o segundo.
nDigResult = String.valueOf(digito1) + String.valueOf(digito2);
//comparar o digito verificador do cpf com o
//primeiro resto + o segundo resto.
return nDigVerific.equals(nDigResult);
}
/* Use este trecho para testar a classe
public static void main(String[] args) {
System.out.println( CPF("04624193806") );
}
*/
}</pre>
<br />fonte: <a href="http://www.vivaolinux.com.br/script/Codigo-Java-para-validar-CPF" bitly="BITLY_PROCESSED">Viva o Linux</a> Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com2tag:blogger.com,1999:blog-6003675157216544383.post-79458645428678716822009-10-28T02:29:00.000-02:002009-10-28T02:29:58.040-02:00Primeiro postEste é um post teste para o meu novo blog, o Wormhole.<br />
A minha intenção é criar uma central de dicas e truques relacionados às linguagens de programação <a bitly="BITLY_PROCESSED" href="http://msdn.microsoft.com/pt-br/vcsharp/default.aspx">C#</a> e <a bitly="BITLY_PROCESSED" href="http://java.sun.com/">JAVA</a>.Luis Fernandohttp://www.blogger.com/profile/05994290248194202256noreply@blogger.com0