Category Archives: 1124

Actualização de post sobre "Comunicação de documentos de transporte à AT a partir da .NET Compact Framework "

Actualizei o meu post anterior sobre “Comunicação de documentos de transporte à AT a partir da .NET Compact Framework ” pois aquando da sua publicação não me apercebi que para funcionar era necessário instalar previamente os certificados na Certificate Store do PDA, que era precisamente o que eu queria evitar. A nova versão do código e o novo componente utilizado permitem concluír com sucesso o processo de comunicação de documentos de transporte à AT:


http://msmvps.com/blogs/albertosilva/archive/2013/04/09/comunica-231-227-o-de-documentos-de-transporte-224-at-a-partir-da-net-compact-framework.aspx

Comunicação de documentos de transporte à AT a partir da .NET Compact Framework [reactualizado a 2013/06/17]

(post revisto a 2013/06/17, alterado código exemplo e link para componente)


A partir de 1 de Maio, os documentos de transporte terão de ser comunicados previamente à AT, sendo uma das formas disponibilizadas e aquela que se afigura mais prática, a comunicação via webservices, que permite na resposta obter o código atribuío pela AT ao documento transmitido.


Com base na informação num tópico no Portugal-a-programar, comecei a semana passada um projecto de testes para validar se a comunicação em causa poderia ser feita directamente a partir da .NET Compact Framework, o que se afigurava difícil dadas as limitações da .NET CF a lidar com certificados, nomeadamente o carregamento de .pfx e a utilização de .cer para encriptar a informação. Depois de dias a investigar Platform Invokes para o efeito sem sucesso, e de ter confirmado que uma ou outra solução candidata não produzia resultados válidos quando comunicados aos serviços da AT, acabei por fazer aquilo que deveria ter feito em 1º lugar: procurar um componente de terceiros que fizesse o serviço, e assim no www.componentsource.com descobri um componente que, não sendo caro, resolve as duas limitações que tinha encontrado.


O seguinte método em C# devolve o resultado da chamada ao serviço:


