Arquivos da categoria : Web


Messenger Erro 81000306 10

Este erro é de problema de conexão da Internet, que pode acontecer por que você está sem Internet ou por que o acesso a Internet está bloqueado por um Firewall ou Proxy, eliminando estas possibilidades, o primeiro teste a fazer é tentar navegar em outros sites com o Internet Explorer (IE), é necessário que seja com o IE, pois o Messenger (MSN) compartilha alguns métodos de conexão. Se não estiver navegando o problema é na conexão de internet, assim que você puder navegar, o MSN deve se conectar normalmente.

Se continuar não conectando:

  1. Verifique se o IE não está configurado para “Trabalhar Offline”, no IE8 esta opção fica no menu Ferramentas, nas versões anteriores pode estar no menu Arquivo.
  2. Faça uma limpeza dos arquivos de “Histórico de Navegação” no IE, no menu: Ferramentas >> Opções de Internet >> Histórico de navegação, clique no botão Excluir.

Após estes passos, feche o IE e o MSN, reiniciei o MSN e tente conectar, se ainda não for possível conectar, tente o seguinte método:

Execute o Prompt de Comando como Administrador, se não souber como, vá no menu Iniciar >> Todos os Programas >> Acessórios >>clique com o botão direito do mouse sobre o ítem “Prompt de Comando” >> Executar como Administrador, na janela que aparecer digite o seguinte comando:

netsh interface tcp set global autotuninglevel=disabled

E tente conectar novamente o MSN, depois execute o seguinte comando na mesma janela:

netsh interface tcp set global autotuninglevel=normal

Requisições HTTP com Delphi sem componentes 4

WinHTTP
Para efetuar requisições HTTP sem nenhum componente, é necessário utilizar as bibliotecas do Windows. Em todas as versões recentes do Windows a biblioteca WinHTTP está disponível também através da interface COM, e o Delphi faz nossa vida muito fácil, já que podemos importar esta biblioteca e ter os componentes instalados utilizando o Wizard de importação de Componentes, em poucos cliques.

Para gerar a unit com a interface para acessar a biblioteca WinHTTP, através do menu “Component | Import Component” – Import a Type Library >> Selecione “Microsoft WinHTTP Services” >> Você pode instalar os componentes no Delphi ou apenas gerar a unit e adicionar ao seu projeto, eu utilizei esta opção e o Wizard criou e adicionou ao meu projeto uma nova unit chamada WinHttp_TLB.pas.

Eu escrevi os métodos HttpRequest e SaveHttpResponse, para reutilizar em meus projetos, a seguir o código completo destes métodos e como utilizá-los.

uses
  ActiveX, AxCtrls, WinHttp_TLB;

function HttpRequest(const URL: string): IStream;
var
  HttpRequest: IWinHttpRequest;
begin
  HttpRequest:= CoWinHttpRequest.Create;
  HttpRequest.Open('GET', URL, false);
  HttpRequest.Send(EmptyParam);
  Result:= IUnknown(HttpRequest.ResponseStream) as IStream;
  HttpRequest:= nil;
end;

procedure SaveHttpResponse(const ResponseStream: IStream; const FileName: string);
var
  OleStream: TOleStream;
  FileStream: TFileStream;
begin
  if (ResponseStream = nil) or (FileName = '') then
    Exit;

  OleStream:= TOleStream.Create(ResponseStream);
  try
    FileStream:= TFileStream.Create(FileName, fmCreate);
    try
      OleStream.Position:= 0;
      FileStream.CopyFrom(OleStream, OleStream.Size);
    finally
      FileStream.Free;
    end;
  finally
    OleStream.Free;
  end;
end;

procedure LoadResponseFromStream(WebBrowser: TWebBrowser; const ResponseStream: IStream);
var
  PersistStream: IPersistStreamInit;
begin
  if not Assigned(WebBrowser.Document) then
    WebBrowser.Navigate('about:blank');

  if WebBrowser.Document.QueryInterface(IPersistStreamInit, PersistStream) = S_OK then
    if PersistStream.InitNew = S_OK then
      PersistStream.Load(ResponseStream);
end;

procedure TFormHTTPRequest.ButtonGetLoadClick(Sender: TObject);
var
  ResponseStream: IStream;
