VisualStudio 2008 - Parte1, CodeMetrics

Uma das novas funcionalidades presentes no VS2008 é a possibilidade de calcular Code Metrics.
Esta não é uma matéria nova, e ferramentas como o FXCop ou o NDepend, já forneciam até mais indicadores que os presentes no VS2008, e permitiam ainda, integrar com o CruiseControl. Agora porém estas métricas podem ser calculadas a partir do IDE, o que permite de uma forma imediata tirar entre outras algumas conclusões sobre a qualidade do código, a complexidade da estrutura de classes, a facilidade de manutenção e extensibilidade do código, e não menos importante identificar os pontos onde um refactoring será mais necessário.

Este é o aspecto do output produzido a partir de um projecto de testes.

Para o que cada indicador significa consultem este excelente artigo no blog da equipa do FXCop Visual Studio 2008 CodeMetrics.

Posted por Pedro Rui Silva | with no comments
Filed under:

FeedDemon Rules

Tenho sido até à pouco tempo, um utilizador fiel do Omea Reader. Já antes tinha utilizado outros Feed Readers, entre os quais o SharpReader e o RssOwl. Porém voltava sempre ao Omea Reader, principalmente pelo GUI e pelas funcionalidades de organização que permitia. O grande problema do Omea Reader quanto a mim, é a memória que ocupa, muito facilmente ia para cima de 80MB, e além disso, começava a ter muitos problemas de parsing em alguns Feeds, com erros constantes, algo que não acontecia com o SharpReader por exemplo. Isto quanto a mim é algo indesculpável e particularmente irritante. Até que á pouco tempo, resolvi experimentar o FeedDemon na altura em passou a ver gratuito. O GUI é quanto a mim muito bom, funciona bem em offline, permite pesquisas eficiêntes e uma boa organização dos Feeds, e melhor do que isso, ocupa cerca de 20MB de memória, quatro vezes menos que o Omea Reader, é neste momento a minha ferramenta de eleição para ler Rss Feeds.

FeedDemon

Posted por Pedro Rui Silva | 2 comment(s)
Filed under:

Virtual PC2007 "always start in full-screen mode" is really always!!!

Estava a usar o Microsoft Virtual PC2007 para fazer uns testes em software, quando ao percorrer as opções cliquei na opção "Always start this virtual machine in full-screen mode", até aqui tudo bem, mas pelos vistos "Always" significa mesmo "Always". Mesmo depois de alterar esta opção a VM arrancava sempre em full-screen.
Depois de percorrer várias vezes as diferentes opções de configuração (VM e Virtual PC) parecia não haver forma de arrancar a máquina sem ser em full-screen mode, até que editei o ficheiro de configuração (.vmc) da VM no Notepad++
E lá estava no meio do xml a opção


    <full_screen>
        <startup type="boolean">true</startup>
    </full_screen>


Então o Virtual PC, apesar de alterar a opção na consola configurações não altera no ficheiro de configuração? O que parece é que o valor que aparece na consola de configuração não corresponde a esta opção. Bom de qualquer forma bastou alterar este valor e a partir dai a VM já deixou de arrancar em full-screen.
Posted por Pedro Rui Silva | with no comments
Filed under:

Javascript - Disable all form buttons

Este exemplo é um bocado básico, mas necessitava que todos os botões ficassem disabled ao fazer submit, este foi o script mais limpo que consegui escrever.

void function DisableButtons(button)
{
    var form = button.form;
    var length = form.elements.length;
    
    for (var index = 0; index < length; index++)
    {
        var element = form.elements[index];
        var isToDisable = (element.type == 'submit' || element.type == 'button' || element.type == 'image');
        
        if (isToDisable)
        {
            element.disabled = true;
        }
    }
}

Se tiverem outras sugestões...

Posted por Pedro Rui Silva | 4 comment(s)
Filed under:

Free Asp.Net Refactoring Tool

