Restart Part 2: Loading…

No começo do ano passado eu soube que a Donuts tinha começado a operacionalizar uma série de novos gTLDs, entre eles, o .photography.

Num impulso eu comprei alguns domínios diferentes aproveitando o fato de, por conta do “.photography” ter sido recentemente lançado, vários nomes interessantes ainda estavam disponíveis e relativamente baratos.

Fiz o óbvio que foi segurar o meu nome (alfredmyers.photography). Os outros domínios podem ser vistos como uma reserva estratégica para garantir que eu tivesse bons nomes de domínio caso eu viesse a implementar algumas das idéias que eu tinha na cabeça.

Durante boa parte do ano passado eu trabalhei na pesquisa e coleta de material para um segundo projeto que ainda está em andamento e que será hospedado em um dos domínios que foram comprados na época.

Voltando ao alfredmyers.photography, eu decidi implementar o site usando a plataforma de portfólios do 500px. Não demorou muito, no entanto, pra eu perceber suas limitações:

  • Número limitado de templates, ou seja, as diferentes caras que podem ser dadas ao site;
  • Limitações quanto a customização dos templates, ou seja, até que ponto você pode mudar a cara do site depois de ter escolhido um dado template como ponto de partida;
  • Eco-sistema pequeno. O que põe em dúvida a viabilidade econômica e o consequente desenvolvimento contínuo da plataforma. Por exemplo, o braço de venda de prints e wall art do 500px será fechado no final deste ano.
  • Desempenho sofrível. Antes de fazermos um upgrade no plano de banda larga daqui de casa, o primeiro acesso à página inicial do meu site demorava em média 45 segundos para carregar. Neste meio tempo, o visitante era contemplado com nada além de uma espécie de ampulheta. Com boa parte das pessoas migrando sua navegação cada vez mais para dispositivos móveis usando 3G, etc, o desempenho do site era simplesmente inaceitável.

Depois de avaliar algumas alternativas e sendo o control-freak que sou, eu cheguei à “brilhante” conclusão de que deveria estudar os fundamentos de programação web moderna e fazer tudo do zero para ter controle total sobre a plataforma e seu desempenho. Eu já tinha conhecimento anterior de HTML e Javascript. Era só questão de eu me atualizar. Quão difícil a empreitada poderia ser?!? Mergulhei a cara na web e estudei todo o material disponibilizado pelo Google.

O problema é que construir o que eu tinha em mente era uma tarefa dantesca e toda vez que chegava a hora de botar a mão na massa, eu arrumava alguma outra coisa “mais importante” pra fazer. Acho que era o meu subconsciente me dizendo “Isso vai dar merda, Capitão!”.

A questão só foi resolvida recentemente quando, escutando um podcast durante uma corrida matinal, fiquei sabendo de algumas informações e características interessantes a respeito de uma plataforma que eu havia descartado prematuramente e que basicamente eu vinha ignorando até então.

Mas isso vai ficar para o próximo post…

Restart Part 1: Shutting Down

É provável que eu devesse ter pulado o post de ontem e ter deixado para postar hoje, mas a falta de tempo (por conta de uma reunião fora) conjugada com a ansiedade de postar alguma coisa e divulgar o novo endereço do blog fizeram com que eu me limitasse a postar a imagem de ontem – reproduzida aqui.

re·start verb rēˈstärt/ 1. start again. "the talks will restart in September" noun ˈrēstärt/ 1. a new start or beginning.

Desde o último post há pouco mais de 3 anos (vamos ignorar o de ontem que cá pra nós, não conta), muitas coisas aconteceram na minha vida: Em agosto de 2013 eu larguei o meu emprego e uma situação profissional bem estável e embarquei num ano sabático que acabou se extendendo e pra dizer a bem da verdade, ainda não está totalmente terminado – já que ainda estou tocando alguns projetos pessoais, que espero estar divulgando em breve.

Nesses pouco mais de 18 meses eu viajei um bocado pelo Brasil (Minas, Rio de Janeiro, Bahia, Maranhão), dei uma esticadinha pro Chile, mergulhei de cabeça na fotografia, entrei e saí de um projeto de app que parecia ser bastante promissor e tive inúmeras distrações – poucas ruins, muitas boas e outras ótimas 🙂

Se tem uma coisa que marcou este período foi o meu empenho, ora consciente, ora inconsciente, em assumir pouquíssimos compromissos com outras pessoas e comigo mesmo. Não faltaram mudanças de planos na última hora e na maior parte do tempo, eu fiz o que me deu na telha.

