Analisadores de Código do Roslyn: o conceito por detrás do conceito

under-the-hoodO recente lançamento do Visual Studio 2015 Preview trouxe, dentre diversas novidades, uma que despertou a atenção da comunidade de desenvolvedores .NET: os analisadores de código (“code analyzers”). Isso porque desde que o novo compilador gerenciado do C# e VB (codinome “Roslyn”) foi anunciado, um dos tópicos mais discutidos nas rodas de desenvolvedores era “o ReSharper está com seus dias contados!”

Continue reading

Use “Unpublish branch” no branch master e sinta seu coração parando por alguns segundos

"Metralhadora na mão de macaco" é uma das melhores analogias de todos os tempos!Recentemente eu descobri – por acaso – um fluxo de trabalho potencialmente perigoso enquanto estava usando usando a ferramenta gráfica de Git do Visual Studio 2013 Team Explorer (conhecida como “Git Tools for Visual Studio” e que vêm nativamente no VS 2013). Dependendo da sua sequência de ações, pode levar à perda de todo o conteúdo de seu repositório Git no TFS!

Continue reading

Desligue Internet Connection Sharing (ICS) para streaming do Windows funcionar

Da série “blogar é lembrar”:

Aqui em casa meu caçula adora assistir a seus filminhos (que criança não gosta? Smile). Para ele não precisar ficar manuseando (e arranhando) os DVDs, eu os “ripei” e gravei no computador. Assim, sempre que ele quer assistir a um filme pode faze-lo acessando a função de streaming da própria TV ou mesmo no Xbox.

Só que de uns tempos para cá o streaming (baseado em DLNA) tinha parado de funcionar. Eles não conseguiam acessar meu computador através da TV ou do Xbox, e nem eu conseguia iniciar o streaming a partir do meu computador (usando a função Play To do Windows).

Pesquisando na internet, achei um post que mencionava, dentre outras sugestões, desligar o ICS (Internet Connection Sharing) do Windows – que uso para compartilhar minha internet com minhas VMs do Hyper-V.

Desligando o ICS

E não é que deu certo?! Smile

 

Um abraço,
    Igor

Minha experiência na Apple Store e na Microsoft Store

(UPDATE 01/04/2014: Eu voltei na Apple Store no dia seguinte.)

Ontem estive na Microsoft Store e na Apple Store no shopping aqui em Bellevue. Amigos sempre me falaram sobre a experiência estelar que é o atendimento a clientes da Apple, então achei legal compartilhar como foi a *minha* experiência. Continue reading

O que o System Center tem a ver com TFS e ALM?

image Quando se fala de ALM na Plataforma Microsoft, geralmente o primeiro que vem à cabeça é “TFS”. Mas ultimamente há um outro nome que vem surgindo com uma frequência cada vez maior nas rodas de discussão sobre ALM: System Center.

Mas afinal, o que é que o tal System Center tem a ver com ALM?

Continue reading

Entenda o licenciamento do Visual Studio Online

Convenhamos: licenciamento nunca é algo fácil de se entender. Quando envolve uma nova oferta então – como é o caso do Visual Studio Online – as coisas só complicam.

Por outro lado, não dá para fugir dessa discussão. Para garantirmos que nossa empresa está devidamente licenciada (e não está desperdiçando dinheiro pagando mais que o necessário), precisamos entender exatamente como contratar e pagar pelos serviços do Visual Studio Online!

Continue reading

EPM? Pra quê?! Usa o TFS!

image

Sei que o título deste post pode causar alguma polêmica – mas acredite, é por uma boa causa Smile.

Frequentemente nossos clientes de ALM perguntam sobre o tal do “EPM” (quando, na verdade, eles querem mesmo é falar do Microsoft Project Server). Aliás, engraçado como EPM acabou virando sinônimo de Project Server….

Mas voltando ao assunto: esses clientes às vezes já têm o EPM Project Server em suas empresas. Noutras vezes, eles querem instalar o tal Project Server. E no contexto de um projeto de ALM, a pergunta obviamente é:

Dá para integrar o TFS com o Project Server?

Continue reading

