segunda-feira, 17 de março de 2014

Artigo publicado na Revista ClubeDelphi 156 - WCF com Delphi

A Revista CubeDelphi edição de número 156 traz um artigo de minha autoria em co-autoria com o amigo Jones Granatyr. Na solução apresentada no artigo, criamos uma solução multicamadas com um servidor WCF (Windows Communication Foundation), que utiliza a robusta plataforma .NET Framework como back-end para aplicativos front-end multidevice criados em Delphi Firemonkey, como aplicações iOS ou Android. Com isso, ganha-se em performance e escalabilidade no App Server (servidor de aplicação), unindo-se o melhor dos dois mundos. No servidor de aplicação, utilizamos o Entity Framework que permite retornar dados em XML / JSON através de REST para serem consumidos por aplicações clientes. Temos notado nos últimos anos uma mudança no paradigma em como as pessoas armazenam e acessam suas informações. Um tempo atrás, não se ouvia falar sobre armazenamento e processamento remoto de documentos, tal como o Google Drive (que é largamente utilizado atualmente). Esse fato que já é corriqueiro para muitas pessoas, está agora se tornando algo comum e até mesmo viável para as empresas, ou seja, ao invés de manterem toda uma estrutura complexa de redes de computadores e servidores caríssimos dentro da própria empresa; a opção é terceirizar esses serviços de datacenter com empresas especializadas. Esses conceitos deram origem ao que conhecemos por Computação em Nuvens, que nada mais é do que armazenar na Internet recursos de hardware e software para que possam ser acessados e consumidos de qualquer lugar. O que é interessante deste conceito para os desenvolvedores é o que chamamos de SaaS (Software como Serviço), ou seja, é o princípio pelo qual um sistema pode ser disponibilizado e acessado pela Internet [1]. Aliado a esses conceitos, outra vertente que está ganhando muitos adeptos nos últimos anos é a Computação Móvel, que diz respeito a acesso à informação a qualquer lugar, a qualquer momento e principalmente através dos mais variados dispositivos, tais como celulares e tablets. Essas definições vão ao encontro de conceitos clássicos de autores da área de Sistemas Distribuídos, tais como explanados por Andrew S. Tanembaum em seu livro “Sistemas Distribuídos – Princípios e Paradigmas”. Tais conceitos caracterizam essas propriedades como heterogeneidade; que, em suma, é a propriedade que um software possui de interoperar independente de linguagem de programação, hardware, sistema operacional ou protocolo de rede. Dentro deste contexto, é muito importante que os desenvolvedores estejam preparados para atender essa necessidade de mercado, ou seja, a construção de aplicações que utilizem os conceitos supracitados e que, principalmente, possuam a característica de heterogeneidade com o intuito de tornar seus aplicativos independentes de plataforma e dispositivos. Para isso, é imprescindível conhecer as soluções que o mercado oferece, visto que existem muitas tecnologias que podem vir a serem utilizadas para esse fim, e, muitas vezes pode-se ficar em dúvida sobre qual ou quais são as mais adequadas para cada tipo de projeto. Pensando nisso, este artigo apresenta o desenvolvimento de um exemplo de sistema multicamada que faz uso dos conceitos supracitados e principalmente o que tange à heterogeneidade de linguagem de programação. Desta forma, será utilizado como backend e regras de negócio um servidor WCF (Windows Communication Foundation) Data Services do .NET Framework utilizando os conceitos de REST (Representational State Transfer) e como frontend uma aplicação em Delphi. Softwares multicamadas são voltados para aplicações que necessitam de grande desempenho e muitos usuários conectados simultaneamente, encaixando-se perfeitamente nos conceitos de SasS. Com o WCF Data Services do .NET Framework, podem ser construídos servidores REST multiplataforma e com alta performance, os quais podem ser acessados de praticamente qualquer dispositivo. Como visto anteriormente, os SaaS estão se tornando cada vez mais comuns dentro das empresas devido aos grandes benefícios que sua utilização pode trazer, tais como diminuição de custos e acesso fora do ambiente empresarial. Porém, para que eles atinjam seus objetivos, necessitam de uma série de requisitos para atender seus usuários, visto que geralmente, são centenas ou até milhares de conexões simultâneas solicitando recursos de um mesmo servidor. Por isso, uma arquitetura de SaaS deve estar pronta para atender a esse tipo de demanda, e a escolha de determinadas tecnologias para seu desenvolvimento é de suma importância para atingir esses objetivos. Um tipo de arquitetura que se torna natural ao desenvolvimento de SaaS é o modelo multicamadas, pois ele apresenta praticamente todas as características necessárias para a construção dos mesmos. Esse modelo é caracterizado basicamente pelo fato de que a aplicação cliente jamais acessa diretamente o banco de dados como no modelo cliente servidor tradicional (duas camadas). Em suma, pelo menos três camadas são necessárias, ou seja: (i) banco de dados, (ii) servidor de aplicação e (iii) apresentação. A camada do banco de dados, como o próprio nome sugere, é onde ficará armazenado o SGBD, enquanto que na segunda camada ficarão todas as regras de negócios e a lógica de acesso aos dados. Por fim, a camada de apresentação é a que fornecerá a interface para que o usuário interaja com o sistema e realize as operações. Fazendo uma analogia deste modelo com a aplicação exemplo desenvolvida neste artigo, nossa primeira camada será o SQL Server, a segunda será um servidor .NET WCF com REST e finalmente, a última camada será constituída de uma aplicação cliente em Delphi que fará acesso ao servidor WCF.A arquitetura multicamadas apresenta uma série de vantagens sobre o modelo cliente servidor tradicional, como por exemplo: modularização, facilidade de redistribuição, clientes leves, economia de conexões ao banco de dados, escalabilidade, independência de localização, independência de linguagem de programação e independência de sistema gerenciador de banco de dados. Podemos notar que este modelo apresenta muitos benefícios, podendo-os utilizar a nosso favor no desenvolvimento de arquiteturas para SaaS. De todas essas características, a que mais está relacionada ao escopo deste artigo é a independência de linguagem de programação, na qual será dado maior foco neste momento. Para que exista independência entre linguagens de programação, é necessário existir uma camada de software entre a aplicação e o sistema em questão chamada middleware, o qual tem o objetivo básico de converter os dados de um formato para outro com o intuito de garantir a compatibilidade entre ambos. Existem diversas tecnologias de middleware no mercado atualmente. O próprio DataSnap do Delphi atualmente pode entrar nesta categoria, visto que nas últimas versões da IDE essa tecnologia ganhou independência de protocolos proprietários, fato que possibilita a criação de frontends nas mais diversas linguagens de programação. Além disso, outro modelo que vem sendo bastante utilizado é a disponibilização de serviços utilizando os conceitos de REST, como uma alternativa aos já conhecidos Web Services com o protocolo SOAP. Esse padrão especifica que os recursos do servidor são acessados por um endereço único utilizando somente URLs, o que facilita o que é chamado de “descoberta” de recursos do servidor. Essa técnica será bastante discutida e demonstrada na aplicação prática desenvolvida neste artigo, na qual por meio do Delphi estaremos acessando um servidor WCF com REST. Como citado anteriormente, o .NET Framework é considerado um middleware e a tecnologia por ele utilizada para a exposição de serviços e recursos é o WCF Data Services, o qual oferece suporte aos padrões SOAP e REST. O diagrama abaixo mostra a arquitetura da solução. Clique aqui para ler o artigo completo no site da DevMedia.



quinta-feira, 6 de março de 2014

Desenvolvimento de Aplicações para Internet e Dispositivos Móveis enfoca área estratégica em TI

Novos cursos de pós graduação
‘Desenvolvimento de Aplicações para Internet e Dispositivos Móveis’ enfoca área estratégica em TI
Um dos cursos oferecidos pelo CEC neste início de ano tem sintonia direta com o meteórico desenvolvimento nas tecnologias da informação. 


                Trata-se de “Desenvolvimento de Aplicações para Internet e Dispositivos Móveis”, que tem por objetivo oferecer aos profissionais o domínio de metodologias e tecnologias para implementação de sistemas informacionais, tendo os ambientes móveis e Cloud Computing como plataformas.
               Guinther Pauli, um dos docentes do curso, explica que houve uma época em que o desenvolvimento de software se baseava no modelo desktop, chamado de aplicações nativas, basicamente para a plataforma Windows, com a qual a maioria está acostumada a trabalhar.
               “O surgimento da Web dinâmica, das redes sociais e do e-commerce trouxe uma oportunidade única para as empresas colocarem o seu negócio na Internet”, relata. Aplicações que antes só poderiam ser executadas se fossem instaladas perderam lugar para as modernas aplicações Web na nuvem, com todas as facilidades que esse modelo oferece. Mais adiante, principalmente com a revolução tecnológica promovida pelo visionário Steve Jobs, da Apple, e seu modelo de "App Store", ressurgiu o mercado de aplicações nativas novamente, porém, compradas em lojas virtuais, que rodam não mais somente em desktops, mas em TVs, smartphones e outra série de devices (gadgets) que ainda irão surgir (como o mais recente Google Glass).
               Guinther, com sua vasta formação e experiência na área – é arquiteto de software com certificação pela Microsoft, professor de graduação e de pós-graduação, colaborador de várias publicações especializadas – é parte do corpo docente do CEC do Univem. Entre os seus principais projetos, foi arquiteto e desenvolvedor do sistema de doações online do projeto Criança Esperança, da Rede Globo/Unesco.
               O Prof. Dr. Elvis Fusco, coordenador do curso de “Desenvolvimento de Aplicações para Internet e Dispositivos Móveis”, enfatiza a importância da educação continuada na área. “Procuram-se cada vez mais profissionais inovadores e com perfil investigativo, e isso faz toda a diferença no currículo e nas possibilidades profissionais que se abrem.”