Embora isso possa parecer interessante para muitas pessoas, a verdade é que corre-se o risco de se tornar refém da própria vontade. E ser refém nunca é bom – mesmo quando o raptor é você mesmo.

APIs do Exchange Server

No decorrer dos anos foram criadas diversas APIs para acessar as funcionalidades do Exchange Server

Com o Exchange Server 2007, a Microsoft iniciou um trabalho forte de consolidação destas APIs e com isto diversas APIs deixaram de ser suportadas entre as versões 2003 e 2007 e outras deixaram de ser instaladas como parte do produto sendo disponibilizadas em download a parte (Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1, por exemplo).

Com a transição do Exchange Server 2007 para 2010, as APIs foram consolidadas ainda mais. Vejam:

Exchange 2007 Exchange 2010 Mantido
Active Directory Services Interfaces (ADSI)   FALSO
CDOEXM Evaluation Criteria   FALSO
CDOSYS SMTP/NNTP Event Sinks   FALSO
CDOWF Evaluation Criteria   FALSO
Collaboration Data Objects for Exchange (CDOEX)   FALSO
Collaboration Data Objects for Windows 2000 (CDOSYS)   FALSO
Exchange Backup and Restore API   FALSO
Exchange OLE DB Provider (ExOLEDB)   FALSO
Exchange Rules   FALSO
  Exchange Server Protocols FALSO
Exchange Store Event Sinks   FALSO
Exchange Web Services Evaluation Criteria Exchange Web Services VERDADEIRO
Exchange Web Services Managed API 1.0 Exchange Web Services Managed API 1.0 VERDADEIRO
Exchange writer for the Windows Volume Shadow Copy Service Exchange Writers for Volume Shadow Copy Service VERDADEIRO
HTTP/Web Distributed Authoring and Versioning (WebDAV)   FALSO
Incremental Change Synchronization (ICS)   FALSO
Lightweight Directory Access Protocol (LDAP)   FALSO
Messaging Application Programming Interface (MAPI) Messaging API VERDADEIRO
Outlook Object Model (OOM) Microsoft Office Outlook Object Model VERDADEIRO
Outlook Web Access (OWA) Outlook Web App Customization VERDADEIRO
SMTP Event Sinks   FALSO
Transport Agents Transport Agents VERDADEIRO
Web Forms Evaluation Criteria   FALSO
WebDAV Notifications   FALSO
  Windows PowerShell FALSO
WMI Evaluation Criteria   FALSO

 

A grande aposta são nos Exchange Web Services e a sua contra-partida no lado do cliente, o EWS Managed API. Realmente é uma API muito promissora mais ainda faltam alguns recursos existentes no MAPI, como por exemplo, a habilidade de se criar propriedades nomeadas (ou estendidas na nomenclatura do EWS) para anexos.

TF26212: Team Foundation Server could not save your changes.

I created a new WIT (work item type) to track progress of a set of activities we have here. Let’s call it “Setup”.

I wanted to restrict the users that create a new instance of the work item. The way to do this in TFS is to put a restriction on the state transition from “” to the first state of your workflow: “FirstStep” in our case.

To make things easier, I gave the group the same name of the WIT: “Setup”.

So I ended with something along the following lines:

<?xml version="1.0" encoding="utf-8"?>

<witd:WITD application="Work item type editor" version="1.0" xmlns:witd="http://schemas.microsoft.com/VisualStudio/2005/workitemtracking/typedef">

  <WORKITEMTYPE name="Setup">

    <WORKFLOW>

      <STATES />

      <TRANSITIONS>

        <TRANSITION from="" to="FirstStep" for="[project]Setup" />

      </TRANSITIONS>

    </WORKFLOW>

  </WORKITEMTYPE>

</witd:WITD>

 

The problem is that when I tried to save a new instance of the work item, I received the following message from TFS:

TF26212: Team Foundation Server could not save your changes. There may be problems with the work item type definition. Try again or contact your Team Foundation Server administrator.

That really doesn’t help…

After some research I found a blog post with a solution to the problem.

The problem is you should not have a WIT with the same name of a TFS group in whatever Team Projects you have.

You probably shouldn’t be using ReDim Preserve inside a loop

These days I was doing a code review when I went across a method which contained a ReDim Preserve inside a loop.

I can’t show the real code because it is from a customer’s code base, but here’s a simplification of what I found:

    Sub CopyAndPasteOrientedProgramming()

        Dim c As New Customer()

        For i As Integer = 0 To 250000

            ReDim Preserve c.Orders(c.Orders.Length + 1)

            c.Orders(c.Orders.Length – 1) = New Order()

        Next

        Console.WriteLine(c.Orders.Length)

    End Sub

 