public static string testa()
{
    string endpoint = “https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte”;
    string senhaCertificado = “xxxxxxxxxx”;

    string userPortal = “xxxxxxxxx/x”;
    string passwordPortal = “xxxxxxx”;


    string horaCriacaoCifrada;
    string senhaCifrada;
    string nonce;

    SBUtils.Unit.SetLicenseKey(colocar aqui a chave incluída no ficheiro C:\Program Files (x86)\EldoS\SecureBlackbox.NET\Assemblies\NET_CF20\LicenceKey.txt);

    String DataCriacao = DateTime.Now.ToUniversalTime().ToString(“yyyy-MM-ddTHH:mm:ss.ff”) + “Z”;

   
RijndaelManaged rijndaelCipher = new RijndaelManaged();
    rijndaelCipher.GenerateKey();
    rijndaelCipher.Mode = CipherMode.ECB;
    rijndaelCipher.Padding = PaddingMode.PKCS7;
    SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
    rijn.Key = rijndaelCipher.IV;
    rijn.IV = rijndaelCipher.IV;
    rijn.Mode = CipherMode.ECB;
    MemoryStream msPassFinancas = new MemoryStream();
    CryptoStream csPassFinancas = new CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
    using (StreamWriter swPassFinancas = new StreamWriter(csPassFinancas))
    {
        swPassFinancas.Write(passwordPortal);
    }
    MemoryStream msDataCriacao = new MemoryStream();
    CryptoStream csDataCriacao = new CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write);
    using (StreamWriter swDataCriacao = new StreamWriter(csDataCriacao))
    {
        swDataCriacao.Write(DataCriacao);
    }
    senhaCifrada = Convert.ToBase64String(msPassFinancas.ToArray());
    horaCriacaoCifrada = Convert.ToBase64String(msDataCriacao.ToArray());
    RSACryptoServiceProvider AlgRSA = new RSACryptoServiceProvider();

    byte[] rsaModulus = null;
    byte[] rsaPublicKey = null;
    using (TElX509Certificate x509tt = new TElX509Certificate(null))
    {
        //carregar certificado a parir de array de bytes previamente preenchido
        x509tt.LoadFromBufferAuto(_publicCertificate, 0, _publicCertificate.Length,“”);
        int rsaModulusSize = 0;
        int rsaPublicKeySize = 0;
        x509tt.GetRSAParams(ref rsaModulus, ref rsaModulusSize, ref rsaPublicKey, ref rsaPublicKeySize);
        rsaModulus = new byte[rsaModulusSize];
        rsaPublicKey = new byte[rsaPublicKeySize];
        x509tt.GetRSAParams(ref rsaModulus, ref rsaModulusSize, ref rsaPublicKey, ref rsaPublicKeySize);
    }

    RSAParameters rsaP = new RSAParameters()
    {
        Modulus = rsaModulus,
        Exponent = rsaPublicKey
    };
    AlgRSA.ImportParameters(rsaP);
    Byte[] Chave = AlgRSA.Encrypt(rijn.Key, false);
    nonce = Convert.ToBase64String(Chave);

    StringBuilder sb = new StringBuilder();
    sb.Append(“<?xml version=\”1.0\” encoding=\”UTF-8\”?>”);
    sb.Append(“<S:Envelope xmlns:wss=\”http://schemas.xmlsoap.org/ws/2002/12/secext\” xmlns:ns2=\”https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/\” xmlns:S=\”http://schemas.xmlsoap.org/soap/envelope/\”>”);
    sb.Append(“<S:Header>”);
    sb.Append(“<wss:Security>”);
    sb.Append(“<wss:UsernameToken>”);
    sb.AppendFormat(“<wss:Username>{0}</wss:Username>”, userPortal);
    sb.AppendFormat(“<wss:Password>{0}</wss:Password>”, senhaCifrada);
    sb.AppendFormat(“<wss:Nonce>{0}</wss:Nonce>”, nonce);
    sb.AppendFormat(“<wss:Created>{0}</wss:Created>”, horaCriacaoCifrada);
    sb.Append(“</wss:UsernameToken>”);
    sb.Append(“</wss:Security>”);
    sb.Append(“</S:Header>”);
    sb.Append(“<S:Body>”);
   
sb.Append(“<ns2:envioDocumentoTransporteRequestElem>”);
    sb.Append(
    @”<TaxRegistrationNumber>xxxxxxxxx</TaxRegistrationNumber>
      <CompanyName>Empresa para teste Lda.</CompanyName>
      <CompanyAddress>
        <Addressdetail>Centro de Empresas de Taveiro</Addressdetail>
       
<City>Taveiro</City>
        <PostalCode>3045-123</PostalCode>
        <Country>PT</Country>
      </CompanyAddress>
      <DocumentNumber>GT AB/1</DocumentNumber>
      <MovementStatus>N</MovementStatus>
      <MovementDate>2013-05-30</MovementDate>
      <MovementType>GT</MovementType>
        <CustomerTaxID>999999990</CustomerTaxID>
    <CustomerAddress>
        <Addressdetail>Urb. Atras Sol Posto</Addressdetail>
        <City>Faro</City>
        <PostalCode>6000-123</PostalCode>
        <Country>PT</Country>
      </CustomerAddress>
      <CustomerName>Empresa Cliente, LDa.</CustomerName>
      <AddressTo>
        <Addressdetail>Urb. Atras Sol Posto</Addressdetail>
        <City>Faro</City>
        <PostalCode>6000-123</PostalCode>
        <Country>PT</Country>
      </AddressTo>
      <AddressFrom>
        <Addressdetail>Centro de Empresas de Taveiro</Addressdetail>
        <City>Taveiro</City>
        <PostalCode>3045-123</PostalCode>
        <Country>PT</Country>
      </AddressFrom>
      <MovementEndTime>2013-05-30T23:04:36.8111658+01:00</MovementEndTime>
      <MovementStartTime>2013-05-30T22:04:36.8101653+01:00</MovementStartTime>
      <VehicleID>00-AA-11</VehicleID>
      <Line>
        <ProductDescription>Ovos</ProductDescription>
        <Quantity>12</Quantity>
        <UnitOfMeasure>UN</UnitOfMeasure>
        <UnitPrice>0.25</UnitPrice>
      </Line>”
);
    sb.Append(“</ns2:envioDocumentoTransporteRequestElem>”);
    sb.Append(“</S:Body>”);
    sb.Append(“</S:Envelope>”);

    TElX509Certificate x509t = new TElX509Certificate(null);
    // carregar o certificado a partir de um array de bytes previamente preenchido
    x509t.LoadFromBufferPFX(_privateCertificate,senhaCertificado);

    TElHTTPSClient cli = new TElHTTPSClient();
    cli.OnCertificateValidate += new SBSSLCommon.TSBCertificateValidateEvent(cli_OnCertificateValidate);
    cli.RequestParameters.CustomHeaders.Add(“SOAPAction=https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/”);
    cli.RequestParameters.ContentType = “text/xml; charset=utf-8″;
    cli.RequestParameters.Accept = “text/xml”;

    TElMemoryCertStorage mc = new TElMemoryCertStorage();
    mc.Add(x509t, true); // client certificate
    cli.ClientCertStorage = mc;

    MemoryStream response = new MemoryStream();
    cli.OutputStream = response;

    byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString());

    cli.Post(endpoint, byteArray);
    response.Position = 0;

    StreamReader reader = new StreamReader(response);
    string responseFromServer = reader.ReadToEnd();
    reader.Close();
    return responseFromServer;
}