Serviço

            Para saber mais sobre o curso, acesse a página do CEC, emhttp://www.univem.edu.br/cec

FONTE:  JORNAL DA FUNDAÇAO (UNIVEM)

quarta-feira, 5 de fevereiro de 2014

Programação e Gestão em Tecnologia da Informação - Horus Faculdades




Confirmada a minha participação no curso de pós-graduação de Programação e Gestão em Tecnologia da Informação, da Horus Faculdades, no mês de maio, ministrando a disciplina de Programação Orientada a Objetos, mais informações e inscrições no link http://www.horus.edu.br/cursos/3/pos-graduacao/programacao-e-gestao-em-tecnologia-da-informacao/61

quarta-feira, 15 de janeiro de 2014

Curso de Programação C# Avançado

O curso de Programação Avançada com C#, desenvolvido por mim, tem por objetivo ensinar o desenvolvedor a dominar técnicas de programação com a linguagem C#. De forma independente de tecnologia, apresenta técnicas e conceitos que podem ser aplicados em qualquer tipo de aplicação, seja ela Web, Windows, Mobile e Cloud. Une a teoria com exemplos práticos do dia-a-dia, gerando ainda conhecimento técnico reutilizável, que pode ser aplicado em diversas áreas. Ensina recursos avançados da linguagem C#. Tem como público-alvo programadores C# que desejam avançar seus conhecimentos na linguagem da Microsoft, dominando todos os seus recursos, desde o uso de tipos até paralelismo. Ideal para programadores de outras linguagens (Java, Delphi, C++ etc.) que desejam aumentar seu leque de atuação do mercado dominando outra linguagem, reduzindo a curva de aprendizado, ou ainda para desenvolvedores que precisam adquirir conhecimentos sobre arquitetura. Não é destinado a programadores iniciantes que não tenham experiência prévia em uma linguagem de programação, lógica ou princípios básicos de orientação a objetos. A metodologia utilizada neste curso será a apresentação de fundamentos teóricos, como forma de facilitar o aprendizado de cada uma das técnicas de programação com C#. Para cada recurso apresentado por aula, é demonstrando um exemplo prático voltado ao dia-a-dia do desenvolvedor, sendo o recurso então aplicado de forma apropriada para resolver o problema proposto. O curso está disponível on-line no site da www.devmedia.com.br somente para assinantes, ou pode ser contratado para ser ministrado de forma in-company presencial.

terça-feira, 14 de janeiro de 2014

Pós-Graduação 2014 UNIVEM - Especialização em Desenvolvimento de Aplicações para Internet e Dispositivos Móveis

O UNIVEM - Centro Universitário Eurípedes de Marília - encontra-se com as inscrições abertas para os cursos de pós-graduação: MBA em Gestão de Pessoas, MBA em Marketing e Negócios, MBA em Controladoria e Finanças, MBA em Logística Integrada e Cadeia de  Suprimentos, Especialização em Direito do Trabalho e Previdenciário e Especialização em Desenvolvimento de Aplicações para Internet e Dispositivos Móveis. Este ano novamente estarei participando como professor das disciplinas relacionadas ao desenvolvimento com a plataforma .NET / C# e tecnologias Microsoft, no curso de Especialização em Desenvolvimento de Aplicações para Internet e Dispositivos Móveis. Mais informações podem ser obtidas no endereço
http://www.univem.edu.br/cec/
Acesse este link para ver notícia publicada sobre o curso.

sexta-feira, 8 de novembro de 2013

Artigo publicado na Revista ClubeDelphi 154 (matéria de capa) - Design Patterns - Padrões de Projeto Comportamentais com Delphi

A Revista CubeDelphi edição de número 154 traz um artigo de minha autoria sobre Padrões de Projeto Comportamentais com Delphi. Este artigo abordará os padrões de projeto comportamentais: Chain of Responsibility, Command, Iterator, Mediator e Memento. Estes padrões ajudam a tornar sistemas de software mais fáceis de serem mantidos e evoluídos. Eles são constantemente modificados e adaptados, novos recursos são implementados, bugs são corrigidos, outros criados e aparecem do nada, novas exigências são feitas, a lei muda, o cliente pede, o código vai se tornando mais complexo e se afasta do seu projeto original, diminuindo sua qualidade. Se uma aplicação precisa ser modificada em um determinado momento, seja para manutenção corretiva ou evolutiva para atender novas funcionalidades, este processo precisa ser feito de forma disciplinada, correta, usando padrões, já que o custo da manutenção representa um porcentual elevado comparado ao custo total do sistema, como citado. Com isso, o uso de padrões de projeto, ou Design Patterns, torna um software mais fácil de ser mantido em longo prazo, reduzindo custos ou otimizando o retorno do investimento, apesar de exigir um maior esforço em um primeiro momento, durante o design do projeto a ser realizado. Este artigo apresenta os padrões de projeto da classe comportamentais e implementações de exemplos práticos reais em Delphi. Neste artigo, serão tratados os padrões GoF [1], destinados a resolver problemas com operações, comunicação e o relacionamento (no sentido de chamar métodos e passar dados) entre objetos complexos, que comprometem a reutilização de módulos do sistema e aumentam o acoplamento. No final do artigo, apresento ainda mais um padrão estrutural, o Proxy, de forma a complementar os padrões vistos na edição anterior (Adapter, Bridge, Composite, Decorator e Facade). O Chain of Responsibility tem por intenção evitar o acoplamento do remetente de uma solicitação ao seu recepetor, ao dar a mais de um objeto a oportunidade de tratar a solicitação. Encadear os objetos receptores, passando a solicitação ao longo da cadeia até que um objeto a trate. Nesse padrão cada objeto receptor possui uma lógica descrevendo os tipos de solicitação que é capaz de processar e como passar adiante aquelas que requeiram processamento por outros receptores. A delegação das solicitações pode formar uma árvore de recursão, com um mecanismo especial para inserção de novos receptores no final da cadeia existente. Dessa forma, fornece um acoplamento mais fraco por evitar a associação explícita do remetente de uma solicitação ao seu receptor e dar a mais de um objeto a oportunidade de tratar a solicitação. Um exemplo da aplicação desse padrão é o mecanismo de herança nas linguagens orientadas a objeto: um método chamado em um objeto é buscado na classe que implementa o objeto e, se não encontrado, na superclasse dessa classe, de maneira recursiva. Como benefício do uso do padrão, ele permite determinar quem será o objeto que irá tratar a requisição durante a execução. Cada objeto pode tratar ou passar a mensagem para o próximo na cadeia. Dessa forma, o acoplamento é reduzido, dando ainda flexibilidade adicional na atribuição de responsabilidades a objetos. O próprio Delphi usa esse padrão, ou a nível de VCL, IDE ou linguagem. Um exemplo claro: observe que o próprio tratamento estruturado de exceções do Delphi (try except) na verdade usa uma espécie de padrão bastante semelhante ao Chain of Responsibility. De fato, quando uma exceção é levantada em algum ponto da aplicação, ela vai descendo na Call Stack de métodos até que um o manipule sem levantá-lo novamente com raise. Forma-se assim uma cadeia de responsabilidade, cada método pode decidir por tratar aquele erro (uma responsabilidade) e decidir repassar ou não para o próximo na cadeia, no caso o sucessor é o método imediatamente abaixo que o invocou. Já o padrão Command tem por intenção encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas. A chave deste padrão é uma classe abstrata Command, a qual declara uma interface para execução de operações. Na sua forma mais simples, esta interface inclui uma operação abstrata Execute. As subclasses concretas de Command especificam um par receptor-ação através do armazenamento do receptor como uma variável de instância e pela implementação de Execute para invocar a solicitação. O receptor tem o conhecimento necessário para poder executar a solicitação. Entre os benefícios do uso do padrão, ele desacopla o objeto que invoca a operação daquele que sabe como executá-la; além disso, é fácil criar novos comandos porque não é necessário mudar classes existentes. A intenção do padrão Iterator é fornecer uma maneira de acessar os elementos de um objeto agregado sequencialmente sem expor sua representação. Um objeto agregado, como uma lista, por exemplo, deveria sempre oferecer uma forma de acessar seus elementos (dados) sem expor sua estrutura interna. Além disso, essa lista poderia ser examinada de diferentes formas, dependendo do que precisa ser realizado (procurar, ordenar etc.). Normalmente uma interface para cada operação sobrecarregaria a classe. Nesse caso um padrão uniforme (o Iterator) provê uma estratégia conhecida atualmente como “programação genérica”, que visa separar explicitamente algoritmos de estruturas de dados. Os principais benefícios do padrão é promover a programação baseada em componentes, reutilização e aumento de produtividade. A intenção do padrão Mediator é definir um objeto que encapsula a interação entre um conjunto de objetos. Mediator promove o baixo acoplamento por manter objetos sem se referir um ao outro de forma explícita, e que lhe permite variar sua interação independentemente. O padrão Mediator pode ser usado quando: um conjunto de objetos se comunica de maneiras bem-definidas, porém complexas; as interdependências resultantes são desestruturadas e difíceis de entender. A reutilização de um objeto é difícil porque ele referencia e se comunica com muitos outros objetos; um comportamento que está distribuído entre várias classes deveria ser customizável, ou adaptável, sem excessiva especialização em subclasses. Benefícios: limita o uso de subclasses; desacopla colegas; simplifica o protocolo de objetos; abstrai a maneira como os objetos cooperam; ele centraliza o controle. Temos outro exemplo típico na vida real onde um mediador é essencial. Imagine uma torre de controle de um aeroporto precisa controlar todo o seu tráfego aéreo. As aeronaves (colegas) precisam utilizar essa torre como mediador, a fim de que evitar que uma aeronave tente pousar ao mesmo tempo que outra está levantando voo. As aeronaves muitas vezes não se comunicam entre si, seja por questões de segurança, controle, ou até mesmo por serem de companhias e países diferentes (com idiomas diferentes). A presença do mediador é crucial para coordenador a comunicação entre todos estes objetos complexos, a fim de garantir o funcionamento do sistema.A intenção do padrão Memento é, sem violar o encapsulamento, capturar e externalizar o estado interno de um objeto para que o objeto possa ser restaurado para este estado mais tarde. O padrão pode ser aplicado quando: o estado de um objeto deve ser salvo de maneira que possa ser restaurado para esse mesmo estado mais tarde; quando uma interface do estado exporia detalhes de implementação e romperia o encapsulamento do objeto. Benefícios: preservação das fronteiras de encapsulamento; definição de interfaces mínimas e amplas. Podemos observar a aplicação do Memento em alguns frameworks de persistência, ou mesmo Web. Em sistemas Web state-less, como o ASP.NET, o estado de um formulário precisa ser mantido entre requisições, para que possa ser restaurado quando algo precisa ser processado no servidor. Nesse caso o .NET Framework utiliza o padrão Memento para “memorizar” o estado de um formulário em um Caretaker, que lá no ASP.NET recebe o nome de ViewState. O formulário é então destruído após a requisição, mas pode ser reconstruído a partir do ViewState. De forma semelhante e em termos práticos, podemos tratar a própria propriedade Data do ClientDataSet como um Memento. De fato, os dados são obtidos a partir de um DataSetProvider, que obtém isso através de IProviderSupport de algum DataSet de algum engine de acesso a dados como DBExpress ou FireDac. Data é a memória dos dados, de forma que as conexões podem ser todas fechadas e o trabalho realizado off-line em memória.Para finalizar este artigo, vamos abordar um último padrão, porém este da categoria dos padrões Estruturais, de forma a complementar os padrões já vistos na edição anterior (Adapter, Bridge, Composite, Decorator e Facade). A intenção do padrão Proxy (este é um padrão estrutural) é fornecer um substituto ou espaço reservado para outro objeto para controlar o acesso a ele. Um proxy, em sua forma mais geral, é uma classe que funciona como uma interface para outra classe. A classe proxy poderia conectar-se a qualquer coisa: uma conexão de rede, um objeto grande em memória, um arquivo, ou algum recurso que é difícil ou impossível de ser duplicado. Entre os benefícios podemos citar: um proxy pode ocultar o fato de que um objeto reside em um espaço de memória diferente; um proxy virtual pode executar otimizações, tais como criação de objetos sob demanda. Clique aqui para acessar e ler o artigo completo no site da DevMedia