I found the developer who checked in the code and went on to tell him to use a List(Of Order) and he replied “Oh, don’t bother with that. It’s just a piece of code that I copied from a similar class and since it doesn’t have a business rule for adding the elements, I took off the If statement.

Wait a minute, I said. You’re telling me there’s more code like this scattered throughout the code base?

Yup, he said.

So to simplify, the business rule I’ll use will be the order being a multiple of 3:

    Sub ShowRedim()

        Dim c As New Customer()

        For i As Integer = 0 To 250000

            If i Mod 3 = 0 Then

                ReDim Preserve c.Orders(c.Orders.Length + 1)

                c.Orders(c.Orders.Length – 1) = New Order()

            End If

        Next

        Console.WriteLine(c.Orders.Length)

    End Sub

 

The problem with the code is that for each iteration of the loop, a new array will be created with one more element than earlier and the previous array will be copied into the new one. Yeap… It’s going to create 250,000 arrays on the first sample and 83,334 on the second. Poor Garbage Collector!

A smarter decision would be to use a generic List. If you don’t initialize its capacity, it’ll default to 16 when you add the first element. Then it will double in size each time it reaches its capacity. I’m too lazy to do the math but I guarantee you that it’s far less than the previous example.

    Sub ShowList()

        Dim c As New Customer()

        Dim o As New List(Of Order)

        For i As Integer = 0 To 250000

            If i Mod 3 = 0 Then

                o.Add(New Order)

            End If

        Next

        c.Orders = o.ToArray()

        Console.WriteLine(c.Orders.Length)

    End Sub

 

This is a very simple alternative. If you really want to be clever and you have an idea of the percentage of orders that will fulfill the criteria, you can initialize the List with a meaningful capacity.

So please stop using ReDim Preserve inside loops!!!

 

 

PS. List(Of T).ToArray() creates a new array, but when compared with the original code that doesn’t hurt, does it?

TeamBuildTypes and Source Control Restructuring Gotcha

As part of implementing branching for the project I’m currently working on, I had to do some restructuring of the source control folder structure.

The structure was generally well organized except for the fact they didn’t take branching into consideration when setting up the folder structure:

$

  • Project
    • AnalysisServices
    • Assemblies
    • DatabaseObjects
    • IntegrationScripts
    • Models
    • OldLabBranch
    • TeamBuildTypes
    • Etc.

I wanted to create a branch in where AnalysisServices, Assemblies, DatabaseObjects and IntegrationScripts could be isolated in conjunction so new feature development could be done in parallel with regular maintenance without one breaking the other.

Using the branching guidelines I’ve talked a couple of posts ago, I managed to structure the folders as below:

$

  • Project
    • OldLabBranch
    • Main
      • Sources
        • AnalysisServices
        • Assemblies
        • DatabaseObjects
        • IntegrationScripts
      • TeamBuildTypes
    • Models
    • Etc.

The problem with this setting is that your Team Build Types won’t show up in Team Explorer 2005 because it has a dependency of TeamBuildTypes being a direct child of your Team Project’s folder. Moving back TeamBuildType to $/Project did the trick and everything worked fine.

$

  • Project
    • OldLabBranch
    • Main
      • Sources
        • AnalysisServices
        • Assemblies
        • DatabaseObjects
        • IntegrationScripts
    • Models
    • TeamBuildTypes
    • Etc.

When we upgrade to TFS 2008, I’ll move back TeamBuildTypes to the place recommended by the guidelines as they really do make sense.

Poster do .NET Framework 4.0

Durante o PDC que rolou lá nos “States” esta semana, a Microsoft liberou a primeira versão preliminar pública do .NET Framework 4.0, Visual Studio 2010 e os planos sobre um monte de outras coisas como o Windows Azure, Windows 7 e por aí vai.

Eu já estou com a minha VM do VSTS 2010 aqui, mas ainda não tive tempo de mexer muito com ele.

A primeira coisa que percebi foi que a Start Page parece ser feita com WPF. Estou bastante curioso para ver o que vem no C# 4.0.

Eles também lançaram um poster sobre as novidades que vieram com a SP1 do Fx 3.5 e o que deve vir no 4.0.

Você encontra uma versão online usando Deep Zoom aqui.

Tem um monte de vídeos a respeito disto tudo lá no Channel 9 .

Bem legal!