Meu outlook está lento! E agora?

Se você nunca teve um problema de lentidão no outlook, provavelmente não usa ele a tempo suficiente.

Já falei um pouco sobre como organizar e-mails e algumas regras interessantes para escrevê-los. Pois bem, não importa o quanto você tente, cedo ou tarde o outlook vira uma carroça – pelo menos no Windows.

Os arquivos de dados

O outlook tem essa solução/problema chamada arquivos de dados. Fazendo um paralelo rápido: ele guarda seus e-mails em “livros-caixa”, quando o espaço acaba ele adiciona novas folhas. O problema é que continua atualizando o índice, afinal esse é o livro-caixa corrente e é bem provável – em suas premissas, claro – que isso venha a ser importante em breve. Você precisa ajuda-lo a saber o que é livro-caixa passado e o que é atual.

Aqui entram os arquivos PSTs. Sem mais alongamentos, vamos nos fazer uma pergunta simples: nós sabemos o que é arquivo antigo e o que é novo? Pode parecer bobo, mas essa pergunta é a chave de tudo. Se você não sabe, seu outlook não vai adivinhar.

Novamente, como exemplo óbvio vou usar a minha organização de e-mails. Meu trabalho é altamente projetizado e a grande maioria do fluxo de refere-se a projetos. Pois bem, cada projeto tem sua pastinha com seus respectivos e-mails.

Assim que um projeto termina, vai para o arquivo de dados (PST) de projetos mortos desse ano.

“Tá, gênio, e se eu usar o Outlook pra Mac? Gera o mesmo problema?”

Sinceramente? Não sei. Quando eu souber eu atualizo o post.

“Ah, fantástico. E como eu faço isso?”

Moleza.

Outlook 2013/2010

  1. Clique em arquivo
  2. Vá em configurações de conta e depois configurações de conta (sim, os menus tem o mesmo nome)
  3. Clique na aba Arquivos de dados
  4. Clique em Adicionar
  5. ESCOLHA (isso é importante) o local onde sua pst será gravada, dê um nome a ela e, opcionalmente, insira uma senha – não esqueça essa senha JAMAIS
  6. Clique em OK

Com isso feito você notará que surge uma nova pasta no seu oulook com o nome da sua PST (no meu caso, 2015) e dentro dela uma pasta Itens Excluídos e outra Pastas de Pesquisa.

Agora basta mover as mensagens para lá. A partir disso o Outlook vai parar de criar indices para os e-mails antigos, liberando performance para você poder fazer coisas mais interessantes.

Lembra que falei que é importante indicar o local do arquivo? Quando você terminar, a MELHOR coisa que pode fazer é uma cópia dessa PST (que é um arquvio) e lembrar de fazer backups periódicos dela. Dessa forma você não perde e-mails antigos.

Uma vez que seus e-mails dos anos anteriores deixarem de ter relevância, volte a acessar o menu de criação das PSTs e remover o vínculo com o outlook – isso vai faze-lo iniciar mais rápido.

Por hoje é isso crianças!

A arte de enviar e organizar e-mails

Sim, isso vale um post. Pode parecer maluquice mas é verdade: enviar e-mails não é uma tarefa fácil nem trivial. Depende de uma série de regras e definições.

Mas por que eu deveria me preocupar com isso?

Simples: seres humanos leem e-mails. E eles, em geral, merecem respeito. Alguém vai ler a sua mensagem, pense nele. Ele vai entender? Vale a pena mandar esse e-mail? Será que não é melhor um telefonema? Seria mais intrusivo ligar ou mandar e-mail?

Muitas perguntas, não? Não adianta me mandar e-mail a respeito, siga lendo…

Problemas do mundo moderno

Reply to all (responder a todos)

É mania nacional. Você responde a todos. Sem se preocupar se todos devem ler aquela mensagem que você está mandando.