quinta-feira, 12 de setembro de 2013

Artigo publicado na Revista ClubeDelphi 153 - Design Patterns - Padrões de Projeto Estruturais com Delphi

A Revista CubeDelphi edição de número 153 traz um artigo de minha autoria sobre Padrões de Projeto Estruturais com Delphi. Padrões de projeto são soluções prontas e reutilizáveis para problemas recorrentes da orientação a objetos, como sendo os principais: forte acoplamento entre classes, dificuldade de reutilização de componentes, falta de modularização, duplicação de código e altos custos com manutenção. Os padrões de projeto são apresentados no livro “Design Patterns: Elements of Reusable Object-Oriented Software”, dos autores E. Gamma, R. Helm, R. Johnson e J. Vlissides, mais conhecidos como Padrões GoF (Gang of Four). No artigo da edição 152 da Revista ClubeDelphi foram abordados os padrões da categoria criacionais, incluindo Abstract Factory, Factory Method, Singleton e Builder, que tinham por finalidade resolver problemas com forte acoplamento de classes devido a criação de objetos concretos. Neste artigo, vamos abordar alguns padrões do grupo Estruturais, que têm por finalidade mostrar como formar objetos a partir de funcionalidades de outros objetos, seja por herança de abstrações, associações e composição. Os padrões apresentados neste artigo são o Adapter, Bridge, Composite, Decorator e Façade. Padrões de projeto estruturais são úteis para criar softwares mais fáceis de serem mantidos, evoluídos, promovendo reutilização de código, uso de boas práticas de programação orientada a objetos, redução de custos com manutenção, já que permitem que alterações em um determinado sistema de software não quebrem outras funcionalidades, reduzindo a dependência entre classes, através do uso exaustivo de abstrações. Dos padrões tratados no artigo, o Adapter serve para permitir a comunicação entre duas classes com interfaces distintas; Bridge serve para separar totalmente a interface de um objeto de sua implementação concreta; Composite permite criar composições de objetos; Decorator permite adicionar funcionalidades a um objeto sem usar herança estática, usando herança de “caixa-preta”, através da implementação por delegação; Façade ajuda a torna um subsistema de classes mais fácil de utilizar. Como na edição anterior, primeiramente será apresentada uma descrição formal de cada padrão segundo GoF, depois um exemplo prático em Delphi. A intenção do padrão Adapter, também conhecido como Wrapper, é converter a interface de uma classe em outra interface esperada pelos clientes. Permite que classes trabalhem em conjunto, pois de outra forma não poderiam devido a terem interfaces incompatíveis. O padrão pode ser usado quando você quiser usar uma classe existente, mas sua interface não corresponder à interface que necessita; ou quando você quiser criar uma classe reutilizável que coopere com classes não relacionadas ou não previstas, ou seja, classes que não necessariamente tenham interfaces compatíveis; você precisar usar várias subclasses existentes, porém, for impraticável adaptar essas interfaces criando subclasses para cada uma. O padrão traz alguns benefícios. Um adaptador de classe adapta Adaptee a Target através do uso efetivo de uma classe Adapter concreta, com isso permite a Adapter substituir algum comportamento do Adaptee, uma vez que Adapter é uma subclasse de Adaptee. Um adaptador de objeto permite a um único Adapter trabalhar com muitos Adaptees. O Adapter também pode acrescentar funcionalidades a todos os Adaptees de uma só vez. No mundo orientado a objetos, um Adapter é frequentemente encontrado em muitas situações. No Delphi, por exemplo, temos dezenas de aplicações deste padrão, vamos observar a arquitetura do novo DataSnap. No modelo antigo do DataSnap (e primeiras versões do MIDAS), tínhamos um componente de conexão remoto para cada tipo de protocolo que nosso servidor de aplicação pudesse trabalhar. Por exemplo, um DCOMConnection era utilizado no cliente para conectar a um servidor DCOM, MTS ou COM+. A partir do Delphi 6, com o suporte a Web Services, foi possível utilizar um SOAPConnection para conectar em um servidor de aplicação baseado em SOAP (Simple Object Access Protocol). E poderíamos citar outros tipo de conexão, como CorbaConnection, WebConnection, SocketConnection etc. Um ClientDataSet poderia então se conectar a qualquer um desses componentes concretos para obter dados de diferentes tipos de servidores, independente de protocolo que usem. Para isso, basta apontar a propriedade RemoteServer de ClientDataSet, que é do tipo TCustomRemoteServer, classe base para todos os componentes de conexão (SOAPConnection, DCOMConnection, SocketConnection, WebConnection, CorbaConnection etc.). Com o novo DataSnap, Delphi 2009 em diante, uma grande mudança foi feita, ao invés de termos um componente com uma implementação concreta para cada protocolo de comunicação DataSnap, passamos a usar um único componente de conexão, o próprio SQLConnection do DBExpress. O código de acesso dependente de protocolo passou a residir então em um driver do DBExpress (DLL). Agora vem o problema, se tentarmos conectar um ClientDataSet em um SQLConnection pela propriedade RemoteServer, o que acontece? O SQLConnection nem aparece na lista, pois este descendente de TCustomConnection, e não de TCustomRemoteServer. Como é impossível usar herança múltipla no Delphi, pelo menos de forma estática, não há uma forma de resolver o problema sem causar uma mudança profunda na VCL, modificar a classe base de um dos tipos citados, o que iria ferir princípios fundamentais da orientação a objetos (e uma reação em cadeia de alterações em todo framework). Então, um padrão de projeto foi aplicado para resolver o problema de forma elegante. A classe TDSProviderConnection funciona como uma “ponte” entre um ClientDataSet e um SQLConnection, fazendo com que o SQLConnection “finja” ser um RemoteServer para o ClientDataSet, ou seja, é um autêntico Adapter, como sua própria declaração identifica. A intenção do padrão Bridge é desacoplar uma abstração de sua implementação, de modo que os dois possam variar independentemente. O padrão pode ser usado para evitar o vínculo permanente entre uma abstração e sua implementação, por exemplo, quando a implementação deve ser alterada em tempo de execução. Tanto as abstrações como as suas implementações tiverem de ser extensíveis por meio de subclasses, nesse caso permite combinar diferentes abstrações e implementações e estendê-las independentemente. Mudanças na implementação de uma abstração não tem impacto sobre clientes. Ou ainda, para compartilhar uma mesma implementação entre vários objetos. Entre os benefícios trazidos pelo padrão, podemos citar o desacoplamento da interface da implementação, melhoria na extensibilidade, ocultação de detalhes de implementação dos clientes. Existem várias classes da VCL / FMX do Delphi que delegam a sua funcionalidade para algo “herdado” por delegação. Por exemplo, um TSimpleDataSet do DBExpress permite que o desenvolvedor utilize um único componente para conectar em um banco de dados, executar comandos SQL, fazer cache e resolver atualizações, de forma a eliminar a necessidade de se usar quatro componentes distintos para essa tarefa, os já conhecidos SQLConnection, SQLDataSet, ClientDataSet e DataSetProvider. Não, o TSimpleDataSet não herda destas quatro classes, porque, mais uma vez, Delphi não suporta herança múltipla, mas o componente consegue realizar o papel de todos eles. Ao invés disso, usa a herança de caixa-preta, os componentes são instanciados internamente, e quando fazemos uma chamada a determinado método, o mesmo é resolvido internamente por delegação. Agora repare algo interessante: se você quiser usar um SQLConnection externo ao componente, que não o criado internamente, você pode apontar a sua propriedade Connection. Em outras palavras, você está “injetando” externamente uma implementação em uma interface já definida pela propriedade Connection. Se existir outra implementação de SQLConnection, compatível com a interface, essa também pode ser atribuída a ela. Isso funciona de forma muito semelhante a um padrão de projeto Bridge. O padrão Composite tem por intenção compor objetos em estruturas de árvore para representar hierarquias parte ou todo. Composite permite que clientes tratem objetos individuais e composições de objetos de maneira uniforme. Utilizado sempre que é necessário representar elementos que são compostos por outros elementos similares. Por exemplo, em interfaces gráficas um elemento gráfico pode ser constituído pela composição de vários outros elementos gráficos. Uma janela pode conter um ou mais ícones, uma caixa de texto e vários outros elementos gráficos - até mesmo outra janela. Considerando que uma determinada hierarquia de classes indicasse Control como a superclasse comum a todas classes que representassem os elementos gráficos atômicos, a classe Form seria representada como uma classe que contém zero (0) ou mais elementos gráficos.  É importante observar que será responsabilidade do objeto composto, para cada método a ser aplicável à lista de objetos que possui, implementá-lo de maneira repetitiva. Por exemplo, no caso da hierarquia de elementos gráficos exemplificada, suponha que um objeto cliente ative o método Draw de um objeto do tipo Form. Este método deverá ser capaz de ativar os métodos Draw de cada um dos objetos que ele contém. Desta maneira será possível interagir com uma composição de objetos da mesma forma que se interage com objetos individuais. Entre os benefícios trazidos pelo uso do padrão podemos citar a definição de hierarquia de classes que consistem de objetos primitivos e objetos compostos, podendo assim compor objetos mais complexos. Sempre que o código do cliente esperar um objeto primitivo, poderá também aceitar um composto. Além disso, o padrão torna o cliente simples, pois pode tratar estruturas diferentes de maneira uniforme (não importa se é um tipo folha ou composto). Torna também mais fácil a adição de novas espécies de componentes. O padrão Decorator tem a intenção de, dinamicamente, agregar responsabilidades adicionais a um objeto. Os decorators fornecem uma alternativa flexível ao uso de subclasses para extensão de funcionalidades. O padrão, conhecido também como wrapper, favorece o uso de composição sobre a herança. Permite adicionar (ou remover) responsabilidades individuais a uma classe de forma dinâmica, flexível e transparente. Ao usar herança, uma classe formalmente especifica seu tipo herdado e gera uma relação de dependência praticamente imutável, gerando fortes acoplamentos. O padrão Decorator, ao invés disso, permite estender uma classe “decorando-a” com novas funcionalidades, sem que seja necessário criar uma grande hierarquia de subclasses. Os benefícios do uso do padrão são inúmeros, como principal e já citado a flexibilidade, pois não faz uso de herança, que é estática. Além disso, evita criar uma classe com inúmeras responsabilidades expostas em sua interface, já que a “decoração” é interna. Funções são delegadas internamente sem exposição pública. A intenção do padrão Façade é fornecer uma interface unificada para um conjunto de interfaces em um subsistema. Façade define uma interface de nível mais elevado que faz o subsistema mais fácil de usar. Uma boa aplicação para o Façade (fachada) é criar uma forma mais simples para os objetos clientes de lideram com um sistema mais complexo, escondendo muito de sua implementação, fortalecendo o encapsulamento e isolamento. Alguns benefícios do padrão: tornar uma biblioteca de software mais fácil de entender e usar; tornar o código que utiliza esta biblioteca mais fácil de entender; reduzir as dependências em relação às características internas de uma biblioteca, trazendo flexibilidade no desenvolvimento do sistema; envolver uma interface mal desenhada, com uma interface melhor definida. No mundo orientado a objetos, muitos frameworks são tão bem projetados e seguem tão bem a risca o Princípio da Responsabilidade Única que você precisa instanciar quatro classes para realizar uma simples tarefa. Por exemplo, no ADO.NET com SQL Server, para executar um comando SQL de seleção (select) no banco de dados e guardar isso em cache, você precisa das classes: SqlConnection, SqlCommand, SqlDataAdapter e DataSet. De forma muito semelhante ocorre no DBExpress. É muito comum nesses casos, criar classes ou funções “Helpers”, que facilitam a vida do desenvolvedor ao utilizar todo esse conjunto de classes. Por exemplo, poderíamos ter uma função chamada ExecutaSQL(SQL: string), que configura cada uma dessas classes, relaciona-as e executa um comando, passando parâmetros e retornando um resultset caso seja um select. Nesse caso, temos uma função ou classe que esconde um conjunto de operações mais complexas. Ou seja, é uma fachada para esconder algo que está complexo de utilizar. Outras vezes, um subsistema de classes está tão mal projetado e difícil de utilizar que só uma fachada resolve: você esconde tudo o que tem até então e a partir daí os programadores só usam a fachada. Agora pare para pensar: O que realmente é a VCL? Não é um conjunto de classes que permite usar um subsistema de funções extremamente complexo e sem classe / tipo, que é a API procedural do Windows? Sim, certamente, é muito simples criar um TForm via VCL do que via API do Windows. A própria plataforma .NET Framework é uma grande fachada para o sistema Windows, escondendo sua complexidade de forma a oferecer um conjunto de classes mais fáceis de trabalhar, porém, com as mesmas funcionalidades que o sistema operacional oferece de forma nativa. Talvez estes sejam os exemplos mais reais atualmente de aplicação do padrão de projeto Façade. Clique aqui para ler o artigo completo no site da DevMedia.

