ldmotta

Requisição HTTP (GET e POST) com VB (Visual Basic)

Posted in Visual Basic by ldmotta on maio 13, 2010

Olá mais uma vez!!

Aos amantes do VB (minha primeira linguagem de programação).

Hoje tabalho com PHP, Python, Javascript e tive a necessidade de fazer uma requisição a um servidor apache, usando o protocolo http com VB.

Em minhas pesquisas na net, encontrei muita coisa que infelizmente não funciona “porque as pessoas insistem em colocar coisas na net que não funcionam?”, emfim, como sempre chega de enrolação e vamos ao que interessa.

Seguinte, vamos usar uma referência a biblioteca Microsoft WinHttp Services, version 5.1.

Primeiros Passos:

  1. No visual basic, vá em Projetos > Referencess e marque a referência Microsoft WinHttp Services, version 5.1 indicada acima.
  2. Agora crie um módulo e um fomulário padrão no VB.

O formulário:

  • 1 caixa de texto com Multiline: true e ScrollBar: vertical (Text1)
  • 1 caixa de texto padrão (Text2)
  • 1 botão de comando padrão (Command1)


formuploadCódificação para o formulário (UploadForm):

Private Sub Command1_Click()
    Dim nFile As String, Retorno As String
    nFile = "image1.jpg" 'imagem que será enviada e se encontra na pasta do projeto
    Me.Text2 = UploadFiles(nFile, "http://localhost/testes/upload.php?nome=luciano", App.Path)
End Sub

Codificação para o módulo (UploadScript):

Option Explicit
'Créditos para Joseph Z. Xu (jzxu@napercom.com)
'Modificado por Luciano D. Mota (ldmotta@gmail.com)em 19 de setembro 2009

Dim WinHttpReq As WinHttp.WinHttpRequest
Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
Const HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1
Const BOUNDARY = "Xu02=$"
Const HEADER = "--Xu02=$"
Const FOOTER = "--Xu02=$--"