Automatizando builds no TFS: além do Team Build

Pensando fora da caixa - indo além do Team BuildRecentemente o amigo e ex-Lambda3 Osmar Landin iniciou uma série de posts sobre o Jenkins. Apesar de ele normalmente escrever sobre TFS, essa nova série de posts teve uma motivação mais do que justa:

Nem todo mundo pode (ou quer) usar o TFS. Às vezes a melhor (ou a única) solução é partir para um stack open-source. Nesses casos, o que usar para automação de build?

A resposta dele a essa pergunta foi “Jenkins”. Se você se identificou com essa situação, deve ler sua série de posts. Por outro lado, apesar de eu ter me inspirado nos posts dele, minha motivação foi um pouquinho diferente. O que eu quero discutir é:

Eu uso TFS como meu repositório de controle de versão e estou mais que satisfeito. Agora, quero automatizar meus builds. O que faço?

Continue reading

Como evitar o erro de “Bookmark not defined” no Word

Aqui na Lambda3 somos ávidos usuários de Word. E um dos usos mais comuns é para a confecção de propostas técnicas/comerciais para nossos clientes. Nosso fluxo de trabalho típico é:

  1. Criamos um novo documento no Word, a partir do modelo de propostas (tipicamente usando uma proposta existente como referência);
  2. Fazemos as alterações necessárias, de acordo com o escopo da nova proposta;
  3. Salvamos o documento do Word no SharePoint; e
  4. Geramos um PDF para envio ao cliente.

O problema

O sumário (“índice”) da nossa proposta usa o recurso de Sumário (Table of Contents) do Word, gerando as entradas automaticamente a partir dos cabeçalhos das seções. Só tem um porém: como usamos uma proposta pré-existente como ponto de partida, o sumário (que já existia no documento anterior) perde a sincronia com o conteúdo do novo documento. E se o autor do documento se esquecer de ir até o sumário e o atualizar (pressionando F9), ao gerar o PDF teremos o infame “Bookmark not defined”:

PDF com erro de "Bookmark not defined" no sumário

A solução

Seria muito legal se pudéssemos configurar o Word para atualizar automaticamente o sumário, não?

A resposta é mais simples do que imaginamos: Vá em File | Options | Display (Arquivo | Opções | Exibir) e selecione a opção Update fields before printing (Atualizar campos antes de imprimir). Apesar de parecer que só ele só atualizaria os campos no instante de imprimir, o processo de geração de PDFs do Word é como se fosse uma impressão. Ou seja, o comando Salvar Como para gerar um PDF vai disparar a atualização dos campos e sincronizar automaticamente o sumário com o conteúdo atual documento. Pronto, está feita a mágica! ;-)

SNAGHTML415e40

Um abraço,
    Igor

Como listar as versões do Visual Studio que se conectam ao meu TFS

Hoje o amigo Mandrado me mandou uma pergunta que valia ser registrada num post:

(…) me lembro de você dizer em uma aula como listar a versão dos clientes (IDE VS) conectados ao TFS, não encontrei em minhas anotações.
Vc se lembra como posso listar os clientes visual studio conectados ao tfs?

Então vamos lá: como faço para saber quais são os clientes Visual Studio conectados ao meu TFS?

A tabela tbl_Command

O TFS registra em uma tabela de seu banco de dados todos os acessos remotos feitos por qualquer cliente. Essa tabela, tbl_command (no banco de dados Tfs_Configuration), mantém o registro de cada chamada a qualquer um dos web services do TFS por um período de 14 dias (que pode ser ajustado).

Uma das colunas dessa tabela é a UserAgent, que registra o nome do cliente que está se conectando ao TFS. Por exemplo, se eu acessar o TFS com um Visual Studio 2013 Ultimate, a coluna UserAgent vai conter o valor:

Team Foundation (devenv.exe, 12.0.21005.1, Ultimate, SKU: 17)

Assim, para saber quais cliente se conectaram ao TFS nos últimos dias, basta executar a seguinte consulta:

SELECT DISTINCT UserAgent
FROM tbl_Command
ORDER BY UserAgent