quarta-feira, 11 de setembro de 2013

Embarcadero anuncia hoje o lançamento do Delphi XE5

RAD Studio XE5

Desenvolvimento de aplicações multidispositivos verdadeiramente nativas para Android e iOS

O RAD Studio XE5 é uma ferramenta de desenvolvimento de aplicações para equipes que estejam construindo aplicações verdadeiramente nativas para Android e iOS, levando-as a lojas de aplicações e corporações de modo acelerado. Construa aplicações utilizando a mesma base de código fonte, sem comprometer a qualidade, a conectividade ou o desempenho da aplicação. Com suporte nativo para Android e iOS, atinja a uma maior parcela dos mercados mobile do mundo.

Multi-device development with one codebaseVerdadeiramente nativo de multidispositivos

Com o desenvolvimento de aplicações multidispositivos do RAD Studio você não precisa manter projetos de desenvolvimento separados para criar sua aplicação de modo nativo para distintos dispositivos (PCs, tablets e smartphones) em múltiplas plataformas (Android, iOS, Windows e OS X). O RAD Studio facilita a criação de aplicações mobile verdadeiramente end-to-end, e aplicações livres de scripts verdadeiramente nativas, que tiram máximo proveito das capacidades e do desempenho dos dispositivos subjacentes. 

True native Android and iOS supportSuporte verdadeiramente nativo de Android e iOS

Desenvolva aplicações para smartphones e tablets com a única plataforma de desenvolvimento que permite que você crie aplicações verdadeiramente nativas para Android e iOS a partir de uma única base de código. As aplicações que você cria com o RAD Studio XE5 podem acessar sensores e serviços comuns de dispositivos mobile, fornecendo o melhor desempenho de aplicações com suporte nativo de GPU e CPU. 

RAD Multi-Device Application PlatformPlataforma RAD de Aplicações Multidispositivos

O desenvolvimento de aplicações mobile frequentemente se estende para além do dispositivo, demandando suporte de tempo real a comunicação e acesso a dados corporativos e serviços nas nuvens. A Plataforma de Aplicações Multidispositivos do RAD Studio torna possível que os desenvolvedores criem uma computação verdadeiramente conectada no dispositivo, através de serviços back-end em múltiplos sistemas operacionais clientes e considerando as múltiplas configurações físicas dos dispositivos. Conecte suas aplicações rapidamente a serviços e bancos de dados corporativos via infraestrutura local ou nas nuvens com a conectividade a banco de dados corporativo da FireDAC, middleware n-tier do DataSnap, além de acesso a web services RESTful baseados nas nuvens através de fornecedores de MBaaS.ma base de código, uma equipe

IDE Delphi iOSLeve as aplicações ao mercado mais rápido

Crie suas aplicações de negócio até 10x mais rápido com desenvolvimento visual e suporte integrado a bancos de dados de classe corporativa. Desenhe e desenvolva suas aplicações com blocos de componentes visuais extensíveis e reutilizáveis para obter um desenvolvimento mais rápido e altamente manutenível. A prototipagem rápida no dispositivo permite que você crie protótipos visuais que são rodados diretamente no dispositivo de destino, para que você possa incorporar o feedback e levar suas aplicações ao mercado mais rápido.