static void cli_OnCertificateValidate(object Sender, TElX509Certificate X509Certificate, ref bool Validate)

{

    Validate = true;

}


Com esta abordagem não necessário instalar os certificados na Certificate Store dos dispositivos.

Para compilar, será necessário adicionar uma referência às assemblies SecureBlackBox, SecureBlackBox.HTTP, SecureBlackBox.HTTPCommon, SecureBlackBox.SSL e SecureBlackBox.SSLCommon, instaladas na pasta C:\Program Files (x86)\EldoS\SecureBlackbox.NET\Assemblies\NET_CF20\ e mudar o valor da chave passada na chamada ao método SetLicenseKey. Ter em atenção as chaves no XML que reportam a datas, pois a hora início tem de ser posterior à hora actual, a hora fim quando fornecida tem de ser superior à hora início e suponho que a data do documento tenha que ser igual ou anterior à actual.

Divisão de inteiros em VB.net vs. C#

Imaginem a seguinte instrução em VB.net:

Dim x as integer = 5 / 20 * 100

E em C#:

int x = 5 / 20 * 100;

Seria de esperar que ambas atribuíssem o mesmo resultado a x, no entanto verifica-se que em VB.net é atribuído a x o valor esperado de 25, mas em C#, x fica com o valor zero.

A diferença de resultados resulta do C# reduzir de imediato o resultado da divisão 5 / 20 a um inteiro, de onde resulta o valor 0 que absorve a multiplicação por 100.

Se mudarmos em C# para:

int x = 5M / 20M * 100;

int y = 5 / 20M * 100;

int z = 5M / 20 * 100;

Qualquer uma das variáveis x, y e z fica com o valor 25. Da mesma forma, no seguinte caso…

int a = 5;

int b = 20;

int c = a / b * 100;

c fica de novo com o valor zero, será necessário algo como…

int c = (int)((decimal)a / b * 100);

…para que c fique com o valor esperado de 25.

Mais do que alimentar guerras VB.net/C#, espero que este post sirva para alertar deste comportamento que não podemos classificar de incorrecto por parte do C# mas que pode provocar resultados inesperados  e nem sempre fáceis de detectar…

Remoção de zeros não significativos em valores decimais em .NET

Quando utilizamos valores do tipo decimal que vêm do SQL Server, o nº de casas decimais definido no SQL Server acompanha o valor nas variáveis de tipo de dados Decimal, o que muitas vezes não é conveniente. Se é um facto que a formatação de valores numéricos para string permite dar conta desta situação, utilizando por exemplo a máscara de formatação 0.#####, hoje necessitei de remover os zeros não significativos à direita do ponto decimal de uma variável do tipo decimal. Como não encontrei feito aquilo que pretendia, criei o seguinte extension method:

public static decimal RemoveTraillingZeros(this decimal number)
{
    return decimal.Parse(number.ToString("0.#######", new System.Globalization.CultureInfo("en-US")), new System.Globalization.CultureInfo("en-US"));
}