Ultimamente tenho trabalhado bastante em Asp.Net, e apesar de ser um utilizador e adepto do Resharper, este não suporta refactoring do layout de uma página Asp.Net, porém a Developer Express, tem uma ferramenta de refactoring para Asp.Net gratuita, esta ferramenta inclui 29 refactorings, e 10 são dedicados exclusivamente a Asp.Net, permite por exemplo extrair CSS inline para uma named class style e extrair determinados elementos para um User Contol.

Podem fazer aqui o download a partir daqui Refactor!™ for ASP.NET podem ainda consultar um post do blog do Mark Miller com os detalhes das funcionalidades de refactoring.

Posted por Pedro Rui Silva | with no comments
Filed under:

SQLite

Muitas vezes em pequenos projectos .Net, sejam eles de cariz pessoal ou profissional, o recurso a base de dados é quase sempre necessário, e se bem que exista a versão Express do SQL Server 2005, muitas vezes são coisas tão pequenas que não se tira proveito de todo o poder disponibilizado.

A ferramenta que mais vezes parece ser utilizada é Access, uma vez que está disponível com o Office, e quase todas as pessoas que usam Windows tem o Office. À pouco tempo tive de facto necessidade de fazer algo com base de dados, e por motivos vários não necessitava de SQL Server, não tinha de correr como serviço, não queria usar Stored-Procedures, queria que a base de dados fosse apenas um ficheiro facilmente transportável... e apesar de não ser um utilizador de Access, parecia ser um trabalho perfeito para ele. Porém antes de usar o Access consultei alguns blogs e encontrei uma referência ao SQLite, resolvi experimentar e fiquei bastante impressionado com o que vi. É extremamente fácil de utilizar, tem um ADO.NET Data Provider, uma ferramenta de administração bastante intuitiva, rápido, leve, e é gratuito. O único problema é que é necessário fazer o download destes componentes separadamente, mas se estão à procura de uma forma simples de terem uma base de dados esta é uma óptima opção.

Links:

SQLite
SQLite Administrator
ADO.NET 2.0 Provider for SQLite
System.Data.SQLite

Posted por Pedro Rui Silva | with no comments
Filed under: ,

Os 46 melhores Freeware de sempre

O site Tech Support Alert, compila por categoria, listas dos melhores de ...
Entre as várias categorias está a dos melhores utilitários freeware (é sempre subjectivo, mas pode ser bastante útil), estas listas são actualizadas periodicamente e podem ser subscritas através de um Feed RSS, se quiserem ter sempre os vossos utilitário actualizados não percam a oportunidade de visitar o site.

The 46 Best-ever Freeware Utilities

Posted por Pedro Rui Silva | with no comments
Filed under:

SysInternals Suite

Há algum tempo atrás, em Julho de 2006 a Microsoft adquiriu a SysInternals, conhecida pelos seus utilitários para o Windows (quem nunca usou o FileMon, Process Monitor, ou outros). Todas as várias ferramentas de Troubleshooting da SysInternals estão agora reunidas numa única suite a Sysinternals Suite.

Download Sysinternals Suite

Posted por Pedro Rui Silva | with no comments
Filed under:

Geek Fonts

O site Geek Fonts é um dos maiores arquivos de fontes disponíveis na Web. Tem neste momento segundo eles 9348 Fonts todas elas tem previews, se necessitam de uma nova Font para o Visual Studio, Word ou qualquer outra aplicação, aqui vão de certeza encontrar alguma.

Geek Fonts

Posted por Pedro Rui Silva | 4 comment(s)
Filed under:

Building a Perfect WPF Developer Workstation

A .Net Framework 3.0 já saiu há algum tempo e já correm por ai uma série de demos sobre WPF. Querem experimentar as novidades da framework e não sabem o que é necessário? Tim Sneath, explica neste artigo tudo o que é necessário instalar para poderem começar a desenvolver next-generation applications.

Building a Perfect WPF Developer Workstation, by Tim Sneath

Posted por Pedro Rui Silva | with no comments
Filed under:

ReSharper 2.5 EAP

