Entrando na PSN xD

Posted in Game on 10 de setembro de 2010 by alexandrems

Aeee.. quarta-feira adquiri um ps3.. hje fiz o cadastro na PNS (PlasyStationNetwork) Americana. Já até peguei meu Portable ID.. falta soh colocar uns troféus nele :P.


Get your Portable ID!

Classe AutoComplete com Scriptaculous

Posted in Ajax, Dicas, JavaScript, Orientação a Objetos, PHP with tags , , , , on 6 de abril de 2010 by alexandrems

Vou mostrar como criar uma classe em PHP para gerar campos do tipo autocomplete com AJAX ou do estilo do famoso google sujest. Esta classe irá utilizar o prototype js e o scriptaculous.
Scriptaculous
Prototype

Criando a classe AutoComplete

Esta classe terá somente uma função estática para facilitar a criação de vários campos no mesmo formulário.

autocomplete.php


<?php

class AutoComplete {
/**
* $id = id do campo text
* $valor = valor padrão para o campo
* $url = arquivo que irá retornar os dados para o campo
*/
public static function getCampo($id, $valor='', $url){
$retorno .= '<input id="'.$id.'" name="'.$id.'" type="text" value="'.$valor.'" />';
$retorno .= '<div id="'.$id.'update" style="display:none;border:1px solid #666;background-color:white;height:100px;overflow:auto;"></div>';
$retorno .= '<script>';
$retorno .= ' new Ajax.Autocompleter("'.$id.'","'.$id.'update","'.$url.'",{select:"selectme"});';
$retorno .= '</script>';

return $retorno;

}

}
?>

Criando o arquivo que retornará os dados em AJAX para o autocomplete

O retorno deste arquivo deverá ser uma lista, nesse exemplo vou colocar a lista direto, mas pode ser o retorno de uma consulta no banco.

retorno.html


<ul style='list-style: none;'>
<li><span class="selectme">Valor 1</span></li>
<li><span class="selectme">Valor 2</span></li>
<li><span class="selectme">Valor 3</span></li>
<ul>

Incluindo na página HTML

Nesta página deverá ser incluído os scripts para o prototype e scriptaculous.


<?php include 'autocomplete.php'; ?>
<html>
<head>
 <title>Exemplo Autocomplete</title>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <script src="prototype.js" type="text/javascript"></script>
 <script src="scriptaculous.js" type="text/javascript"></script>
<style type="text/css" media="screen">
 .selectme { padding:5px;cursor:pointer;}
