<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-120161195353369613</id><updated>2012-03-14T05:59:56.676-07:00</updated><category term='mobile'/><category term='Python'/><category term='Nerdices'/><category term='poo'/><category term='Telefonica'/><category term='Experts'/><category term='design patterns'/><category term='Emprego TI Vaga'/><category term='javascript'/><category term='Não categorizado'/><category term='nfe'/><category term='apple'/><category term='.Net'/><category term='singleton'/><category term='Lazarus'/><category term='Suporte'/><category term='tecnologia'/><category term='música'/><category term='open source'/><category term='fringe'/><category term='api'/><category term='GNU'/><category term='metaprogramação'/><category term='firebird'/><category term='Ajax'/><category term='Meus patrões precisam ler isso'/><category term='Protesto'/><category term='Web'/><category term='delphi'/><category term='Anime'/><category term='developers'/><category term='grupos'/><category term='AMS'/><category term='trollface'/><category term='Galaxy S'/><category term='Atendimento'/><category term='gráficos'/><category term='Eventos'/><category term='Humor'/><category term='Inglês'/><category term='reflexão'/><category term='prism'/><category term='easter egg'/><category term='Site aos Pedaços'/><category term='Programação'/><category term='Speedy'/><category term='dicas'/><category term='ASp.Net'/><category term='games'/><category term='introspecção'/><category term='oracle'/><category term='C#'/><category term='PHP'/><category term='segurança'/><category term='Assembly'/><category term='Reflexões'/><category term='sql'/><category term='Básico'/><category term='HTML'/><category term='Debug'/><category term='linguagem'/><category term='livros'/><category term='SO'/><category term='Camisetas Nerds'/><category term='banco de dados'/><category term='Pascal'/><category term='Api do Windows'/><category term='Dicas Básicas Windows'/><category term='e-commerce'/><title type='text'>Vitor Rubio Developer - Dicas de programação</title><subtitle type='html'>Dicas de Delphi, C#, javascript etc</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default?start-index=101&amp;max-results=100'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>168</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6272297383422514126</id><published>2012-02-22T04:26:00.000-08:00</published><updated>2012-02-22T04:26:10.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASp.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Method Error 500 - Maximum Length Exceeded with AJAX web service call</title><content type='html'>Eu estava codificando um &amp;nbsp;clássico formulário de cadastro, e resolvi usar Cascading Dropdown do Ajax Control Toolkit para a seleção de Estados e Cidades.&lt;br /&gt;O conceito é simples: ao selecionar um Estado no ddlEstados o ddlCidades será populado apenas com as cidades desse estado.&lt;br /&gt;&lt;br /&gt;O problema se manifestou da seguinte forma: para os estados que continham mais cidades, como MG, o ddlCidades era populado apenas com a mensagem "Method Error 500", porém essa não era uma exception disparada, e não era possível debugar o projeto e encontrar o disparo da exception. (Talvez se eu usasse o source do Ajax Control Toolkit em vez da biblioteca compílada seria possível debugar).&lt;br /&gt;&lt;br /&gt;Tudo indicava que a exception estava sendo tratada, e no tratamento ela escrevia esse erro 500 nos itens.&lt;br /&gt;&lt;br /&gt;Esse problema é causado porque existe um limite máximo de itens JSON que uma página pode mandar ou receber. Para alterar esse valor deve-se acrescentar as seguintes linhas no web.config:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;system.web.extensions&gt;&lt;br /&gt;  &lt;scripting&gt;&lt;br /&gt;    &lt;webservices&gt;&lt;br /&gt;       &lt;jsonserialization maxjsonlength="5000000"&gt;&lt;br /&gt;    &lt;/jsonserialization&gt;&lt;/webservices&gt;&lt;br /&gt;  &lt;/scripting&gt;&lt;br /&gt;&lt;/system.web.extensions&gt;&lt;br /&gt;&lt;/pre&gt;Lembre-se que esse 5000000 é um exagero, apenas de exemplo. Dependendo do caso 2000 está de  bom tamanho. &lt;br /&gt;&lt;br /&gt;Links que podem ser úteis:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx"&gt;http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/CascadingDropDown/CascadingDropDown.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Walkthrough/CCDWithDB.aspx"&gt;http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/Walkthrough/CCDWithDB.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://harriyott.com/2007/07/method-error-500-maximum-length.aspx"&gt;http://harriyott.com/2007/07/method-error-500-maximum-length.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have Fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6272297383422514126?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6272297383422514126/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2012/02/method-error-500-maximum-length.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6272297383422514126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6272297383422514126'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2012/02/method-error-500-maximum-length.html' title='Method Error 500 - Maximum Length Exceeded with AJAX web service call'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-7087931484007713831</id><published>2012-02-15T13:16:00.001-08:00</published><updated>2012-02-15T13:16:33.773-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emprego TI Vaga'/><title type='text'>Empregos DEV - Lá e de volta outra vez!</title><content type='html'>&lt;br /&gt;Pois é pessoAll,&lt;br /&gt;Saudades de vocês .... mais ou menos&lt;br /&gt;&lt;br /&gt;Passei uns bons 3 ou 4 meses sem postar nada (e com minha vida digital totalmente jogada às traças).&lt;br /&gt;&lt;br /&gt;Para me desculpar com meus (poucos) leitroes: é que eu fui demitido. Sim, é frustrante, e pode acontecer com qualquer um. Só que eu fui demitido em uma época em que além de uma fatura medonha de cartão de crédito eu tinha (e ainda tenho) um TCC da pós graduação para fazer.&lt;br /&gt;&lt;br /&gt;Fiquei os 45 primeiros dias fazendo de 2 a 3 entrevistas por dia durante o dia, e a noite me candidatanto a TODAS as vagas possíveis.&lt;br /&gt;&lt;br /&gt;Depois entrei em uma empresa chamada Lider Telecom, que presta serviço para a Telefônica (sim, eu me tornei &lt;a href="http://manifestoderepudioatelefonica.blogspot.com/"&gt;aquilo que mais odeio na minha vida&lt;/a&gt;, e todo dia me auto flagelo com uma agulha de tricô incandescente direto no fígado.)&lt;br /&gt;Nessa empresa tenho que entrar as 8:00, sair as 18:00 todo dia, sem horário flexível, sem atrasos, sem carnaval, com hora extra na conta do abreu e .... já entendeu né?&lt;br /&gt;Sem contar que a empresa fica a 1:30 h da minha casa. Acordar todo dia as 5:30 para conseguir chegar no trampo as 8:00 pegando a linha vermelha do inferno lotada e o Cidade Tiradentes &amp;lt;-&amp;gt; Metrô Penha é tão agradável quanto uma dose de quimioterapia. (não exagerei na hipérbole, quem me conhece sabe porquê).&lt;br /&gt;&lt;br /&gt;Por isso o blog ficou para as cucuias.&lt;br /&gt;&lt;br /&gt;Mas isso foi bom, aprendi um monte de coisas nessa busca por emprego, e vou deixar as dicas aqui:&lt;br /&gt;&lt;br /&gt;1) Todas as dicas que você já viu em revistas da área de RH, sites etc são válidas, porém nossa área tem umas peculiaridades interessantes.&lt;br /&gt;2) Vestimenta: modéstia e bom juízo sempre. Mesmo se você for um &lt;strike&gt;nerd&lt;/strike&gt; programador jovem que não terá contato com clientes e fornecedores, eu garanto que um terno nunca será a vestimenta errada, peque por excesso. Ainda mais se você for um velho obeso mórbido de 400 quilos como eu, pega mau aparecer de calça jeans e camiseta "nerdpower" ou "bsod" na entrevista, de boa, um terno emagrece.&lt;br /&gt;3) Faça um cartão pessoal. É bom, bonito, elegante, mostra suas habilidades e seu interesse comercial, é um mini-cv e tem os seus contatos sempre à mão. Eu entreguei "uma pá", e como isso é vendido em doses de 1000, eles estão se multiplicando em meu armário.&lt;br /&gt;5) Seja muito atento a listas enumeradas que pulam um número.&lt;br /&gt;6) Não, você não tem inglês fluente, ainda mais se quem for entrevistas você em "inglês" for um argentino, ou um texano.&lt;br /&gt;7) Fuja de PJ, a não ser que você queira mesmo (e muito) abrir uma empresa e tocar seu próprio negócio. Muita dor de cabeça com impostos e compromissos fiscais.&lt;br /&gt;8) Fuja de cooperativas igual o diabo foge da cruz.&lt;br /&gt;9) Tenha um CV em inglês.&lt;br /&gt;10) Tenha um segundo CV resumido. Principalmente se você for entrevistado por várias pessoas da empresa, deixe o CV mais técnico com a equipe técnica ou com quem faz a pré seleção, e o CV resumido, com formação e qualidades pessoais/profissionais você entrega para o pessoal administrativo/RH.&lt;br /&gt;Eu programo em um monte de linguagens (algumas mais outras menos), conheço um monte de tecnologias e bancos de dados, assim como você. Não dá pra colocar tudo isso no CV, polui muito, além disso eu posso programar até em Fortran (que eu nunca tentei) tendo acesso ao google e um bom livro. Além disso tecnologias no CV confundem o pessoal de RH.&lt;br /&gt;Já vi funcionário de RH despensando um CV que constava habilidades em C# porque a empresa estava precisando de .Net (se o cara tivesse escrito .Net em vez de C# estava empregado.) Vi também a mesma pessoa dispensar um cara mestre em Interbase porque ela precisava de alguém fera em Firebird (WTF? o.O). Ou seja, você pode falar qualquer abobrinha para essas pessoas do RH porque elas são totalmente desqualificadas para julgar, avaliar ou medir um profissional de TI, principalmente de desenvolvimento de software. &lt;br /&gt;11) Um portfólio vale mais que um currículo. Se você tiver blog, sites na web, códigos, componentes e programas feitos por você mostre, inclusive o fonte, não deixe de mostrar o seu estilo de codificação. Mesmo que você não seja contratado isso pode render boas sugestões.&lt;br /&gt;&lt;br /&gt;Alguns sites que você talvez já conheça e que são bons (ou não) para arranjar emprego.&lt;br /&gt;&lt;br /&gt;Monster --&amp;gt; &lt;a href="http://inicio.monster.com.br/"&gt;http://inicio.monster.com.br/&lt;/a&gt;&lt;br /&gt;O sistema é muito bem feito, mas falta um link para o seu profile, para você poder entregar o link em vez do CV. Falta um http://inicio.monster.com.br/SeuNome/ sabe? Fora isso o CV fica muito bem diagramado nele, ele tem muitas opções e informações para preencher, e muitos campos. Dá um certo trabalho preencher, mas no final você terá um CV em inglês, uma carta de apresentação e por aí vai.&lt;br /&gt;&lt;br /&gt;Catho --&amp;gt; &lt;a href="http://www.catho.com.br/"&gt;http://www.catho.com.br/&lt;/a&gt;&lt;br /&gt;Uma droga. Resumindo é isso. Não que o sistema deles seja ruim, muito pelo contrário, o sistema é o melhor, mas é bom para quem quer vagas administrativas, liderança e assim por diante. Na parte técnica/tecnológica tem muitas vagas falsas, e não adianta denunciar.&lt;br /&gt;Já cheguei a pegar vaga oferencendo salário de 13.000 CLT e na hora da entrevista era 4.500 PJ. Ou oferecendo salário de 6.000 CLT e nos campos customizados (que as empresas põe para você preencher dados que elas julgam relevantes e que não tem no cadastro padrão) perguntam qual sua pretenção salarial PJ.&lt;br /&gt;Fora isso a amostra grátis/degustação de 7 dias não rende entrevista nenhuma, e se você esquecer de cancelar você terá de pagar. E quem, em sã consciência, estando &lt;strike&gt;fodido&lt;/strike&gt;&amp;nbsp;desempregado gastaria dinheiro em um serviço que teve 7 dias para mostrar resultados e provou que não funciona? Você pode procurar meu CV lá, está mais apresentável que na Monster.&lt;br /&gt;&lt;br /&gt;APInfo --&amp;gt; &lt;a href="http://www.apinfo.com/"&gt;http://www.apinfo.com/&lt;/a&gt;&lt;br /&gt;Esse é legal, é do estilo "se vira, procura, manda e-mail e espera retorno", foi o que mais rendeu entrevistas, mas também foram quase todas entrevistas para PJ, Cooperado, enrolado etc. Quando era CLT os salários eram risíveis, nível estagiário a Júnior.&lt;br /&gt;&lt;br /&gt;ProgBr --&amp;gt; &lt;a href="http://www.progbr.com/"&gt;http://www.progbr.com&lt;/a&gt;&lt;br /&gt;Esse é para nós programadores, mas assim como o APInfo, ele é meio caótico. O gerenciamento de qual vaga você se candidatou, qual não, trocas de mensagens e envio de CV é manual. Melhorou MUITO de uns tempos pra cá, porém dois dos empregos que já tive foram pela APInfo.&lt;br /&gt;O progBr tem perfil http://www.progbr.com/user/index.php?u=vitorrubio&lt;br /&gt;&lt;br /&gt;Trabalhando.com --&amp;gt; &lt;a href="http://www.trabalhando.com/"&gt;http://www.trabalhando.com&lt;/a&gt;&lt;br /&gt;Bonitinho, com perfil, mas nunca me rendeu uma entrevista sequer. Aliás, para nossa área é o pior de todos. Tem um sisteminha de perfil legal também &lt;a href="http://www.trabalhando.com/cvpub/7706j4585cba64429a4e605e82967ab6804040441/vitor-rubio/"&gt;http://www.trabalhando.com/cvpub/7706j4585cba64429a4e605e82967ab6804040441/vitor-rubio/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://oportunidades.ixdasp.org/"&gt;http://oportunidades.ixdasp.org&lt;/a&gt;&lt;br /&gt;É do Universia Empregos e está integrado ao Trabalhando.com.&lt;br /&gt;&lt;br /&gt;Vagas --&amp;gt; &lt;a href="http://www.vagas.com.br/"&gt;http://www.vagas.com.br&lt;/a&gt;&lt;br /&gt;Se você quiser trabalhar em um banco como Itaú esse é o caminho. Muitas vagas legais vem daqui, mas são vagas de empresas que tem o processo seletivo engessado e dividido em váaaaaarias etapas. As empresas podem disponibilizar questionários e testes para você responder online. Fiz um teste de inglês (leitura e interpretação de texto) onde você tinha 30 segundos para responder cada questão. Também há testes de matemática e lógica assim (pff, dá só 5 seg. somos todos fodões né?).&lt;br /&gt;&lt;br /&gt;Também tem um tal de Manager.com e &lt;a href="http://www.pagepersonnel.com.br/"&gt;http://www.pagepersonnel.com.br&lt;/a&gt;. Não testei e particularmente acho que já cadastrei meu CV em lugares demais.&lt;br /&gt;&lt;br /&gt;Sempre pegue os nomes das empresas top 10 nas revistas Exame, Info Exame, CerTIficação e Gestão de Carreira etc... Nessas fontes podem vir sugestõs de boas empresas para se enviar CV.&lt;br /&gt;&lt;br /&gt;Todos os sites de vagsas podem ter arapucas. Cuidado. Tem esquemas de pirâmide, gente que promete um salário e paga outro, gente que promete um emprego CLT e é PJ e assim por diante. Por falar nisso eu também sou "distribuidor independente" de uma famosa empresa de shakes para emagrecer. Quer perder peso, &lt;strike&gt;eu também quero&lt;/strike&gt; pergunte-me como.&lt;br /&gt;&lt;br /&gt;Locais onde fiz entrevista: na casa do chapéu, onde Judas perdeu as meias, Tão Tão distante.&lt;br /&gt;Tempo para encontrar um emprego novo: 45 dias.&lt;br /&gt;Tempo para encontrar em emprego decente igual ao que eu estava antes: 195 dias e contando ......&lt;br /&gt;&lt;br /&gt;Não me conformo como foi difícil para um cara, com faculdade, pós graduação, certificação microsoft (tudo bem, só a mcp-zinha, mas ainda assim uma) e inglês, diga-se de passagem, "marromeno" (cursando ainda, mas já fasso entrevistas em inglês, naquelas, mas faço) demorei tanto e/ou tive tanta dificuldade para arrumar emprego.&lt;br /&gt;É, cara, a concorrência está f..., tem sempre alguém melhor que você disposto a ganhar menos que você. Se você tem 30 anos ou mais então, pior ainda, isso é considerado a terceira idade da TI. Estou preocupado, acabei de fazer 29. Não acho trampo assim tão fácil agora. (lembro que os 4 primeiros cairam do céu, praticamente me chamaram).&lt;br /&gt;&lt;br /&gt;Dicas em entrevistas e formulários de RH. Quando te perguntarem quais são suas qualidades, seja modesto porém honesto na hora de responder. Quando te perguntarem suas fraquezas, responda "kriptonita" sem hesitar.&lt;br /&gt;&lt;br /&gt;Pontos positivos e aprendizado:&lt;br /&gt;O baque me tirou da "zona de conforto" e me deu oportunidade para eu aplicar algumas coisas que eu tinha aprendido, e estudar outras que eu gostaria de aprender. Acabei me envolvendo com nHibernate e adorei. Criei na empresa um pequeno CMS com o nHibernate, com postas, páginas, links etc. Também faz alguns controles da empresa e emite o holerite do funcionário on-line. Estou começando a estudar o C# e o .Net mais a fundo e aprendendo um monte de coisa legal que vou postar aqui. &lt;br /&gt;&lt;br /&gt;É isso. Próximo post será sobre SQL. Até lá!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-7087931484007713831?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/7087931484007713831/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2012/02/empregos-dev-la-e-de-volta-outra-vez.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7087931484007713831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7087931484007713831'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2012/02/empregos-dev-la-e-de-volta-outra-vez.html' title='Empregos DEV - Lá e de volta outra vez!'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2423815907311412489</id><published>2011-10-24T06:45:00.000-07:00</published><updated>2011-10-24T06:52:06.636-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Formatando datas no SQL e no C#</title><content type='html'>Muitas vezes é necessário exibir datas em um determinado formato no GridView. Muitos programadores convertem a data para o formato desejado já na consulta SQL ou procedure. Isso não está correto por uma série de motivos, entre os quais podemos citar:&lt;br /&gt;&lt;br /&gt;1) A responsabilidade de formatar a data deve ser totalmente da view, ou seja, da camada de apresentação.&lt;br /&gt;2) Datas formatadas pelo SQL não são mais datas, são varchars, e não podem ser ordenados como datas.&lt;br /&gt;3) Trazendo sempre a data integral do banco de dados pode-se fazer qualquer operação desejada com ela.&lt;br /&gt;&lt;br /&gt;Veja o link abaixo para tirar qualquer dúvida que você possa ter a respeito.&lt;br /&gt;&lt;a href="http://weblogs.sqlteam.com/jeffs/archive/2007/04/13/format-date-sql-server.aspx"&gt;http://weblogs.sqlteam.com/jeffs/archive/2007/04/13/format-date-sql-server.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dito isso, algumas considerações interessantes:&lt;br /&gt;&lt;br /&gt;Para formatar strings diretamente em uma GridView adicione a coluna (bound column) e defina um valor para a propriedade DataFormatString:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;asp:BoundField DataField="Data" DataFormatString="{0:dd/MM/yyyy}" HeaderText="Data" /&amp;gt;&lt;br /&gt;&amp;lt;asp:BoundField DataField="Hora" DataFormatString="{0:HH:mm:ss}" HeaderText="Hora" /&amp;gt;&lt;br /&gt;&lt;br /&gt;dd - Dia com dois dígitos&lt;br /&gt;MM - Mês com dois dígitos, deve ser maiúsculo&lt;br /&gt;yyyy - Ano com quatro dígitos&lt;br /&gt;&lt;br /&gt;hh - Hora no formato de 12 horas (necessário AM e PM)&lt;br /&gt;HH - Hora no formato de 24 horas&lt;br /&gt;mm - Minuto&lt;br /&gt;ss - Segundo&lt;br /&gt;&lt;br /&gt;Função para extrair a data de um datetime, com hora 0:00:00&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE  function [dbo].[sudf_Common_DateOnly]&lt;br /&gt;(&lt;br /&gt;@dtDateTime DateTime&lt;br /&gt;)&lt;br /&gt;returns datetime&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;    return dateadd(dd, 0, datediff(dd, 0, @dtDateTime))&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Função para extrair a hora de um datetime, com data 01/01/1900&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: sql"&gt;CREATE function [dbo].[sudf_Common_TimeOnly]&lt;br /&gt;(&lt;br /&gt;      @dtDateTime datetime&lt;br /&gt;)&lt;br /&gt;returns datetime&lt;br /&gt;as&lt;br /&gt;begin&lt;br /&gt;    return dateadd(day, -datediff(day, 0, @dtDateTime), @dtDateTime)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;Fonte:&lt;br /&gt;&lt;a href="http://www.lazerwire.com/2011/10/ms-sql-date-only.html"&gt;http://www.lazerwire.com/2011/10/ms-sql-date-only.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lazerwire.com/2011/10/ms-sql-time-from-datetime.html"&gt;http://www.lazerwire.com/2011/10/ms-sql-time-from-datetime.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Melhor fonte de informação sobre esses formatos:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.boundfield.dataformatstring.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.boundfield.dataformatstring.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Funções para lidar com datas:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa258863(v=sql.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/aa258863(v=sql.80).aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Conversão de datas com Convert no SQL Server:&lt;br /&gt;&lt;a href="http://www.sql-server-helper.com/tips/date-formats.aspx"&gt;http://www.sql-server-helper.com/tips/date-formats.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2423815907311412489?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2423815907311412489/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/10/muitas-vezes-e-necessario-exibir-datas.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2423815907311412489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2423815907311412489'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/10/muitas-vezes-e-necessario-exibir-datas.html' title='Formatando datas no SQL e no C#'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-9050703497963340870</id><published>2011-09-12T12:31:00.000-07:00</published><updated>2011-09-12T12:36:51.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Galaxy S'/><title type='text'>Factory Reset do Samsung Galaxy S</title><content type='html'>Neste endereço&amp;nbsp;&lt;a href="http://www.clangsm.com.br/vb/android-os/9802-aparelhos-android-hard-reset.html"&gt;http://www.clangsm.com.br/vb/android-os/9802-aparelhos-android-hard-reset.html&lt;/a&gt;&amp;nbsp;também há um procedimento para resetar o Galaxy S e apagar tudo, servindo para desbloqueá-lo.&lt;br /&gt;&lt;br /&gt;Reproduzindo:&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: #fafafa; color: #333333; font-family: Verdana, Arial, Tahoma, Calibri, Geneva, sans-serif; font-size: 13px;"&gt;Para hard reset seu Samsung I9000 Galaxy S:&lt;br /&gt;&lt;br /&gt;1. Desligue o aparelho. Se o seu celular Samsung Galaxy S está congelado, retire a bateria e recoloque-a.&lt;br /&gt;2. Segure o botão Diminuir Volume.&lt;br /&gt;3. Pressione e solte o botão Power.&lt;br /&gt;4. Você está agora confrontado com um menu que permite Fastbook, recuperação Clear Storage, e Simlock.&lt;br /&gt;5. Selecione Clear Storage, pressionando o botão Diminuir Volume.&lt;br /&gt;6. Pressione e solte o botão Power.&lt;br /&gt;7. Agora, basta confirmar a sua decisão: Volume para cima para confirmar e Volume para baixo para negar a ação.&lt;br /&gt;&lt;br /&gt;Se SIM for selecionada, todos os dados, incluindo aplicações de terceiros serão apagados do seu Samsung I9000 Galaxy S. Uma vez que a limpeza for concluída, o telefone irá reiniciar a suas configurações de fábrica.&lt;br /&gt;&lt;br /&gt;ou&lt;br /&gt;&lt;br /&gt;-Botão do volume para cima+botão home+power&lt;br /&gt;-Espere piscar I9000, solte o power (continue segurando home +volume)&lt;br /&gt;-Com o botão do e volume selecione wipe data/factory.reset&lt;br /&gt;-Home para confirmar&lt;br /&gt;-Com o botão do volume vá até : yes - delete all user data&lt;br /&gt;-Home para confirmar novamente&lt;br /&gt;-Espere voltar e reboot system now&lt;br /&gt;-Home para confirmar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;É isso. Usei esse menu para outras coisas, como acesso de root, mas não para resetar. É por sua conta e risco.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-9050703497963340870?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/9050703497963340870/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/09/factory-reset-do-samsung-galaxy-s.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9050703497963340870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9050703497963340870'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/09/factory-reset-do-samsung-galaxy-s.html' title='Factory Reset do Samsung Galaxy S'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-8814459091841572196</id><published>2011-08-15T10:41:00.000-07:00</published><updated>2011-08-15T10:43:36.759-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Criando um lookup que chame uma de suas forms</title><content type='html'>Um leitor deu a dica de fazer um lookup que chame uma das forms do projeto. Há várias maneiras de se fazer isso, mas uma que encontrei foi usar formulários registrados com RegisterClass. Depois é só usar FindClass para encontrar o formulário, e FindComponent para encontrar o componente onde reside o valor a ser trazido. Se o componente for um TPersistentField, melhor ainda. Ele pode ser achado, e com um typecast para TField seu valor (o valor encontrado e escolhido no formulario de procura/cadastro padrão) pode ser trazido para o keyvalue.&lt;br /&gt;&lt;br /&gt;Abaixo um exemplo de como isso pode ser feito. Primeiro o registro do formulario:&lt;br /&gt;&lt;pre class="brush: delphi"&gt;initialization&lt;br /&gt;&lt;br /&gt;  RegisterClass(TfrmConsulta);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Depois a chamada dele. Repare que ele é desconhecido para o formulário principal: não está no uses. &lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TfrmPrincipal.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  NewFormClass: TFormClass;&lt;br /&gt;  NewForm: TForm;&lt;br /&gt;begin&lt;br /&gt;  NewFormClass := TFormClass(FindClass( 'TFrmConsulta' ));&lt;br /&gt;  //detalhe: esse  string 'TFrmConsulta' pode vir de um campo, edit, banco de dados, arquivo de configuração etc&lt;br /&gt;  try&lt;br /&gt;    NewForm := NewFormClass.Create(nil);&lt;br /&gt;    NewForm.ShowModal;&lt;br /&gt;  finally&lt;br /&gt;    FreeAndNil(NewForm);&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Esse &lt;a href="http://www.vitorrubio.com.br/downloads/RegisterForm.7z"&gt;exemplo&lt;/a&gt; mostra como registrar formularios e chamá-los sem colocar no uses e sem que o "cliente" saiba da sua existencia.  &lt;br /&gt;Assim que tiver um tempo coloco isso encapsulado em um lookup. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-8814459091841572196?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/8814459091841572196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/criando-um-lookup-que-chame-uma-de-suas.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8814459091841572196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8814459091841572196'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/criando-um-lookup-que-chame-uma-de-suas.html' title='Criando um lookup que chame uma de suas forms'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3220629585113513624</id><published>2011-08-11T16:31:00.000-07:00</published><updated>2011-08-11T16:35:57.880-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><title type='text'>Bancos de dados gratuitos parte 2</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.vitorrubio.com.br/imagens/artigos/cd132.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://www.vitorrubio.com.br/imagens/artigos/cd132.jpg" width="341" /&gt;&lt;/a&gt;&lt;/div&gt;Saiu na &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_132#a-3796"&gt;Clube Delphi 132&lt;/a&gt; a &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_132#a-3804"&gt;parte 2 do artigo sobre bancos de dados gratuitos&lt;/a&gt;. Espero que todos gostem.&lt;br /&gt;&lt;br /&gt;Esta edição ainda traz um artigo sobre Nota Fiscal Eletrônica 2.0, muito útil.&lt;br /&gt;&lt;br /&gt;Não se esqueça que agora os códigos GTIN (códigos de barra a serem preenchidos nos campos cEAN e cEANTrib) agora são obrigatórios.&lt;br /&gt;&lt;br /&gt;Um artigo que eu lerei com bastante curiosidade é o artigo sobre Morfik, que permite desenvolvimento par Web com Object Pascal, semelhante ao Delphi. Mas com o Morfik você também desenvolve código "client-side".&lt;br /&gt;&lt;br /&gt;Espero que todos tenham boa leitura!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3220629585113513624?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3220629585113513624/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/bancos-de-dados-gratuitos-parte-2.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3220629585113513624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3220629585113513624'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/bancos-de-dados-gratuitos-parte-2.html' title='Bancos de dados gratuitos parte 2'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2751117146317861201</id><published>2011-08-11T15:43:00.000-07:00</published><updated>2011-08-11T16:31:50.366-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><title type='text'>Artigos sobre bancos de dados gratuitos e lookups</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.vitorrubio.com.br/imagens/artigos/cd131.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://www.vitorrubio.com.br/imagens/artigos/cd131.jpg" width="341" /&gt;&lt;/a&gt;&lt;/div&gt;Saiu na revista &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_131#a-3733"&gt;Clube Delphi 131&lt;/a&gt; dois artigos meus: um sobre &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_131#a-3738"&gt;bancos de dados gratuitos&lt;/a&gt; e outro sobre a criação de um &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_131#a-3739"&gt;componente lookup genérico&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lokups são campos utilizados para fazer a ligação entre duas entidades, duas tabelas. Em uma tabela de venda, por exemplo, há informações sobre o código do cliente para quem a venda está sendo feita, o código da forma de pagamento, e assim por diante. Um formulário não deve ter campos para se digitar os códigos diretamente, e sim campos lookup, que possam ser usados para procurar a forma de pagamento, o cliente e as outras informações em questão pelo nome e não pelo código. Neste artigo fizemos um lookup, usando um ButtonedEdit e um formulário com grid, &amp;nbsp;que pode funcionar em múltiplos bancos de dados e que traz os registros filtrando-os, usando para isso uma instrução SQL montada sob demanda. Isso ajuda a diminuir o tempo de abertura dos formulários e o tempo de carregamento dos lookups, bem como a quantidade de registros trazida nesses tipos de campo.&lt;br /&gt;&lt;br /&gt;O outro artigo publicado fará parte de uma série de 3 artigos sobre bancos de dados gratuitos e ferramentas de acesso. Além do postgre, mysql e firebird ainda existem as versões gratuitas do DB2, Oracle, SQL Server entre outros. Além disso o artigo abordará como criar bancos SQLite e se conectar a eles.&lt;br /&gt;&lt;br /&gt;Você sabia que além do DBXpress também há outras formas de se conectar a múltiplos bancos de dados? Existe o AnyDac, Zeos, Unidac, dezenas de drivers OLEDB ou ODBC, a possibilidade de usar ODBC com o DBXpress (que será recurso nativo do Delphi XE2) entre outros. Mas a suite de componentes de conexão mais rápida que eu já via é a Unidac.&lt;br /&gt;&lt;br /&gt;Ambos os artigos terão uma continuação extra-oficial neste blog. O artigo sobre bancos de dados gratuitos terá um teste de performance mais profundo, fazendo também inserts e updates e usando clientdatasets em conjunto com outros tipos de datasets que não sejam o SQLDataset do DBX. Esse servirá como um catálogo definitivo de conexão com qualquer banco de dados.&lt;br /&gt;&lt;br /&gt;Um leitor da Clube Delphi me deu uma dica interessante de colocar uma propriedade do tipo string no lookup e fazer com que ele chame um formulário de consulta ou cadastro que tenha o mesmo nome preenchido nessa propriedade. Isso faria com que o lookup pudesse "chamar" qualquer formulário do sistema sem que ele conhecesse suas units ou sequer soubesse que elas existem. Funcionalidade extra sem acoplamentos desnecessários.&lt;br /&gt;&lt;br /&gt;Espero que tenham uma boa leitura.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2751117146317861201?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2751117146317861201/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/artigos-sobre-bancos-de-dados-gratuitos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2751117146317861201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2751117146317861201'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/08/artigos-sobre-bancos-de-dados-gratuitos.html' title='Artigos sobre bancos de dados gratuitos e lookups'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3136202247198896301</id><published>2011-07-15T15:10:00.000-07:00</published><updated>2011-07-15T15:10:22.721-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"</title><content type='html'>Para se conectar uma aplicação Delphi no Oracle é necessário editar o arquivo tsnames.ora, geralmente na pasta&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Times, serif; font-size: 16px;"&gt;C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN caso seu oracle seja o XE.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, serif; font-size: 16px;"&gt;Esse erro pode acontecer tanto em runtime como em design-time, com qualquer tipo de componente: DBX, ADO e assim por diante. É mais comum que aconteça em tempo de design em um windows de 64 bit.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, serif;"&gt;Em alguns casos onde essa mensagem de erro aparece é porque o arquivo não existe ou está em uma pasta que o Delphi ou o seu aplicativo não tem permissão de acesso.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, serif;"&gt;Na grande maioria dos casos o erro ocorre apenas em design-time e nunca em runtime. Se esse é o seu caso&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Times, serif;"&gt;&amp;nbsp;então provavelmente a culpa é do windows de 64 bit, mais especificamente o fato de o Delphi estar instalado na pasta "Arquivos de Programas (x86)". Explicando, o driver de conexão ao oracle não suporta caminhos contendo parênteses "()", esses que tem no "(x86)". Ele não consegue encontrar nem o driver de conexão nem o arquivo&amp;nbsp;&lt;/span&gt;tsnames.ora por causa desses parênteses. Instale o Delphi em uma pasta tipo "Arquivos de Programas" "normal" ou até mesmo em uma pasta direto na raiz, como c:\Delphi.&lt;br /&gt;Se o Delphi já está instalado nesta pasta problemática ainda assim é possível copiar toda a pasta do RAD STUDIO (geralmente&amp;nbsp;C:\Arquivos de programas (x86)\Embarcadero\RAD Studio) para uma pasta qualquer, tipo c:\rad studio, e execute o Delphi dali. (ele se encontra na pasta 7.0\bin se for o 2010 ou 8.0\bin se for o XE, é o arquivo bds.exe).&lt;br /&gt;Ele vai executar normalmente, mesmo no local "errado", já que tudo que ele precisa em matéria de bibliotecas está no registro e ele consegue encontrar no diretório original, e isso não impedirá de que uma conexão DBX com o oracle funcione normalmente. Vai funcionar mesmo em design-time, e compilar sua aplicação normalmente.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Times, serif; font-size: 12pt;"&gt;Have fun ;)&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3136202247198896301?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3136202247198896301/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/07/erro-ora-12154-tns-nao-foi-possivel.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3136202247198896301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3136202247198896301'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/07/erro-ora-12154-tns-nao-foi-possivel.html' title='erro &quot;ora-12154: tns: não foi possível resolver o identificador de conexão especificado&quot;'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3392692892553596025</id><published>2011-06-30T12:45:00.000-07:00</published><updated>2011-06-30T12:45:19.766-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='banco de dados'/><title type='text'>Key Violation em nested datasets</title><content type='html'>Resolva de uma vez por todas o problema de "key violation" em datasets "detail" ligados a datasetfileds através de providers.&lt;br /&gt;&lt;br /&gt;Cenário: você tem duas tabelas num relacionamento 1:n tipo mestre-detalhe no seu banco de dados, por exemplo Pedidos e ItensDoPedido.&lt;br /&gt;A chave primária de ambas as tabelas é auto-numerada, por exemplo com ajuda de um generator do firebird. A Tabela itens tem uma chave estrangeira PedCodigo, que é o código do pedido, mas para controle interno também tem uma chave primária CodItem, autonumerada.&lt;br /&gt;Você colocou no formulário dois SQLDatasets, um fazendo o select em Pedidos e outro fazendo o select em ItensDoPedido, com um "where CodPedido = :CodPedido" para fazer a "ligação". Você ligou o SQLDataset detalhe (ItensDoPedido) a um datasource ligado ao SQLDataset mestre. Você ligou também um DatasetProvider ao SQLDataset de Pedidos e ligou um ClientDataset cdsPedidos a esse provider, criando um dataset field (campo do tipo dataset), talvez chamado sqlItens, e ligando o ClientDataset cdsItem a este dataset field, criando assim o cdsDetahle.&lt;br /&gt;&lt;br /&gt;Você talvêz tenha recebido alguma mensagem de que o campo CodItem é requerido e não pode ser deixado null, então tomou providências para deixar a propriedade required do campo = false ou atribuido algum valor randômico a ele. Se fez isso é sinal de um design fraco. Há maneiras mais elegantes de se resolver isso, veja as soluções 2 e 3.&lt;br /&gt;&lt;br /&gt;Problema: Quando você insere o segundo item no ClientDataSet cdsItem recebe a exception "Key Violation".&lt;br /&gt;&lt;br /&gt;Causa: O cdsItem (detalhe) também possui uma chave primária, CodItem. Quando você dá o post no segundo item ele é gravado com o mesmo valor do registro anterior: null ou zero se você definiu para atribuir zero no evento "onNewRecord" ou "beforepost". Como chave primária ele não pode se repetir no cdsItem, mesmo sabendo que os códigos serão criados no banco de dados automaticamente depois do applyupdates e do commit da transação. Antes disso não há valor definido para a chave primária do item.&lt;br /&gt;&lt;br /&gt;Há 3 maneiras de solucionar:&lt;br /&gt;&lt;br /&gt;1) Atribua um número randômico (pode até ser negativo) ou GetTickCount à chave primária no evento OnNewRecord.&lt;br /&gt;Desvantagens: essa é a gambiarra mais feia e porca que existe. Além de poluir o código, caso o número randômico se repita, o que estatisticamente pode acontecer, ocorrerá o key violation. Caso use GetTickCount este pode trazer um número maior do que o suportado pelo integer field, já que retorna um cardinal sem sinal, podendo causar o erro de integer overflow. Portanto a solução 1 está aqui para fins "didáticos" (ou não). Nunca a use.&lt;br /&gt;&lt;br /&gt;2) Para que você precisa trazer o campo da chave primária do item? Na maioria das vezes isso não é necessário. Você pode incluir todos os campos no select exceto a PK, já que ela ainda não está definida. E você não precisa exibi-la caso ela esteja null. Isso resolve o problema de uma maneira performática e elegante.&lt;br /&gt;&lt;br /&gt;3) Metadados: Como o ClientDataset sabe que tal campo é chave primária se ele não é conectado diretamente ao banco de dados? Ele "sabe" isso porque provavelmente a propriedade GetMetadata do SQLDataset deve estar true. Colocando essa propriedade para false &amp;nbsp;o ClientDataset não "saberá" que esse campo não pode se repetir, muito menos que ele é requerido. Além disso o ClientDataset abre muito mais rápido caso essa propriedade esteja false, pois não tem que fuçar nos metadados da tabela. Essa técnica é ideal para quando você precisa mostrar o número da PK logo depois da inserção e persistência. Como por exemplo mostrar um número de comanda num sistema de restaurante ou mostrar o número da "carteirinha" de um cliente recém inserido.&lt;br /&gt;Desvantagem: se por algum motivo, como campo requerido, not null ou qualquer outro você precisa que os metadados sejam trazidos para que sejam tratados no client e não no server esta técnica não deve ser usada, recorra à 2.&lt;br /&gt;&lt;br /&gt;Mencionei o problema ocorrendo em nested datasets mas ele pode ocorrer em ClientDatasets "normais" ligados a uma única tabela.&lt;br /&gt;&lt;br /&gt;Uma mistura das soluções 2 e 3 quando aplicável é a melhor e mais performática solução. Quando nenhuma das duas pode ser usada, ou seja, você precisa dos metadados por algum motivo e ainda precisa exibir a chave primária criada logo depois do registro salvo, considere usar um outro tipo de arquitetura, ou usar chaves primárias definidas via programação em vez de generators.&lt;br /&gt;&lt;br /&gt;Happy Coding &amp;nbsp;\(^.^)/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3392692892553596025?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3392692892553596025/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/key-violation-em-nested-datasets.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3392692892553596025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3392692892553596025'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/key-violation-em-nested-datasets.html' title='Key Violation em nested datasets'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-501366912730658910</id><published>2011-06-27T11:00:00.000-07:00</published><updated>2011-06-27T11:00:47.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>O que você melhoraria no Delphi? - parte 2</title><content type='html'>Na &lt;a href="http://blog.vitorrubio.com.br/2011/02/o-que-voce-melhoraria-no-delphi.html"&gt;parte 1 desse post&lt;/a&gt;, há muito tempo, fiz uma pequena descrição do que eu acho que poderia ser melhorado no Delphi.&lt;br /&gt;&lt;br /&gt;Resumindo:&lt;br /&gt;1) Alguns componentes e bibliotecas mais comuns "nativos" em vez de "incorporados".&lt;br /&gt;2) Literatura orientada mais a POO e a boas práticas da Engenharia de Software do que a RAD. A literatura disponível nos helps, exemplos, snippets e consequentemente nos blogs e fóruns é toda voltada a RAD, arrastar e &amp;nbsp;soltar componentes. E como todos sabemos RAD é bom para protótipos e projetos pequenos, ou com requisitos fixos, com baixa frequencia de manutenção.&lt;br /&gt;3) O aspecto que eu acho mais importante é (a falta de) um framework de persistência nativo da Embarcadero, para se fazer o mapeamento objeto relacional de maneira padronizada e ao mesmo tempo rápida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Continuando, uma coisa que eu acho muito importante são as ações de marketing. No Brasil parece que o Delphi está queimado justamente com quem mais deveria acreditar nele: os professores.&lt;br /&gt;Digo isso por experiência própria, pois meu projeto de conclusão de curso da pós graduação passou por esse problema.&lt;br /&gt;Minha monografia era para ser "frameworks de mapeamento objeto relacional em Delphi". Meu orientador, professor de engenharia de software e outras matérias. Delpheiro de carteirinha e especialista em Delphi me perguntou "Por Que Delphi?". Ele questionou que meu trabalho, focado em Delphi, seria para um público muito restrito e que o Delphi está fadado a cair no desuso (nas palavras dele).&lt;br /&gt;Não concordo com o ponto de vista dele sobre o Delphi, mas concordei que eu teria que expandir meus horizontes se quisesse fazer um trabalho academicamente mais amplo. Por isso meu tema foi trocado para "Processo de criação de frameworks de mapeamento objeto relacional em ambientes open-source".&lt;br /&gt;&lt;br /&gt;O ponto em questão é que os professores, em vez de recomendar Delphi, estão "des-recomendando" (se é que esse termo existe). E agora como convencê-los do contrário?&lt;br /&gt;&lt;br /&gt;Outro ponto é quanto ao preço do Delphi, mais caro que a concorrência. Quando saiu a edição "starter" do Delphi realmente o preço saiu bastante tentador. Mais barato que uma licença do windows 7 ultimate. Mas meu interesse na versão starter despencou quando eu soube que esta verão não possui dbexpress. Qual a utilidade do Delphi, para se fazer sistemas de informação, sem o dbExpress? Se conectar com MySql através de ADO+ODBC? BDE? Não, obrigado. Terei que comprar a suíte de componentes Unidac (que eu recomendo, muito boa).&lt;br /&gt;&lt;br /&gt;Conversando com uns amigos no evento de lançamento da Embarcadero no Brasil chegamos a seguinte conclusão: por que não vender o Delphi "pelado", apenas IDE e compilador, por um preço simbólico e vender os componentes e add-ons sob demanda? Pense nisso:&lt;br /&gt;Hoje em dia estão na moda as AppStores, onde você compra uma aplicação a um preço justo, e esta aplicação é sua, sendo sincronizada em seus dispositivos com o mesmo sistema operacional. Se você formata / reseta seu sistema, suas aplicações já pagas/compradas da appStore são baixadas e instaladas novamente. Tudo é re-sincronizado automaticamente. O mundo da Apple funciona assim, com o iPhone, iPad, iPod &amp;nbsp;e com o iMac. O mundo do Google Android também funciona assim, e até a&lt;a href="http://www.appup.com/applications/index"&gt; Intel entrou na brincadeira&lt;/a&gt;.&lt;br /&gt;Qual é o maior problema quando um desenvolvedor Delphi tem que formatar sua máquina? Ele perde um dia inteiro, ou dias, reinstalando, além do Delphi, todos os componentes, open-source ou não, bibliotecas e adds que precisa para trabalhar produtivamente. Muitos tentam exportar chaves de registro, e copiar diretórios de bpl's e dcp's a fim de criar uma instalação do Delphi personalizada para poder instalar depois, ou fazem ghost da máquina. A situação se torna pior se a empresa tem vários programadores Delphi, com várias máquinas diferentes e várias licenças pra instalar. Pior ainda se lida com versões diferentes do Delphi.&lt;br /&gt;Solução: por que não criar um instalador mínimo do Delphi e um appStore de componentes e bibliotecas? Assim, bastaria instalar o Delphi e logar-se com a sua conta na Embarcadero para re-instalar e sincronizar todos os componentes. E isso serviria quem sabe para você publicar um componente seu e ganhar com ele, porque não? Até mesmo para se fazer "Component Contests".&lt;br /&gt;Isso poderia ajudar a garantir o controle de qualidade, testes etc de um componente, além da procedência, e garantir, principalmente para os não-open-source, uma sobrevida e um tempo de suporte maior, além de tornar a instalação do Delphi muito mais fácil e a busca, aquisição e instalação de componentes muito mais fácil.&lt;br /&gt;Quando eu digo componentes me refiro à bibliotecas "normais" também, daquelas que você precisa instanciar uma classe, ou usar uma função, mas que não tem um componente em uma paleta pra colocar na form.&lt;br /&gt;A maioria dos componentes precisam que arquivos sejam colocados em certos diretórios, e que certos caminhos sejam adicionados ao library path e browsing path do windows. Além disso os instaladores dos componentes são todos diferentes, quando há instalador, pois a maioria você deve compilar a partir dos dpk's.&lt;br /&gt;Agora imagine um ambiente com um gerenciador de componente que encontra o componente que você precisa, faz as devidas inclusões dos paths, compila e instala se for open-source ou simplesmente instala se não &amp;nbsp;for, e te livra de todos os passos chatos, demorados ou complicados.&lt;br /&gt;&lt;br /&gt;Essas são algumas coisinhas que eu acho que poderiam ser melhoradas. E vocês, o que acham?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-501366912730658910?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/501366912730658910/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/o-que-voce-melhoraria-no-delphi-parte-2.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/501366912730658910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/501366912730658910'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/o-que-voce-melhoraria-no-delphi-parte-2.html' title='O que você melhoraria no Delphi? - parte 2'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2150345048412867117</id><published>2011-06-22T12:32:00.000-07:00</published><updated>2011-06-22T12:33:11.966-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='developers'/><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Grande verdade sobre developers</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sQzfBhdOGtw/TgJBPIgzKyI/AAAAAAAAAXE/H-5MU6zPJ1M/s1600/developersarebornbrave.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://3.bp.blogspot.com/-sQzfBhdOGtw/TgJBPIgzKyI/AAAAAAAAAXE/H-5MU6zPJ1M/s640/developersarebornbrave.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Além de encarar qualquer problema de frente, assumimos a responsabilidade pelos bugs, sejam eles nossos, de "estimação", ou não.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2150345048412867117?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2150345048412867117/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/grande-verdade-sobre-developers.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2150345048412867117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2150345048412867117'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/06/grande-verdade-sobre-developers.html' title='Grande verdade sobre developers'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sQzfBhdOGtw/TgJBPIgzKyI/AAAAAAAAAXE/H-5MU6zPJ1M/s72-c/developersarebornbrave.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-12164624088160546</id><published>2011-05-26T15:47:00.000-07:00</published><updated>2011-05-26T15:47:55.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Que saudade das férias</title><content type='html'>Estava limpando a bagunça do meu PC e encontrei uma foto que me deu saudade das férias.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sit6ZO8_UVg/Td7X3cqR5oI/AAAAAAAAAW8/N1WuO6mfEHg/s1600/DSC00931.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-sit6ZO8_UVg/Td7X3cqR5oI/AAAAAAAAAW8/N1WuO6mfEHg/s400/DSC00931.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Tudo ok com vocês peixinhos? Oh wait, isso não foi um gesto obsceno, aaaaargh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-12164624088160546?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/12164624088160546/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/que-saudade-das-ferias.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/12164624088160546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/12164624088160546'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/que-saudade-das-ferias.html' title='Que saudade das férias'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sit6ZO8_UVg/Td7X3cqR5oI/AAAAAAAAAW8/N1WuO6mfEHg/s72-c/DSC00931.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6402329660772356596</id><published>2011-05-23T14:28:00.000-07:00</published><updated>2011-05-23T14:30:55.383-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='easter egg'/><category scheme='http://www.blogger.com/atom/ns#' term='fringe'/><title type='text'>Easter Egg de Fringe no site da Bardahl</title><content type='html'>Entre no site da &lt;a href="http://www.bardahl.com.br/site/index.php#"&gt;Bardahl&lt;/a&gt;, clique em história da Bardahl ==&amp;gt; Museu Bardahl 3d em flash, quando carregar um "mural" com vários anos clique em próximo para ver o próximo "mural/parede" e clique em 1962.&lt;br /&gt;&lt;br /&gt;Veja quem está observando ...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sDFO1B2MHSI/TdrR-qrRh9I/AAAAAAAAAW4/n4ApLY6oX8g/s1600/bardahl.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://3.bp.blogspot.com/-sDFO1B2MHSI/TdrR-qrRh9I/AAAAAAAAAW4/n4ApLY6oX8g/s640/bardahl.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6402329660772356596?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6402329660772356596/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/easter-egg-de-fringe-no-site-da-bardahl.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6402329660772356596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6402329660772356596'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/easter-egg-de-fringe-no-site-da-bardahl.html' title='Easter Egg de Fringe no site da Bardahl'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sDFO1B2MHSI/TdrR-qrRh9I/AAAAAAAAAW4/n4ApLY6oX8g/s72-c/bardahl.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-1741924814012497168</id><published>2011-05-23T14:12:00.000-07:00</published><updated>2011-05-23T14:12:19.729-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Biblioteca MadCollection</title><content type='html'>Saiu na edição 129 da Revista Clube Delphi meu artigo sobre a madCollection.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_129#a-3518" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-R7xQinxA5MM/TdrMwQpo0yI/AAAAAAAAAW0/thMzBijyaUQ/s320/cd129.jpg" width="273" /&gt;&lt;/a&gt;&lt;/div&gt;Francamente não sei como não é distribuída juntamente com o Delphi, ou com qualquer outra linguagem / IDE, uma biblioteca tão útil. Explico: ela te permite fazer o que as vezes nem a API do windows permite. Neste artigo dei algumas pinceladas, mas a biblioteca é muito maior do que eu demonstrei.&lt;br /&gt;&lt;br /&gt;Mencionando os artigos que estou lendo AGORA: o artigo dbExpress 4 do Fabrício Kawata e o Padrões Criacionais do Rafael Stavarengo chamaram muito minha atenção.&lt;br /&gt;&lt;br /&gt;Boa leitura.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-1741924814012497168?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/1741924814012497168/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/biblioteca-madcollection.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1741924814012497168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1741924814012497168'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/05/biblioteca-madcollection.html' title='Biblioteca MadCollection'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-R7xQinxA5MM/TdrMwQpo0yI/AAAAAAAAAW0/thMzBijyaUQ/s72-c/cd129.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5247304878970415137</id><published>2011-04-13T12:39:00.000-07:00</published><updated>2011-04-13T12:39:59.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Para descontrair hoje</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://24.media.tumblr.com/tumblr_ljkq6mZYqP1qzmowao1_500.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://24.media.tumblr.com/tumblr_ljkq6mZYqP1qzmowao1_500.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://27.media.tumblr.com/tumblr_ljkq2t9CEi1qzmowao1_500.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://27.media.tumblr.com/tumblr_ljkq2t9CEi1qzmowao1_500.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://30.media.tumblr.com/tumblr_lja30h3Vdy1qe11kdo1_500.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://30.media.tumblr.com/tumblr_lja30h3Vdy1qe11kdo1_500.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://28.media.tumblr.com/tumblr_lj8ue1Etjk1qe11kdo1_500.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://28.media.tumblr.com/tumblr_lj8ue1Etjk1qe11kdo1_500.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Uma boa tarde a todos!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5247304878970415137?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5247304878970415137/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/para-descontrair-hoje.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5247304878970415137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5247304878970415137'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/para-descontrair-hoje.html' title='Para descontrair hoje'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-1916608471474167968</id><published>2011-04-13T11:29:00.000-07:00</published><updated>2011-04-13T12:36:50.423-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='livros'/><title type='text'>Sobre livros</title><content type='html'>Eu gosto de ler. Não sou um rato de biblioteca, não tenho leitura dinâmica e não leio tão rápido ou com tanta frequência (sem trema desta vez), mas gosto de ler.&lt;br /&gt;Gosto de comparar uma boa leitura com uma boa refeição. Já percebeu que às vezes um prato simples, em um restaurante pequeno de um bairro não muito movimentado pode te surpreender? Pode ser exatamente igual ao que sua mãe fazia, por exemplo.&lt;br /&gt;O mesmo acontece com livros. Às vezes não damos muita atenção para um livro, e ele nos surpreende. Não apenas pela história envolvente, mas pelas "notas". Sim, notas. Para quem degusta vinhos, café ou perfumes está acostumado a ouvir essa palavra, "notas", fora de um contexto musical. Nos vinhos, pratos e perfumes notas são características, que não são plenamente fixas ou mensuráveis, mas são nebulosas. Não têm extremos, mas têm infinitas gradações.&lt;br /&gt;Quantas gradações de sabor podem existir entre o amargo do café e o doce do chocolate? Entre um perfume e outro?&lt;br /&gt;Essas "notas" podem ser encontradas em livros. E não apenas em romances ou ficções, mas em livros técnicos, enciclopédias, trabalhos científicos, quadrinhos, livros religiosos etc... Elas atingem sua mente, ressoam no seu intelecto, reverberam no seu íntimo, retinem em sua alma, misturam-se a todas as suas crenças, filosofias, conhecimentos tácitos e personalidade. Por fim são incorporadas e tornam parte do seu próprio acervo, de você. Essas notas também são chamadas de memes, mas memes hoje ganharam um significado marqueteiro interneteiro muito aquém do seu real significado.&lt;br /&gt;Se comparados à refeições uma revista é como um lanche em um fast-food americano. Um livro técnico é como um prato-feito de buteco: quantidade grande, comida demasiadamente comum (ou até ordinária), muita gordura e carboidrato, em frente ao seu trabalho, te preparando para o trabalho, pronto para o trabalho. Sim, da mesma forma que você só come o "pf" no buteco em frente à empresa quando está trabalhando, livros técnicos só servem para trabalho. Eles SÃO trabalho. Mas, da mesma forma que o pf, nem tudo será comido, e nem tudo será digerido. Ou você vai me dizer que devora com prazer os livros técnicos de capa a capa, mesmo as partes que você já está "saciado", mesmo sem fome desse conhecimento, e ainda assim fica mais "saudável"? Dirá que a cada livro técnico devorado seu salário aumenta 1%, 0,1%?&lt;br /&gt;Livros técnicos são importantes, como o arroz, feijão, bife e salada. Mas não deveriam ser os únicos livros da &amp;nbsp;sua vida.&lt;br /&gt;Recentemente eu li um livro desses, baratinho, de bolso, comprado em banca de jornal, que não valorizei muito quando vi, mas que ele se mostrou uma macarronada de domingo, com direito a frango à passarinho.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?nitem=22096796&amp;amp;id_link=8055&amp;amp;tipo=2&amp;amp;isbn=8539000024" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://files.cdn.upx.net.br/00113/imagem/capas/796/22096796.jpg?id_link=8055" /&gt;&lt;/a&gt;&lt;/div&gt;O diário do chaves vai além do que é mostrado nos episódios do seriado e, sem perder o tom de comédia, mostra um lado mais dramático, triste e até lúgubre da história.&lt;br /&gt;Não vou falar mais nada, porque irá estragar sua refeição. Apenas recomendo: experimente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Atualização:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/resenha/resenha.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788576163138" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://files.cdn.upx.net.br/00113/imagem/capas/651/2822651.jpg?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788576163138" /&gt;&lt;/a&gt;&lt;/div&gt;Meio esfomeado estou hoje não? É que minha inspiração para o texto acima foi esse livro-mangá aqui:&lt;br /&gt;Sentimentos se misturam num belo prato, marcados por um ritmo, um passo, intenso como a correria da vida, onde apenas nos momentos de saciar o vazio em seu estômago é que o personagem se apercebe do seu vazio existencial.&lt;br /&gt;Eu gostei.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-1916608471474167968?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/1916608471474167968/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/sobre-livros.html#comment-form' title='4 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1916608471474167968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1916608471474167968'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/sobre-livros.html' title='Sobre livros'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2392028060425356739</id><published>2011-04-07T07:12:00.001-07:00</published><updated>2011-04-07T07:12:40.756-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnologia'/><title type='text'>Uma grande verdade sobre tecnologia</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://27.media.tumblr.com/tumblr_lja3xxoXxV1qzipfxo1_500.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://27.media.tumblr.com/tumblr_lja3xxoXxV1qzipfxo1_500.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Vai dizer que não é verdade.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2392028060425356739?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2392028060425356739/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/uma-grande-verdade-sobre-tecnologia.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2392028060425356739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2392028060425356739'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/uma-grande-verdade-sobre-tecnologia.html' title='Uma grande verdade sobre tecnologia'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4403539689400581394</id><published>2011-04-06T08:36:00.000-07:00</published><updated>2011-04-06T08:36:04.982-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Clube Delphi 128</title><content type='html'>Saiu a Clube Delphi 128, e dessa vez o meu artigo é capa! Agradeço ao &lt;a href="http://guintherpauli.blogspot.com/2011/04/revista-clubedelphi-128.html"&gt;Guinther Pauli&lt;/a&gt;, editor da revista, pela paciência que tem com meus atrasos :p&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-LQpDBywz0z8/TZx-tmf-nhI/AAAAAAAAAWk/7MZiCSRh3BQ/s1600/cd128.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-LQpDBywz0z8/TZx-tmf-nhI/AAAAAAAAAWk/7MZiCSRh3BQ/s320/cd128.jpg" width="273" /&gt;&lt;/a&gt;&lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_128#a-3447"&gt;Meu artigo sobre interoperabilidade&lt;/a&gt;&amp;nbsp;explica como integrar sistemas Delphi Win32, .Net e talvez outros através de DLLs, COM, WebServices e troca de mensagens pela API do windows.&lt;br /&gt;&lt;br /&gt;Mostro nesse artigo como consumir uma DLL feita em Delphi através do .Net, como consumir pelo Delphi uma DLL .Net através da integração COM, como consumir pelo Delphi um webservice feito em .Net e como fazer as aplicações se comunicarem via API do windows.&lt;br /&gt;&lt;br /&gt;Lógico, sobre interoperabilidade fiquei devendo, por questões de tempo e espaço, algumas coisinhas que pretendo mencionar em artigos futuros, na revista e/ou neste blog:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;.Net consumindo webservice em Delphi&lt;/li&gt;&lt;li&gt;&amp;nbsp;Introdução do Lazarus na brincadeira&lt;/li&gt;&lt;li&gt;&amp;nbsp;Integração por sockets&lt;/li&gt;&lt;li&gt;&amp;nbsp;Integração por xml, json e txt&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Por enquanto não vejo a hora de ler os artigos sobre programação Android com freepascal e o artigo sobreXML Data Binding.&lt;br /&gt;&lt;br /&gt;Espero que todos tenham uma boa leitura ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4403539689400581394?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4403539689400581394/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/clube-delphi-128.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4403539689400581394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4403539689400581394'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/clube-delphi-128.html' title='Clube Delphi 128'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LQpDBywz0z8/TZx-tmf-nhI/AAAAAAAAAWk/7MZiCSRh3BQ/s72-c/cd128.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5835697195792221148</id><published>2011-04-06T07:29:00.000-07:00</published><updated>2011-04-06T07:29:41.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Protesto'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><title type='text'>Verdades sobre programação</title><content type='html'>&lt;a href="http://luisdalmolin.com.br/verdades-nao-tao-conhecidas-sobre-programacao/#comment-13"&gt;Esse blog&lt;/a&gt;, do @luisdalmolin, contém um excelente texto sobre verdades não tão conhecidas sobre programação. Não tão conhecidas talvez pelos nossos chefes / stakeholders, mas muito bem conhecidas por nós. O post foi traduzido &lt;a href="http://dotmac.rationalmind.net/2010/08/some-lesser-known-truths-about-programming/"&gt;desse aqui&amp;nbsp;&lt;/a&gt;&amp;nbsp;em inglês.&lt;br /&gt;&lt;br /&gt;Basicamente, o texto fala sobre o que já sabemos:&lt;br /&gt;1) Dez programadores não farão o programa em um décimo do tempo assim como nove mulheres não fazem um bebê em um mês. (apenas uma grande suruba lésbica).&lt;br /&gt;2) Bons programadores passam muito mais tempo lendo, estudando, pensando, refatorando do que escrevendo, codificando e debugando. É fato! Scrum e XP pregam isso. O resto é XGH (eXtreme Go Horse).&lt;br /&gt;3) Programadores (e hoje analistas de sistemas também) são tratados como peões, na rabeira do organograma da empresa, muitas vezes mesmo se destacando em sua área, possuindo graduação, pós graduação e certificações, o que significa que um programador é tratado como um operário mesmo tendo estudado tanto quanto (em alguns casos muito mais) um médico ou advogado, e continuar estudando ao longo de TODA sua carreira.&lt;br /&gt;4) Planejamento é fundamental antes, durante e depois.&lt;br /&gt;5) Mesmo os requisitos sendo flexíveis, isso não significa "festa do caqui" com os requisitos. E os prazos e escopo deveriam ser flexíveis proporcionalmente à flexibilidade dos requisitos.&lt;br /&gt;6) Mudanças de requisitos geram entropia, ok, mas mudanças sem planejamento, sem levantamento de requisitos, direto no código, por meio de tentativa e erro até funcionar geram mais entropia ainda, tendendo ao caos, e inevitavelmente vão falhar. FALHARÃO MISERAVELMENTE.&lt;br /&gt;&lt;br /&gt;Alguns quadrinhos humorísticos tirados do site &lt;a href="http://vidadeprogramador.com.br/"&gt;Vida de Programador&lt;/a&gt; ilustram isso:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://vidadeprogramador.com.br/wp-content/uploads/2011/04/tirinha44.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://vidadeprogramador.com.br/wp-content/uploads/2011/04/tirinha44.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Essa outra ilustra bem a situação.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://vidadeprogramador.com.br/wp-content/uploads/2011/03/tirinha24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://vidadeprogramador.com.br/wp-content/uploads/2011/03/tirinha24.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Não podemos esquecer do vídeo hug a developer! Ele ilustra de maneira bem humorada os problemas, desafios e DORES pelas quais um programador passa nas mãos e chefes porcos, cães sarnentos ignorantes ...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/W-188Z-xgjo" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/71YaysJKhvE" title="YouTube video player" width="640"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5835697195792221148?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5835697195792221148/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/verdades-sobre-programacao.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5835697195792221148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5835697195792221148'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/verdades-sobre-programacao.html' title='Verdades sobre programação'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/W-188Z-xgjo/default.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4460157625032377837</id><published>2011-04-05T07:09:00.000-07:00</published><updated>2011-04-05T07:09:44.234-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Enquanto isso, em algum lugar da internet</title><content type='html'>Para descontrair...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://fuckyeahdementia.com/photo/1280/4364911324/1/tumblr_lj5f45du421qzmowa" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="525" src="http://fuckyeahdementia.com/photo/1280/4364911324/1/tumblr_lj5f45du421qzmowa" width="700" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://25.media.tumblr.com/tumblr_listrgmNYl1qejrqso1_500.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://25.media.tumblr.com/tumblr_listrgmNYl1qejrqso1_500.gif" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://25.media.tumblr.com/tumblr_lj56sz9DjF1qz9obxo1_500.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="281" src="http://25.media.tumblr.com/tumblr_lj56sz9DjF1qz9obxo1_500.gif" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://30.media.tumblr.com/tumblr_lj28p38NlG1qcp5rio1_500.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="278" src="http://30.media.tumblr.com/tumblr_lj28p38NlG1qcp5rio1_500.gif" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E para quem trabalha com suporte:&lt;br /&gt;&lt;br /&gt;&lt;a class="Title" href="http://fuckyeahitbullshit.tumblr.com/post/4264766544/ips-vizinhos" style="border-bottom-color: initial; border-bottom-style: initial; border-bottom-width: 0px; color: #222222; display: block; font-family: QuicksandBold, Helvetica, Arial, sans-serif; font-size: 22px; font-weight: bold; letter-spacing: 2px; line-height: 1.4; margin-bottom: 22px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline; text-shadow: rgb(204, 204, 204) 1px 1px 0px, rgb(102, 102, 102) 0px 0px 6px; text-transform: uppercase;"&gt;IPS VIZINHOS&lt;/a&gt;&lt;br /&gt;&lt;ul class="TheChat" style="color: #222222; font-family: QuicksandBook, Helvetica, Arial, sans-serif; font-size: 22px; line-height: 30px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li class="odd User-1" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: dotted; border-bottom-width: 2px; clear: left; line-height: 1; margin-bottom: 12px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Label" style="display: block; float: left; font-family: QuicksandBold, Helvetica, Arial, sans-serif; font-size: 22px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;QA:&lt;/span&gt;&lt;div class="Line" style="margin-bottom: 0px; margin-left: 240px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Oi, usuário tá conectando com o IP 189.21.22.23 e não tá funcionando&lt;/div&gt;&lt;/li&gt;&lt;li class="even User-2" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: dotted; border-bottom-width: 2px; clear: left; line-height: 1; margin-bottom: 12px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Label" style="display: block; float: left; font-family: QuicksandBold, Helvetica, Arial, sans-serif; font-size: 22px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;DBA:&lt;/span&gt;&lt;div class="Line" style="margin-bottom: 0px; margin-left: 240px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Mas o IP aqui no banco de dados é o 189.22.23.25... Tem algo errado aí&lt;/div&gt;&lt;/li&gt;&lt;li class="odd User-1" style="border-bottom-color: rgb(204, 204, 204); border-bottom-style: dotted; border-bottom-width: 2px; clear: left; line-height: 1; margin-bottom: 12px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Label" style="display: block; float: left; font-family: QuicksandBold, Helvetica, Arial, sans-serif; font-size: 22px; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;QA:&lt;/span&gt;&lt;div class="Line" style="margin-bottom: 0px; margin-left: 240px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Ah, não são iguais, mas são bem próximos né?&lt;/div&gt;&lt;div class="Line" style="margin-bottom: 0px; margin-left: 240px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;fonte:&amp;nbsp;&lt;a href="http://fuckyeahdementia.com/"&gt;http://fuckyeahdementia.com/&lt;/a&gt;&amp;nbsp;e&amp;nbsp;&lt;a href="http://fuckyeahitbullshit.tumblr.com/"&gt;http://fuckyeahitbullshit.tumblr.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4460157625032377837?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4460157625032377837/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/enquanto-isso-em-algum-lugar-da.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4460157625032377837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4460157625032377837'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/enquanto-isso-em-algum-lugar-da.html' title='Enquanto isso, em algum lugar da internet'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4984812010100258842</id><published>2011-04-04T12:21:00.000-07:00</published><updated>2011-04-04T12:21:09.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>A API GetuserNameEx</title><content type='html'>Primeiro de tudo, a função &lt;a href="http://msdn.microsoft.com/en-us/library/ms724435(v=vs.85).aspx"&gt;GetUserNameEx&lt;/a&gt; se encontra na dll Secur32.dll e, como outras funções da API do windows, possui duas versões, uma ANSI (GetUserNameExA) e uma WIDE (GetUserNameExW).&lt;br /&gt;&lt;br /&gt;Abaixo segue o cabeçalho para importação dessas duas funções. &lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;function GetUserNameExA(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExA';&lt;br /&gt;function GetUserNameExW(NameFormat: TEXTENDED_NAME_FORMAT; lpBuffer: PWideChar; var nSize: DWORD): BOOL; stdcall external 'Secur32.dll' name 'GetUserNameExW';&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Atenção especial para o parâmetro NameFormat do tipo &lt;a href="http://msdn.microsoft.com/en-us/library/ms724268(v=vs.85).aspx"&gt;TEXTENDED_NAME_FORMAT&lt;/a&gt;. Ele é na verdade um Enum com alguns valores fixos. (no C também é um enum, e usa-se um ponteiro para ele)&lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;  TEXTENDED_NAME_FORMAT  =&lt;br /&gt;  (&lt;br /&gt;    NameUnknown            = 0,&lt;br /&gt;    NameFullyQualifiedDN   = 1,&lt;br /&gt;    NameSamCompatible      = 2,&lt;br /&gt;    NameDisplay            = 3,&lt;br /&gt;    NameUniqueId           = 6,&lt;br /&gt;    NameCanonical          = 7,&lt;br /&gt;    NameUserPrincipal      = 8,&lt;br /&gt;    NameCanonicalEx        = 9,&lt;br /&gt;    NameServicePrincipal   = 10,&lt;br /&gt;    NameDnsDomain          = 12&lt;br /&gt;  );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Criei essas duas funções que me retornam uma string (UnicodeString no Delphi 2010) ou AnsiString para testar e facilitar o uso da GetUserNameEx (A ou W).&lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;function TForm1.VtrGetUserNameExW(NameFormat: TEXTENDED_NAME_FORMAT): string;&lt;br /&gt;var&lt;br /&gt;  I: DWord;&lt;br /&gt;begin&lt;br /&gt;  I := 1000;&lt;br /&gt;  SetLength(Result, I);&lt;br /&gt;  GetUserNameExW(NameFormat, PChar(Result), I);&lt;br /&gt;  Result := string(PChar(Result));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TForm1.VtrGetUserNameExA(NameFormat: TEXTENDED_NAME_FORMAT): AnsiString;&lt;br /&gt;var&lt;br /&gt;  I: DWord;&lt;br /&gt;begin&lt;br /&gt;  I := 1000;&lt;br /&gt;  SetLength(Result, I);&lt;br /&gt;  GetUserNameExA(NameFormat, PAnsiChar(Result), I);&lt;br /&gt;  Result := AnsiString(PAnsiChar(Result));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Estou alocando um espaço de 1000 caracteres para o resultado. É arbitrário. Quem souber uma maneira melhor de fazer isso, talvez usando outra api para saber o tamanho do nome do usuário de antemão, por favor me avise.&lt;br /&gt;&lt;br /&gt;para testar chamo todas as funções, GetUserNameEx (A e W) passando todos os parâmetros possíveis de NameUnknown (0) a NameDnsDomain (12) e vejo o resultado.    &lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;procedure TForm1.Button2Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  enf: TEXTENDED_NAME_FORMAT;&lt;br /&gt;begin&lt;br /&gt;    Memo1.Lines.Add('Versão Wide -----------------------------------');&lt;br /&gt;    enf := NameUnknown;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameFullyQualifiedDN;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameSamCompatible;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameDisplay;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameUniqueId;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameCanonical;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameUserPrincipal;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameCanonicalEx;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameServicePrincipal;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameDnsDomain;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExW(enf));&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Memo1.Lines.Add('Versão Ansi -----------------------------------');&lt;br /&gt;    enf := NameUnknown;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameFullyQualifiedDN;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameSamCompatible;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameDisplay;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameUniqueId;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameCanonical;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameUserPrincipal;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameCanonicalEx;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameServicePrincipal;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;    enf := NameDnsDomain;&lt;br /&gt;    Memo1.Lines.Add(inttostr(integer(enf)) +' ' + VtrGetUserNameExA(enf));&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7DfR8bz1YUc/TZoaD8DjblI/AAAAAAAAAWY/e2WGxjqPLTk/s1600/Form1_getusernameex_2011-04-04_16-19-33.gif" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="170" width="400" src="http://3.bp.blogspot.com/-7DfR8bz1YUc/TZoaD8DjblI/AAAAAAAAAWY/e2WGxjqPLTk/s400/Form1_getusernameex_2011-04-04_16-19-33.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4984812010100258842?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4984812010100258842/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/api-getusernameex.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4984812010100258842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4984812010100258842'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/api-getusernameex.html' title='A API GetuserNameEx'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-7DfR8bz1YUc/TZoaD8DjblI/AAAAAAAAAWY/e2WGxjqPLTk/s72-c/Form1_getusernameex_2011-04-04_16-19-33.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3808062691063178806</id><published>2011-04-04T10:13:00.000-07:00</published><updated>2011-04-04T10:24:47.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='Api do Windows'/><title type='text'>Api hooking para mudar o usuário logado</title><content type='html'>Já está nas bancas a revista &lt;a href="http://blog.vitorrubio.com.br/2011/03/madshi-collection.html"&gt;Clube Delphi 127&lt;/a&gt; com meu primeiro artigo sobre a madShi Collection. Neste artigo eu explico o básico sobre API Hooking.&lt;br /&gt;&lt;br /&gt;Neste post falarei sobre um exemplo que não se encontra no artigo, que é o hooking da API GetUserName.&lt;br /&gt;Os motivos que levam a hookar essa API podem ser variados, e todos eles nada éticos a meu ver. Você pode desde tentar enganar um produto registrado para um usuário acessando-o como outro usuário ou simplesmente para tapear um usuário administrador, que quando olhar quem está logado verá um nome diferente (supondo que isso funcione, não testei).&lt;br /&gt;&lt;br /&gt;A idéia é que dá para mudar a resposta que outros programas recebem quando perguntam quem é o usuário logado. Para isso é necessário conhecer quais são as api's que fazem isso e como interceptá-las.&lt;br /&gt;&lt;br /&gt;O código dessa postagem mostra como usar a madCodeHook para interceptar a api GetUserName da api do windows.&lt;br /&gt;&lt;br /&gt;Primeiro de tudo criei um programa que mostra o nome do usuário corrente:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;function NomeUsuario: string;&lt;br /&gt;var&lt;br /&gt;  I: DWord;&lt;br /&gt;begin&lt;br /&gt;  I := 255;&lt;br /&gt;  SetLength(Result, I);&lt;br /&gt;  Windows.GetUserName(PChar(Result), I);&lt;br /&gt;  Result := string(PChar(Result));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TForm2.btTestarClick(Sender: TObject);&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  Edit1.Text := NomeUsuario;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esse programa simplesmente mostra o usuário logado. Depois de injetada a DLL que faz o hook a chamada a GetUserName terá seu resultado mudado.&lt;br /&gt;É preciso salientar que existe outra api chamada GetUserNameEx que não está mapeada na unit windows.pas e que aceita mais parâmetros, e devolve mais resultados. &lt;br /&gt;&lt;br /&gt;Interceptar essas duas API's é certeza de que mudará os resultados às suas relativas chamadas. Não é garantia nenhuma de que será possível abrir um arquivo para o qual seu usuário atual não tem autorização, mas não custa nada tentar.&lt;br /&gt;&lt;br /&gt;Como pôde ser visto nos artigos que escrevi para a Revista Clube Delphi, eis o código da dll a ser injetada. &lt;br /&gt;&lt;br /&gt;Essa dll intercepta apenas a função GetUserName, deixo a cargo do leitor a GetUserNamneEx, que é mais complexa. Num post futuro trataremos da GetUserNameEx. Deixo apenas o esqueleto para quem quiser se aventurar. &lt;br /&gt;&lt;br /&gt;Lembre-se de que se estiver usando a versão trial/demo da madCollectionHook deverá manter mchEvaluation rodando para que o hooking funcione. &lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;library hook;&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  SysUtils,&lt;br /&gt;  windows,&lt;br /&gt;  Classes,&lt;br /&gt;  madcodehook;&lt;br /&gt;&lt;br /&gt;{$R *.res}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;const&lt;br /&gt;  USUORIGINAL =  'vitorrubio';    //       vitorrubio --&gt; meu user&lt;br /&gt;  USUTROCA = 'Administrador';       //       Administrador--&gt; quem quero ser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  GetUserNameWNext:  function (lpBuffer: PWideChar; var nSize: DWORD): BOOL; stdcall;&lt;br /&gt;  GetUserNameANext:  function (lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function GetUserNameWCallback (lpBuffer: PWideChar; var nSize: DWORD): BOOL; stdcall;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  Result := GetUserNameWNext(lpBuffer, nSize);&lt;br /&gt;  if (trim(string(lpBuffer)) = USUORIGINAL) then&lt;br /&gt;  begin&lt;br /&gt;    StrCopy(lpBuffer, USUTROCA);&lt;br /&gt;    nSize := Length(USUTROCA);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function GetUserNameACallback (lpBuffer: PAnsiChar; var nSize: DWORD): BOOL; stdcall;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  Result := GetUserNameANext(lpBuffer, nSize);&lt;br /&gt;  if (trim(AnsiString(lpBuffer)) = AnsiString(USUORIGINAL)) then&lt;br /&gt;  begin&lt;br /&gt;    StrCopy(lpBuffer, USUTROCA);&lt;br /&gt;    nSize := Length(USUTROCA);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  HookAPI('advapi32.dll', 'GetUserNameW',  @GetUserNameWCallback, @GetUserNameWNext);&lt;br /&gt;  HookAPI('advapi32.dll', 'GetUserNameA',  @GetUserNameACallback, @GetUserNameANext);&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Agora o código para injetar, desinjetar e testar a dll:&lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;procedure TForm1.btInjetarClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'hook.dll');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.btTestarClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  Edit1.Text := NomeUsuario;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TForm1.btDesinjetarClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  UninjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'hook.dll');&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Crie uma form com 3 botões e um edit e teste. Lembre-se de todas as medidas de segurança necessárias para se trabalhar com API hooking e lembre-se que toda a api do windows se invoca com stdcall. &lt;br /&gt;&lt;br /&gt;Coloque a dll e o testador em um mesmo project group para facilitar.&lt;br /&gt;&lt;br /&gt;É importante salientar que qualquer processo que use a GetUserNameEx para identificar o usuário não sofrerá nenhum efeito desse hooking. Além disso o windows tem outras formas, de baixo nível, para descobrir o usuário logado. &lt;br /&gt;&lt;br /&gt;Have fun :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3808062691063178806?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3808062691063178806/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/api-hooking-para-mudar-o-usuario-logado.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3808062691063178806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3808062691063178806'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/api-hooking-para-mudar-o-usuario-logado.html' title='Api hooking para mudar o usuário logado'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-8612965363606652337</id><published>2011-04-01T12:10:00.000-07:00</published><updated>2011-04-01T12:10:41.505-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Primeiro de Abril dos programadores</title><content type='html'>Quem é do ramo de TI sabe o que são as normas &lt;a href="http://www.rfc-editor.org/"&gt;RFC&lt;/a&gt;. São conjuntos de convenções onde são estabelecidos padrões para que computadores possam se comunicar e trocar dados entre si, e para que esses dados sejam reconhecidos por todos. Se não fossem essas normas o mundo da TI seria um caos (e já não é). &lt;br /&gt;&lt;br /&gt;É insteressante o fato de que a norma &lt;a href="http://www.rfc-editor.org/rfc/rfc2550.txt"&gt;RFC 2550&lt;/a&gt; foi criada em 1° de abril de 1999, e tratava do bug y2k, o bug do milênio. Desde que a convenção de dadas expressa em 2 dígitos para o ano foi criada sabia-se que em 2000 isso &lt;strike&gt;ia dar merda&lt;/strike&gt; parar de funcionar, mas mesmo assim a solução foi deixada para 1999, a véspera.&lt;br /&gt;&lt;br /&gt;Lendo a norma, é possível encontrar o seguinte texto, bem - humorado apesar da seriedade e sobriedade das normas RFC:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;pre style="white-space: pre-wrap; word-wrap: break-word;"&gt;" Nearly everyone now regrets the&lt;br /&gt;   short-sightedness of the programmers of yore who wrote programs&lt;br /&gt;   designed to fail in the year 2000.  Unfortunately, the current fixes&lt;br /&gt;   for Y2K lead inevitably to a crisis in the year 10,000 when the&lt;br /&gt;   programs are again designed to fail."&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Numa tradução livre:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;"Quase todo mundo lamenta a falta de visão dos programadores de antigamente, que criaram os programas já designados para falhar em 2000. Infelizmente, as correções correntes para o Y2K conduzirão inevitavelmente a uma crise no ano 10.000, quando os programas falharão novamente"&lt;/blockquote&gt;&lt;br /&gt;Sei lá, eu nunca esperaria encontrar esse tipo de ironia sutil numa norma RFC mas é a mais pura realidade: prepare-se porque todos os programas falharão no ano 10.000, o que fizemos foi uma gambiarra que tem 8000 anos de duração.&lt;br /&gt;&lt;br /&gt;Há também na norma um padrão de nomenclatura para o bug do ano 10.000, chamado de YXK, em algarismos romanos (X) ou YAK, em hexadecimal (A = 10).&lt;br /&gt;&lt;br /&gt;Seja pró-ativo, não espere o pior acontecer, antecipe-se, corrija agora mesmo o bug do ano 10.000 no seu software :)&lt;br /&gt;&lt;br /&gt;Isso poderá gerar royalties e patentes para os seus tatatatatatatatatatatatatatatata (são 14 ou mais tatas?) ranetos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-8612965363606652337?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/8612965363606652337/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/primeiro-de-abril-dos-programadores.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8612965363606652337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8612965363606652337'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/04/primeiro-de-abril-dos-programadores.html' title='Primeiro de Abril dos programadores'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2691761289869592737</id><published>2011-03-28T10:35:00.000-07:00</published><updated>2011-03-28T10:35:00.447-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Meus patrões precisam ler isso'/><title type='text'>O analista de sistemas</title><content type='html'>Um homem anda por uma estrada próxima a uma cidade, quando percebe, a pouca distância, um balão voando baixo. O balonista lhe acena desesperadamente,&amp;nbsp;consegue fazer o balão baixar o máximo possível e lhe grita:&lt;br /&gt;&lt;br /&gt;- Ei você, poderia ajudar-me? Prometi a um amigo que me encontraria com ele às duas da tarde, porém já são duas e meia e nem sei onde estou. Poderia&amp;nbsp;me dizer onde me encontro?&lt;br /&gt;&lt;br /&gt;O outro homem, com muita cortesia, respondeu:&lt;br /&gt;&lt;br /&gt;- Mas claro que posso ajudá-lo! Você se encontra em um balão de ar quente, flutuando a uns vinte metros acima da estrada. Está a quarenta graus de&amp;nbsp;latitude norte e a cinqüenta e oito graus de longitude oeste.&lt;br /&gt;&lt;br /&gt;O balonista escuta com atenção e depois pergunta-lhe com um sorriso:&lt;br /&gt;&lt;br /&gt;- Amigo, você trabalha como analista de sistemas?&lt;br /&gt;&lt;br /&gt;- Sim, senhor, ao seu dispor! Como conseguiu adivinhar?&lt;br /&gt;&lt;br /&gt;- Porque tudo o que você me disse está perfeito e tecnicamente correto, porém esta informação me é Totalmente inútil, pois continuo perdido. &lt;br /&gt;&lt;br /&gt;Será que você não tem uma resposta mais satisfatória?&lt;br /&gt;&lt;br /&gt;O analista fica calado por alguns segundos e finalmente pergunta ao balonista:&lt;br /&gt;&lt;br /&gt;- E você, não seria por acaso um Gerente?&lt;br /&gt;&lt;br /&gt;- Sim, por um acaso sou um gerente. Porque?&lt;br /&gt;&lt;br /&gt;- Ah, foi muito fácil! Veja só: Você não sabe onde está e nem para onde vai. Fez uma promessa da qual não tem a mínima idéia de como irá cumprir&amp;nbsp;e ainda por cima espera que outra pessoa resolva o seu problema. Continua exatamente tão perdido quanto antes de me perguntar. Porém, agora,&amp;nbsp;por um estranho motivo, a culpa passou a ser minha...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2691761289869592737?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2691761289869592737/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/o-analista-de-sistemas.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2691761289869592737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2691761289869592737'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/o-analista-de-sistemas.html' title='O analista de sistemas'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4920856192270165167</id><published>2011-03-25T11:43:00.000-07:00</published><updated>2011-03-25T11:43:27.026-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lazarus'/><category scheme='http://www.blogger.com/atom/ns#' term='Pascal'/><title type='text'>Laço for in no lazarus</title><content type='html'>Já faz um tempinho que saiu esse feature, mas eu nem fazia idéia. Talvez mais pessoas não saibam.&lt;br /&gt;&lt;br /&gt;Agora já é possível usar o laço for... in no free pascal. Outras alterações previstas para a versão 2.5.x e muito bem vindas é a adição de generics e a nova sintaxe para classes, permitindo class vars e class properties.&lt;br /&gt;&lt;br /&gt;Segue abaixo um exemplo do operador for...in usando TStringList e Arrays Dinâmicos.&lt;br /&gt;&lt;br /&gt;&lt;pre class='brush: delphi'&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;   lista: TStringList;&lt;br /&gt;   vetor: array of string;&lt;br /&gt;   s: string;&lt;br /&gt;begin&lt;br /&gt;     lista := TStringList.Create;&lt;br /&gt;     lista.Add('Delphi');&lt;br /&gt;     lista.Add('Lazarus');&lt;br /&gt;     lista.Add('C#');&lt;br /&gt;     lista.Add('Java');&lt;br /&gt;     lista.Add('PHP');&lt;br /&gt;&lt;br /&gt;     for s in lista do&lt;br /&gt;         Memo1.Lines.Add(s); //ou showmessage(s)&lt;br /&gt;&lt;br /&gt;     SetLength(vetor, 5);&lt;br /&gt;     vetor[0] := 'Laranja';&lt;br /&gt;     vetor[1] := 'Maçã';&lt;br /&gt;     vetor[2] := 'Pera';&lt;br /&gt;     vetor[3] := 'Uva';&lt;br /&gt;     vetor[4] := 'Cajá';&lt;br /&gt;&lt;br /&gt;     for s in vetor do&lt;br /&gt;         Memo1.Lines.Add(s); //ou showmessage(s)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end;   &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Have fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4920856192270165167?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4920856192270165167/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/laco-for-in-no-lazarus.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4920856192270165167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4920856192270165167'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/laco-for-in-no-lazarus.html' title='Laço for in no lazarus'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-1976723260561560535</id><published>2011-03-23T09:12:00.000-07:00</published><updated>2011-03-23T09:12:54.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Leitura obrigatória sobre strings</title><content type='html'>A maior facilidade das strings do Delphi em relação ao C e C++ é que elas não são baseadas em operações de "baixo nível" com ponteiros. Elas são facilmente quebradas, concatenadas ou copiadas. No caso das cópias, elas podem ser copiadas com performance pois mantém um contador de referências.&lt;br /&gt;&lt;br /&gt;Em comparação com as linguagens interpretadas, gerenciadas e com "coletores de lixo" as strings nessas linguagens não são tão performáticas. Cópias de strings não são cópias de referências, mas da string completa mesmo, sem reference counting. Tratando - se de concatenação de strings então, o .Net Framework, até a versão 2.0, que eu saiba, encorajava o uso de StringBuilder em vez de strings dentro de um loop para montar um relatório ou tabela na web, por exemplo. Isso porque ao se concatenar duas strings o .Net Framework cria uma nova string com o conteúdo das duas, destruindo as outras duas, gerando um overhead.&lt;br /&gt;&lt;br /&gt;Imagine quantas operações dentro de um loop não acontecem quando você faz um:&lt;br /&gt;&lt;br /&gt;tabela += "&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;" + col1 + "&amp;lt;/td&amp;gt; &amp;lt;td&amp;gt;"+ col2+ "&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;";&lt;br /&gt;&lt;br /&gt;Só nesse trecho, bobinho e trivial, mas apenas um exemplo, foram concatenados 5 strings. Isso quer dizer que 5 "resultados" foram criados até chegar ao final, e que, duas a duas, de 5 a 10 strings foram marcadas para ser destruídas, pelo menos as constantes, excetuando-se as variáveis col1 e col2.&lt;br /&gt;&lt;br /&gt;O simples fato de trocar o conteúdo de uma string gera a destruição da string atual e a criação de outra no .Net. O programador final não percebe isso porque a sintaxe é bastante "amigável" e para strings e loops pequenos realmente parece que o .Net é performático. Isso não acontece no Delphi.&lt;br /&gt;&lt;br /&gt;Algumas leituras obrigatórias sobre strings:&lt;br /&gt;&lt;br /&gt;Marco Cantu compara as strings do Delphi com outras linguagens, tanto no que tange à sintaxe como à performance. --&amp;gt; &amp;nbsp;&lt;a href="http://blog.marcocantu.com/blog/delphi_super_duper_strings.html"&gt;http://blog.marcocantu.com/blog/delphi_super_duper_strings.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Meu artigo sobre strings --&amp;gt;&amp;nbsp;&lt;a href="http://blog.vitorrubio.com.br/2010/08/strings-e-delphi-2010-na-clube-delphi.html"&gt;http://blog.vitorrubio.com.br/2010/08/strings-e-delphi-2010-na-clube-delphi.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Paper na Embarcadero sobre Unicode --&amp;gt;&amp;nbsp;&lt;a href="http://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf"&gt;http://www.embarcadero.com/images/dm/technical-papers/delphi-unicode-migration.pdf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Artigo DrBob sobre strings --&amp;gt;&amp;nbsp;&lt;a href="http://www.drbob42.com/examines/examinA7.htm"&gt;http://www.drbob42.com/examines/examinA7.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Artigo na Embarcadero --&amp;gt;&amp;nbsp;&lt;a href="http://edn.embarcadero.com/article/38437"&gt;http://edn.embarcadero.com/article/38437&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;O que eu mais gosto é este: breve história sobre as strings no Delphi --&amp;gt;&amp;nbsp;&lt;a href="http://www.codexterity.com/delphistrings.htm"&gt;http://www.codexterity.com/delphistrings.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Have Fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-1976723260561560535?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/1976723260561560535/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/leitura-obrigatoria-sobre-strings.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1976723260561560535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1976723260561560535'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/leitura-obrigatoria-sobre-strings.html' title='Leitura obrigatória sobre strings'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-8240984309855058414</id><published>2011-03-17T09:35:00.000-07:00</published><updated>2011-03-17T09:35:50.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='trollface'/><title type='text'>A linguagem de programação do futuro</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; O empenho em analisar a execução dos pontos do programa desafia a capacidade de equalização das condições inegavelmente apropriadas. Podemos já vislumbrar o modo pelo qual a constante divulgação das informações oferece uma interessante oportunidade para verificação das formas de ação. Assim mesmo, o acompanhamento das preferências de consumo cumpre um papel essencial na formulação do fluxo de informações. O que temos que ter sempre em mente é que o comprometimento entre as equipes promove a alavancagem das diversas correntes de pensamento. Pensando mais a longo prazo, a determinação clara de objetivos faz parte de um processo de gerenciamento das novas proposições.&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Por conseguinte, a expansão dos mercados mundiais obstaculiza a apreciação da importância das condições financeiras e administrativas exigidas. Nunca é demais lembrar o peso e o significado destes problemas, uma vez que a crescente influência da mídia maximiza as possibilidades por conta dos conhecimentos estratégicos para atingir a excelência. Gostaria de enfatizar que a hegemonia do ambiente político representa uma abertura para a melhoria do investimento em reciclagem técnica. Não obstante, o consenso sobre a necessidade de qualificação afeta positivamente a correta previsão das direções preferenciais no sentido do progresso.&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A prática cotidiana prova que a percepção das dificuldades aponta para a melhoria dos relacionamentos verticais entre as hierarquias.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;Fonte: &lt;/span&gt;&lt;a href="http://padrelevedo.hpg.ig.com.br/lerolero/lerolero.html"&gt;http://padrelevedo.hpg.ig.com.br/lerolero/lerolero.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;sim, é um post troll ... &amp;nbsp;&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: 'Times New Roman'; font-size: small; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt; &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-8240984309855058414?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/8240984309855058414/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/linguagem-de-programacao-do-futuro.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8240984309855058414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8240984309855058414'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/linguagem-de-programacao-do-futuro.html' title='A linguagem de programação do futuro'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2296382374313474899</id><published>2011-03-17T09:22:00.000-07:00</published><updated>2011-03-17T09:22:15.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linguagem'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><title type='text'>Nunca confie no TIOBE</title><content type='html'>Em vários posts meus eu mencionei o índice &lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;TIOBE&lt;/a&gt; para relacionar a popularidade das linguagens. Mas eu não sabia como o índice TIOBE funcionava, achei que ele era sério, baseado em projetos, mas ele é mais furado que o IBOPE, muito mais.&lt;br /&gt;&lt;br /&gt;O TIOBE classifica popularidade como número de resultados nos buscadores. Ele parte de vários pressupostos errados.&lt;br /&gt;&lt;br /&gt;1) Assume que popularidade é o número de resultados de buscas de uma linguagem em um mecanismo de busca.&lt;br /&gt;2) Assume que todos os buscadores tem o mesmo peso, embora os resultados sejam muito diferentes e o algoritmo também.&lt;br /&gt;3) Não elimina ruidos. Se você pesquisar por java programming encontrará resultados relacionados com uma programação qualquer na ilha de Java, por exemplo.&lt;br /&gt;&lt;br /&gt;Além do ruido ser problema, a pesquisa é sempre feita com os termos &amp;lt;linguagem&amp;gt; programming, mas termos diferentes relacionados a uma mesma linguagem podem trazer resultados várias ordens de grandeza maiores ou menores do que &amp;lt;linguagem&amp;gt; programming. Além disso certas linguagens como javascript ou perl as pessoas costumam definir seu trabalho como scripting em vez de programming.&lt;br /&gt;&lt;br /&gt;Por favor leia esses artigos: (o derivado e a fonte) &lt;a href="http://akitaonrails.com/2008/04/13/off-topic-nunca-confie-no-tiobe"&gt;http://akitaonrails.com/2008/04/13/off-topic-nunca-confie-no-tiobe&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Parei de acreditar que o Java está sempre no topo. Embora muito utilizado e muito bom acredito que tenha outras linguagens que quase empatam com ele, em uma ordem totalmente diferente da TIOBE.&lt;br /&gt;&lt;br /&gt;Comecei a ver as e&lt;a href="https://github.com/languages"&gt;statísticas de linguagens dos projetos do GIT hub&lt;/a&gt;. Se o kernel do linux está lá e muitos projetos GPL estão lá também isso torna as medidas um tanto quanto confiáveis. Os resultados são bem diferentes do TIOBE. Mesmo assim ainda posso dizer que não são completamente confiaveis porque essa estatística é baseada em uma amostra viciada: a maioria dos amantes de Ruby também é fã de Git e os amantes do Git, em sua maioria, programam em Ruby, então existem muitos projetos em Ruby no Git Hub, mas existem muitos projetos em outras linguagens que não estão no Git Hub. Com o tempo e o crescimento da popularidade do Git Hub é possível que o índice fique mais apurado. Outro modo de se chegar a esse resultado seria considerar o número de projetos em cada linguagem do sourceforge e do google code também.&lt;br /&gt;&lt;br /&gt;Mas como eu sempre digo, REPITO:&lt;br /&gt;1 - a popularidade de uma linguagem nada tem a ver com sua utilidade&lt;br /&gt;2 - a popularidade de uma linguagem não tem nada a ver com a empregabilidade de seu programador&lt;br /&gt;3 - Mesmo Java, Ruby, Delphi ou C# sendo populares ou "modinhas" isso não vai te impedir de estudá-los ou estudar PROLOG caso a necessidade apareça&lt;br /&gt;&lt;br /&gt;Uma coisa é certa, um amigo meu me indicou Ruby e eu estou bastante curioso para ver como ele funciona. Por outro lado a vontade de programar para Android está me guiando ao Java.&amp;nbsp; Conclusão: JRuby :)&lt;br /&gt;&lt;br /&gt;Qualquer que seja a linguagem, não vou mais conficar no índice da TIOBE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2296382374313474899?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2296382374313474899/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/nunca-confie-no-tiobe.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2296382374313474899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2296382374313474899'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/nunca-confie-no-tiobe.html' title='Nunca confie no TIOBE'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3578037791470639472</id><published>2011-03-15T08:28:00.000-07:00</published><updated>2011-03-15T08:28:46.467-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e-commerce'/><title type='text'>GEBRASA nunca mais - sobre e-commerce</title><content type='html'>Trabalho com e-commerce, mas não farei aqui um post sobre desenvolvimento de e-commerce e sim sobre gerência de e-commerce.&lt;br /&gt;&lt;br /&gt;Qual é a principal preocupação do cliente, e a principal dúvida ao comprar em uma loja "online"? A dúvida é sempre a mesma: "será que a empresa vai entregar?"&lt;br /&gt;&lt;br /&gt;O pagamento se dá de maneira muito fácil, via cartão de crédito. Mas caso haja algum problema o cliente sabe que o estorno é um inferno. Se o pagamento é intermediado por uma dessas MOIP ou PagSeguro da vida é pior, pois existe mais uma camada intermediária para atravancar o estorno, que pode demorar até 45 dias e fazer com que a empresa simplesmente tome posse de dinheiro seu emprestado, sem juros.&lt;br /&gt;&lt;br /&gt;Algumas empresas se confundem ou se enganam na hora de entregar um produto, o que é até aceitável, e entregam o produto errado. Depois demoram muito para devolver o dinheiro ou trocar o produto (Submarino, por exemplo). Mas talvez a demora seja causada pela massa: um volume muito grande de clientes, pedidos, produtos.&lt;br /&gt;&lt;br /&gt;Outras empresas fazem a chamada venda de cauda longa: elas vendem um produto mesmo não tendo no estoque, mas É &lt;b&gt;CERTEZA &lt;/b&gt;que o produto existe no estoque dos fornecedores, e não está esgotado. Com isso a &amp;nbsp;empresa pode solicitar o produto do fornecedor sob demanda e mandar despachar para o cliente. É como "just in time".&lt;br /&gt;&lt;br /&gt;Um e-commerce nunca, &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;NUNCA &lt;/span&gt;&lt;/b&gt;deveria fazer venda de cauda longa de algo que depende de fabricante e não de distribuidor, ou seja, de um produto que deva ser FABRICADO. Tampouco deveria fazer venda de cauda longa de um produto sazonal .&lt;br /&gt;&lt;br /&gt;Bom, essa bronca é para a &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;GEBRASA&lt;/span&gt;, empresa na qual eu &lt;span class="Apple-style-span" style="font-size: large;"&gt;NUNCA MAIS COMPRAREI e DESACONSELHO FORTEMENTE&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Comprei um simples hack, um quadrado de madeira (ou coisa que o valha) para colocar meu pc, monitor e impressora, paguei, e não vi a cor até hoje, dois meses depois. Coisa que se eu tivesse comprado numa loja qualquer estaria levando pra casa no mesmo dia.&lt;br /&gt;&lt;br /&gt;Se a empresa me mandasse periodicamente um e-mail me posicionando sobre o status do meu pedido, ou ligasse ou mandasse um e-mail se desculpando e mandando um prazo ou oferecendo a devolução do meu dinheiro eu não ficaria nervoso, pois sei que essas coisas acontecem. &amp;nbsp;Mas a GEBRASA, além de não dar prazo e dizer que não tem previsão de entrega foi estupidamente mal educada no atendimento por e-mail, dizendo simplesmente: "você não leu no site? lá está escrito que há um prazo de 10 dias para verificar a disponibilidade do produto no estoque.". É verdade, mas não se passaram 10 dias, se passaram 58, para ser mais exato.&lt;br /&gt;&lt;br /&gt;Como o pagamento foi feito via MOIP, teria que aguardar a MOIP entrar em "disputa" com eles. Não tenho paciência para isso, ficar ouvindo musiquinha em ura...&lt;br /&gt;&lt;br /&gt;Perdoem-me meus leitores, eu nunca pronuncio palavras vulgares, de baixo calão e profanidades no meu blog técnico, mas .... pra puta que o pariu com essa merda.&lt;br /&gt;&lt;br /&gt;Depois de 4 trocas de e-mails com muita desconsideração e descaso com o cliente entrei no &lt;a href="http://www.reclameaqui.com.br/1116416/gebrasa-online/comprei-o-produto-e-nao-recebo-de-maneira-alguma/"&gt;reclame aqui&lt;/a&gt;, procon e entrei em contato com a VISA para estorno do meu pagamento, tudo de uma vez. Para a VISA ainda tive que mandar um FAX (o que é isso meu Deus? Falando a verdade, nunca tinha usado um desses antes....) enorme cheio de firulas e burocracias.&lt;br /&gt;&lt;br /&gt;Espero sinceramente que a GEBRASA feche as portas da maneira mais humilhante possível. No mais, desculpem-me pelo desabafo, prometo que o próximo post será tech, com certeza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3578037791470639472?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3578037791470639472/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/gebrasa-nunca-mais-sobre-e-commerce.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3578037791470639472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3578037791470639472'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/gebrasa-nunca-mais-sobre-e-commerce.html' title='GEBRASA nunca mais - sobre e-commerce'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2843964745737248755</id><published>2011-03-14T12:55:00.000-07:00</published><updated>2011-03-14T12:55:22.030-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>madShi collection</title><content type='html'>&lt;div class="separator" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;span id="goog_1710068286"&gt;&lt;/span&gt;&lt;span id="goog_1710068289"&gt;&lt;/span&gt;&lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_127#a-3351"&gt;&lt;img border="0" height="320" src="http://video.devmedia.com.br/video/imagens/websysimg/CD/127/capaOnline_cd127.jpg" width="273" /&gt;&lt;/a&gt;&lt;span id="goog_1710068290"&gt;&lt;/span&gt;&lt;span id="goog_1710068287"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Saiu na revista &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_127#a-3351"&gt;Clube Delphi 127&lt;/a&gt;&amp;nbsp;meu artigo sobre a madShi Collection, uma coleção de bibliotecas muito úteis e interessante. Elas vão além do basicão fornecendo aos programadores funcionalidades bastante inusitadas, como api hooking, e funcionalidades que são uma mão na roda na hora de distribuir seu software ou na hora de encontrar bugs persistentes. O madExcept é um gerenciador de exceções que automaticamente gera um log com nome da unit e até a linha do código que disparou o erro. Seu usuário pode simplesmente clicar em um botão para te enviar o relatório de erros.&lt;br /&gt;&lt;br /&gt;Espero que gostem do artigo. Boa leitura :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2843964745737248755?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2843964745737248755/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/madshi-collection.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2843964745737248755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2843964745737248755'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/madshi-collection.html' title='madShi collection'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3585060050138602162</id><published>2011-03-09T13:55:00.001-08:00</published><updated>2011-07-21T09:14:48.298-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inglês'/><title type='text'>Dicas de Inglês</title><content type='html'>O inglês é essencial para programadores. Ponto. Não importa o pais em que você esteja, o inglês é o esperanto que deu certo, pelo menos nessa nossa era.&lt;br /&gt;&lt;br /&gt;O site &lt;a href="http://www.teclasap.com.br/blog/"&gt;Tecla Sap&lt;/a&gt; tem muitas dicas interessantes para quem já cursa inglês mas quer sanar dúvidas, pegar dicas ou aprimorar seus conhecimentos.&lt;br /&gt;&lt;br /&gt;Peguei &lt;a href="http://www.teclasap.com.br/blog/2007/05/06/pronuncia-l-mudo/"&gt;essa dica&lt;/a&gt; hoje no site: Palavras com "L" mudo. Acontece também com outras letras, por isso muita atenção à pronúncia. Ensaie a pronúncia em diálogos reais.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, Times, serif; font-size: 14px; line-height: 21px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 30px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;ALMS /aams/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Esmola&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;BALM /baam/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Bálsamo&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;CALM /kaam/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Calmo&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;COULD /kud/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Passado do verbo auxiliar “CAN” (poder)&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;HALF /héf/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Metade&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;a href="http://www.teclasap.com.br/blog/2007/05/06/pronuncia-palm/" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;PALM&lt;/a&gt;&amp;nbsp;/paam/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Palma; palmeira;&amp;nbsp;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; font-style: italic; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;palm&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;PSALM /saam/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Salmo&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;SALMON /SÉ m@n/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Salmão&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;SHOULD /shud/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Deveria (verbo auxiliar)&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;SOLDER /SÓ d@r/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Solda&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;TALK /tók/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Conversar&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;WALK /wók/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Andar&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;WOULD /wud/&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Verbo auxiliar usado no condicional&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;I’ll have the salmon, please.&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Vou querer o salmão, por favor.&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: red; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;Aluminum is also very difficult to solder. (Chicago Tribune)&lt;/span&gt;&lt;/li&gt;&lt;li style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 14px; list-style-type: circle; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"&gt;É muito difícil soldar alumínio também.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3585060050138602162?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3585060050138602162/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/o-ingles-e-essencial-para-programadores.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3585060050138602162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3585060050138602162'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/o-ingles-e-essencial-para-programadores.html' title='Dicas de Inglês'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5628639448443895181</id><published>2011-03-01T09:20:00.000-08:00</published><updated>2011-03-01T09:20:33.489-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><category scheme='http://www.blogger.com/atom/ns#' term='linguagem'/><title type='text'>Qual o problema dos Anglicismos?</title><content type='html'>Muitas pessoas respeitáveis, lingüistas, professores, mestres, doutores em geral criticam o uso de anglicismos no dia-a-dia, quer como gírias quer como jargões de profissões emergentes.&lt;br /&gt;&lt;br /&gt;Na área de Ciência da Computação, Ciência da Informação e outras áreas correlatas há a tendência de mestres e doutores renomados ter uma aversão a novos &lt;a href="http://pt.wikipedia.org/wiki/Anglicismo"&gt;anglicismos&lt;/a&gt;(relacionados a novas tecnologias) propondo seus correspondentes em português.&lt;br /&gt;&lt;br /&gt;Mas pense: se para designar nomes de seres vivos na Biologia (taxonomia) usa-se o latim, usando-se também na designação de vários termos jurídicos, mundialmente. Além disso usa-se palavras latinas ou gregas para vários termos técnicos da Química, Física, Matemática e Linguística porque não usar o Inglês para as Ciências da Computação e da Informação?&lt;br /&gt;&lt;br /&gt;Matemática, Biologia, Química, Física e Direito são ciências que começaram a ser estudadas desde os primórdios da humanidade, atravessando a época em que o Grego e o Latim foram as línguas mundialmente predominantes e continuam sendo usadas após a "morte" dessas línguas. Optou-se, por padrões e convenções internacionais, usar por exemplo o Latim no Direito e na Biologia. Porque não usar o Inglês para as Ciências da Computação e da Informação? Tenho alguns motivos pra isso:&lt;br /&gt;&lt;br /&gt;1) São ciências novas, que começaram a ser estudadas e desenvolvidas desde a década de 1950 para cá.&lt;br /&gt;2) A maioria (mas não todas) das contribuições para essas ciências veio indiscutivelmente de países de língua inglesa.&lt;br /&gt;3) Torno a dizer que o inglês é a língua predominante e mundialmente conhecida hoje, por isso nada mais justo do que ser usada para cunhar os nomes de novos termos e jargões de ciências também contemporâneas.&lt;br /&gt;4) Lembre-se que um anglicismo para designar uma nova tecnologia também é um neologismo em seu país de origem, pois é um novo uso para uma palavra antiga, ou uma junção de palavras.&lt;br /&gt;&lt;br /&gt;Concordo plenamente que palavras existentes no nosso português não devem ser substituidas por seus equivalentes em inglês. É o caso de &lt;b&gt;performance&lt;/b&gt; em detrimento de &lt;b&gt;desempenho &lt;/b&gt;ou &lt;b&gt;acurácia &lt;/b&gt;em detrimento de &lt;b&gt;exatidão&lt;/b&gt;. Mas dependendo da palavra isso se faz necessário, um exemplo:&lt;br /&gt;&lt;br /&gt;Em inglês dá-se o nome de "framework" para um conjunto sólido e grande bibliotecas, exemplos, padrões e &amp;nbsp;partes ou componentes de software pré montado para a elaboração rápida de outros softwares. Alguns tradutores traduzem framework como biblioteca, moldura, estrutura etc ... quando &amp;nbsp;na verdade a palavra que mais se aproxima do significado de framework é&lt;b&gt; "&lt;a href="http://www.dicio.com.br/arcabouco/"&gt;arcabouço&lt;/a&gt;"&lt;/b&gt;, palavra pouco usada até mesmo por engenheiros civis.&lt;br /&gt;&lt;br /&gt;Mas é simplesmente uma arrogância ou prepotência, um orgulho besta, países de língua portuguesa e doutores em diversas ciências querer designar sites por sítios (eu não planto abobrinhas nem crio vacas em meu site), mouse por rato e por aí vamos. Por acaso você usa viamole ou meiomole para software e meioduro ou "ferragens" para hardware? Dificilmente.&lt;br /&gt;&lt;br /&gt;Outro motivo pelo qual eu não sou avesso a anglicismos é o seguinte: a língua é viva. Ela muda com o tempo,&amp;nbsp;espontaneamente ou por absorção / cruzamento com outras línguas. Se não impedimos que certos animais ou vegetais absorvam características genéticas de outros ao se fazer cruzamentos e enxertos, muito pelo contrário, tentamos e encorajamos propositalmente isso, porque seria diferente com a língua? Nossa língua já poderia sofrer uma mutação só pelo isolamento geográfico de Portugal (é uma boa distância e um bom trecho de oceano no meio). Que dizer então das influências (cruzamentos) com as línguas indígenas, africanas, o francês, o holandês, o italiano que vaio depois etc ... Nossa língua é um ser vivo, vira - lata que seja, só nosso.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pt.wikipedia.org/wiki/J._R._R._Tolkien"&gt;Tolkien&lt;/a&gt;&amp;nbsp;era linguista e filólogo. Em seu trabalho ele criou todo um mundo, uma nação e uma língua. Na sua obra literária ele demonstra como o isolamento e os choques de cultura podem criar novas línguas, e usou suas histórias para embasar suas pesquisas. Nas suas histórias, desde O Silmarillion até o Senhor dos Anéis, essa nação e língua se divide em várias partes. Os Elfos primeiramente fogem da Terra Média para Valinor, no continente sagrado de Arda. Mas alguns Elfos permanecem na Terra Média. O isolamento geográfico dos dois grupos, por milênios, criou na Terra Média uma segunda língua, um dialeto. Os elfos então tinha duas línguas, o Quenya e o Sindarin. Parte do povo de Valinor, após séculos, voltou para a Terra Média. Lá encontraram duas novas raças, os Anões e os Homens. As duas Línguas sofreram mais fusões e divisões. Os meio-elfos foram para Númenor, ilha criada posteriormente pelos Deuses entre Valinor e a Terra Média. Mais tarde as línguas dos homens também sofreram mutações e divisões, uma vez que o homem mortal, por ter vida muito mais curta do que os elfos, era mais suscetível ao isolamento geográfico e social.&lt;br /&gt;&lt;br /&gt;Não é exatamente isso que aconteceu na história de todas as línguas ao redor do mundo? Será que não tem influências da língua portuguesa em outras línguas, por exemplo o&lt;a href="http://pt.wikipedia.org/wiki/Palavras_japonesas_de_origem_portuguesa"&gt; Japonês&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Esta é uma citação de Tolkien que eu considero interessante e verdadeira:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="10" style="background-color: transparent; border-bottom-style: none; border-collapse: collapse; border-left-style: none; border-right-style: none; border-top-style: none; color: black; font-size: 13px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="20"&gt;&lt;a class="image" href="http://pt.wikipedia.org/wiki/Ficheiro:Cquote1.svg" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;"&gt;&lt;img alt="Cquote1.svg" height="15" src="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Cquote1.svg/20px-Cquote1.svg.png" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; vertical-align: middle;" width="20" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;O&amp;nbsp;&lt;a href="http://pt.wikipedia.org/wiki/Volapuque" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;"&gt;Volapuque&lt;/a&gt;,&amp;nbsp;&lt;a href="http://pt.wikipedia.org/wiki/Esperanto" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;"&gt;Esperanto&lt;/a&gt;, o&amp;nbsp;&lt;a href="http://pt.wikipedia.org/wiki/Ido" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;"&gt;Ido&lt;/a&gt;, o&amp;nbsp;&lt;a href="http://pt.wikipedia.org/wiki/Novial" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: none;"&gt;Novial&lt;/a&gt;, são línguas mortas, mais mortas do que antigas línguas sem uso, porque seus inventores jamais criaram lendas para acompanhá-las.&amp;nbsp;&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;a class="image" href="http://pt.wikipedia.org/wiki/Ficheiro:Cquote2.svg" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: none; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #0645ad; text-decoration: underline;"&gt;&lt;img alt="Cquote2.svg" height="15" src="http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Cquote2.svg/20px-Cquote2.svg.png" style="border-bottom-style: none; border-color: initial; border-left-style: none; border-right-style: none; border-top-style: none; border-width: initial; vertical-align: middle;" width="20" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uma língua precisa ser embasada em uma história e cultura. Se uma língua for artificial ela deve ser embasada em histórias e culturas artificiais, senão ela já nasce morta. Parte desta "vida" ou desta "cultura" da língua se deve a fusões com outras línguas e as confusões e desentendimentos que isso pode causar.&lt;br /&gt;&lt;br /&gt;Gostaria até de citar esse &lt;a href="http://twitter.com/#!/Nelson_Machado/status/32429541150433280"&gt;twit &amp;nbsp;do dublador Nelson Machado&lt;/a&gt;, de quem sou fã e admiro muito o trabalho: (a própria palavra &lt;a href="http://pt.wikipedia.org/wiki/F%C3%A3"&gt;fã&lt;/a&gt; é um anglicismo)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, Palatino, 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 36px;"&gt;Nós tínhamos o formal e responsável TRABALHO. Criamos o informal e libertário TRAMPO. Agora vivemos com o submisso JOB!!! Êêê, povinho!&lt;/span&gt;&lt;/blockquote&gt;Lógico que não conheço o contexto desse tweet, muito menos o que gerou a crítica. Mas é apenas um exemplo.&lt;br /&gt;&lt;br /&gt;Ora, porquê submissão? O "job" é o trabalho do freelance. Se o nome de sua profissão é um anglicismo e a culpa nem é sua, porque o nome de parte do seu trabalho deveria ser diferente? Job pode ser também uma etapa de uma sequência de etapas de um programa que rode vários comandos em lote.&lt;br /&gt;&lt;br /&gt;Terei que discordar (não confunda com descordar) um pouco do Machado. Não sei se o caso é submissão, mas analise os seguintes fatos:&lt;br /&gt;&lt;br /&gt;1) Encare o Inglês como o &lt;a href="http://pt.wikipedia.org/wiki/Esperanto"&gt;esperanto que deu certo&lt;/a&gt; e você vai entender as próximas enumerações:&lt;br /&gt;2) Job é mais curto, podendo ser melhor inserido em uma mensagem de 140 caracteres, seja ela um "torpedo" de celular ou uma "micropostagem" de um "microblog". Se a maioria das pessoas conhecesse chinês e o tivesse como sua segunda língua, ou seja, se o chinês assumisse o papel do que o inglês é hoje, aposto que a pessoa em questão, numa mensagem de texto, preferiria usar (??) que só tem 2 caracteres do que job que tem três ou trabalho que tem 8. Não sei como se pronuncia (??) usei o google translator. Aposto que isso pode ser comum nas regiões fronteiriças entre a China e outros países, ou em países colonizados pela China.&lt;br /&gt;3) O uso de anglicismos como gíria na linguagem falada, desconsiderando-se o uso em sites e celulares e &amp;nbsp;levando em consideração sociologia e psicologia, serve como identificação de um grupo: O grupo que sabe o que é e usa a palavra "Job" em detrimento de quem não usa. Pode parecer simplista, mas as pessoas que moram na extrema zona leste de São Paulo dizem a palavra "suave" a cada 3 ou 4 outras palavras, e "suave" como gíria, assume uma gama muito grande de significados e nuanças que variam de acordo com a entonação de voz e o contexto. Pode significar desde um "fácil" até uma pergunta "tudo bem?" (suave?).&lt;br /&gt;4) Não defendo o uso de gírias e nem afirmo que ela faz parte (ou deva fazer parte) da lingua culta, mas, conforme os estudos de muitos linguistas e o legado que Tolkien deixou, as línguas são vivas e sofrem "mutações" expontâneas conforme o tempo passa. O isolamento de um grupo de outro grupo pode acelerar o processo de diferenciação das línguas. Por acaso existe maior isolamento do que &amp;nbsp;o isolamento social que ocorre dentro de uma cidade, onde alguns tem acesso a um ensino de qualidade e línguas estrangeiras enquanto que outros, que já estão semi-isolados geograficamente, não tem acesso ao ensino básico? É por isso que a linguagem sofre tantas mudanças mesmo dentro de uma mesma cidade, variando de bairro para bairro.&lt;br /&gt;&lt;br /&gt;Repito:&amp;nbsp;Será que não tem influências da língua portuguesa em outras línguas, por exemplo o&lt;a href="http://pt.wikipedia.org/wiki/Palavras_japonesas_de_origem_portuguesa"&gt;&amp;nbsp;Japonês&lt;/a&gt;? Não seria submissão então do povo Japonês aos portugueses? Creio que não.&lt;br /&gt;&lt;br /&gt;E por falar em submissão, não seria uma submissão de mais de 500 anos nós continuarmos falando português? Aliás, parando para pensar melhor, quem disse que falamos português?&lt;br /&gt;Se você conversar com pessoas do Cabo Verde, Angola ou Guiné Bissau você verá que, salvo alguns regionalismos e palavras próprias, a língua em geral, sonoridade das palavras, consoantes e vogais é muito mais parecida com o português de Portugal do que o é nosso português brasileiro. Nossa língua portuguesa está muito distante do português de Portugal. Além da influência de outras linguas, africanas, indigenas e saxônicas (tivemos aqui alemães e holandeses também)&lt;br /&gt;nosso isolamento foi maior. Não só o isolamento geográfico foi maior, como o isolamento intelectual também. Por séculos falamos português por aqui tendo poucos ou nenhum professor de português decente. &lt;br /&gt;Você pode ver isso na prática, num exemplo até simplório, como abolimos os pronomes "Tu" e "Vós" enquanto que eles ainda são usados nos outros países que se fala Português. &lt;br /&gt;&lt;br /&gt;Isso não é evidente só no português. O inglês americano, o qual estudamos e adotamos como "&lt;a href="http://pt.wikipedia.org/wiki/Esperanto"&gt;esperanto que deu cert&lt;/a&gt;o", é muito diferente do inglês da Inglaterra, do Canadá, da Austrália etc... mesmo assim não parece ser tão diferente quanto o português do Brasil é dos outros "portugueses". O mesmo se dá com o espanhol.&lt;br /&gt;&lt;br /&gt;O que tudo isso tem a ver com o blog? Linguagens de programação também são estudadas por linguistas e vice-versa. É uma área interdisciplinar e multidisciplinar. Linguagens de programação são línguas artificiais, com verbos predominantemente no imperativo, e formais, sem ambiguidades. Pode-se dizer que as linguagens de programação estão mais vivas que um esperanto, por assim dizer, porque são amplamente usadas no dia a &amp;nbsp;dia de muitos profissionais e elas têm história: você sabe que o C é pai do C++, avô do Java e bisavô do C#. Você sabe que Oxygene é um filho bastardo do C# com o Object Pascal ... e por aí vai.&lt;br /&gt;&lt;br /&gt;Antes de criticar anglicismos vamos analisar um pouco os fatos. &amp;nbsp;Anglicismos vão ocorrer, quer sejam coibidos quer não.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5628639448443895181?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5628639448443895181/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/qual-o-problema-dos-anglicismos.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5628639448443895181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5628639448443895181'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/03/qual-o-problema-dos-anglicismos.html' title='Qual o problema dos Anglicismos?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6513383721285303187</id><published>2011-02-23T04:57:00.000-08:00</published><updated>2011-02-23T04:57:04.934-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Artigo sobre WordPress publicado na Clube Delphi 126</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_126#a-3202" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://www.vitorrubio.com.br/imagens/artigos/cd126.jpg" width="273" /&gt;&lt;/a&gt;&lt;span id="goog_73359452"&gt;&lt;/span&gt;&lt;span id="goog_73359455"&gt;&lt;/span&gt;&lt;span id="goog_73359456"&gt;&lt;/span&gt;&lt;span id="goog_73359453"&gt;&lt;/span&gt;&lt;/div&gt;Já está disponível no site da Dev Media a algum tempo, e logo chegará nas bancas a revista Clube Delphi edição 126.&lt;br /&gt;&lt;br /&gt;Nesta edição saiu um artigo meu sobre o WordPress, como integra-lo com uma aplicação Delphi para postagens ou monitoria do que se fala sobre sua marca. Esse artigo&amp;nbsp;foi uma pincelada no assunto. A integração ainda pode se dar via RSS, webservices e outros tipos de customização. Além disso o que foi apresentado não se aplica apenas ao WordPress, mas ao Magento e Joomla também.&lt;br /&gt;&lt;br /&gt;Gostaria de destacar o artigo do Rodrigo Araújo sobre Expressões Regulares. Sempre quisemos ter isso no Delphi e agora temos nativo, o que é muito bom.&lt;br /&gt;&lt;br /&gt;Padrão Strategy do Rafael Stavarengo é um dos que eu recomendo fortemente a leitura. Aliás, todos os artigos do Rafael Stavarengo são fortemente recomendados. O cara manja muito de POO eDesign Patterns.&lt;br /&gt;&lt;br /&gt;O Datasnap XE é O DATASNAP. Tudo o que você esperava de melhorias nessa tecnologia agora estão aí, disponíveis. E o Rodrigo Carreiro Mourão, outra fera, fala de DataSnap associado a generics, RTTI e DAO.&lt;br /&gt;&lt;br /&gt;O artigo de capa é indispensável para quem quer praticar XP. Os builds DEVEM ser automatizados.&lt;br /&gt;&lt;br /&gt;Espero que todos tenham uma ótima leitura.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6513383721285303187?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6513383721285303187/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/artigo-sobre-wordpress-publicado-na.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6513383721285303187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6513383721285303187'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/artigo-sobre-wordpress-publicado-na.html' title='Artigo sobre WordPress publicado na Clube Delphi 126'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-1133040002868974084</id><published>2011-02-22T10:46:00.000-08:00</published><updated>2011-02-22T10:46:02.757-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='prism'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Delphi Prism, porque não vale a pena</title><content type='html'>Antes de mais nada, Delphi Prism é uma excelente linguagem. Tem todos os recursos que uma linguagem moderna deve ter, é totalmente OO,&amp;nbsp;tem sobrecarga de operadores, Generics, Lambda Expressions, Funções anônimas, é fortemente tipada mas permite type inference etc...&lt;br /&gt;&lt;br /&gt;Longe de criticar a linguagem em si e quem investe nela, ou quem a concebeu, tenho algumas criticas com relação ao Delphi Prism que me levam a ponderar se vale mesmo a pena investir na linguagem, já explico o porque.&lt;br /&gt;&lt;br /&gt;1) Você não vai economizar na curva de aprendizado. Se você acha que sendo um "Delpheiro" vai economizar na curva de aprendizado do Delphi Prism está enganado. Ao aprender, treinar e desenvolver em Delphi Prism você enfrentará os mesmos desafios que enfrentaria aprendendo C#. Isso se dá porque a maior parte desse aprendizado é referente à semântica (conjunto de bibliotecas, o como fazer) do que à sintaxe. A sintaxe você pega em um dia.&lt;br /&gt;&lt;br /&gt;2) O Delphi Prism não é o Delphi .Net. O Delphi .Net (8, 2005, 2006 etc) morreu/foi descontinuado, uma pena. Mas este porduto ERA delphi. Não somente em termos de sintaxe e recursos da linguagem, mas em termos de semântica também. Afinal ele tinha uma "VCL", ou uma tentativa de se reimplementar a VCL no .Net Framework. Era um Framework dentro de outro. A migração do Delphi Win32 para o Delphi .Net era POUCO menos trabalhosa, e a curva de aprendizado um pouco mais suave.&lt;br /&gt;&lt;br /&gt;3) Delphi Prism, ou Oxygene, é baseado em pascal, mas muito diferente se comparado com o Object Pascal. Não estou falando em termos de bibliotecas e frameworks que vem no pacote, mas sim de sintaxe. O uso da palavra method no lugar de function ou procedure na minha opinião é desnecessário. Agora, lembra do pascal? Para retornar o valor de uma função você fazia, no final do código da função, NomeFuncao := valor. Muito intuitivo, didático e inteligente. Internamente à função você pode usar o nome dela para atribuir-lhe o valor de retorno, como se ela fosse uma variável local dela mesma. Isso não impedia que se usasse chamadas recursivas ou ponteiros para função. No Delphi/Object pascal tivemos a introdução da variável artificial/implícita Result. Então se você tem uma função Soma, ela pode retornar o valor da maneira Soma := valor ou Result := valor. Result nada mais era do que um atalho, já que na época do pascal até meados do Delphi 1 todo mundo usava uma variável Result como acumulador temporário antes de retornar o valor da função. Mesmo assim Result ainda tem mais "cara" de variável do que de comando.&lt;br /&gt;No Delphi Prism não existe mais a forma Soma := valor, ou método := valor. Você DEVE OBRIGATORIAMENTE usar Result. Result passou do status de "variável" para "comando". Result agora é para o prism o que o return é para as linguagens c-like. Só que sem a vantagem de abandonar imediatamente. Para isso você ainda deve forçar a saída do método. Na minha opinião tirar a sintaxe tradicional do pascal É UMA VIOLAÇÃO DO QUE É SANTO, sim, uma heresia.&lt;br /&gt;&lt;br /&gt;4) Não existe (m) ferramentas, compiladores, alternativas gratuitas/open source para o Prism. &amp;nbsp;(o command line tools não conta, seu uso é muito restrito). Também não existem cursos/disciplinas dessa linguagem nos cursos técnicos ou tecnólogos. Logo, você não deve esperar facilidade em contratar um estagiário ou júnior nessa linguagem, muito menos um Sênior autodidata hobbista. A única maneira de ser um autodidata hobbista com Delphi Prism é com pirataria, e eu não faço apologia a pirataria.&lt;br /&gt;&lt;br /&gt;Veja bem, continuo achando Delphi Prism demais, gosto muito mesmo, é uma iniciativa legal da Rem Objects e tem todo um histórico de coisas legais por trás disso, mas não programaria com ela se não fosse pago pra isso. Não que ela não tenha futuro, muito pelo contrário, ela pode ter um futuro promissor, mas tudo vai depender de como a dupla RemObjects Embarcadero divulgar e liberar a ferramenta. E não se iluda: Delphi Prism não é Delphi. Se você acha que pode fazer aplicações para IPhone / IPad / IPod no Delphi Prism muito mais facilmente simplesmente porque é "parecido" com Delphi está muito enganado. Utilizando C# você tem a mesma dificuldade, com a vantagem de instalar uma ferramenta a menos. (você não precisaria do prism, mas apenas do visual studio, mono develop, mono e monotouch). Mesmo assim desenvolver para IPhone / IPod / IPad é tão diferente do ambiente Delphi / Win32 que a acentuação na curva de aprendizado, ou seja, a sua dificuldade, estaria no ambiente, no sdk e nas api's da Apple, e não na linguagem. A dificuldade não mudaria muito se você escolhesse o objective-C. E não espere muita portabilidade do código feito em Prism para dentro e fora do windows/mac/linux. Isso porque as bibliotecas e apis que você usa em um não encontrará no outro. A unica coisa que dá para migrar são classes de negócio, as mais abstratas possíveis, e bibliotecas de serviços/funções feitas por você que são algoritmos puros, sem o uso de outras bibliotecas. Nada de GUI ou comunicações.&lt;br /&gt;&lt;br /&gt;Basicamente é isso. Se por um acaso a linguagem ganhasse uma implementação open-source (GPL de preferência) e talvez um plugin para integrar sua sintaxe no Eclipse, Sharp Develop ou Mono Develop tudo bem. Enquanto esse dia não chega o Prism não passará de mais uma linguagem .Net entre tantas, com a desvantagem de ser para minorias e de ser só mais uma linguagem fechada e cara dentre tantas abertas e/ou gratuitas.&lt;br /&gt;&lt;br /&gt;Críticas? Serão bem vindas. Trollagem? Dê-me audiência.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-1133040002868974084?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/1133040002868974084/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/delphi-prism-porque-nao-vale-pena.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1133040002868974084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1133040002868974084'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/delphi-prism-porque-nao-vale-pena.html' title='Delphi Prism, porque não vale a pena'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-7378430302626856875</id><published>2011-02-18T08:57:00.000-08:00</published><updated>2011-02-18T08:57:05.954-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Criando um arquivo unicode com BOM a partir do Delphi 7</title><content type='html'>Hoje um colega que leu meu post sobre &lt;a href="http://blog.vitorrubio.com.br/2010/09/quebras-de-linha-no-delphi-2010.html#comment-form"&gt;quebra de linhas no Delphi 7 e no Delphi novo&lt;/a&gt; teve uma dúvida: Ele não estava conseguindo criar um arquivo de conexão UDL válido. Todos eles davam erro ao abrir. &lt;br /&gt;&lt;br /&gt;Ele me disse que usar widestring não resolveu. &lt;br /&gt;&lt;br /&gt;Fiquei surpreso do porque ele precisaria gerar o udl pelo Delphi, já que é possível apenas criar um arquivo de texto vazio, renomear ara .udl, e o arquivo será criado normalmente. Mas, ele tinha essa necessidade. &lt;br /&gt;&lt;br /&gt;Uma das coisas que descobri hoje é que este arquivo, além de começar com [oledb], deve obrigatoriamente ter o "comentário" abaixo. Ou seja, não é apenas um comentario.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;[oledb]&lt;br /&gt;; Everything after this line is an OLE DB initstring&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O conteúdo deve ser idêntico a esse. Mas não é apenas o conteúdo. Mesmo que se grave os cabeçalhos corretamente e as strings de conexão, e mesmo que as strings sejam widestrings de dois bytes (unicode) o arquivo em si ainda precisa de alguma coisa. &lt;br /&gt;&lt;br /&gt;Essa alguma coisa é o BOM: Abrindo um arquivo que funcione em um editor hexadecimal verá que o arquivo começa com os bytes FF e FE.&lt;br /&gt;&lt;br /&gt;Esse FF FE se chama BOM, Byte order mark, (&lt;a href="http://en.wikipedia.org/wiki/Byte_order_mark"&gt;http://en.wikipedia.org/wiki/Byte_order_mark&lt;/a&gt;) e diz para o programa que estiver lendo o arquivo qual é o formato (unicode ou não) e qual a orientação (big endian ou litle endian). &lt;br /&gt;&lt;br /&gt;O BOM em si é um único char, um widechar de 2 bytes. Como você sabe o tamanho do BOM de cara fica fácil escrever ele no stream: o tamanho será 2, ou 1 * sizeof(widechar). Não concatene o BOM, nem "tipe" ele, pois ele será deformado. Grave-o como um puro array de 2 bytes.&lt;br /&gt;&lt;br /&gt;Há alguns programas que não precisam do BOM, pois tentam inferir o tipo de arquivo pelo conteudo. Mas outros, como o programinha do windows que le/edita os udl ou o proprio notepad++ salvam o arquivo já com o BOM, e precisam dele para ler. &lt;br /&gt;&lt;br /&gt;Faça o seguinte: crie uma const chamada BOM e grave essa constante no arquivo antes de gravar o restante do conteudo. Repare que o problema não é a quebra de linha, mas sim o BOM.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mas atenção: não é apenas só por causa do BOM.&lt;br /&gt;&lt;br /&gt;Como ja dissemos antes o arquivo deve ter inicialmente 3 linhas onde a primeira é [oledb] e a segunda deve ter exatamente 52 caracteres e deve ser exatamente: &lt;b&gt;"; Everything after this line is an OLE DB initstring"&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Exemplo de arquivo udl que se conecta em bases dbase. &lt;br /&gt;&lt;pre class="code"&gt;[oledb]&lt;br /&gt;; Everything after this line is an OLE DB initstring&lt;br /&gt;Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Exemplo de código usando const ou array de bytes. Perceba que um char pode ser representado pelo seu valor hexadecimal contanto que seja precedido de &lt;b&gt;#$&lt;/b&gt;. O BOM é &lt;b&gt;#$FF#$FE&lt;/b&gt;.&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TForm1.Button1Click(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  teste: WideString;&lt;br /&gt;const&lt;br /&gt;//  BOM = #$FF#$FE;&lt;br /&gt;    BOM: array[1..2] of Byte = ($ff, $fe); &lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  with TFileStream.Create(ExtractFilePath(Application.ExeName)+'\teste.udl', fmCreate) do&lt;br /&gt;  try&lt;br /&gt;    teste :=&lt;br /&gt;      '[oledb]'+#13#10+&lt;br /&gt;      '; Everything after this line is an OLE DB initstring'+#13#10+&lt;br /&gt;      'Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files';&lt;br /&gt;    //você sabe que o BOM tem um tamanho fixo, que é 2 bytes. O bom é um único widechar de 2 bytes&lt;br /&gt;    Write(BOM, 1 * sizeof(widechar)); //2&lt;br /&gt;    Write(Pointer(teste)^, Length(teste)*SizeOf(WideChar));&lt;br /&gt;  finally&lt;br /&gt;    Free;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;faça o &lt;a href="http://www.vitorrubio.com.br/downloads/BOM.7z"&gt;download&lt;/a&gt; do exemplo.&lt;br /&gt;&lt;br /&gt;Have fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-7378430302626856875?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/7378430302626856875/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/criando-um-arquivo-unicode-com-bom.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7378430302626856875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7378430302626856875'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/criando-um-arquivo-unicode-com-bom.html' title='Criando um arquivo unicode com BOM a partir do Delphi 7'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-9135664070838026859</id><published>2011-02-16T09:04:00.000-08:00</published><updated>2011-02-16T09:04:31.398-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Coisas que eu aprendi no Delphi Meeting</title><content type='html'>&lt;div style="text-align: left;"&gt;A apple é mesmo revolucionária.&lt;/div&gt;&lt;div style="text-align: left;"&gt;Depois do Ipod&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-9ncE6IEwnZ0/TVwCWH0AMTI/AAAAAAAAAV0/Yv-CT_8GRyQ/s1600/ipod-classic3.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-9ncE6IEwnZ0/TVwCWH0AMTI/AAAAAAAAAV0/Yv-CT_8GRyQ/s320/ipod-classic3.jpg" width="271" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;do IPhone&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-nLCbpEBfuU0/TVwCVTPn2hI/AAAAAAAAAVw/mv2yYKu1h1A/s1600/iphone_review.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-nLCbpEBfuU0/TVwCVTPn2hI/AAAAAAAAAVw/mv2yYKu1h1A/s320/iphone_review.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;E do IPad&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fzPX8PsvuzI/TVwCUJTdbQI/AAAAAAAAAVs/zeQdD1Jf9nU/s1600/ipad_highres.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;img border="0" height="230" src="http://4.bp.blogspot.com/-fzPX8PsvuzI/TVwCUJTdbQI/AAAAAAAAAVs/zeQdD1Jf9nU/s320/ipad_highres.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;É hora do.....&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-L-d32fp_Cfg/TVwDHzEOS-I/AAAAAAAAAV4/9WrT5DeG4fo/s1600/aipim.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: left;"&gt;&lt;img border="0" height="214" src="http://2.bp.blogspot.com/-L-d32fp_Cfg/TVwDHzEOS-I/AAAAAAAAAV4/9WrT5DeG4fo/s320/aipim.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;IPim&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-9135664070838026859?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/9135664070838026859/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/coisas-que-eu-aprendi-no-delphi-meeting.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9135664070838026859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9135664070838026859'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/coisas-que-eu-aprendi-no-delphi-meeting.html' title='Coisas que eu aprendi no Delphi Meeting'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-9ncE6IEwnZ0/TVwCWH0AMTI/AAAAAAAAAV0/Yv-CT_8GRyQ/s72-c/ipod-classic3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3168309328841908306</id><published>2011-02-10T10:09:00.000-08:00</published><updated>2011-02-10T10:09:22.125-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Qual é sua segunda linguagem? E sua terceira?</title><content type='html'>Bom pessoAll, antes de mais nada, minha primeira linguagem é Delphi/Lazarus/Object Pascal e ponto final.&lt;br /&gt;Tirando o Delphi a que eu mais gosto e respeito é C/C++, porém nunca arrumei um projeto, pago ou hobby, nessas linguagens. Só coisa acadêmica mesmo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Todos os posts que discutem sobre linguagens geram bastante polêmica, por mais bobo que seja o assunto.&lt;br /&gt;Eu gosto de olhar o site da TIOBE freqüentemente&amp;nbsp;&lt;a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html"&gt;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1" bordercolordark="#003366" bordercolorlight="#c0c0c0" class="TpciTable" id="Table2" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-color: white; border-bottom-color: gray; border-bottom-style: outset; border-bottom-width: 1px; border-collapse: separate; border-left-color: gray; border-left-style: outset; border-left-width: 1px; border-right-color: gray; border-right-style: outset; border-right-width: 1px; border-top-color: gray; border-top-style: outset; border-top-width: 1px; color: #666666; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;colgroup&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;col&gt;&lt;/col&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;col align="center"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Position&lt;br /&gt;Feb 2011&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Position&lt;br /&gt;Feb 2010&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Delta in Position&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Programming Language&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Ratings&lt;br /&gt;Feb 2011&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Delta&lt;br /&gt;Feb 2010&lt;/th&gt;&lt;th align="center" nowrap="" style="background-color: #bbbbff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px; vertical-align: middle;"&gt;Status&lt;/th&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Java.html" style="color: #0000aa; text-decoration: none;"&gt;Java&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;18.482%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+1.13%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;2&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;2&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C.html" style="color: #0000aa; text-decoration: none;"&gt;C&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;14.986%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-1.62%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;3&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;4&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C__.html" style="color: #0000aa; text-decoration: none;"&gt;C++&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;8.187%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-1.26%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;4&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;7&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Python.html" style="color: #0000aa; text-decoration: none;"&gt;Python&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;7.038%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+2.72%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;5&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;3&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/PHP.html" style="color: #0000aa; text-decoration: none;"&gt;PHP&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;6.973%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-3.03%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;6&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;6&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/C_.html" style="color: #0000aa; text-decoration: none;"&gt;C#&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;6.809%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+1.79%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;7&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;5&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/(Visual)_Basic.html" style="color: #0000aa; text-decoration: none;"&gt;(Visual) Basic&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;4.924%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-2.13%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;8&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;12&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Objective-C.html" style="color: #0000aa; text-decoration: none;"&gt;Objective-C&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;2.571%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.79%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;9&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;10&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/JavaScript.html" style="color: #0000aa; text-decoration: none;"&gt;JavaScript&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;2.558%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-0.08%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;10&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;8&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Perl.html" style="color: #0000aa; text-decoration: none;"&gt;Perl&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1.907%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-1.69%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;11&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;11&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Ruby.html" style="color: #0000aa; text-decoration: none;"&gt;Ruby&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1.615%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-0.82%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;12&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Assembly.html" style="color: #0000aa; text-decoration: none;"&gt;Assembly&lt;/a&gt;*&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1.269%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A-&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;13&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;9&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Delphi.html" style="color: #0000aa; text-decoration: none;"&gt;Delphi&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;1.060%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-1.60%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;14&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;19&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Lisp.html" style="color: #0000aa; text-decoration: none;"&gt;Lisp&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.956%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.39%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;15&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;37&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/NXT-G.html" style="color: #0000aa; text-decoration: none;"&gt;NXT-G&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.849%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.58%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A--&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;16&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;30&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Ada.html" style="color: #0000aa; text-decoration: none;"&gt;Ada&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.805%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.44%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A--&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;17&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;17&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Same.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Pascal.html" style="color: #0000aa; text-decoration: none;"&gt;Pascal&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.735%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.13%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;18&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;21&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Lua.html" style="color: #0000aa; text-decoration: none;"&gt;Lua&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.714%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.21%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A--&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;19&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;13&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Down.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/Go.html" style="color: #0000aa; text-decoration: none;"&gt;Go&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.707%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;-1.07%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A--&lt;/td&gt;&lt;/tr&gt;&lt;tr height="25"&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;20&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;32&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;img border="0" src="http://www.tiobe.com/tiobe_index/images/Up.gif" /&gt;&lt;/td&gt;&lt;td style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&lt;a href="http://www.tiobe.com/content/paperinfo/tpci/RPG_(OS_400).html" style="color: #0000aa; text-decoration: none;"&gt;RPG (OS/400)&lt;/a&gt;&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;0.626%&lt;/td&gt;&lt;td align="center" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;+0.27%&lt;/td&gt;&lt;td align="left" style="background-color: #eeeeff; border-bottom-color: gray; border-bottom-style: inset; border-bottom-width: 1px; border-left-color: gray; border-left-style: inset; border-left-width: 1px; border-right-color: gray; border-right-style: inset; border-right-width: 1px; border-top-color: gray; border-top-style: inset; border-top-width: 1px; color: black; font-family: Arial, Verdana, Helvetica, sans-serif; font-size: 12px; line-height: 1.5em; padding-bottom: 1px; padding-left: 5px; padding-right: 5px; padding-top: 1px;"&gt;&amp;nbsp;&amp;nbsp;A--&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Lá tem gráficos e comparativos do uso das linguagens. Java e C/C++ são sempre absolutos, e com os novos smartphones, principalmente o Android, a tendência é a popularidade do Java aumentar.&lt;br /&gt;Agora o que me surpreendeu foi o python!!! Eu queria que minha terceira linguagem fosse o Ruby, (já que a segunda é o C#, empatado com o PHP) mas o python está em quarto lugar.&lt;br /&gt;&lt;br /&gt;Vocês repararam que embora o Java esteja em primeiro eu não tenho a mínima vontade de aprender Java, a não ser que seja por causa do Android? Pois é, eu não sigo modinhas.&lt;br /&gt;&lt;br /&gt;E vocês, qual é a sua segunda e terceira linguagem?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3168309328841908306?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3168309328841908306/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/qual-e-sua-segunda-linguagem-e-sua.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3168309328841908306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3168309328841908306'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/qual-e-sua-segunda-linguagem-e-sua.html' title='Qual é sua segunda linguagem? E sua terceira?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5461968475323840113</id><published>2011-02-10T04:28:00.001-08:00</published><updated>2011-02-10T04:28:32.797-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>O que você melhoraria no Delphi?</title><content type='html'>Uma coisa que eu tenho dificuldade no Delphi é o seguinte: quando você tem muitas opções, muitas mesmo, você acaba com opção nenhuma. Toda vez que começa um projeto novo você perde um tempinho pra decidir qual vai ser o ambiente, os componentes de acesso, etc, etc ..., mas isso é positivo, já que o Delphi vem com muitas ferramentas.&lt;br /&gt;Uma melhoria importante, na minha opinião, seria o Delphi já vir de fábrica com alguns componentes e bibliotecas para competir com o .Net framework. Por exemplo o Delphi já vem com Indy, mas a Indy não pertence à Embarcadero, a Embarcadero poderia compra-la. A mesma coisa com o Rave e outros componentes que são ultra necesários, que não ficamos sem eles. Do contrário você sempre é obrigado a "escolher" a Indy, "escolher" o Rave, vem junto, mas não é Nativo. Lembra do que aconteceu com os componentes da família nm (nmftp, nmsmtp... etc) do delphi 6 para o 7? Sumiram. O mesmo aconteceu com o quick report. Então você tem que confiar que o Indy e o Rave estarão lá para sempre. Se fossem "nativos" daria maior confiabilidade.&lt;br /&gt;&lt;br /&gt;Outra coisa que pode melhorar: a literatura especializada conta muito com o arrastar soltar de componentes, mas não ensina os iniciantes a instanciar classes/componentes via código, sem usar os componentes, a fim de ter um código mais limpo e um form designer mais limpo também. Isso já começa diferente no .Net e no Java, que ensinam os iniciantes a usar classes e não componentes. Parece que tudo no Delphi é voltado a RAD, mas esse não é o único mercado. RAD é muito bom pra projetos rápidos e prototipação.&lt;br /&gt;&lt;br /&gt;Uma terceira coisa que eu acho que falta é a existência de um framework de persistência e a existência de mediators para fazer databindings entre coleções e datasources, e entre estes e campos data aware (ou campos normais).&lt;br /&gt;Isso é um recurso interessante do .Net framework: qualquer tipo de vetor, hashlist, collection é um datasource em potencial, e não existe componentes exclusivamente data-aware, mas qualquer componente pode ser bindável por um datasource.&lt;br /&gt;&lt;br /&gt;Outra coisa: a biblioteca JEDI tem tudo o que a própria VCL tem, só que melhor, e open-source. Além disso tem outras coisas que nem imaginamos. Seria legal ter uma versão express ou community do Delphi sem nenhum componente além do básico, mas com a possibilidade de instalar componentes de terceiros. Assim você instala a JEDI e está garantido.&lt;br /&gt;Se quiser outros componentes da VCL vc poderia pagar por pacote, sob demanda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5461968475323840113?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5461968475323840113/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-que-voce-melhoraria-no-delphi.html#comment-form' title='9 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5461968475323840113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5461968475323840113'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-que-voce-melhoraria-no-delphi.html' title='O que você melhoraria no Delphi?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3063865002720423309</id><published>2011-02-09T10:01:00.000-08:00</published><updated>2011-02-09T10:01:05.866-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='segurança'/><title type='text'>Recuperando classes, janelas e senhas com a API do Windows</title><content type='html'>Com as API's&amp;nbsp;GetWindowText,&amp;nbsp;GetClassName e o parâmetro&amp;nbsp;WM_GETTEXT de SendMessage é possível obter os textos de qualquer janela da API do windows, bastando ter seu handle. O handle pode ser obtido com&amp;nbsp;WindowFromPoint passando-se como parâmetro a posição do mouse.&lt;br /&gt;&lt;br /&gt;Quando você está criando um componente, property editor, component editor ou expert para o Delphi as vezes é necessário saber qual a classe de um Property Editor já existente, por exemplo, para sabermos de onde poderemos herdar para criar o nosso.&lt;br /&gt;&lt;br /&gt;Este programa serve para 2 objetivos principais:&lt;br /&gt;1) Obter os handles, nomes e classes de todas as janelas, controles e widgets em que passamos o cursor do mouse.&lt;br /&gt;É especialmente útil para sabermos o nome e classe de uma janela, classe, component editor, property editor ou expert do Delphi, principalmente quando não temos acesso ao fonte ou não conhecemos nada a respeito da mesma e precisamos saber em qual DCU ou BPL compilada ela se encontra (basta pesquisar pelo nome da classe no google que você encontra a unit onde ela está).&lt;br /&gt;&lt;br /&gt;2) Revelar ou recuperar senhas perdidas. É importante notar que esse método só recupera senhas que estão mascaradas com asteriscos ("*") mas não recupera senhas mascaradas com a bolinha preta, predominante do windows XP pra frente, graças às novas API's.&lt;br /&gt;&lt;br /&gt;Este não é nenhum segredo hacker, na verdade esta API, e o método para obter as senhas, existem desde os primórdios do Windows, e foram muito difundidas e utilizadas até a época do Windows 98.&lt;br /&gt;&lt;br /&gt;Onde a recuperação de senhas vai funcionar:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tqOuULbALEo/TVKa0Un75EI/AAAAAAAAAVY/kDWM8eMjXTs/s1600/recuperar.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="http://1.bp.blogspot.com/_tqOuULbALEo/TVKa0Un75EI/AAAAAAAAAVY/kDWM8eMjXTs/s320/recuperar.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Todos os programas feitos em Delphi (qualquer versão) em que as senhas sejam digitadas em um Edit e nos programas feitos em VB6. Um programa que funcionará também é o Outlook 2007 (do office 2007). Vá no painel de controle e escolha alguma conta de e-mail pop3/smtp com a senha salva. Esta senha é possível de ser revelada facilmente. Não testei as outras versões.&lt;br /&gt;&lt;br /&gt;No momento eu não sei como fazer para recuperar as senhas contidas naqueles campos apropriados para senhas (o dos bullets pretos). Se alguém quiser colaborar com essa dica por favor comente.&lt;br /&gt;&lt;br /&gt;O sucesso na revelação da senha depende de como o edit e sua classe foram registrados, e com que parâmetros. Em muitos sistemas seria possível obter a senha apenas obtendo-se o "caption" com GetWindowText do controle em questão, já que ele é uma "janela". Em outros o controle deve estar em foco, ou deve ser clicado.&lt;br /&gt;&lt;br /&gt;Um FAIL gigante nesse aspecto é que o Visual Studio .Net e o .Net Framework te proporcionam a possibilidade de usar o passwordchar do sistema, ou seja, os Bullets pretos, mas mesmo assim a senha é perfeitamente revelável.&lt;br /&gt;&lt;br /&gt;Outra coisa interessante é que o edit do lazarus não revela a senha pelo "SendMessage(hWnd, WM_GETTEXT" e nem permite que o passwordchar seja modificado, mas mesmo assim revela a senha com GetWindowText.&lt;br /&gt;&lt;br /&gt;Crie um formulário como o da figura e coloque um timer. A maior parte do código vai nesse timer.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_tqOuULbALEo/TVKiHRWgSNI/AAAAAAAAAVc/9No48XFW4Kg/s1600/janela-pegatudo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_tqOuULbALEo/TVKiHRWgSNI/AAAAAAAAAVc/9No48XFW4Kg/s1600/janela-pegatudo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para usarmos a API do windows para obter respostas textuais temos 3 opções:&lt;br /&gt;1 - Usar vetores de char fixos em x caracteres (usaremos 255)&lt;br /&gt;2 - Usar strings normais, porém pré-setando seu tamanho com setLength para um tamanho obtido com a mensagem WM_GETTEXTLENGTH.&lt;br /&gt;3 - Utilizando ponteiros para chars (pchars) não esquecendo de alocar e desalocar memória para os mesmos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Usando vetores&lt;/strong&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit pegatudo;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, ExtCtrls, StdCtrls, shellapi;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TfrmPegatudo = class(TForm)&lt;br /&gt;    Label2: TLabel;&lt;br /&gt;    lbclasse: TLabel;&lt;br /&gt;    tempo: TTimer;&lt;br /&gt;    lbHandle: TLabel;&lt;br /&gt;    Label4: TLabel;&lt;br /&gt;    lbJanela: TLabel;&lt;br /&gt;    Label5: TLabel;&lt;br /&gt;    lbSenha: TLabel;&lt;br /&gt;    Label7: TLabel;&lt;br /&gt;    procedure tempoTimer(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  frmPegatudo: TfrmPegatudo;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TfrmPegatudo.tempoTimer(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  hWnd: THandle;&lt;br /&gt;  CrPos: TPoint;&lt;br /&gt;  nomejanela,&lt;br /&gt;  nomeclasse,&lt;br /&gt;  senha: array[0..255] of Char;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    GetCursorPos(CrPos); // Identifica a posicao do mouse&lt;br /&gt;    hWnd := WindowFromPoint(CrPos); // Pega o Handle do controle na posição do mouse&lt;br /&gt;&lt;br /&gt;    if hwnd &amp;lt;&amp;gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;&lt;br /&gt;      //preenche o conteúdo do vetor com char zeros&lt;br /&gt;      FillChar(nomejanela, 255, #0);&lt;br /&gt;      FillChar(nomeclasse, 255, #0);&lt;br /&gt;&lt;br /&gt;      //pega o nome da janela&lt;br /&gt;      GetWindowText(hWnd, NomeJanela, 255);&lt;br /&gt;      //pega o nome da classe&lt;br /&gt;      GetClassName(hWnd, nomeclasse, 255);&lt;br /&gt;&lt;br /&gt;      //manda uma mensagem para o handle da janela&lt;br /&gt;      //perguntando se ele possui um password char&lt;br /&gt;      if SendMessage(hWnd, EM_GETPASSWORDCHAR, 0, 0) &amp;lt;&amp;gt; 0 then&lt;br /&gt;      begin&lt;br /&gt;        FillChar(senha, 255, #0);&lt;br /&gt;        //Caso positivo manda a mensagem WM_GETTEXT&lt;br /&gt;        SendMessage(hWnd, WM_GETTEXT, 255, integer(@senha)); //o integer aqui faz com que o parâmetro seja passado como ponteiro em vez de vetor&lt;br /&gt;        lbSenha.Caption :=      string(senha);&lt;br /&gt;        //Caso positivo seta o passwordchar para #0&lt;br /&gt;        //o problema de fazer isso é que vai entrar uma vez só no if&lt;br /&gt;        SendMessage(hWnd, EM_SETPASSWORDCHAR, 0, 0);&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      //preenche os campos&lt;br /&gt;      lbHandle.Caption :=     IntToStr(hwnd);&lt;br /&gt;      lbjanela.Caption :=     string(nomejanela);&lt;br /&gt;      lbclasse.Caption :=     string(nomeclasse);&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  except&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Usando Strings&lt;/strong&gt;&lt;br /&gt;&lt;pre class="brush:delphi"&gt;unit pegatudo;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, ExtCtrls, StdCtrls, shellapi;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;  TfrmPegatudo = class(TForm)&lt;br /&gt;    Label2: TLabel;&lt;br /&gt;    lbclasse: TLabel;&lt;br /&gt;    tempo: TTimer;&lt;br /&gt;    lbHandle: TLabel;&lt;br /&gt;    Label4: TLabel;&lt;br /&gt;    lbJanela: TLabel;&lt;br /&gt;    Label5: TLabel;&lt;br /&gt;    lbSenha: TLabel;&lt;br /&gt;    Label7: TLabel;&lt;br /&gt;    procedure tempoTimer(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    { Public declarations }&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  frmPegatudo: TfrmPegatudo;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;procedure TfrmPegatudo.tempoTimer(Sender: TObject);&lt;br /&gt;var&lt;br /&gt;  hWnd: THandle;&lt;br /&gt;  CrPos: TPoint;&lt;br /&gt;  nomejanela,&lt;br /&gt;  nomeclasse,&lt;br /&gt;  senha: string;&lt;br /&gt;  tamJanela,&lt;br /&gt;  tamClasse,&lt;br /&gt;  tamSenha: integer;&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  try&lt;br /&gt;    GetCursorPos(CrPos); // Identifica a posicao do mouse&lt;br /&gt;    hWnd := WindowFromPoint(CrPos); // Pega o Handle do controle na posição do mouse&lt;br /&gt;&lt;br /&gt;    if hwnd &amp;lt;&amp;gt; 0 then&lt;br /&gt;    begin&lt;br /&gt;&lt;br /&gt;      //captura o tamanho dos elementos&lt;br /&gt;      tamJanela := GetWindowTextLength(hwnd) + SizeOf(Char);&lt;br /&gt;      tamClasse := 256;  //o resultado de GetClassName traz um integer com&lt;br /&gt;      //o número de caracteres copiados. Se for maior que 255 a string ou&lt;br /&gt;      //ponteiro pode ser realocado/redimensionado com setsize/malloc e&lt;br /&gt;      //pode ser usado GetClassName novamente para pegar a string completa&lt;br /&gt;      //caso ela tenha vindo truncada.&lt;br /&gt;      //o mesmo pode ser feito com GetWindowText, mas nesse caso a&lt;br /&gt;      //GetWindowTextLength nos ajuda a obter esse tamanho&lt;br /&gt;      //só é trazido o número de caracteres sem contar o terminator null #0&lt;br /&gt;&lt;br /&gt;      SetLength(nomejanela, tamJanela);&lt;br /&gt;      SetLength(nomeclasse, tamClasse);&lt;br /&gt;&lt;br /&gt;      //preenche o conteúdo do vetor com char zeros&lt;br /&gt;      FillChar((@nomejanela[1])^, tamJanela, #0);&lt;br /&gt;      FillChar((@nomeclasse[1])^, tamClasse, #0);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      //pega o nome da janela&lt;br /&gt;      GetWindowText(hWnd, pchar(integer(NomeJanela)), tamJanela);&lt;br /&gt;      //pega o nome da classe&lt;br /&gt;      GetClassName(hWnd, pchar(integer(nomeclasse)), tamClasse);&lt;br /&gt;&lt;br /&gt;      //manda uma mensagem para o handle da janela&lt;br /&gt;      //perguntando se ele possui um password char&lt;br /&gt;      if SendMessage(hWnd, EM_GETPASSWORDCHAR, 0, 0) &amp;lt;&amp;gt; 0 then&lt;br /&gt;      begin&lt;br /&gt;&lt;br /&gt;        tamSenha := SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)+ SizeOf(Char);&lt;br /&gt;        SetLength(senha, tamSenha);&lt;br /&gt;        FillChar((@senha[1])^, tamSenha, #0);&lt;br /&gt;        //Caso positivo manda a mensagem WM_GETTEXT&lt;br /&gt;        SendMessage(hWnd, WM_GETTEXT, tamSenha, integer(@senha[1])); //o integer aqui faz com que o parâmetro seja passado como ponteiro em vez de vetor&lt;br /&gt;        lbSenha.Caption :=      senha;&lt;br /&gt;&lt;br /&gt;        //seta o passwordchar para #0 e&lt;br /&gt;        SendMessage(hWnd, EM_SETPASSWORDCHAR, 0, 0);&lt;br /&gt;&lt;br /&gt;      end;&lt;br /&gt;&lt;br /&gt;      //preenche os campos&lt;br /&gt;      lbHandle.Caption :=     IntToStr(hwnd);&lt;br /&gt;      lbjanela.Caption :=     nomejanela;&lt;br /&gt;      lbclasse.Caption :=     nomeclasse;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;  except&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Veja que SendMessage(hWnd, EM_SETPASSWORDCHAR, 0, 0); faz com que o edit que era do tipo password deixe de ser, e o password aparecerá desmascarado no edit.&lt;br /&gt;&lt;br /&gt;As duas versões do código, bem como programinhas cobaia em Delphi, C# e Lazarus podem ser baixados &lt;a href="http://www.vitorrubio.com.br/downloads/PegaClasses_Completo.7z"&gt;aqui&lt;/a&gt; ou na &lt;a href="http://www.vitorrubio.com.br/downloads"&gt;minha página de download de exemplos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Have Fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3063865002720423309?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3063865002720423309/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/recuperando-classes-janelas-e-senhas.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3063865002720423309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3063865002720423309'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/recuperando-classes-janelas-e-senhas.html' title='Recuperando classes, janelas e senhas com a API do Windows'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tqOuULbALEo/TVKa0Un75EI/AAAAAAAAAVY/kDWM8eMjXTs/s72-c/recuperar.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-7204443595468420796</id><published>2011-02-09T09:34:00.000-08:00</published><updated>2011-02-09T09:34:19.347-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>O Delphi está morto?</title><content type='html'>Quem já viu o Delphi XE sabe: NÃO.&lt;br /&gt;&lt;br /&gt;Na minha humilde opinião, morto está quem conhece ou usa uma linguagem só ou um ambiente só independente de qual seja, pois não consegue traduzir sua própria lógica e maneira de pensar para um produto ou artefato caso não saiba fazer na linguagem que ele conhece.&lt;br /&gt;&lt;br /&gt;A melhor e mais rápida ferramenta de benchmark de DNS que eu já vi na minha vida era feita em assembly por um cara que fazia TUDO em assembly por hobby.&lt;br /&gt;&lt;br /&gt;A linguagem que mais respeito, e é imortal sem dúvida é o C++. Mas eu não sou bom de C++, confesso.&lt;br /&gt;A minha linguagem do coração, a qual eu mais manjo, é Delphi. &lt;br /&gt;&lt;br /&gt;Se hoje eu estou pesquisando e aprendendo outros ambientes além do Delphi, como Java, C#, Python, Ruby, Prism e Lazarus não é porque esteja abandonando o Delphi, mas sim porque o Delphi acabou ficando caro demais pro meu bico, e todas essas outras linguagens que citei, inclusive o Prism, tem opções open-source. &lt;br /&gt;&lt;br /&gt;Eu gosto de open-source não apenas por ter um custo menor mas por ter uma filosofia atraente. As vezes pode ser mais difícil atingir o mesmo objetivo, mas as recompensas e o aprendizado é maior porque ela te obriga a trabalhar com boas práticas desde o começo. &lt;br /&gt;&lt;br /&gt;Não aceito críticas ao Delphi feitas por anônimos, a não ser que esses anônimos dêem a cara a tapa e mostrem um blog técnico que seja melhor que o meu, e pelo menos um artigo publicado em qualquer veículo impresso. &lt;br /&gt;&lt;br /&gt;Se quem criticar o Delphi for um programadorzinho rad de VB6, VB.net ou C# ignoro, se for um programador Java amante de Design Patterns e POO ou um veterano do C++ que saiba fazer drivers de dispositivo em linux eu posso dar ouvidos, e respeito. Mas acho muito difícil um bom programador criticar qualquer linguagem a troco de nada. Quem critica uma linguagem, IDE ou ambiente é no mínimo um iniciantezinho arrogante. &lt;br /&gt;&lt;br /&gt;Delphi é baseado em Pascal, que foi criado por Niklaus Wirth com fins didáticos. Isso não tem como morrer, uma linguagem de programação altamente produtiva com um apelo didático. Quem conhece o trabalho de Niklaus Wirth sabe do que estou falando.&lt;br /&gt;&lt;br /&gt;Geralmente, preste bastante atenção, quem critica o Delphi nos blogs e fóruns por aí mal sabe escrever direito. &lt;br /&gt;&lt;br /&gt;Nos vemos no &lt;a href="http://latam.embarcadero.com/br/delphimeeting/"&gt;Delphi Meeting!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-7204443595468420796?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/7204443595468420796/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-delphi-esta-morto.html#comment-form' title='12 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7204443595468420796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7204443595468420796'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-delphi-esta-morto.html' title='O Delphi está morto?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-8848725089183301519</id><published>2011-02-08T10:06:00.000-08:00</published><updated>2011-02-08T10:11:24.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='design patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='singleton'/><title type='text'>Existem 1001 maneiras de preparar SINGLETON - parte 4</title><content type='html'>&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788573076103" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://files.cdn.upx.net.br/00113/imagem/capas/479/311479.jpg" /&gt;&lt;/a&gt;Se você ler o livro &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788573076103"&gt;Padrões de Projeto&lt;/a&gt;&amp;nbsp;&amp;nbsp;verá que há uma crítica quanto ao uso indiscriminado de Herança. Na verdade o livro mostra que existem outras maneiras de se incorporar ou agregar várias funcionalidades e depois conseguir incorporar ainda outras sem &amp;nbsp;o uso de herança.&lt;br /&gt;&lt;br /&gt;Lendo este livro você verá que há uma discrepância grande entre a Análise Orientada a Objeto (AOO) e a Programação Orientada a Objeto (POO).&lt;br /&gt;&lt;br /&gt;Enquanto a AOO defende que não pode existir em código nenhum objeto que não seja representante ou modelo de um objeto do "mundo real" a POO, por restrições e questões técnicas, apresenta as figuras das classes de persistência (inexistentes no mundo real) dos DTO (data transfer objects, também inexistentes) dentre outros modelos e padrões. Além disso, em POO você pode ver coisas como sobrecarga de operadores, caso em que a AOO nem sequer cita.&lt;br /&gt;&lt;br /&gt;Enquanto o livro &lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788573076103"&gt;Padrões de Projeto&lt;/a&gt; foca na POO, ignorando algumas premissas da AOO, ele também põe a herança em seu devido lugar: NEM TODA ESPECIALIZAÇÃO OU INCREMENTO SE RESOLVE COM HERANÇA.&lt;br /&gt;&lt;br /&gt;Particularmente no caso de singletons, a herança é desnecessária, visto que o singleton, geralmente, é um objeto cheio de métodos estáticos que nada mais fazem do que prestar serviços. Sim, o singleton sequer faria parte da AOO porque ele é um objeto artificial, existente apenas no domínio da POO por razões técnicas, seja a leitura/escrita de arquivos de configuração seja a criação de objetos de conexão com bancos de dados.&lt;br /&gt;&lt;br /&gt;Isto posto, não é necessário se criar heranças de singletons, até porque elas não vão funcionar corretamente e reimplementar todos os métodos de um singleton anula o propósito da Herança. Se precisar de um outro singleton muito parecido você pode:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Simplesmente criar outro copiando a maior parte do código e lógica de funcionamento (não é recomendável fazer isso se forem vários, se você quer fazer um código limpo com duplicação zero ou se deseja apenas atualizar um código para corrigir todos os singletons dependentes dele)&lt;/li&gt;&lt;li&gt;Se for o caso de manter a manutenção em um único ponto (recomendado) crie classes privadas, em pacotes, invisíveis aos programadores consumidores da sua biblioteca, que isolem todo o mecanismo e regras de funcionamento do singleton e implemente-o em forma de façade (fachada).&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;No exemplo 5 veremos como fazer singletons flexíveis, reutilizáveis e intercambiáveis mesclando o padrão singleton com o padrão façade.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788535239164" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://files.cdn.upx.net.br/00113/imagem/capas/745/22315745.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.livrariacultura.com.br/scripts/cultura/externo/index.asp?id_link=8055&amp;amp;tipo=2&amp;amp;isbn=9788535239164"&gt;Wazlawick, em seu livro&lt;/a&gt;&amp;nbsp;, menciona que a aplicação, ou o objeto aplicação, que é o programa em si, sua "casca" mais externa que vai criar os outros objetos e interfaces deveria ser um singleton, e de fato o é. Mesmo que se executem várias instâncias da aplicação, no ambiente de uma única instância a aplicação em si é um singleton, e qualquer entidade ou artefato que prestasse algum serviço para a aplicação também deveria ser um singleton.&lt;br /&gt;&lt;br /&gt;Como o singleton não faz parte das regras de negócio e da AOO aqui abordaremos ele do ponto de vista da POO e faremos uma tentativa de herança do mesmo, para demonstrar as confusões que podem ocorrer.&lt;br /&gt;&lt;br /&gt;Neste 4° exemplo, analogamente ao &lt;a href="http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html"&gt;exemplo 2&lt;/a&gt;, usamos o recurso de class vars (variáveis estáticas de classe, privadas) e acessores estáticos para criar class properties, coisa que só é possível nas modernas versões do Delphi, por isso perderemos a compatibilidade com o Lazarus.&lt;br /&gt;&lt;br /&gt;Primeiro a classe singleton&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingleton;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses Dialogs, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TMySingleton = class(TObject)&lt;br /&gt;  private&lt;br /&gt;    class var _MySingletonInstance: TObject;&lt;br /&gt;    class var _PreparadoParaLiberar: Boolean;&lt;br /&gt;&lt;br /&gt;    FHello: TstringList;&lt;br /&gt;    FDateTime: string;&lt;br /&gt;&lt;br /&gt;  protected&lt;br /&gt;    //se executar isso o objeto pode ser destruido&lt;br /&gt;    class procedure PrepararParaLiberar; virtual;&lt;br /&gt;&lt;br /&gt;    class function GetInstance: TMySingleton; static;&lt;br /&gt;&lt;br /&gt;    //para criar ou destruir os componentes do objeto&lt;br /&gt;    procedure InicializarObjeto; virtual;&lt;br /&gt;    procedure FinalizarObjeto; virtual;&lt;br /&gt;  public&lt;br /&gt;    procedure SetHello(vHello: string);&lt;br /&gt;    procedure SayHello; virtual;&lt;br /&gt;    constructor Create;  virtual;&lt;br /&gt;    //esses caras misticos abaixo que realmente criam, alocam memoria, destroem e desalocam memoria por tráz dos constructor e destructor que conhecemos&lt;br /&gt;    class function NewInstance: TObject; override;&lt;br /&gt;    procedure FreeInstance; override;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    class property Instance: TMySingleton  read GetInstance;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses SysUtils;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TMySingleton }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.SayHello;&lt;br /&gt;begin&lt;br /&gt;  //um metodo bobo pra testar&lt;br /&gt;  ShowMessage('Classe: ' + Self.ClassName + #13#10 +&lt;br /&gt;    'Mensagem: ' + FHello.Text + #13#10 +&lt;br /&gt;    'Data: ' + FDateTime + #13#10 +&lt;br /&gt;    'Instância: ' + inttostr(integer(self)));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.SetHello(vHello: string);&lt;br /&gt;begin&lt;br /&gt;  //um outro metodo bobo pra setar a mensagem&lt;br /&gt;  FHello.Text := vHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;constructor TMySingleton.Create;&lt;br /&gt;begin&lt;br /&gt;  //antes de tudo, antes mesmo do inherited, newinstance já é chamado por padrão&lt;br /&gt;  inherited; //faz o que for preciso de seu ancestral, eu tenho certeza aqui que o NewInstance está sendo executado&lt;br /&gt;  InicializarObjeto; //inicializo o que precisa&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TMySingleton.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FinalizarObjeto;  //destruo as partes ou objetos criados pela minha classe, como stringlists&lt;br /&gt;  inherited;    //a destruição normal do objeto, depois disso freeinstance é chamado normalmente&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class function TMySingleton.GetInstance: TMySingleton;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //isso é apenas um atalho em uma class function&lt;br /&gt;&lt;br /&gt;  if _MySingletonInstance = nil then&lt;br /&gt;    _MySingletonInstance := TMySingleton.Create;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonInstance as TMySingleton;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.FreeInstance;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //no destructor não vai acontecer nada se _PreparadoParaLiberar for false, e eu não preciso disparar uma excessão&lt;br /&gt;&lt;br /&gt;  //  agora se _PreparadoParaLiberar for true&lt;br /&gt;  //eu faço o que um FreeInstance sempre deveria fazer, uso o inherited,&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    inherited;&lt;br /&gt;    //bloqueio a liberação  novamente&lt;br /&gt;    _PreparadoParaLiberar := False;&lt;br /&gt;    //atribuo nil&lt;br /&gt;    _MySingletonInstance := nil;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  //agora se precisar pode criar de novo&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingleton.NewInstance: TObject;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  if (_MySingletonInstance = nil)  then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonInstance := inherited NewInstance as TMySingleton;&lt;br /&gt;    //_MySingletonInstance.FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    _MySingletonInstance := inherited NewInstance;&lt;br /&gt;    (_MySingletonInstance as TMySingleton).FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonInstance;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class procedure TMySingleton.PrepararParaLiberar;&lt;br /&gt;begin&lt;br /&gt;  //esse método só faz isso&lt;br /&gt;  _PreparadoParaLiberar := True;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.FinalizarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe somente as coisas que devem acontecer da destruição verdadeira do objeto&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    FHello.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.InicializarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe tudo o que precisa que aconteça depois do create&lt;br /&gt;  //lembrando que se o NewInstance já retornar o objeto criado, então&lt;br /&gt;  //Self.FHello vai ser o Fhello dessa instancia, e vai ser &lt;&gt; de nil&lt;br /&gt;  if (FHello = nil) then&lt;br /&gt;  begin&lt;br /&gt;    FHello := TStringList.Create;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  //inicializo minhas variáveis publicas, porque vou mecher nelas posteriormente&lt;br /&gt;  TMySingleton._MySingletonInstance := nil;&lt;br /&gt;  TMySingleton._PreparadoParaLiberar := False;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (TMySingleton._MySingletonInstance &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    TMySingleton.PrepararParaLiberar;&lt;br /&gt;    TMySingleton._MySingletonInstance.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de exceção, se precisar&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Depois o singleton derivado. Observe que é inútil criar overrides para métodos que fazem apenas "inherited". &lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses uSingleton, Dialogs, Classes;&lt;br /&gt;&lt;br /&gt;  type&lt;br /&gt;    TMySingletonDerivado = class(TMySingleton)&lt;br /&gt;  private&lt;br /&gt;    class var _MySingletonDerivadoInstance: TObject;&lt;br /&gt;    class var _PreparadoParaLiberarDerivado: Boolean;&lt;br /&gt;  protected&lt;br /&gt;    class procedure PrepararParaLiberar;  override;&lt;br /&gt;    class function GetInstance: TMySingleton; reintroduce; static;  //não usamos TMySingletonDerivado para não dar invalid typecast caso já exista um singleton base criado&lt;br /&gt;&lt;br /&gt;//****************************************************************************&lt;br /&gt;//* métodos que fazem basicamente inherited não precisam ser sobrecarregados *&lt;br /&gt;//****************************************************************************&lt;br /&gt;    //procedure InicializarObjeto; override;&lt;br /&gt;    //procedure FinalizarObjeto;   override;&lt;br /&gt;  public&lt;br /&gt;&lt;br /&gt;//****************************************************************************&lt;br /&gt;//* métodos que fazem basicamente inherited não precisam ser sobrecarregados *&lt;br /&gt;//****************************************************************************&lt;br /&gt;    //constructor Create;  override;&lt;br /&gt;    //destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    class function NewInstance: TObject; override;&lt;br /&gt;    procedure FreeInstance; override;&lt;br /&gt;&lt;br /&gt;     class property Instance: TMySingleton read GetInstance;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TMySingletonDerivado }&lt;br /&gt;&lt;br /&gt;//****************************************************************************&lt;br /&gt;//* métodos que fazem basicamente inherited não precisam ser sobrecarregados *&lt;br /&gt;//****************************************************************************&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;constructor TMySingletonDerivado.Create;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;  InicializarObjeto;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TMySingletonDerivado.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FinalizarObjeto;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.FinalizarObjeto;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.InicializarObjeto;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TMySingletonDerivado }&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.FreeInstance;&lt;br /&gt;begin&lt;br /&gt;  if _PreparadoParaLiberarDerivado then&lt;br /&gt;  begin&lt;br /&gt;    _PreparadoParaLiberarDerivado := False;&lt;br /&gt;    _MySingletonDerivadoInstance := nil;&lt;br /&gt;    inherited;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingletonDerivado.GetInstance: TMySingleton;&lt;br /&gt;begin&lt;br /&gt;  //não usamos TMySingletonDerivado para não dar invalid typecast caso já exista um singleton base criado&lt;br /&gt;  if _MySingletonDerivadoInstance = nil then&lt;br /&gt;    _MySingletonDerivadoInstance := TMySingletonDerivado.Create;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance as TMySingleton;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingletonDerivado.NewInstance: TObject;&lt;br /&gt;begin&lt;br /&gt;  if (_MySingletonDerivadoInstance = nil) then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonDerivadoInstance := inherited NewInstance as TMySingletonDerivado;&lt;br /&gt;    _MySingletonDerivadoInstance := inherited NewInstance;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class procedure TMySingletonDerivado.PrepararParaLiberar;&lt;br /&gt;begin&lt;br /&gt;  _PreparadoParaLiberarDerivado := True;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  TMySingletonDerivado._MySingletonDerivadoInstance := nil;&lt;br /&gt;  TMySingletonDerivado._PreparadoParaLiberarDerivado := False;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (TMySingletonDerivado._MySingletonDerivadoInstance &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    TMySingletonDerivado.PrepararParaLiberar;&lt;br /&gt;    TMySingletonDerivado._MySingletonDerivadoInstance.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de exceção, se precisar&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;O programa de teste é o mesmo que fizemos no &lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html"&gt;exemplo 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download do código: &lt;a href="http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_4.7z"&gt;http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_4.7z&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="LeiaMais"&gt;Links úteis, leia todos ;) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 4&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Criando uma classe singleton verdadeira em delphi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi"&gt;http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Creating a real singleton class in Delphi 5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edn.embarcadero.com/article/22576"&gt;http://edn.embarcadero.com/article/22576&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Introdução: Singleton - Design Pattern Delphi - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html"&gt;http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tentativa de Singleton usando Delphi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/"&gt;http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Implementing the Singleton pattern in delphi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.delphi3000.com/articles/article_1736.asp?SK="&gt;http://www.delphi3000.com/articles/article_1736.asp?SK=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Essa é uma abordagem nova que eu nunca imaginei:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010"&gt;http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Class (, Static, or Shared) Constructors (and Destructors)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.embarcadero.com/abauer/2009/09/03/38898"&gt;http://blogs.embarcadero.com/abauer/2009/09/03/38898&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Design Patterns in Delphi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://delphi.about.com/od/oopindelphi/a/aa010201a.htm"&gt;http://delphi.about.com/od/oopindelphi/a/aa010201a.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No forum antigo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.devmedia.com.br/viewtopic.php?t=101997&amp;highlight=singleton" title="Tópico no forum devmedia sobre singleton" target="_blank"&gt;Tópico no forum devmedia sobre singleton&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;no forum novo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/forum/viewtopic.asp?id=374670"&gt;http://www.devmedia.com.br/forum/viewtopic.asp?id=374670&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-8848725089183301519?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/8848725089183301519/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8848725089183301519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8848725089183301519'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html' title='Existem 1001 maneiras de preparar SINGLETON - parte 4'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5033991851877163002</id><published>2011-02-07T11:33:00.000-08:00</published><updated>2011-02-07T11:33:42.719-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='AMS'/><title type='text'>Criando um sistema do Zero - Account Management - Parte 1</title><content type='html'>Nesta série de artigos estaremos criando, do zero, um sistema de Account Management (gerenciamento de contas de usuário).&lt;br /&gt;&lt;br /&gt;Hoje em dia um relógio não representa mais nenhum avanço tecnológico, visto que todo e qualquer aparelho moderno deve possuir um relógio como requisito mais básico. Celulares, aparelhos de som, DVD players, Blu-Ray (e o extinto videocassete), microondas, televisores, monitores, agendas, calculadoras, telefones fixos, videogames e qualquer outro aparelho pode vir com um relógio, e geralmente vem.&lt;br /&gt;&lt;br /&gt;O relógio passou do status de &amp;nbsp;produto tecnológico para ser apenas um ingrediente, uma peça.&lt;br /&gt;&lt;br /&gt;É exatamente isso que está acontecendo com os sistemas de Account Management, aqui chamados de AMS.&lt;br /&gt;&lt;br /&gt;Veja que enquanto alguns dizem que o CRM é o topo da evolução de sistemas para gerenciamento de clientes, o CRM serve apenas para gerenciar contato e relacionamento com os clientes. A tendência de o CRM tentar centralizar os dados a respeito de clientes de todos os outros sistemas, inclusive legados, em um formato próprio pode mais dificultar do que facilitar.&lt;br /&gt;&lt;br /&gt;O carregamento de um CRM qualquer com os dados de todos os sistemas legados da empresa deve ser feito o em duas vias, ou seja, seguido de um carregamento de TODOS sistemas legados com os dados do CRM, DEPOIS DE DEVIDAMENTE TRATADOS.&lt;br /&gt;&lt;br /&gt;Caso isso não aconteça os dados do CRM tornam-se apenas mais um montante de dados a serem administrados. Os mesmos problemas existentes antes do CRM prevalecerão depois do CRM, apenas para citar exemplos básicos:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Dados desatualizados - O cliente mudou-se, ou mudou de telefone, e-mail, estado civil;&lt;/li&gt;&lt;li&gt;Dados inconsistentes - O DDD informado não pertence à cidade constante no endereço;&lt;/li&gt;&lt;li&gt;Dados incorretos - Mais grave do que dados inconsistentes, nada pode ser aproveitado, muitos campos nulos;&lt;/li&gt;&lt;li&gt;Dados falsos - O cliente ou o operador do cadastro deliberadamente armazenou no sistema falsas informações, talvez com o propósito de cometer uma fraude;&lt;/li&gt;&lt;li&gt;Dados Repetidos - Existem vários tipos de repetições, e dados repetidos não querem dizer idênticos.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Porém a responsabilidade de um CRM não deveria ser manter o cadastro dos clientes, mas apenas gerenciar a relação com os mesmos, independente de em qual sistema da empresa eles estejam.&lt;br /&gt;&lt;br /&gt;Dizemos&amp;nbsp;&lt;i&gt;"independente de em qual sistema da empresa eles estejam"&lt;/i&gt;&amp;nbsp;porque empresas muito grandes, com uma gama variada de produtos e serviços, ou empresas formadas por conglomerados de outras empresas podem ter vários sistemas para gerenciamento de produtos diferentes, e mesmo que os clientes sejam consumidores de dois produtos distintos, por estarem em sistemas diferentes eles são considerados clientes diferentes.&lt;br /&gt;&lt;br /&gt;Na empresa onde trabalho, por exemplo, há vendas de livors e revistas para distribuidores e atacadistas, bem como venda de assinaturas de revistas (1° sistema). Mas há também um sistema de vendas de livros pela internet, ou seja, um e-commerce (2° sistema). Este e-commerce não tem como backoffice o primeiro sistema, mas sim um terceiro, que também faz vendas em atacado e varejo. Nas filiais e livrarias (lojas físicas), para vendas de livros e revistas, há um 4° sistema. E a editora ainda oferece 2 sistemas de consulta de conteúdo das revistas online, pago através de assinatura, que são diferentes entre si: 5° e 6° sistemas.&lt;br /&gt;Há um sistema de call center,( 7°) e um CRM (8°) que não se integra completamente com os outros sistemas, tornado-se assim apenas mais um.&lt;br /&gt;&lt;br /&gt;Um cliente da livraria, por exemplo, não é visto como um prospectivo cliente do conteúdo online, mesmo já sendo assinante.&lt;br /&gt;&lt;br /&gt;Agora imagine o cenário onde um cliente foi cadastrado com CPF do cônjuge, divorciou-se, mas não mudou de e-mail. O cônjuge não conseguirá criar um cadastro próprio porque "o cpf &amp;nbsp;informado já existe". Já o outro cliente não conseguirá criar um outro cadastro porque "o seu e-mail já existe".&lt;br /&gt;&lt;br /&gt;O cadastro original não pode ser desmembrado em dois, e não pode ser deletado pois já possui um histórico.&lt;br /&gt;O correto nesse caso seria fazer a exclusão via flag (deletado = 1) mas aí você não pode definir o CPF ou o e-mail como &lt;b&gt;unique &lt;/b&gt;no banco de dados. Talvez criar um conjunto de tabelas auxiliares para contas e pedidos &amp;nbsp;"lixeira" e mover tudo para lá seria uma boa idéia.&lt;br /&gt;&lt;br /&gt;Outra situação, um pouco mais complexa, são de usuários diferentes que são cadastrados com e-mail trocado, ou CPF trocado. Simplesmente é impossível colocar o CPF correto em um porque ele já existe no outro.&lt;br /&gt;&lt;br /&gt;Outro problema são e-mails falsos, CPF's falsos, fraudes etc...&lt;br /&gt;&lt;br /&gt;Agora imagine um sistema de banco ou de seguro de saúde: esses sistemas são os mais confiáveis em matéria de autenticidade do cliente, pois para um cliente existir no sistema ele teve que comparecer pessoalmente em uma agência e apresentar documentos originais e comprovante de residência. Cada vez que seus dados cadastrais mudarem ele deve voltar pessoalmente em uma agência e apresentar novamente os documentos. Talvez cópias dos documentos fiquem com a empresa e até uma impressão digital do cliente.&lt;br /&gt;&lt;br /&gt;Porém sistemas de bancos e seguros saúde não são os mais dinâmicos no sentido de contatos, ou mais especificamente, redes de contatos e atualização desses dados. Por exemplo, se você adquirir 10 celulares novos, 5 contas de e-mail, twitter, orkut, facebook etc... dificilmente o seu banco será informado disso.&lt;br /&gt;&lt;br /&gt;Em contrapartida os e-commerces, blogs, jornais e revistas online, embora sejam os mais sensíveis em matéria de dados cadastrais fraudulentos, são os mais dinâmicos no aspecto "social", sendo assim, caso o usuário tenha (e tenha o hábito de usar) celular, SMS,&lt;br /&gt;&lt;br /&gt;Esta série de artigos terá como objetivo elocubrar a criação de um sistema de Gerenciamento de Contas seguro e unificado, que possa conter API's tanto para alimentar os sistemas legados com clientes como para ser alimentados por eles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conforme forem surgindo os desafios falaremos sobre como resolve-los.&lt;br /&gt;&lt;br /&gt;Os objetivos desse sistema, denominado AMS, serão:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;fornecer entrada de clientes unificada para todos os sistemas&lt;/li&gt;&lt;li&gt;fornecer consulta de clientes unificada para todos os sistemas&lt;/li&gt;&lt;li&gt;agregar segurança no processo de cadastro de clientes&lt;/li&gt;&lt;li&gt;atualizar e sincronizar em duas vias todos os dados utilizados pelo cliente em todos os sistemas&lt;/li&gt;&lt;li&gt;servir como gerenciador de sessões para sites e blogs com conteúdo pago&lt;/li&gt;&lt;li&gt;ser extensível para acomodar outros tipos de relações além de empresa/cliente&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;A longo prazo podemos considerar:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;prover serviços para sistemas de terceiros, mediante pagamento&lt;/li&gt;&lt;li&gt;prover autenticação para sistemas de terceiros, mediante pagamento&lt;/li&gt;&lt;li&gt;ser um gateway de clientes assim como Moip, PagSeguro e Braspag são gateways de pagamentos&lt;/li&gt;&lt;li&gt;ser uma autoridade no quesito autenticação de usuário assim como o facebook/openID o é, mas fornecendo a segurança de o usuário ser perfeitamente identificável e reconhecível, o que traz segurança para o usuário evitando enganos ou fraudes da empresa, e evitando que sua conta seja sequestrada por outro usuário, e trazendo segurança para a empresa por garantir que o usuário exista.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Optou-se por criar o modelo mais trivial possível e ir aumentando em complexidade conforme necessário. Não tocaremos no assunto sobre metodologias porque simplesmente eu não domino tão bem a engenharia de software a ponto de ser prepotente o bastante para impor alguma metodologia, porém, conforme já disse em aula o meu guru professor Duduchi,&amp;nbsp;&lt;i&gt;"A melhor metodologia de desenvolvimento de software é o bom senso"&lt;/i&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Por isso abordaremos algumas boas práticas como testes unitários e TDD, sistemas de gerenciamento de versão (SVN, CVS, VCS, Source Safe, GIT, Mercury e tantos outros) e alguma coisa de UML. Falaremos também sobre frameworks de persistência, &amp;nbsp;webservices e serialização de objetos.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Obviamente alguns desses objetivos são até utópicos, mas vejamos até onde conseguiremos chegar.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para iniciar nosso projeto usaremos o ArgoUML para gerar os diagramas UML, primeiramente de classes. Podemos também exportar os esqueletos de código.&amp;nbsp;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_tqOuULbALEo/TVBI70dyPII/AAAAAAAAAVA/OOdPe5kOvCU/s1600/DiagramadeClasses.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://4.bp.blogspot.com/_tqOuULbALEo/TVBI70dyPII/AAAAAAAAAVA/OOdPe5kOvCU/s320/DiagramadeClasses.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tqOuULbALEo/TVBJA0Y4f-I/AAAAAAAAAVE/okk1MrZyaFs/s1600/gerando-codigo-classes.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_tqOuULbALEo/TVBJA0Y4f-I/AAAAAAAAAVE/okk1MrZyaFs/s320/gerando-codigo-classes.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;No próximo post trataremos de mais alguns cenários de problemas e abordaremos a questão da persistência.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5033991851877163002?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5033991851877163002/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/criando-um-sistema-do-zero-account.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5033991851877163002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5033991851877163002'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/criando-um-sistema-do-zero-account.html' title='Criando um sistema do Zero - Account Management - Parte 1'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tqOuULbALEo/TVBI70dyPII/AAAAAAAAAVA/OOdPe5kOvCU/s72-c/DiagramadeClasses.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4542070689673325659</id><published>2011-02-07T08:36:00.000-08:00</published><updated>2011-02-07T08:36:54.799-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><title type='text'>Olhando a vida de longe</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tqOuULbALEo/TVAd192xH3I/AAAAAAAAAU4/3RGuXHeLUAo/s1600/gato.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_tqOuULbALEo/TVAd192xH3I/AAAAAAAAAU4/3RGuXHeLUAo/s400/gato.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Você pode se perguntar o que um gato como eu faz olhando para fora. Perdi alguma coisa?&lt;br /&gt;&lt;br /&gt;Através desta tela, que não me deixa sair, eu posso ver o que você ignora todos os dias.&lt;br /&gt;&lt;br /&gt;Não se trata apenas dos coloridos alvoreceres ou crepúsculos, mas eu vejo algo que você não vê, eu vejo algo que você perde todos os dias: A VIDA.&lt;br /&gt;&lt;br /&gt;Mesmo que eu viva apenas 14 anos, o mais longevo possível para mim, ainda assim teria vivido mais plenamente que você, pois enquanto você vaidosamente corria, em vão, atrás do vento, eu parei ao seu encontro para que ele soprasse meu rosto.&lt;br /&gt;&lt;br /&gt;Se é só trabalhar que você sabe fazer, então, BOM TRABALHO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4542070689673325659?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4542070689673325659/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/olhando-vida-de-longe.html#comment-form' title='8 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4542070689673325659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4542070689673325659'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/olhando-vida-de-longe.html' title='Olhando a vida de longe'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_tqOuULbALEo/TVAd192xH3I/AAAAAAAAAU4/3RGuXHeLUAo/s72-c/gato.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6097410917618947861</id><published>2011-02-04T08:15:00.000-08:00</published><updated>2011-02-04T08:18:52.579-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>O santo graal da memória não volátil parte 2</title><content type='html'>Estávamos a semana passada a parolar sobre minhas desventuras tentando enviar uma declaração retificadora do meu IR. Eu juro que nunca mais cometerei um erro.&lt;br /&gt;&lt;br /&gt;Hoje voltei eu lá, na receita federal do Tatuapé, próximo à praça Silvio Romero, quando minhas desventuras recomeçaram, logo no pré atendimento.&lt;br /&gt;&lt;br /&gt;Não sei porque, todos esses atendentes me parecem iguais, e me parecem NPC's, iguais a enfermeira Joy por exemplo: estão em todos os lugares, são todas iguais e respondem com menos palavras que uma URA.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_tqOuULbALEo/TUwj-j7XvJI/AAAAAAAAAUs/Bqbo9XBjJ-k/s1600/npcs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://2.bp.blogspot.com/_tqOuULbALEo/TUwj-j7XvJI/AAAAAAAAAUs/Bqbo9XBjJ-k/s400/npcs.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tqOuULbALEo/TUwkLCHc7wI/AAAAAAAAAUw/An2TXGO3jT4/s1600/erro-novamente.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_tqOuULbALEo/TUwkLCHc7wI/AAAAAAAAAUw/An2TXGO3jT4/s400/erro-novamente.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_tqOuULbALEo/TUwkjksvxtI/AAAAAAAAAU0/wno8vxdUyBs/s1600/otro-erro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/_tqOuULbALEo/TUwkjksvxtI/AAAAAAAAAU0/wno8vxdUyBs/s400/otro-erro.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Seria bom se fosse apenas bazófia / prosápia / paparrotada .... pena que não é. Nenhuma delas. É putaria mesmo.&lt;br /&gt;&lt;br /&gt;Senhora Dilma, pode ficar com os R$600,00 da minha restituição, espero que seja útil para algum hospital, escola ou creche que estiver precisando.&lt;br /&gt;&lt;br /&gt;Enfim, terei que, além de desinstalar todos os virus er programas da receita federal e instalar novamente, não posso aproveitar ou importar o meu arquivo de declaração (.dec), pois ele pode estar, como disse o NPC, com algum "vício". Terei que refazê-lo do zero.&lt;br /&gt;&lt;br /&gt;Boa sorte pra mim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6097410917618947861?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6097410917618947861/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-santo-graal-da-memoria-nao-volatil.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6097410917618947861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6097410917618947861'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/o-santo-graal-da-memoria-nao-volatil.html' title='O santo graal da memória não volátil parte 2'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tqOuULbALEo/TUwj-j7XvJI/AAAAAAAAAUs/Bqbo9XBjJ-k/s72-c/npcs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2549306871346859062</id><published>2011-02-03T18:06:00.000-08:00</published><updated>2011-02-08T10:12:13.478-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='design patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='singleton'/><title type='text'>Existem 1001 maneiras de preparar SINGLETON - parte3</title><content type='html'>Você já se perguntou como suprimir o método Create para que não seja utilizado? Tentar "esconder" o constructor colocando-o como private não irá funcionar por um motivo simples: ao utilizar o create será visível e perfeitamente "invocável" o create da classe base, que não conterá as informações necessárias para criar realmente o objeto e poderá causar access violations.&lt;br /&gt;&lt;br /&gt;O que fazer então?&lt;br /&gt;&lt;br /&gt;Na verdade o constructor create nada mais é do que uma espécie de class method (método de classe) especial que serve como alias para o NewInstance. O Create atua como um factory method nativo e bem simples, sendo o&amp;nbsp;&amp;nbsp;NewInstance que efetivamente aloca memória e constroi o objeto.&lt;br /&gt;&lt;br /&gt;Então uma maneira muito elegante de se criar um singleton &amp;eacute;, em vez de disparar um exception caso o método create seja executado mais de uma vez, sobrecarregar os m&amp;eacute;todos NewInstance e FreeInstance  para impedir que de fato o objeto seja criado duas vezes, ou destruido antes do tempo. Esses m&amp;eacute;todos s&amp;atilde;o os respons&amp;aacute;veis por criar ou destruir um objeto &amp;quot;de verdade&amp;quot; na memoria. Eles que fazem a aloca&amp;ccedil;&amp;atilde;o e desaloca&amp;ccedil;&amp;atilde;o de memoria. &lt;br /&gt;&lt;br /&gt;S&amp;atilde;o métodos virtuais. Ent&amp;atilde;o sobrecarregando-os e fazendo com que retornem sempre a mesma instancia n&amp;atilde;o importa quantas vezes se execute o create podemos fazer um singleton que trabalha com mais liberdade.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.devmedia.com.br/viewtopic.php?t=101997&amp;highlight=singleton" title="Tópico no forum devmedia sobre singleton" target="_blank"&gt;Aqui você vê um tópico interessante sobre o assunto&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingleton;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses Dialogs, Classes;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;  TMySingleton = class(TObject)&lt;br /&gt;  private&lt;br /&gt;    FHello: TstringList;&lt;br /&gt;    FDateTime: string;&lt;br /&gt;  protected&lt;br /&gt;    //se executar isso o objeto pode ser destruido&lt;br /&gt;    class procedure PrepararParaLiberar; virtual;&lt;br /&gt;    //para criar ou destruir os componentes do objeto&lt;br /&gt;    procedure InicializarObjeto; virtual;&lt;br /&gt;    procedure FinalizarObjeto; virtual;&lt;br /&gt;  public&lt;br /&gt;    procedure SetHello(vHello: string);&lt;br /&gt;    procedure SayHello; virtual;&lt;br /&gt;    constructor Create;&lt;br /&gt;    //esses caras misticos abaixo que realmente criam, alocam memoria, destroem e desalocam memoria por tráz dos constructor e destructor que conhecemos&lt;br /&gt;    class function NewInstance: TObject; override;&lt;br /&gt;    procedure FreeInstance; override;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    class function InstanciaPadrao: TMySingleton;  virtual;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;uses SysUtils;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  _MySingletonInstance: TObject = nil;&lt;br /&gt;  _PreparadoParaLiberar: Boolean = False;&lt;br /&gt;&lt;br /&gt;{ TMySingleton }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.SayHello;&lt;br /&gt;begin&lt;br /&gt;  //um metodo bobo pra testar&lt;br /&gt;  ShowMessage('Classe: ' + Self.ClassName + #13#10 +&lt;br /&gt;    'Mensagem: ' + FHello.Text + #13#10 +&lt;br /&gt;    'Data: ' + FDateTime + #13#10 +&lt;br /&gt;    'Instância: ' + inttostr(integer(self)));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.SetHello(vHello: string);&lt;br /&gt;begin&lt;br /&gt;  //um outro metodo bobo pra setar a mensagem&lt;br /&gt;  FHello.Text := vHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;constructor TMySingleton.Create;&lt;br /&gt;begin&lt;br /&gt;  //antes de tudo, antes mesmo do inherited, newinstance já é chamado por padrão&lt;br /&gt;  inherited; //faz o que for preciso de seu ancestral, eu tenho certeza aqui que o NewInstance está sendo executado&lt;br /&gt;  InicializarObjeto; //inicializo o que precisa&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TMySingleton.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FinalizarObjeto;  //destruo as partes ou objetos criados pela minha classe, como stringlists&lt;br /&gt;  inherited;    //a destruição normal do objeto, depois disso freeinstance é chamado normalmente&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class function TMySingleton.InstanciaPadrao: TMySingleton;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //isso é apenas um atalho em uma class function &lt;br /&gt;&lt;br /&gt;  if _MySingletonInstance = nil then &lt;br /&gt;    _MySingletonInstance := TMySingleton.Create; &lt;br /&gt;&lt;br /&gt;  Result := _MySingletonInstance as TMySingleton;&lt;br /&gt;  &lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.FreeInstance;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //no destructor não vai acontecer nada se _PreparadoParaLiberar for false, e eu não preciso disparar uma excessão&lt;br /&gt;&lt;br /&gt;  //  agora se _PreparadoParaLiberar for true&lt;br /&gt;  //eu faço o que um FreeInstance sempre deveria fazer, uso o inherited,&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    inherited;&lt;br /&gt;    //bloqueio a liberação  novamente&lt;br /&gt;    _PreparadoParaLiberar := False;&lt;br /&gt;    //atribuo nil&lt;br /&gt;    _MySingletonInstance := nil;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  //agora se precisar pode criar de novo&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingleton.NewInstance: TObject;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  if (_MySingletonInstance = nil)  then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonInstance := inherited NewInstance as TMySingleton;&lt;br /&gt;    //_MySingletonInstance.FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    _MySingletonInstance := inherited NewInstance;&lt;br /&gt;    (_MySingletonInstance as TMySingleton).FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonInstance;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class procedure TMySingleton.PrepararParaLiberar;&lt;br /&gt;begin&lt;br /&gt;  //esse método só faz isso&lt;br /&gt;  _PreparadoParaLiberar := True;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.FinalizarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe somente as coisas que devem acontecer da destruição verdadeira do objeto&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    FHello.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.InicializarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe tudo o que precisa que aconteça depois do create&lt;br /&gt;  //lembrando que se o NewInstance já retornar o objeto criado, então&lt;br /&gt;  //Self.FHello vai ser o Fhello dessa instancia, e vai ser &lt;&gt; de nil&lt;br /&gt;  if (FHello = nil) then&lt;br /&gt;  begin&lt;br /&gt;    FHello := TStringList.Create;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  //inicializo minhas variáveis publicas, porque vou mecher nelas posteriormente&lt;br /&gt;  _MySingletonInstance := nil;&lt;br /&gt;  _PreparadoParaLiberar := False;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (_MySingletonInstance &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    TMySingleton.PrepararParaLiberar;&lt;br /&gt;    _MySingletonInstance.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de exceção, se precisar&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Creio que o código esteja bem comentado, mas explicando: temos aqui as procedures virtuais InicializarObjeto e FinalizarObjeto e temos a class procedure PrepararParaLiberar. InicializarObjeto  simplesmente cria os outros objetos dos quais o singleton é dependente/composto e armazena esta instância no campo/atributo apropriado. Por exemplo nosso singleton faz uso de uma TStringList, então é nesta procedure, InicializarObjeto, que ele será criado. Analogamente ele será destruido em FinalizarObjeto. O trecho de código abaixo garante que a TStringList FHello será criada apenas quando não existir e será destruída apenas quando o singleton não for mais necessário, evitando-se memory leaks.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TMySingleton.FinalizarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe somente as coisas que devem acontecer da destruição verdadeira do objeto&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    FHello.Free;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.InicializarObjeto;&lt;br /&gt;begin&lt;br /&gt;  //aqui você poe tudo o que precisa que aconteça depois do create&lt;br /&gt;  //lembrando que se o NewInstance já retornar o objeto criado, então&lt;br /&gt;  //Self.FHello vai ser o Fhello dessa instancia, e vai ser &lt;&gt; de nil&lt;br /&gt;  if (FHello = nil) then&lt;br /&gt;  begin&lt;br /&gt;    FHello := TStringList.Create;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;strong&gt;O fato de ambas serem virtuais e protected é muito importante para evitar que sejam invocadas pelo "client" do singleton e mesmo assim permitir que sejam sobrecarregadas no descendente com a diretiva "override"&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A class procedure PrepararParaLiberar apenas ativa uma flag booleana que permite que o singleton seja destruído de verdade.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As procedures SayHello e SetHello apenas mostram ou definem o valor da propriedade Text de FHello que é a mensagem a ser exibida. Considere-os como as operações/serviços principais do seu singleton, como fábricas de componentes de acesso a bancos de dados, por exemplo. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TMySingleton.SayHello;&lt;br /&gt;begin&lt;br /&gt;  //um metodo bobo pra testar&lt;br /&gt;  ShowMessage('Classe: ' + Self.ClassName + #13#10 +&lt;br /&gt;    'Mensagem: ' + FHello.Text + #13#10 +&lt;br /&gt;    'Data: ' + FDateTime + #13#10 +&lt;br /&gt;    'Instância: ' + inttostr(integer(self)));&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingleton.SetHello(vHello: string);&lt;br /&gt;begin&lt;br /&gt;  //um outro metodo bobo pra setar a mensagem&lt;br /&gt;  FHello.Text := vHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Além de mostrar o nome da classe e a mensagem também mostramos a data e o endereço de memória do objeto. Não confunda com @self, pois @self dará o endereço da variável self de cada instancia, podendo ser diferente para duas variaveis mesmo que apontem para a mesma instancia. Self é o endereço do objeto e de qualquer variável que aponte para ele.&lt;br /&gt;&lt;br /&gt;Manter os métodos "Inicializa" e "Finaliza" ajudará a mechar o menos possível no Create e no Destroy, pois as configurações de inicialização ou a limpeza de objetos antes da destruição não ficam no corpo dos métodos create e destroy mas sim no corpo dos métodos Inicializa e Finaliza, que são invocados por Create e Destroy respectivamente.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;constructor TMySingleton.Create;&lt;br /&gt;begin&lt;br /&gt;  //antes de tudo, antes mesmo do inherited, newinstance já é chamado por padrão&lt;br /&gt;  inherited; //faz o que for preciso de seu ancestral, eu tenho certeza aqui que o NewInstance está sendo executado&lt;br /&gt;  InicializarObjeto; //inicializo o que precisa&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;destructor TMySingleton.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FinalizarObjeto;  //destruo as partes ou objetos criados pela minha classe, como stringlists&lt;br /&gt;  inherited;    //a destruição normal do objeto, depois disso freeinstance é chamado normalmente&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A mágica de verdade acontece nos métodos NewInstance e FreeInstance. O método NewInstance sempre é uma function que retorna uma instância do objeto recém criado; Objeto este do tipo da classe em questão. Create chama NewInstance e isso pode ser observado com o Debug, da mesma forma que Destroy chama FreeInstance. &lt;br /&gt;&lt;br /&gt;O que é feito nesse singleton é manter uma variável do tipo _MySingletonInstance: TMySingleton estática, na seção implementation (global, mas visível apenas nesta unit); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TMySingleton.FreeInstance;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //no destructor não vai acontecer nada se _PreparadoParaLiberar for false, e eu não preciso disparar uma excessão&lt;br /&gt;&lt;br /&gt;  //  agora se _PreparadoParaLiberar for true&lt;br /&gt;  //eu faço o que um FreeInstance sempre deveria fazer, uso o inherited,&lt;br /&gt;  if _PreparadoParaLiberar then&lt;br /&gt;  begin&lt;br /&gt;    inherited;&lt;br /&gt;    //bloqueio a liberação  novamente&lt;br /&gt;    _PreparadoParaLiberar := False;&lt;br /&gt;    //atribuo nil&lt;br /&gt;    _MySingletonInstance := nil;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  //agora se precisar pode criar de novo&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingleton.NewInstance: TObject;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  if (_MySingletonInstance = nil)  then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonInstance := inherited NewInstance as TMySingleton;&lt;br /&gt;    //_MySingletonInstance.FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    _MySingletonInstance := inherited NewInstance;&lt;br /&gt;    (_MySingletonInstance as TMySingleton).FDateTime := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonInstance;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Porque _MySingletonInstance é do tipo TObject e não do tipo TMySingleton? Simples: porque assim não precisa fazer a conversão de tipo na hora de atribuir a NewInstance, apenas na hora de setar o datetime ou na execução do método InstanciaPadrao ( Result := _MySingletonInstance as TMySingleton;)&lt;br /&gt;&lt;br /&gt;Essa mudança permite que um singleton base e um derivado sejam criados em seguida sem dar invalid typecast na hora de chamar NewInstance, pois NewInstance grava &lt;br /&gt;&lt;br /&gt;As seções initialization e finalization garantem que o singleton seja armazenado em uma variável limpa e seja destruído no final da aplicação.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;initialization&lt;br /&gt;  //inicializo minhas variáveis publicas, porque vou mecher nelas posteriormente&lt;br /&gt;  _MySingletonInstance := nil;&lt;br /&gt;  _PreparadoParaLiberar := False;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (_MySingletonInstance &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    TMySingleton.PrepararParaLiberar;&lt;br /&gt;    _MySingletonInstance.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de exceção, se precisar&lt;br /&gt;  end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Há um post sobre um singleton no fórum DevMedia que pode ser herdado, contanto que alguns m&amp;eacute;todos sejam obrigatoriamente usados. O problema &amp;eacute; que n&amp;atilde;o se pode usar um singleton da classe base e outro da classe derivada ao mesmo tempo. Eles compartilham dados em comum, j&amp;aacute; que o singleton da classe derivada &amp;eacute; o mesmo que a classe base com algo a mais.&lt;br /&gt;&lt;br /&gt;O tópico foi evoluindo até chegar ao  que foi visto nesta minha série de artigos. Os primeiros singletons do tópico pareciam com o singleton deste primeiro artigo. O último já estava mais parecido com este. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mesmo esta versão mais nova, com todos os cuidados tomados, ainda não pode ser usada juntamente com sua herdeira.&lt;br /&gt;&lt;br /&gt;Veja bem, ela pode ser Herdada, mas ou usa-se a classe base ou usa-se a classe filha separadamente. Caso use as duas o que acontecerá? Se você instanciar primeiro a classe base e depois a derivada, ambos os singletons serão da classe base, e se você instanciar a classe derivada primeiro, amboes serão da classe derivada. Isso porque o result de inherited NewInstance é armazenado na variável _MySingletonInstance, ou na _MySingletonDerivadoInstance para  classe derivada. Essa variável que contém as instâncias não conseguem diferenciar qual classe está chamando NewInstance e a instância em si é gravada nas duas variáveis. &lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;if (_MySingletonDerivadoInstance = nil) then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonDerivadoInstance := inherited NewInstance as TMySingletonDerivado;&lt;br /&gt;    _MySingletonDerivadoInstance := inherited NewInstance;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Eu ainda não consegui resolver esse problema de utilizar as duas classes. Ele não pode ser resolvido simplesmente omitindo-se ou suprimindo o inherited ou reescrevendo todos os métodos e substituindo todas as variáveis &lt;a href="http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html"&gt;como no exemplo anterior.&lt;/a&gt; Na verdade ter que reimplementar todos os métodos não é uma herança inteligente, é uma herança burra, um despropósito: pra que herdar se eu tenho que fazer tudo de novo do zero e não aproveito o polimorfismo?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A classe filha, o singleton derivado, foi criado assim: &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses uSingleton, Dialogs, Classes;&lt;br /&gt;&lt;br /&gt;  type&lt;br /&gt;    TMySingletonDerivado = class(TMySingleton)&lt;br /&gt;  protected&lt;br /&gt;    class procedure PrepararParaLiberar;  override;&lt;br /&gt;    procedure InicializarObjeto; override;&lt;br /&gt;    procedure FinalizarObjeto;   override;&lt;br /&gt;  public&lt;br /&gt;    //constructor Create;&lt;br /&gt;    class function NewInstance: TObject; override;&lt;br /&gt;    procedure FreeInstance; override;&lt;br /&gt;    //destructor Destroy; override;&lt;br /&gt;    class function InstanciaPadrao: TMySingletonDerivado;   reintroduce;&lt;br /&gt;    end;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  _MySingletonDerivadoInstance: TObject = nil;&lt;br /&gt;  _PreparadoParaLiberarDerivado: Boolean = False;&lt;br /&gt;&lt;br /&gt;{ TMySingletonDerivado }&lt;br /&gt;&lt;br /&gt;//*******************************************************************&lt;br /&gt;//* Repare que não foi necessário sobrescrever o Create e o Destroy *&lt;br /&gt;//*******************************************************************&lt;br /&gt;&lt;br /&gt;//constructor TMySingletonDerivado.Create;&lt;br /&gt;//begin&lt;br /&gt;//  inherited;&lt;br /&gt;//  InicializarObjeto;&lt;br /&gt;//end;&lt;br /&gt;&lt;br /&gt;//destructor TMySingletonDerivado.Destroy;&lt;br /&gt;//begin&lt;br /&gt;//  FinalizarObjeto;&lt;br /&gt;//  inherited;&lt;br /&gt;//end;&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.FinalizarObjeto;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.InicializarObjeto;&lt;br /&gt;begin&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingletonDerivado.InstanciaPadrao: TMySingletonDerivado;&lt;br /&gt;begin&lt;br /&gt;  if _MySingletonDerivadoInstance = nil then&lt;br /&gt;    _MySingletonDerivadoInstance := TMySingletonDerivado.Create;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance as TMySingletonDerivado;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TMySingletonDerivado.FreeInstance;&lt;br /&gt;begin&lt;br /&gt;  if _PreparadoParaLiberarDerivado then&lt;br /&gt;  begin&lt;br /&gt;    _PreparadoParaLiberarDerivado := False;&lt;br /&gt;    _MySingletonDerivadoInstance := nil;&lt;br /&gt;    inherited;&lt;br /&gt;  end;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TMySingletonDerivado.NewInstance: TObject;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  if (_MySingletonDerivadoInstance = nil) then&lt;br /&gt;  begin&lt;br /&gt;    //_MySingletonDerivadoInstance := inherited NewInstance as TMySingletonDerivado;&lt;br /&gt;    _MySingletonDerivadoInstance := inherited NewInstance;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class procedure TMySingletonDerivado.PrepararParaLiberar;&lt;br /&gt;begin&lt;br /&gt;  _PreparadoParaLiberarDerivado := True;&lt;br /&gt;  inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  _MySingletonDerivadoInstance := nil;&lt;br /&gt;  _PreparadoParaLiberarDerivado := False;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (_MySingletonDerivadoInstance &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    TMySingletonDerivado.PrepararParaLiberar;&lt;br /&gt;    _MySingletonDerivadoInstance.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de exceção, se precisar&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para testar vários quesitos devem ser testados: primeiro de tudo se não estão se criando várias instâncias, depois se a criação e destruição fluem normalmente, se a destruição só é possível quando autorizado/preparado e se instâncias de classes diferentes não se atrapalham mutuamente (este teste não está passando).&lt;br /&gt;&lt;br /&gt;Para o teste construa um formulário como este: &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_tqOuULbALEo/TUsIhDkqQvI/AAAAAAAAAUk/L0N38t98i2k/s1600/formulario-teste-singleton.gif" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="251" width="400" src="http://4.bp.blogspot.com/_tqOuULbALEo/TUsIhDkqQvI/AAAAAAAAAUk/L0N38t98i2k/s400/formulario-teste-singleton.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;E este código:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, StdCtrls, uSingleton, uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TfrmSingleton = class(TForm)&lt;br /&gt;    btTeste1: TButton;&lt;br /&gt;    btTeste2: TButton;&lt;br /&gt;    btTEste3: TButton;&lt;br /&gt;    btTeste4: TButton;&lt;br /&gt;    btTeste6: TButton;&lt;br /&gt;    Label1: TLabel;&lt;br /&gt;    Label2: TLabel;&lt;br /&gt;    btTeste5: TButton;&lt;br /&gt;    Label3: TLabel;&lt;br /&gt;    btTesteDerivado1: TButton;&lt;br /&gt;    btTesteDerivado2: TButton;&lt;br /&gt;    btTesteDerivado3: TButton;&lt;br /&gt;    btTesteDerivado4: TButton;&lt;br /&gt;    btTesteDerivado5: TButton;&lt;br /&gt;    btTesteDerivado6: TButton;&lt;br /&gt;    btTesteDerradeiro: TButton;&lt;br /&gt;    Label4: TLabel;&lt;br /&gt;    btCria1: TButton;&lt;br /&gt;    btCria2: TButton;&lt;br /&gt;    btTesta1: TButton;&lt;br /&gt;    btTesta2: TButton;&lt;br /&gt;    btDestroi1: TButton;&lt;br /&gt;    btDestroi2: TButton;&lt;br /&gt;    procedure btTeste1Click(Sender: TObject);&lt;br /&gt;    procedure btTeste2Click(Sender: TObject);&lt;br /&gt;    procedure btTEste3Click(Sender: TObject);&lt;br /&gt;    procedure btTeste4Click(Sender: TObject);&lt;br /&gt;    procedure btTeste6Click(Sender: TObject);&lt;br /&gt;    procedure btTeste5Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado3Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado4Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado1Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado2Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado5Click(Sender: TObject);&lt;br /&gt;    procedure btTesteDerivado6Click(Sender: TObject);&lt;br /&gt;    procedure btCria1Click(Sender: TObject);&lt;br /&gt;    procedure btCria2Click(Sender: TObject);&lt;br /&gt;    procedure btTesta1Click(Sender: TObject);&lt;br /&gt;    procedure btTesta2Click(Sender: TObject);&lt;br /&gt;    procedure btDestroi1Click(Sender: TObject);&lt;br /&gt;    procedure btDestroi2Click(Sender: TObject);&lt;br /&gt;  private&lt;br /&gt;    { Private declarations }&lt;br /&gt;  public&lt;br /&gt;    FMySingleton: TMySingleton;&lt;br /&gt;    FMySingleton1: TMySingleton;&lt;br /&gt;    FMySingleton2: TMySingleton;&lt;br /&gt;&lt;br /&gt;    FMySingletonDer1: TMySingletonDerivado;&lt;br /&gt;    FMySingletonDer2: TMySingletonDerivado;&lt;br /&gt;&lt;br /&gt;    teste1: TMySingleton;&lt;br /&gt;    teste2: TMySingletonDerivado;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  frmSingleton: TfrmSingleton;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTeste1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  FMySingleton1 := TMySingleton.Create;&lt;br /&gt;  with FMySingleton1  do&lt;br /&gt;  begin&lt;br /&gt;    SetHello('teste1');&lt;br /&gt;    SayHello;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FMySingleton1.SayHello;&lt;br /&gt;&lt;br /&gt;  FMySingleton1.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTeste2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FMySingleton2 := TMySingleton.Create;&lt;br /&gt;  with FMySingleton2  do&lt;br /&gt;  begin&lt;br /&gt;    //não vamos mudar a mensagem, veremos que é a mesma do teste anterior&lt;br /&gt;    //SetHello('teste2');&lt;br /&gt;    SayHello;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FMySingleton2.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTEste3Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FMySingleton1 := TMySingleton.InstanciaPadrao;&lt;br /&gt;  FMySingleton1.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTeste4Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FMySingleton2 := TMySingleton.InstanciaPadrao;&lt;br /&gt;  FMySingleton2.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado6Click(Sender: TObject);&lt;br /&gt;var fmst: TMySingletonDerivado;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  fmst := TMySingletonDerivado.Create;&lt;br /&gt;  fmst.SetHello('testeA');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;&lt;br /&gt;  //mesmo com várias tentativas de criação e destruição a instância se mantem a mesma&lt;br /&gt;&lt;br /&gt;  fmst := TMySingletonDerivado.Create;&lt;br /&gt;  fmst := TMySingletonDerivado.Create;&lt;br /&gt;  fmst := TMySingletonDerivado.Create;&lt;br /&gt;&lt;br /&gt;  fmst.SetHello('testeB');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;&lt;br /&gt;  fmst.Free;&lt;br /&gt;  fmst.Free;&lt;br /&gt;  fmst.Free;&lt;br /&gt;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;&lt;br /&gt;  fmst.SetHello('testeC');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btCria1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  teste1 := TMySingleton.Create;&lt;br /&gt;  teste1.SetHello('hello 1');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btCria2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  teste2 := TMySingletonDerivado.Create;&lt;br /&gt;  teste2.SetHello('hello 2');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesta1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;    teste1.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesta2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  teste2.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btDestroi1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  teste1.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btDestroi2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  teste2.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado1Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FMySingletonDer1 := TMySingletonDerivado.Create;&lt;br /&gt;  with FMySingletonDer1  do&lt;br /&gt;  begin&lt;br /&gt;    SetHello('teste4');&lt;br /&gt;    SayHello;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FMySingletonDer1.SayHello;&lt;br /&gt;&lt;br /&gt;  FMySingletonDer1.Free;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado2Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  FMySingletonDer2 := TMySingletonDerivado.Create;&lt;br /&gt;  with FMySingletonDer2  do&lt;br /&gt;  begin&lt;br /&gt;    //SetHello('teste5');&lt;br /&gt;    SayHello;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  FMySingletonDer2.SayHello;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado3Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  //FMySingletonDer1 := TMySingletonDerivado.InstanciaPadrao;&lt;br /&gt;  FMySingletonDer1.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado4Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  //FMySingletonDer2 := TMySingletonDerivado.InstanciaPadrao;&lt;br /&gt;  FMySingletonDer2.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTesteDerivado5Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  TMySingletonDerivado.InstanciaPadrao.SetHello('teste6');&lt;br /&gt;  TMySingletonDerivado.Create.SayHello;&lt;br /&gt;  TMySingletonDerivado.InstanciaPadrao.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTeste6Click(Sender: TObject);&lt;br /&gt;var fmst: TMySingleton;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  fmst := TMySingleton.Create;&lt;br /&gt;  fmst.SetHello('testeA');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;&lt;br /&gt;  //mesmo com várias tentativas de criação e destruição a instância se mantem a mesma&lt;br /&gt;&lt;br /&gt;  fmst := TMySingleton.Create;&lt;br /&gt;  fmst := TMySingleton.Create;&lt;br /&gt;  fmst := TMySingleton.Create;&lt;br /&gt;&lt;br /&gt;  fmst.SetHello('testeB');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;&lt;br /&gt;  fmst.Free;&lt;br /&gt;  fmst.Free;&lt;br /&gt;  fmst.Free;&lt;br /&gt;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;  fmst.Destroy;&lt;br /&gt;&lt;br /&gt;  fmst.SetHello('testeC');&lt;br /&gt;  fmst.SayHello;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmSingleton.btTeste5Click(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  TMySingleton.InstanciaPadrao.SetHello('teste3');&lt;br /&gt;  TMySingleton.Create.SayHello;&lt;br /&gt;  TMySingleton.InstanciaPadrao.SayHello;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ainda existe um erro ao se executar os testes 1 do singleton base e logo depois o 5 do singleton derivado. Isso porque a instância será um TMySingleton, e seria inválido fazer o typecast para TMySingletonDerivado.&lt;br /&gt;&lt;br /&gt;Isso pode ser contornado fazendo com que InstnciaPadrao retorne TMySingleton, assim:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;class function TMySingletonDerivado.InstanciaPadrao: TMySingleton;&lt;br /&gt;begin&lt;br /&gt;  if _MySingletonDerivadoInstance = nil then&lt;br /&gt;    _MySingletonDerivadoInstance := TMySingletonDerivado.Create;&lt;br /&gt;&lt;br /&gt;  Result := _MySingletonDerivadoInstance as TMySingleton;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ou então suprimindo-se completamente este método.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;O código atualizado tanto para Delphi como para lazarus pode ser baixado aqui: &lt;a href="http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_3.zip"&gt;http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_3.zip &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nos próximos dois artigos faremos mudanças que funcionarão apenas no Delphi 2009 em diante, e o lazarus ficará de fora. No exemplo 4 transformaremos as variáveis estáticas globais da unit em variaveis/propriedades de classe e no exemplo 5 criaremos um singleton com generics. Até lá!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS.: Eu tenho o péssimo hábito de escrever exceção errado, com dois "S" e só percebo depois, por isso onde estiver excessão leia-se exceção. &lt;br /&gt;&lt;br /&gt;&lt;div class="LeiaMais"&gt;Links úteis, leia todos ;) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 2&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 3&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 4&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Criando uma classe singleton verdadeira em delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi"&gt;http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creating a real singleton class in Delphi 5&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edn.embarcadero.com/article/22576"&gt;http://edn.embarcadero.com/article/22576&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Introdução: Singleton - Design Pattern Delphi - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html"&gt;http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tentativa de Singleton usando Delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/"&gt;http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Implementing the Singleton pattern in delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.delphi3000.com/articles/article_1736.asp?SK="&gt;http://www.delphi3000.com/articles/article_1736.asp?SK=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Essa é uma abordagem nova que eu nunca imaginei:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010"&gt;http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Class (, Static, or Shared) Constructors (and Destructors)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.embarcadero.com/abauer/2009/09/03/38898"&gt;http://blogs.embarcadero.com/abauer/2009/09/03/38898&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Design Patterns in Delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://delphi.about.com/od/oopindelphi/a/aa010201a.htm"&gt;http://delphi.about.com/od/oopindelphi/a/aa010201a.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No forum antigo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.devmedia.com.br/viewtopic.php?t=101997&amp;highlight=singleton" title="Tópico no forum devmedia sobre singleton" target="_blank"&gt;Tópico no forum devmedia sobre singleton&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;no forum novo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/forum/viewtopic.asp?id=374670"&gt;http://www.devmedia.com.br/forum/viewtopic.asp?id=374670&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2549306871346859062?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2549306871346859062/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2549306871346859062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2549306871346859062'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html' title='Existem 1001 maneiras de preparar SINGLETON - parte3'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tqOuULbALEo/TUsIhDkqQvI/AAAAAAAAAUk/L0N38t98i2k/s72-c/formulario-teste-singleton.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-1181838542086752486</id><published>2011-02-03T04:54:00.000-08:00</published><updated>2011-02-03T04:54:49.496-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Vamos ressuscitar o antigo fórum da DevMedia?</title><content type='html'>Bom pessoAll, não sei quanto à vocês, mas eu não gostei do forum novo da DevMedia, por isso criei esse tópico e essa enquete para ver se eles voltam para o antigo.&lt;br /&gt;&lt;br /&gt;O que vocês acham? &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/forum/off-topic/395007-De-boa-pessoall-reabram-o-forum-antigo--Esse-novo-nao-e-legal-.html"&gt;http://www.devmedia.com.br/forum/off-topic/395007-De-boa-pessoall-reabram-o-forum-antigo--Esse-novo-nao-e-legal-.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por favor comentem aqui e no fórum.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-1181838542086752486?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/1181838542086752486/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/vamos-ressuscitar-o-antigo-forum-da.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1181838542086752486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/1181838542086752486'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/vamos-ressuscitar-o-antigo-forum-da.html' title='Vamos ressuscitar o antigo fórum da DevMedia?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-246411408985200987</id><published>2011-02-02T03:16:00.000-08:00</published><updated>2011-02-02T03:19:25.572-08:00</updated><title type='text'>Embarcadero Technologies</title><content type='html'>&lt;div&gt;Aewwwww, me registrei para Delphi Meeting 2011. Vamo lá!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://latam.embarcadero.com/eventregistration/Confirmation.aspx?Rootid=3!55746&amp;amp;Eventid=5!54205"&gt;&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;&lt;a href="http://latam.embarcadero.com/eventregistration/Confirmation.aspx?Rootid=3!55746&amp;amp;Eventid=5!54205"&gt;Embarcadero Technologies&lt;/a&gt;: "CONFIRMAÇÃO DE REGISTRO!&lt;br /&gt;&lt;br /&gt;Estimado(a): Vitor&lt;br /&gt;&lt;br /&gt;Obrigado por registrar-se no evento:  Delphi Meeting 2011 - São Paulo.&lt;br /&gt;&lt;br /&gt;Confirmado sua presença no Delphi Meeting 2011. Se estiver impossibilitado de participar do evento, por favor nos informe, pois as vagas para este evento são limitadas.&lt;br /&gt;&lt;br /&gt;Deseja convidar um amigo?&lt;br /&gt;&lt;br /&gt;Ligue para (11) 2165-8000 ou acesse http://latam.embarcadero.com/br/delphimeeting&lt;br /&gt;&lt;br /&gt;Esperamos você no dia do evento!"&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-246411408985200987?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://latam.embarcadero.com/br/delphimeeting/' title='Embarcadero Technologies'/><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/246411408985200987/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/embarcadero-technologies.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/246411408985200987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/246411408985200987'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/02/embarcadero-technologies.html' title='Embarcadero Technologies'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-8090812047693580916</id><published>2011-01-31T07:03:00.001-08:00</published><updated>2011-07-15T07:13:36.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><title type='text'>Desbloqueio de Samsung Galaxy S</title><content type='html'>&lt;b&gt;Update na parte de cima porque tem gente que não sabe ler:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Recebo uma quantidade absurda de &lt;b&gt;mimimi &lt;/b&gt;de gente que não sabe usar um celular e vem desesperado me perguntar o que fazer, então, atenção para algumas regrinhas básicas:&lt;br /&gt;&lt;br /&gt;1) Esse procedimento necessita de um &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;reset de fábrica&lt;/span&gt;&lt;/b&gt;, ou &lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;factory reset&lt;/span&gt;&lt;/b&gt; no seu celular.&lt;br /&gt;2) &lt;b&gt;Todos os seus dados&lt;/b&gt;, videos, arquivos e bugigangas &lt;b&gt;serão apagados irrecuperavelmente&lt;/b&gt;.&lt;br /&gt;3) Não me responsabilizo por danos causados no seu aparelho.&lt;br /&gt;4) Se não se sentir seguro ou não tiver conhecimento técnico suficiente, ou não entendeu alguma palavra do que eu disse, NÃO FAÇA O PROCEDIMENTO.&lt;br /&gt;5) Isso é um blog, não um fórum.&lt;br /&gt;6) Isso é um blog, E NÃO UM FÓRUM POW!.&lt;br /&gt;7) O procedimento foi realizado com um Samsung Galaxy S, versão 2.1 do Android, modelo GT-I9000B, kernel 2.6.29, n° de compilação ECLAIR.VJJG9. Nunca fiz o procedimento em outro aparelho, nunca nem vi outro. Portanto se o seu aparelho for UM MILÍMETRO, UMA LETRINHA, diferente desse, NÃO ME PERGUNTE, EU NÃO SEI, NÃO TENTE FAZER O PROCEDIMENTO.&lt;br /&gt;8) Eu não sou funcionário, técnico, atendente ou SAC da samsung. Se quiser o SAC da samsung está aqui:&amp;nbsp;&lt;a href="http://www.samsung.com/br/"&gt;http://www.samsung.com/br/&lt;/a&gt;&lt;br /&gt;9) Existe um grande site, que pode resolver todas as suas dúvidas e te ajudar a desbloquear qualquer celular, é este &lt;a href="http://migre.me/5gLGb"&gt;aqui&amp;nbsp;http://migre.me/5gLGb&lt;/a&gt;&lt;br /&gt;10) Se não sabe o que é Android ou não tem conta no google, faça o favor: nem tente.&lt;br /&gt;&lt;br /&gt;Quando comprei um Samsung Galaxy S com linha da VIVO eu ainda tinha um chip pré-pago da OI, e tinha optado por fazer a portabilidade do meu número. Mas como a portabilidade demoraria uns 5 dias, eu queria já usar o meu celular novo, e tentei colocar nele o chip da OI. Nada feito. O sistema estava bloqueado pela VIVO e pedia pin e tal. Mas nem o pin da VIVO nem o da OI servia.&lt;br /&gt;Fiquei com minha linha no chip da OI que não funcionava no celular novo, e o chip novo da VIVO que ainda não tinha meu número, e iria demorar 5 dias. O que fazer? Voltar para o celular antigo por 5 dias?&lt;br /&gt;&lt;br /&gt;Para usar meu chip da OI nesses 5 dias no meu celular VIVO tive que fazer o que por lei seria obrigação das lojas e operadoras, mas que eles não fazem por negligência, incompetência e claro desrespeito às leis.&lt;br /&gt;&lt;br /&gt;Primeiro de tudo leia esse post&amp;nbsp;&lt;a href="http://vitorrubio.blogspot.com/2011/01/dicas-e-codigos-para-celulares.html"&gt;http://vitorrubio.blogspot.com/2011/01/dicas-e-codigos-para-celulares.html&lt;/a&gt;&amp;nbsp;para saber alguns códigos úteis para seu celular, como o reset de fábrica, por exemplo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Baixe o programa sgs unlock pelo android market, ou via rapidshare nesse link &lt;a href="http://piratamania.com/desbloquear-samsung-galaxy-s-tmn/"&gt;http://piratamania.com/desbloquear-samsung-galaxy-s-tmn/&lt;/a&gt;&amp;nbsp;(particularmente eu usei &amp;nbsp;o market)&lt;br /&gt;rodar o programa e no botão do menu escolher uma das opções, com ou sem root. (dá pra fazer sem root) Você receberá dois códigos de 8 digitos, um de unlock e um de unfreeze. Anote-os.&lt;br /&gt;&lt;br /&gt;Desligue o celular, tire o chip dele (por ex.: &lt;b&gt;vivo&lt;/b&gt;) e coloque o seu chip de outra operadora (por ex.: &lt;b&gt;oi&lt;/b&gt;) e quando ligar novamente pedirá o código para desbloqueio de rede sim.&lt;br /&gt;&lt;br /&gt;Use o código "unlock" anotado do programa. Caso não funcione execute no discador o código para resetar e &lt;b&gt;*2767*3855#&lt;/b&gt; e quando ligar (reboot) coloque o código de "unlock".&lt;br /&gt;&lt;br /&gt;Pronto, seu chip pre-pago da OI está pronto para ser usado no seu celular novo, agora desbloqueado, até que a portabilidade ocorra. Depois é só colocar seu chip novo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-8090812047693580916?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/8090812047693580916/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/desbloqueio-de-samsung-galaxy-s.html#comment-form' title='6 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8090812047693580916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/8090812047693580916'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/desbloqueio-de-samsung-galaxy-s.html' title='Desbloqueio de Samsung Galaxy S'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6773237128981005386</id><published>2011-01-31T06:01:00.000-08:00</published><updated>2011-01-31T06:01:29.250-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><title type='text'>Dicas e códigos para celulares</title><content type='html'>Código para ver se a rede está bloqueada (faça no teclado numérico do discador)&lt;br /&gt;&lt;b&gt;*#7465625#&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Com isso aparecerá uma lista de opções e se cada uma delas está bloqueada ou não.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Código para resetar a rede (no discador)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;*2767*3855#&lt;/b&gt; (isso dará um &lt;b&gt;factory reset&lt;/b&gt; no celular, apagando suas configurações e apps salvas)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Código para mudar o pin do seu chip:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;* * 04 * pin atual * pin novo * pin novo#&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Obtendo o IMEI:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Para bloquear o celular em caso de roubo:&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;O imei vem anotado em um código barras abaixo da bateria, na parte de dentro, mas você pode discar &lt;b&gt;*#06#&lt;/b&gt; que o imei aparecerá. Anote esse número. Caso seu celular seja roubado, ligue na operadora ou na anatel e peça para bloquear esse imei. O ladrão não vai poder usar esse celular nem trocando o chip.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://www.baixaki.com.br/tecnologia/3544-imei-aprenda-a-bloquear-o-aparelho-celular-em-caso-de-roubo.htm"&gt;http://www.baixaki.com.br/tecnologia/3544-imei-aprenda-a-bloquear-o-aparelho-celular-em-caso-de-roubo.htm&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Códigos padrões de pins de operadoras&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;TIM - &lt;b&gt;1010&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Claro - &lt;b&gt;3636&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;OI - &lt;b&gt;8888&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;BrT GSM - &lt;b&gt;1414&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Amaz/Telemig - &lt;b&gt;1414&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;CTBC - &lt;b&gt;1212&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;VIVO - &lt;b&gt;8486&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Também podem ser usados como padrão:&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;0000&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;00000&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;1234&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;12345&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;Fontes&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;a href="http://www.youtube.com/watch?v=oszeD_o8RSQ"&gt;http://www.youtube.com/watch?v=oszeD_o8RSQ&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;a href="http://ne-miguelito.com/index.php?topic=154590.0"&gt;http://ne-miguelito.com/index.php?topic=154590.0&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;a href="http://piratamania.com/desbloquear-samsung-galaxy-s-tmn/"&gt;http://piratamania.com/desbloquear-samsung-galaxy-s-tmn/&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;a href="http://www.blogsdna.com/11906/how-to-unlock-samsung-galaxy-s-with-free-unlock-codes.htm"&gt;http://www.blogsdna.com/11906/how-to-unlock-samsung-galaxy-s-with-free-unlock-codes.htm&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-weight: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;a href="http://info.abril.com.br/forum/viewtopic.php?f=185&amp;amp;t=1142"&gt;http://info.abril.com.br/forum/viewtopic.php?f=185&amp;amp;t=1142&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6773237128981005386?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6773237128981005386/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/dicas-e-codigos-para-celulares.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6773237128981005386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/6773237128981005386'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/dicas-e-codigos-para-celulares.html' title='Dicas e códigos para celulares'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3981253441342632197</id><published>2011-01-31T05:27:00.000-08:00</published><updated>2011-02-08T10:12:00.614-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><category scheme='http://www.blogger.com/atom/ns#' term='design patterns'/><title type='text'>Existem 1001 maneiras de preparar SINGLETON - parte2</title><content type='html'>No &lt;a href="http://vitorrubio.blogspot.com/2010/11/existem-1001-maneiras-de-preparar.html"&gt;último post desta série&lt;/a&gt; mostramos como preparar um singleton que funciona tanto em Delphi como em Lazarus.&lt;br /&gt;&lt;br /&gt;Neste post veremos como criar um singleton mais elegante que funcione sem métodos ou variáveis estáticas. Usaremos class vars e class methods para isso. Porém a lógica será a mesma do exemplo anterior.&lt;br /&gt;&lt;br /&gt;Objeto Único:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingleton;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  DateUtils, SysUtils, Windows, dialogs;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TObjetoUnico = class&lt;br /&gt;  private&lt;br /&gt;    FDataHora: string;&lt;br /&gt;    class var  FObjetoUnico: TObjetoUnico;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnico; static;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;  public&lt;br /&gt;    constructor Create;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    function GetDataHora: string; virtual;&lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico:  TObjetoUnico read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;    property DataHora: string read GetDataHora write FDataHora;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoCriado;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoCriado;&lt;br /&gt;begin&lt;br /&gt;  //Uso do FObjetoUnico aqui porque se usasse ObjetoUnico o método acessor&lt;br /&gt;  //GetObjetoUnico seria automaticamente executado, criando o objeto&lt;br /&gt;  if (TObjetoUnico.FContador &gt;= 1) and (TObjetoUnico.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;    ShowMessage('=========== verificação ===========' + #13#10 +&lt;br /&gt;    'Nome da classe: ' + TObjetoUnico.FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação: ' + TObjetoUnico.FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(TObjetoUnico.FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TObjetoUnico }&lt;br /&gt;&lt;br /&gt;constructor TObjetoUnico.Create;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;    //essa verificação impede uma segunda chamada a create&lt;br /&gt;    //se não verificar, ou se deixar crar para se disparar a excessão depois&lt;br /&gt;    //da verificação corre-se o risco de ter criado mais um antes da excessão&lt;br /&gt;    //e aí não será possível destruir, causando um leak&lt;br /&gt;    if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    begin&lt;br /&gt;      inherited Create;  //aqui tudo bem usar o inherited create e destroy porque a classe base não faz nada de mais&lt;br /&gt;      InterlockedIncrement(FContador);&lt;br /&gt;      DataHora := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      raise Exception.Create('Ei! Não use esse constructor, use o CreateUnico!');&lt;br /&gt;    //o inherited fica dentro do if assim o objeto não será criado caso ja esteja o contador &gt; 0&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TObjetoUnico.Destroy;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  FObjetoUnico := nil;&lt;br /&gt;  InterlockedDecrement(FContador);&lt;br /&gt;  inherited;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnico.GetContador: integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FContador;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TObjetoUnico.GetDataHora: string;&lt;br /&gt;begin&lt;br /&gt;  Result := FDataHora;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//como a propriedade  ObjetoUnico executa esse get e esse get le o class var e&lt;br /&gt;//o instancia caso seja nil a propriedade ObjetoUnico tem uma proteção&lt;br /&gt;//natural contra nil e sempre será instanciada, nunca será igual a nil&lt;br /&gt;class function TObjetoUnico.GetObjetoUnico: TObjetoUnico;&lt;br /&gt;begin&lt;br /&gt;  //aqui a mesma verificação é feita para não se executar o create duas vezes&lt;br /&gt;  //mas devolver o objeto existente ou devolvê-lo assim que criado&lt;br /&gt;  if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    FObjetoUnico := TObjetoUnico.Create;&lt;br /&gt;  Result := FObjetoUnico;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  //a initilization não é necessária&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (TObjetoUnico.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    //leia o comentário abaixo para saber porque o campo privado FObjetoUnico&lt;br /&gt;    //é usado aqui em vez da propriedade ObjetoUnico&lt;br /&gt;    TObjetoUnico.FObjetoUnico.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de excessão&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  //por causa da proteção "natural" contra nil você pode destruir&lt;br /&gt;  //o singleton com&lt;br /&gt;  //TObjetoUnico.ObjetoUnico.Free;&lt;br /&gt;  //mas isso causa um overhead porque se o FObjetoUnico não estiver criado (nil)&lt;br /&gt;  //ele será criado só para ser destruído.&lt;br /&gt;  //É bonito de se ver, mas feio do ponto de vista do algoritmo&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Objeto Único Derivado:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  uSingleton, SysUtils, DateUtils, Windows, dialogs;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TObjetoUnicoDerivado = class(TObjetoUnico)&lt;br /&gt;  private&lt;br /&gt;    class var FObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnicoDerivado;  static;&lt;br /&gt;  public&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    constructor Create; reintroduce;   &lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico: TObjetoUnicoDerivado  read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;    function GetDataHora: string; override;&lt;br /&gt;&lt;br /&gt;    property DataHora: string read GetDataHora;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoDerivadoCriado;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoDerivadoCriado;&lt;br /&gt;begin&lt;br /&gt;  if (TObjetoUnicoDerivado.FContador &gt;= 1) and (TObjetoUnicoDerivado.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;    ShowMessage('=========== verificação ===========' + #13#10 +&lt;br /&gt;    'Nome da classe: ' + TObjetoUnicoDerivado.ObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação pelo método: ' + TObjetoUnicoDerivado.ObjetoUnico.GetDataHora + #13#10 +&lt;br /&gt;    'Hora de Criação pela propriedade: ' + TObjetoUnicoDerivado.ObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(TObjetoUnicoDerivado.ObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TObjetoUnicoDerivado }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;constructor TObjetoUnicoDerivado.Create;&lt;br /&gt;begin&lt;br /&gt;    if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    begin&lt;br /&gt;      InterlockedIncrement(FContador);&lt;br /&gt;      DataHora := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      raise Exception.Create('Ei! Não use esse constructor, use o CreateUnico!');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TObjetoUnicoDerivado.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FObjetoUnico := nil;&lt;br /&gt;  InterlockedDecrement(FContador);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnicoDerivado.GetContador: integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FContador;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function TObjetoUnicoDerivado.GetDataHora: string;&lt;br /&gt;begin&lt;br /&gt;  Result := 'acréscimo ' + inherited;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnicoDerivado.GetObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;begin&lt;br /&gt;  if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    FObjetoUnico := TObjetoUnicoDerivado.Create;&lt;br /&gt;  Result := FObjetoUnico;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  //aqui há um exemplo de como o objeto único pode ser destruido&lt;br /&gt;  TObjetoUnicoDerivado.FObjetoUnico.Free;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Os testes podem ser feitos da mesma maneira que o exemplo anterior:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit Unit1;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;  Dialogs, StdCtrls, Menus, uSingleton, uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TfrmUmaInstancia = class(TForm)&lt;br /&gt;    btUnico: TButton;&lt;br /&gt;    btDerivado: TButton;&lt;br /&gt;    btVerificaUnico: TButton;&lt;br /&gt;    btVerificaDerivado: TButton;&lt;br /&gt;    procedure btUnicoClick(Sender: TObject);&lt;br /&gt;    procedure btDerivadoClick(Sender: TObject);&lt;br /&gt;    procedure btVerificaUnicoClick(Sender: TObject);&lt;br /&gt;    procedure btVerificaDerivadoClick(Sender: TObject);&lt;br /&gt;  public&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;var&lt;br /&gt;  frmUmaInstancia: TfrmUmaInstancia;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{$R *.dfm}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TfrmUmaInstancia.btDerivadoClick(Sender: TObject);&lt;br /&gt;var FObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;begin&lt;br /&gt;  //veja que é possivel executar o create&lt;br /&gt;  //Mas dessa forma não é garantido que o objeto seja unico&lt;br /&gt;  //para garantir que seja único é imprescindível o uso do método  CreateUnico&lt;br /&gt;&lt;br /&gt;  FObjetoUnico := TObjetoUnicoDerivado.ObjetoUnico;&lt;br /&gt;&lt;br /&gt;  //mostrando a classe do objeto, hora de criação e endereço do objeto&lt;br /&gt;  //veja que é sempre igual&lt;br /&gt;  ShowMessage('Nome da classe: ' + FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação: ' + FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmUmaInstancia.btUnicoClick(Sender: TObject);&lt;br /&gt;var FObjetoUnico: TObjetoUnico;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  //veja que é possivel executar o create&lt;br /&gt;  //Mas dessa forma não é garantido que o objeto seja unico&lt;br /&gt;  //para garantir que seja único é imprescindível o uso do método  CreateUnico&lt;br /&gt;&lt;br /&gt;  FObjetoUnico := TObjetoUnico.ObjetoUnico;&lt;br /&gt;&lt;br /&gt;  //mostrando a classe do objeto, hora de criação e endereço do objeto&lt;br /&gt;  //veja que é sempre igual&lt;br /&gt;  ShowMessage('Nome da classe: ' + FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação: ' + FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure TfrmUmaInstancia.btVerificaDerivadoClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  VerificaObjetoUnicoDerivadoCriado;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;procedure TfrmUmaInstancia.btVerificaUnicoClick(Sender: TObject);&lt;br /&gt;begin&lt;br /&gt;  VerificaObjetoUnicoCriado;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Da mesma forma que o primeiro exemplo, todos os métodos devem ser re-escritos, e praticamente substituidos sem menção ou referência a inherited. Um override completo.&lt;br /&gt;O único método que pode ser aproveitar dos dois lados do polimorfismo (herdar um método, modificá-lo com override mas ainda assim aproveitar-se de parte do código do método ancestral) e agregar alguma coisa nova no código antigo é o GetDataHora, que é público e virtual.&lt;br /&gt;&lt;br /&gt;Também é possível que GetDataHora seja privado, como geralmente um método acessor no Delphi deve ser, mas se crie um novo na classe derivada para servir de método acessor à nova propriedade DataHora. E a DataHora do objeto ancestral pode ser obtida com inherited.&lt;br /&gt;Passamos o método GetDataHora para private tanto no TObjetoUnico como no TObjetoUnicoDerivado, e este método não será mais virtual ou dinâmico nem será mais sobrescrito.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;TObjetoUnico = class&lt;br /&gt;  private&lt;br /&gt;    FDataHora: string;&lt;br /&gt;    class var  FObjetoUnico: TObjetoUnico;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnico; static;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;    function GetDataHora: string;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor Create;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico:  TObjetoUnico read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;    property DataHora: string read GetDataHora write FDataHora;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;{...}&lt;br /&gt;&lt;br /&gt;  TObjetoUnicoDerivado = class(TObjetoUnico)&lt;br /&gt;  private&lt;br /&gt;    class var FObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnicoDerivado;  static;&lt;br /&gt;    function GetDataHora: string;&lt;br /&gt;  public&lt;br /&gt;    constructor Create; reintroduce;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico: TObjetoUnicoDerivado  read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;    property DataHora: string read GetDataHora;&lt;br /&gt;&lt;br /&gt;  end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Mas o método GetDataHora do TObjetoUnicoDerivado é diferente. E ele consegue substituir o acessor da propriedade DataHora mesmo que esta propriedade não esteja declarada no TObjetoUnicoDerivado e não tenhamos um FDataHora. Fazemos isso por usar o inherited de DataHora, onde é possível obter o valor ancestral de DataHora.&lt;br /&gt;&lt;br /&gt;function TObjetoUnicoDerivado.GetDataHora: string;&lt;br /&gt;begin&lt;br /&gt;Result := 'acréscimo ' + inherited DataHora;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;O ponto fraco dessa abordagem é que se você tiver um objeto TObjetoUnicoDerivado instanciado em uma variável TObjetoUnico, o GetDataHora que será executado é o do TObjetoUnico e não o do TObjetoUnicoDerivado. A única forma de se resolver isso é tornar GetDataHora público e virtual. Assim ele pode ser "sobrescrito" e mesmo uma variável TObjetoUnico pode referenciar o método  GetDataHora correto caso este seja um TObjetoUnicoDerivado. Mas a única maneira de se fazer isso sem gerar um access violation caso o método  ou propriedade referenciados ainda não estejam na memória ou ainda não tenham sido sobrescritos é retirar do singleton derivado a propriedade DataHora e sobrescrever o método GetDataHora. Somente assim a propriedade DataHora lerá o acessor GetDataHora mesmo em um TObjetoUnicoDerivado instanciado em uma variável do tipo TObjetoUnico.&lt;br /&gt;&lt;br /&gt;Ou seja, o final da brincadeira ficará assim:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingleton;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  DateUtils, SysUtils, Windows, dialogs;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TObjetoUnico = class&lt;br /&gt;  private&lt;br /&gt;    FDataHora: string;&lt;br /&gt;    class var  FObjetoUnico: TObjetoUnico;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnico; static;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  public&lt;br /&gt;    constructor Create;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    function GetDataHora: string; virtual;&lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico:  TObjetoUnico read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;    property DataHora: string read GetDataHora write FDataHora;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoCriado;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoCriado;&lt;br /&gt;begin&lt;br /&gt;  //Uso do FObjetoUnico aqui porque se usasse ObjetoUnico o método acessor&lt;br /&gt;  //GetObjetoUnico seria automaticamente executado, criando o objeto&lt;br /&gt;  if (TObjetoUnico.FContador &gt;= 1) and (TObjetoUnico.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;    ShowMessage('=========== verificação ===========' + #13#10 +&lt;br /&gt;    'Nome da classe: ' + TObjetoUnico.FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação pelo método: ' + TObjetoUnico.FObjetoUnico.GetDataHora + #13#10 +&lt;br /&gt;    'Hora de Criação pela propriedade: ' + TObjetoUnico.FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(TObjetoUnico.FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TObjetoUnico }&lt;br /&gt;&lt;br /&gt;constructor TObjetoUnico.Create;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;    //essa verificação impede uma segunda chamada a create&lt;br /&gt;    //se não verificar, ou se deixar crar para se disparar a excessão depois&lt;br /&gt;    //da verificação corre-se o risco de ter criado mais um antes da excessão&lt;br /&gt;    //e aí não será possível destruir, causando um leak&lt;br /&gt;    if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    begin&lt;br /&gt;      inherited Create;  //aqui tudo bem usar o inherited create e destroy porque a classe base não faz nada de mais&lt;br /&gt;      InterlockedIncrement(FContador);&lt;br /&gt;      DataHora := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      raise Exception.Create('Ei! Não use esse constructor, use o CreateUnico!');&lt;br /&gt;    //o inherited fica dentro do if assim o objeto não será criado caso ja esteja o contador &gt; 0&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TObjetoUnico.Destroy;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;  FObjetoUnico := nil;&lt;br /&gt;  InterlockedDecrement(FContador);&lt;br /&gt;  inherited;&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnico.GetContador: integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FContador;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;function TObjetoUnico.GetDataHora: string;&lt;br /&gt;begin&lt;br /&gt;  Result := FDataHora;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//como a propriedade  ObjetoUnico executa esse get e esse get le o class var e&lt;br /&gt;//o instancia caso seja nil a propriedade ObjetoUnico tem uma proteção&lt;br /&gt;//natural contra nil e sempre será instanciada, nunca será igual a nil&lt;br /&gt;class function TObjetoUnico.GetObjetoUnico: TObjetoUnico;&lt;br /&gt;begin&lt;br /&gt;  //aqui a mesma verificação é feita para não se executar o create duas vezes&lt;br /&gt;  //mas devolver o objeto existente ou devolvê-lo assim que criado&lt;br /&gt;  if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    FObjetoUnico := TObjetoUnico.Create;&lt;br /&gt;  Result := FObjetoUnico;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;  //a initilization não é necessária&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  if (TObjetoUnico.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;  try&lt;br /&gt;    //leia o comentário abaixo para saber porque o campo privado FObjetoUnico&lt;br /&gt;    //é usado aqui em vez da propriedade ObjetoUnico&lt;br /&gt;    TObjetoUnico.FObjetoUnico.Free;&lt;br /&gt;  except&lt;br /&gt;    //tratamento de excessão&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;  //por causa da proteção "natural" contra nil você pode destruir&lt;br /&gt;  //o singleton com&lt;br /&gt;  //TObjetoUnico.ObjetoUnico.Free;&lt;br /&gt;  //mas isso causa um overhead porque se o FObjetoUnico não estiver criado (nil)&lt;br /&gt;  //ele será criado só para ser destruído.&lt;br /&gt;  //É bonito de se ver, mas feio do ponto de vista do algoritmo&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;unit uSingletonDerivado;&lt;br /&gt;&lt;br /&gt;interface&lt;br /&gt;&lt;br /&gt;uses&lt;br /&gt;  uSingleton, SysUtils, DateUtils, Windows, dialogs;&lt;br /&gt;&lt;br /&gt;type&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  TObjetoUnicoDerivado = class(TObjetoUnico)&lt;br /&gt;  private&lt;br /&gt;    class var FObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;    class var  FContador: Integer;&lt;br /&gt;    class function GetContador: integer; static;&lt;br /&gt;    class function GetObjetoUnico: TObjetoUnicoDerivado;  static;&lt;br /&gt;  public&lt;br /&gt;    constructor Create; reintroduce;&lt;br /&gt;    destructor Destroy; override;&lt;br /&gt;    function GetDataHora: string; override;&lt;br /&gt;&lt;br /&gt;    class property ObjetoUnico: TObjetoUnicoDerivado  read GetObjetoUnico;&lt;br /&gt;    class property Contador: integer read GetContador;&lt;br /&gt;&lt;br /&gt;  end;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoDerivadoCriado;&lt;br /&gt;&lt;br /&gt;implementation&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;procedure VerificaObjetoUnicoDerivadoCriado;&lt;br /&gt;begin&lt;br /&gt;  if (TObjetoUnicoDerivado.FContador &gt;= 1) and (TObjetoUnicoDerivado.FObjetoUnico &lt;&gt; nil) then&lt;br /&gt;    ShowMessage('=========== verificação ===========' + #13#10 +&lt;br /&gt;    'Nome da classe: ' + TObjetoUnicoDerivado.FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação pelo método: ' + TObjetoUnicoDerivado.FObjetoUnico.GetDataHora + #13#10 +&lt;br /&gt;    'Hora de Criação pela propriedade: ' + TObjetoUnicoDerivado.FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(TObjetoUnicoDerivado.FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;{ TObjetoUnicoDerivado }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;constructor TObjetoUnicoDerivado.Create;&lt;br /&gt;begin&lt;br /&gt;    if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    begin&lt;br /&gt;      InterlockedIncrement(FContador);&lt;br /&gt;      DataHora := FormatDateTime('yyyy-mm-dd hh:nn:ss', now);&lt;br /&gt;    end&lt;br /&gt;    else&lt;br /&gt;      raise Exception.Create('Ei! Não use esse constructor, use o CreateUnico!');&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;destructor TObjetoUnicoDerivado.Destroy;&lt;br /&gt;begin&lt;br /&gt;  FObjetoUnico := nil;&lt;br /&gt;  InterlockedDecrement(FContador);&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnicoDerivado.GetContador: integer;&lt;br /&gt;begin&lt;br /&gt;  Result := FContador;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function TObjetoUnicoDerivado.GetDataHora: string;&lt;br /&gt;begin&lt;br /&gt;  Result := 'acréscimo ' + inherited GetDataHora;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class function TObjetoUnicoDerivado.GetObjetoUnico: TObjetoUnicoDerivado;&lt;br /&gt;begin&lt;br /&gt;  if (FContador = 0) and (FObjetoUnico = nil) then&lt;br /&gt;    FObjetoUnico := TObjetoUnicoDerivado.Create;&lt;br /&gt;  Result := FObjetoUnico;&lt;br /&gt;end;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;initialization&lt;br /&gt;&lt;br /&gt;finalization&lt;br /&gt;  //aqui há um exemplo de como o objeto único pode ser destruido&lt;br /&gt;  TObjetoUnicoDerivado.FObjetoUnico.Free;&lt;br /&gt;&lt;br /&gt;end.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;A maior lição aprendida aqui é que se desejamos sobrescrever os métodos acessores, para poder usufruir de todos os recursos da herança e do polimorfismo e poder agregar código ao método da classe base ainda usando parte do código da classe base devemos fazer como no Java e em outras linguagens Orientadas a Objetos e criar métodos acessores públicos e virtuais.&lt;br /&gt;&lt;br /&gt;Além disso, isso é extremamente necessário, indispensável, para se criar interfaces com propriedades. Em interfaces as propriedades só podem ler e escrever métodos, e nunca campos privados, mas os métodos de uma interface, mesmo que acessores, PRECISAM SER PÚBLICOS E VIRTUAIS para que possam ser implementados. &lt;br /&gt;&lt;br /&gt;Essa última alteração pode ser testada com mais um botão que cria uma instância de TObjetoUnicoDerivado dentro de uma variável ancestral, do tipo TObjetoUnico.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: delphi"&gt;procedure TfrmUmaInstancia.brCriaDerivadoEmAncestralClick(Sender: TObject);&lt;br /&gt;var FObjetoUnico: TObjetoUnico;&lt;br /&gt;begin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  FObjetoUnico := TObjetoUnicoDerivado.ObjetoUnico;&lt;br /&gt;&lt;br /&gt;  ShowMessage('Nome da classe: ' + FObjetoUnico.ClassName+ #13#10 +&lt;br /&gt;    'Hora de Criação: ' + FObjetoUnico.DataHora + #13#10 +&lt;br /&gt;    'Endereço na memória: ' + IntToStr(Integer(FObjetoUnico))&lt;br /&gt;  );&lt;br /&gt;&lt;br /&gt;end;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quem quiser conferir esse exemplo é só baixá-lo aqui: &lt;a href="http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_2.7z"&gt;http://www.vitorrubio.com.br/downloads/Exemplo_Singleton_2.7z&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Have fun ;)&lt;br /&gt;&lt;br /&gt;&lt;div class="LeiaMais"&gt;Links úteis, leia todos ;) &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2010/11/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 2&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 3&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existem 1001 maneiras de preparar SINGLETON, invente uma! - Parte 4&lt;br /&gt;&lt;a href="http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html"&gt;http://blog.vitorrubio.com.br/2011/02/existem-1001-maneiras-de-preparar_08.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Criando uma classe singleton verdadeira em delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi"&gt;http://www.comofazertudo.com.br/computadores-e-internet/criando-uma-classe-singleton-verdadeira-em-delphi&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Creating a real singleton class in Delphi 5&lt;br /&gt;&lt;br /&gt;&lt;a href="http://edn.embarcadero.com/article/22576"&gt;http://edn.embarcadero.com/article/22576&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Introdução: Singleton - Design Pattern Delphi - Parte 1&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html"&gt;http://www.devmedia.com.br/post-17889-Introducao--Singleton-Design-Pattern-Delphi-Parte-1.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tentativa de Singleton usando Delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/"&gt;http://www.marcosdellantonio.net/2006/12/01/tentativa-de-singleton-usando-delphi/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Implementing the Singleton pattern in delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.delphi3000.com/articles/article_1736.asp?SK="&gt;http://www.delphi3000.com/articles/article_1736.asp?SK=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Essa é uma abordagem nova que eu nunca imaginei:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010"&gt;http://stackoverflow.com/questions/1409593/creating-a-singleton-in-delphi-using-the-new-features-of-d2009-and-d2010&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Class (, Static, or Shared) Constructors (and Destructors)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.embarcadero.com/abauer/2009/09/03/38898"&gt;http://blogs.embarcadero.com/abauer/2009/09/03/38898&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Design Patterns in Delphi&lt;br /&gt;&lt;br /&gt;&lt;a href="http://delphi.about.com/od/oopindelphi/a/aa010201a.htm"&gt;http://delphi.about.com/od/oopindelphi/a/aa010201a.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;No forum antigo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forum.devmedia.com.br/viewtopic.php?t=101997&amp;highlight=singleton" title="Tópico no forum devmedia sobre singleton" target="_blank"&gt;Tópico no forum devmedia sobre singleton&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;no forum novo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devmedia.com.br/forum/viewtopic.asp?id=374670"&gt;http://www.devmedia.com.br/forum/viewtopic.asp?id=374670&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3981253441342632197?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3981253441342632197/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3981253441342632197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3981253441342632197'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/existem-1001-maneiras-de-preparar.html' title='Existem 1001 maneiras de preparar SINGLETON - parte2'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3457852670348862635</id><published>2011-01-28T10:15:00.000-08:00</published><updated>2011-02-01T09:46:28.410-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><title type='text'>O santo graal da memória não volátil</title><content type='html'>Caminhava eu para a praça Silvio Romero a fim de &amp;nbsp;resolver minha pugna minha com a receita federal e, precavido que sou, levei minha declaração do imposto de renda E a retificação da dita cuja em duas cópias, uma em DVD e uma em pendrive.&lt;br /&gt;&lt;br /&gt;O porque da peleja? não consigo transmitir minha maldita declaração do IR. Recebo essa mensagem de erro:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://vitorrubio.files.wordpress.com/2011/01/receita.gif" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="erro ao enviar arquivo" class="size-medium wp-image-72" height="71" src="http://vitorrubio.files.wordpress.com/2011/01/receita.gif?w=300" title="receita" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;É esta a mensagem de erro&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Optei por essas mídias porque ligando no 146, de Brasília, fui informado de que poderia ser em pendrive. Ao chegar lá, após pegar a senha de pré - atendimento, peguei a de ATENDIMENTO. Foi o tempo de passar 21 telas do angrybirds. Minha senha era AMF XX, AMF de Auxílio Malha Fina.&lt;br /&gt;&lt;br /&gt;Chegando lá, a gentil e capacitada funcionária pública da receita disse que eu deveria trazer a declaração para ser transmitida por lá. &amp;nbsp;Saquei a declaração do bolso, e então ela disse que eu deveria pegar uma senha e um formulário para a retransmissão da declaração.&lt;br /&gt;&lt;br /&gt;Peguei novamente duas senhas.&lt;br /&gt;&lt;br /&gt;Ao ser atendido novamente (milhares de porquinhos depois) o atendente, também incrivelmente capacitado e inteligente, me passou um telefone: (11) 3757-6508. Você consegue ligar? Nem eu. Ele me disse que poderia fazer a transmissão pra mim.&lt;br /&gt;&lt;br /&gt;Quando saquei meu DVD desperdiçado com um único arquivo de míseros 2 kb, o atendente, balançando a cabeça, disse: "- cd não pode senhor". "porque?" perguntei. "Porque cd é somente leitura e precisamos gravar o recibo de envio". Eu nem questionei, saquei meu pendrive de 8 GB e disse: &amp;nbsp;- esse grava, e muito.&lt;br /&gt;&lt;br /&gt;- Não pode ser pendrive senhor.&lt;br /&gt;&lt;br /&gt;- Oras, &amp;nbsp; e o que pode então?&lt;br /&gt;&lt;br /&gt;- Disquete.&lt;br /&gt;&lt;br /&gt;- O quê? (whaaaaaaaat)?&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://desciclo.pedia.ws/wiki/Disquete" target="_blank" title="Disquete"&gt;Disquete&lt;/a&gt; senhor. Desse tipo aqui:&amp;nbsp;&lt;a href="http://vitorrubio.files.wordpress.com/2011/01/floppy_disk_90mm1.jpg"&gt;&lt;img alt="" class="alignnone size-thumbnail wp-image-74" height="125" src="http://vitorrubio.files.wordpress.com/2011/01/floppy_disk_90mm1.jpg?w=150" title="Floppy_disk_90mm" width="150" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Karaleo, onde vou arrumar um desses? Tem antiquário por aqui? Tem certeza que o senhor não quer um relógio cuco ou um soldado de terracota? Onde vou arrumar uma coisa dessas.&lt;br /&gt;&lt;br /&gt;Pois é, o cara queria um &lt;a href="http://pt.wikipedia.org/wiki/Disquete" target="_blank"&gt;disquete&lt;/a&gt; &lt;a href="http://vitorrubio.files.wordpress.com/2011/01/200px-img-00704d04.jpg"&gt;&lt;img alt="" class="alignnone size-thumbnail wp-image-75" height="150" src="http://vitorrubio.files.wordpress.com/2011/01/200px-img-00704d04.jpg?w=137" title="200px-Img-00704d04" width="137" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- Porque não pode ser o pendrive?&lt;br /&gt;&lt;br /&gt;- Porque pendrives são muito suscetíveis a virus.&lt;br /&gt;&lt;br /&gt;- E um disquete também não pode ter virus?&lt;br /&gt;&lt;br /&gt;-&lt;strong&gt;NÃO&lt;/strong&gt;. &amp;nbsp;(sério, ele disse que não)&lt;br /&gt;&lt;br /&gt;De fato, para um virus contaminar um disquete, ele tem que ser menor que um disquete. &amp;nbsp;O que é raro para esses trojans modernos. A maioria tem mais de 1.5 MB.&lt;br /&gt;&lt;br /&gt;Outra dificuldade é um virus ENCONTRAR um disquete. Dificuldade esta que abracei. Saí da receita alucinado em busca de um disquete. Foi uma verdadeira QUEST de RPG, daquelas que você tem que falar com todos os habitantes do vilarejo para ver se descola alguma dica útil. Cada um falando uma coisa diferente e te mandando ir em um lugar diferente. O Ferreiro te manda para o Alfaiate, que te manda para o Açougueiro, que manda para o Artesão, o Boticário, o Curandeiro, o Padre, a Bruxa .... fui em 3 papelarias e 2 lan houses. Não encontrei. Nas lan houses foi pior, porque fizeram chacota do problema: "você veio da receita né? mwuhauahuaahuau. Desista, mesmo se você tivesse um disquete você nunca, NUNCA vai encontrar um computador com drive de disquete por aqui." (de fato os computadores das duas lan houses, mesmo os servidores ou os caixas, não tinham o drive de disquete).&lt;br /&gt;&lt;br /&gt;Disquetes são dispositivos ancestrais, que vem de tempos imemoriais. Foram criados &lt;del&gt;&lt;/del&gt;&lt;br /&gt;pouco tempo depois da roda&lt;br /&gt;no alvorecer de nossa civilização, na era de ouro.&amp;nbsp;Mas na inquisição quase todos foram destruídos, já que poderiam ser usados para transportar o alcorão. Dos 5 que restaram, apenas dois vieram para o Brasil nas caravelas, em 1500. &amp;nbsp;Dizem que o portador de um destes pode desvendar todos os segredos do universo. E que todos os segredos do universo têm apenas 1.44 kb e todas as outras ciências são mero &amp;nbsp;enchimento de linguiça.&lt;br /&gt;&lt;br /&gt;Então é isso. Depois de meio dia de trabalho perdido fui comer um black dog e jogar umas partidas de fliper na &lt;a href="http://www.sampaonline.com.br/mostraMapaEstabelecimento.php?idEstabelecimento=69428672" target="_blank"&gt;Lords&lt;/a&gt;. Quem sabe um dia eu encontro um disquete em algum sítio arqueológico e faço a transmissão da minha declaração.... até lá acho que vou ficar sem minha restituição do IR ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3457852670348862635?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3457852670348862635/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/o-santo-graal-da-memoria-nao-volatil.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3457852670348862635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3457852670348862635'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/o-santo-graal-da-memoria-nao-volatil.html' title='O santo graal da memória não volátil'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2950765126032613799</id><published>2011-01-20T07:50:00.000-08:00</published><updated>2011-01-20T07:50:31.114-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Experts'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Revista Clube Delphi 125</title><content type='html'>A revista Clube Delphi 125 já está disponível aos assinantes e no site.&lt;br /&gt;Essa revista tem uma introdução muito interessante ao desenvolvimento de aplicações para iPhone utilizando MonoDevelop, MonoTouch e a SDK do iPhone. Desenvolver aplicações para iPhone não é fácil se comparado ao desenvolvimento Win32/Windows Forms com técnicas RAD, mas a matéria explica quais são as diferenças e introduz bem o tema.&lt;br /&gt;&lt;a href="http://video.devmedia.com.br/video/imagens/websysimg/CD/125/capaOnline_cd125.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://video.devmedia.com.br/video/imagens/websysimg/CD/125/capaOnline_cd125.jpg" width="273" /&gt;&lt;/a&gt;Há também um artigo sobre o Firebird 2.5. Eu já usava o 2.1 mas nem imaginava que ele tinha alguns recursos avançados, desses que você pode encontrar no MS SQL.&lt;br /&gt;O artigo de capa fala sobre o Codesite. Se quer aprender a rastrear e corrigir bugs leia-o. &lt;br /&gt;E há um artigo meu sobre criação de experts (plugins) para a IDE do Delphi. É um mundo totalmente novo para quem nunca viu. Há a possibilidade de interagir com units, formulários e componentes em tempo de design e automatizar tarefas, ou apresentar formulários que, se preenchidos, criam arquivos de configuração, units etc.&lt;br /&gt;&lt;br /&gt;Vale a pena para quem quiser entrar nesse mundo de Experts e desenvolver ferramentas para programadores. Se seus usuários forer programadores também, 100% de chance de diminuir todos os seus problemas com a "destreza" alheia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2950765126032613799?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2950765126032613799/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/revista-clube-delphi-125.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2950765126032613799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2950765126032613799'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/revista-clube-delphi-125.html' title='Revista Clube Delphi 125'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-3393314176663105479</id><published>2011-01-20T06:24:00.000-08:00</published><updated>2011-01-20T06:24:13.890-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><title type='text'>O glorioso retorno do bom senso</title><content type='html'>Bom, desde minha volda das férias esse é o meu primeiro post técnico, ou quase.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://pt.wikipedia.org/wiki/Bom_senso"&gt;Bom senso&lt;/a&gt;&amp;nbsp;está relacionado à razoabilidade. E vale para tudo, de saúde à tecnologia.&lt;br /&gt;&lt;br /&gt;Ando vendo por aí muitas pessoas preocupadas demais com o monte de buzzwords do mercado, são as metodologias e certificações de qualidade (ITIL, PMBOK, RUP, Open UP, XP, Scrum, laranja, abacaxi, batatinha) outras relacionadas a linguagens de programação (Java, Python, C#, Ruby) e cada linguagem de programação se desdobrando em infinitos frameworks para os mais diversos assuntos (Hibernate, Fluent, Linq, velocity, rails, django, &lt;a href="http://www.makumba.org/"&gt;makumba&lt;/a&gt;, spring).&lt;br /&gt;&lt;br /&gt;Para complicar há ainda diversos sistemas operacionais, de windows a bada. E por falar em bada, diversos tipos de mobile (android, symbian, windows 7, bada, iOS, McDonalds, China in Box ).&lt;br /&gt;&lt;br /&gt;E as ferramentas para documentação de código ou criação de diagramas? ArgoUML, Poseidon, Model Maker...&lt;br /&gt;&lt;br /&gt;Nós, que lidamos com tecnologia, somos curiosos por natureza. Mas a curiosidade pode ser uma faca de dois gumes. Ela pode te levar a destruir sua produtividade.&lt;br /&gt;&lt;br /&gt;Você que aprender todas as linguagens, metodologias e frameworks? Quer pelo menos conhecer?&lt;br /&gt;&lt;br /&gt;Chamemos essa sopa de letrinhas de siglas e neologismos que nascem aos montes todo dia simplesmente de buzz-tools.&amp;nbsp;Algumas realidades &amp;nbsp;sobre eles que podem ser dolorosas:&lt;br /&gt;&lt;br /&gt;1) Você não vai ficar rico se souber todas as buzz-tools.&lt;br /&gt;2) Você não vai ganhar mais dinheiro que seu colega por sua buzz-tool ser melhor ou mais nova.&lt;br /&gt;3) Aprender todas as buzz-tools é como aprender todas as linguagens naturais. Não importa se você tenha pós doutorado na área de Ciência da computação ou áreas correlatas, a verdade é que nem todo pós doutor em letras, por exemplo, fala mais de 10 idiomas. Alguns sabem fluentemente 3 e olhe lá. Todos os idiomas da Terra então, impossível.&lt;br /&gt;Médicos pós doutores também não podem lhe dar vida eterna, nem novos olhos ou novas pernas.&lt;br /&gt;4) Se tentar estudar todas as buzz-tools não se aprofundará em nenhuma delas, não fará nada produtivo e será um especialista em "Hello World", pois será só isso que irá fazer.&lt;br /&gt;5) Convenhamos, se a cada dia aparece uma nova buzz-tool, chegará um momento em que existirá no mundo todo apenas meia dúzia de projetos feito em cada ferramenta, já que o número de ferramentas é tão grande.&lt;br /&gt;&lt;br /&gt;O ponto onde quero chegar é que nem todas as buzz-tools precisam ser estudadas. Não que elas não sejam boas (algumas realmente não o são) ou que não mereçam ser estudadas. Mas é que você não vai aplicar todos os seus conhecimentos em todos os projetos. E perceberá que os seus melhores projetos serão os que você usou SEUS conhecimentos, SUAS idéias e SUA criatividade, sem usar padrões, metodologias e buzz-tools. (ou independentemente da que use).&lt;br /&gt;&lt;br /&gt;Nenhuma revista, tutorial, fórum ou livro de buzz-tools pode te ensinar a ter criatividade e imaginação. Talvez um litro de cachaça te ensine mais sobre imaginação do que uma enciclopédia de assembly e todos os livros do Dijkstra e Tanembaum juntos.&lt;br /&gt;&lt;br /&gt;Pense nisso. Buzz-tools são soluções, ferramentas. Você nunca criará uma solução ou ferramenta se o seu foco for em outras soluções ou ferramentas. Você deve ter o foco no problema. Para criar um bom programa você deve TER um PROBLEMA, FOCAR &amp;nbsp;no PROBLEMA e desenvolver a SUA SOLUÇÃO. Não outro &amp;nbsp;problema. Os únicos softwares que fogem a essa regra são os softwares para fins lúdicos como os games. Esses são mais complicados porque você não deve criar uma solução, mas sim criar um problema (de preferência solucionável com uma certa dificuldade).&lt;br /&gt;&lt;br /&gt;Para desenvolver algo realmente complexo, útil e bem feito deve-se desprender totalmente das buzz-tools, abraçar o abstrato e seguir em frente, mesmo que seja em VB6 .... pronto, falei.&lt;br /&gt;&lt;br /&gt;NÃO EXISTE MELHOR FERRAMENTA QUE O BOM SENSO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-3393314176663105479?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/3393314176663105479/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/o-glorioso-retorno-do-bom-senso.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3393314176663105479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/3393314176663105479'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/o-glorioso-retorno-do-bom-senso.html' title='O glorioso retorno do bom senso'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-142791702926820838</id><published>2011-01-20T05:18:00.000-08:00</published><updated>2011-02-01T09:44:42.312-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflexões'/><category scheme='http://www.blogger.com/atom/ns#' term='Programação'/><title type='text'>A alma do programador</title><content type='html'>Certa vez, no curso de pós graduação da FATEC-SP, um professor que eu admiro muito, ao ser interrogado sobre quando teria uma janela para reposição de uma aula, sacou seu smartphone para conferir sua agenda e disse:&lt;br/&gt;&lt;br/&gt;" - Deixe-me primeiro consultar minha prótese cognitiva."&lt;br/&gt;&lt;br/&gt;Interessante, ele considerava o seu celular como uma prótese cognitiva. Não sabia em que lugar ir ou quando ir se não fosse por ele, o celular.&lt;br/&gt;&lt;br/&gt;Isso não é de todo ruim se você levar em consideração a filosofia geral que permeava a classe dos &lt;a title="Samirais" href="http://pt.wikipedia.org/wiki/Samurai" target="_blank"&gt;Samurais&lt;/a&gt; (Saburau ou Bushi) no Japão Feudal dos anos 1200 aproximadamente até 18xx (aproximadamente). Eles tinham um extenso e complexo código de ética/conduta verbal. Era o Bushido, ou caminho do Servidor.&lt;br/&gt;&lt;br/&gt;Os Samurais eram, em sua maioria, militares de alta patente, guarda costas, juízes e executores. A maioria deles era muito bem versado nas artes marciais, mas também na poesia e na caligrafia. Todos eram guerreiros no sentido mais amplo da palavra, mas nem todos estavam envolvidos em guerras. Todos os guerreiros, soldados, generais do exército eram Samurais, mas nem todo Samurai era guerreiro. Como a palavra Samurai quer dizer "Servidor", a maioria era servidor público. (Não compare com os servidores públicos de hoje no Brasil).&lt;br/&gt;&lt;br/&gt;Os Samurais consideravam sua ferramenta de trabalho (seja a espada para o guerreiro ou a pena para os burocratas) como uma extensão do próprio corpo, ou até mais do que isso, como sua alma. Um guerreiro que perdesse ou danificasse sua espada em uma luta poderia se considerar como se estivesse com um membro amputado, ou pior: um corpo sem vida, sem alma, uma casca vazia.&lt;br/&gt;&lt;br/&gt;Ao dizer que meu celular, computador etc são minhas próteses cognitivas, estou afirmando que fazem parte do meu corpo, que são extensão dele. Se você considerar suas ferramentas de trabalho e sua capacidade de usá-las como parte do seu corpo, sua própria alma, você já deu o primeiro passo para se tornar exímio naquilo que faz.&lt;br/&gt;&lt;br/&gt;Sim, meu computador é minha alma. Não o computador físico em sentido literal, esse que estou usando para digitar esse texto, mas sim qualquer computador que eu venha a usar, a minha capacidade de lidar com tecnologia, digamos assim.&lt;br/&gt;&lt;br/&gt;A idéia é mais abstrata. Um Samurai, aristocrata, ordenava um ferreiro famoso confeccionar uma katana (espada longa) e muitos rituais e formalidades eram envolvidos no processo. A "espada" tinha "alma própria, vida".&lt;br/&gt;&lt;br/&gt;Se você der alma, SUA ALMA, à sua ferramenta de trabalho, encontrará um caminho prazeiroso e recompensador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-142791702926820838?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/142791702926820838/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/alma-do-programador.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/142791702926820838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/142791702926820838'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/alma-do-programador.html' title='A alma do programador'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-2599252489541616684</id><published>2011-01-10T15:51:00.000-08:00</published><updated>2011-01-10T15:51:09.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Telefonica'/><category scheme='http://www.blogger.com/atom/ns#' term='Atendimento'/><category scheme='http://www.blogger.com/atom/ns#' term='Speedy'/><title type='text'>De volta das férias, e desperdiçando energia</title><content type='html'>Boa noite a todos. Depois de umas merecidas férias em Natal (uma vez a cada 5 anos precisa mesmo) estou de volta&amp;nbsp;(fotos em breve)&amp;nbsp;e&amp;nbsp;&amp;nbsp;VIVO. Vivo mas com uma baita úlcera. A causa primária de minha úlcera por incrível que pareça não é a comida forte porém deliciosamente bem temperada de Natal.&lt;br /&gt;&lt;br /&gt;A causa-mor de minhas dores é a famigerada Telefonica e aquilo que eles chamam de conexão. Cheguei de viajem dia 23/01/2011 e hoje já é dia 10/01/2011 e eu estou quase sem conexão à internet. Digo quase porque as vezes a conexão vem, mas fica funcionando apenas por alguns minutos e aí eu tenho que fazer todo o circo de liga desliga parafernalha para ver se volta.&lt;br /&gt;&lt;br /&gt;Por causa disso criei um blog para fazer um protesto contra esse abuso.&amp;nbsp;&lt;a href="http://manifestoderepudioatelefonica.blogspot.com/"&gt;http://manifestoderepudioatelefonica.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;São três anos lutando e desperdiçando dinheiro, por uma conexão de 300 k, um pouco melhor que a discada, e que quando funciona fica apenas alguns minutos no ar.&lt;br /&gt;&lt;br /&gt;Sabe, não gosto de aparecer, e nesses 12 anos de Internet nunca me passei por troll ou hatter. Quem me conhece sabe disso. Mas a Telefonica está merecendo absolutamente tudo o que eu conseguir criar de ruim para eles. Por isso, canalizarei todas as minhas energias negativas para que cada mísero funcionário que me atendeu porcamente sofra terríveis dores e gemidos de agonia. Que morram todos com um tumor maligno bem lá no *&lt;br /&gt;&lt;br /&gt;Em breve farei mais posts técnicos, como a prometida continuação do assunto sobre Singleton e alguns posts rápidos de Lazarus e MonoDevelop. De quebra mostrarei alguns programinhas de segurança legais.&lt;br /&gt;&lt;br /&gt;Have fun ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-2599252489541616684?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/2599252489541616684/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/de-volta-das-ferias-e-desperdicando.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2599252489541616684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/2599252489541616684'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/de-volta-das-ferias-e-desperdicando.html' title='De volta das férias, e desperdiçando energia'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-7600073443670754994</id><published>2011-01-05T03:42:00.000-08:00</published><updated>2011-02-01T09:44:42.288-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Não categorizado'/><title type='text'>Vamos lÃ¡....O correio entrega hoje?</title><content type='html'>&lt;p class="formspringmeAnswer"&gt;Tomara, Deus te ouça,  e oxalá não façam isso: &lt;a href="http://colunistas.ig.com.br/obutecodanet/2011/01/03/por-que-as-vezes-sua-encomenda-chega-com-algum-probleminha" target="_blank" rel="nofollow" class="nofollow"&gt;http://colunistas.ig.com.br/obutecodanet/2011/01/03/por-que-as-vezes-sua-encomenda-chega-com-algum-probleminha&lt;/a&gt;/&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class="formspringmeFooter"&gt;&lt;br/&gt;    &lt;a href="http://formspring.me/vitorrubio?utm_medium=social&amp;amp;utm_source=wordpress&amp;amp;utm_campaign=shareanswer"&gt;Ask me anything&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-7600073443670754994?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/7600073443670754994/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/vamos-lao-correio-entrega-hoje_05.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7600073443670754994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/7600073443670754994'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/vamos-lao-correio-entrega-hoje_05.html' title='Vamos lÃ¡....O correio entrega hoje?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-122736080483073436</id><published>2011-01-05T03:15:00.001-08:00</published><updated>2011-02-01T09:44:42.269-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Não categorizado'/><title type='text'>formspring.me</title><content type='html'>Ask me anything &lt;a href="http://formspring.me/vitorrubio" target="_blank"&gt;http://formspring.me/vitorrubio&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-122736080483073436?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/122736080483073436/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/formspringme_05.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/122736080483073436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/122736080483073436'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/formspringme_05.html' title='formspring.me'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-4507518199394711173</id><published>2011-01-05T03:15:00.000-08:00</published><updated>2011-02-01T09:44:42.246-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Não categorizado'/><title type='text'>hey how did you survive the holiday season. you got a new years
resolution?</title><content type='html'>&lt;p class="formspringmeAnswer"&gt;I just survived. I got a new years resolution: dont't tell my resolutions in formspring :p&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;p class="formspringmeFooter"&gt;&lt;br/&gt;    &lt;a href="http://formspring.me/vitorrubio?utm_medium=social&amp;amp;utm_source=wordpress&amp;amp;utm_campaign=shareanswer"&gt;Ask me anything&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-4507518199394711173?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/4507518199394711173/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/hey-how-did-you-survive-holiday-season_05.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4507518199394711173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/4507518199394711173'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2011/01/hey-how-did-you-survive-holiday-season_05.html' title='hey how did you survive the holiday season. you got a new years&#xA;resolution?'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-5820278396366749576</id><published>2010-12-27T11:44:00.000-08:00</published><updated>2011-02-01T09:44:42.217-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Não categorizado'/><title type='text'>Meus vídeos favoritos do youtube até agora</title><content type='html'>Fazendo uma pequena limpeza nos meus favoritos do youtube encontrei esses videos. Tem sátiras, paródias, filmes amadores e games amadores. Assuntos de games prevalecem. Have Fun.&lt;br/&gt;&lt;br/&gt;O ultimo vídeo é uma tentativa de jogar um hack do Super Mario World, o Kaizo Mario, muito difícil. É engraçado ver o cara tentando e se ferrando toda hora.&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=9h1swNWgP8Q"&gt;http://www.youtube.com/watch?v=9h1swNWgP8Q&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=WYII2Oau_VY"&gt;http://www.youtube.com/watch?v=WYII2Oau_VY&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=3xCY2K9kQz4"&gt;http://www.youtube.com/watch?v=3xCY2K9kQz4&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=hpvlTVgeivU"&gt;http://www.youtube.com/watch?v=hpvlTVgeivU&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=CtztrcGkCBw"&gt;http://www.youtube.com/watch?v=CtztrcGkCBw&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=CfWuTu30aJQ"&gt;http://www.youtube.com/watch?v=CfWuTu30aJQ&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=JM0MXvE2lnU"&gt;http://www.youtube.com/watch?v=JM0MXvE2lnU&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=h2ZXSzaUIBQ"&gt;http://www.youtube.com/watch?v=h2ZXSzaUIBQ&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=wvWN7kTBzRw"&gt;http://www.youtube.com/watch?v=wvWN7kTBzRw&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=n4RjJKxsamQ"&gt;http://www.youtube.com/watch?v=n4RjJKxsamQ&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=f5uzgPqwTr4"&gt;http://www.youtube.com/watch?v=f5uzgPqwTr4&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=pUdXhhDDnaY"&gt;http://www.youtube.com/watch?v=pUdXhhDDnaY&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=oIzAqcsT1Sc"&gt;http://www.youtube.com/watch?v=oIzAqcsT1Sc&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=SGD6r4ebmEY"&gt;http://www.youtube.com/watch?v=SGD6r4ebmEY&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=Wx1uhGNGgas"&gt;http://www.youtube.com/watch?v=Wx1uhGNGgas&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=2lXh2n0aPyw"&gt;http://www.youtube.com/watch?v=2lXh2n0aPyw&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=JVHGy9XEF9I"&gt;http://www.youtube.com/watch?v=JVHGy9XEF9I&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=F5jeQPr4424"&gt;http://www.youtube.com/watch?v=F5jeQPr4424&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=8KyGHmRSS9c"&gt;http://www.youtube.com/watch?v=8KyGHmRSS9c&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=iG0OZmkJxvI"&gt;http://www.youtube.com/watch?v=iG0OZmkJxvI&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=d8eqVjyrdDg"&gt;http://www.youtube.com/watch?v=d8eqVjyrdDg&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=3hFs2cKJ2jg"&gt;http://www.youtube.com/watch?v=3hFs2cKJ2jg&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=nwUtSgTkjSg"&gt;http://www.youtube.com/watch?v=nwUtSgTkjSg&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.youtube.com/watch?v=Ua6pbz3ROvQ"&gt;http://www.youtube.com/watch?v=Ua6pbz3ROvQ&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Have Fun ;)&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-5820278396366749576?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/5820278396366749576/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2010/12/meus-videos-favoritos-do-youtube-ate.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5820278396366749576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/5820278396366749576'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2010/12/meus-videos-favoritos-do-youtube-ate.html' title='Meus vídeos favoritos do youtube até agora'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-9024462325192940242</id><published>2010-12-09T11:40:00.000-08:00</published><updated>2010-12-09T11:40:08.283-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Clube Delphi 124</title><content type='html'>Já está no site da DevMedia a revista Clube Delphi n° 124.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.video.devmedia.com.br/video/imagens/websysimg/CD/124/capaOnline_CD124.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://www.video.devmedia.com.br/video/imagens/websysimg/CD/124/capaOnline_CD124.jpg" width="341" /&gt;&lt;/a&gt;&lt;/div&gt;Com um artigo de capa muito interessante e há muito que queríamos ler: controle de versão já integrado no Delphi XE.&lt;br /&gt;&lt;br /&gt;Nesta edição você poderá ver também meu artigo sobre &lt;a href="http://www.devmedia.com.br/post-18612-Compressao-de-arquivos.html"&gt;compressão de arquivos&lt;/a&gt; e a&lt;a href="http://www.devmedia.com.br/post-18617-Design-Patterns-Parte-3.html"&gt; terceira parte do artigo sobre design patterns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Neste artigo você verá como criar um programa OO multibanco e multicomponente de acesso usando factory method e abstract factoey.&lt;br /&gt;&lt;br /&gt;Também é mostrada nessa série de artigos uma maneira mais simples de se criar um singleton do que a que já foi mostrada nesse blog.&lt;br /&gt;&lt;br /&gt;Espero que gostem, divirtam-se.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-9024462325192940242?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/9024462325192940242/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2010/12/clube-delphi-124.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9024462325192940242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/posts/default/9024462325192940242'/><link rel='alternate' type='text/html' href='http://blog.vitorrubio.com.br/2010/12/clube-delphi-124.html' title='Clube Delphi 124'/><author><name>Vitor Luiz Rubio</name><uri>http://www.blogger.com/profile/09819146101627563485</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-yH4O4rfXZfY/TiBMQ7Qw2QI/AAAAAAAAAZQ/l429StPP9Z0/s220/vitor-quadrado-738x738-150dpi.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-120161195353369613.post-6885487302102767407</id><published>2010-12-02T09:18:00.000-08:00</published><updated>2010-12-02T09:18:28.606-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='delphi'/><title type='text'>Clube Delphi 123</title><content type='html'>Tanta correria esse mês, com a pós graduação, artigos e projetos que nem deu tempo de postar nada sobre a revista Clube Delphi 123.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.video.devmedia.com.br/video/imagens/websysimg/CD/123/capaOnline_CD123.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://www.video.devmedia.com.br/video/imagens/websysimg/CD/123/capaOnline_CD123.jpg" width="341" /&gt;&lt;/a&gt;&lt;/div&gt;A revista está excelente, pra variar, com ótimos artigos.&lt;br /&gt;&lt;br /&gt;Começando por um artigo sobre injeção de dependência do Paulo Quicoli, e mais um artigo sobre Lazarus e Free Pascal de Daniel Simões Almeida, esses dois apenas para citar.&lt;br /&gt;&lt;br /&gt;Nesta edição há a &lt;a href="http://www.devmedia.com.br/websys.4/webreader.asp?cat=3&amp;amp;revista=clubedelphi_123#a-2969"&gt;segunda parte do meu artigo sobre design patterns&lt;/a&gt; onde falamos mais um pouco sobre factory methods. Espero que seja útil a todos.&lt;br /&gt;&lt;br /&gt;Uma técnica que ficou de fora desse artigo, para elaborar factories é a técnica de registrar classes com registerclass e depois usar o tipo/metaclasse TPersistentClass para obter a classe pelo nome (string) e criá-la.&lt;br /&gt;&lt;br /&gt;Esse método você pode conferir no meu último post sobre metaprogramação no &lt;a href="http://vitorrubio.blogspot.com/2010/11/chamando-formularios-com-pascalscript.html"&gt;delphi&lt;/a&gt;&amp;nbsp;e no &lt;a href="http://vitorrubio.blogspot.com/2010/11/metaprogramacao-no-lazarus.html"&gt;lazarus&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Espero que seja útil a todos e happy coding ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/120161195353369613-6885487302102767407?l=blog.vitorrubio.com.br' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.vitorrubio.com.br/feeds/6885487302102767407/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://blog.vitorrubio.com.br/2010/12/clube-delphi-123.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/120161195353369613/pos