Mais segurança e controle

Vários fornecedores de soluções de desenvolvimento de aplicações tornam o desenvolvimento multiplataformas possível através da utilização de linguagens de criação de scripts e runtimes famosos por serem alvo de hackers, o que representa um risco inerente à segurança dos dispositivos móveis. Com o RAD Studio você conta com desenvolvimento de aplicações verdadeiramente nativas, para que seu código seja rodado diretamente no dispositivo, reduzindo assim os riscos de ataques de terceiros.

protyping325x235Solução premiada

O RAD Studio é uma solução de desenvolvimento premiada, usada por milhões de desenvolvedores de software em todo o mundo e suportada por uma ativa comunidade de desenvolvedores de software, parceiros de tecnologia e fornecedores de componentes.

quarta-feira, 21 de agosto de 2013

Artigo publicado na Revista .NET Magazine 107 - Programação Orientada a Objetos com C# - Polimorfismo e Abstração + Agile na prática

A Revista .NET Magazine 107 da DevMedia traz um artigo de minha autoria, sobre técnicas de desenvolvimento ágil e programação orientada a objetos com C#, .NET Framework e Visual Studio. O artigo apresenta importantes fundamentos da programação orientada a objetos com C#, como herança, abstração e polimorfismo, aplicados em um exemplo prático. Usando boas práticas, mostra como estes fundamentos podem tornar um software mais fácil de ser mantido e evoluído, usando algumas técnicas de desenvolvimento ágil, como a refatoração. Mostra como resolver problemas comuns encontrados em código fonte (os chamados bad smells, ou “mau cheiros”), usando uma abordagem de desenvolvimento corretiva e evolutiva. Uma introdução ao desenvolvimento ágil evolutivo é apresentada, como forma de unir estas técnicas de orientação a objeto com as técnicas atuais de engenharia de software, demonstradas em um exemplo com C# e Visual Studio 2013. As técnicas apresentadas são úteis para construir softwares mais fáceis de serem mantidos e evoluídos ao longo do tempo, promovendo reutilização de código, reduzindo acoplamento entre classes, minimizando a ocorrência de bugs, tornando mais fácil a implementação de novos requisitos e tornando o código mais fácil de ser entendido. No artigo, comento sobre o documento “The new Methodology”, onde Martin Fowler traz uma excelente visão sobre um novo estilo de desenvolvimento de software, baseado em metodologias ágeis. Metodologias tradicionais de engenharia de software, focadas em planejamento, têm sido utilizadas ao longo do tempo. O grande problema é que elas são muito burocráticas, dão ênfase em contratos fixos, documentação excessiva, vasto planejamento antecipado (prematuro). Essa abordagem não condiz mais com a realidade da maioria dos projetos na área de tecnologia, onde novos requisitos são criados, modificados ou mesmo removidos após um planejamento inicial. Processos e metodologias modernas, como as metodologias ágeis de desenvolvimento, são evolutivas por natureza. Organizam o trabalho de forma interativa, realizado em pequenas partes, com pequenas entregas (design, código, teste, documentação), liberadas aos poucos, ao invés de um único release enorme. Dão maior ênfase na colaboração e comunicação aberta e fluente entre stakeholders, clientes e membros do time, minimizando as chances de insucesso em projetos. Os princípios básicos da abordagem ágil sugerem que indivíduos e interações são mais importantes que processos e ferramentas, trabalho deve ser feito mais focado no software em si que em uma documentação abrangente, colaboração do cliente mais que negociação de contrato e, principalmente, responder a mudanças mais que seguir um plano. O problema é que as abordagens tradicionais de engenharia de software se baseiam em outros ramos de engenharia, como a civil e mecânica, onde os custos com planejamento são menores. Em software, estima-se que até 50% de custos são gastos com design e planejamento. Projetos com um escopo invariável são raros, e se requisitos constantemente mudam, há um grande desperdício de esforço com análise que é descartada em virtude disso. Trabalho, tempo e dinheiro são preciosos são perdidos. Uma abordagem ágil garante que a equipe e projeto sejam capazes de se adaptar às mudanças que ocorrerão, dentro de um contexto evolutivo. A XP – Extremme Programing, uma abordagem ágil, prega cinco valores principais: comunicação, feedback, simplicidade, coragem e respeito, com foco maior em disciplina do que processos. Já Scrum prega um desenvolvimento ágil baseado em iterações chamadas sprints e reuniões de acompanhamento frequentes (meetings). Aplicações reais precisam continuamente ser evoluídas, novos requisitos implementados, melhorias devem ser feitas no projeto existente (design), algumas vezes é necessário mudar de tecnologia ou plataforma, corrigir bugs, otimizar e melhorar a performance. Isso remete a uma pergunta: O que pode ser considerado um “bom software”? Um bom software é aquele que funciona como planejado, mas depende do seu negócio. Para pequenas companhias (startups), bons softwares devem ser criados rapidamente. Para grandes corporações, o foco na construção de um software é torná-lo fácil de ser mantido ao longo do tempo. Nesse sentido, é necessário tomar cuidado com bons princípios de design, como criar componentes com baixo acoplamento, reutilizáveis, que garantam que alterações em componentes não afetam outros, que objetos tenham responsabilidades únicas, separadas, partes facilmente substituíveis, complexidade encapsulada. Esses são princípios básicos da programação orientada a objetos que, vistos dentro de um contexto de uma abordagem ágil evolutiva, vão tornar o sistema de software mais fácil de testar, evoluir, manter e entender. Padrões de Projeto (Design Patterns) ajudam a criar bons designs de software, já o uso de refatoração contínua (outra técnica amplamente divulgada por Fowler) garante código claro, limpo e funcional em equipes que programam de forma mais ágil, sem se preocupar em um primeiro momento com muitos aspectos de design, usando, por exemplo, Padrões de Projeto.
Padrões de Projeto são soluções reutilizáveis para problemas recorrentes no desenvolvimento orientado a objetos. Aplicar padrões antecipadamente em um projeto requer mais tempo e aumenta custos, ao mesmo tempo em que aumenta sua complexidade. Requisitos são modificados, criados ou mesmo eliminados conforme projetos evoluem. Tentar aplicar padrões antecipadamente para prever essas mudanças é um problema conhecido como excesso de engenharia. Já projeto em escassez reduz custos, pois o sistema de software é criado rapidamente devido à falta de tempo, conhecimento ou necessidade de se adicionar funcionalidades em curto prazo. Ao longo do tempo, armazena-se um débito de projeto, que torna o sistema de software muito difícil de ser mantido e evoluído. É nesse contexto que entram as refatorações, como uma forma de melhorar o projeto existente sem alterar seu comportamento externo observável. Refatoração é o aspecto-chave para um projeto evolutivo, e é na evolução que se encontra a verdadeira sabedoria. Nesse caso, desenvolvimento ágil, evolutivo, incremental, apoiado em refatorações e testes, é uma excelente receita para garantir o sucesso do projeto, seja ela para um startup ou uma grande corporação. O artigo mostra como aplicar estes conceitos em um exemplo prático com C# e Visual Studio 2013. São demonstrados os principais fundamentos da orientação a objetos em uma aplicação que simula notificação de clientes de uma determinada companhia, por exemplo, uma operadora de telefonia, que precisa avisar seus clientes sobre cobranças, promoções e lançamentos. Além dos fundamentos da orientação a objetos, são demonstradas importantes técnicas como programação para interfaces, padrões, anti-patterns, bad smells e uso contínuo de refatoração para um desenvolvimento ágil com código sempre limpo e funcional. Clique aqui para acessar a revista. Boa leitura!

terça-feira, 20 de agosto de 2013

Artigo publicado na Revista ClubeDelphi 152 - Design Patterns - Padrões de Projeto Criacionais com Delphi

A Revista ClubeDelphi da DevMedia, edição de número 152, traz um artigo de minha autoria sobre o uso de Padrões de Projeto - Design Patterns - com Delphi XE4. Softwares reais evoluem. Eles são constantemente modificados e adaptados, novos recursos são implementados, bugs são corrigidos, outros criados e aparecem do nada, novas exigências são feitas, a lei muda, o cliente pede, o código vai se tornando mais complexo e se afasta do seu projeto original, diminuindo sua qualidade. Está mais do que óbvio que a maior parte do custo total do desenvolvimento do software é dedicada à sua manutenção, em alguns casos, esse valor pode chegar a 80% do seu custo final. Se uma aplicação precisa ser modificada em um determinado momento, seja para manutenção corretiva ou evolutiva para atender novas funcionalidades, este processo precisa ser feito de forma disciplinada, correta, usando padrões, já que o custo da manutenção representa um porcentual elevado comparado ao custo total do sistema, como citado. Com isso, o uso de padrões de projeto, ou Design Patterns, torna um software mais fácil de ser mantido em longo prazo, reduzindo custos ou otimizando o retorno do investimento, apesar de exigir um maior esforço em um primeiro momento, durante o design do projeto a ser realizado. Como muitas empresas não realizam este projeto da forma correta na concepção do software, seja pela falta de tempo devido a prazos reduzidos, desconhecimento da equipe sobre uso de boas práticas de programação orientada a abjetos, arquitetura ou uso de padrões, execução de múltiplos projetos simultaneamente, ocorre o chamado débito de projeto. São softwares que atendem aos seus requisitos em um estágio inicial, mas são extremamente rígidos em sua estrutura, difíceis de manter e evoluir, repleto de “bad smells”, principalmente se essa evolução for feita por outro desenvolvedor que não o próprio criador. Um bad smell, ou simplesmente mau cheiro, é uma indicação superficial que leva a um problema profundo no código de um sistema. O termo foi criado por Kent Beck e utilizado no livro Refactoring: Improving the Design of Existing Code de Martin Fowler. Este artigo apresenta os fundamentos sobre Padrões de Projeto e implementações de exemplos práticos reais em Delphi. Neste artigo, serão tratados os principais padrões criacionais do GoF (Gang of Four), destinados a resolver problemas com criação de objetos concretos, que comprometem a reutilização de módulos do sistema e aumentam o acoplamento. Os padrões apresentados neste artigo são o Abstract Factory, Factory Method, Singleton e Builder. Clique aqui para acessar a revista com o artigo. Nas edições 153 e 154, haverá uma continuação do tema, tratando dos padrões Estruturais. Nesta mesma edição, vale a dica para a leitura do excelente artigo de Fabricio Kawata, sobre as novidades do Delphi XE4, incluindo o desenvolvimento de aplicativos móveis para iOS (iPad, iPhone). Boa leitura!