Definitivamente o ReSharper é uma das melhores ferramentas disponíveis para o Visual Studio, mas apesar de tudo ocupa bastantes recursos da máquina, o que se torna grave em máquinas mais antigas e com menos capacidade, porém a JetBrains anunciou para a sua nova versão entre outros, melhoramentos grandes ao nível da performance, isto é particularmente importante se a solução onde se trabalha tem bastantes projectos e dependências.

Se ainda não experimentaram aproveitem para testar a nova versão, para quem já conhece e usa é o normal, cada nova versão é sempre melhor que a ultima ;)

ReSharper 2.5 EAP

Posted por Pedro Rui Silva | with no comments
Filed under:

Xml Serialization

Esta é a 2ª parte sobre como utilizar Xml Serialization, como gerar uma classe a partir de um Schema, e como criar instâncias dessa classe a partir de um ficheiro Xml existente. Mas não só, explica também como fazer o processo inverso, ou seja gerar um Xml Schema a partir de uma classe e como gravar para um ficheiro Xml uma instância de um objecto.

Links:
.Net Xml Serialization, Parte 2

E ainda a parte inicial .Net Xml Serialization, Parte 1

Posted por Pedro Rui Silva | with no comments
Filed under:

CopySourceAsHtml

Como é que colocam o vosso código no blog?

Este utilitário já anda por ai há algum tempo, mas não me lembro de ter visto aqui nenhuma referência a ele, permite seleccionar um bloco de código e exportar esse bloco como HTML, mas não se esgota aqui, tem ainda uma série de opções sobre como gerar o HTML (Fontes, Estilos, ...).

Download:
CopySourceAsHtml

Posted por Pedro Rui Silva | with no comments
Filed under:

.Net Xml Serialization, Parte 2

Vimos anteriormente os princípios básicos da Serialização em Xml, as classes necessárias para definir a estrutura do Xml, as que são necessárias para a serialização propriamente dita, e finalmente como estruturar uma classe para que possa ver serializável.

Vamos agora ver em mais detalhe a serialização de objectos de e para disco, os utilitário necessários para criar objectos a partir de um Xml Schema (XSD) e vice-versa. Inicialmente para o exemplo apresentado, foi criado uma string com o Xml resultante da serialização, este Xml está de acordo com o que foi especificado na classe, ou seja é na classe e através de atributos que se define entre outras coisas o seguinte:

  • Quais as propriedades a serem serializadas.
  • Que propriedade são atributos ou elementos do xml.
  • Quais os seus nomes a atribuir a essas propriedades ou elementos.
  • Que elementos e atributos são obrigatórios.

Uma vez não temos um Xml Schema, não é possível verificar à priori se o Xml produzido está de acordo com uma especificação, nesta situação a única forma de validarmos essa conformidade é recorrendo a um bloco try\catch no momento em que o objecto é instanciado a partir do xml, porém esta solução está longe de ser a ideal, uma vez que o Xml pode e deve ser validado a partir de um Schema.
Mesmo ao nível do próprio processo de desenvolvimento, pode ser mais útil criar a definição de uma classe a partir de um Xml Schema existente, uma vez que a maioria dos processos de negócio de hoje implicam a troca de documentos em formato Xml, podemos olhar para o Schema na sua forma mais simplista como o contrato a que esses documentos devem obedecer, pelo que é de todo o interesse que seja o Schema a servir de ponto de partida para criar as classes utilizadas na execução desses processos de negócio.

Para este exemplo vamos usar a “xsd.exe” tool, esta tool faz parte do SDK da.Net Framework, e permite como referido anteriormente criar um XSD Schema a partir de uma classe ou conjunto de classes, e também o inverso, criar a classe ou classes a partir do XSD schema, existem outra ferramentas para este efeito algumas das quais bastante mais poderosas, mas pela sua simplicidade e uma vez que já vem com a Framework é a eleita para este exemplo.

Vejamos as seguintes classes, tal como os nomes indicam a classe SalesOrder representa o cabeçalho de uma encomenda e a classe SalesOrderItem uma linha dos itens dessa mesma encomenda:

Para criar um XSD Schema a partir de uma classe é necessário identificar em primeiro lugar o tipo do objecto, esse é o tipo a partir do qual o Schema vai ser gerado, é também necessário indicar qual a assembly onde está definido esse tipo, para tal usamos o seguinte comando:

xsd.exe -t:SalesOrder SerializationSampleTwo.exe

Este comando vai dar origem a um ficheiro chamado schema0.xsd, esse ficheiro contém a especificação do Schema a que o Xml produzido pela serialização das classes SalesOrder e SalesOrderItem deve obedecer:


Como se pode ver existem propriedades de ambas as classes que estão definidas como atributos e também propriedade que tem nomes diferentes entre a classe e o schema, de acordo com a definição criada pelos diversos atributos na classe. Estes atributos fazem parte do namespace System.Xml.Serialization.

Agora o inverso, partir de um XSD schema e gerar as classes. Para criar um schema pode-se utilizar o Visual Studio, ou o Xml Spy, este ultimo disponibiliza á algum tempo uma versão gratuita, o seu download pode ser feito a partir do seguinte url: http://www.altova.com/support_freexmlspyhome.asp.

O schema que vamos usar para criar as classes é o seguinte:

Para criar as classes a partir de um schema, basta indicar qual o nome do schema, existem mais parâmetros que podem ser passados, tais como o namespace ou a linguagem, neste exemplo vamos usar o mais básico possível, o comando é o seguinte:

xsd.exe /classes schema.xsd

O Visual Studio 2005, automaticamente cria as classes a partir de um schema, para tal basta que se adicione o schema ao projecto, que ele de imediato cria as classes respectivas.

As classes criadas são as seguintes:

Um primeiro reparo, o elemento Items que no schema está definido como uma sequência de elementos CatalogItems é criado como um Array.

   49     public partial class CatalogItems

   50     {

   51         private CalalogItem[] calalogItemField;

   52 

   53         /// <remarks/>

   54         [XmlElement("CalalogItem")]

   55         public CalalogItem[] CalalogItem

   56         {

   57             get { return calalogItemField; }

   58             set { calalogItemField = value; }

   59         }

   60     }

Se o tipo de operações a fazer com os dados envolve apenas leitura, o Array serve perfeitamente, porém o que acontece na maior parte das vezes, é a necessidade de retirar e\ou adicionar elementos, para isso o melhor é utilizar uma generic Collection ao invés de um Array, deste modo temos a facilidade de retirar e adicionar elementos sem a preocupação de estar permanentemente a redimensionar o Array.

   17     public partial class CatalogItems

   18     {

   19         private Collection<CalalogItem> calalogItemField;

   20 

   21         /// <summary>

   22         /// Initializes a new instance of the <see cref="CatalogItems"/> class.

   23         /// </summary>

   24         public CatalogItems()

   25         {

   26             calalogItemField = new Collection<CalalogItem>();

   27         }

   28 

   29         /// <remarks/>

   30         [XmlElement("CalalogItem")]

   31         public Collection<CalalogItem> CalalogItem

   32         {

   33             get { return calalogItemField; }

   34             set { calalogItemField = value; }

   35         }

   36 

   37         /// <summary>

   38         /// Returns a <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.

   39         /// </summary>

   40         /// <returns>

   41         /// A <see cref="T:System.String"></see> that represents the current <see cref="T:System.Object"></see>.

   42         /// </returns>

   43         public override string ToString ()

   44         {

   45             return calalogItemField.Count.ToString();

   46         }

   47     }

Outro reparo a fazer, é o facto de todas as classes estarem num único ficheiro, mas isso não é nada que o ReSharper não possa resolver ;).

