jul 27

Acabou-se o que era doce… não passei para a segunda fase online do Google Code Jam 2008

Na sexta feira teria passado se tivesse usado variável long no lugar de int… deu overflow e o Visual Studio não sobe exceção de overflow automaticamente… então o teste longo não passou :(

No sábado consegui terminar o segundo exercício 2 minutos depois do fim do tempo, mas mesmo se tivesse entregado, não ficaria entre os 840 primeiros…

Fica para o ano que vem…

abr 18

Consulta Cotação BovespaSou computeiro nerd e quando terminei um curso de Web Services em C# .NET, no dia seguinte já comecei a fazer um webservice para consultar e retornar cotação Bovespa.

O webservice já está pronto e funcionando (de forma gratuita), podendo consultar as cotações de uma ou mais ações por vez. Ele retorna preço de abertura, preço médio, preço mínimo, 5 melhores ofertas de compra, 5 melhores ofertas de venda, descrição da ação, data do pregão, valor médio, valor atual, variação (em porcentagem) e volume.

Também fiz uma espécie de ticker/monitor de cotação Bovespa, para poder acompanhar a evolução das ações durante o dia, que é um cliente que acessa o webservice que criei, tudo isso de graça.

A última utilidade que dei para o webservice foi uma planilha de Excel para controle de ações compradas e vendidas, bem como acompanhar o preço das ações em carteira, atualizando o preço das ações em carteiras (ainda não vendidas) automaticamente. Essa eu ainda vou disponibilizar disponibilizei for free!

Update: o download da planilha pode ser feito aqui.

abr 05

Uma das vantagens de mudar de hospedagem é que saí de um servidor Windows com IIS e fui para um Linux com Apache, podendo utilizar o famoso mod_rewrite para definitivamente migrar meu blog do Blogger para o Wordpress.

Eu tinha mantido os arquivos .html e .php no site, colocando um redirecionador nos .php, mas o Google e todo mecanismo de procura continuava enxergando as três versões (do Blogger em PHP, do Blogger em HTML e do Wordpress). Chegava ao cúmulo de aparecerem comentários na versão do Blogger!

A migração foi bem simples:

  1. mudar o permalink de “/index.php/%year%/%monthnum%/%postname%/” para “/%category%/%postname%/”
  2. instalar o plugin Dean’s Permalinks Migration (existe um bug na versão 1.0 e eu instalei a versão 1.1-gx)
  3. colocar o antigo permalink no plugin acima
  4. acrescentar as linhas abaixo no início do arquivo .htaccess
RewriteRule ^([0-9]{4})/([0-9]){2}/(.+)\.(php|html)$ index.php/$1/$2/$3 [R=301,NC,L]
RewriteRule ^([0-9]{4})_([0-9]){2}_01_(holococos_)?archive\.(php|html)$ index.php/$1/$2/$3 [R=301,NC,L]

A primeira linha redireciona permanentemente links do tipo http://holococos.sjdr.com.br/2007/01/ano-novo.php ou http://holococos.sjdr.com.br/2007/01/ano-novo.html para http://holococos.sjdr.com.br/index.php/2007/01/ano-novo/ que, pelo fato de seguir o antigo permalink, será redirecionado permanente pelo plugin Dean’s Permalinks Migration para http://holococos.sjdr.com.br/nonsense/ano-novo/

A segunda linha redireciona as antigas páginas de arquivo do Blogger, utilizando a mesma lógica.

abr 05

Infelizmente não teve jeito. Onde eu hospedava meu blog, “pediram gentilmente” para eu sair… Disseram que nos Termos de Serviço tinha uma cláusula dizendo que não era possível consumir mais que 500mb de transferência por dia… e eu já estava perto dos 3gb por dia.

Conseqüência: o blog ficou 4 dias fora e eu corri pra arrumar uma nova hospedagem, migrar e reconfigurar tudo. Agora eu tenho 500gb de espaço em disco e 5tb (isso mesmo 5 terabytes) de transferência por mês, dão 166gb por dia, bem distante daquela frescura de 0,5gb por dia…

Nem sei se vou mais usar o Amazon S3, mas irei instalar o WP Super Cache, pra deixar a exibição das páginas mais leve.

mar 28

Ontem e hoje durante o dia não li meu e-mail pessoal e quando fui ler em casa vi uma notificação do meu servidor de hospedagem dizendo que esse mês eu já tinha utilizado 42Gb de banda, 2 gigas acima do meu limite…

Na hora entrei em contato com eles e solicitei mais 10 gigas (que vão me custar $8), mas mesmo assim o site ficou 2 horas fora, com a infame mensagem de Bandwidth Limit Exceeded

Solicitei a eles uma alteração no IIS para retornar as páginas compactadas, mas não sei se serei atendido. Vou colocar cache no meu webservice de consulta cotação Bovespa, tentar otimizar o HTML do blog e deixar todas as imagens hospedadas no Amazon S3. O plugin Amazon S3 plugin for WordPress promete fazer todo o gerenciamento dessa hospedagem e vou instalá-lo.

Liguei o AWStats do domínio para ver o que consome mais banda e o que tem mais acesso, para tomar mais ações. Sei que é possível compactar os arquivos css (Cascading Style Sheet) e js (JavaScript) e provavelmente farei isso.

Se alguém souber de mais algo que posso fazer, por favor, deixe um comentário.

jan 23

Just because you’ve got the best hammer in the entire world doesn’t make everything a nail. If you’ve got a screw, even a cheap, old, rusty screwdriver is going to do a better job. And MapReduce is a lot better than a cheap, old, rusty screwdriver. - Mark C. Chu-Carroll

jan 23

Saiu hoje o rascunho do HTML 5 no W3C e o que mais me surpreendeu foi ver que um editor é do Google (trabalhou no Mozilla, no Opera e agora está no Google) e o outro é da Apple (ele trabalhou na Netscape, no Mozilla, agora trabalha com o Safari, ajudou na criação do Firefox e escreveu a especificação do XUL).

A Microsoft rodou!

dez 07

Tech-Ed 2007

Hoje eu fui no Tech-Ed, evento da Microsoft onde são apresentadas palestras com novidades e dicas do mundo Microsoft.Uma palestra que me fez soltar aquele “oooohhhh!!” frente a uma inovação tecnológica foi a do WPF (Windows Presentation Foundation).

Em 1979 (eu ainda nem era nascido), Trygve Reenskaug propôs o conceito de MVC (model-view-controller) para o projeto do Smalltalk (influenciador do Java), nos já míticos laboratórios da Xerox, em Palo Alto (lá foram inventados a Ethernet, a impressora à laser, o mouse e a interface gráfica - hoje conhecida popularmente como Windows, apenas para citar alguns). O conceito é bem simples: separar a apresentação (view) da camada de negócio/dados (model), utilizando para isso uma “ponte” (controller).

Ainda hoje é um parto fazer um site web cuja apresentação está desacoplada do conteúdo, sendo que é 100% viável implementar dessa forma utilizando CSS com HTML ou CSS com XML e XSLT ou DHTML… imagina isso então em uma aplicação desktop!

O WPF coloca o MVC em prática (sem citar essa sigla, como é natural em produtos MS), incluindo inúmeras facilidades (que só funcionam no Windows, como é natural em produtos MS), mas o grande pulo está na possibilidade do mesmo código rodar tanto no desktop quanto na web.

O processo é bem simples:

  1. através do Microsoft Expression Blend (uma mistura de Corel Draw, Adobe Ilustrator, Macromedia Flash e Microsoft Visual Studio .NET) um designer desenha ricamente a interface gráfica (que gera um arquivo XAML) - view
  2. no Visual Studio o desenvolvedor cria toda a lógica de negócio, manipulação de dados, tratamento de eventos, etc. (que gera um arquivo .cs, no caso do C#) - model
  3. o Framework .Net (utilizando o WPF) se encarrega juntar o XAML com o código - controller

Dessa forma, a mesma aplicação pode ser acessada tanto pelo browser, na Internet, como localmente no computador, pelo Windows, de acordo com a forma como foi compilado. Para alterar o layout, basta alterar o arquivo XAML (manualmente ou de forma transparente pelo Expression Blend) e pronto!

Pela mais pura coincidência, hoje li sobre o Google Analytics AIR, que é o já famoso Google Analytics, no desktop. Para isso, ele usa o Adobe AIR, que segundo o site:

Adobe® AIR™ is a cross-operating system runtime that allows web application developers to use their existing web development skills (HTML, Javascript, Adobe Flash®, Adobe Flex™, Ajax) to build and deploy rich Internet applications to the desktop.

Muito parecido com a definição do WPF no site:

Windows Presentation Foundation (WPF) provides developers with a unified programming model for building rich Windows smart client user experiences that incorporate UI, media, and documents.

Resumindo, Windows Presentation Foundation e Adobe AIR são quase o mesmo produto, desenvolvidos por empresas diferentes.

A Microsoft criou o Silverlight para competir com o Flash (agora Adobe Flash) e pelo visto a briga não parou por alí…

out 17

Minha placa de vídeo é uma NVidia GeForce 2 MX 400, lançada em 2001 (64mb de memória, AGP 4x, 200MHz de core, 350MHz de memória, 2,7Gb/s de banda, 32bits e DirectX 7), ou seja, uma porcaria!

Hoje eu vi preço das GeForce 6200 (256mb de memória, AGP 8x, 300MHz de core, 550MHz de memória, 8,8Gb/s de banda, 128bits e DirectX 9.0c) e GeForce 6600 GT (256mb de memória, AGP 8x, 500MHz de core, 900MHz de memória, 14,4Gb/s de banda, 128bits e DirectX 9.0c) e me animei a juntar dinheiro para fazer um upgrade mais que merecido.

Acabei achando em um site uma informação muito interessante sobre as configurações da BIOS recomendadas para placas de vídeo da NVIDIA:

  • Assign IRQ to VGA: Enable
  • PnP O/S Installed: Enable
  • VGA Pallet Snooping: Disable
  • PCI Bursting: Disable
  • PCI Latency Timer: 128
  • Peer Concurrency: Disable
  • Video BIOS Shadowing: Disable
  • Video RAM Cacheable: Disable
  • USWC: Disable/UC
  • Pipeline Cache Write: Disable
  • PCI 2.1 Compliance: Enable (necessário apenas quando usando placa de vídeo PCI)
  • Passive Release: Enable
  • Delayed Transaction:Enable
  • VGA Boot Sequence:AGP (quando usando placa de vídeo AGP)
  • Graphics Aperture Size: 128MB (quando usando placa de vídeo AGP)
  • AGP Turbo Read Mode: Disable
  • AGP Turbo Write Mode: Disable
out 17

Certa vez vi no YouTube um vídeo satirizando a Microsoft, mostrando como seria a caixa (minimalista) do iPod se ela fosse feita pela Microsoft e não pela Apple.

Realmente a Microsoft gosta de complicar as coisas… tanto que quando começam a instalar as atualizações baixadas pelo Windows Update ou Automatic Update do Windows tem um passo só de “Inicializando a instalação”…

Windows Automatic Update

A não ser que “iniciar a instalação” seja algo extremamente complexo, pra quê colocar essa informação lá?

set 11

O Google Analytics é uma excelente ferramenta de acompanhamento de site. Com ele é possível fazer várias análises simples, como tráfego, palavras chaves, páginas acessadas, visitas, dados dos visitantes (resolução da tela, sistema operacional, browser, nacionalidade, etc.), duração da visita e muito mais. Outras características interessantes são as metas, os filtros e a possibilidade de fazer análises cruzadas (ex.: visitantes brasileiros que usam o IE e acessaram a página do Lost, vindos do Google nos últimos 5 dias).

O que eu mais analiso, depois das metas de cliques nos banners do Submarino, são as palavras chaves procuradas em mecanismos de pesquisa que levaram ao meu blog e os sites de referência (sites que linkam para mim), para poder entender meus visitantes.

Quando fiz o post sobre regularização de CPF no dia 13 de Agosto, vi que o número de visitas vindos de buscadores brasileiros (UOL, Terra, IG, etc.) aumentou consideravelmente, mas o Google Analytics considerava eles como site de referência e não como site de busca, não incluindo as palavras chaves no relatório e distorcendo a lista de sites de referência. É a alta no gráfico de visitas por site de referência abaixo.

Visitas nos últimos 30 dias que vieram de sites de referência

Para resolver o problema, no dia 24 de Agosto incluí no script do Google Analytics os mecanismos de busca que não estavam sendo contabilizados como mecanismo de pesquisa, adicionando o código abaixo no script do Urchin, resolvendo meu problema.

_uOsr[24]=“buscador.terra.com.br”; _uOkw[24]=“query”;
_uOsr[25]=“busca.uol.com.br”; _uOkw[25]=“q”;
_uOsr[26]=“images.google.com.br”; _uOkw[26]=“q”;
_uOsr[27]=“busca.igbusca.com.br”; _uOkw[27]=“q”;
_uOsr[28]=“google.com.br”; _uOkw[28]=“q”;
_uOsr[29]=“search.mywebsearch.com”; _uOkw[29]=“searchfor”;
_uOsr[30]=“katatudo.com.br”; _uOkw[30]=“q”;
_uOsr[31]=“zoom.globo.com”; _uOkw[31]=“q”;

Update: o código acima está correto conforme a explicação oficial do Google, mas não está correto. Quando eu fiz existiam 25 posições utilizadas pelo Google Analytics, mas agora já são 33. O código correto é:

_uOsr.push(“buscador.terra.com.br”); _uOkw.push(“query”);
_uOsr.push(“busca.uol.com.br”); _uOkw.push(“q”);
_uOsr.push(“images.google.com.br”); _uOkw.push(“q”);
_uOsr.push(“busca.igbusca.com.br”); _uOkw.push(“q”);
_uOsr.push(“google.com.br”); _uOkw.push(“q”);
_uOsr.push(“search.mywebsearch.com”); _uOkw.push(“searchfor”);
_uOsr.push(“katatudo.com.br”); _uOkw.push(“q”);
_uOsr.push(“zoom.globo.com”); _uOkw.push(“q”);
ago 30

Foi só fazer um post sobre o endereço do MSN e agora tenho visitas fazendo outras perguntas (abaixo). Portanto, vou dar o passo a passo:

  1. é necessário ter e-mail. Se você não tiver recomendo os gratuitos GMail do Google, Yahoo! Mail do Yahoo! ou o Windows Live Hotmail da Microsoft (tem como criar um @msn.com mas é em inglês)
  2. Se o e-mail não for do Hotmail, você precisa criar um Windows Live ID (antigo Microsoft Passport) com o seu e-mail
  3. Baixe o Windows Live Messenger (novo MSN) ou o MSN Messenger (MSN antigo) e instale o programa que você baixou (clique aqui para ler o passo-a-passo ilustrado)
  4. Pronto, agora é só informar seu e-mail e a senha (do e-mail do Hotmail ou do Windows Live ID, se seu e-mail não for do Hotmail)
  • abrir conta no msn
  • abrir msn
  • cadastrar msn
  • cadastro msn
  • conta msn
  • cria msn
  • criar conta gratuita msn
  • criar conta msn
  • criar msn
  • criar um msn hotmail
  • criar um novo msn
  • criar uma conta no msn hotmail
  • criar uma nova conta no msn
  • entrar no msn
  • faser msn
  • fazer um msn
  • fazer um novo msn
  • fazer uma conta no msn
  • instalar msn
  • msn gratis
  • nova conta no msn
  • novo msn
ago 29

Uma vez (em 2003) li numa notícia no Slashdot a seguinte pergunta:

And does it make sense to buy a book about a GPLed piece of software?

Gostei de duas respostas:

  • Of course not, god knows that reading a man page or a how-to is much easier than an illustrated bound guide. - SuperDuG
  • This makes about as much sense as asking if you should buy “Moby Dick” or a Bible since they’re in public domain.  - L. VeGas

Um cara perguntou se valia a pena pagar por um livro sobre um software gratuito. Um respondeu que não, que é muito mais fácil ler o help do programa ou how-tos (como fazer) que ler um guia ricamente ilustrado, enquanto o outro disse que é o mesmo pensamento em perguntar se vale a pena comprar o livro Moby Dick ou a Bíblia, que são de domínio público.

Hoje em dia eu diria: você pagaria para assistir o filme “Os Simpsons”, cujo seriado passa gratuitamente na TV?

ago 22

Quando se tem 5 servidores de produção rodando um mesmo site corportativo, tanto para Internet quanto para Intranet, é interessante medir o tempo de carregar cada página (page load time) desde sua requisição, para cada servidor, direto da estação do cliente na Intranet.

Na die.net tem um ótimo artigo onde ele compara tempos de carga de páginas Ajax com referência a vários objetos, em diferentes browsers e com diferentes configurações. Nele ele sugere um script que vai gravar no log do servidor (IIS ou Apache) o tempo de carga (no cliente) de cada página:

<html>
   <head>
      <title></title>
      <script lang=“JavaScript” type=“text/javascript”>
      <!–
      var began_loading = (new Date()).getTime();
     
      function done_loading() {
         (new Image()).src = ‘/timer.gif?u=’ + self.location + ‘&t=’ +
         (((new Date()).getTime() - began_loading) / 1000);
      }
      //–>

      </script>
      <!–
      Referencie abaixo deste bloco qualquer javascript ou stylesheets externos.
      –>

   </head>
   <body onload=“done_loading()”>
      <!–
      Coloque o conteúdo normal da página aqui.
      –>

   </body>
</html>

O log seria mais ou menos assim:

10.1.2.3 - - [22/Aug/2007:12:42:45 -0300] “GET /timer.gif?u=http://exemplo.com.br/pagina.html&t=0.971 HTTP/1.1″ 200 49 …

Ou seja, a página http://exemplo.com.br/pagina.html demorou 0.971 segundos para ser carregada.

No entanto, essa solução não leva em consideração o tempo gasto desde a requisição e processamento pelo servidor até que o browser do cliente receba a resposta para renderizar a página. Mesmo assim, utilizar essa solução em ambiente de produção é complicado por inúmeros motivos.

Achei então o IBM Page Detailer, que segundo o próprio site é uma “ferramenta gráfica que permite fornecedores de conteúdo web medirem rapidamente e confiavelmente a performance de páginas web no lado do cliente”.

Perfeito! Então é só baixar, instalar na máquina de um cliente, acessar os 5 servidores alternadamente e analisar o resultado! Infelizmente não tem como exportar/salvar o resultado da análise…

Update: também tem o Wireshark!
Update 2: o Internet Explorer Developer Toolbar mostra bastante coisa, mas não o tempo de carga…
Update 3: ainda da Microsoft, eles recomendam 3 ferramentas de debug de script. Com calma vou ver se alguma é tão boa quanto o Venkman.

jul 21

Configurar o e-mail aqui no Wordpress tá mais complicado que eu imaginava… o Comment Email Responder está funcionando mas o Post Notification não… mesmo eu tendo instalado o Swift SMTP!

O primeiro plugin tem uma opção para enviar utilizar um “Formato Alternativo”, pois “The standard format for sender is “Name <email>”, which works fine most of the time. It can cause some problems in Windows hosting, so if you get an error when emailing a comment untick this box to use an alternative format” e com essa opção marcada ele não envia e-mails… e meu host é Windows. Pimba, taí a solução, o servidor só aceita From: nome@email.com.br, não aceita From: “Meu Nome” <nome@email.com.br>.

Portanto existem três soluções:

  1. alterar o plugin Swift SMTP para verificar se o host é Windows e se for fazer um parser do header do e-mail para deixar apenas o e-mail (melhor solução, funciona para todos os plugins)
  2. alterar o plugin Post Notification para incluir uma opção de “Formato Alternativo”, como no plugin Comment Email Responder (melhor solução, corrige apenas o plugin Post Notification)
  3. alterar o código do plugin Post Notification para enviar apenas o e-mail (solução mais rápida, corrige apenas o plugin Post Notification)

Como tenho aula às 8:30, fiz a solução mais rápido. Basta ir em “Plugins” -> “Editor de Plugins” -> “Post Notification” e trocar a linha abaixo:

$header .= “From: \”$from_name\” <$from_email>$hdr_nl”;

por

$header .= “From: $from_email$hdr_nl”;