sábado, 10 de agosto de 2013

Treinamento em Petrolina, Pernambuco - Inforio Sistemas e Consultoria

O treinamento ministrado em Petrolina -Pernambuco - contou a participação da equipe de desenvolvimento e analistas da Inforio Consultoria e Sistemas. Dentro os temas abordados, destaca-se o desenvolvimento multicamadas, técnicas de migração, banco de dados e arquitetura distribuídas. Técnicas avançadas foram apresentadas, de forma a orientar a equipe nos corretos processos de migração tecnológica, tendo o cuidado de preservar a maior parte do conhecimento e código existente, reduzindo custos e curva de aprendizado da equipe.


Confira no link abaixo reportagem no site da Inforio:

http://www.inforio.com.br/index.php/login/articles/76-inforio-fara-conferencia-interna-com-grande-nome-do-desenvolvimento-de-software

"Inforio realiza oficina com grande nome do desenvolvimento de software
A Inforio recebeu entre os dias 8 e 10 de Agosto uma consultoria interna com o objetivo de reavaliar seu modelo de programação e aprimorar suas técnicas utilizadas visando as melhores práticas dentro da melhor tecnologia existente. Esse evento contou com a presença de Guinther Pauli, um dos maiores consultores brasileiros na área de tecnologia de software. Guinther Pauli  é Arquiteto de Software, Professor de Graduação e Pós-Graduação, Consultor, Autor, Instrutor e Palestrante. Certificado oficial Delphi (3,5,6,7,2005,2006,Web,Linux,XE), MVP e certificado oficial Microsoft .NET/C# (MCP, MCAD, MCSD, MCTS, MCPD). Colaborador Editorial das Revistas .net Magazine e ClubeDelphi. Ministra treinamentos in-company." 

Sobre a Inforio:








Formada por experientes programadores, que além do conhecimento de informática, acumulam vasta experiência em processos de gestão administrativa, financeira e contábil. A Inforio cria softwares modernos, atualizados tecnologicamente e, principalmente, nivelados com as melhores marcas do mercado. A Inforio é muito mais do que uma fábrica de software. A Inforio faz questão de fazer muito mais do que isso. Nossa equipe interage com a sua na definição e criação do melhor ambiente físico e tecnológico para implantação de sistemas. Procura também indicar os melhores caminhos para os processos controlados pelos nossos softwares, com exemplos de sucesso na gestão de informação e dados. Isso possibilita a otimização na utilização de todo potencial que nossos sistemas podem oferecer.  A Inforio tem uma ampla área de atuação geográfica, estando presente nos estados de Pernambuco, na Bahia e Piaui, atendendo seus clientes em suas sedes e filiais. Com uma tradição de mais de 15 anos no mercado, a Inforio atua em diversos segmentos do mercado, indo de supermercados a farmácias, de boutiques a concessionárias de automóveis, de loja de calçados a revendedor de autopeças. A Inforio também oferece solução para a agricultura e gestão educacional.

domingo, 4 de agosto de 2013

Por que a maioria dos projetos de software fracassam



Psicologia Empresarial, Antonio Meneghetti, pag. 35.

What's new in Visual Studio 2013
















A Microsoft liberou para download a versão Preview do Visual Studio 2013.

O Visual Studio 2013 inclui agora um novo Team Explorer com uma página inicial avançada que proporciona uma navegação mais fácil aos recursos de colaboração em equipe.















Compreender o que é uma linha de código faz é uma tarefa fundamental durante o desenvolvimento. O comando Go To Definition é agora acompanhado pelo novo recurso Peek Definition. Com ele, você não precisa mais sair do contexto de sua linha de código para exibir uma definição somente leitura em uma visão in-line ("popup", veja figura o preview de uma classe Customer).

















Entender o que uma linha de código faz é apenas parte de seu desafio como um desenvolvedor. Você também deve compreender a sua história, que trabalhou com ele, o que o código faz referência a ele, e muito mais. Isto torna-se especialmente difícil em projetos desenvolvidos por uma equipe média ou grande. O novo recurso chamado CodeLens (que são informações sobre o código) no Visual Studio 2013 usa informações de ambos os metadados do projeto e do Team Foundation Server 2013 para colocar informações adicionais em cada um dos métodos em seu código, que mostram informações como quem fez alterações recentes no código, quem foi a última pessoa a trabalhar no código, que testes unitários cobrem aquele determinado método e as referências para aquele código. Clicando na referência faz uma navegação rápida do IDE até o item.
















Semelhante ao que alguns navegadores modernos proporcionam, como gravar opções de navegação, bookmarks e outras opções para serem sincronizadas entre vários browsers conectados em diferentes devices para o mesmo usuário, agora temos opção semelhante no IDE. O Visual Studio 2013 introduz uma experiência conectada no IDE. Quando você iniciar o Visual Studio 2013, pela primeira vez, você será solicitado a entrar usando sua conta Microsoft, que você já pode usar com o MSDN. Uma vez conectado, a sua cópia do Visual Studio 2013 Preview será registrada para o seu uso sem a necessidade de quaisquer medidas adicionais. O Visual Studio 2013 irá sincronizar automaticamente as configurações de todo os seus dispositivos que utilizam o recurso de IDE Conectado. As configurações de sincronização incluem categorias como atalhos de teclado, aparência do Visual Studio (tema, fontes, etc) e muito mais.

O Visual Studio 2013 fornece o conjunto de ferramentas ideal para a construção de aplicações modernas que aproveitam a próxima onda de inovação na plataforma Windows (Windows 8.1), enquanto suporta também dispositivos e serviços em todas as plataformas da Microsoft. O suporte para  o desenvolvimento para Windows App Store no Windows 8.1 inclui muitas atualizações para as ferramentas, controles e templates, suporte a novo testes de interface do usuário, UI Resposnive Analyzer, Energy profiler etc.

















Blend for XAML foi aprimorado com novos recursos significativos para o design de aplicações para a Windows Store, como a adição de réguas e guias personalizados para layout de conteúdo mais preciso, bem como recursos de estilo melhorado. Blend for HTML também herda essas melhorias e adiciona novos recursos específicos para a construção de aplicativos para Windows Store com HTML, como o novo timeline para animar mudanças no CSS.















A criação de sites e serviços na plataforma Microsoft oferece muitas opções, incluindo ASP.NET WebForms, ASP.NET MVC, WCF ou serviços web da API, etc No passado, trabalhar com cada uma dessas abordagens no Visual Studio significava trabalhar com separado tipos de projetos e ferramentas isoladas para capacidades específicas do projeto. O ASP.NET usa agora uma visão unifica em projetos web no Visual Studio 201, para que você possa criar aplicações web ASP.NET usando a sua preferência de componentes ASP.NET em um único projeto. Esta nova experiência unificada inclui a capacidade de criar facilmente aplicações híbridas que incluem versões melhoradas do ASP.NET Web Forms, MVC ou Web API, tudo em um único projeto. Agora você pode misturar e combinar as ferramentas certas para o trabalho dentro de seus projetos web, dando-lhe maior flexibilidade e produtividade no desenvolvimento para a web.


















O Visual Studio 2013 incorpora novos recursos de Application Lifecycle Management (ALM), que irá ajudar as suas equipas a serem mais produtivos e colaborar com suporte melhorado para as práticas de desenvolvimento ágil que você pode adotar gradativamente para atender às necessidades de sua organização. Características como Agile Portfolio Manegment, salas de equipe (team rooms), comentários de código baseados em web para changes / commits, etc, são parte de uma solução integrada para ajudar sua equipe a colaborar melhor e aumentar a produtividade.

O núcleo de ALM do Visual Studio é fornecido pelo Team Foundation Server, que pode ser instalado em um servidor no local, ou Team Foundation Service, que está hospedado na nuvem. Então, se a equipe prefere o maior controle e personalização de uma instalação no local, ou a acessibilidade de manutenção da nuvem, há uma opção que se adapta às necessidades da sua equipe















































Alguns links selecionados sobre as novidades mais interessantes do release, incluindo melhorias no IDE, ASP.NET MVC 5, Entity Framework 6:

Announcing release of ASP.NET and Web Tools for Visual Studio 2013 Preview and the refresh update

Getting Started with ASP.NET MVC 5

ASP.NET Scaffolding with Web Forms

Entity Framework 6

What's New in Visual Studio 2013 Preview

