Legacy tiagomadeira.net

Archive for September, 2005

Início no Java

Tuesday, September 27th, 2005

Nesse final de semana, comecei a estudar Programação Orientada a Objetos. Eu nunca tinha experimentado essa maneira de programar e venho gostando bastante. :)

No início, fiz alguma coisa em C++; Depois mudei todo o sistema do meu blog para usar classes (ou “bibliotecas”, como o hlegius prefere, não sei porquê…) e agora então, por sugestão do , comecei a aprender Java.

Acho que é uma excelente maneira de me aprofundar na orientação a objetos. Desde o início da minha apostila, estou me deparando com a POO; o Java é uma linguagem completamente orientada a objetos (tanto que é sempre o exemplo quando alguém fala dela).

Pelo pouco que programei até agora (comecei hoje), percebi quatro vantagens legais que o C não tinha:

  1. Declaração de variáveis em qualquer lugar do documento. O C++, o PHP e várias outras linguagens permitem isso também…
  2. Multi-plataforma. Linux, Windows, Mac, Solaris… O mesmo código roda em tudo! :) C também roda em tudo, mas não exatamente da mesma maneira como o Java
  3. Desenvolvimento para web via applets.
  4. Parece muito fácil criar interfaces gráficas. Não sei se é mesmo, mas parece.

Bom… Não entendi direito o negócio de plataforma Java, pra ser sincero… Mas ainda tô iniciando aí nesse mundo do Java e da POO. :)

E então, para finalizar fica um código de um exercício que eu fiz; o primeiro da primeira apostila (que inclusive eu já concluí a leitura):

Calcular a soma e a média de vários números, e ver o maior e o menor

import javax.swing.JOptionPane;

/* Eu não precisava de array para esse programa, só usei porque
* estou aprendendo Java então preciso me acostumar com arrays... */

class Exercicio {
import javax.swing.JOptionPane;

/* Eu não precisava de array para esse programa, só usei porque
* estou aprendendo Java então preciso me acostumar com arrays... */

class Exercicio {
public static void main(String args[]) {
int n;
String string;

JOptionPane.showMessageDialog(null, "Olá. Esse programa serve pra calcular a soma e a média entre vários números, além de definir o maior e o menor deles.");
JOptionPane.showMessageDialog(null, "Restrições:\n\n1. Só funciona com números entre -1.000.000 e 1.000.000.\n2. Só funciona (a entrada e a saída) com números inteiros.");
string=JOptionPane.showInputDialog("Você quer calcular a média entre quantos termos?");
n=Integer.parseInt(string);

int array[] = new int[n];
int i, m, soma=0, maior=-1000000, menor=1000000;

for (i=0; i m=i+1;
string=JOptionPane.showInputDialog("Digite o "+m+"o. número:");
array[i]=Integer.parseInt(string);
soma+=array[i];
if (array[i]>maior) {
maior=array[i];
}
if (array[i] menor=array[i];
}
}

int media=soma/n;

JOptionPane.showMessageDialog(null, "A soma de todos os números é "+soma+".");
JOptionPane.showMessageDialog(null, "A média de todos os números é "+media+".");
JOptionPane.showMessageDialog(null, "O maior dos números é "+maior+".");
JOptionPane.showMessageDialog(null, "O menor dos números é "+menor+".");
}
}

No mais, nada de novo. Só pra registrar a data de meu início no Java. :D

Mudanças no Site e Código do Blog

Sunday, September 25th, 2005

Ultimamente fiz várias alterações no site. Refiz quase que todas as páginas e deixei tudo um pouco mais leve e mais fácil para mudar depois. :D Depois de conhecer a POO, me viciei nela no final de semana e converti meu site inteiro para classes. E agora, que seu script tá um pouco melhor organizado, vou colocar aqui para quem quiser copiar, usar alguma idéia, saber como eu estou indo em POO, ver as besteiras que eu faço enquanto programo, etc. :lol: resolvi disponibilizar todo o código de meu blog aqui.

Já que meu blog tem alguns bugs (known bugs de pouca importância, como o caso de se alguém escreve CHARESPC no meio de um comentário ele deve criar um &;), peço somente que ninguém destrua-o sabendo disso. Se alguém descobrir algum bug, pode me enviar um e-mail que ficarei bastante grato. :)

