25 de maio de 2009
Serei direto, primeiramente não se preocupe, esse erro não é do ZendFramework ou da forma que você o configurou (ufa !). É um bug na conexão MySql/PHP PDO on Xampp 1.7
Segue abaixo a solução:
Faça download do arquivo: http://windows.php.net/downloads/snaps/php-5.2-win32-VC6-x86-latest.zip
Descompacte e copie o arquivo libmysql.dll, cole dentro da pasta xampp\apache\bin e xampp\php, agora é só reiniciar o servidor.
Fonte: http://www.apachefriends.org/f/viewtopic.php?f=16&t=32617
Tags: crashes, Zend Framework
18 de maio de 2009
Creio que muitas pessoas tentam configurar o ZendFramework para funcionar localmente e de primeira não da certo e você acaba desistindo.
Axei uma solução simples para resolver o meu problema e de muitos, testei no xampp e funcionou normalmente.
Faça download do QuickStart no site.
Extraia o esqueleto da aplicação dentro da pasta htdocs.
Abra o README.txt e leia copie as configurações do VirtualHost, depois abra apache->conf->httpd.conf, verifique se já não existe uma configuração de VirtualHost, no meu caso estava comentado, vá no final do arquivo e cole a nova configuração. Agora é com você, faça os acertos necessários.
Configuração README: <VirtualHost *:80> ServerAdmin matthew@zend.com DocumentRoot <PATH_TO_QUICKSTART>/public ServerName quickstart <Directory <PATH_TO_QUICKSTART>/public> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
#Configuração ZendFramework <VirtualHost *:80> ServerAdmin seuemail@seuemail DocumentRoot /xampp/htdocs/public ServerName localhost <Directory /xampp/htdocs/public> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost>
Resultado:
Tags: desenvolvimento, Zend Framework
8 de abril de 2009
Estava dando uma olhada em outros frameworks php, CodeIgniter me chamou bastante atenção. Documentação desatualizada mas em português, simplicidade, de fácil instalação, curva de aprendizado rápida.
Percebi que não iria me preocupar em rodá-lo localmente, igual acontece com o Zend Framework, porque instalar o CodeIgniter é como tirar doce da boca de criança.
Caso tenha dúvidas sobre o que é Framework ou MVC, eu escrevi um resumo abaixo:
Framework torna fácil e simples o processo de construir aplicações web, agiliza o trabalho do programador e o mesmo já não precisa se preocupar com os mínimos detalhes da aplicação.
MVC (Model – View – Controller), é um padrão de arquitetura de software, a idéia é separar a lógica da aplicação das views, facilitando a manutenção de código.
Model: Contém a lógica da aplicação.
View: Se preocupa somente em renderizar os dados.
Controller: Processa e responde a eventos, é onde recebemos algo enviado pelos usuários e retornamos os resultados nas views .
Hora de botar a mão na massa.
Banco de dados:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS estudo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; USE estudo; -- ----------------------------------------------------- -- Table `mydb`.`agenda` -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS estudo.agenda ( `id` INT(3) NOT NULL AUTO_INCREMENT , `nome` VARCHAR(40) NOT NULL , `email` VARCHAR(40) NOT NULL , `telefone` INT(10) NOT NULL , `celular` INT(10) NOT NULL , PRIMARY KEY (`id`) ) ENGINE = MyISAM DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Faça download do CodeIgniter e extraia os arquivos em seu servidor, acesse seu site, irá aparecer uma mensagem de boas vindas (moleza não é)
.
Abra o arquivo application/config/config.php e altere a sua url base.
/* |-------------------------------------------------------------------------- | Base Site URL |-------------------------------------------------------------------------- | | URL to your CodeIgniter root. Typically this will be your base URL, | WITH a trailing slash: | | http://example.com/ | */ $config['base_url'] = "http://127.0.0.1/index.php/";
Abra o arquivo application/config/database.php e preencha as configurações do seu banco de dados.
$active_group = "default"; $active_record = TRUE; $db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "estudo"; $db['default']['dbdriver'] = "mysql"; $db['default']['dbprefix'] = ""; $db['default']['pconnect'] = TRUE; $db['default']['db_debug'] = TRUE; $db['default']['cache_on'] = FALSE; $db['default']['cachedir'] = ""; $db['default']['char_set'] = "utf8"; $db['default']['dbcollat'] = "utf8_general_ci";
Controller:
<?php
// application/controllers/agenda.php
class Agenda extends Controller
{
// Construtor da classe Agenda
function __construct()
{
parent::Controller();
// Carrega o helper url
$this->load->helper('url');
// Carrega a biblioteca de validação de formulário
$this->load->library('form_validation');
}
function index()
{
// Renderiza a view application/views/index.php
$this->load->view('index');
}
function salvar()
{
// Se o preenchimento do formulário não for feito corretamente, é
// renderizada a mesma view
if($this->form_validation->run() == FALSE)
// Renderiza a view application/views/index.php
$this->load->view('index');
else {
// Carrega o meu Model Agenda e estabelece a conexão com o banco de dados
$this->load->model('Agenda_Model','',TRUE);
// Caso o retorno seja diferente de 0, já temos esse registro
// e não devemos fazer o cadastro novamente
if($this->Agenda_Model->temRegistroRepetido()!=0){
$data['Agenda_ModelError'] = 'Por favor digite outro nome, pois o mesmo já existe no banco de dados.';
// Renderiza a view application/views/index.php passando a variável data
// como parâmetro
$this->load->view('index', $data);
}
else{ // Salva o registro
$this->Agenda_Model->salvar();
// Renderiza a view application/views/sucesso.php
$this->load->view('sucesso');
}
}
}
}
Model:
<?php
// application/models/agenda_model.php
class Agenda_Model extends Model
{
function __construct()
{
parent::Model();
}
function salvar()
{
// $this->input->post('campo'); Captura os valores do input enviados
// via post, pode ser utilizado também $_POST['campo'];
// porém não é recomendado
$this->nome = $this->input->post('nome');
$this->email = $this->input->post('email');
$this->telefone = $this->input->post('ddd_tel').$this->input->post('telefone');
$this->celular = $this->input->post('ddd_cel').$this->input->post('celular');
return $this->db->insert('agenda', $this); // Salva
}
// Verifica se tem registro repetido no banco de dados
// filtro sendo feito pelo nome
function temRegistroRepetido()
{
$this->db->where('nome', $this->input->post('nome'));
$this->db->from('agenda');
return $this->db->count_all_results();
}
}
View:
Index.php
<?// application/views/index.php ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Exemplo de formulário de cadastro</title>
<meta name="description" content="Exemplo de formulário de cadastro." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="pt-br" />
<meta name="author" content="Wellington Rocha" />
<style type='text/css'>
/*
Neste caso, foi adicionado a folha de estilo diretamente na página, mas
não é padrão desenvolver um projeto e adicionar o css desta forma.
*/
body { margin: 0; padding: 0; font-family: Lucida Grande, Verdana, Geneva, Sans-serif; font-size: 11px; color: #4F5155; }
form#cadastro { width: 400px; margin: 0 auto;}
form#cadastro label, input { display: block; }
form#cadastro input{ margin-top: 10px; }
form#cadastro label{ margin-top: 5px; }
</style>
</head>
<body>
<form action="<?=base_url()?>agenda/salvar" method="post" name="cadastro" id="cadastro">
<fieldset>
<legend>Agenda</legend>
<?//Mostra os erros de validações no formulário?>
<div id="alerta">
<?=validation_errors()?>
<?if(isset($Agenda_ModelError)):?>
<p><?=$Agenda_ModelError?></p>
<?endif;?>
</div>
<label for="nome">Nome (*):</label>
<?// set_value('campo') re-popula os dados do formulário quando ocorre ?>
<?// algum erro ?>
<input type="text" name="nome" id="nome" value="<?=set_value('nome')?>" />
<label for="email">Email:</label>
<input type="text" name="email" id="email" value="<?=set_value('email')?>" />
<label for="ddd_tel">DDD - (Númerico) (*):</label>
<input type="text" name="ddd_tel" id="ddd_tel" size="2" value="<?=set_value('ddd_tel')?>" />
<label for="telefone">Telefone - (Númerico) (*):</label>
<input type="text" name="telefone" id="telefone" size="8" value="<?=set_value('telefone')?>" />
<label for="ddd_cel">DDD - (Númerico):</label>
<input type="text" name="ddd_cel" id="ddd_cel" size="2" value="<?=set_value('ddd_cel')?>" />
<label for="celular">Celular - (Númerico):</label>
<input type="text" name="celular" id="celular" size="8" value="<?=set_value('celular')?>" />
<input type="submit" value="Salvar" id="salvar" />
</fieldset>
</form>
</body>
</html>
sucesso.php
<?// application/views/sucesso.php ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Exemplo de formulário de cadastro</title>
<meta name="description" content="Exemplo de formulário de cadastro." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="language" content="pt-br" />
<meta name="author" content="Wellington Rocha" />
<style type='text/css'>
/*
Neste caso, foi adicionado a folha de estilo diretamente na página, mas
não é padrão desenvolver um projeto e adicionar o css desta forma.
*/
body { margin: 0; padding: 0; font-family: Lucida Grande, Verdana, Geneva, Sans-serif; font-size: 11px; color: #4F5155; }
form#cadastro { width: 400px; margin: 0 auto;}
form#cadastro label, input { display: block; }
form#cadastro input{ margin-top: 10px; }
form#cadastro label{ margin-top: 5px; }
</style>
</head>
<body>
<div align="center">
<h3>Cadastro efetuado com sucesso.</h3>
<a href="<?=base_url()?>agenda">Voltar</a>
</div>
</body>
</html>
Formulário:
Validação
<?php // application/config/form_validation.php $config = array( array( 'field' => 'nome', 'label' => 'Nome', 'rules' => 'required|min_length[2]' ), array( 'field' => 'email', 'label' => 'Email', 'rules' => 'required|valid_email' ), array( 'field' => 'ddd_tel', 'label' => 'DDD Telefone', 'rules' => 'required|integer|min_length[2]|max_length[2]' ), array( 'field' => 'telefone', 'label' => 'Telefone', 'rules' => 'required|integer|min_length[8]|max_length[8]' ), array( 'field' => 'ddd_cel', 'label' => 'DDD Celular', 'rules' => 'required|integer|min_length[2]|max_length[2]' ), array( 'field' => 'celular', 'label' => 'Celular', 'rules' => 'required|integer|min_length[8]|max_length[8]' ) );
Tradução das mensagens de erro
<?php // Modificado por Wellington Rocha $lang['required'] = "Campo %s é obrigatório."; $lang['isset'] = "The %s field must have a value."; $lang['valid_email'] = "Campo %s não tem um endereço de Email válido."; $lang['valid_emails'] = "The %s field must contain all valid email addresses."; $lang['valid_url'] = "The %s field must contain a valid URL."; $lang['valid_ip'] = "The %s field must contain a valid IP."; $lang['min_length'] = "%s deve ter no mínimo %s caracteres."; $lang['max_length'] = "%s não pode exceder %s caracteres."; $lang['exact_length'] = "The %s field must be exactly %s characters in length."; $lang['alpha'] = "The %s field may only contain alphabetical characters."; $lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters."; $lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes."; $lang['numeric'] = "The %s field must contain only numbers."; $lang['is_numeric'] = "The %s field must contain only numeric characters."; $lang['integer'] = "Campo %s deve ser preenchido com valores inteiros."; $lang['matches'] = "The %s field does not match the %s field."; $lang['is_natural'] = "The %s field must contain only positive numbers."; $lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero."; /* End of file form_validation_lang.php */ /* Location: ./system/language/english/form_validation_lang.php */
Resultado do que foi feito:
Não me preocupei em escrever códigos para cada tipo de validação do formulário.
No controller existe somente código php.
Separo a lógica da aplicação das views.
Aumento minha produtividade, não me preocupo com alguns detalhes, consigo manter um padrão facilitando a manutenção de código, tenho url amigável, classe para sessão, paginação, upload de arquivos. Só faltou a Coca-Cola e o Big Mac, programar assim fica cada vez mais divertido.
Download do exemplo feito em CodeIgniter 1.7.1
Tags: CodeIgniter, desenvolvimento
29 de março de 2009
Não poderia ter notícia melhor, jogar qualquer jogo via web independente do pc, notebook e jogar até pela televisão, por meio de um aparelho com um joystick, é do caralho ótimo.
Segundo o site, o serviço OnLive entra em operação em 2009, os jogos ficarão nos seus servidores e eles irão gerenciar tudo isso, os games rodarão em máxima qualidade, sem downloads de grandes arquivos, por meio de uma conexão banda larga utilizando computação nas nuvens.
Isso irá causar uma revolução no mercado de games, hardware, software, nem quero ver o resto. Eu e todos não reclamam ( com certeza
), não sou o tipo do cara que monta um pc novo por mês para games, sempre pensei o seguinte: “se quiser jogar compre um videogame”.
Não foi citado preço e quando o produto será lançado no Brasil, a idéia é boa, espero que os servidores aguentem pessoas do mundo inteiro jogando simultaneamente.
6 de fevereiro de 2009
Essa semana andei lendo meus feeds, notícias e mais notícias do Windows 7, eu particularmente nem dei atenção e nem perdi tempo instalando o Sistema Operacional em versão beta no meu computador.
A primeira coisa que pensei sobre as versões do sistema, é que a Microsoft com certeza não faria igual fez com o Windows Vista. Com aquela montueira, milhares, confusas versões. Não eles não irão fazer isso.
Recebi um boletim do http://clubedohardware.com.br Boletim 815 – 06/02/2009.
Eis a triste notícia:
A Microsoft anunciou que lançará seis diferentes versões do sistema operacional Windows 7 no final deste ano ou no início de 2010. São elas:
- Windows 7 Starter Edition
- Windows 7 Home Basic
- Windows 7 Home Premium
- Windows 7 Professional
- Windows 7 Enterprise
- Windows 7 Ultimate
Você com certeza deve pensar o mesmo que eu, versão Starter do Windows 7 ? Pois é, a realidade é triste.
Justificativa: Windows 7 Starter Edition Será uma versão voltada a Netbooks e mercados emergentes, Oo pior ainda, creio que um usuário experiente quando utiliza algo que não é de qualidade, nunca mais quer repetir a dose, pois a imagem negativa fica e assim foram com as versões Starter’s do Windows.
Momento Well reflexão:
Essas versões do Windows 7 na hora da compra, geram confusões para o usuário ?
Windows 7 Starter Edition para mercados emergentes e Netbooks, será que isso pega ?
Esses efeitos na interface, como aero, recursos touch e etc. Só aumentam os requisitos para rodar o Sistema Operacional, Windows agora está sendo feito para adolescentes ?
Uma coisa é certa, quem paga o pato ou se ferra prejudica é o consumidor como sempre.
30 de dezembro de 2008
No meu dia-a-dia, fico cada vez mais próximo do Asp clássico, não sei se isso é bom ou ruim, conforme continuar as coisas vou ter que ir para .NET é o jeito.
Sub abaixo verifica se o cpf digitado é correto/incorreto, primeiramente você deve saber como funciona a validação, para entender meu código, abaixo eu citei um link de um site que explica muito bem a lógica.
<%@LANGUAGE="VBSCRIPT"%>
<%
'Validação de CPF em ASP
'Autor: Wellington Rocha
'Data: 29/12/2008
'Lógica: http://www.construindoseusite.com.br/javascript/scripts/js_validacao_cpf_imp.htm
cpf = "12345678909"
validaCPF(cpf)
Sub validaCPF(cpf)
Dim getCPF(9)
Dim soma
Dim comp
Dim resp(1)
Dim i
Dim cont
'Pega os dados da variável cpf e atribui em um vetor()
cont = 1
For i = 0 To 9
getCPF(i) = mid(cpf,cont,1)
cont = cont+1
Next
'Validação do primeiro digíto verificador
'Seleciono as posições 0 a 8 do array getCPF() e multiplico cada posição com um número, de forma decrescente
'Começando a partir do 10 e terminando no 2, depois somo o resultado da multiplicação
soma = getCPF(0)*10+getCPF(1)*9+getCPF(2)*8+getCPF(3)*7+getCPF(4)*6+getCPF(5)*5+getCPF(6)*4+getCPF(7)*3+getCPF(8)*2
'Pego o resultado do somatório e descubro se o resto da divisão é menor que 2, se for será considerado automaticamente como 0
'Caso contrário deve-se subtrair o valor obtido por 11
If soma mod 11 < 2 Then
getCPF(9) = 0
Else
getCPF(9) = 11 - (soma mod 11)
End If
'Resultado vai ser armazenado no array resp(), que será utilizado na hora da validação
resp(0) = getCPF(9)
'Validação do segundo digíto verificador
'Seleciono as posições 0 a 9 do array getCPF() e multiplico cada posição com um número de forma decrescente
'Começando a partir do 11 e terminando no 2, depois somo o resultado da multiplicação
'Note que foi adicionado o resultado do primeiro digíto verificador no array getCPF(9)
soma = getCPF(0)*11+getCPF(1)*10+getCPF(2)*9+getCPF(3)*8+getCPF(4)*7+getCPF(5)*6+getCPF(6)*5+getCPF(7)*4+getCPF(8)*3+getCPF(9)*2
'Mesmo critério citado acima
If soma mod 11 < 2 Then
resp(1) = 0
Else
resp(1) = 11 - (soma mod 11)
End If
'Armazena o valor do primeiro e segundo digíto verificador.
comp = resp(0)&resp(1)
'Para saber se o CPF é inválido, você deve comparar os 2 últimos números do CPF, com os 2 digítos verificadores encontrados
'Se forem diferentes são inválidos
If mid(cpf, 10,2) <> comp Then
%>
<script type="text/javascript">alert("<% Response.Write "Cpf Incorreto "%>");</script>
<%
Else
%>
<script type="text/javascript">alert("<% Response.Write "Cpf Correto "%>");</script>
<%
End If
End Sub
%>
Caso seja aplicado em um formulário, deve ser feito outras validações.
Ex: se o número de cpf digitado tem 11 caracteres, se foi digitado somente números no campo de cpf, se necessário validar campo com javascript e etc.
Espero que tenha sido útil.
Tags: asp, desenvolvimento
28 de novembro de 2008
Fundado em março de 2006, continua ganhando cada vez mais usuários.
No meu msn eu pergunto ao meu caro amigo: “você tem twitter ?” ele responde: “que raios é twitter ? é de comer ?”.
Twitter é um sistema popular de microblogging, microblogging é um sistema onde você pode fazer simples atualizações de textos, utilizando no máximo 200 caracteres, essas atualizações podem ser feitas via sms, mensageiro instântaneo, web entre outros. A idéia é escrever o que você está fazendo naquele momento.
Irei explicar os principais itens:
- Na Home você pode escrever em 140 caracteres o que você está fazendo.
- @Replies são as respostas que você recebe de algum usuário quando escreveu algo.
- following_me as pessoas que eu estou seguindo, ou seja vendo as suas atualizações de textos.
- followers_me as pessoas que estão me seguindo, ou seja vendo as minhas atualizações de textos.
- Direct Messages sem que os outros vejam, você pode receber/enviar mensagens para um usuário qualquer.
- Favorites caso tenha alguma atualização de texto que você gostou, e acha importante guardá-la, você pode classificá-la como favorita.
- Deseja escrever para algum usuário em específico, você deve escrever o seu nome começando com “@” ex: “@wellrocha bom dia !”, uma alternativa é direcionar o ponteiro do mouse em cima do texto do seu amigo, irá aparecer uma imagem com o formato de uma seta, clique na imagem e será feito o processo: “@apelido-do-usuario sua mensagem”.
Twittar no site pode ser confuso e complicado, recomendo a utilização de algum programa.
Meus amigos no twitter utilizavam a página para fazer seus posts, depois que mostrei o twhirl eles não conseguiram parar de usar. Não perca tempo instale também.
Não tem segredos, clique em install now, abrirá uma nova janela com um assistente de instalação.
Após a instalação, clique em “Enter screen name…” e coloque seu nome de usuário.
Irá aparecer seu nome de usuário na caixa de texto, clique em Connect e digite a sua senha.
Você pode trocar o tema na aba Colors em Color schemes.
Utilizar o twhirl é simples, 99% das opções são as mesmas que as da home do twitter.
Dica: vá com o ponteiro do mouse até a foto:
send reply = enviar resposta.
favor tweet = adiciona um post aos favoritos.
send direct msg = enviar mensagem diretamente.
Não precisar abrir o site para escrever e ter as informações de forma organizada é ótimo, existem outras ferramentas que tem a mesma funcionalidade porém eu fico com o twhirl e você ?
Tags: microblogging, twitter
19 de novembro de 2008
Zeebo não veio para competir com os vídeogames de última geração, os jogos serão rodados na memória do console e serão baixados pela ZeeboNet3G, pelo seu próprio aparelho de TV. Há rumores de que os jogos custarão a partir de R$ 10,00, dando início quem sabe ao combate a pirataria.
Para comprar os jogos você precisará de Z-Credits que poderão ser adquiridos no site, o pagamento pode ser feito por meio de boleto bancário, débito em conta, cartão de crédito ou cartão pré-pago.
Veja os vídeos abaixo:
Prós:
- Combate a pirataria.
- Para fazer download dos jogos, basta ligar o console na televisão e sem nenhum custo, o aparelho irá se conectar automaticamente à rede ZeeboNet3G.
- Preço estimado dos jogos.
Contras:
- Preço estimado do console R$ 600,00.
- Adaptação de jogos já consagrados.
- Gráficos
* Na minha opinião o preço não é nada atraente, Playstation 2, com 2 controles originais, memory card, destravado, custa no máximo R$ 550,00 na maioria das lojas. O comprador baixa os jogos via torrent e grava em dvd, acaba gastando somente com a media. Lembrando que é proibido utilizar jogos piratas e o mesmo estraga o seu console.
* Playstation 2 já tem ótimos títulos como Need for Speed, Final Fantasy, Disgaea, God of War, God of War 2 e etc.