Creating ASP.NET Web Projects in Visual Studio 2013

quinta-feira, 25 de julho de 2013

Code Rage Mobile Brasil - Desenvolvimento iOS com Delphi e DataSnap

No dia 31 de Julho acontece o evento Code Roge Mobile Brasil, promovido pela Embarcadero. O Code Rage é um evento on-line, agora em uma versão nacional, onde são apresentadas sessões técnicas gratuitas com experts de mercado em tecnologias da Embarcadero, incluindo profissionais MVPs. Na edição deste ano, estarei palestrando, em conjunto com o colega MVP Marco Antonio Moreira, sobre como construir aplicações para dispositivos móveis iOS, incluindo iPhone e iPad, que acessam dados obtidos a partir de um servidor DataSnap. No exemplo que apresentaremos, construímos um App Server DataSnap que acessa um banco de dados Interbase através de uma conexão FireDac, o novo engine de acesso a dados da Embarcadero. Este servidor de aplicação é então hospedado na nuvem, em um servidor Windows Server no Azure, a plataforma de Cloud Computing da Microsoft (também é possível usar Amazon), garantindo escalabilidade, performance e acesso remoto a partir de qualquer local do globo (hospedamos fisicamente o servidor no norte da Europa). Com isso, praticamente toda a infraestrutura fica hospedada na nuvem, banco, app server com business rules e acesso a dados, sendo que a app client se encarrega apenas de fazer a user interface. Isso permite inclusive a adição de outros tipos de aplicações clientes, usando outros devices ou SOs, como Mac, Win e futuramente Android. Mostramos então como acessar esse servidor através de TCP/IP a partir de uma app rodando diretamente em um iPhone, obtendo dados que são exibidos em um grid. Na app cliente, utilizamos FireMonkey com Visual Live Bindings para criar os efeitos visuais de tela. Em um segundo exemplo, mostramos também como consumir Web Services a partir do protocolo SOAP também em aplicações rodando em iOS. A inscrição para o evento pode ser feita acessando este link. As outras palestras técnicas incluem os seguintes temas: Tudo o que você precisa saber para iniciar com o desenvolvimento de apps com Delphi; Sem um MAC? Sem problemas! Utilizando o serviço MacInCloud com Delphi; Boas práticas na elaboração da interface visual de suas apps para aprovação na AppStore; Como empacotar e enviar sua app para a AppStore; e mais. A arquitetura do exemplo apresentado na nossa palestra pode ser vista na figura a seguir.

Update: Código Fonte, Apresentação e Gravação do Video estarão disponíveis em breve no Code Central




quarta-feira, 10 de julho de 2013

Disciplina de Programação Orientada a Objetos - Antonio Meneghetti Faculdade

Finalizada em Julho de 2013 a minha disciplina de Programação Orientada a Objetos na Faculdade Antonio Meneghetti, no Recanto Maestro. Agradeço a todos os meus alunos e desejo muito sucesso com os conhecimentos adquiridos!

terça-feira, 9 de julho de 2013

Disciplina de Estrutura de Dados - Universidade Federal de Santa Maria (UFSM)

Finalizada em Julho de 2013 a minha participação na disciplina de Estrutura de Dados na Universidade Federal de Santa Maria. Agradeço a todos os meus alunos e desejo muito sucesso com os conhecimentos adquiridos!

segunda-feira, 10 de junho de 2013

Webinar ao vivo RAD Studio XE4



(clique na imagem para fazer a inscrição)

Webinar ao vivo: 11 de junho de 2013
14:30h (horário de Brasília)


Apresentando o RAD Studio XE4 – Desenvolvimento de Aplicações Verdadeiramente Nativas para Múltiplos Dispositivos

Junte-se a nós neste webinar gratuito com Fernando Rizzato e saiba sobre as funções e os benefícios que estarão disponíveis com o RAD Studio XE4. Durante o webinar você verá:

  • Desenvolvimento Multidispositivo
  • O novo compilador
  • Evoluções da Linguagem Delphi
  • Templates para aplicações móveis
  • Controles e estilos nativos, Actions e Gestures
  • Acesso nativo a sensores
  • Banco de dados embutido
  • Desenvolvimento multicamadas

sexta-feira, 31 de maio de 2013

Videos, Artigos e Papers sobre Mobile Development com Delphi XE4

Neste post compilei uma série de links muito úteis para diversos videos, artigos e papers sobre desenvolvimento mobile para iOS com Delphi XE4, confira a lista:

Artigos (Tutoriais)

Set Up Your Development Environment on the Mac

Set Up Your Development Environment on Windows PC

Creating a FireMonkey iOS Application

Using a Button Component with Different Styles in an iOS Application

Using a Calendar Component to Pick a Date in an iOS Application

Using Combo Box Components to Pick Items from a List in an iOS Application

Using the Web Browser Component in an iOS Application

Using Tab Components to Display Pages in an iOS Application

Using ListBox Components to Display a Table View in an iOS Application

Using Layout to Adjust Different Form Sizes or Orientations in an iOS Application

Taking and Sharing a Picture in an iOS Application

Using Location Sensors on the iOS Device

Using the Notification Center on the iOS Device

Using InterBase ToGo in an iOS Application

Using SQLite in an iOS Application

Connecting to an Enterprise Database from an iOS Client Application

Lista completa de iOS Code Snippets

Mais links sobre iOS Mobile Development

Papers

The Delphi Language for Mobile Development

RAD Studio XE4 Product Reviewers Guide

Videos

What's New in RAD Studio and Delphi XE4

Using iOS Location Services in Delphi apps

Get Set Up for Delphi XE4 iOS Development

Using the iOS DatePicker in Delphi applications with TCalendarEdit

Using iOS AudioRecPlay in Delphi to Record and Play Back Sounds

iOS SendCancelNotifications in Delphi

Using IBLite in Delphi iOS Apps

Using the iOS TWebBrowser Component in Delphi - iOS_WebBrowser Code Snippet

Using the iOS Share Sheet in Delphi iOS Apps - iOS_ShareSheet Code Snippet

Use the Tap and Hold Gesture in Delphi iOS Apps - iOS_InteractiveGestures_TapAndHold Code Snippet

Pinch and Zoom in Delphi iOS Apps - iOS_InteractiveGestures_PinchAndZoom Code Snippet

Rotate an Image in a Delphi iOS App - iOS_InteractiveGestures_ImageRotation Code Snippet

Embarcadero Developer Direct Episode 1

Embarcadero Developer Direct Episode 2 - The Multi-Device Enterprise

Embarcadero Developer Direct Episode 3 - From Desktop to Multi-Device 

Embarcadero Developer Direct Episode 4 - What's True Native?

Embarcadero Developer Direct Episode 5 - From Data to Business Information

Embarcadero Developer Direct Episode 6 - On-Device Rapid Prototyping

Your First XE4 Multi-Device App

Delphi XE4. iOS. TClientDataSet, LiveBinding Designer

RAD Studio XE4 - What's new in the IDE (II)

RAD Studio XE4 - What's new in the IDE (III) - FMX Frames

RAD Studio XE4 - What's new in the IDE (IV) - iPhone 5 Support

RAD Studio XE4 - What's new in the IDE (V) - iOS Packages

RAD Studio XE4 - What's new in the IDE (VI) - Connection Profiles

RAD Studio XE4 - What's new in the IDE (VII) - SDK Manager

RAD Studio XE4 - What's new in the IDE (VIII) - Mobile Templates

RAD Studio XE4 - What's new in the IDE (IX) - Misc Changes

Delphi XE4 iOS. Configuración rápida

Delphi Programming Tutorial #93 - Fish Facts for iOS

Test aplicacion iOS Delphi XE4 2

Delphi XE4 iOS APN Remote

Delphi XE4 with ZBar,iOS,FireMonkey

Estilo de Botões iOS no Delphi XE4

XE4 iOS PAServer Demo Básico

Delphi XE4 , iOS with Static Library, Dynamic Library

Your First XE4 Multi-Device App

Get Set Up for Delphi XE4 iOS Development

Delphi iOS Location Example

Submeter para Dispositivo/App Store

Instalando o Mac OS X no Windows

(em breve mais links serão colocados aqui abaixo)

Novo: Webinar - Preview da Solução Delphi Mobile para iOS

segunda-feira, 20 de maio de 2013

Tramontina escolhe Delphi para criar sistema de vendas com iPad

Tramontina customiza software e equipa força de vendas com iPad

Fonte: TI Inside Online