Já que não passei a sessão de administração para POO não vou publicá-la aqui, mas depois de resolver alguns bugzinhos pretendo disponibilizar o código completo, inclusive com um arquivo de instalação que cria as tabelas no banco de dados, para todos poderem usar um sisteminha de blog simples e prático (só que acho que vai ser algo mais voltado a programadores, porque tem vantagens como o uso do GeSHi, e desvantagens como eu publicar todos os posts escrevendo em HTML – isso mesmo, até os & que eu escrevo são & que são & *e um loop infinito pela frente). Hmmm, aliás, quem quiser me ajudar a fazer parte desse projeto para tornar o meu blog um software livre, sinta-se livre para me mandar um e-mail também. :p

Então, uma última observação é que eu substituí todos os <code (note a ausência do > ) por tag code e todos os </code> por tag /code, porque senão minhas expressões regulares do código dariam bug (quer saber por que? Então leia os códigos!)

Funções e classes “includadas” em todos os arquivos

session_start();

// Syntax Highlight - GeSHi
if (!class_exists(GeSHi)) {
include("geshi.php");
}

// Objeto de conexão do MySql
class MySql {
var $host="servidor";
var $usuario="usuario";
var $senha="senha";
var $db="bancodedados";
var $conexao;

function conecta() {
$this->conexao=mysql_connect($this->host, $this->usuario, $this->senha);
mysql_select_db($this->db);
}

function desconecta() {
mysql_close($this->conexao);
}
}