.selected { background-color: #004286; color:#FFF }
 </style>
</head>
<body>

<label> Exemplo 1 : <?php  echo AutoComplete::getCampo('exp1','','retorno.html'); ?> </label> <br/>

<label> Exemplo 2: <?php  echo  AutoComplete::getCampo('exp2','','ajax.php'); ?></label> <br/>

</body>
</html>

Espero ter ajudado..
Para saber mais sobre Ajax.Autocompleter do Scriptaculous clique aqui.

Editor de Texto Web com Gerenciador de Imagem

Posted in Ajax, JavaScript, PHP with tags , , , on 31 de março de 2010 by alexandrems

Vou mostrar como criar um editor de texto web que tenha gerenciador de imagem com upload.

Para isso vou utilizar o CKEditor e o CKFinder:
CKEditor,  editor de texto para internet : baixar
CKFinder, gerenciador de arquivos (escolha a versão em PHP) : baixar

CKEditor tem sua versão básica OpenSource, já o CKFinder tem uma versão demo que fica à mostra uma mensagem, mas funciona normal.

1º Incluir os scripts para CKEditor e CKFinder

2º Criar um formulário com o textarea

  • Vou enviar este formulário por AJAX, pode ser por POST ou GET tanto faz. Mas por AJAX tem uma particularidade.
  • funcao.enviaFormAjax() pode ser qualquer função para enviar formulários por AJAX.
<html>
<head></head>
<script type='text/javascript' src='http://localhost/teste/ckeditor/ckeditor.js'></script>
<script type='text/javascript' src='http://localhost/teste/ckfinder/ckfinder.js'></script>
</pre>
<body>
<form onSubmit="funcao.enviaFormAjax()">
 <textarea id="idtextarea" name="idtextarea"></textarea>
 <input type="submit" id="idbotao" value="Enviar" />
</form>
</body>
</html>

3º Depois do formulário com o TEXTAREA deverá ter a criação do objeto para o CKEDITOR.

<script type='text/javascript'>
 /*
  Padronizar as configurações para o TEXTAREA que tenha o ID "idtextarea"
   */
 var editor = CKEDITOR.replace( 'idtextarea',
 {
/*Tipo do template */
 extraPlugins : 'uicolor',
/* Opção que irão aparecer no editor, aqui esta full,  poderá ser personalizado*/
 toolbar :
 [
 ['Source','-','Save','NewPage','Preview','-','Templates'],
 ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'],
 ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
 ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],
 '/',
 ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
 ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
 ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
 ['Link','Unlink','Anchor'],
 ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
 '/',
 ['Styles','Format','Font','FontSize'],
 ['TextColor','BGColor'],
 ['Maximize', 'ShowBlocks','-','About']
 ],
 /* Habilita a opção para escolher uma imagem de um diretório do site*/
 filebrowserImageBrowseUrl : 'http://localhost/teste/ckfinder/ckfinder.html?Type=Images'

 });
 /* Vincula o CKFinder com o 'editor' referente ao CKEditor */
 CKFinder.SetupCKEditor( editor, 'http://localhost/teste/ckfinder/' );

 /* Esta função (utiliza PrototypeJS) serve para enviar os dados por AJAX
    As informações ficam apenas no CKEditor, assim eu passo o valor dele para o campo idtextarea e pode ser mandado sem problemas no FORM
*/
 Event.observe(window,'load',function(){
 Event.observe('idbotao','click',function(){
 $('idtextarea').value = CKEDITOR.instances.idtextarea.getData();
 },false);
 });
</script>

CKFinder irá abrir esta janelinha.

por padrão ele irá buscar as imagens do diretório
./ckfinder/userfiles/
Para mudar o diretório abra o arquivo
./ckfinder/config.php
e mude o valor das variaveis $baseUrl e $baseDir para o caminho de onde estará suas imagens.

Documentação para o CKEditor aqui.
Documentação para o CKFinder aqui.

Espero ter ajudado =)

Tempo percorrido entre duas Datas em PHP

Posted in Dicas, PHP with tags , , , , , on 25 de março de 2010 by alexandrems

Garimpando na web, pegando uns trechos daqui e outros trechos de lá. Montei uma função para trazer o tempo  em dias, horas, minutos e segundos entre duas datas do tipo timestamp no formato 05/02/2010 21:15:30  (“d/m/Y H:i:s”).
Por exemplo:

  • Solicitação foi aberta no dia 11/03/2010 16:18:00
  • Solicitação foi finalizada no dia 19/03/2010 16:48:51

Neste exemplo, demorou 8d 30m 51s para que a solicitação fosse finalizada.


# Para chamar a função
$diferenca = tempoData("11/03/2010 16:18:00", "19/03/2010 16:48:51");

public function tempoData($dataini, $datafim) {

 # Split para dia, mes, ano, hora, minuto e segundo da data inicial
 $_split_datehour = explode(' ',$dataini);
 $_split_data = explode("/", $_split_datehour[0]);
 $_split_hour = explode(":", $_split_datehour[1]);
 # Coloquei o parse (integer) caso o timestamp nao tenha os segundos, dai ele fica como 0
 $dtini = mktime ($_split_hour[0], $_split_hour[1], (integer)$_split_hour[2], $_split_data[1], $_split_data[0], $_split_data[2]);

 # Split para dia, mes, ano, hora, minuto e segundo da data final
 $_split_datehour = explode(' ',$datafim);
 $_split_data = explode("/", $_split_datehour[0]);
 $_split_hour = explode(":", $_split_datehour[1]);
 $dtfim = mktime ($_split_hour[0], $_split_hour[1], (integer)$_split_hour[2], $_split_data[1], $_split_data[0], $_split_data[2]);

 # Diminui a datafim que é a maior com a dataini
 $time = ($dtfim - $dtini);

 # Recupera os dias
 $days  = floor($time/86400);
 # Recupera as horas
 $hours = floor(($time-($days*86400))/3600);
 # Recupera os minutos
 $mins  = floor(($time-($days*86400)-($hours*3600))/60);
 # Recupera os segundos
 $secs  = floor($time-($days*86400)-($hours*3600)-($mins*60));

 # Monta o retorno no formato
 # 5d 10h 15m 20s
 # somente se os itens forem maior que zero
 $retorno  = "";
 $retorno .= ($days>0)  ?  $days .'d ' : ""  ;
 $retorno .= ($hours>0) ?  $hours .'h ': ""  ;
 $retorno .= ($mins>0)  ?  $mins .'m ' : ""  ;
 $retorno .= ($secs>0)  ?  $secs .'s ' : ""  ;

 # Se o dia for maior que 3 fica vermelho
 if($days > 3){
 return "<span style='color:red'>".$retorno."</span>";
 }
 return $retorno;

 }

