Arquivos da categoria : Programação


Delphi XE5 OAuth – RESTDemos bug   Recently updated !

Há um bug no demo RESTDemos do Delphi XE5 que faz com que os demos de OAuth não funcionem.

O Erro é pequeno apenas o evento para capturar o resultado da autenticação está errado, basta alterar de Tfrm_OAuthWebForm.OnBeforeRedirect  para OnAfterRedirect, como no exemplo do Facebook:

procedure Tfrm_Main.btn_Facebook_FetchAuthTokenClick(Sender: TObject);
var
  LURL: string;
  wv: Tfrm_OAuthWebForm;
begin
  edt_GoogleTasks_AuthCode.Text := '';
  edt_GoogleTasks_AccessToken.Text := '';

  LURL := 'https://www.facebook.com/dialog/oauth';
  LURL := LURL + '?client_id=' + URIEncode(edt_Facebook_AppID.Text);
  LURL := LURL + '&response_type=token';
  LURL := LURL + '&scope=' + URIEncode('user_about_me,user_birthday');
  LURL := LURL + '&redirect_uri=' + URIEncode('https://www.facebook.com/connect/login_success.html');

  wv := Tfrm_OAuthWebForm.Create(self);

// comentar a próxima linha
//  wv.OnBeforeRedirect := OAuth2_Facebook_AccessTokenRedirect;

// adicionar a próxima linha
  wv.OnAfterRedirect := OAuth2_Facebook_AccessTokenRedirect;
  wv.ShowModalWithURL(LURL);

  wv.Release;
end;

Já criei um QC para Embarcadero corrigir isto no repositório SVN dos demos:

Report No: 123999 – Status: Reported
RESTDemos OAuth error
http://qc.embarcadero.com/wc/qcmain.aspx?d=123999


Usando RealThinClient e RTTI para enviar Streams

Acabei de publicar mais um artigo sobre o RealThinClient no blog oficial

RTC RTTI

Este artigo mostra como criar uma aplicação servidora e cliente com os componentes RealThinClient, para enviar e receber objetos e listas de objetos. Para tal os objetos são convertidos para Stream usando a nova RTTI e Custom Attributes.

O programa exemplo é bem detalhado, as units compartilhadas entre servidor e cliente também estão num projeto DPK, e são utilizadas como referencia para outro projeto de testes unitários com DUnit que está incluído.

Os anexos no fim do artigo são:

  • Grupo de projetos com os exemplos
  • Download do artigo no formato PDF

Nos próximos dias estarei publicando outros artigos baseados no mesmo exemplo, explicando com mais detalhes as técnicas usadas.


Wizard de projetos DUnit não encontrado no Delphi XE3

Hoje depois de terminar de escrever um programa demostranção para meu último artigo sobre os componentes RTC SDK, eu queria criar um projeto de testes com DUnit, mas não encontrei o Wizard Unit Test no menu “File >> New >> Other”.

Então procurei no Registro do Windows se o pacote DUnit  (unittestide170.bpl) estava declarado em HKCU\Software\Embarcadero\BDS\10.0\Known IDE Packages\Delphi, e não estava, embora estivesse em HKCU\Software\Embarcadero\BDS\10.0\Known IDE Packages\CBuilder, somente disponível para C++ Builder.

Para encurtar a história, eu corrigi isto criando uma entrada em HKCU\Software\Embarcadero\BDS\10.0\Known IDE Packages\Delphi

  • Nome = $(BDS)\Bin\unittestide170.bpl
  • Valor = DUnit

Delphi DUnit Registry

Não sei o que aconteceu durante a instalação, mas depois de reiniciar a IDE do XE3 eu pude criar meu projeto de testes.

Delphi DUnit New Project

Read the English version of this post
DUnit project wizard missing in Delphi XE3


Script para baixar atualizações de repositórios Subversion, Mercurial e Git

Repository Update

Repository Update

Eu mantenho cópia local dos projetos Open Source que me interessam, e toda vez que precisava usá-los tinha de fazer atualização manual usando o “Tortoise” do repositório correspondente.

Para evitar o trabalho manual resolvi escrever um script para automatizar a tarefa.

Eu queria um script que pude-se varrer todas as pastas e subpastas, sem a necessidade de eu ter de atuar uma lista a cada novo repositório,  assim surgiu o repository_update.bat.
Meus projetos ficam na seguinte estrutura:

C:\Documents\Projects\[Components, Libraries, Frameworks]

O script fica em:

C:\Documents\Projects\repository_update.bat

Basta executa-lo, e ele varre todos os subdiretórios e atualiza a cópia local de cada projeto.

Para que o script funcione corretamente é necessário verificar algumas configurações que estão na sessão ENVIRONMENT:

:ENVIRONMENT
 set UPDATE_HG=1
 set UPDATE_GIT=1
 set UPDATE_SVN=1

 set HG_CMD="C:\Program Files\TortoiseHg\hg.exe"
 set GIT_CMD="C:\Program Files (x86)\Git\cmd\git.exe"
 set SVN_CMD="C:\Program Files\SlikSvn\bin\svn.exe"
 set SVN_ASYNC_CMD=C:"\Program Files"\TortoiseSVN\bin\TortoiseProc.exe
 set HG_PARAMS=pull -u
 set GIT_PARAMS=pull --all -u
 set SVN_PARAMS=update
 set SVN_ASYNC_PARAMS=/command:update /path:%%G 

 :: SVN_ASYNC=1 call GUI async, default 0
 set SVN_ASYNC=0

 :: English = EN_US
 :: Portugues Brasil = PT_BR
 set SCRIPT_LANGUAGE=PT_BR
  • As 3 primeiras linhas ativam=1 ou desativam=0 o suporte aos respectivos repositórios.
  • Depois o path dos comandos a serem executados. Note o último item deste grupo, é a versão GUI do TortoiseSVN, que só é útil se o parâmetro SVN_ASYNC for igual a 1.
  • Os parâmetros estão separados dos comandos para evitar que sejam alterados acidentalmente.
  • SVN_ASYNC, executa o TortoiseSVN gráfico de forma assíncrona, abrindo uma janela para cada repositório Subversion encontrado.
  • E por último a linguagem das mensagens.
Repository Update done!

Repository Update done!

 

Download

Você pode adicionar o script repository_update.bat no agendador de tarefas do Windows para que ele seja executado diariamente, mantendo todos os seus projetos sempre atualizados.


DHibernate – Features Explained Parte II 1   Recently updated !

Leia também:

 

  • DHibernate – Features Explained Parte I

 

ITransaction

Opcional. Utilizada para gerenciar transações do banco de dados. Representa um objeto de vida curta para controlar unidades de trabalho atômicas.

Qualquer comando enviado para o banco de dados é controlado por uma transação, o DHibernate criará uma transação automaticamente sempre que necessário.  Uma ISession pode conter várias ITransaction.

Se a transação for criada manualmente, deve ser finalizada com Commit ou RollBack.

IQuery

Interface utilizada para executar queries no banco de dados e controlar como a query é executada.

Se precisar limitar os resultados de uma consulta, como o número máximo de linhas ou especificar a partir de que linha deseja recuperar, é necessário obter uma instancia de IQuery.

Utilize ISession.CreateQuery para obter uma nova IQuery.

ICriteria

Usada para criar dinamicamente queries orientadas a objetos e executá-las.

ICriteria representa uma query para uma classe persistente em particular.


DHibernate – Features Explained Parte I   Recently updated !

Este é o primeiro artigo sobre as features do DHibernate.

Vou publicar uma série de artigos contendo explicações sobre a implementação do framework de persistência.

A publicação neste blog é para manter a referência do DHibernate em português, depois ele será traduzido para inglês e enviado para a revisão, e só então publicado no wiki do projeto.

IConfiguration

É a primeira classe a ser instanciada e contêm as configurações que identificam o Driver e Dialeto do banco de dados, classes de Cache e Transação e outras configurações que alteram o comportamento do framework.

Além de armazenar todos estes parâmetros esta classe validará as informações:

  • Arquivos externos de configuração.
  • Se os parâmetros de conexão do banco de dados estão corretos.
  • Carregar e validar os metadados de mapeamento das classes.
  • Carregar e validar as instruções sql pré-definidas como NamedSql.

Após toda a configuração estar carregada e validada é possível obter uma instancia de ISessionFactory, contendo todas estas configurações prontas para serem usadas, não sendo necessário efetuar nenhuma carga ou validação.

Deve ser criada uma IConfiguration para cada banco de dados ou para cada Schema, pois tudo será validado antes de se obter uma ISessionFactory.

ISessionFactory

É pesada, deve ser criada somente uma vez e compartilhada por todas as threads, então a implementação deve ser threadsafe.

Normalmente existe apenas uma instancia para toda a aplicação. Se for necessário conectar a mais de um banco de dados, deve ser criado uma instancia de ISessionFactory para cada conexão.

A única configuração carregada diretamente é  INameStrategy, que deve ser feita antes de se criar uma ISession, pois ela define as regras de como o framework vai gerar  nome de Tabelas, Colunas , Índices, Chaves Primárias e Estrangeiras.

ISessionFactory faz cache de intruções SQL geradas e metadados do mapeamento utilizados em tempo de execução.

Além de criar novas instancias de ISession, é responsável por guardar a referencia das ISession sendo utilizada através da propriedade CurrentSession.

ISession

É leve e pode ser criada sempre que necessário. Principal Interface, pois encapsula o Database Provider e todos os objetos necessários para a comunicação direta com o banco de dados. Também responsável pela criação de Transações.

Expõe métodos para localizar, salvar, atualizar e excluir objetos, também conhecida como Persistence Manager.

Após uma conexão ser estabelecida, é criado um cache de acordo com os parâmetros definidos em IConfiguration. Este cachê armazenara a referencia de todos os objetos persistentes, criados pelo usuário e salvos, ou recuperados do banco de dados. Pode ser considerada como uma coleção de objetos persistentes relacionados a uma única unidade de trabalho. Ver o Design Pattern Unit of Work.

Próximo Artigo:

  • ITransaction
  • IQuery
  • ICriteria