// Classe com as funções de expressões regulares
class Regex {
function Replace($o, $d, $t, $codes=0) {
for ($i=0; $i $o[$i]=str_replace('(', '\(', $o[$i]);
$o[$i]=str_replace(')', '\)', $o[$i]);
$t=eregi_replace($o[$i], $d[$i], $t);
}
if ($codes==1) {
$t="tag /code".$t."tag code";
} else if ($codes==2) {
$t.="tag code";
} else if ($codes==3) {
$t="tag /code".$t;
}
return $t;
}

function Emoticons() {
$o[0]=":)";
$d[0]="feliz";
$o[1]=":(";
$d[1]="triste";
$o[2]=":o";
$d[2]="bocaaberta";
$o[3]=":p";
$d[3]="lingua";
$o[4]=":angry:";
$d[4]="raiva";
$o[5]=":s";
$d[5]="confuso";
$o[6]=":blink:";
$d[6]="inacreditavel";
$o[7]=";)";
$d[7]="piscando";
$o[8]=":lol:";
$d[8]="rindo";
$o[9]=":d";
$d[9]="sorriso";
$o[10]=":unsure:";
$d[10]="semgraca";

for ($i=0; $i $d[$i]="\"".$o[$i]."\"";
}

if (!ereg("tag code", $texto)) {
$this->texto=$this->Replace($o, $d, $this->texto);
} else {
preg_match_all("/<\/code>(.+)tag code/sU", $this->texto, $mat1);
for ($i=0; $i $this->texto=str_replace($mat1[1][$i], $this->Replace($o, $d, $mat1[1][$i]), $this->texto);
}
preg_match("/^(.+)tag code/sU", $this->texto, $mat2);
$texto=str_replace($mat2[1], $this->Replace($o, $d, $mat2[1]), $this->texto);
$rev=strrev($this->texto); //Tenho medo do PHP5.0.5
preg_match("/^(.+)>edoc\/ $rev=strrev($mat3[1]); //Repito... Tenho medo do PHP5.0.5
$this->texto=str_replace($rev, $this->Replace($o, $d, $rev), $this->texto); //Agora fuck PHP5.0.5!
}
}

function GeshiHighlight($codigo, $linguagem) {
$geshi=new GeSHi($codigo, $linguagem, "./geshi/");
return $geshi->parse_code();
}

function Codigos() {
preg_match_all("/tag code class=\"(.*)\">(.*)<\/code>/sU",
$this->texto,
$matches);
for ($i=0; $i $g=$this->GeshiHighlight($matches[2][$i], $matches[1][$i]);
if (eregi("MSIE", $_SERVER["HTTP_USER_AGENT"])) {
$g=ereg_replace("

", "
", $g);
}
$this->texto=str_replace($matches[0][$i],
$g,
$this->texto);
}
}

function QuebraLinha() {
$this->texto=nl2br($this->texto);
}
}

// Objeto "Artigo"
class Artigo extends Regex {
var $id;
var $data;
var $permalink;
var $titulo;
var $texto;
var $comentarios;

function Artigo($identificacao) {
$this->id=$identificacao;

$mysql=new MySql();
$mysql->conecta();

$query_post=mysql_query("SELECT data, permalink, titulo, texto FROM artigos WHERE id='{$this->id}'");
$post=mysql_fetch_row($query_post);
$this->data=date("d/m/Y", $post[0]);
$this->permalink=$post[1];
$this->titulo=$post[2];
$this->texto=$post[3];

$query_comentarios=mysql_query("SELECT count(id) FROM comentario WHERE idpost='{$this->id}'");
$comentarios=mysql_fetch_row($query_comentarios);
$this->comentarios=$comentarios[0];

$mysql->desconecta();
}

function AppendGoogleAds($ads) {
$this->texto.="\n\n".$ads;
}

function Mostra() {
echo "

permalink}\">{$this->titulo}

\n";
echo $this->texto."\n";
echo "

{$this->data} ";
echo "permalink}\" class=\"permalink\">permalink ";
echo "permalink}#comentarios\" class=\"comentarios\">";
echo "{$this->comentarios} comentário(s)

\n";
}

function MostraComentarios() {
if ($_POST["comenta"]&&(!$_SESSION["comentario"]||time()-30>$_SESSION["comentario"])) {
$_SESSION["comentario"]=time();
EscreveComentario($_POST["nome"], $_POST["email"], $_POST["texto"], $this->id);
}
$comentarios=new Comentarios($this->id);
$comentarios->Mostra();
}
}

// Objeto Artigos (serve para pegar vários artigos sem eu precisar fazer nada nas outras páginas)
class Artigos {
var $id;
var $titulo;
var $texto;
var $permalink;
var $data;
var $comentarios;

function Artigos($n=20, $start=0, $emoticons=0, $codigos=0, $mostrar=0, $comentarios=0) {
$mysql=new MySql();
$mysql->conecta();
$query=mysql_query("SELECT id FROM artigos ORDER BY data DESC, id DESC LIMIT $start,$n");
$mysql->desconecta();
for ($i=0; $array=mysql_fetch_array($query); $i++) {
$artigo=new Artigo($array["id"]);
if ($emoticons) {
$artigo->Emoticons();
}
if ($codigos) {
$artigo->Codigos();
}
if ($mostrar) {
$artigo->Mostra();
}
if ($comentarios) {
$artigo->MostraComentarios();
}
$this->id[$i]=$array["id"];
$this->titulo[$i]=$artigo->titulo;
$this->texto[$i]=$artigo->texto;
$this->permalink[$i]=$artigo->permalink;
$this->comentarios[$i]=$artigo->comentarios;
$this->data[$i]=$artigo->data;
}
}
}

// Objeto Comentário
class Comentario extends Regex {
var $id;
var $data;
var $nome;
var $email;
var $ip;
var $useragent;
var $texto;
var $numero;

function Comentario($identificacao, $numero) {
$this->id=$identificacao;
$this->numero=$numero;

$mysql=new MySql();
$mysql->conecta();

$query=mysql_query("SELECT data, nome, email, ip, useragent, texto FROM comentario WHERE id='{$this->id}'");
$comentario=mysql_fetch_row($query);

$this->data=date("d/m/Y", $comentario[0]);
$this->nome=$comentario[1];
if ($_SESSION["tiagomadeira"]) {
$this->email="
";
if ($comentario[2]) $this->email.="E-mail: ".$comentario[2]."
\n";
if ($comentario[3]) $this->ip="IP: ".$comentario[3]."
\n";
if ($comentario[4]) $this->useragent="User Agent: ".$comentario[4];
$this->useragent.="
";
} else {
$this->email="";
}
$this->texto=$comentario[5];

$mysql->desconecta();
}

function CharEspc($pos) {
if ($pos==1) {
$this->texto=preg_replace("/&([^;]+);/sU", "CHARESPC\\1/CHARESPC", $this->texto);
} else if ($pos==2) {
$this->texto=preg_replace("/CHARESPC(.+)\/CHARESPC/sU", "&\\1;", $this->texto);
}
}

function Mostra() {
echo "

id}\">\n";
echo "\t

id}\">#{$this->numero} | ";
echo "{$this->nome} ";
echo "{$this->data}{$this->email}{$this->ip}{$this->useragent}

\n";
echo "

{$this->texto}

";
echo "

\n";
}
}