A opção pela cultura en-US não influencia o resultado, o importante é que a conversão em string e de novo em decimal seja feita sobre a mesma cultura para evitar problemas… culturais!



Para quem necessitar de fazer a mesma operação mas a nível do SQL Server, há UDFs na internet que o permitem fazer.

Pergunta: Dúvidas sobre Windows Phone 7 e compatibilidade de aplicações antigas

Recebi a seguinte mensagem de um visitante deste blog, que espelha muitas das preocupações de empresas que desenvolvem para Windows Mobile, que tomo a liberdade de transcrever:

Com o lançamento do Windows Phone 7, tanto quanto tenho lido em blogs, o SQL SERVER COMPACT EDITION vai desaparecer certo? O meu problema é o seguinte, a empresa para a qual trabalho desenvolve software que usa bd em sql server ce, e é desenvolvido em VS 2005. A minha duvida é se voce sabe se o projecto será compativel no Windows Phone 7 ou se há alguma maneira de migrar, ou tendo em conta que o WP7 assenta em silverlight, a unica hipotese é desenvolver a solução de raiz??

A minha outra duvida é será que a Microsoft apesar de lançar o WP7, irá manter a venda de Windows Mobile 6.5 ? de modo a continuar a dar suporte e assistência às milhares de aplicações que existirão em todo o mundo?

Não sei se me pode ajudar, mas como sou leitor assíduo do seu blog, junto lhe envio as minhas preocupações, que de momento me causam grandes dores de cabeça :) Na expectativa que me possa transmitir alguma informação adicional

Começando pelo fim, o Windows Mobile 6.5 não morre! A Microsoft anunciou há meses – publiquei um post dobre o assunto na altura – o Windows Embedded Handheld como a nova incarnação do que actualmente conhecemos como Windows Mobile. Esse ‘novo’ sistema operativo, que a Motorola já começou a adoptar e que outros fabricantes adoptarão, tem já um roadmap conhecido, que prevê uma evolução futura baseada em CE 7.0, mantendo sempre compatibilidade com a .NET Compact Framework 3.5, o SQL Server CE 3.5, continuando para já a exigir o VS2008 para desenvolvimento. É um facto que os fabricantes mais ‘comerciais’ como a HTC não venham a adoptar este sistema operativo, mas por ex., com os preços dos novos Motorola ES400 a descer dos 600€, não há razão para as empresas não adoptarem equipamentos com fiabilidade e robustez acrescida face aos equipamentos de consumo.

Continuando no tema do desenvolvimento, as aplicações actualmente feitas para .NET CF 3.5 não correm de todo nos equipamentos Windows Phone 7. A boa notícia é que projectos bem estruturados em termos de separação de lógica de negócio, acesso a dados e apresentação facilitam a migração e/ou partilha de código entre projectos para as duas plataformas (nota: julgo que as class library a partilhar terão de ser desenvolvidas no VS2008 para .NET CF 3.5).

Para terminar, o SQL Server Compact Edition não desaparece! Para além de ter sido anunciado o seu suporte alargado do lado do PC, incluíndo suporte para projectos ASP.net, que não é o que interessa para a questão, o SQL Server Compact Edition estará presente nos Windows Phone 7, simplesmente não está acessível aos programadores nesta primeira versão do Windows Phone 7 e respectivas ferramentas de desenvolvimento. Desconhece-se qual a forma como será exposto, admitindo que venha a sê-lo.

Espero ter respondido ao autor da mensagem, qualquer questão pf. usem os comentários.

Processo de certificação de software de gestão e código-exemplo em VB.NET (full .NET Fx & .NET CF)

As empresas que produzem software de gestão estarão neste momento a par da necessidade de a partir de 1 de Janeiro de 2011 disponibilizarem aos seus clientes novas versões das suas aplicações que implementem os requisitos necessários à chamada ‘certificação de software’. O mecanismo a implementar passa por no momento da gravação de um documento criar um hash a partir das suas características, baseado num certificado asimétrico, que garantirá que nenhum dos elementos importantes do documento é editado depois de emitido.

