Wednesday, July 02, 2008
Hoje, a Typemock lançou a versão 4.3 do Typemock Isolator. Descarreguem daqui.
O que há de novo?
- Suporte para Ivonna. Para quem desenvolve aplicações ASP.NET, o Ivonna é uma grande ferramenta, suportada pela plataforma Isolator, para simplificar a escrita de testes para ASP.NET.
- Adição e APIs do namespace Typemock.Integration.Packs para gestão de licenças através do Isolator, como usa o Ivonna.
- Tal como tinha sido anunciado quando foi lançada, a versão 4.2 foi a última a suportar .NET 1.1. A versão 4.3 suporta apenas o ambiente de execução 2.0 e respectivas versões de Visual Studio: VS2005 e VS2008.
- Para máquinas de 64 bit, agora existe apenas um instalador. (não esquecer desinstalar ambas as versões anteriores (32 e 64 bit) antes de instalar a versão 4.3.)
- RecorderManager.GetMockOf(instanceRef) e MockManager.GetMockOf(instanceRef). Para o objecto controlador do objecto simulado (mock) a partir de uma instância de objecto simulado. (mais...).
Problemas resolvidos:
- Problemas no suporte a DLINQ resolvidos.
- Os construtores estáticos já são invocados correctamente quando se usa Natural Mocks.
- Resolvido o problema em que era lançada uma excepção quando se simulavam interfaces ("Method XX in type IMyInterface has no matching overload that returns TypeMock.Mock+a).
- Resolvido o problema em que era lançada uma excepção quando o objecto simulado sobrepunha uma implementação de Equals.
- Resolvido o problema que causava falhas na simulação de implementação explicita de interface com o mesmo nome.
- Resolvido o problema com VerifyWithWait em cenários de multithreading.
- Resolvido o problema em que era lançada uma NullReferenceException quando se usava Auto Deploy.
Mais informações:
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Tuesday, July 01, 2008
Monday, June 30, 2008
Numa entrada anterior mencionei a minha biblioteca para geração de valores aleatórios para efeitos de testes unitários.
Recebi alguns comentários e questões interessantes nos meus blogues [^][^][^][^].
O Simon diz que ele “geralmente quer que cada instância do teste que corre seja repetível em *todas* as execuções” e está “inclinado a usar a funcionalidade de fonte de dados do VSTS Unit Tests”. Eu não podia estar mais de acordo.
O Hugo indicou-me o Pex. Parece interessante. Tenho de ver melhor isto.
Alguns comentários mostravam alguma preocupação para, no caso do teste falhar, não ser possível reproduzir as condições do teste e por isso não seria possível perceber a razão da falha do teste. Na minha opinião, todos os dados usados num teste que falha devem estar no relatório do teste (pelo menos, os dados que fizeram o teste falhar). Quer os dados sejam previsíveis ou aleatórios.
Acho que a maioria dos comentários “contra” a minha ideia se deveram ao facto de não a ter explicado bem. Vou tentar fazer melhor agora.
Eu uso estes valores aleatórios quando o valor em si não é importante, apenas o facto de ser único.
Imagine-se uma classe Cliente em que para dizer que duas instâncias se referem ao mesmo cliente é suficiente comparar o seu ID. Para testar o código e comparação não necessito nenhum conjunto reprodutível de dados. Apenos preciso que sejam difrentes ou mesmo, dependendo do teste.
Imagine-se que se está a testar código de acesso a base de dados com uma connection string de um elemento específico de connection string settings. Não é importante saber qual o conteúdo da connection string porque não se vai realmente aceder à base ded dados (isto é muito fácil de fazer com o Isolator).
Espero ter-me explicado melhor desta vez.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Sunday, June 29, 2008
Recentemente perguntaram-me se era possível substituír as assemblies carregadas por uma aplicação Windows Service implementada em .NET enquanto esta corre, como o ASP.NET. Tal como no ASP.NET, eventos de início e de fifinalização da aplicação eram necessários.
A solução até é simples. A aplicação Windows Service passa a ser apenas um carregador que não tem qualquer referência para as assemblies carregadas que poderão sofrer alterações e ter uma assembly com um ponto de entrada que funciona como o evento de início. Esta assembly deve ser carregada num novo AppDomain com ShadowCopyFiles definido como true. O evento de finalização é tratado tratando o evento DomainUnload do AppDomian onde as assemblies a correr foram carregadas.
Se se quiser que a assembly a correr, assim como as assemblies por esta referenciadas sejam descarregadas e novamente carregadas quando ocorre uma modificação nos ficheiros destas assemblies, pode-se recorrer a um FileSystemWatcher, embora eu preferisse anular este comportamento no ASP.NET, não copiá-lo.
O carregador pode ser algo tão simples como isto:
class Program
{
private static Thread thread = null;
private static AppDomain appDomain = null;
static void Main(string[] args)
{
while (true)
{
Console.WriteLine();
Console.WriteLine("Options:");
if (appDomain == null)
{
Console.WriteLine(" L - Load");
}
else
{
Console.WriteLine(" U - Unload");
}
Console.WriteLine(" X - Exit");
switch (Console.ReadKey().KeyChar)
{
case 'l':
case 'L':
thread = new Thread(Load);
thread.Name = "Runner";
thread.Start(args);
while (appDomain == null) ;
break;
case 'u':
case 'U':
Unload();
break;
case 'x':
case 'X':
Unload();
return;
}
}
}
private static void Load(object obj)
{
string[] args = obj as string[];
AppDomainSetup appDomainSetup = new AppDomainSetup();
appDomainSetup.ApplicationBase = args[0];
appDomainSetup.PrivateBinPath = args[0];
appDomainSetup.ShadowCopyFiles = "true";
appDomain = AppDomain.CreateDomain("Runner", AppDomain.CurrentDomain.Evidence, appDomainSetup);
appDomain.ExecuteAssemblyByName("ConsoleApplication", AppDomain.CurrentDomain.Evidence, new string[0]);
}
private static void Unload()
{
AppDomain.Unload(appDomain);
appDomain = null;
thread = null;
}
}
O carregador recebe o caminho para a pasta onde estão as assemblies a carregar e o nome da assembly a correr.
A assembly a correr pode ser algo com isto:
class Program
{
static readonly DateTime dateTime = DateTime.Now;
static void Main(string[] args)
{
AppDomain.CurrentDomain.DomainUnload += delegate
{
Console.WriteLine();
Console.WriteLine("Unloading: {0}", dateTime);
};
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
Console.WriteLine("Loading: {0}", dateTime);
Console.WriteLine("Assembly: {0}", assembly.FullName);
Console.WriteLine("Location: {0}", assembly.Location);
FileInfo fileInfo = new FileInfo(assembly.Location);
Console.WriteLine("Location Dates: CreationTime={0}, LastWriteTime={1}, LastAccessTime={2}",
fileInfo.CreationTime, fileInfo.LastWriteTime, fileInfo.LastAccessTime);
while (true)
{
Console.Write('.');
Thread.Sleep(100);
}
}
}
Com este “sistema” pode-se carregar ou descarregar e substituír as assemblies que estão a correr quando se quiser.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Tuesday, June 24, 2008
Quando escrevo os meus testes unitários não gosto de usar valores fixos no código porque ou acabo por usar sempre os mesmos valores ou, por causa disso, os testes podem passar por coincidência.
Com o passar do tempo, desenvolvi uma classe utilitária para gerar valores aleatórios para usar em testes unitários.
namespace PauloMorgado.VisualStudio.TestTools.UnitTesting
{
public static class RandomGenerator
{
public static bool Boolean();
public static string String();
public static string String(string prefix);
public static short Int8();
public static short Int8(short maxValue);
public static short Int8(short minValue, short maxValue);
public static short Int16();
public static short Int16(short maxValue);
public static short Int16(short minValue, short maxValue);
public static int Int32();
public static int Int32(int maxValue);
public static int Int32(int minValue, int maxValue);
public static TEnum Enum<TEnum>();
public static TEnum EnumFlagsWith<TEnum>(TEnum flagsToAdd);
public static TEnum EnumFlagsWithout<TEnum>(TEnum flagsToRemove);
public static TEnum Enum<TEnum>(int maxValue);
public static TEnum Enum<TEnum>(int minValue, int maxValue);
public static System.Guid Guid();
}
}
Isto é algo que eu gostaria de ver em plataformas de mocks (como Typemock Isolator, Rhino.Mocks ou MoQ).
Ainda é um trabalho em curso, mas se quiserem testar, está na minha MSDN Code Gallery: Random Generator For Unit Testing
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Monday, June 23, 2008
Em entradas anteriores [^][^] comentei a dimensão da tradução para HTML dos validadores e sumário de validadores do ASP.NET e o facto de serem usados expando attributes para a tradução das propriedades. O Mohamed também comenta esta questão.
Além de não estarem em comformidade com o XHTML, o tratamento do Firefox para atributos prórprios difere do tratamento do Internet Explorer.
No Internet Explorer estes atributos são convertidos em propiedades do tipo string do elemento HTML. Já no Firefox, estes atributos são apenas acessíveis através da colecção attributes.
Pergunto-me porque será que não gosto de trabalhar com código cliente quando desenvolvo para web.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Numa entrada anterior mencionei IETester.
O Jorge Moura mencionou o MultipleIEs daTredoSoft e uma lista de web browsers.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Friday, June 20, 2008
Wednesday, June 11, 2008
O Windows Home Server Power Pack 1 Release Candidate foi disponibilizado para testes públicos. Leiam tudo aqui.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Há alguns dias um colega indicou-me uma ferramenta (IETester) que permite testar diferentes motores de HTML e JavaScript do Internet Explorer (5.5, 6, 7 e 8beta1) lado a lado com a versão instalada.
Ainda não testei o IETester, mas encontrei duas outras ferramentas que me chamaram à atenção: DebugBar e Companion.JS.
A DebugBar é como outras ferramentas que uso [^] com algumas diferenças. A DebugBar é uma barra lateral do Internet Explorer e não pode ser separada deste, mas tem uma consola de JavaScript e rastreia o tráfego HTTP/HTTPS que pertence à tab (IE 7) visível. Também consegue inspeccionar outras instâncias de Internet Explorer como o Document Explorer ou o FeedDemon.
A Companion.JS é uma ferramenta do tipo do Firebug e foi a que mais me agradou porque me deu algo que eu não tinha: algo que me livrasse dos incómodos diálogos de erros de script.
Tanto a DebugBar como a Companion.JS alegam ser debuggers de JavaScript mas não encontrei nenhum modo de definir breakpoints ou correr scripts paço a paço. Provavelmente porque tenho o Visual Studio instalado esta máquina.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Thursday, June 05, 2008
O registo para o Microsoft Tech-Ed EMEA 2008 está aberto.

Notem que, este ano, o evento para IT Professionals acontece antes do evento para Developers.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Tomei conhecimento, através do colega GASPiano, do lançamento da Microsoft Source Analysis for C# (aka StyleCop).
Ainda é trabalho em progresso, mas já é muito útil.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Tuesday, June 03, 2008
Hoje, a equipa do Windows Live Writer lançou uma technical preview que inclui funcionalidades novas e melhoradas.
Pelo que vi até agora, gostei:
- Barra de ferramentaso principal revista: a selecão de blogue, ajuda e selecção de cores está à direita.
- Abas como as do Excel para mudar de modo de visualização. Já não é necessário expandir um menú para seleccionar o modo de visualização.
- Controlo de categorias melhorado com pesquisa/filtragem.
Não gostei:
- Ter um conjunto predefinido de línguas para verificação de sintáctica. E Português não é uma delas.
- Ainda é penoso mudar a língua para verificação sintáctica.
- Não há língua predefinida para cada conta.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Sunday, June 01, 2008
Um colega meu mostrou-me isto e fui procurar por mais informação. Aqui está:
Sysinternals Live: We're excited to announce the beta of Sysinternals Live, a service that enables you to execute Sysinternals tools directly from the Web without hunting for and manually downloading them. Simply enter a tool's Sysinternals Live path into Windows Explorer or a command prompt as \\live.sysinternals.com\tools\<toolname> or view the entire Sysinternals Live tools directory in a browser at http://live.sysinternals.com.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Friday, May 30, 2008
O Pedro Félix está a blogar sobre WCF.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Todos sabemos (ou deveríamos saber) que os valores obtidos do método GetHashCode não devem ser persistidos para uso posterior, especialmente com strings, porque:
O comportamento de GetHashCode é dependente da sua implementação, que pode variar de uma versão do Common Language Runtime para para outra. A razão porque isto pode acontecer pode ser para melhorar a performance de GetHashCode. [^]
No entanto, código que persiste valores obtidos do método GetHashCode para uso posterior pode cair no nosso colo. E se for necessário actualizar o nosso código para, por exemplo, usar WCF ou WF, temos um problema.
A solução seria usar o Reflector para ver como isto é feito no CLR 1.1 e implementar o mesmo algoritmo no CLR 2.0.
Infelizmente, a implementação no 1.1 é em código nativo.
Hoje, graças à Nicole, encontrei a classe System.Collections.Specialized.BackCompatibleStringComparer no CLR 2.0. Esta classe implementa o algoritmo do String.GetHashCode do CLR 1.1 e pode ser encontrado nas assemblies System.dll e System.Windows.Forms.dll. Não podemos usá-lo porque é interno, mas podemos usar o Reflector para ver a sua implementação. Também pode ser encontrado aqui.
Agora tenho algumas questões:
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Thursday, May 29, 2008
A Typemock actualizou o sítio da Developers Community com novas secções.
Além dos fóruns, há uma nova página de add-ons onde qualquer um pode contribuir com as suas ferramentas ou fragmentos de código (acho que vou ter de polir um pouco os meus Typemock Snippets For Visual Studio para submeter) e uma página de especialistas (adivinhem quem lá está).

[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Tuesday, May 27, 2008
Justin Van Patten colocou uma entrada no Blogue da Equipa da BCL acerca do .NET Framework Client Profile.
Nesta entrada, ele passa em revista a lista de assemblies que farão e não farão parte des perfil cliente.
Se conhecem como as classes estão agrupadas na Plataforma .NET, sabem que algumas estão agrupadas, muitas veses, por proprieade e não por interesse. É por isso que se encontra o modelo de provedores na System.Web.dll, assim como a HttpUtility, e até a Cache (que pode ser muito útil em aplicações não-web).
Se lerem os comentários vão chegar à conclusão que há uma necessidade de vários perfis (ou um bootstrapper que será cozinhado por quem desenvolve a aplicação, o que é pior). Alguns destes perfis poderiam ser (grosso modo):
-
Application Foundation - mscorlib.dll, System.dll, System.Core.dll
-
Windows Forms - System.Windows.Forms.dll
-
Windows Communication Foundation (cliente) - System.ServiceModel.dll (separada em core classes apenas cliente)
-
Windows Communication Foundation (servidor) - System.ServiceModel.dll (separada em core classes apenas servidor)
-
Web - System.Web.dll (não a todalidado do
ASP.NET apenas para usar a
HttpUtility)
-
...
Isto pode ser levado aum nível em qeu Silverlight, XNA, Robotics, Compact Framework passariam a ser perfis da plataforma. Algo como o conceito de roles dos sistemas operativos dos servidores.
Penso que, mais importante do que cada um de nós gostari de ver neste perfil, é o facto de que a equipa está a analizar o assunto.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Sunday, May 25, 2008
Eu costumava partilhar as podcasts a que assisto através de um feed criado usando o FeedDemon, o NewsGator e o FeedBurner.
Era muito fácil. Tudo o que era necessário era adicionar a entrada correspondente ao episódio a uma clipping folder criada para esse fim. Essa pasta era partilhada através de um feed RSS que passava pelo FeedBurner para ter algumas estatísticas e um URL mais amigável. Para escarregar os episódios, usava o FeedStation (companheiro do FeedBurner).
Porque costumo assistir a algumas podcasts com alguma frequência, arranjei um Zune 8GB. O Zune usa o seu próprio software para carregar os conteúdos e esse software permite tratar das subscrições dos podcasts, por isso já não ia necessitar do FeedDemon e do FeedStation para esse fim.
Porque tenho alguns subscritores deste meu feed, pretendia mantê-lo. Foi então que encontrei o PodShow [^][^] e criei o meu próprio perfil e mudei a fonte do feed.
Portanto, se já é subscritor deste feed não precisa de fazer nada. Se não é, ainda o pode subscrever.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Ultimamente tenho analisado várias soluões de virtualização, reserva e aprovisionamento de recursos (aplicações, computadores de secretária, servidores) dos mais variados intervenientes neste mercado (Microsoft, Citrix , VMware , Sun , HP).
A virtualização tem muitas vantagens:
-
Consloidação de Hardware sem a necessidade da consolidação de servidores.
-
Facilidade de distribuição e manutenção.
-
Facilidade de diagnóstico.
-
Facilidade de desenvolvimento
-
Continuidade de negácio
-
Se o centro de processamento de dados ficar inoperacional, tudo o que é necessário são máquinas novas e a última cópia de segurança e temos um novo centro de processamento de dados operacional. (Não é assim tão fácil, mas sempre é mais fácil que instalar todas as aplicações do centro de processamento de dados).
-
... and much more.
Ultimamente tem havido algumas discussões sobre virtualização de sistemas de gestão de bases de dados. Os sistemas de gestão de bases de dados são ávidos consumidores de recursos (memória e I/O), mas as vantagens para a continuidade de negócio estão a começar apesar nas decisões de alguns departamentos informáticos.
Mas quando um colega me disse que a Microsoft tinha virtualizado a MSDN e a TechNet, eu não podia acreditar. Podem obter o relatório detalhado aqui.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Saturday, May 24, 2008
Tal como muitas pessoas, eu troco muitos e-mails.
Desde que tomei conhecimento da existência do Xobni que tenho vindo a pensar instalá-lo. Quando li que o Eric Legault (um MVP de Outlook) o usa, decidi instalá-lo. Parece ser uma grande melhoria para o Outlook.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
O Eric Legault (um MVP de Outlook) lançou a versão 2.0 do seu Picture Attachments Wizard. Eu era um grande adepto deste add-in para o Outlook quando usava o Outlook 2003 e, apesar do Outlook 2007 já isponibilizar uma funcionalidade de previsualização, o Eric conseguiu melhorar a experiência de utilização do Outlook 2007 com esta nova versão.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]
Monday, May 19, 2008
Wednesday, May 14, 2008
Quando instalei a minha nova máquina considerei a hipótese de instalar o Windows Server 2008 com Hyper-V. Mas esta é a minha máquina pessoal e não o meu servidor e eu gosto de coisas mais desktopy na minha máquina pessoal e não tenho necessidade de ter máquinas virtuais sempre a correr, pensei que o Windows Vista com Virtual PC 2007 (embora ter suporte para máquinas vituais x64 fosse bom) seria a escolha certa.
Ontem estava a experimentar a Developer Interface da InnerWorkings e não conseguia porque o Internet Explorer teimava em lançar erros de Internet Explorer Enhanced Security Configuration a partir do add-in da InnerWorkings para o Visual Studio que bloquava o Visual Studio.
Eu sei que o Rui usa o Windows Server 2008 como sistema operativo do seu laptop (assim como o António) e lembrei-me de perguntar ao Rui como é que me podia livrar da Internet Explorer Enhanced Security Configuration. O Rui indicou-me as seguintes entradas de blogues:
Passando pela série de entradas do blogue da Systweak acerca do Windows Server 2008 Desktop (ver abaixo) quase me fez arrepender ter instaldo o Windows Vista em vez do Windows Server 2008. Mas o meu próximo laptop vai correr Windows Server 2008.
Windows Server 2008 Desktop
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/paulomorgado/]