// Objeto Comentários
class Comentarios {
var $idpost;
var $ids;
var $tamanho;

function Comentarios($idpost) {
$this->idpost=$idpost;

$mysql=new MySql();
$mysql->conecta();

$query=mysql_query("SELECT id FROM comentario WHERE idpost='{$this->idpost}' ORDER BY data ASC, id ASC");
for ($i=1; $array=mysql_fetch_array($query); $i++) {
$this->ids[$i]=$array["id"];
}

$this->tamanho=$i;
$mysql->desconecta();
}

function Mostra() {
echo "

Comentários

\n";
for ($i=1; $i<$this->tamanho; $i++) {
$comentario=new Comentario($this->ids[$i], $i);
$comentario->CharEspc(1);
$comentario->Emoticons();
$comentario->CharEspc(2);
$comentario->QuebraLinha();
$comentario->Mostra();
}

if ($this->tamanho <= 1) {
echo "

Nenhum comentário cadastrado.

\n";
}

FormularioComentario($this->idpost);
}
}

// Função para descobrir IP do visitante
function PegaIP() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "desconhecido")) {
$ip=getenv("HTTP_CLIENT_IP");
} else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "desconhecido")) {
$ip=getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "desconhecido")) {
$ip=getenv("REMOTE_ADDR");
} else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "desconhecido")) {
$ip=$_SERVER['REMOTE_ADDR'];
} else {
$ip="desconhecido";
}

return($ip);
}

// Função que escreve o formulário para envio de comentário
function FormularioComentario($idpost) {
$mysql=new MySql();
$mysql->conecta();
$query=mysql_query("SELECT permalink FROM artigos WHERE id='$idpost'");
$row=mysql_fetch_row($query);
$permalink=$row[0];
$mysql->desconecta();
?>

Escreva um comentário

#comentarios" method="post">




* - Ele não aparecerá em público. Serve apenas para eu te contatar,
caso queira responder seu comentário.

}