Ao executar essa consulta na máquina virtual do Brian Keller, este foi o resultado que obtive:

image

Um abraço,
    Igor

Adicionando novas definições de browser ao Visual Studio Web Performance And Load Test

SNAGHTML547a82b

Se você já usou as ferramentas de Teste Web do Visual Studio Ultimate (Web Performance Test e Load Test), provavelmente já deve ter visto uma caixa de diálogo similar a esta logo acima. Com ela, é possível indicar qual navegador será simulado durante seus testes. Isso é particularmente útil para aplicações Web que tenham renderização condicional – ou seja, que geram HTML específico para um dado browser. Simular vários browsers permite, portanto, exercitar esses vários mecanismos de geração condicional.

O problema

Recentemente, num cliente da Lambda3, tivemos uma demanda específica: rodar um teste de carga que simulasse os seguintes clientes:

  • Internet Explorer 8 no Windows XP;
  • Internet Explorer 9 no Windows 7;
  • Chrome 27 no Linux (Ubuntu); e
  • Chrome 31 no Windows 7.

Olhando para a caixa de diálogo acima, fica óbvio que tínhamos um problema. Mais especificamente com o Chrome. Não havia, entre as opções disponíveis, as versões de Chrome que o cliente precisava.

A solução

Felizmente, resolver isso é bem fácil. Essa lista de browsers é um sub-diretório na pasta de instalação do Visual Studio. Abra o diretório C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Templates\LoadTest\Browsers (“C:\Program Files” num Windows de 32 bits) e você vai encontrar vários arquivos com a extensão .browser, um para cada definição de browser:

Diretório com as definições de browsers

Esses arquivos são meros arquivos XML com a descrição dos browsers. Como era de se esperar, a definição mais importante para nosso caso é a string de user-agent (o cabeçalho HTTP que identifica qual browser está acessando o servidor). Veja, por exemplo, o conteúdo do arquivo Chrome2.browser:

<Browser Name="Chrome 2" MaxConnections="6">
  <Headers>    
    <Header Name="User-Agent" Value="Mozilla/5.0 (Windows; U; Windows NT 5.1;) AppleWebKit/530.1 (KHTML, like Gecko) Chrome/2.0.169.1 Safari/530.1"/>
    <Header Name="Accept" Value="*/*" />
    <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
    <Header Name="Accept-Encoding" Value="gzip,deflate" />
    <Header Name="Accept-Charset" Value="ISO-8859-1,*,utf-8" />
  </Headers>
</Browser>

DICA: Para descobrir qual a string de user-agent eu devia usar para as duas versões de Chrome, consultei a lista presente no site UserAgentStrings.com.

Agora, o resto foi fácil. Criei duas cópias do arquivo Chrome2.browser (que usei como referência) e salvei-as, respectivamente, como Chrome27-Linux.browser e Chrome31.browser.

Chrome 27 no Linux (Ubuntu)

<Browser Name="Chrome 27 (Ubuntu 13.10)" MaxConnections="6">
  <Headers>
    <Header Name="User-Agent" Value="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu/13.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36"/>
    <Header Name="Accept" Value="*/*" />
    <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
    <Header Name="Accept-Encoding" Value="gzip,deflate" />
    <Header Name="Accept-Charset" Value="ISO-8859-1,*,utf-8" />
  </Headers>
</Browser>

Chrome 31 no Windows 7

<Browser Name="Chrome 31 (Windows 7)" MaxConnections="6">
  <Headers>    
    <Header Name="User-Agent" Value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1623.0 Safari/537.36"/>
    <Header Name="Accept" Value="*/*" />
    <Header Name="Accept-Language" Value="{{$IEAcceptLanguage}}" />
    <Header Name="Accept-Encoding" Value="gzip,deflate" />
    <Header Name="Accept-Charset" Value="ISO-8859-1,*,utf-8" />
  </Headers>
</Browser>

Se o Visual Studio estiver aberto, não esqueça de reiniciá-lo. Agora, temos duas novas opções de navegadores para uso no Web Performance Test e no Load Test:

Caixa de diãlogo de seleção de browsers com as novas opções

Um abraço,
    Igor