Delphi Hibernate

Objetivo

O projeto Jazz SDK precisava ser renovado, e desde que o publiquei, o Hibernate e o NHibernate se popularizaram e amadureceram, desta forma é natural a utilização do design e experiência existente nesta nova versão, para que os usuários e desenvolvedores utilizem toda a base de conhecimento já existente.

Deste ponto em diante, será utilizado à abreviação “XH” como referencia a “Hibernate e NHibernate”.

O desenvolvimento está sendo feito com o Delphi XE2, vários recursos utilizados só estão presentes a partir do Delphi 2010, mas somente após testar todo o framework em cada versão de Delphi, poderei dizer quais versões serão oficialmente suportadas, espero ter a ajuda de colaboradores para estes testes.

O framework DSharp será utilizado evitando duplicação de funcionalidades, restando mais tempo para focar nos recursos exclusivos do ORM.

Agradecimentos ao autor do DSharp, Stefan Glienke, por autorizar a utilização desta maravilhosa biblioteca.

Recursos

  • Uma versão futura com os recursos da versão mais atual do XH é planejada, no momento foi selecionado um subconjunto destes recursos que são os necessários para projetos atuais.
  • Todos os recursos selecionados seguirão o modelo já definido no XH sendo ajustado aos recursos do Delphi.
  • Qualquer outro recurso sugerido deverá primeiramente seguir o modelo XH, e outros qualquer outro caso será analisado antes de ser aceito.
  • Lista completa de Recursos da versão 1.0 http://code.google.com/p/delphi-hibernate/wiki/Features

Regras para colaboradores

O desenvolvimento será aberto e seguirá regras para manter a qualidade e o propósito:

  • O design deve seguir as especificações das API’s do XH, ajustadas aos recursos do Delphi.
  • Todo o código deve ser acompanhado de testes
    • DUnit
    • DSharp.Testing.Mock
  • Deverá ser criada a documentação correspondente ou pelo menos a referencia a documentação existente no XH.
  • A versão de desenvolvimento deve sempre ser compilável, mesmo que o recurso não esteja finalizado.
  • O código deve ser formatado de acordo com as regras definidas, um documento com  as regras será publicado junto com o arquivo de configuração de formatação do Delphi.
  • Para a colaboração ser aceita, deve ser solicitada a revisão do código, somente após os revisores aprovarem, o código será adicionado ao repositório principal.
  • Desejável um programa exemplo, compilável e com todas as dependências inclusas.

Projeto

O projeto está hospedado no Google Code no endereço:


Crítica a comunidade

Acabei de ler este texto interessante, em que concordo com quase tudo.

Ele me fez lembrar de vários pensamentos sobre a necessidade de se elevar o nível entre os profissionais das diversas áreas de desenvolvimento de software.

Estes problemas acontecem em todas as comunidades de tecnologia, abrangendo todas as plataformas, todas as linguagens e todas as metodologias. Não é um problema exclusivo da plataforma .NET, todavia é frustrante ver que há pouca inovação na mente de quem compõe as comunidades MS. O tempo que deveria ser a fogueira das vaidades para os técnicos, somente provou que maturidade quando não acontece com muita evolução torna-se desgaste. É parcialmente triste ver novas comunidades com 5 anos ou menos que demonstram mais união, participação e empenho. Passa a sensação de que se as pessoas da geração anterior estivessem começando hoje, não estariam tão instigadas a buscar conhecimento em soluções MS, justamente por enxergar nas suas comunidades menos características motivadoras, seja pela experimentação, pela profundidade ou pela curiosidade inteligente tão mais presente. Não que a empresa não ofereça isto, mas pelo brio enfraquecido de seus participantes.

O texto completo e longo está em:
https://gist.github.com/2709913


WordPress – Tema Compre sua Casa 1

Tema WordPress - Compre sua CasaEsta semana conclui o projeto de um website para representação comercial, este é um tema que criei para o wordpress com PHP, este tema segue todos os padrões e recomendações do WordPress.

A barra lateral esquerda e a parte inferior central suportam widgets, então o administrador do site pode mudar qualquer um dos elementos para qualquer posição, configurar número de itens listados, remover um grupo, instalar plugins do wordpress e colocar nestas posições, mudando completamente a forma que o site se apresenta.

Eu utilizei Rad4PHP para trabalhar com este projeto, mas como se trata de uma programação de tema wordpress, o design do Rad4PHP não foi utilizado, apenas gerenciamento do projeto e editor PHP com os recursos de code completion e um pouco do debug.

Para este projeto estou trabalhando em um cliente em Delphi, que conecta via XML-RPC ao site para gerenciar Posts, Comentários, Categorias, Tags. Este cliente funciona como ferramenta auxiliar para o representante comercial gerenciar os seus contatos e agenda de trabalho, para o envio de fotos criei uma ferramenta que foi integrada ao projeto, que faz um tratamento das fotos, redimencionando em batch todas as fotos e convertendo para um padrão comum.

Já estou trabalhando para melhorar este projeto, organizando melhor, adicionando atalhos e integrando com o shell do windows para que o produto esteja pronto para venda em breve.