begin
  ResponseStream:= HttpRequest(EditURL.Text);
  if ResponseStream <> nil then
  begin
    SaveHttpResponse(ResponseStream, EditSave.Text);
    LoadResponseFromStream(WebBrowser, ResponseStream);
  end;
end;

Apenas para navegar em um site utilizando o TWebBrowser, bastaria uma linha de código WebBrowser.Navigate(‘http://www.cesarromero.com.br’), mas o objetivo deste exemplo é:

  1. Navegar utilizando a biblioteca WinHTTP
  2. Salvar o conteúdo em Stream
  3. Salvar o Stream em um arquivo
  4. Carregar o conteúdo de Stream no TWebBrowser

MSN Live Messenger + Webcam = Erros: 0x8ac70013, 0x8100039d 126

Sempre que tive problemas para usar a webcam no messenger nunca encontrei uma solução simples. Há alguns dias o problema voltou,  e quando tento utilizar o recurso de vídeo, o messenger mostra a mensagem de erro “O Messenger não está disponível agora. Tente novamente mais tarde.
Com um dos códigos de erro: 0x8ac70013, 0x8100039d

  • A solução para o erro 0x8ac70013 é simples, basta limpar os arquivos temporários e cookies do Internet Explorer.
  • Já o erro 0x8100039d foi mais difícil de descobrir, encontrei a dica no newsgroup do live messenger da microsoft:

O problema está relacionado com as conexões de rede virtuais, criadas pelos programas VMWare ou VirtualBox, eu tenho os dois instalados aqui.

Estes são os passos para corrigir o erro:

  1. Desativar as conexões de rede:
  2. VMware Network Adapter VMnet1” e “VMware Network Adapter VMnet8“.
  3. Desativar a conexão de rede “VirtualBox Host-Only Network“.
  4. Sair e reiniciar o Windows Live Messenger.

Depois disto, a webcam deve voltar a funcionar normalmente e você poderá fazer as chamadas de vídeo.



Twitter API com Delphi

Guinther Pauli postou no Code Central um exemplo de como usar o Delphi para se comunicar com o Twitter.

O exemplo usa TIdHTTTP para se comunicar com o site e TXMLDocument para interagir com os campos.

Vale a pena verificar como é feito, pois pode ser utilizado para entender como se comunicar com outros sites Web.

Eu tenho utilizado muito o TWebBrowser para interagir com sites Web com sucesso, escrevi umas ferramentas e componentes para me auxiliar a debugar e montar as rotinas e tenho alguns componentes prontos em fase de homologação para comercializar, estes componentes são utilizados para emissão das guias de impostos do PR, a GRPR online e para se comunicar com a Equifax.

Eu tive de utilizar o TWebBrowser por que é necessário interagir com a página, disparando eventos programados na página, javascript, certificados para validar a comunicação, opções de segurança do IE, plugins, mas este já é assunto para outro post, só toquei no assunto aqui, para deixar claro que a solução do twitter podia utilizar o TWebBrowser.


WordPress XML-RPC Com Delphi e Indy 10 3

O WordPress suporta comunicação remota, atravéz de XML-RPC, ontem ajudei um amigo a criar um aplicativo simples em Delphi, para postar e fazer upload de arquivos com Delphi e Indy 10.

A minha primeira tentativa foi utilizando o RemObjects, mas ele apresentou alguns bugs, eu corrigi os fontes do RemObjects e consegui fazer a chamada, mas analisando a necessidade, vi que poderia ser feito de forma mais simples, utilizando apenas o Indy e escrevendo alguns poucos métodos.

Já comecei a escrever um exemplo de como implementar usando o Jazz SDK, a nova versão que está no forno, será um exemplo que acompanhará os fontes, mas por enquanto vou escrever as dicas de como fazer o upload de arquivos, que servirá como base para todas as funções do WordPress descritas na página Codex XML-RPC wp.

Método remoto para enviar um arquivo: wp.uploadFile

Parâmetros:

  • int blog_id
  • string username
  • string password
  • struct data
    • string name
    • string type
    • base64 bits
    • bool overwrite

Resultado:

  • struct 
    • string file
    • string url
    • string  type

Onde:
Primeiro o tipo correspondente e segundo o nome do campo.

Struct se refere a estrutura de um Objeto em Delphi.

O primeiro passo é montar a requisição, a requisição pode ser montada utilizando TXMLDocument, ou outro gerador de XML Nodes. O formato do XML é o padrão definido para qualquer comunicação XML-RPC, este aqui é o modelo de um XML para a chamada de envio de um arquivo:

 
<methodCall>
  <methodName>wp.uploadFile</methodName>
  <params>
    <param>
      <value>
        <int>[blog_id value]</int>
      </value>
    </param>
    <param>
      <value>
        <string>[username value]</string>
      </value>
    </param>
    <param>
      <value>
        <string>[password value]</string>
      </value>
    </param>
    <struct>
      <member>
        <name>name</name>
        <value><string>[name filename.ext value]</string></value>
      </member>
      <member>
        <name>type</name>
        <value><string>[type mime datatype]</string></value>
      </member>
      <member>
        <name>bits</name>
        <value><base64>[bits file content]</base64></value>
      </member>
      <member>
        <name>override</name>
        <value><bool>[override value]</bool></value>
      </member>
     </struct>
  </params>
</methodCall>

As chaves “[” e “]” e a descrição entre elas, devem ser substituídos pelos valores dos conteúdos correspondentes, descritos em Parâmetros acima.

O blog_id, deve ser recuperado com a chamada remota do método “wp.getUsersBlogs“, a seguir login e senha do usuário, e o struct do arquivo a ser enviado.

Onde name é o nome do arquivo, com extensão, a extensão é importante pois o WordPress validará se o tipo do arquivo é aceito, pela extensão.

type é a descrição de tipo mime, de acordo com os tipos aceitos, descritos na página Using Attachments

bits é o conteúdo do arquivo, codificado no padrão “Encode 64″,  e por fim o override, indica se um arquivo com o mesmo nome deve ou não ser sobrescrito.

O código em Delphi com Indy para enviar o arquivo fica assim:

procedure WPUploadFile(const FileName: string);
var
  TargetURL: string;
  DataFile, EncodedData, Request, Response: TMemoryStream;
begin
  TargetURL:= 'http://www.url_do_blog.com.br/xmlrpc.php';
  DataFile:= TMemoryStream.Create;
  Request:= TMemoryStream.Create;
  Response:= TMemoryStream.Create;
  EncodedData:= TMemoryStream.Create;
  DataFile.LoadFromFile(FileName);
  DataFile.Position := 0;
  try
    EncodeStream(DataFile, EncodedData);
    PrepareRequestXML(Request, EncodedData);

    IdHTTTP1.IOHandler:= IdIOHandlerStack1;
    IdHTTTP1.Post(TargetURL, Request, Response);

    Response.Position:= 0;
    MemoResponse.Lines.LoadFromStream(Response);
  finally
    Request.Free;
    Response.Free;
    DataFile.Free;
    EncodedData.Free;
  end;
end;

O método EncodeStream, está na unit EncdDecd. 

O método PrepareRequestXML, é um método que escrevi para montar o XML Request, de acordo com o código XML acima.

Os componentes do Indy utilizados foram TIdHTTP e TIdIOHandlerStack, e todo o código da chamada é composto apenas de 2 linhas, o restante é apenas para chamar o código que monta o XML da requisição e receber o resultado, que será mostrado num memo chamado MemoResponse. O correto agora seria cria um objeto, com as propriedades retornadas, que são:

  • file nome do arquivo salvo no servidor
  • url url para acessar a imagem diretamente
  • type tipo do arquivo

Em breve publicarei um exemplo de como criar postar no WordPress com Delphi, utilizando objetos feitos com o Jazz SDK.


CodeGear – Newsgroup e Fórum

O servidor NNTP da CodeGear está fora do ar por alguns dias, houveram algumas tentativas frustradas de restaurar o servidor, mas o servidor continuou caindo.

Mas John Kaster e sua equipe já estavam trabalhando em uma solução. Agora temos um novo servidor NNTP e Fórum.

Esta nova solução usa o banco de dados da CodeGear, o BlackfishSQL.

Passo a dica para os frequentadores do Newsgroup, que recebi do colega “Q Correll”, após algumas tentativas de postar sem sucesso, usar o login de acesso a Developer Network, o login do site da CodeGear, do site Members.

 

Referências


Delphi 4 PHP – Smarty Templates 2

O D4PHP tem suporte nativo a Smarty Templates, que é um recurso muito interessante, que aumenta a produtividade ao mesmo tempo que ajuda a separar a lógica do design.

O problema que eu encontrei, é que a forma em que foi implementado, depende que o PHP esteja com variáveis globais habilitadas, como eu mantenho este recurso desabilitado, quando tentava usar Smarty Templates com D4PHP, sempre dava erro, e a mensagem de erro não ajudava muito.

Este erro só acontece se no PHP as variáveis globais estiverem desabilitadas.

Com uma dica do Jonathan Benedicto, fiz uma pequena alteração no arquivo “vcl/smartytemplate.inc.php”, para que o diretório temporário fosse carregado do ambiente e não da variável global “TMP”.

A alteração fica na function initialize(), eu comentei o código anterior e adicionei o novo, linha ~51:

function initialize(){
	require_once("smarty/libs/Smarty.class.php");
	$this->_smarty = new Smarty;    
	$this->_smarty->left_delimiter='{%';    
	$this->_smarty->right_delimiter='%}';    
	$this->_smarty->template_dir = '';    
	
	if ( preg_match( "/^WIN/i", PHP_OS ) ){
/* 	// inicio do código comentado        
		if ( isset( $_ENV['TMP'] ) ){            
			$this->_smarty->compile_dir = $_ENV['TMP'];        
		}        
		elseif( isset( $_ENV['TEMP'] ) ){            
			$this->_smarty->compile_dir = $_ENV['TEMP'];                              
		}	        
		else {            
			$this->_smarty->compile_dir = '/tmp';        
		}    
	}    
	else{        
		$this->_smarty->compile_dir = '/tmp';    
	}
*/ // fim do código comentado      

		if (getenv('TMP')){            
			$this->_smarty->compile_dir = getenv( 'TMP' );        
		}        
		elseif(getenv('TEMP')){            
			$this->_smarty->compile_dir = getenv( 'TEMP' );        
		}        
		else {            
			$this->_smarty->compile_dir = '/tmp';        
		}	    
	}                                       
	$this->_smarty->cache_dir=$this->_smarty->compile_dir;
}

Referências


Delphi 4 PHP e jQuery 1

O Delphi 4 PHP 2.0 já vem com a jQuery instalada, mas o mais interessante é que ele já tem um componente de apresentação de slides baseado no jQuery.

Um exemplo de uso do JQuerySlider está na pasta "C:\Program Files\CodeGear\Delphi for PHP\2.0\vcl\samples\JQSlider", ele mostra como apresentar Slides e como adicionar novo conteúdo ao Slide em tempo de execução.

O componente JQuerySlider também pode ser utilizado como exemplo para a criação de outros componentes baseados na jQuery, apesar de conveniente, a criação de componentes não é obrigatória para utilizar a jQuery com o Delphi 4 PHP.

image_thumb[4]

Estou desenvolvendo um projeto com o Delphi 4 PHP no momento, pretendo publicar as dicas do que aprender da integração do jQuery com D4PHP.


jQuery – Um novo jeito de escrever JavaScript – atualizado

jQuery é uma biblioteca JavaScript rápida e pequena, que simplifica a forma que você navega pelos elementos dos documentos HTML, manipula eventos, executa animações e adiciona interações Ajax as suas páginas web.

O site do projeto é rico de recursos, com documentação, plugins, tutoriais, lista de discussão e fórum, há vários exemplos que podem ser testados direto no site, chamados "Live Examples".

Quando penso em jQuery, as principais utilidades que imagino são interações Ajax e atualização dinâmica do conteúdo das páginas, mas ele tem muitos outros recursos e vários deles visualmente ricos, como o seguinte que simula a aparência e comportamento do Dock do Mac OS X.

http://www.detacheddesigns.com/blog/samples/dock/

image 

Com jQuery o código JavaScript fica bem legivel, a forma que ele expõe os elementos de um documento HTML é simples e tornam a programação web mais agradável e produtiva.

 

Atualização

Alguns colegas me procuraram com dúvidas sobre o jQuery e JavaScript, na verdade para muitos desenvolvedores desktop, o conceito de linguagem script não é muito claro, por isto eu escrevi o artigo Entendendo Scripting para dar uma idéia simples, enquanto preparo um mais completo.

Quanto ao jQuery, lendo com mais atenção os recursos abaixo e uma definição que achei muito clara para quem está iniciando no jQuery está no artigo "Redescobrindo o JavaScript com jQuery Breve introdução", leitura mais que recomendada para quem esta iniciando.

 

Referências

Links úteis

Artigos em Português