Terça-feira, Novembro 10, 2009

Backup de respositório SVN

Recentemente tive a necessidade de transferir os repositórios svn de um server para outro, então fui pesquisar como este processo deveria ser feito e descobrir que, igual ao MySQL, o SVN também possuí uma ferramenta de dump e de funcionamento tão ou mais simples que mysqldump, para maiores informações sobre o comando execute:

# svnadmin dump --help

Ok, então vamos ao dump:

# svnadmin dump /var/svn/nomerepositorio > ~/backup_svn/nomerepositorio.bkp

O svn vai gerar uma saida semelhante a:

* Extraída revisão 0.
...
* Extraída revisão n.

Onde cada linha representa uma versão do respotório.

O conteúdo do repositório informado por nomerepositorio será colocado em '~/backup_svn/nomerepositorio.bkp'. Atenção: Antes de executar este comando certifique-se de que o ditetório de destino existe e lembre-se de trocar o caminho do repostório para refletir sua realidade. Tudo ocorrendo nas normalidades, você terá um arquivo chamado nomerepositorio.bkp em uma subpasta no seu home. Se o novo respotório ainda não existir, execute:

# svnadmin create /var/svn/novorepositorio

e finalmente carregue de volta o backup feito pelo load acima:

# svnadmin load /var/svn/novorepositorio < ~/backup_svn/nomerepositorio.bkp


o comando acima deverá gerar uma saída semelhante a:

# svnadmin load /var/svn/novorepositorio < ~/backup_svn/nomerepositorio.bkp <<>

Pronto, se seus repositorios svn possuir proteção de acesso e este novo estive sob estra proteção, edite seu arquivo e insira as entradas necessárias para que seus usuários possam fazer checkout/commit, etc.

Segunda-feira, Novembro 09, 2009

Removendo .svn

De quando em vez tenho a necessidade de remover todos os diretórios de controle do svn, os famigerados ".svn", isso seria tarefa facil se o projeto fosse pequeno, porém, acontece de um único projeto gerar mais de 1000 desses diretórios.
Então a ideia eh realiazar uma pesquisa num dados diretório em busca dos tais ".svn" e para cada ocorrência encotrada executar o "rm -rf" passando a ocorrência encontrada como argumento( xargs )

find . -iname .svn | xargs rm -fr


Note que foi usado '-iname' ao invés de '-name' para ignorar diferenciação entre maiscula e miniscula.

  • find . -iname .svn: Encontra todos os arquivos ou diretórios que se chamem .svn
  • xargs rm -rf: O xargs é um programa que executa o que vier depois dele pra cada linha que ele receber como entrada. Por isso apaga todos os .svn.
Claro que você pode evitar a criação destes diretórios simplismente dando um:
svn export DESTINO
Mas se eles já existirem fica a dica, outra coisa é que basta você trocar o nome do diretório que se deseja excluir e a dica é válida do mesmo jeito.

Sexta-feira, Outubro 30, 2009

palestra sobre certificação PHP

Este post rápido é só para agradescer a todos os que compareceram ontem, 29/10, a faculdade Unisaber, Brasília, para palestra sobre certificação PHP que ministrei.
A quem interessar os slides segue o link.

Sábado, Setembro 12, 2009

Mini-Curso PHP Pra Quem Sabe PHP, mas nem tanto.

salve a todos,
Sábado(12/09) foi realizado o primeiro(de uma sérias de cursos futuros) ministrado por mim, vimos nestes primeiro encontro a instalação no MS Windows do Apache2, PHP e a criação de um script básico para testar a instalação.

Com base no que foi visto, vamos dá continuidade nesta inciativa apoiada pela Faculdade Michelangelo de Brasília(local onde foi realizado o encontro) que prontamente cedeu seu laboratório para que o evento pudesse ser realizado.
Os kilos de alimentos arrecadados fora doados.

A todos os presentes, MEU MUITO OBRIGADO!!!

Quarta-feira, Abril 01, 2009

PHP5(exec) e Java

Salve a todos, eu sei faz muito tempo que não posto nada,
esta semana aqui no trabalho tive uma demanda na qual foi necessário utilizar um objeto Java, por assim dizer, no PHP, bem tudo bem se estivessímos no PHP 4, mas pra minha infelicidade geral fiz uma busca no google e o resultado não foi muito animador, pra resumir a história a melhor opção encontrada foi um projeto denominado "Bridge".
Analisando o tal "Bridge" não demorou para notar que não me atenderia:
  • é necessário instalar o tomcat
  • era necessário rodar a app no cliente( ah, esqueci de mencionar era uma app php-gtk).
Exposto estes dois pequenos detalhes logo você vai deduzir que não vou sair instalando um servidor de app na máquina de meus clientes :)

Analisando o caso, chegamos em na seguinte conclusão:
- vamos criar uma classe que irar intermediar minha app com as classes java e conforme a necessidade eu executo chamadas por meio do como exec do php uma espécie de interface.

Para exemplificar vamos criar uma classe simple em java( Hello ) que vai mudar seu retorno de acordo com sua chamada, depois um arquivo php que fara a chamada a esta classe.

-- begin Hello.java
/**
* testa a quantidade de argumentos recebido e no caso
* de nenhum argumento seja inforamdo retorna um objeto
* em notação JSON com o status de false ou true se ao
* menos um argumento for inforamdo
*
* @name Hello
* @return String
* @example java Hello | java Hello somevalue
*/
class Hello{
public static void main( String args[] ){
if( args.length == 0)
System.out.println("{\"status\": \"false\"}");
else
System.out.println("{\"status\": \"true\"}" );
}
}