// Função que cadastra um comentário
function EscreveComentario($nome, $email, $texto, $idpost) {
$ip=PegaIP();
$useragent=$_SERVER["HTTP_USER_AGENT"];
$nome=purifica($nome);
$email=purifica($email);
$texto=purifica($texto);
$data=time();
$mysql=new MySql();
$mysql->conecta();
mysql_query("INSERT INTO comentario (id, idpost, nome, email, texto, data, ip, useragent) VALUES
('', '$idpost', '$nome', '$email', '$texto', '$data', '$ip', '$useragent')") or die(mysql_error());
$mysql->desconecta();
$email=($email)?$email:"contato@tiagomadeira.net";
$mensagem="No post de id $idpost, o $nome ($email) comentou em ".date("d/m/Y", $time)." dizendo:";
$mensagem.="\n\n";
$mensagem.="$texto";
mail("contato@tiagomadeira.net", "[tiagomadeira.net] Novo Comentário!", "$mensagem", "From: $nome <$email>");
}

// Função que cria escreve o título das seções
function titulo($titulo) {
$tit="$titulo [tiagomadeira.net]";
echo "\n";
}

// Função para purificar os comentários depois do envio
function purifica($texto) {
$t=ereg_replace("&", "&", $texto);
$t=ereg_replace("%", "%", $t);
$t=ereg_replace("<", "<", $t);
$t=ereg_replace(">", ">", $t);
$t=ereg_replace("\[", "[", $t);
$t=ereg_replace("\]", "]", $t);
$t=ereg_replace("\"", """, $t);
return $t;
}

// Função para editar artigos
function pra_textarea($texto) {
$texto=ereg_replace("&", "&", $texto);
$texto=ereg_replace("<", "<", $texto);
$texto=ereg_replace(">", ">", $texto);
$texto=ereg_replace("\"", """, $texto);
return $texto;
}

?>

E os arquivos que usam essas funções e classes...

/artigos (ou /blog)

$artigosporpagina=10; //Artigos Por Página
$p=($_GET["pg"])?$_GET["pg"]:1; //Página Atual

$mysql=new MySql();
$mysql->conecta();
$query=mysql_query("SELECT count(id) FROM artigos");
$row=mysql_fetch_row($query);
$np=ceil($row[0]/$artigosporpagina);
$mysql->desconecta();

$paginacao="";
for ($i=1; $i<=$np; $i++) {
$paginacao.=" ?PHPSESSID=9ec34c96b02b3755051aa682d1e02001
if ($i==$p) $paginacao.=" style=\"font-weight:bold; color:#c00;\"";
$paginacao.=">$i
";
}
$paginacao="\n\n

Ir para página: $paginacao

\n\n";

echo $paginacao;

$artigos=new Artigos($artigosporpagina, ($p-1)*$artigosporpagina);
echo "

\n";

echo $paginacao;
?>

/ (ou /ultimos)

$artigos=new Artigos(5, 0, 1, 1, 1);
?>

Para finalizar... .htaccess

RewriteEngine On

#Diretórios
RewriteRule ^link/?$ http://tableless.tiagomadeira.net
RewriteRule ^post/?$ http://tableless.tiagomadeira.net/blog
RewriteRule ^script/?$ http://tableless.tiagomadeira.net/scripts
RewriteRule ^downloadscript/?$ http://tableless.tiagomadeira.net/scripts

#Blog: A grande excessão
RewriteRule ^blog/([0-9]+)$ http://tableless.tiagomadeira.net/index.php?l=blog&pg=$1
RewriteRule ^/link/blog/([0-9]+)$ http://tableless.tiagomadeira.net/index.php?l=blog&pg=$1
RewriteRule ^artigos/([0-9]+)$ http://tableless.tiagomadeira.net/index.php?l=blog&pg=$1
RewriteRule ^/link/artigos/([0-9]+)$ http://tableless.tiagomadeira.net/index.php?l=blog&pg=$1

#Links
RewriteRule ^link/(.+)$ http://tableless.tiagomadeira.net/index.php?l=$1
RewriteRule ^([^/.]+)$ http://tableless.tiagomadeira.net/index.php?l=$1

#Posts
RewriteRule ^post/([0-9]+)$ http://tableless.tiagomadeira.net/index.php?l=artigo&id=$1
RewriteRule ^post/(.+)$ http://tableless.tiagomadeira.net/index.php?l=artigo&permalink=$1

#Scripts
RewriteRule ^script/(.+)$ http://tableless.tiagomadeira.net/index.php?l=script&script=$1
RewriteRule ^downloadscript/(.+)$ http://tableless.tiagomadeira.net/downloadscript.php?script=$1

#Feeds
RewriteRule ^feed.rss$ http://tableless.tiagomadeira.net/rss.php
RewriteRule ^rss.xml$ http://tableless.tiagomadeira.net/rss.php
RewriteRule ^index.rss$ http://tableless.tiagomadeira.net/rss.php
RewriteRule ^sitemap.xml$ http://tableless.tiagomadeira.net/sitemap.php

Programação Orientada a Objetos

Saturday, September 24th, 2005

Estou finalmente começando a aprender orientação a objetos. É claro que o conceito eu já conhecia e até como usar “cin” e “cout” no C++, mas agora resolvi estudar a fundo a Programação Orientada a Objetos, porque vejo que ela está cada vez mais comum entre os programadores. Estou aproveitando pra aprender C++, o que pode ser bastante útil em olimpíadas, para ter strings com o tipo string, poder declarar variáveis no meio, além de programar orientado a objetos.

Hmmm… Eu estava lendo uns tutoriais de introdução a POO e agora vou tentar fazer algumas coisas em C++ e em PHP também (porque é uma linguagem que eu domino mais, fica mais fácil entender POO). Se alguém quiser estudar comigo, entre em contato (e a mesma coisa se alguém tiver uma apostila legal e está afim de ajudar).

XUL

Durante as aulas, estou estudando XUL. É uma linguagem de interface gráfica, tipo um HTML, mas que tem umas coisas bem interessantes. O único problema é que só roda em Mozilla… E também estou aumentando bastante meu conhecimento de JavaScript utilizando XUL e iniciando uma fase nova de tableless com DOM. :)