Problemas com entrada de dados em C

Posted in C, Dicas with tags , , on 12 de março de 2010 by alexandrems

Esse é um problema que ocorre para os iniciantes em C.

Quando é feito entrada de dados pelo teclado, uma variável poderá receber os dados de outra entrada ou simplesmente pular a próxima entrada. Isso ocorre porque o buffer do teclado não é limpo entre uma entrada e outra. Existem algumas funções para limpar o buffer, mas são específicas para o sistema operacional.

Abaixo segue um código que irá gerar o problema.

#include <stdlib.h>
 int main(){
 char nome[80],fone[15];
 int idade;
 printf("Digite o nome \n");
 gets(nome);
 printf("Digite a idade \n");
 scanf("%d",&idade);
 printf("Digite o fone\n");
 gets(fone);
 printf("%s, %d anos , %s",nome,idade,fone);
getch();
return 0;
 }

Neste caso, após digitar a idade, irá direto para o printf final, ignorando a entrada do fone, Imagem abaixo.

Bom, ja da para identificar que o problema está logo após a entrada da idade, então precisamos limpar o buffer para poder receber a próxima entrada.
Uma forma de fazer isso é utilizar a função getchar(), essa função limpa o buffer do teclado para receber um caracter.
Vamos coloca-la logo após a entrada da idade (linha 9).

#include <stdlib.h>
 int main(){
 char nome[80],fone[15];
 int idade;
 printf("Digite o nome \n");
 gets(nome);
 printf("Digite a idade \n");
 scanf("%d",&idade);
 getchar();
 printf("Digite o fone\n");
 gets(fone);
 printf("%s, %d anos , %s",nome,idade,fone);
getch();
return 0;
 }

Com isso, após a inserção da idade, vai ser possível inserir o telefone.

Espero ter ajudado =)

Integração entre bases diferentes

Posted in Dicas, SQL with tags , , , on 10 de março de 2010 by alexandrems

Estou tendo que integrar dados de dois sistemas, um sistema Web com banco MySQL, e outro desktop com Firebird.
Nesta primeira etapa o sistema Web irá receber atualizações sobre clientes e representantes do sistema desktop.
Esta atualização será feita uma vez por dia automaticamente, ou qualquer horário manualmente.
Para isso criei a seguinte estrutura no MySQL.

Base “sistemaWeb” contendo as tabelas do sistema web.
Base “sistemaDesk” contento as tabelas com os dados de clientes e representantes do Firebird.
Nesta base é praticamente uma réplica das tabelas e relacionamentos que estão no Firebird, mas somente as tabelas que vou precisar no sistema web.

Na base “sistemaWeb” criei uma visão para trazer os dados dos clientes que estão na base “sistemaDesk”, a principio estes dados com quase 5.000 registros estavam demorando 35  segundos  para serem carregados na grid do sistema. Para diminuir esse tempo, fiz duas coisas:

1) Criei um indice para as chaves das tabelas da base “sistemaDesk”, que antes não tinha; o tempo da consulta caiu para 19 segundos.
2) Criei uma tabela na base “sistemaWeb” que contem todas as colunas e registros da visão dos clientes. Como a atualização da base “sistemaDesk” não é em tempo real, essa tabela não terá inconsistencia de dados pois sempre que atualizar a base “sistemaDesk” atualizarei ela também; com isso o tempo de listar os 5.000 registros na grid do sistema caiu drasticamente para 65 milisegundos.