A Tramontina, fabricante brasileira de talheres, panelas e utensílios domésticos, decidiu aposentar os mostruários e catálogos de produtos em papel e, ao mesmo tempo, municiar os 500 funcionários que compõem a sua equipe de vendas com tablets. A ideia também foi aproveitar os recursos oferecidos pelo aparelho para tornar mais ágil o envio de pedidos e o fechamento de negócios. Até então, parte desses funcionários usavam obsoletos PDAs da Palm, enquanto outra parte deles utilizavam notebooks, aparelhos mais pesados e sem tanta mobilidade, para fechar os pedidos.
A empresa então resolveu adquirir iPads, da Apple, por sugestão dos próprios funcionários, o que a levou também a contratar uma ferramenta para o desenvolvimento de um sistema de vendas remoto. A própria equipe de TI da Tramontina sugeriu a contratação do Delphi, plataforma da Embarcadero, para desenvolver o software para o sistema operacional iOS. O principal motivo da escolha, segundo o gerente de TI da Tramontina, Marcos Sganderlla, foi a simplicidade da linguagem Pascal, que permitiu o desenvolvimento do sistema não apenas para o sistema da Apple, como também o Windows, da Microsoft. Até o fim do ano, ele deve funcionar também no Android, do Google. Isso deu à Tramontina a possibilidade de criar um sistema reaproveitável em diversas plataformas de hardware.
“Nossa equipe de desenvolvimento já é capacitada para trabalhar com essa linguagem. Ela é simples de ser trabalhada e permitiu desenvolver uma solução que possibilitou manter o banco de dados e o armazenamento”, conta Sganderlla. Ele explica que muitos vendedores trabalham em áreas remotas de estados como Pará, Amazonas, Mato Grosso, onde não há internet. Assim, o Delphi tornou possível um sistema no qual as vendas são armazenadas no próprio hardware e, ao primeiro sinal de conexão, são enviadas à matriz. “Ele permite que todo o sistema funcione de forma ininterrupta, com efetividade e na melhor velocidade possível”, afirma o executivo.
Outro atrativo do Delphi foi o baixo custo. Em vez de investir em licenças para usuários únicos, a tecnologia foi customizada por dois desenvolvedores. Logo, o custo das duas licenças ficou em torno de R$ 9 mil reais. “Considerando a redução de 20% no tempo para fechar um pedido e os ganhos para a força de vendas, o valor investido foi irrisório”, afirma.
Sganderlla conta que o sucesso da implantação se deveu ao apoio da equipe da Embarcadero. O alto conhecimento da solução e do mercado deu a segurança à equipe da Tramontina para chegar a um sistema que atendesse às suas necessidades, ultrapassando limitações da solução e também utilizando os recursos nela disponíveis. “O mais importante é que lidamos com vendas complexas. São 17,5 mil itens no catálogo, 230 mil clientes em todas as regiões do país. O conhecimento de Tertius e a robustez do Delphi foram capazes de suportar essa complexidade das operações”, conclui Sganderlla.

domingo, 19 de maio de 2013

Criando aplicações iOS com Delphi e banco de dados Interbase

Com o RAD Studio XE4, uma nova edição do InterBase foi lançada. A família existente de edições do InterBase (servidores, desktops, Developer e Togo) foi reforçada por uma edição chamada "IBLite". Esta edição pode ser distribuída gratuitamente com seus aplicativos. O IBLite usa o modelo de distribuição integrado semelhante ao InterBase "ToGo", embora com algumas limitações. A seguir temos uma visão geral das edições do InterBase e as suas características e limitações (clique na imagem para ampliar):












As mais importantes limitações do IBLite são:
Tamanho max. do banco de dados = 100MB
Max de transações simultâneas = 1
Se você precisar de mais espaço ou transações, sua outra opção (embora pago) para dispositivos iOS é a edição "ToGo". No entanto, quando se fala de dispositivos móveis, 100 MB com uma transação é muito provável que seja suficiente.


Desenvolvendo aplicativos InterBase para dispositivos iOS

Todos os passos seguintes são idênticos para IBLite e InterBase ToGo.

Licenças

O RAD Studio XE4 vem com um serial gratuito para o IBLite e um serial para testes para o InterBase ToGo. O serial do ToGo só pode ser utilizado para testes e não se destina a ser publicada com aplicativos para a App Store. Para entrar em produção com InterBase ToGo você precisa de uma licença separada. Entre em contato com seu escritório local da Embarcadero para preços e termos (endereço no Brasil http://www.embarcadero.com/br/how-to-buy). A chave IBLite que vem com XE4 é ótima para ser usada em ambiente de produção, e é completamente grátis!

Os seriais se parecem com estes:

IBLite XE3 para iOS - Licença de distribuição

AAAA-BBBBBB-CCCCCC-DDDD

InterBase XE3 ToGo - Teste

AAAA-BBBBBB-CCCCCC-DDDD

A versão do Interbase que vem com o RAD Studio XE4 / Delphi XE4 é a "XE3" - portanto, não se confunda com os números de versão.

Você precisa registrar as chaves e criar um arquivo REG______.txt, que será distribuído para o dispositivo, juntamente com seu aplicativo.

Update 1:

Agradecimentos a Sriram Balasubramanian - Engenheiro do InterBase - Embarcadero Technologies Inc. pela atualização, com um e-mail para os usuários do IBLite e Delphi iOS:

Usuários do RAD Studio XE4 - quem está desenvolvendo para iOS também terá um S/N do IBLite em seu email de registro do RAD Studio. A fim de obter um arquivo de licença do IBLite, tudo que precisa ser feito é clicar sobre a URL fornecida no e-mail e digitar o S/N do IBLite, eles então receberão o código de registro mencionado no e-mail. Uma vez que este é inserido, a página mostrará automaticamente os termos e condições suplementares que o usuário precisa aceitar para distribuir esta licença com a sua aplicação iOS (apenas um clique). Assim que isso for aceito, o usuário é apresentado com o REG_ * txt que pode ser enviado por e-mail ou ser feito o download para o seu computador para que possa ser incluído no seu pacote de aplicativos via "Project | Deployment file list".

Os usuários recebem uma mensagem de e-mail como este:

Nota:

Este produto Embarcadero também lhe dá direito a um IBLite gratuitamente para licença de distribuição do banco de dados iOS. Para ativar sua licença de implantação, vá para https://reg.codegear.com/srs6/activation.do e digite o S/N do IBLite para iOS e o código do registo: xxxxxx.



Digite o seu número de série e código de registro do License Manager no formulário Web:














Pressione o botão "Next" no formulário da Web. O próximo passo requer que você fazer o login com suas credenciais da conta Embarcadero EDN.
















Depois de pressionar "Next" novamente, você deve obter o seguinte "Registo do produto" formulário Web:



















Na parte inferior do formulário da Web que você vai encontrar opções para baixar ou enviar por e-mail um arquivo de ativação do InterBase.










Este arquivo de ativação vem como REG___.txt, que você precisa adicionar ao seu aplicativo iOS, para obter InterBase desbloqueado.

Primeiro, deve-se renomear REG____.txt, dependendo da edição que você escolheu:
reg_iblite.txt (IBLite)
reg_ibtogo.txt (InterBase Togo)

Copie o arquivo de registro (s) para:

C:\Users\Public\Documents\InterBase\redist\InterBaseXE3

Agora você está pronto para desenvolver sua primeira aplicação iOS com RAD Studio / Delphi XE4 e InterBase.

Aplicação de demonstração

Crie uma aplicação do tipo "FireMonkey Mobile Application"



















Adicione um TButton e um TListbox no formulário.




Agora, adicione uma nova conexão ao banco de dados de demonstração "EMPLOYEE". Para isso, abra a janela Data Explorer do Delphi e selecione "Add New Connection", sob o item IBLite / ToGo e renomeie a conexão para "EMPLOYEE":

.
























Na caixa de diálogo de configuração de conexão adicione o caminho para Employee.gdb. Este arquivo pode ser encontrado na pasta Samples do Delphi, em "Data". O nome de usuário padrão é "sysdba", a senha padrão é "masterkey" (sem aspas). Veja a imagem para obter mais detalhes:












Dê um duplo clique para abrir o item "EMPLOYEE" e assim ver todas as tabelas que vêm com Employee.gdb:


























Agora arraste e solte o item "EMPLOYEE" para seu formulário principal. Isso criará automaticamente um componente TSQLConnection configurado corretamente:












Observações: No exemplo estou armazenando Employee.gdb no dispositivo iOS em /Documents/Data/Employee.gdb. Claro que você pode usar qualquer diretório que está disponível para o seu aplicativo no dispositivo. Usar a pasta de documentos tem a vantagem de que tudo é incluído no processo de backup do dispositivo IOS, incluindo backups locais com iTunes ou backups no iCloud.

Para se conectar ao banco de dados em tempo de execução (no dispositivo iOS), um "IFDEF IOS" é usado no evento"BeforeConnect" do TSQLConnection para definir o caminho para o arquivo de banco de dados:














No evento "ButtonClick" adicione o seguinte código:
















Antes de executar o aplicativo no simulador iOS ou dispositivo iOS, temos de acrescentar alguns itens no Deployment Manager, que pode ser aberto através do menu "Project - Deployment"



O Deployment Manager lista todos os arquivos que são instalados com o seu aplicativo no dispositivo. É importante notar que todos os itens têm um caminho local (na máquina de desenvolvimento) e um caminho remoto no dispositivo iOS:




Você precisa adicionar os arquivos do cliente Interbase e o arquivo de licença que você criou anteriormente.

Observações: Selecione "All Configurations" no Deployment Manager. Caso contrário, você terá que executar estas etapas separadamente para configurações de Simulator, Device e Debug / Release.

Primeiro adicione alguns itens na caixa de diálogo "Fetaured Files":
















Depois de adicionar esses itens você vai encontrá-los na lista de itens do Deployment Manager. Você também verá dois arquivos de licença: reg_iblite.txt e reg_ibtogo.txt. Certifique-se de que apenas um deles é distribuído, ou seja, desative ou remova qualquer um deles.




















Agora adicione o arquivo EMPLOYEE.GDB ao Deployment Manager:



Depois de adicionar o arquivo você precisa mudar seu caminho remoto para o simulador ou o aparelho (device). Para fazer isso, dê um duplo clique em "Remote Path". Digite: "StartUp\Documents\data\"













Agora salve todos os arquivos e execute o seu primeiro aplicativo Delphi com Interbase rodando no iOS.



























Artigo original por Daniel Magin, nosso colega MVP da Alemanha, o qual agradeço pela gentileza de ter autorizado a tradução do material e a publicação neste blog.