Meetweb, tableless

Semana passada eu peguei dois serviços da Meetweb. São serviços de converter um site para tableless e programá-lo em PHP usando banco de dados MySql (ou seja, minha especialidade). Por isso também, estou entrando nessa nova fase de tableless que citei no parágrafo acima.

Desvendando os segredos do C

É incrível que quando eu estudei C no início eu passei por alguns conceitos que na época eu achava complicados. Além dos operadores binários que o Paulo Matias me ensinou semana passada, ontem é que eu finalmente aprendi as funções de alocação dinâmica do C… E é tão simples! :D

Olimpíada Regional de Matemática

Ontem fiz a prova da segunda fase (final) da Olimpíada Regional (catarinense) de Matemática. Dos cinco problemas, resolvi quatro e acho que acertei três e meio. Um deles eu pensei certo, mas dei a resposta errada… Mas já que a prova era discursiva, acredito que eles dêem no mínimo metade dos 20 pontos do problema. Não sei se dá pra ganhar medalha, porque a prova tava bem fácil então mais gente deve ter ido bem.

Problemas Lógicos

Estou meio parado quanto a solução de problemas lógicos, mas estou estudando bastante para resolvê-los de forma melhor. Por enquanto, nenhum código novo. Tenho uma lista de problemas da UVa para resolver e ainda falta o último problema do capítulo 1 do USACO Training Gateway (Checkers Challenge).

Novo site do Colégio!

Tuesday, September 20th, 2005

Publiquei hoje o novo site do Colégio Salesiano Itajaí, um site totalmente administrável (até o título pode ser mudado via formulários) que usa a linguagem PHP e o banco de dados MySql. O site também segue os padrões web, mesmo com formulários rich text que às vezes deixam o site pouco semântico (é que os monitores do Colégio devem poder atualizar) e está disponível em: salesianoitajai.g12.br.