Espero ter ajudado alguem com esse caso, se alguem tiver outras soluções podem mandar.
Agradecendo battisti e weber que juntos chegamos a uma solução parecida em um outro projeto

Expressão Regular no Notepad++

Posted in Dicas, Expressão Regular with tags , on 9 de março de 2010 by alexandrems

Bom que o Notepad++ é um excelente editor de texto, todos que usam ele sabem disso. Tive que fazer uma importação em SQL de uma base no Firebird para o Mysql, com estruturas de tabelas beeem diferentes. Invés de fazer um script em PHP para deixar a SQL “compatível” resolvi arrumar ela pelo Notepad++, com isso tive que utilizar expressões regulares em alguns casos. Vamos la:

Baixar o Notepad++  aqui

Primeiramente apertar CTRL + F ou menu Localicar > Localizar, ele irá abrir a janela abaixo, depois clique na aba Substituir.

Seguindo as marcações em vermelho:
Localizar : Expressão que será utilizada para localizar um trecho no código
Substituir: Expressão ou conteúdo que irá substituir o conteúdo encontrado
Modo de busca: Deverá estar marcado a opção Expressão regular

Algumas expressões úteis. Se quiser conhecer mais sobre expressões regulares clique aqui.

Mudar data de 2010-02-10 para 10/02/2010
Buscar por ([0-2][0-9][0-9][0-9])-([01][0-9])-([0-3][0-9])
Cada ( … ) é uma região de rotulação, ou seja, ai dentro terá as instruções para a expressão, neste exemplo temos 3 regiões.
Os [ … ] são usados para informar os caracteres, neste exemplo serão somente números.
Imagine que a expressão fará o seguinte
(2010)-(02)-(10) e cada […] será referente a um caractere

  • [0-2] o primeiro caractere do ano poderá ser 0,1 ou 2
  • [0-9] o segundo, terceiro e quarto caractere do ano, poderão ser de 0 até 9
  • [01] o primeiro caractere do mes, poderá ser 0 ou 1
  • [0-9] o segundo caractere do mes poderá ser de 0 até 9
  • [0-3] o primeiro caractere do dia poderá ser de 0 até 3
  • [0-9] o segundo caractere do ano poderá ser de 0 até 9

Substituir por \3/\2/\1
Bom, temos três rótulos

  • 1º ([0-2][0-9][0-9][0-9]) é referente ao \1
  • 2º ([01][0-9]) é referente ao \2
  • 3º ([0-3][0-9]) é referente ao \3

Assim a expressão de substituição irá colocar o conteúdo do 3º rótulo no inicio, depois vai trocar o – por /,
dai irá colocar o conteúdo do 2º rótulo e trocar o – por / e por fim coloca o conteúdo do 1º rótulo no final.

Tirar as aspas de um conteúdo, por exemplo “15425”
Buscar por “([0-9]+)”
O + indica que esta mesma expressão será utilizada “n” vezes na sequência, pois o número poderá ter dois caracteres (32) ou cinco (15425) ou mais.
As aspas deverão ficar fora da rotulação, pois deverá permanecer somente os números, a idéia é tirar as aspas
Trocar por \1
A expressão fará “(15425)” como eu vou subtituir por \1 ou seja, por (15425), como as aspas estão fora elas
não irão continuar.

Espero que com esse post possa ajudar alguem =)
Qualquer coisa só entrar em contato

CLIENTEC – Cadastro On-Line de Clientes

Posted in Geral with tags , on 16 de dezembro de 2009 by alexandrems

Introdução

Um número significativo de micro e pequenas empresas possuem pouco ou nenhum controle sobre dados de seus próprios clientes, e é neste tipo de ambiente onde o CLIENTEC pode ser utilizado. O CLIENTEC é um software WEB cujo objeto é gerenciar cadastro de clientes, emitir relatórios e etiquetas para mala direta.

O Sofware

O Software conta com mecanismos de importação e exportação de dados no formato XLS e CSV o que facilita a migração de quem já possui algum tipo de cadastro ou ainda para empresas que utilizaram o CLIENTEC e devido ao seu crescimento acabaram por adquirir outro software.

