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