Wednesday, November 04, 2009
start

Depois de sincronizar o Google Calendar com o telefone, o próximo passo foi sincronizá-lo com o Outlook.
Minha empresa não tem Exchange nem outra ferramenta online de agenda, logo pensei em utilizar o gCalendar como ponto central de sincronismo entre meus devices.

Para sincronizar o gCalendar com o Outlook é necessário instalar o Google Calendar Sync. O único detalhe que tive que fazer para ele sincronizar pela primeira vez foi executar tanto o Sync quanto o Outlook como administrador.

Para isso cliquei no botão iniciar, digitei ‘cmd’ (sem as aspas) e dei CTRL+SHIFT+ENTER. Aí confirmei que queria executá-lo como Administrador.

Uma vez no cmd, mudei para o diretório do Office:

cd c:\program files\microsoft office\Office12

E executei o outlook:

c:\program files\microsoft office\Office12>outlook.exe

Feito isso, executei o Google Sync também como administrador:

cd c:\Program Files\Google\Google Calendar Sync
C:\Program Files\Google\Google Calendar Sync>GoogleCalendarSync.exe

Forcei uma sincronizada:

sync

E quanto terminou de sincronizar, fechei ambos e os reabri normalmente.

Desde então está tudo 100%!

posted on Wednesday, November 04, 2009 7:10:00 AM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Saturday, September 05, 2009
Alguém mais percebeu que o Snow Leopard vem com suporte a teclado US-International?! Finalmente!
posted on Saturday, September 05, 2009 7:53:06 AM (Pacific Daylight Time, UTC-07:00)  #    Comments [1]
 Wednesday, January 28, 2009

Antigamente eu usava a tecla F4 para repetir o último comando no Word (como o comando ‘.’ no editor VI). Só que no Office 2007 a tecla F4 não faz nada.

Para minha surpresa, semana passada descobri que quando executamos um comando no Word, por exemplo, o ícone referente ao comando Undo mudava de:

Sentido horario

para:

Sentido anti-horario

Voilá! CTRL+Y (Redo) também funciona como “Repeat last command”. Bastante útil para quando se está formatando um texto, por exemplo mudando a cor de partes dele.

Experimente e depois compartilhe a experiência nos comentários!

posted on Wednesday, January 28, 2009 2:04:38 AM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Tuesday, November 18, 2008

Bem legais as inovações em busca no shell do Windows 7!

Pra brincar, adicionei a busca do flickr no meu explorer:

flickrinexplorer

Com direito a drag and drop pro desktop, preview pane e informações adicionais em baixo!

Pra adicionar, cria-se um arquivo de qualquer nome, com a extensão “.osdx”, com o conteúdo:

<?xml version="1.0"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
  <ShortName>Flickr</ShortName>
  <Description>Flicr search provider by Leo</Description>
  <Url type="application/rss+xml" template="http://api.flickr.com/services/feeds/photos_public.gne?format=rss2&amp;tags={searchTerms}" />
</OpenSearchDescription >

Sem quebras de linha. Depois é só dar um clique duplo no arquivo que um outro arquivo é gerado no seu “%USERPROFILE%\Searches” com a extensão “.searchConnector-ms”. Se quiser apagar e criar de novo, não esqueça de apagar este arquivo primeiro (senão o windows vai criar flickr1, flickr2, etc).

posted on Tuesday, November 18, 2008 1:29:55 PM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Tuesday, September 16, 2008

Você já deve ter lido por aí que usar ASSERT e VERIFY nos seus programas garante um aumento da qualidade do software substancialmente.

ASSERT é uma macro que só faz algo de útil quando o código é compilado com um determinado #define (_DEBUG, NDEBUG, etc) e este possui um valor conhecido (ou simplesmente está (in)definido).

Um ponto 'perigoso' com relação ao ASSERT é que nas versões de release, o argumento recebido é completamente ignorado. Um exemplo de ASSERT (adaptado de afx.h):