Se receber um e-mail de uma lista de distribuição, ANALISE, se o que você vai dizer todos devem saber.

Chat no e-mail

Se você respondeu a mesma mensagem mais de duas vezes em menos de 30 minutos é necessário utilizar outra ferramenta para essa comunicação. Skype, Lync, Messenger do facebook, Hangouts do google, face-time, chat do uol, whatsapp, o bom e velho telefone… opções não faltam.

Regras de “etiqueta”

Existem algumas regras que não encontrei muitos artigos a respeito mas já vi bastante gente falar e em geral, convergir para essas regras abaixo:

  1. Se alguém precisa ler um e-mail e responder ele, essa pessoa tem que estar no “to” ou “para”
  2. Se alguém precisa receber um e-mail e saber apenas da existência daquele assunto, essa pessoa tem que estar no CC ou cópia
  3. Se alguém precisa receber um e-mail em copia oculta, ele deve ser encaminhado em APÓS O ENVIO DO E-MAIL PRINCIPAL ao destinatário e não enviado na copia oculta. Vai que ele tem a doença do repy to all?
  4. Listas de e-mails grandes e comunicados para muitas pessoas, envie na copia oculta. Novamente, se algum dos destinatários tem o problema do reply to all você não enche a caixa de todos com as respostas.

Antes de apertar enviar REVEJA se as pessoas certas estão na linha certa.

Nesse maremoto de e-mails que você manda e recebe todo dia, certamente sua caixa deve estar constantemente cheia. Há aqueles que se copiam nos próprios e-mails para ter “roteamento” de seus e-mails. Não precisa mais fazer isso gente. Juro.

O que nos leva ao próximo assunto: organizando e-mails.

Utilizando ferramentas do Microsoft Outlook

Você tem aquele ataque de ansiedade quando vê a caixa de e-mails cheia? E quando vê a de um colega com 5 mil e-mails? Bom, eu tenho e essa é a razão de escrever esse post.

Verdade seja dita: eu nunca usei nenhum outro software de gerenciamento de e-mails. É um mal do meio, talvez, mas realmente não me interessei por outras ferramentas – o outlook resolvia todos os problemas e não gerava muitos outros. Portanto, vamos aprender um pouco de “autíluque”, sim?

Regras de mensagens

Você pode utilizar regras para organizar os e-mails por “grupos de afinidade” ou “urgência”, que é o meu caso. Utilizo um método que Scott Hanselman vive postando e palestrando a respeito que é a forma que ele faz. Pra mim deu resultado.

A ideia básica por trás do método de Hanselman é escolher seus e-mails utilizando as seguintes divisões:

  1. E-mails enviados para mim (estou na linha “para” do e-mail)
  2. E-mails de pessoas de FORA da minha organização – clientes, parceiros, fornecedores, familiares
  3. E-mails nos quais eu fui copiado – portanto, não preciso responder imediatamente
  4. Convites de reuniões – alguém quer conversar comigo em algum momento (ainda não utilizo isso pois não é parte constante da minha vida, mas é uma ideia interessante…)

Entendeu agora o porque das regras anteriores?

Dessa forma você sabe: 1: itens que preciso ver já; 2. algum cliente mandou um e-mail, ele deve ser importante, leia logo; 3. itens que talvez não tenham tanta relevância; 4. dependendo da quantidade de reuniões que você participa, faz todo sentido separar isso

Genial, como eu faço uma regra? É mais simples do que você imagina. Acesse o menu regras e crie uma nova regra. Explore os menus, seja curioso – não faz mal não.

Tenha em mente:

  1. Computadores são burros, eles não são capazes de decidir o que fazer sozinhos, você precisa dizer para eles o que fazer
  2. A ordem do que você diz pra fazer, faz toda diferença

Etapas rápidas

Elas são muito úteis. Gerencio minha caixa de entrada por projeto. Cada projeto tem sua pasta específica e é pra lá que e-mails lidos vão.