A moving2u, apesar de não criar software de gestão na perspectiva ‘stand alone’, dado que a nossa solução de mobilidade para PDAs integra sempre com um sistema de gestão de terceiros (actualmente contempla Primavera, PHC, Eticadata, SAP Business One, Gexor, entre outros), também é visada por este processo de certificação. Assim sendo, no sentido de garantir a legalidade da sua utilização por parte dos nossos clientes visados por essa regulamentação, encetámos os passos necessários ao seu cumprimento, no sentido de disponibilizar até ao final do ano uma nova versão que assine cada um dos documentos legais com o referido hash, que imprima a informação requerida pela portaria e que permita gerar o ficheiro SAFT-PT, que até agora era sempre emitido pelo sistema onde os documentos eram integrados.

Para o processo da assinatura em si, passo a descrever os passos necessários para a geração do hash em aplicações .NET:

- descarregar o OpenSSL para Windows para criar as chaves privada e pública e gerar um hash para teste

http://www.shininglightpro.com/products/Win32OpenSSL.html

- descarregar o OpenSSLKey para poder converter a chave privada no formato PEM no formato XML

http://www.jensign.com/opensslkey/ (link no final da página)

- criar a chave privada

openssl genrsa -out MinhaChavePrivada.pem 1024

- criar a chave pública a aprtir da chave privada

openssl rsa -in MinhaChavePrivada.pem -out MinhaChavePublica.pem -outform PEM -pubout

- exportar a chave privada de ‘pem’ para ‘xml’

Correr o opensslkey, indicar o caminho do ficheiro PEM, na consola obtem-se entre outras coisas a chave privada em formato XML, copiar essa parte para um ficheiro .XML

- gerar um hash utilizando o openSSL para testar. Ter em conta que o Windows acrescenta um CR+LF ao echo, pelo que o valor obtido será sempre diferente do que as finanças obteriam para a mesma string

echo 2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12; | openssl dgst -sha1 -sign MinhaChavePrivada.pem | openssl enc -base64 –A

- gerar um hash utilizando o openSSL para testar. Criar um ficheiro string.txt com o conteúdo da string a encriptar, sem linefeed no final!

copy con string.txt<ENTER>
2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12; <CTRL-Z><ENTER>

…e utilizar o seguinte comando

openssl dgst -sha1 -sign MinhaChavePrivada.pem string.txt| openssl enc -base64 –A

- código em VB.net (adicionar referência ao System.Security.Cryptography):

Imports System.Security.Cryptography
Imports System.Text

Module Module1

    Sub Main()
        ' descomentar o vbCrLf caso se pretenda obter um hash comparável com o obtido com o openssl em Windows 


        Dim stringToHash As String = "2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12; " ' + vbCrLf 


        Using privatekey As RSACryptoServiceProvider = New RSACryptoServiceProvider

            Dim privateKeyXML As String = System.IO.File.ReadAllText("C:\Trabalho\OpenSSL-Win64\bin\MinhaChavePrivada.xml")

            privatekey.FromXmlString(privateKeyXML)

            Dim buffer As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(stringToHash)
            Dim signature As Byte() = privatekey.SignData(buffer, "SHA1")

            Console.WriteLine(Convert.ToBase64String(signature))
        End Using
    End Sub
End Module


- A .NET CompactFramework 3.5 não suporta o método FromXmlString pelo que é preciso instanciar um objecto do tipo RSAParameters e preenchê-lo ‘manualmente’ (adicionar referências ao System.Xml e System.Xml.Linq):



Imports System.Security.Cryptography
Imports System.Text

Module Module1

    Sub Main()
        ' descomentar o vbCrLf caso se pretenda obter um hash comparável com o obtido com o openssl em Windows 


        Dim stringToHash As String = "2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12; " ' + vbCrLf 


        Using privatekey As RSACryptoServiceProvider = New RSACryptoServiceProvider
            Dim privateKeyXML As String = "..." ' carregar o xml da chave privada para esta string
            Dim xe As XElement
            xe = XElement.Load(privateKeyXML)

            Dim rsaP As RSAParameters = New RSAParameters() With {.Modulus = Convert.FromBase64String(xe.Element("Modulus").Value), _
                                                      .Exponent = Convert.FromBase64String(xe.Element("Exponent").Value), _
                                                      .P = Convert.FromBase64String(xe.Element("P").Value), _
                                                      .Q = Convert.FromBase64String(xe.Element("Q").Value), _
                                                      .DP = Convert.FromBase64String(xe.Element("DP").Value), _
                                                      .DQ = Convert.FromBase64String(xe.Element("DQ").Value), _
                                                      .InverseQ = Convert.FromBase64String(xe.Element("InverseQ").Value), _
                                                      .D = Convert.FromBase64String(xe.Element("D").Value)}
            privatekey.ImportParameters(rsaP)

            Dim buffer As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(stringToHash)
            Dim signature As Byte() = privatekey.SignData(buffer, "SHA1")

            Debug.WriteLine(Convert.ToBase64String(signature))
        End Using
    End Sub