#ifdef _DEBUG
#define ASSERT(x) ((void) (x) || !::AfxDebugBreak())
#else
#define ASSERT(x) ((void)0)
#endif

Na versão de debug, se avaliar a expressão 'x' resultar num valor considerado falso o programa será interrompido. Porém na versão de release, a expressão 'x' não é sequer avaliada!

Outro fato bastante importante é prestar atenção e usar somente uma expressão por cláusula de ASSERT, para facilitar no diagnóstico do erro. Se você tiver 3 condições num ASSERT e ele falhar, qual das três teve valor falso? Evite tiros no pé gratuitos!

Já a macro VERIFY possui a característica de não ignorar seus argumentos em tempo de execução:

#ifdef _DEBUG
#define VERIFY(x) ASSERT(x)
#else
#define VERIFY(x) ((void)(x))
#endif

Ela mantém seu código instrumentado e ao mesmo tempo permite construções mais consisas, como por exemplo, ao invés de checar duas vezes se o ponteiro é valido antes de usar:

ASSERT(p);
if (p) {
  printf("(%d, %d)\n", p->x, p->y);
}

usando VERIFY podemos fazer o teste na mesma linha do if:

if (VERIFY(p)) {
  printf("(%d, %d)\n", p->x, p->y);
}

A meu ver tornando o código mais legível e igualmente instrumentado!

Podemos inclusive inverter a lógica (pra quem prefere checar assertivas de entrada):

if (!VERIFY(p)) {
  goto error;
}

ASSERT e VERIFY são ferramentas indispensáveis para escrever código com menos bugs que a média :)

posted on Tuesday, September 16, 2008 5:15:52 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0]
 Saturday, June 21, 2008

Depois adiciono aí no canto:

My Amazon.com Wish List

posted on Saturday, June 21, 2008 11:00:53 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0]
 Wednesday, January 30, 2008

Achei interessante a edicao. Comeca de um jeito e termina de outro:

A cara de tacho da lourinha (que tem o cacoete mais chato que eu conheco) no final eh impagavel :)

[]s

posted on Wednesday, January 30, 2008 8:13:22 PM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Friday, November 23, 2007

Esta é uma mensagem de erro que ocorre quando um método puramente virtual é chamado em C++.
Um método puramente virtual equivale a um método abstract em C# ou Java:

C++
class Base {
public:
   
virtual void print() = 0; // '=0' informa que o metodo não é implementado aqui
};

Em ambos os casos a classe Base é abstrata, significando que não é possível instanciar um objeto usando esta classe:

C#/Java

Base b = new Base(); // *ERRO*

C++

Base b; // *ERRO*

A classe Base não é feita para ser instanciada, ela é feita para ser herdada:

C#/Java
public class Derived /*(C#) : */ /*(Java) extends */ Base {
    public /*(C#) override*/ void print() { };
}
C++
class Derived : public Base {
public:
   
virtual void print() {}
};

A classe Derived é chamada de "concreta", pois agora podemos criar uma instância deste tipo.
Você deve estar se perguntando: "Se uma classe que contém métodos puramente virtuais (=abstratos) não pode ser instanciada, como acontece o erro R6025?"
Este erro é uma armadilha da linguagem C++ que, por ser tão flexível, permite que você dê um tiro no próprio pé. Observe esta hierarquia:

C++
class Base {
public:
    Base() { init(); }
   
void init() { puro(); }
   
virtual void puro() = 0;
};

class Derived : public Base {
public:
   
virtual void puro() { }
};

Derived d;
int main() {}

Este fragmento de código gera o erro R6025.

Apesar de não aparecer explicitamente declarado, a classe Derived possui um construtor default gerado pelo compilador (construtor default é o construtor sem argumentos). Mas este não é o problema. O construtor de Derived causa a chamada do construtor de Base, que chama o método init, que chama o método puro (*ufa*). Mas o método puro está definido na classe Derived, correto? Certo, mas a classe Base desconhece a existência das classes derivadas! Logo, o tipo do ponteiro this durante a execução do construtor (e do destrutor) da classe Base eh Base:

C++
#include <iostream>
using namespace std;

class Base {
public:
    Base() { cout << "B constructor: " <<
typeid(*this).name() << endl; }
    ~Base() { cout << "B destructor: " <<
typeid(*this).name() << endl; }
};

class Derived: public B {
public:
    Derived () { cout << "D constructor: " <<
typeid(*this).name() << endl; }
    ~Derived () { cout << "D destructor: " <<
typeid(*this).name() << endl; }
};

Derived d;
int main() {}

Moral da história: nunca chame direta ou indiretamente métodos virtuais (sejam puramente virtuais ou não) de construtores e destrutores, pois você não tem como saber o comportamento deles até o tempo de execução. Encontrar este tipo de cenário pode ser difícil caso sejam feitas muitas chamadas no construtor da classe. Existem porém ferramentas de análise de código que detectam este problema automaticamente.

[]s

posted on Friday, November 23, 2007 2:41:35 AM (Pacific Standard Time, UTC-08:00)  #    Comments [5]
 Thursday, February 15, 2007
posted on Thursday, February 15, 2007 7:19:47 PM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Wednesday, January 10, 2007

Sei que tenho alguns amigos que checam meu blog diariamente. Resolvi então explicar o conceito de RSS para poupar tempo dessa galera.

RSS é uma forma de checar se os sites publicaram alguma novidade sem precisar ir em um por um. Economize tempo e evite deixar passar desapercebida alguma notícia de um site. O computador faz o trabalho sujo por você!

Como funciona

Toda vez que você vir o símbolo ou simplesmente vir as palavras RSS ou ATOM e se eles (tanto o símbolo quanto as palavras) forem links, não clique no link!!!! Isso aí :) Ao invés disso, copie o endereço para onde o link aponta. Para isso, clique com o botão direito e escolha Copy shortcut. Pronto, agora aonde devemos colar esse atalho?

RSS Readers / RSS Aggregators

Para ler os RSS existem os softwares leitores (também chamados de agregadores) de RSS. O uso deles é bastante simples, é como ler e-mail.

Existem leitores de RSS de todos os tipos: pagos, grátis, na Web, para celular, etc. Gosto de usar o Omea Reader por ser desenvolvido por uma empresa que produz softwares de boa qualidade e por ser bem barato (é grátis).

Depois de instalado ele apresenta alguns RSS' pra você não se sentir solitário. Para adicionar um RSS nele basta copiar o atalho (como dito acima) e adicionar o atalho à sua lista, clicando no botão .

Bom é isso... Depois que colecionar seus RSS' basta abrir o Omea Reader e dar F5 (ou clicar em ) e pronto! O Omea Reader vai visitar cada site rapidamente e avisá-lo se há novidades ou não neles.

Se não entendeu alguma parte, deixe um comentário!

Abraço!

posted on Wednesday, January 10, 2007 4:10:37 AM (Pacific Standard Time, UTC-08:00)  #    Comments [0]
 Monday, August 14, 2006

Testando o Windows Live Writer... Vamos ver se vai se tornar minha ferramenta padrão pra postar no blog.

Se os açêntõs ficarem perfeitos, já está adotada ;)

posted on Monday, August 14, 2006 10:04:19 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [1]
 Sunday, June 11, 2006
Tem coisas que viram senso comum e você aceita sem questionar.  Até o dia que você descobre uma explicação para aquela verdade universal e sua vida muda daquele dia em diante.

Desde o MSX, existem 16 cores básicas no modo texto dos computadores (sim, as 8 primeiras são as do título deste post).

A verdade universal a que me referia era o porquê dessas cores (e dessa ordem!).  Bom, essa semana li uma explicação para a ordem e os valores das cores do console! Minha vida mudou :)