Depois de um tempo a quantidade de projetos aumenta, e ficar arrastando e soltando e-mails em pastas se torna uma tarefa chata e interminável.

Crie uma pasta que faça sentido na sua vida. Por exemplo o nome do projeto.

Clicando com o botão direito sobre uma mensagem existe uma caixa chamada “etapas rápidas”, no final dela tem um menu para criar uma nova etapa rápida.

Essa funcionalidade foi desenvolvida justamente por que o trabalho de criar regras é bem demorado e burocrático – e não é algo que você vai fazer toda semana.

Logo no começo tem algumas opções mais comuns, a primeira delas é “mover para uma pasta”. Ao escolher a pasta para qual o e-mail deverá ser movido e dê um nome à essa etapa. Em geral eu uso o nome da pasta.

Note que no topo do outlook essa etapa rápida aparece agora para você escolher e executar para as mensagens em foco na pasta atual. Ao clicar nela o e-mail é enviado para a pasta, magicamente.

Nunca mais você terá 5 mil e-mails na caixa de entrada.

Hanselman diz ainda que não verifica e-mail pela manhã. Ainda não consegui chegar nesse nível de desapego da caixa postal… isso fica para um próximo post.

Links interesantes:

The Three Most Important Outlook Rules For Processing Mail

Don’t Check Your Email in the Morning

Oredev Keynote – Information Overload and Managing the Flow: Effectiveness and Efficiency

Getting Organized While Drinking from the (Outlook) Fire Hose

III Fórum Microsoft para Gerentes de Sistemas

Depois de 4 meses…

Recentemente estive no III Fórum Microsoft para Gerentes de Sistemas, evento anual da Microsoft. Nesta edição foi dado muito foco ao lançamento do SQL Server 2012, com presença de Douglas Leland – gerente do produto para o planeta terra.

ATENÇÃO: o relato abaixo é apenas a minha opinião.

A palestra dele foi muito rasa, abordou muitos temas, nenhum deles relevante. A demo no meio da palestra foi bem interessante, mas curtinha… outro palestrante (não me recordo o nome, perdão) mostrou como o SQL Server 2012 é interessante para trabalhar com dados chamados “big data”.

Na sequencia, Rodrigo de Carvalho, gerente de produto do VS e TFS no brasil apresentou como a Microsoft organiza o desenvolvimento de suas aplicações, como não poderia deixar de ser eles usam TFS e – toma essa turma do RUP 😛 – metodologias ágeis (no caso deles Scrum).

Na parte da tarde a coisa foi bem interessante, fui para a track 2, focada em ALM e Cloud.

Rodrigo Benin da Allmatech iniciou a track com a palestra Orientando um projeto de software para o caminho certo através de governança, descrevendo alguns processos e premissas para o gerenciamento de desenvolvimento de aplicações. O foco maior foi no TFS – tem plugin pra eclipse, conecta com o project server, é escalável e “personalizável”. Bem bacana, vale segui-lo no twitter.

Em seguida tivemos Marden Menezes da Microsoft apresentando alguns casos de sucesso de ALM usando o TFS. Siga-o.

Luciano Condé – o cara que cuida do Azure na Microsoft Brasil – falou sobre todas as features do produto e fez algumas demos. Bem legal.

Por último Igor Abade falou sobre muitas novidades do TFS 2011, testes de software e qualidade, tirou dúvida de Kambam (tá bacana isso) e… o tempo acabou…. espero que tenhamos os ppts para tirar dúvidas com ele. Será que ele faz um video com o restante da palestra?

Se bobear a Microsoft libera o conteúdo que passou na track 1 para assistirmos em streaming, nela tivemos a transmissão simultânea o dia todo.

Brevemente o conteúdo (espero eu) deverá ser disponibilizado – altero quando souber as novidades.

jQuery: Filtro de tabela estilo Excel 2003

Oba!

