sexta-feira, 14 de novembro de 2008

A assustadora historia das coisas

Não preciso dizer nada, esse vídeo diz tudo. Infelizmente.

terça-feira, 11 de novembro de 2008

Instalando o PHPonTrax facilmente no Debian e derivados

Fazendo uma pesquisa pra empresa esses tempos, sobre frameworks, achei varios interessantes. Mas um em especial me chamou a atenção, o PHPonTrax. Tá muita gente pode falar que é apenas um clone de Ruby on Rails e tal, mas ele é muito útil.
  • Primeiro : porque ele realmente é fiel ao Rails, desde os nomes de classes e métodos, até toda a estrutura e documentação!
  • Segundo: Me deparando com isso, e com o relativo crescimento de Ruby on Rails, uni o útil ao agradável. Utilizando um framework poderoso, Orientado a Objeto, MVC, Ajax, Scriptaculous, etc. E também aprender rails enquanto ultilizo o framework na linguagem que domino (PHP).
Quando me deparei com essa possibilidade, já comecei a estudar e a trabalhar "em cima" do framework e com ele. Sim existe outros frameworks como o Cake por exemplo, que tambem é MVC,OO etc. Mas NENHUM é tão fiel ao Rails quanto o Trax. Por isso possibilita a familiarização com o rails e logo ganhando conhecimento em mais uma tecnologia.
Claro que o Ruby é uma linguagem totalmente distinta, mas como a proposta do framework é ser fiel ao rails, tu acaba te acostumando e pensando com o framework.
Bom já digitei muito não passei nenhum comando, pois bem vamos lá:
Assumirei que você tem o o Apache , PHP e o Mysql Instalados. Eu uso Debian, então farei com base nele, logo os caminhos podem mudar, mas o básico pode ser entendido.
Primeiro é necessário instalar o PEAR que pode ser facilmente instalado no Debian com o comando:
# apt-get install php-pear

Feito isso precisamos instalar as dependências do pear para o PHPonTrax:
# pear install MDB2#mysql
# pear install Mail
# pear install Mail_mime

Feito isto, configuramos o Pear para instalar o PHPonTrax com o comando:
# pear channel-discover pear.phpontrax.com

Agora instalamos o PHPonTrax:
# pear install trax/PHPonTrax
Caso você tenha a instalação padrão do php deve ter ocorrido um erro, você precisa aumentar a memória usada pelo php. Isso pode ser feito acessando o seu arquivo php.ini . Numa instalação padrão ele deve estar em '/etc/php5/apache2/'.
Procure a linha memory_limit e aumente o valor de 16M para 256M. Repita o comando:
# pear install trax/PHPonTrax
e pronto.

Mas ainda não estará funcional. Para isto você deve habilitar alguns mods no apache. Basicamente são os mesmos para o rails.
# a2enmod ssl
# a2enmod rewrite
# a2enmod suexec
# a2enmod include
Agora sim podemos começar a diversão.
Criemos um diretorio em /var/www chamado traxapp, isso para não precisar mexer em nenhuma configuração extra no apache.
 # mkdir /var/www/traxapp
Trocamos a permissão:
 # chmod 755 /var/www/traxapp

Em seguida entramos no diretório com e damos o comando:
 /var/www/traxapp# trax .
O trax gerou a estrutura padrão para a aplicação, mas ao acessar localhost/traxapp você esta vendo apenas a estrutura de diretórios. Para arrumar isso basta criar um link simbólico com o nome da sua aplicação para a pasta "public" que o Trax gerou. No meu caso criarei um blog então eu crio um link simbólico para a past a public em traxapp com o comando:
/var/www# ln -s traxapp/public blog
e pronto agora ao acessar pelo navegador com o endereço: localhost/blog deve ter uma tela como esta:


É isso, simples não é? No próximo artigo sobre o Trax farei um passo a passo da configurações de Banco de Dados para o Trax, bem como configura-lo num servidor externo.

T+!

Machuque o código! E só o codigo

Esses dias estava procurando na net algo sobre processos de desenvolvimento e eis que surge o link para um vídeo de Ryan Davis que o Fábio Akita brilhantemente traduziu. Esse vídeo deveria ser "obrigatório"(!) para todos os desenvolvedores, não somente os "Rubistas" mas sim os desenvolvedores em geral, muito bom.
Te dá uma perspectiva de como é chegar "hoje" em uma empresa, te ajuda a repensar alguns conceitos e etc...

Mas vou parar de escrever e repassar o vídeo:


Machucando Código por Diversão e Lucro - Ryan Davis from Fabio Akita on Vimeo.

espero que seja útil a todos!
Fui!

Dica: aprenda a programar

Essse é o melhor "livro" que se pode ter. Pra quem quer algo novo, um "mega" tutorial de ruby e rails, muito bom e explicativo. Ótimo trabalho do rubyonrails.pro.br.