A notícia de estréia da página está disponível aqui e conta com um lindo screenshot do meu Fluxbox com Mrxvt e o Vim com três splits. Embora o site já esteja publicado, ainda tenho que arrumar alguns detalhes como por exemplo o Sitemap que eu cito nesta notícia.

Uma coisa bem legal que eu coloquei no site foi um JavaScript, usando a função addGlobalStyle do Dive into Greasemonkey, que nos Mozillas (ereg(“Gecko/”, $_SERVER["HTTP_USER_AGENT"])) faz o site ficar maior se o usuário usar uma resolução igual ou maior a 1024×768. Dá pra fazer pra todos os navegadores, mas eu sou meio newbie em JavaScript e por isso só usei esse código do Greasemonkey, que só funciona nos Mozillas mesmo… Mas o resultado ficou ótimo! :)

Ontem o Sr. Paulo Matias me ensinou como trabalhar com operadores bit-a-bit no C. Achei muito massa! Agora comecei até a economizar fazendo:

numero = outronumero << 1;

... ao invés de simplesmente:

numero = outronumero * 2;

... para meus programas serem mais rápidos! Hehehe :D Fiz uma função que converte de decimal para binário, e depois vou postar aqui.

Observação: Tenho que descobrir porque os emoticons não funcionam quando tem código... Quer dizer, descobrir eu já descobri, mas preciso ver como eu faço pra resolver de forma boa essas expressões regulares...

Editado!

Corrigi o problema... Confira abaixo o novo trecho de ERs da função de emoticons, onde $o é o vetor de origem (com as carinhas originais), $d é o vetor de desgino (com o <img src...) e replace() é uma função que eu criei para substituir os emoticons:

if (!ereg(" $texto=replace($o, $d, $texto);
} else {
preg_match_all("/<\/code>(.+) for ($i=0; $i $texto=str_replace($mat1[1][$i], replace($o, $d, $mat1[1][$i]), $texto);
}
preg_match("/^(.+) $texto=str_replace($mat2[1], replace($o, $d, $mat2[1]), $texto);
$rev=strrev($texto); //Tenho medo do PHP5.0.5
preg_match("/^(.+)>edoc\/ $rev=strrev($mat3[1]); //Repito... Tenho medo do PHP5.0.5
$texto=str_replace($rev, replace($o, $d, $rev), $texto);
}
?>

Ficou feio, né? Não consegui pensar em outra coisa mais fácil que usar o strrev() ali... :blink:

MRxvt e Controle Anti-flood

Sunday, September 18th, 2005

Formatei minha partição Linux e instalei o novo Slackware 10.2 para ver quais eram as novidades…

Ainda estou configurando o sistema, mas ele já está bastante estável, com Kernel 2.6, Grub, XDirectFB em desenvolvimento e hoje testei um programa que merece um post especial aqui no blog chamado MRxvt. É um terminal que abre na velocidade do Xterm, mas tem os recursos do Konsole do KDE! Hehehe… :D Abas, transparências, entre outras coisas de uma forma leve que eu nunca tinha visto. Eu descobri o programa quando eu e o Thotypous estávamos pensando em baixar o source do Gnome-Terminal e tentar modificar para deixar bem levinho e só com abas, ou pegar o xterm e implementar abas… :) Mas esse programa é simplesmente fabuloso. Acabou com nossos problemas… Baixem aqui!

O Hélio (a.k.a. hlegius) me deu uma idéia bastante útil que é um controle anti-flood para os comentários do meu site… Já implementei usando sessões… Valeu Hélio!

Bom… Por enquanto é só! ;) Resolvi agora postar mais aqui, e fazer posts menores. Fiz várias mudanças aí no lado direito do site nos últimos dias (e no meio também), deixando o site mais semântico além de mais atualizado e “correto”. Também atualizei a minha biografia (colocando até o MRxvt) e acho que vou dar uma reformulada no sistema de BBCode (ER) do meu blog, porque quando eu coloco um código depois não funciona mais os emoticons embaixo dele.