Terceiro post e já estou falando de jQuery.

Tem um certo tempo Semana passada ressurgiu uma necessidade: filtrar tabelas de páginas web de forma similar ao que fazemos em planilhes de excel.

Entao, por que não fazer em jQuery?

Abordagem do problema

Tabelas são feitas de linhas e colunas. Certo? Parece bobagem começar dessa forma, mas é a base do problema.

O que precisamos fazer basicamente e ler cada coluna de uma determinada tabela e gerar uma base de registros único desta tabela e trocar o cabeçalho por uma lista destes registros. Moleza.

Construindo as listas para filtragem

Para deixar as coisas mais interessantes, vamos utilizar apenas as colunas que tiverem uma classe especifica – neste caso defini a classe como “comFiltro” – marquei em negrito o que defini para filtro.

Idade Nome Cidade Email Endereço
22 João da Silva São Paulo asdjjhj@email.com Rua do Sobe Desce, 13
25 Maria da Penha Rio de Janeiro asdjjhj@email.com Rua do Sobe Desce, 13
36 Visconde de Mauá São João da Boa Vista asdjjhj@email.com Rua do Sobe Desce, 13
22 Ronaldo Zezzo Rio de Janeiro asdjjhj@email.com Rua do Sobe Desce, 13
10 André Gonçalves Rio de Janeiro asdjjhj@email.com Rua do Sobe Desce, 13
69 Graziella Nascimento São Paulo asdjjhj@email.com Rua do Sobe Desce, 13
33 Gabriel Lima São João da Boa Vista asdjjhj@email.com Rua do Sobe Desce, 13
34 Hélio Bertagnolli São João da Boa Vista asdjjhj@email.com Rua do Sobe Desce, 13
12 Carolina Souza São João da Boa Vista asdjjhj@email.com Rua do Sobe Desce, 13
10 Luciana Prado Vitória asdjjhj@email.com Rua do Sobe Desce, 13

Então fazemos o seguinte:

  • Buscar o primeiro tr dentro da sua tabela
  • Para cada th dentro dela vamos usar a funcao hasClass para descobrir se essa coluna deve ser filtrada.
  • Se sim, enfileiramos um booleano true.
    No nosso exemplo teríamos nessa fila {true; false; true; false; false}, ou seja apenas as colunas 0 e 2 teriam filtros habilitados. Isso é bem útil quando uma das colunas tem dados não normalizados, como no nosso exemplo o nome de uma pessoa – homônimos não são coisas realmente muito comuns, mesmo se você se chamar João da Silva.

Com esta tabela teremos o seguinte processo:

  • Varremos cada coluna e cada linha.
  • Para cada registro encontrado comparamos com o que já temos usando busca binária.
  • Se não estiver nessa lista inserimos na mesma e ordenamos (importante: ordene só se inserir, não gaste a maquina do seu pobre usuário ordenando a lista sem necessidade).
  • Depois de varrer todas as linhas e ter uma lista de registros únicos escrevemos o código HTML que vai ser a lista (não esqueça de dar um nome bacana para ela).
  • Inserimos no topo da lista o valor original do cabeçalho da coluna e depois os demais registros.
  • Trocamos o valor atual do topo da tabela pela tag html da lista para seleção.
  • Isto feito, podemos ligar o evento change da lista à função encarregada de efetuar o filtro na tabela.

Filtrando dados baseado nos resultados dos select lists

Recapitulando: definimos quais as colunas que devem ser filtradas, para cada linha e coluna identificamos se temos que ter filtros e adicionamos num vetor o valor atual; inserimos no topo da coluna a lista com os itens selecionáveis e atribuímos um evento quando o filtro tiver seu valor alterado. Vamos escrever a função que cuida desse evento.

Quando o evento for disparado:

  • Mostramos todas as linhas da tabela
  • Para cada célula do cabeçalho
  • Se houver uma lista de seleção
  • Filtrar cada linha visível, se algor for escolhido nessa lista e o valor for diferente, esconder a lista