fica a dica e link http://aprendaaprogramar.rubyonrails.pro.br/.
Recomendo também o Livro :


Pra quem vem do PHP, como eu, é um excelente começo ler este livro. Aconselho também a estudar o framework PHPonTrax.
Até mais e bom estudo.

segunda-feira, 10 de novembro de 2008

FCK Editor

UTILIDADE:

FCKeditor é um editor de texto HTML rico em ferramentas de formatação. Suas ferramentas são equivalentes às do MS Office. Uma demonstração pode ser vista neste link.

INSTALAÇÃO:
Baixe o pacote .tar.gz ou o .zip e coloque na raiz do seu projeto.
<?php
//Inclue as funções necessárias
include "fckeditor/fckeditor.php";
//Defina normalmente o formulário. Neste exemplo é enviado por AJAX
?>
<form onsubmit="cadastroexterno('','form','recebe.php','resposta');
return false;" method="post" id="form" name="form">
<?php
//Cria um nova instância do FCKeditor
$oFCKeditor = new FCKeditor('idDoTextarea') ;
//Informar o endereço da pasta do FCKeditor
$oFCKeditor->BasePath = "../fckeditor/";
//Caso seja necessário, criar um arquivo de configurações
//personalizadas e infomar sua localização aqui
$oFCKeditor->Config['CustomConfigurationsPath'] = '../myconfig.js';
//Informa o nome das configurações da barra de ferramentas
$oFCKeditor->ToolbarSet = "Basic2";
//Define o tamanho vertical do editor
$oFCKeditor->Height = 300;
//Define o tamanho horizontal do editor
$oFCKeditor->Height = 400;
//Define o texto inicial do editor
$oFCKeditor->Value = 'Texto inicial.';
//Cria o editor
$oFCKeditor->Create() ;
?>


O arquivo de configurações personalizadas possue as configurações da
barra de botões. Exemplo:


FCKConfig.AutoDetectLanguage = false;
FCKConfig.DefaultLanguage = "pt-br";
FCKConfig.ToolbarSets["Basic2"] = [
['Bold','Italic','Underline','-',
'StrikeThrough','Subscript','Superscript',
'JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
['Image','Table'],
['Undo','Redo','PasteWord'],
'/',
['FontFormat','FontName','FontSize','TextColor'],
] ;

Nesse arquivo é definido a linguagem da descrição dos botões e
a definição dos botões que aparecerão na barra.
Os botões podem ser:

['item1',...,'itemN'] define um grupo de botões
'-' mostra um pipe ('|')
'/' define uma quebra de linha
Todos os botões possíveis podem ser definidos assim :

FCKConfig.ToolbarSets["Default"] = [
['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],
['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
['Form','Checkbox','Radio','TextField','Textarea','Select',
'Button','ImageButton','HiddenField'],
'/',
['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
'/',
['Style','FontFormat','FontName','FontSize'],
['TextColor','BGColor'],
['FitWindow','ShowBlocks','-','About'] // No comma for the last row.
] ;



Antes de enviar o formulário por AJAX, é necessário atualizar os dados
?><input type="submit" value="Submit"
onclick="FCKeditorAPI.Instances.idDoTextarea.UpdateLinkedField();" />
</form>
</pre>

quarta-feira, 5 de novembro de 2008

Funções PHP disponíveis para o js?

Quem nunca pensou algo do tipo:
"bah se fosse em php era só aplicar a função 'X' que resolveria!" ou
"Como faço isso em javascript???". Me peguei nesses pensamentos durante um projeto que estou fazendo e depois de algum tempo fuçando na net descobri uma lib MUITO mão na roda, a 'PHP.js'.
Nessa lib tem praticamente todas as funções que o PHP traz por padrão(!) , sem as libs externas
como a gd, mail e drivers de BD, claro, mas tem muita função como html_entites, md5, utf8_decode e muitas outras. Vale a pena.
E tem mais, caso precise de uma função específica, não precisa fazer o download da lib inteira (como algumas libs por aí...), mas sim acessar o site e procurar na lista de funções implementadas. Caso a função dependa de outra, estará escrito a função e tem o link para o código da mesma.
Muito bom. Por isso fica a dica.

lightbox

Este tutorial tem base no próprio site do criador do Lightbox JS é praticamente uma tradução do seu conteúdo para ajudar quem não se dá muito bem com inglês.

Benefícios:


Sobrepõe imagens à página corrente e não dentro da página. Isto faz com que as imagens não sejam limitadas por um layout. Exemplo é uma imagem que sai fora do layout por ter uma largura maior.

Mantém os utilizadores na mesma página em vez de os levar para outra para terem de ver a imagem em ponto maior. Clicam para visualizar a imagem e clicam de novo para a fechar em vez de terem de voltar á página ou carregar no botão return.
Como utilizar:

1. Baixe o pacote e inclua os scripts no head da página.
<!-- Código que cria o efeito Lightbox -->
<script type="text/javascript" src="lightbox/prototype.js"></script>
<script type="text/javascript" src="lightbox/scriptaculous.js?load=effects,builder">
</script>
<script type="text/javascript" src="lightbox/lightbox.js"></script>
<link rel="stylesheet" href="lightbox/lightbox.css" type="text/css" media="screen" />
<!-- Fim do código Lightbox -->


2. Adicionar o atributo rel=”lightbox” a qualquer link para activar a lightbox nesse link. Por exemplo:
<a href="imagem.jpg" rel="lightbox" title="minha legenda">image #1</a>


3.Para criar albuns basta colocar o rel como um "array":
<a href="images/image-1.jpg" rel="lightbox[1]">image #1</a>
<a href="images/image-2.jpg" rel="lightbox[2]">image #2</a>
<a href="images/image-3.jpg" rel="lightbox[3]">image #3</a>


Agora vem a parte divertida
Como personalizar

Utilizando-se o CSS é possivel personalizar o layout do Lightbox.

terça-feira, 4 de novembro de 2008

nyroModal

Com nyroModal é possível abrir janelas (divs) modais. Essas janelas podem trazer imagens, páginas locais ou remotas, resposta de formulários, galerias de imagens.

INSTALAÇÃO:
Depois de fazer o download dos fontes do projeto link para o pacote .zip podemos começar instalação.
Inicialmente, devemos incluir os arquivos de scripts do jQuery e do nyroModal:
<script type="text/javascript" src="nyroModal-1.2.5/js/jquery-1.2.6.js"></script>
<script type="text/javascript" src="nyroModal-1.2.5/js/jquery.nyroModal-1.2.5.js">
</script>

Para abrir uma página/imagem em nyroMoldal como resultado de um link ou do envio de um formulário, simplesmente adicione a classe 'nyroModal' à tag. Exemplo:
<a href="#" class="nyroModal">
<form class="nyroModal" action="arquivo.php" method="post">

Para galerias de imagens, devemos adicionar um atributo 'rel' com um mesmo nome como valor à todos os links com 'class="nyroModal"'. O atributo title Exemplo:
<a href="img1.jpg" class="nyroModal" rel="gal" title="Title 1">Img 1</a>
<a href="img2.jpg" class="nyroModal" rel="gal" title="Title 2">Img 2</a>
<a href="img3.jpg" class="nyroModal" rel="gal" title="Title 3">Img 3</a>

Para que a janela não seja fechada quando for clicado fora da janela (clicar na parte escura da tela), devemos incluir 'rel="modal"' dentro da tag com a classe 'nyroModal'.

Também é possível abrir um nyroModal através de outro já aberto, utilizando a mesma regra citada acima. Fazendo isso o nyroModal é sobreescrito.

Dentro de um nyroModal é possível ter um botão para fecha-lo adicionando a classe 'nyroModalClose' à um botão ou à um link. Exemplos:
<a href="#" class="nyroModalClose">
<input type="button" class="nyroModalClose" value="Cancelar" />

Para atribuir o nyroModal em um trecho da página atualizado dinamicamente, é necessário chamar a seguinte função do framework:
$('#tudo a').nyroModal();

Nesse exemplo ele ativa o nyroModal em todas as tags 'a' dentro do container com 'id="tudo"' e que possuam 'class="nyroModal"'.

STORED PROCEDURES

O conceito de STORED PROCEDURES é: " são programas armazenados no servidor, pré-compilados, chamados de forma explícita para executar alguma lógica de manipulação de dados, podendo retornar ou não algum valor".

Inicialmente é preciso saber onde ficam armazenadas as procedures no mysql. Quando tu crias uma procedure / function elas ficam armazenadas na tabela Routines. Para listar o conteudo desta tabela e admnistrar suas procedures / functions basta executar o SQL :
mysql> SELECT * FROM INFORMATTION_SCHEMA.ROUTINES;
Perceba que listamos todos os procedimentos armazenados (Stored Procedure e Functions), de todos os bancos de dados. Saliento que estamos listando somente Stored Procedure e Functions, pois, somente estas rotinas são gravadas na tabela ROUTINES do bancos de dados INFORMATION_SCHEMA. Triggers também são um tipo de procedimento armazenado, mas estão separadas em outra tabela do dicionário, chamada TRIGGERS.

mysql> SELECT * FROM INFORMATION_SCHEMA.TRIGGERS;
Sabendo disso, agora podemos explorar a sistaxe mais básica do comando:

CREATE PROCEDURE proc_name([parameters, ...])
[characteristics]
[BEGIN]
corpo_da_rotina;
[END]

Explicando:

proc_name: seu procedimento armazenado deve ter um nome, para quando for chamado, podermos então usá-lo;
tipo_param: existem 3 tipos de parâmetros em uma Stored Procedure no MySQL:
* IN => este é um parâmetro de entrada, ou seja, um parâmetro cujo seu valor será utilizado no interior do procedimento para produzir algum resultado;
* OUT => esté parâmetro retorna algo de dentro do procedimento para o lado externo, colocando os valores manipulados disponíveis na memória ou no conjunto de resultados;
* INOUT => faz os dois trabalhos ao mesmo tempo!
parameters: nessa parte do procedimento, informaremos os parâmetros da seguinte forma: [IN | OUT | INOUT] nome_parametro tipo_dado.
characteristics: as características do procedimento pode apresentar. Como não utilizaremos inicialmente tais características, vamos nos ater a sintaxe principal. Questões de segurança, se é determinística ou não, qual a linguagem que estamos utilizando e se nosso procedimento modificará dados na banco de dados, são algumas das características que poderemos definir neste item que abordaremos com mais detalhe na parte dois do artigo.
corpo_da_rotina: onde são definidos os comandos SQL que farão alguma manipulação e/ou defenderão alguma lógica, podendo retornar ou não algum resultado.

Um primeiro exemplo:

Bem basicão mesmo:
Delimiter //
Drop Procedure if exists ola //
Create Procedure ola()
Begin
Select 'Olá! Isto é uma procedure' as result;
End //
Delimiter ;
Explicando a sintaxe:

O uso do Delimiter é necessario para mudar o delimitador de comandos, que por padrão é o ";". Mudamos o DELIMITADOR para podermos usar o ";" no meio do procedimento. Caso não efetuemos essa troca, o procedimento será enviado pela metade e um erro será enviado ao terminal, por erro na sintaxe.

DELIMITADOR no MySQL, em outras situações, por padrão também é chamado de terminador. Para verificar qual é o delimitador da sessão corrente emita o comando \s, que é a forma curta do comando STATUS.

Depois eu "dropo" a procedure caso ela já exista, isso é útil pois mantém o conteudo da procedure sempre atualizado.

Crio a procedure , neste momento caso miha procedure tenha parâmentros, eu os declaro como se fosse uma função;

Declaro o "corpo" da procedure que fica entre o Begin e o End, no caso do exemplo ele emitirá a frase: 'Olá! Isto é uma procedure'.

E é isto, para usar a procedure basta rodar o comando acima e na hora em que for ultizar chamar ela assim:

call ola();

Deve aparece o resultado na tela.
Um exemplo um pouco mais complexo seria:
Delimiter $$
Drop Procedure if exists validaEdita(idconta) $$
Begin
If((Select idContaReceber From EditalItem Where idContaReceber = idConta) <> 0)Then
If ((Select pago From EditalItem Where idContaReceber = idConta) = 'S') Then
Select 'Esta Conta já está paga no Edital!' as MSG;
Else
Update EditalItem Set pago = 'S' Where idContaReceber = idConta;
Select 'Havia esta conta a receber em um edtial e seu status "pago" foi
alterado para "Sim".' as MSG;
End If;
Else
Select 'Esta conta não faz parte de nenhum edital!' as MSG;
End If;
End $$

Delimiter;
Note que nos exemplos eu usei apenas select e Update, mas poderia usar qualquer (Insert, Delete) mas o melhor é adimnistrar esse recursos através de triggers. Em breve postarei sobre Triggers

Select condicional

Para um mehor desempenho de qualquer sistema, sempre é bom deixar o banco tomar algumas decisões e trazer os resultados formatados para o uso do php.

A mais "clássica" maneira de fazer isso é usando Selects condicionais...

no mysql existem duas maneiras:

- Usando-o:

O mysql oferece a função if($condição , $então , $senao); mas não acho essa abordagem muito prática, (até pq só funciona com ele).

- Usando o SQL:

Pode-se fazer a mesma coisa usando o Padrão do SQL com a expressao Case assim:
SELECT
(CASE
WHEN $condição THEN $então ELSE $senão
END)
FROM Tabela


mas existe um porém, caso tenha varias condições para o mesmo campo o ELSE deve ser o Utimo pois ele "encerra" o condicionamento: por exemplo
SELECT
(CASE
Situacao
WHEN 'A' THEN 'ativo'
WHEN 'I' THEN 'inativo'
ELSE 'pendente'
END)
FROM Tabela


Para cálculos o melhor é usar a outra sintaxe permitida:
SELECT
(CASE
WHEN (nota < 7.0) THEN 'REPROVADO' ELSE 'Aprovado'
END)
FROM Tabela

acho que é isso....
até a proxima!