MSMVPS.COM

The Ultimate Destination for Blogs by Current and Former Microsoft Most Valuable Professionals.
Welcome to MSMVPS.COM Sign in | Help
in Search

Alberto Silva

Um blog sobre mobilidade, desenvolvimento para plataformas Windows Mobile e os obrigatórios Off-topic!
  • Boas Festas...

    ...são os meus votos para todos aqueles que acompanham este blog!!!

  • Internet Explorer Mobile 6

    A Microsoft anunciou em Novembro o novo Internet Explorer Mobile 6, que como o seu nome indica, é uma versão do Internet Explorer para Windows Mobile baseada no motor do IE 6.0.

    Esta nova versão do Internet Explorer deverá surgir em alguns novos equipamentos durante 2009, ou em equipamentos para os quais os respectivos fabricantes decidam disponibilizar novas roms, não sendo possível a sua instalação pelo utilizador final nos seus equipamentos. Esse é mesmo o único inconveniente deste novo Internet Explorer 6 Mobile, e experimentá-lo torna ainda mais difícil encarar essa impossibilidade!

    Entre as novas funcionalidades destacam-se:

    • Suporte para WML
    • Experiência melhorada de visualização e navegação, em equipamentos com e sem ecrã táctil
    • Inclusão opcional do Adobe Flash Lite 3.1 (opção a cargo do fabricante)
    • Optimizações de formatação de páginas para ecrãs de equipamentos móveis
    • Suporte melhorado a diversos standards
    • Suporte para AJAX e scripting

    A partir do seguinte link podem descarregar emuladores Windows Mobile Professional e Standard em diferentes resoluções com o Internet Explorer Mobile 6, a partir dos quais podem testá-lo:

    Windows Mobile 6.1.4 Emulator Images
    http://www.microsoft.com/downloads/details.aspx?FamilyId=1A7A6B52-F89E-4354-84CE-5D19C204498A&displaylang=en

    Pessoalmente sugiro que para simularem uma ligação do emulador à internet, a partir do Device Emulator escolham a opção 'Craddle' do emulador em execução, para que o ActiveSync/WMDC reconheçam o emulador e partilhe a ligação à internet do host com o emulador (se tiverem dificuldade em conseguirem a ligação, deixem comentário)

    Ao experimentarem o novo browser poderão constatar que tem 2 modos de visualização, 'Mobile Device' para conteúdos optimizados para equipamentos móveis, e 'Desktop' para dispensar essas optimizações, obtendo-se uma visualização com grande fidelidade daquilo que o Internet Explorer para Windows disponibiliza. Neste modo podem fazer diversas experiências, como aceder à versão desktop do site de home banking do V/ banco (testei com sucesso o site da CGD, com introdução de credenciais de login no teclado flutuante), ver videos do YouTube e consultar outros sites cuja visualização até agora era penosa em Windows Mobile. Tendo experimentado o Opera que vinha com os Samsung i780 e HTC x7500, tenho a dizer que este novo IEm6 providencia uma experiência de navegação muito mais agradável e mais capaz que o Opera.

    Para saber mais sobre o novo IEm6, seja sobre as novas funcionalidades, seja sobre como tirar partido do mesmo na óptica do desenvolvimento de websites optimizados para equipamentos móveis, podem consultar o seguinte documento:

    Internet Explorer 6 Mobile
    http://download.microsoft.com/download/8/c/c/8cc611e7-ec6b-49ee-af4a-415559d53262/Internet%20Explorer%20Mobile%206.pdf

    Nesse documento descobrem por ex. que o seguinte HTML permite que um determinado link quando clicado despolete uma chamada telefónica para o nº indicado:

    <a href=“tel:123-5309”>Jenny</a>

    E ainda que tal como indicado neste post do Mark Arteaga, de onde copiei as imagens, para identificarem o novo IEm6 a partir das V/ aplicações web, basta atentarem ao conteúdo das user agent strings enviadas pelo browser:

    Modo 'Mobile Device': Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 8.12; MSIE Mobile 6.0)

    Modo 'Desktop': Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

    Digitando about:version na barra de endreço obterão o conteúdo de uma ou outra das imagens apresentadas consoante o modo de visualização:

       iem6_device       iem6_desktop

  • Gestão de forms em aplicações .NET CF (3.5)

    Foi atribuída à moving2u a tarefa de 'simples' conversão de uma solução em .NET CF 1.0 para .NET CF 3.5, entre outras alterações, como suporte a diferentes resoluções e orientações de ecrã, passar a utilizar bases de daods SQL Compact localmente no PDA e suporte a impressão em impressoras portáteis A4 da HP.

    Ao correr a nova aplicação nos novos equipamentos da HTC os utilizadores com frequência 'perdiam-se', pois ao invocar o 'task manager' da HTC, surgiam várias 'instâncias' activas da aplicação. Tal comportamento, completamente oposto ao que deve ser uma aplicação .NET CF bem comportada, derivava da forma como os forms eram geridos por quem desenvolveu a versão inicial.

    Numa aplicação em que a navegação entre forms fosse 'explícita', ou seja, em que cada form antes de fechar-se abre sempre explicitamente outro form, assegurando-se que a cada momento há apenas um form activo, este problema não se colocaria, mas neste caso a 'retro-navegação' era implícita dado que os forms eram sempre exibidos com o método .ShowDialog() e fechado com o .Close(), a 'pilha' de forms activos era exibida no task manager.

    Para contrariar esse comportamento, impõem-se algumas regras, a mais simples das quais indica que para uma instância de um form activo não constar na lista de programas em execução, deve colocar-se o respectivo título (propriedade .Text do form) a vazio. Para não ter de a cada chamada guardar o texto do título do form chamador, limpá-lo, exibir o novo form e ao fechá-lo repor o título no form chamador, criei o seguinte extenseion method:

     

        public static class FormExtensionMethods
    
        {
    
            public static System.Windows.Forms.DialogResult ExibeDialogo(this System.Windows.Forms.Form newForm, System.Windows.Forms.Form currentForm)
    
            {
    
                string s = currentForm.Text;
    
                currentForm.Text = "";
    
                System.Windows.Forms.DialogResult r = newForm.ShowDialog();
    
                currentForm.Text = s;
    
                currentForm.Show();
    
                currentForm.BringToFront();
    
                return r;
    
            }
    
        }

    Deste modo, bastou-me mudar as chamadas do tipo myForm.ShowDialog() por myForm.ExibeDialogo(this) para atingir o fim desejado :)

  • Como ir mais além em termos gráficos com a .NET CF 3.5?

    A avaliação da apresentação gráfica nas aplicações é algo sempre subjectivo, mas é uma evidência que numa altura em que a nível das aplicações para desktop os programadores têm neste momento excelentes ferramentas e tecnologias para darem largas à criatividade dos designers, do lado do Windows Mobile as coisas ainda não são bem assim, continando em termos de código managed basicamente restritos ao que a .NET CF expõe.

    No entanto, o João Paulo Figueira acabou de me chamar a atenção para este artigo que demonstra como ir com a .NET CF 3.5 bastante mais além em termos de apresentação gráficado que aquilo que habitualmente fazemos:

    Building Graphically Advanced Applications with the .NET Compact Framework 3.5
    http://expression.microsoft.com/en-us/dd279543.aspx

    É claro que vai continuar a sobrar sempre espaço para a subjectividade, mas é inegável o nível do apuro gráfico conseguido com os exemplos do artigo:

  • Lançamento de livro em Português sobre desenvolvimento para .NET CF & WM 6

    O Ricardo Queirós acabou de ver publicado pela FCA o seu livro "Programação para Dispositivos Móveis em Windows Mobile 6 - Curso Completo", que como o título deixa adivinhar, se destina aqueles que pretendem iniciar ou consolidar os seus conhecimentos de desenvolvimento para a plataforma Windows Mobile. Apesar do título referir explicitamente o Windows Mobile 6, a generalidade dos conteúdos também se aplica a versões anteriores, embora conte com um capítulo exclusivamente dedicado às funcionalidades expostas pelo SDK do Windows Mobile 6.

    CAPA[1]

    Dos tópicos abordados no livro que já será possível encontrar nas livrarias destacam-se:

    • Introdução ao Windows Mobile
    • Plataforma Microsoft .Net
    • A Minha Primeira Aplicação Mobile
    • Programação Orientada aos Objectos
    • Visual Studio e o Desenho de Interfaces
    • Teste, Debugging e Gestão de Erros
    • Empacotamento, Distribuição e Instalação
    • Persistência de Dados
    • Tópicos Avançados
    • Usando o SDK Windows Mobile 6
  • A arquitectura MVC aplicada à .NET Compact Framework 3.5

    Nestas coisas das teorias sobre a melhor forma de separar as diferentes camadas de uma aplicação, há dois modelos que se destacam, o MVP e o MVC

    Com a Mobile Client Software Factory, infelizmente descontinuada, uma das factory disponibilizadas dizia respeito ao modelo CAB, Composite Application Block, que seguia as linhas orientadoras do modelo MVP, mas cuja implementação não conquistou muitos seguidores, dada a elevada dificuldade de implementação e penalização na performance das aplicações que a implementavam.

    Do modelo MVC não havia até agora que eu tivesse conhecimento nada dedicado ao assunto que se aplicasse à .NET Compact Framework, até que o Alex Yakhnin se lembrou de criar uma MVC Framework para .NET CF, e publicou uma série de 4 artigos introdutórios à mesma partindo de uma aplicação com funcionalidades de login, pesquisa e apresentação dos detalhes do item seleccionado...

    Mobile MVC framework (part 1) - O ecrã de login

    Mobile MVC framework (part 2) - O ecrã de pesquisa

    Mobile MVC framework (part 3) - idem, mas comunicando com eventos

    Mobile MVC framework (part 4) - A apresentação dos detalhes, passando informação entre controladores

    ...que culminaram com a disponibilização no CodePlex:

    Mobile MVC Framework

  • Chat online sobre desenvolvimento para Windows Mobile a começar...

    ...dentro de 2 minutos! Desculpem o aviso tardio, a sessão deve durar cerca de uma hora durante a qual se tiverem alguma questão que não se sintam confortáveis a colocar em inglês, poderão colocá-la em Português e eu tentarei encaminhá-la.

    Adicionalmente poderão usar os comentários a este post para colocar questões que não tenham visto respondidas na sessão.

    O link para o chat é...

    www.microsoft.com/communities/chats/chatrooms/msdn.aspx

    ...e terão como anfitriões funcionários da Microsoft e MVPs.

    [Actualização]

    Devido a um pormenor na parametrização do chat, o mesmo está a requerer erradamente uma password. Até que o problema seja ultrapassado, o chat não terá lugar e é possível que venha a ser adiado.

  • Columbus V900 - GPS Logger com capacidade para gravação de tags de voz

    Há alguns anos comprei um GPS Bluetooth, o Royaltek RBT3000, que tinha uma característica ímpar, a possibilidade de gravar autonomamente os percursos efectuados de acordo com uma parametrização em termos de tempo ou distância percorrida. Esta caracterísitca permite que nalguns tipos de actividades, como TT ou BTT, não nos preocuparmos em termos de andar com um PDA a gravar o track, pois com um GPS deste tipo podemos recuperá-lo a partir do próprio GPS mais tarde. Adicionalmente para os aficcionados da fotografia, um GPS deste tipo com um software como o GPicSync permitem a posteriori georeferenciar as fotos tiradas, cruzando a hora que foram tiradas com a última posição conhecida naquele momento no GPS.

    Nestes anos foram aparecendo novos GPS deste tipo, alguns já com SIRF III, mas um destacava-se por permitir ajustar os respectivos parâmetros de funcionamento a partir do próprio equipamento, passou a estar debaixo de olho, mas eis senão quando surge algo de realmente diferente: um logger bluetooth com uma tecla para marcar waypoints e possibilidade de associação de uma tag de voz ao waypoint!!! Confesso que gostaria de saber como é que isto funcionará antes de comprar um, mas se bem me conheço, acho que vou perder a cabeça...

    Columbus V-900

    Custa perto de 100usd no BuyGpsNow.

  • Parabéns à moving2u!

    Faz hoje 5 anos, nascia em Coimbra a moving2u, empresa da qual sou sócio desde a sua criação. Tal como o seu nome deixa adivinhar, a empresa nasceu com o objectivo de desenvolver e comercializar soluções de mobilidade para profissionais, objectivo ao qual se manteve inteiramente fiel ao longo destes 5 anos, e pelo qual é cada vez mais reconhecida. Nestes 5 anos conquistámos importantes clientes em diversas àreas de negócio, estabelecemos parcerias com várias empresas responsáveis pela implementação, distribuição e desenvolvimento de software de gestão/ERPs, e vimos reconhecido o nosso trabalho por algumas empresas de referência, como a Motorola/Symbol ou a Microsoft, da qual somos 'Certified Partner - Mobility Solutions', e muito importante, criámos laços de amizade com muitas pessoas.

    Desde o primeiro momento que decidimos apostar na plataforma Windows Mobile/CE, quando os equipamentos com este sistema operativo ainda não se tinham afirmado no mercado profissional em Portugal, estratégia que se revelou compensadora pois hoje a plataforma Windows Mobile conjugada com as ferramentas de desenvolvimento e outras tecnologias da Microsoft é de longe a escolha mais 'produtiva' e que melhores aplicações permite desenvolver para terminais móveis.

    Se é do desenvolvimento das minhas funções - responsável de R&D - que 'nascem' muitas das experiências que partilho neste blog, nos fórums ou nas sessões que apresento, também é por causa das mesmas funções que a minha disponibilidade para manter o blog actualizado ou propor-me a outras iniciativas tem vindo a ser muito reduzida, esperando-se que o volume de trabalho se mantenha ao longo dos próximos tempos.

    Saúde e longa vida à moving2u, seus colaboradores e amigos!!!

  • Parser para CFFaultExceptions

    Estou envolvido num projecto assente em .NET CF 3.5, onde utilizamos WCF sobre HTTP para recuperar informação de um servidor.

    Se é verdade que a .NET CF 3.5 traz suporte a este novo modelo de comunicações, esse suporte é limitado, como podemos ver neste post do Andrew Arnott. Sendo suportado, quem já utilizou o WCF sobre HTTP para .NET CF, já se terá apercebido que esse suporte não é totalmente 'nativo', pois ao contrário do que acontece na full framework, para além das classes proxy, é sempre criado um ficheiro chamado CFClientBase.cs ou .vb, onde se baseia muito do suporte a WCF sobre HTTP pela .NET CF.

    A limitação desse suporte chega ao ponto das FaultExcpetions, neste caso, CFFaultException, não serem expostas detalhadas. Se por exemplo tivermos uma chamada a um serviço dentro de um bloco Try/Catch, e este despoletar uma CFFaultException:

    Try
    
        ...
    
    Catch ex as CFFaultException
    
        MsgBox(ex.Message)
    
    End Try
    

    O que obtemos na message box, é uma mensagem <not> muito </not> explícita: "CFFaultException".

    Ao inspeccionar o objecto ex, chegamos a uma propriedade FaultString, do tipo string, onde encontramos um documento XML bem formado, e lá no meio, encontramos a causa da excepção. Esta inspecção visual até serve em ambiente de desenvolvimento, mas é importante poder recuperar essa informação programaticamente, pelo que se impõe um parser para este XML. Uma pesquisa com o Google a CFFaultException parser não produz resultados, colocando apenas CFFaultException, lá aparece uma página em italiano de um MVP, Andrea Boschin. Os meus conhecimentos da língua da Monica Bellucci são muito limitados - da língua da Monica em si, nulos mesmo - mas lá consegui chegar à conclusão que o tópico era o que me interessava - neste caso, a CFFaultException, não a Monica - ou seja, um parser para a CFFaultException em C#. Como este projecto está a ser desenvolvido em VB.net, recorri ao meu tradutor preferido de C# para VB.net, e completei o serviço corrigindo um ou outro erro:

    Imports System.Text
    
    Imports System.Xml.Serialization
    
    Imports System.IO
    
    Imports System.ServiceModel
    
        <XmlRoot("Fault", Namespace:="http://schemas.xmlsoap.org/soap/envelope/")> _
    
    Public Class ServiceFault
    
            Private _faultCode, _faultString As String
    
            Private _detail As List(Of ServiceFaultDetail)
    
            Public Shared Empty As ServiceFault = New ServiceFault
    
            Public Sub New()
    
                MyBase.New()
    
                Me.Detail = New List(Of ServiceFaultDetail)
    
            End Sub
    
            <XmlElement("faultcode", Namespace:="")> _
    
            Public Property FaultCode() As String
    
                Get
    
                    Return _faultCode
    
                End Get
    
                Set(ByVal value As String)
    
                    _faultCode = value
    
                End Set
    
            End Property
    
            <XmlElement("faultstring", Namespace:="")> _
    
            Public Property FaultString() As String
    
                Get
    
                    Return _faultString
    
                End Get
    
                Set(ByVal value As String)
    
                    _faultString = value
    
                End Set
    
            End Property
    
            <XmlArray("detail", Namespace:=""), _
    
             XmlArrayItem(GetType(ServiceFaultDetail), Namespace:="http://schemas.datacontract.org/2004/07/System.ServiceModel")> _
    
            Public Property Detail() As List(Of ServiceFaultDetail)
    
                Get
    
                    Return _detail
    
                End Get
    
                Set(ByVal value As List(Of ServiceFaultDetail))
    
                    _detail = value
    
                End Set
    
            End Property
    
        End Class
    
        <XmlType(TypeName:="ExceptionDetail")> _
    
        Public Class ServiceFaultDetail
    
            Private _message, _stackTrace, _type As String
    
            Public Sub New()
    
                MyBase.New()
    
            End Sub
    
            <XmlElement("Message", Namespace:="http://schemas.datacontract.org/2004/07/System.ServiceModel")> _
    
            Public Property Message() As String
    
                Get
    
                    Return _message
    
                End Get
    
                Set(ByVal value As String)
    
                    _message = value
    
                End Set
    
            End Property
    
            <XmlElement("StackTrace", Namespace:="http://schemas.datacontract.org/2004/07/System.ServiceModel")> _
    
            Public Property StackTrace() As String
    
                Get
    
                    Return _stackTrace
    
                End Get
    
                Set(ByVal value As String)
    
                    _stackTrace = value
    
                End Set
    
            End Property
    
            <XmlElement("Type", Namespace:="http://schemas.datacontract.org/2004/07/System.ServiceModel")> _
    
            Public Property Type() As String
    
                Get
    
                    Return _type
    
                End Get
    
                Set(ByVal value As String)
    
                    _type = value
    
                End Set
    
            End Property
    
        End Class
    
        Public Class FaultSerializer
    
            ''' <summary>
    
            ''' Deserializes the specified fault.
    
            ''' </summary>
    
            ''' <param name="fault">The fault.</param>
    
            ''' <returns></returns>
    
            Public Shared Function Deserialize(ByVal fault As CFFaultException) As ServiceFault
    
                If (fault Is Nothing) Then
    
                    Throw New ArgumentNullException("fault", "fault cannot be null")
    
                End If
    
                If String.IsNullOrEmpty(fault.FaultMessage) Then
    
                    Return ServiceFault.Empty
    
                End If
    
                Dim xml As String = fault.FaultMessage
    
                Dim reader As StringReader = New StringReader(xml)
    
                Dim serializer As XmlSerializer = New XmlSerializer(GetType(ServiceFault), "http://schemas.xmlsoap.org/soap/envelope/")
    
                Return CType(serializer.Deserialize(reader), ServiceFault)
    
            End Function
    
            ''' <summary>
    
            ''' Serializes the specified fault.
    
            ''' </summary>
    
            ''' <param name="fault">The fault.</param>
    
            ''' <returns></returns>
    
            Public Shared Function Serialize(ByVal fault As ServiceFault) As String
    
                Dim builder As StringBuilder = New StringBuilder
    
                Dim writer As StringWriter = New StringWriter(builder)
    
                Dim ns As XmlSerializerNamespaces = New XmlSerializerNamespaces
    
                ns.Add("s", "http://schemas.xmlsoap.org/soap/envelope/")
    
                ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance")
    
                ns.Add("a", "http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher")
    
                Dim serializer As XmlSerializer = New XmlSerializer(fault.GetType, "http://schemas.xmlsoap.org/soap/envelope/")
    
                serializer.Serialize(writer, fault, ns)
    
                Return builder.ToString
    
            End Function
    
        End Class

    Assim, podemos mudar o nosso exemplo para mostrar, por ex., a propriedade .Message associada à excepção:

    Try
    
        ...
    
    Catch ex as CFFaultException
    
        MsgBox(FaultSerializer.Deserialize(ex).Detail(0).Message)
    
    End Try
    

    Os agradecimentos vão para o Andrea Boshcin!

     

    [Actualização]

    O seguinte extension method permite obter de imediato a mensagem associada à excepção:

            <Extension()> _
    
            Public Function ExceptionMessage(ByVal exception As CFFaultException) As String
    
                Return FaultSerializer.Deserialize(exception).FaultString
    
            End Function
    
            ...
    
            Try
    
                ...
    
            Catch ex as CFFaultException
    
                MsgBox(ex.ExceptionMessage)
    
            End Try
    
  • Performance does matter...

    Estava a persistir numa base de dados em SQL Compact 3.5 num equipamento Windows Mobile 2003SE cerca de 250 registos (40 colunas) numa tabela e 5700 registos noutra tabela (4 colunas), obtidos de um webservice. A operação estava a tomar cerca de 70 segundos para a 1ª tabela e 60 segundos para a 2ª, o que me pareceu tempo a mais, ainda que estivesse a utilizar comandos preparados, com os tipos de dados e respectivos comprimentos definidos para cada parâmetro.

    Fui fazendo umas alterações, removendo índices, 'foreign keys', mas as poucas melhorias não me convenciam, até que me lembrei de utilizar o SqlCeResultSet, sobre um comando do tipo TableDirect, e passei a inserir a mesma informação em... 10 SEGUNDOS, repartidos por um segundo e meio para os 250 registos e 8 segundos e meio para os 5700!!!

    Fica a dica!!!

  • SELECTs dentro de SELECTs em SQL Compact 3.5

    Uma das novidades do SQL Compact 3.5 sobre as versões anteriores, é a possibilidade de encadear SELECTs, mas de uma forma mais limitada que o SQL Server 2000/2005/2008.

    Hoje precisei de recuperar de uma tabela qual o registo imediatamente anterior/a seguir ao actual para navegar entre eles, sendo que os ID dos registos não era sequencial. Algo como:

    ID Nome
    1 Joaquim
    4 Manuel
    9 António
    12 Maria
    13 Josefina
    15 Etelvina
    18 Paulo
    23 Rui
    40 Teresa

    (tabela Nomes)

    Imaginando que estamos no registo 12, para obter o anterior no SQL Server poderia fazer algo como:

    SELECT id, nome
    FROM nomes
    WHERE id = (SELECT MAX(id) FROM nomes WHERE id < 12)

    Ao testar a instrução no SQL Compact, verifica-se que esta sintaxe não é suportada, então lembrei-me de experimentar de outra forma:

    SELECT id. nome
    FROM nomes INNER JOIN (SELECT MAX(id) qID FROM nomes WHERE id < 12) t
        ON nomes.id = t.qid

    E assim já funcionou :)

    [ACTUALIZAÇÃO]

    Dado que para o meu caso real a pesquisa estava a tomar perto de meio segundo, a que se juntava 0,3 segundos para recuperar o resto da informação e carregar a informação para o ecrã, parti a instrução em 2, o que permitiu ganhar perto de 0,2s. Convém testarem sempre caso-a-caso o que é mais eficiente, uma instrução única como acima, ou partirem-na em 2 para na 1ª recuperar o ID do nome anterior com um ExecuteScalar e depois na 2ª obter os dados do registo.

  • Com tanta performance bruta, a optimização ainda fará sentido?

    A Red Gate publica uma newsletter chamada Simple Talk, que no geral, tal como as ferramentas da Red Gate, versam temas ligados à administração e utilização de bases de dados em SQL Server e ao profiling the aplicações .NET

    Na última newsletter recebida esta semana, um tópico chamou a minha atenção...

    A título de minha introdução e comentário à minha provocação no título deste post, numa altura em que o armazenamento 'físico', a memória RAM, a capacidade de processamento e o desempenho das redes deixaram de ser consideradas limitações, na fase de preparação e de desenvolvimento propriamente dito de soluções tendemos a esquecer-nos da optimização de processos. Há pouco tempo um amigo ligado a uma importante empresa portuguesa ligada ao desenvolvimento de software de gestão comentava que uma funcionalidade recentemente acrescentada ao software demorava demasiado tempo a ser executada nos seus clientes. Quando questionado o programador que a implementou, o comentário foi que nos testes que tinha feito, 'aquilo' era rápido, mas depressa se chegou à conclusão que o volume de informação testado era muito inferior ao volume que alguns clientes tinham nas suas bases de dados. O processo, muito intensivo em termos de operações de bases de dados provavelmente não teria sido optimizado, lembremo-nos que há pessoas que ainda não usam a preparação de comandos SQL com parâmetros quando têm de repetir a mesma acção um nº variável de vezes com valores diferentes. Na nossa empresa, seja por razões de performance na preparação de comandos, segurança para evitar SQL injection e confiança no tratamento de valores numéricos e datas, usamos sempre comandos com parâmetros, não embebemos os valores na string do .CommandText (a excepção é quando precisamos de utilizar o operador IN (...) ).

    O tal tópico não tem a ver com a performance na óptica mencionada no ponto anterior, mas na óptica da execução de cada instrução SQL, mais precisamente explica detalhadamente o que é o Exectution Plan do SQL Server, como obtê-lo, formas de apresentação do mesmo e como o interpretar, para a partir dessa informação testar diferentes variantes de um comando e diferentes opções em termos da estrutura da base de dados em si, como índices, de modo a medir e determinar o melhor compromisso para a sua execução.

    Fica o link directo para o artigo, que é o primeiro capítulo do mais recente livro do autor, dedicado às questões do Execution Plan:

    Execution Plan Basics
    Simple-talk: Grant Fritchey

    http://www.simple-talk.com/sql/performance/execution-plan-basics/

    Uma ressalva, apesar de eu geralmente apenas falar sobre questões ligadas ao desenvolvimento para a .NET Compact Framework e o SQL Server Compact, o artigo mencionado refere-se ao SQL Server para servidores, cujo 'query processor' difere daquele que encontramos no SQL Server Compact, pelo que o artigo sendo útil não é aplicável na sua totalidade a esta versão

  • 4º Seminário de Tecnologias Móveis do PocketPT.net

    A equipa do PocketPT.net vem pela 4ª vez organizar um seminário destinado aos utilizadores e interessados em geral na plataforma Windows Mobile da Microsoft, subjacente ao tema Como escolher o equipamento certo para mim

    35601802-d0b1-413f-9fb8-3a0a05a6d998_1

    O evento vai ter lugar no sábado dia 21 de Junho - manhã e tarde - no auditório da Microsoft em Lisboa. Apesar de gratuito, a participação no evento carece de inscrição no site http://www.mtechseminar.com/2008/

  • Contra o tempo...

    Assim tem sido a minha corrida no último mês e meio... uma semana para a preparação do TechDays, uma semana no TechDays, a semana seguinte de formação para formadores em desenvolvimento para Windows Mobile em Inglaterra, 3 semanas para resolver assuntos pendentes, e na próxima, na companhia de vários outros MVP Portugueses, uma semana na 'Quinta do Bill' em Seattle/Redmond no encontro global de MVPs.

    Daí não ter conseguido ainda colocar as apresentações online - embora pense que já estejam no site do evento - nem o código usado nas demonstrações que era suposto ter feito em ambas as apresentações, mas que foi de todo impossível mostrar devido a uma combinação dos seguintes factores Windows Vista/placa gráfica nVidia/projector/switch, que não permitiu que as sessões decorressem como preparado. As minhas desculpas a todos os que me têm contactado ou esperado que coloque o código online.

    Após o regresso dos EUA tenho mais umas coisas na empresa a carecer de atenção urgente, mas voltarei à normalidade a partir de Maio, ou assim espero...

    Até breve!

  • Techdays 2008: Uma sessão já foi...

    ... e infelizmente não correu nada bem... Não sei se por causa do portátil, do projector ou de uma combinação de ambos, a maior parte do tempo da sessão o portátil e o projector estavam a 'discutir' um com o outro, o que provocava que nem no portátil, nem no projector fosse possível ver o Powerpoint ou as demos.

    Tenho a agradecer e voltar a apresentar as minhas deculpas aos participantes, que aguentaram em grande número até ao fim. De facto, como a sessão pretendia e conseguiu em parte demonstrar, a plataforma Windows Mobile permite de forma muito acessível criar aplicações diferenciadoras utilizando a Compact Framework, podendo aceder de forma standardizada a características de hardware do equipamento independetemente do fabricante do mesmo. Também se conseguiu ver - entre piscadelas de ecrãs - que o emulador de Windows Mobile permite simular um grande número de características de equipamentos físicos, como rede GSM/3G, envio e recepção de SMS, chamadas e GPS.

    Como prometido, colocarei brevemente online a apresentação e a aplicação de demonstração. Se tiverem alguma questão que queiram colocar, podem utilizar os comentários deste artigo.

    6ª feira à tarde, lá estarei a apresentar a minha outra sessão, que versa as novidades do VS2008 e da .NET CF 3.5.

  • Techdays 2008 - Aplicação de apoio para Windows Mobile

    O Pedro Ivo Faria desenvolveu uma aplicação para Windows Mobile (uma versão para equipamentos com ecrã táctil e outra para não-táctil), que permite ter literalmente na palma da sua mão as últimas informações do evento, ver e modificar a sua agenda, dar feed back, etc.

    Aqui podem ver algumas capturas de ecrã da versão móvel:

    image image imageimage image image

    Para a utilizarem, podem descarregar o ficheiro apropriado directamente para o V/ equipamento a partir de um dos seguintes links, ou descarregar para o PC, copiar para o equipamento e executar a partir de lá:

    Versão para equipamentos com ecrã táctil (PocketPC, Windows Mobile Classic & Professional)

    http://www.techdays.pt/downloads/TechDays2008.PPC.CAB

    Versão para equipamentos sem ecrã táctil (Smartphone, Windows Mobile Standard)

    http://www.techdays.pt/downloads/TechDays2008.SPH.CAB

    Instalada a aplicação, executem-na e escolham a opção configuração no menu:

    image

    E depois digitem o ID que vos foi atribuído no separador dados da secção My TechDays (têm de ter feito previamente o sign in):

    image

    Depois é só actualizar e... aí está, o Techdays na vossa mão!!!

  • Techdays 2008 - "Utilizando as managed APIs do Windows Mobile 6 na .NET Compact Framework 3.5"

    Além da sessão MOB01 - O que há de novo no Visual Studio 2008 e .NET Compact Framework 3.5 no desenvolvimento para Windows Mobile, vou apresentar a sessão MOB05 - Utilizando as managed APIs do Windows Mobile 6 na .NET Compact Framework 3.5 já na 4ª feira, às 15:45 na sala A7.

    Esta sessão vai a partir de um suposto caso real, demonstrar como as API do Windows Mobile 6 expostas pela Compact Framework o podem levar a desenvolver aplicações que expoem de forma amigável ao utilizador o melhor que a platafoma Windows Mobile tem!

    Não se esqueçam de ir marcando na V/ agenda no My Techdays as sessões a que contam ir e deslocarem-se atempadamente para as salas onde decorrerão.

  • Techdays - Quizz - Oferta de livro ''Microsoft® Mobile Development Handbook"

    Foi-me oferecido um livro à escolha por constar no top dos bloggers sobre o TechDays, tendo escolhido o seguinte livro:

    livro

    A primeira pessoa a adivinhar a marca e modelo do seguinte equipamento, e que conte ir à minha sessão no dia 14 às 15:15, fica com o livro!

    quizztd2008

    Algumas caracterísitcas do equipamento:

    • Ecrã de 5.9",  480 x 240 (wide, orientação vertical e horizontal)
    • Porta série
    • Pack bateria recarregável + opção 2x 1.5V AA
    • Slot Compact Flash
    • Slot PcCard, compatível com placas de rede e placas wireless
    • Versões mobile do Word, Outlook, Excel, Internet Explorer
    • Disponível apenas com Windows CE
  • Última oportunidade para participar no Techdays!!!

    Já há alguns dias que sabia que ainda haviam inscrições disponíveis para o Techdays, e que o limite para as mesmas havia sido alargado até ao dia 7 de Março, ou seja, HOJE!

    Optei por deixar precisamente para o último dia esta mensagem - depois de já ter sido difundida noutros blogs - por saber que muitos portugueses gostam de deixar precisamente para o último dia as suas decisões!

    Por isso, hoje que é MESMO o último dia, não deixem passar a oportunidade de se manterem a par com as tecnologias que vão fazer a diferença nos próximos tempos.

    td2008big

    Cliquem na imagem para mais informação sobre o evento, ou aqui para irem directos para a página de registo.

More Posts Next page »

This Blog

Syndication

News

  • Você escolheu um software de gestão que se adapta ao seu negócio... Porque há-de deixar que lhe imponham uma solução de mobilidade para as suas forças de venda? Contacte a moving2u e teremos todo o prazer em lhe apresentar as nossas soluções!

Eventos

Sobre mim...

Powered by Community Server (Commercial Edition), by Telligent Systems