Com isso temos um componente que funciona como filtro de tabela no Excel 2003 – o operador lógico entre os filtros é sempre E, nunca OU.

Exemplo funcional

Deixei um exemplo desse código todo no skydrive, leia o arquivo js e o post ao mesmo tempo, tudo fará sentido – eu acho.

PrivateFontCollection sobre WindowsAzure

Usualmente usamos a fonte “Free 3 Of 9” para os projetos. O motivo disso é muito simples: é moleza… ou era.

Background geral

Os códigos de barras foram uma invenção realmente genial. Existem diversos tipos de códigos, um dos mais simples e práticos é o “3 of 9” ou “código 39” (é, eu sei ele tem seus problemas mas é free).

O que provavelmente os inventores não pensavam é que 40 anos depois usaríamos este sistema para identificar outras coisas, como vouchers de compras, inscrições em eventos e tantas outras coisas :).

Em c# é comum usarmos a classe System.Drawing.Graphics quando precisamos manipular imagens, com ela é possível, por exemplo, escrever uma string sobre uma imagem – você poderia usar para gerar marcas de créditos em suas imagens ou criar miniaturas e imagens. Porém essa função tem um pequeno problema, ao usar o método de escrita de texto ele vai por padrão usar as fontes do sistema e nenhum sistema que eu conheço vem com fontes de códigos de barras.

Alternativamente o .Net contém uma classe chamada PrivateFontCollection, feita justamente para carregar fontes que não estão no sistema e usá-las com o Graphics.

Recentemente precisei disponibilizar um gerador de códigos de barras em Windows Azure, e me deparei com o seguinte problema: como subir um arquivo .ttf junto com o package do Azure? Geralmente ao criar a PrivateFontCollection e inserir as fontes temos que passar um caminho dentro do sistema, o que não seria possível sem inserir o arquivo no package.

Para de enrolar e mostra o código

Este post (en-us) já explica bem o que precisava fazer e a abordagem aplicada, entretanto o meu problema não estava aqui e sim em conseguir subir a fonte do código de barras, coisa simples quando usamos qualquer solução de hosting que não seja Windows Azure. Creio que (não, eu não pesquisei) por segurança a ferramenta não permita isso.

“Mas você poderia usar o Remote Desktop e copiar a fonte pra lá, não?”

Não pois se o host reiniciasse a maquina virtual adeus fonte e olá códigos impressos em Arial.

A alternativa que encontrei é mais simples do que esperava. Resources.

Inseri a fonte como um resource no VS (Proprierties do projeto, resources, add resource file, add resource (setinha), add existing file) e carreguei a fonte como PrivateFontCollection. Veja abaixo o código para fazê-lo.

private static PrivateFontCollection carregarFonte()
{
PrivateFontCollection saida = new PrivateFontCollection();

byte[] font = Properties.Resources.FREE3OF9;

var ptr = Marshal.UnsafeAddrOfPinnedArrayElement(font, 0);

saida.AddMemoryFont(ptr, font.Length);

return saida;
}

O código que gera as barras ficou assim:

Bitmap saida = new Bitmap(355, 45);

Graphics graph = Graphics.FromImage(saida);

graph.Clear(Color.White);

graph.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;

PrivateFontCollection fonts = carregarFonte();

Font fonteDoBarcode = new Font(fonts.Families[0], 40, FontStyle.Regular, GraphicsUnit.Point);

graph.DrawString(p, fonteDoBarcode, new SolidBrush(Color.Black), new PointF(0, 0));

E pronto, códigos gerados, sistema operante. Até a próxima!

Para saber mais:

Código de barras – http://pt.wikipedia.org/wiki/C%C3%B3digo_de_barras

PrivateFontCollection – http://msdn.microsoft.com/en-us/library/ms533820(v=vs.85).aspx