-- end Hello.java
simples como tem de ser :), claro, neste exemplo.

agora vamos ao exemplo( vou fazer a chamada diretamente no PHP sem nenhuma saida em GTK porque o intuito é mostrar apenas o funcionamento).

-- begin testPHP5Java.php
*?php
$obj = exec("java Hello");
echo "resultado: \n\n";
print_r( json_decode( $obj ) );
echo "\n\n\n\n";
-- enf testPHP5Java.php

basta ir ao seu shell preferido e digitar:
php testPHP5Java.php

Domingo, Junho 24, 2007

O objeto não pode estar aberto a tudo.

Mais uma salve a todos,

Ha algum tempo trabelhei numa empresa onde conheci uma pessoa, que nesta empresa ela, trabalhava com entre outras coisa o Java e certa vez ela fez uma observação que um objeto em PHP poderia iniciar com um atributo e no decorrer de sua vida ele poderia ir adquirindo vários outros e que no Java isso não era possível, de fato o PHP tem disso, e de fato isso não desejável e outro de fato é que ele tinha razão, mas e o PHP evolui e isso é uma consante. Para enteder melhor o que estou tentando externar, vai um exemplo:
  1. <php
  2. class Foo{ }

  3. $f = new Foo();
  4. $f->nome = "João Roberto";
  5. echo $f->nome;
  6. ?>

  7. saída: João Roberto.
Este comportamento, inadequado ao meu ver se dá devido ao PHP ter sua verificação relaxada ou seja ele verifica se é um objeto, mas se o atributo existe ou não para ele tanto faz. Na verdade não existir ele criará em run-time. Mas nem sempre isso é desejável. queremos uma forma de dizer ao PHP que se o atributo existir ele atribua o valor informado a este, porém, se não existir ele lance um SuperNomeGrandeParaDefinirQueAlgoNãoEstaCertoException. Nossa!

  1. <php
  2. class Foo{
  3. public $nome;
  4. public function __set( $nomeAtributo, $valorAtribtuo ){
  5. if( isset( $this->$nomeAtributo ) )
  6. $this->$nomeAtributo = $valorAtribtuo;
  7. else
  8. throw new Exception( "Error: O atributo: {$nomeAtributo} não existe." );
  9. }
  10. }

  11. $f = new Foo();
  12. $f->nomes = "João Roberto";
  13. ?>
O método mágico __set é executado imediatamente antes de uma atribuição de valor a um atributo. Isso possibilitará a verificação se tal atributo existe ou não. Pausa para as apresentações:

void __set ( string name, mixed value )

Onde void é retorno, ou seja, não retorna nada. string name é o nome do atributo que está sendo informado e por fim mixed value é o valor que está sendo atribuido para este atributo.

. . .continuando . . .

Com isso a gente força o PHP a não aceitar qualquer coisa, afinal, ele não é nem de longe é parente do ponto( . ) das Expressões Regulares.

Em nosso próximo encontro estaremos vendo sobrecarga de métodos.
Até Lá.

Quarta-feira, Maio 02, 2007

toString ou __toString?

Salve a todos,

Em recente labuta com as várias e várias formas de se fazer algo igual de forma diferente com o PHP, o que é extremamente bacana :), me deparei com uma função pra lá de útil quando estamos trabalhando com classes.

Mas desta vez eu encontrei apenas uma forma correta de fazer o que queria: Ao chamar o objeto ele me mostrar os valores de seus atributos, todos eles, sem ter que ficar criando um echo ou um print para cada um destes atributos.

Sim tem como sim.
Até pouco tempo atrás eu criava um método para quando eu o chamasse fosse impresso todos os valores dos atributos da classes, mas isso me forçava a invocar o objeto com o nome deste método:
<?php
// ...
$objeto->verValoresAtributos();
// ...
?>

Que tem de errado nisso? Nada! Mas, pra que você vai reinventar a roda se o PHP já lhe dá um método próprio para isso? Além do mais quando você usa o método correto você não precisa invocar o método, o PHP vai verificar que estar tentando exibir o objeto e ao invés de responder com uma resposta tipo:
Saída na tela:
Catchable fatal error: Object of class NossaClasse could not be converted to string in /srv/www/htdocs/NossaClasse.php on line 16

Cá pra nós tem coisa mais chata do que uma resposta destas? Quando queria-mos algo como:
Saída na tela: Olá augustowebd, eu tenho aqui os seguintes atributos: atributo1: valor do atributo1, atributo2: valor do atributo 2, ...

Então vamos fazer a coisa da forma certa. Definamos uma classes para nosso teste.
<?php
class NossaClasse{

// atributo qualquer
private $nome;

// construtor recebe valor para atributo qualquer
public function NossaClasse( $nome = null ){
$this->nome = $nome;
}

public function __toString(){
return $this->nome;
}
}
?>

Agora é criar seu objeto e dá um echo.
<?php
// ...
$meuObjeto = new
NossaClasse( "augustowebd" );
echo
$meuObjeto;
?>

Por fim, vamos cientificamente conhecer o __toString:
A assinatura do __toString é: function string __toString( void )
O que quer dizer: Este método retorna uma string e que não recebe nenhum paramentro( void ).

Respondendo a pergunta do título: __toString com dois underlines :).

Um abraço e até a próxima.