End Module


Actualizado em 2010/09/08 para usar um ficheiro com a string da qual queremos gerar o hash sem o problema do Echo em Windows. Outra alternativa é utilizar um comando Echo portado do equivalente em Unix e que com o switch –n não gera o linefeed.



Todos os processos e o código apresentados servem apenas para exemplificar a forma de obtenção do hash do documento, sem ter em conta regras de boas práticas de desenvolvimento, performance ou segurança, não devendo ser considerado para produção. Obviamente serão declinadas quaisquer reclamações sobre a utilização do mesmo.



Ideias para o seu desenvolvimento foi obtido a partir do fórum ‘Portugal a Programar’ http://www.portugal-a-programar.org/forum/index.php/topic,48555.15.html onde sugiro que sejam discutidas questões relacionadas com este tópico



Este post não tem como objectivo defender ou criticar o processo da certificação de software, pelo que todos os comentários nesse sentido não serão publicados.

O Windows Mobile 6.5 condenado? Claro que não, digam olá ao Windows Embedded Handheld!

Desde o anúncio do Windows Phone 7 no MWC em Barcelona e depois no MIX em Las Vegas que muitos profetas condenaram à morte o Windows Mobile, quase a um ano do lançamento do Windows Phone 7. A verdade é que no mesmo MWC tinham sido divulgados novos equipamentos, como o HTC HD Mini, e desde então foram divulgados outros, como o Sony com teclado frontal e a semana passada dois novos equipamentos da Samsung. A par desses lançamentos, a Microsoft assegurou que não tiraria o tapete ao WM, que internamente passou da àrea de consumo para a àrea de embedded, mais ligada às soluções para profissionais. Paralelamente, por aquilo que se ia sabendo do WP7 em termos do modelo de sitribuição de aplicações, restrições para programadores e requisitos de hardware, não parecia fazer sentido que fabricantes de equipamentos profissionais, como o a Motorola, viessem a substituír comercialmente os equipamentos actuais e que continua a lançar por equipamentos com o Windows Phone 7, tal como não fazia sentido que a Microsoft se desse ao luxo de desprezar o mercado desse tipo de equipamentos, onde reina incontestavelmente, e dos ISV que desenvolvem aplicações profissionais para as suas plataformas móveis.

Esse era o ponto de situação aquando do TechDays, que serviu de base a algumas conversas interessantes com algumas pessoas que assistiram à minha sessão e nos ‘corredores’.

Esta semana chega o anúncio do ‘Windows Embedded Handheld’, que na prática no seu lançamento será na sua essência o Windows Mobile 6.5 que conhecemos, com as ferramentas de desenvolvimento actuais, presumo. Este lançamento, mais do que um ‘marco tecnológico’, confirma a aposta da Microsoft em continuar a disponibilizar e melhorar a melhor plataforma móvel para aplicações profissionais e que conta com as ferramentas de desenvolvimento mais produtivas, que no próximo ano conhecerá uma nova versão já com o Windows CE 7, agora chamado Windows Embedded Compact 7, com suporte por parte do VS2010.

Podem ler mais sobre este lançamento nos seguintes links e também sobre o equipamento anunciado pela Motorola que estreará já no Outono este novo sistema operativo. Logo que tenha acesso a um equipamento desses, partilharei a informação.

Microsoft Outlines Commitment to the Future of Enterprise Handheld Devices
http://robtiffany.com/uncategorized/microsoft-outlines-commitment-to-the-future-of-enterprise-handheld-devices