Function UploadFiles(strFileName As Variant, strURL As String, DirPath As String, _
    Optional postVar As String, Optional strUserName As String, _
    Optional strPassword As String) As String

    Dim FName As String
    Dim strFile As String
    Dim strBody As String
    Dim aPostBody() As Byte
    Dim nFile As Integer

    Set WinHttpReq = New WinHttpRequest

    ' Turn error trapping on
    On Error GoTo SaveErrHandler

    ' Adiciono a url as variáveis passadas em Text1.
    strURL = strURL & "?" & postVar

    WinHttpReq.Open "POST", strURL, False
    If strUserName <> "" And strPassword <> "" Then
        ' Set the user name and password.
        WinHttpReq.SetCredentials strUserName, strPassword, _
        HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
    End If

    '-------------------------- Becareful not to mingle too much here -----------------------------------
    ' Set the header
    WinHttpReq.SetRequestHeader "Content-Type", "multipart/form-data; boundary=" & BOUNDARY

    '-------------------------- Monta o corpo do arquivo para ser enviado -------------------------------
    ' Assemble the body
    strBody = HEADER                        ' Starting tag
    FName = strFileName
    ' Grap the file
    strFile = getFile(FName)

    strBody = strBody & vbCrLf & "Content-Disposition: form-data; name=""" & "upload" & _
    (i + 1) & """; filename=""" & FName & """" & vbCrLf & "Content-type: application/pdf" & _
    vbCrLf & vbCrLf & strFile & vbCrLf

    strBody = strBody & "--Xu02=$" ' This is boundary tag between two files
    strFile = ""
    strBody = strBody & FOOTER             ' Ending tag
    '----------------------------------------------------------------------------------------------------

    ' Because of binary zeros, post body has to convert to byte array
    aPostBody = StrConv(strBody, vbFromUnicode)

    ' Send the HTTP Request.
    WinHttpReq.Send aPostBody

    ' Display the status code and response headers.
    UploadFiles = WinHttpReq.ResponseText

    Set WinHttpReq = Nothing

    Exit Function
SaveErrHandler:
    UploadFiles = Err.Description
    Set WinHttpReq = Nothing
End Function

Function getFile(strFileName As String) As String
    Dim strFile As String

    ' Grap the file
    nFile = FreeFile
    Open strFileName For Binary As #nFile
    strFile = String(LOF(nFile), " ")
    Get #nFile, , strFile
    Close #nFile

    getFile = strFile
End Function

Agora o código PHP:

         /**
	 * Simples upload de arquivo
	 * Lembrando que este upload não deve ser utilizado no projeto real pois não teria segurança alguma, este é só para exemplo já que o foco principal é o objeto WinHttpRequest do visual basic
	 * Author: ldmotta
	 * Recebe a requisição feita pelo visual basic e grava o arquivo enviado no servidor.
	 */

	// Prepara a variável do arquivo
	$arquivo = isset($_FILES["upload"]) ? $_FILES["upload"] : FALSE;

	//Crie uma pasta de nome file no servidor e dê permissão de escrita
	$config["url_img"] = "file/";

	$imagem_dir = $config["url_img"] . $arquivo["name"]

	if($arquivo) {
		// Faz o upload da imagem
		$r = move_uploaded_file($arquivo["tmp_name"], $imagem_dir);
	}

	if(file_exists($imagem_dir));
		echo $imagem_dir; //Retorna a url relativa e o arquivo do upload
	exit;

Prontinho, qualquer dúvida é só incluir um comentário

Python Subprocess

Posted in Python by ldmotta on maio 11, 2010

Uma dica simples!!

O módulo subprocess lhe permite gerar novos processos, e obter os seus códigos de retorno. Este módulo pretende substituir vários outros módulos e funções mais antigas, tais como:

os.system
os.spawn *
os.popen *
popen2 .*
comandos .*

Leia mais…

Neste pequeno exemplo, vou mostrar como compactar vários arquivos com o comando zip sendo chamado pelo móduoo subprocess.

1° Digamos que você tenha uma lista dos arquivos que serão “zipados”, esta lista pode vir do banco ou de outra forma dependendo de cada situação:

#lista dos arquivos que serão compactados
li=["generic.html", "generic.json", "generic.xml"]

#caminho dos arquivos que serão compactados
path="/home/user/sites/seu_site/diretorio_dos_arquivos/"

import os
# monta o caminho completo para cada arquivo
li=[os.path.join(path,item) for item in li]

import subprocess
# comando que será utilizado no subprocess, nele passamos uma lista contendo o comando ["zip", "nome_do_arquivo_destino"]
cmd=["zip", "generic.zip"]

# adiciona o comando do subprocess à lista de arquivos
cmd.extend(li)

# finalmente passa este comando para ser executado pelo subprocess.call()
subprocess.call(cmd)

MKLINK – Links simbólicos no windows

Posted in Shell script by ldmotta on maio 3, 2010

Olá a todos!

Esta é uma das melhores novidades do windows, “Links Simbólicos” ou Junction Point, é isso messmo, pra quem pensava que esta era uma particularidade apenas do linux, o windows contraria tudo e suporta esse recurso.

Funciona assim:

Digamos que você queira disponibilizar todos os seus arquivos pessoais em uma unidade diferente da que o sistema operacional reside, e poder listar o conteúdo desta pasta dentro de uma nova no mesmo computador sem a necessidade de copiá-la, além disso a pasta “link” será atualizada e atualizará a pasta destino a cada alteração.

Faça da seguinte forma:

  1. Abra o prompt de comando do windows em Iniciar -> Executar, digite “cmd” e pressione enter.
  2. No prompt de comando, digite  mklink /D novo_link destino, onde novo link é o nome do link que se quer criar, e destino a pasta a qual será listada neste novo link e /D diz ao mklink que se trata de um diretório.
  3. Pressione Enter e prontinho, sua pasta pessoal vai está no destino que você quiser, e o link simbólico irá listar o conteúdo desta pasta.

Isso salvou a minha vida!! 🙂

Transformar html em PDF

Posted in PHP, Visual Basic by ldmotta on novembro 27, 2009

Algo muito interessante e bastante utilizado que peguei no blog do Igor. Vamos lá!

1º Crie o php com o conteúdo html

<?php
$html = “
    <html>
        <head></head>
        <style>
            h1 {color:#333; size:20px; margin-bottom:5px;}
            h3 {color:#222;}
        </style>
        <body>
            <h1>ldmotta.wordpress.com</h1>
        </body>
    </html>”;
?>

2º Agora pra fazer a coisa funcionar, é assim.

<?php
//Adicione a classe dompdf
require_once("dompdf/dompdf_config.inc.php");

//Crie uma nova instância do dompdf
$dompdf = new DOMPDF();

//Carregue o conteúdo hrml
$dompdf->load_html($html);

//Defina o tamanho do papel
$dompdf->set_paper('letter', 'landscape');

//E por fim, renderize o arquivo pdf, chamando o method render() e o stream('caminho do arquivo');
$dompdf->render();

$dompdf->stream("exemplo-01.pdf");
?>

É só isso “Chamar a função e passar os parâmetros!”

Baixe o dompdf aqui

Email com imagem de background

Posted in PHP by ldmotta on novembro 20, 2009

Olá mais uma vez!

Estou aqui pra falar sobre algo muito interessante porém pouco usado, talvez por sua complexidade em encontrar a combinação ideal de conteúdo e marcação de posições no corpo do email, para ser exibido corretamente.

Por este motivo criei uma classe bem simples chamada “imagemail” só pra facilitar a vida dos programadores.

Como usr?

<?php
//Primeiro adicione a classe imagemail.php
require_once('imagemail.php');

//Criando uma instancia da classe
$im = imagemail::getInstance();
$imagem = "imagem.jpg"  //caminho absoluto da imagem

//Setando as variáveis para envio do email
$im->add_from("Luciano <ldmotta@visie.com.br>");
$im->add_to("Destinatário <destinatario@mail.com.br>");
$im->add_subject("Título da mensagem");
$im->set_type("html");

//Defindo o conteúdo da mensagem
$html="
<html>
<body>
Olá destinatário, veja esta foto<br />
{$im->add_image($imagem, 'Imagem')}
</body>
</html>";

$im->add_message($html);

//E por fim, o envio da mensagem
try{
    $enviado=$im->send();
} catch (Exception $e) {$enviado=0;}
return $enviado;  //"enviado" não é o que vc está pensando :-)
?>

Blz né, então comenta ai. :-/

Download da classe imagemail

base_url() no javascript

Posted in Javascript by ldmotta on outubro 29, 2009

Olá a todos, como não poderia deixar de compartilhar com vocês, segue mais uma funçãozinha que peguei no blog do snipplr desta vez, algo que é usado constantemente por programadores php e que muitas vezes queremos fazer algo “inteligente” com o javascript.

function get_settings() {
var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location);
var settings = { "base_url" : base_url }
return settings;
}


settings = get_settings();
alert(settings.base_url);

jQuery lightBox com CodeIgniter

Posted in Javascript, jQuery, Plugins by ldmotta on outubro 20, 2009

Implementando o “exelente”  jQuery lightbox plugin com CodeIgniter

Foi atravéz da matéria do Leandro Vieira (iMasters) que implementou o Lightbox JS criado pelo Lokesh Dhakar, e outra do Gin2 (wiki do CodeIgniter), que resolvi inseri este plugin como biblioteca no codeigniter, dando ao usuário maior praticidade na hora do desenvolvimento e aplicação de lightbox em suas galeria.

Escolhi o jQuery lightbox plugin, porque além de bastante simples, faz o trabalho com maestria (parabéns Leonardo).

“Para este exemplo, estou levando em consideração que você tenha uma instalação do CI funcionando.”

1° PASSO

Baixe a última versão da biblioteca jQuery lightbox plugin e disponibilize em uma pasta da sua instalação do CI, neste caso, defini como na estrutura abaixo.

Estrutura de diretórios

Estrutura de diretórios

2° PASSO

No header da view onde estará a sua galeria de imagens, insira o código que carrega a biblioteca

<script type="text/javascript" src="<?=base_url();?>skin/js/jquery.js"></script>
<script type="text/javascript" src="<?=base_url();?>skin/js/jquery.lightbox-0.5.min.js"></script>

3° PASSO

Em algum lugar na página, crie uma tag  javascript que vai escrever a função definida na biblioteca lightbox.php

<script type="text/javascript">
    <?=$this->lightbox->simple('profile_img');?>
</script>

Como definido no jQuery lightbox plugin, os objetos que farão parte da galeria devem obedecer o seguinte critério:

– Tag <a> com href apontando para a imagem em tamanho real

– Tag <img> exibindo o thumbnail

<a href="http://exemplo.com/imagens/imagem.jpg">
    <img src="http://exemplo.com/imagens/thumb.jpg" alt="Nome da imagem" />
</a>

4° PASSO

Crie uma biblioteca de nome  “lightbox.php” com o código abaixo:

<?php

class LightBox {

    function simple($target='simpleModal') {
        $block = $this->jsBlock();
        $url = base_url();
        $output = "
        $(function() {
            $('#profile_img a').lightBox({
                imageLoading:'{$url}skin/images/lightbox-ico-loading.gif',
                imageBtnPrev:'{$url}skin/images/lightbox-btn-prev.gif',
                imageBtnNext:'{$url}skin/images/lightbox-btn-next.gif',
                imageBtnClose:'{$url}skin/images/lightbox-btn-close.gif',
                imageBlank:'{$url}skin/images/lightbox-blank.gif'
            }); // Seleciona todos os links dentro do elemento com ID galeria
        });";
        return $block['open'].$output.$block['close'];
    }

    function jsBlock() {
        $blocks = array(
            'open'=>''."\n\r",
            'close'=>''."\n\r"
        );
        return $blocks;
    }

}

?>

5° PASSO

Agora no controler que chama a view da sua galeria, instancie a biblioteca lightbox.php da seguinte forma:

function index() {
    $this->load->library('lightbox');
    $this->load->helper('url'); //assistente de url, usado ao chamar base_url()
}

rsync local e remoto

Posted in Shell script by ldmotta on agosto 3, 2009

Mais uma vez estou aqui pra compartilhar algo que aprendi recentemente, uma ferramenta poderosa, mas impraticável pela maioria dos desenvolvedores.

Depois de muito quebrar a cabeça arquivando com “tar”, compactando com “gzip”, dividindo com “split” e transferindo com “wget”, cheguei a conclusão:

“PARA TUDO!!! ISSO NÃO VAI DAR CERTO, VOU APRENDER RSYNC DE VERDADE!”.

E para a alegria geral da nação, está aí de forma simples e descomplicada.

1° vc quer transferir arquivos ou diretórios inteiros localmente; use isto.

$ rsync -Cravzp /diretorio/origem/ /diretorio/destino/   é só isso!!

2° Quer transferir pela rede sem autenticação?

$ rsync -Cravzp usuario@host:/diretorio/origem/ /diretorio/destino/   “mais simples que isso só isso elevado ao cubo.”

3° E agora o gran finale!!!

-Quer transferir de servidor pra servidor?

$ rsync -Cravzp -e “ssh -p1234” usuario@dominio.com.br:/diretorio/origem/ /diretorio/destino/

Dica: Se quiser apenas listar os arquivos do servidor? ignore o diretório de destino.

$ rsync -Cravzp -e “ssh -p1234” usuario@dominio.com.br:/diretorio/origem/

“Agora me diz: Como algo tão simples, poderoso e útil pode passar despercebido por tantos desenvolvedores?”

Obs.: Os parametros já estão configurados para a transferência de forma rápida e segura, mas caso ainda não confie em mim “e não deve confiar”, dê uma olhada no “man” do rsync.


Busca de CEP presonalizada

Posted in Javascript by ldmotta on julho 31, 2009

Olá a todos!

Depois de algum tempo sem postar, estou “me permitindo” atualizar o blog com mais uma dica utilizando o jQuery, implementado a partir do artigo encontrado no blog “Ajaxianos” do Wender Lima.

Desta vez um busca por cep onde você dita as regras.

Let’s go –>

Requerimentos:

  • jquery.js
  • busca_cep.js

Download: busca_cep.js

Demonstração: exemplo do Busca CEP

Documentaçao:

No header do seu formulário, inicialize a biblioteca busca_cep.js

<script language="javascript" src="js/busca_cep.js" type="text/javascript"></script>

Defina as opções obrigatórias (target e campos)

Options ={
 target: "name_do_campo_cep",
 campos: {
    "rua"     :"name_do_campo_rua",
    "bairro"  :"name_do_campo_bairro",
    "cidade"  :"name_do_campo_cidade",
    "estado"  :"name_do_campo_estado"
 }
 };

Chamar o método initForms(opções)

initBuscaCep(Options)

*Obs. Você pode decidir quais campos quer preencher (rua, bairro, cidade, estado) passando o name dos inputs como valor do objeto”campos”

O código completo ficará como no exemplo abaixo.

<script type=”text/javascript”>

Options ={
target: “cep”,
//objeto com os names dos input do seu formulário
campos: {“rua”:”endereco”,”bairro”:”bairro”, “cidade”:”cidade”, “estado”: “estado”}
};
initBuscaCep(Options)

</script>

<form action=”http://sua_url.com.br”&gt;

<label for=”cep”><input type=”text” id=”cep” name=”cep” /></label>

<label for=”rua”><input type=”text” id=”rua” name=”rua” /></label>

<label for=”bairro“><input type=”text” id=”bairro” name=”bairro” /></label>

<label for=”cidade“><input type=”text” id=”cidade” name=”cidade” /></label>

<label for=”estado“><input type=”text” id=”estado” name=”estado” /></label>

<input type=”button” value=”Enviar” />

</form>

Defina as propriedades obrigatórias para o correto funcionamento

  • [target] String – Name do objeto de formulário referente ao CEP. Default = “cep” .
  • [campos] Objeto – Recebe um objeto javascript correspondente aos nomes dos campos de cado objeto de formulário. Você pode decidir em recuperar os campos “rua, bairro, cidade, estado”. Ex.
        campos: {"rua":"endereco","cidade":"cidade"}
Qualqer dúvida entrem em contato com ldmotta@visie.com.br.

Comentários serão bem vindos.

jqFormulator – Carregando formulários com jQuery

Posted in Javascript by ldmotta on abril 14, 2009

Olá pessoal!!

Às vezes, nas brincadeiras de fim de semana, nos vem inspiração para resolver probleminhas do nosso cotidiano. Foi desta forma que resolvi criar uma “bibliotecazizinha” com jQuery que carregasse grandes formulários em uma página (magentopia) no estilo formulator, mas que desse ao usuário final uma experiência agradável ao ter que preencher cansativos passos destes formulários de cadastro.

Estou falando da jqFormulator, que está na versão “ontem.de.madrugada.1” e tambem está aberta a novas idéias e melhoramentos.

Requerimentos:

  • jquery-1.3.2.min.js >
  • jqFormulator.js

Download: jqFormulator.js

Demonstração: exemplo do jqFormulator

Documentaçao:

No header do seu formulário, inicialize a biblioteca jqFormulator.js

<script language="javascript" src="js/jqFormulator.js" type="text/javascript"></script>

Defina as opções obrigatórias (titles e files)

Options ={
 type: "POST",
 titles: Array("Passo 1","Passo 2"),
 files: Array(
 "files/reserva-passo-1.php",
 "files/reserva-passo-2.php"
 )
 };

Chamar o método initForms(opções)

initForms(Options)

Insira o seu formulário na página com id = ‘formulator’

<form id="formulator" method="post" action="jqFormulator.php"></form>

O código completo ficará como no exemplo abaixo.

<script type=”text/javascript”>
Options ={
type: “POST”,
//array com os títulos de cada passo
titles: Array(“Passo 1″,”Passo 2”),
//array com os formuláios que serão chamados
files: Array(
“files/reserva-passo-1.php”,
“files/reserva-passo-2.php”
)
};
initForms(Options)
</script>
<div id=”forms”>
<form id=”formulator” method=”post” action=”#”></form>
</div>

Defina as propriedades obrigatórias para o correto funcionamento

  • [type] String – Refine o tipo de envio (GET ou POST) default: POST.
  • [titles] Array – Recebe um array que serão os titulos de cada passo. Caso a quantidade de títulos passados seja inferior a quantidade de arquivos, o sistema irá atribuir títulos sequenciais. Ex.
        titles: Array("Passo 1","Passo 2")
  • [files] Array – Recebe um array com as urls dos arquivos que serão carregados. Ex.

Array (“files/cadastro/passo1.php”, “files/cadastro/passo2.php”, “files/cadastro/passo-n.php”)

jqformulatorFig. 1 - Passo 1, na primeira exibição, o usuário só poderá acessar
o formulário do passo 1.   

jqformulator2
Fig. 2 - Passo 2, ao clicar em prosseguir no passo 1,
o título "Passo 1 e Passo 2" transformam-se em link permitindo ao
usuário navegar entre o primeiro e segundo passos e assim
suscessivamente.

Espero que está humilde aplicação possa ser útil a todos. Qualqer
dúvida entrem em contato com ldmotta@visie.com.br.

Comentários serão bem vindos.