Há que ter também em atenção o seguinte, por defeito na classe Catalog a collection de Items (CatalogItems) está com o valor null, esta situação pode provocar algums problemas caso se queira utilizar os items sem que exista uma instancia da collection, o melhor é criar desde logo no construtir da classe Catalog a instancia dos items, deste modo é possível desde logo adicionar ou remover os mesmos. Outros elementos que também não estão instanciados são o Validity e o Factory, pelo que aqui o reparo é o mesmo, contudo a decisão de inicializar estes elementos depende do modo como o developer os vai tratar, ou da definição das regras de negócio.

   38         public Catalog()

   39         {

   40             itemsField = new CatalogItems();

   41             validityField = new Validity();

   42             factoryField = "Sample";

   43         }

Além da ferramenta standard da Framework existem no mercado uma série de outras ferramentas para este mesmo efeito, uma delas pode inclusive ser obtida a partir da Microsoft, o seu nome é XSDObjectGen, é uma versão melhorada da ferramenta standard, mas uma rápida perquisa no Google por “xsd schema generator” vai retornar bastantes ferramentas.

A class utilizada neste exemplo para a serialização permitem gravar uma instancica de um objecto para um ficheiro xml, e criar uma instancia desse objecto a partir de um ficheiro xml.

    7     public static class FileSerializer

    8     {

    9         #region Public Methods

   10 

   11         /// <summary>

   12         /// Serializes the specified source.

   13         /// </summary>

   14         /// <param name="source">The source.</param>

   15         /// <param name="fileName">Name of the file.</param>

   16         public static void Serialize(object source, string fileName)

   17         {

   18             // Create the xml serializer, the serializer needs to know the type

   19             // of the object that will be serialized

   20             XmlSerializer xmlSerializer = new XmlSerializer(source.GetType());

   21 

   22             // Create a XmlTextWriter to write the xml object source, we are going

   23             // to define the encoding in the constructor

   24             using (XmlTextWriter writer = new XmlTextWriter(fileName, Settings.Encoding))

   25             {

   26                 // Save the state of the object into the stream

   27                 xmlSerializer.Serialize(writer, source);

   28                 // Flush the stream

   29                 writer.Flush();

   30             }

   31         }

   32 

   33         /// <summary>

   34         /// Deserializes the specified object string.

   35         /// </summary>

   36         /// <param name="fileName">Name of the file.</param>

   37         /// <param name="type">Type of the object.</param>

   38         /// <returns></returns>

   39         public static object Deserialize(string fileName, Type type)

   40         {

   41             // The object to be returned

   42             object source;

   43 

   44             using (XmlTextReader reader = new XmlTextReader(fileName))

   45             {

   46                 // Create the serializer, we must provide the object type to the constructor

   47                 XmlSerializer xmlSerializer = new XmlSerializer(type);

   48                 // Deserialize the object

   49                 source = xmlSerializer.Deserialize(reader);

   50             }

   51             // Return the new object

   52             return source;

   53         }

   54 

   55         #endregion

   56     }

O aspecto final é este:

De uma forma muito simples é possivel editar o conteúdo do objecto Catalog e dos seus items, gravar e abrir o ficheiro Xml resultante da serialização, ou seja podemos persistir o objecto para um ficheiro e recriar esse mesmo objecto a partir desse ficheiro gravado anteriormente. Esta técnica é particularmente útil para transferir um objecto, ou para por exemplo gravar o estado de um objecto depois de uma mensagem de erro, de modo a permitir a analise do seu conteúdo e o porquê desse erro, ao persistir o objecto para um ficheiro é ainda possível utilizar esse mesmo ficheiro num processo de integração recorrendo por exemplo ao Biztalk Server, mais uma vez a utilização da serialização depende apenas das necessidades e imaginação de cada um.

Posted por Pedro Rui Silva | with no comments
Filed under:

História das Linguagens de Programação

No site da O'Reilly está publicado um interessante poster em PDF (701K), que retrata os últimos 50 anos das linguagens de programação, intitulado "History of Programming Languages".

E em 50 anos muitas foram as que apareceram e desapareceram, na O'Reilly afirmam que as paredes deles não são suficientemente grandes para tanta história.

Links:
History of Programming Languages (PDF)
O'Reilly Post

Posted por Pedro Rui Silva | 2 comment(s)
Filed under:
Mais Entradas Página seguinte »