Microsoft spins new OS at Motorola’s handheld launch
http://www.windowsfordevices.com/c/a/News/Microsoft-Windows-Embedded-Handheld-and-Motorola-ES400-EDA

Microsoft Announces New Mobile Operating System for Enterprise Customers
http://windowsphonethoughts.com/news/show/98514/microsoft-announces-new-mobile-operating-system-for-enterprise-customers.html

Motorola ES400 Enterprise Digital Assistant (EDA) Press Kit
http://mediacenter.motorola.com/content/detail.aspx?ReleaseID=12940&NewsAreaId=17

SQL Server Compact 3.5 SP2: Activação do SqlCeChangeTracking

No desenvolvimento de aplicações para mobilidade que dependam de dados está sempre subjacente a questão de como transportar os dados entre o equipamento e um servidor, e se vale a pena investir num mecanismo de sincronização diferencial.

Este post não pretende comparar alternativas à questão da sincronização de dados, simplesmente divulgar uma funcionalidade exposta pelo SQL Server Compact 3.5 SP2, a possibilidade de ligar o tracking de alterações num SDF. Essa funcionalidade, apesar de divulgadas nos ‘what’s new’ associados ao lançamento deste SP2, não mereceu muita mais atenção em termos de documentação de como usá-la, pelo que a seguinte thread pode ser muito importante para quem se quiser debruçar sobre o tema:

Help with SqlCeChangeTracking
http://stackoverflow.com/questions/2834542/help-with-sqlcechangetracking

A solução poderá ser, depois de activar o SqlCeChangeTracking, fechar e voltar a abrir a ligação para que o mecanismo de tracking de alterações se torne efectivo.

Desta vez é a sério?! Se domina o SL, é um programador de Windows Phone 7!

Ando já há algum tempo para dissertar sobre esta questão, mas o tempo tem escasseado, por isso cá vão os links sem (muita) dissertação. Desde que a Microsoft lançou o Windows CE, nos últimos anos do milénio passado, que tem tentado atraír programadores com o argumento que, se programa para a tecnologia em voga no momento, então é um ‘programador mobile’. Aconteceu com o C++ (com os add-on para VC++ 5.0 e 6.0 e o eVC++), com o VB (add-on para VB5 e VB6 e eVB), com o .NET e agora com o Silverlight. Se é um facto que muitos programadores que dominam determinada tecnologia no mundo dos desktops, servers ou web se revelam verdadeiras ‘Susan Boyles’ nos projectos que encetam no campo da mobilidade, a verdade é que muitos outros ou desistem, ou entregam produtos que tirando o facto de ‘até correrem’ num equipamento móvel, ficam a dever muito em questões como performance e usabilidade. A realidade, nua e crua, é que quando nos desktops/servidores não temos restrições (se é preciso mais espaço, compram-se mais discos, mais performance? compra-se CPU, mais memória? adiciona-se RAM, mais largura de banda? passa-se a Gb, fibra óptica, aumenta-se o contrato do ISP, mais resolução? muda-se a placa gráfica e o ecrã, etc., etc.), o desenvolvimento para mobile, não interessa a tecnologia ou a plataforma, é feito da gestão das restrições (CPU, memória, armazenamento, presença de conectividade e largura de banda, tamanho e resolução de ecrã, meios de input, …), pelo que mais do que do domínio de determinada tecnologia, o desenvolvimento para mobilidade depende da sensibilidade para que contornando as limitações, apresentar uma solução ao utilizador que o mesmo adopte.

Este tema volta agora à baila com o Silverlight e o Windows Phone 7. Não me interpretem mal, experimentem o emulador e as ferramentas que a MS libertou, usem da criatividade para desenvolver aplicações para o novo sistema operativo, mas, antes de colocarem-nas nos MarketPlaces ou se comprometerem com um cliente ou departamento nas V/ empresas para o desenvolvimento de uma solução mobile, validem que de facto já atingiram ‘o ponto’ em que desenvolvem aplicações para o utilizador final e não meras ‘guitarradas’ de tecnologia!

 

Estes dois links espelham aquilo que tento transmitir:

You Already Are A Windows Phone 7 Programmer
http://jesseliberty.com/2010/05/20/you-already-are-a-windows-phone-7-programmer/

This Time Its Different…
http://www.bolingconsulting.com/blog/