Então para a acabar com o suspense, compartilho este mistério da natureza com vocês:
IRGBNomeRGB
0000Black00-00-00
0001 Dark Blue00-00-80
0010 Dark Green00-80-00
0011 Dark Cyan00-80-80
0100 Dark Red80-00-00
0101 Dark Magenta80-00-80
0110 Dark Yellow80-80-00
0111 Light GrayC0-C0-C0
1000 Dark Gray80-80-80
1001 Blue00-00-FF
1010 Green00-FF-00
1011 Cyan00-FF-FF
1100 RedFF-00-00
1101 MagentaFF-00-FF
1110 YellowFF-FF-00
1111 WhiteFF-FF-FF
Não sei se mudou a sua, mas definitivamente mudou a minha vida...
posted on Sunday, June 11, 2006 10:38:36 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [1]
 Monday, June 05, 2006
Conhecimento é importante.  Não importa se você acha que não tem utilidade. Conhecimento é sempre útil.  E não ocupa espaço.

Outro dia tava estudando a API do Windows (Win32 API) e li sobre uma função que retornava a cor mais próxima de uma dada cor.  As placas de vídeo antigas tinham um número limitado de cores, aí o Windows emulava algumas cores fazendo combinação (dithering) de pixels.  Então, às vezes, quando você tentava desenhar com determinada cor, essa cor não estava disponível e o Windows usava outra, próxima.

Hoje em dia as placas de vídeo possuem capacidade de cor muito maior e o Windows não precisa mais fazer essa substituição.  Então essa informação que li era inútil.... certo?

E os celulares?  Hoje em dia um celular representa um PC do início da década de 90 em termos gráficos. Já há alguns com aceleração gráfica 3D, mas é uma outra historia :)

E  não é que o J2ME possui um método que faz exatamente o que o Windows fazia lá pros idos dos anos 80?

Outro dia ajudei um desenvolvedor a procurar esta funcionalidade por puro chute...

posted on Monday, June 05, 2006 2:49:48 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0]
 Friday, April 14, 2006
    Volta e meia é necessário garantir a unicidade de uma informação.

Tática Ingênua

    dado = "dado invariante qualquer"
    numero = random()
    unicidade = dado + numero


Esta tática é ingênua pois possui alta possibilidade de repetição.

Como assim "alta possibilidade de repetição"?!!? Você está dizendo que o gerador de números aleatórios da minha linguagem preferida não é bom!?!?

De forma alguma. Porém imagine que este código permanecerá executando por bastante tempo: segundos, minutos, horas, dias, semanas, meses, anos.  Alguma hora vai haver uma repetição.

Tática Menos Ingênua

    dado = "dado invariante qualquer"
    agora = ctime()
    numero = random()
    unicidade = dado + agora + numero


Esta tática é 'menos' ingênua pois ela possui uma possibilidade bastante baixa de repetição.

Atente somente ao fato de que pouca probabilidade não significa impossibilidade.  Ainda é possível que haja repetição, porém o parâmetro aleatório (variável número no exemplo) serve para desempatar dois resultados que ocorram simultaneamente.

Simultaneamente? Sim! Este código pode ser executado em computadores diferentes, que nem possuem comunicação entre si e mesmo assim possuem baixa possibilidade de gerar o mesmo número em dois ou mais eventos.

Se a variavel agora possuir o valor '20060415020030111' que significa '15/Abr/2006 02:00:30.111' (15 de Abril de 2006 às 2h da manhã mais 30 segundos e 111 milésimos de segundo), a variável numero seria utilizada como 'fator de desempate' entre dados gerados no mesmo milissegundo em threads ou computadores diferentes.

Como mencionado anteriormente, uma grande vantagem deste método é a descentralização das informações.  Vários eventos podem ocorrer em qualquer lugar e nenhuma comunicação é necessária entre eles para garantir uma unicidade bastante razoável.

Se utilizarmos algum identificador único do computador, como seu IP ou mesmo seu nome, garantimos que a variável numero só será necessária para desempatar dados gerados no mesmo computador, pois nenhum outro computador gerará o mesmo dado, a não ser que possua o mesmo IP ou nome do computador em questão.

posted on Friday, April 14, 2006 10:51:21 PM (Pacific Daylight Time, UTC-07:00)  #    Comments [0]