Para acessar o CLIENTE basta ir ao endereço http://clientec.com.br, o software é livre até 20 clientes registrados.

Jornada Acadêmica UNIPAN

Posted in Geral with tags , , , , , on 27 de outubro de 2009 by alexandrems

Ontem iniciou a primeira jornada acadêmica da UNIPAN, com artigos e mini-cursos para os alunos de Ciências da Computação. Apresentei meu artigo de conclusão da Pós em Tecnologias JAVA, Comparativo sobre XML e JSON como retorno de uma requisição em AJAX.

Depois da apresentação fui correndo para o laboratório, eu e o @battisti fizemos um mini-curso sobre AJAX. Hoje finaliza a jornada, a noite minha parte termina com o mini-curso =)

JSON ou XML, o que retornar para o AJAX?

Posted in Ajax, JavaScript on 23 de outubro de 2009 by alexandrems

Para a conclusão da minha pós-graduação, fiz um artigo para comparar as formas de retorno mais utilizadas para aplicações em AJAX, neste post vou resumir a idéia e mostrar minha conclusão, se quiser pode clicar aqui e baixar o artigo completo.

O conceito do AJAX é simples, enviar requisições assíncronas para um servidor que irá processa-las e retornara algum tipo de dados que serão tratados pelo JavaScript na máquina do cliente. Mas e  qual é o melhor formato desses dados que o servidor irá retornar para o cliente?

Bom básicamente ele retorna texto (string) através do protocolo HTTP, sendo possível identificar qual pelo cabeçalho um tipo específico desses dados, como por exemplo, o XML. Se não for especificado ele traz um texto normal. Não vou entrar em detalhes como é feito isso, você ja deve ter trabalhado com AJAX para poder entender o que segue neste post.

XML é muito conhecido e utilizado por inumeras aplicações, com ele é possível organizar com facilidade uma estrutura de dados para serem transmitidos pelo servidor ao cliente. JSON é uma notação de um Objeto JavaScript, mas pode ser utilizado em várias linguagens. Utilizando a função eval() o JavaScript transforma essa string JSON em um objeto para poder ser manipulado.

Tanto XML como JSON podem ser escritos manualmente na forma de uma string, mas existem classes e API´s para várias linguagens que facilitam a manipulação dessas tecnologias. Abaixo vai um exemplo de organização de dados em XML e JSON.

<?xml version="1.0" encoding="iso-8859-1"?>
 <nome> Alexandre </nome>
 </idade> 27 </idade>
</xml>

Exemplo de código XML.

({"nome":"Alexandre"},{"idade":"27"})

Exemplo equivalente para código JSON.

A manipulação do XML necessita utilizar padrões DOM, isso de certa forma dificulta a escrita do código em relação a manipulação com JSON, onde na maioria dos casos basta passar um Objeto ou Vetor com os dados que a classe ou API transforma automáticamente em uma String JSON. A mesma idéia se aplica na parte do cliente, onde o Javascript precisa utilizar o DOM para manipular o retorno em XML. O exemplo disso em JavaScript segue abaixo.

// Para retornar o primeiro nome "Alexandre" vindo de um XML
var nodo = http_request.responseXML;
nodo[0].getElementsByTagName('nome')[0].childNodes[0].nodeValue;

// Para retornar o primeiro nome "Alexandre" vindo de um objeto JSON
var json = eval("("+http_request.responseText+")");
json[0].nome;

Em relação a performance, tamanho e velocidade, tanto XML quanto JSON estão no mesmo nível, ou seja para o cliente é indeferente se a aplicação retorna XML ou JSON. Já para o desenvolvedor é nitida a diferença entre trabalhar com XML e JSON, como o XML segue vários padrões específicos desta linguagem é natural a necessidade de uma outra linguagem utilizar um parser(DOM) que possibilita manipulação dos itens e elmentos do XML. Portanto uma tecnologia que não dependa de linguagens externas  para manipular informações que serão transmitidas entre uma linguagem e outra já teria certa vantagem sobre o XML.

Links
http://www.json.org/
http://battisti.wordpress.com/apostilas/