Arquivo mensais:setembro 2005

Início no Java

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

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:nn1. 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<n; 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) {
                                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

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

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 &amp; que são &amp;amp; *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

<?php
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<sizeof($o); $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<sizeof($d); $i++) {
			$d[$i]="<img src="/emoticon/".$d[$i].".gif" alt="".$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<sizeof($mat1[1]); $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/</sU", $rev, $mat3); //Nossa, que código louco!
			$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<sizeof($matches[1]); $i++) {
			$g=$this->GeshiHighlight($matches[2][$i], $matches[1][$i]);
			if (eregi("MSIE", $_SERVER["HTTP_USER_AGENT"])) {
				$g=ereg_replace("<pre>", "<pre class="alturamaxima">", $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.="nn".$ads;
	}
 
	function Mostra() {
		echo "<h2><a href="/post/{$this-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>permalink}">{$this->titulo}</a></h2>n";
		echo $this->texto."n";
		echo "<h5>{$this->data} ";
		echo "<a href="/post/{$this-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>permalink}" class="permalink">permalink</a> ";
		echo "<a href="/post/{$this-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>permalink}#comentarios" class="comentarios">";
		echo "{$this->comentarios} comentário(s)</a></h5>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="</small><span style="font-size:10px;"><br />";
			if ($comentario[2]) $this->email.="<strong>E-mail:</strong> ".$comentario[2]."<br />n";
			if ($comentario[3]) $this->ip="<strong>IP:</strong> ".$comentario[3]."<br />n";
			if ($comentario[4]) $this->useragent="<strong>User Agent:</strong> ".$comentario[4];
			$this->useragent.="</span>";
		} else {
			$this->email="</small>";
		}
		$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 "<div class="comentario" id="com{$this->id}">n";
		echo "t<h4><a href="?PHPSESSID=9ec34c96b02b3755051aa682d1e02001#com{$this->id}">#{$this->numero}</a> | ";
		echo "{$this->nome} ";
		echo "<small>{$this->data}{$this->email}{$this->ip}{$this->useragent}</h4>n";
		echo "<p>{$this->texto}</p>";
		echo "</div>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 "<h3 id="comentarios">Comentários</h3>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 "<p>Nenhum comentário cadastrado.</p>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();
?>
 
<h3>Escreva um comentário</h3>
 
<form action="/post/<?=$permalink;?><input type="hidden" name="PHPSESSID" value="9ec34c96b02b3755051aa682d1e02001" />#comentarios" method="post">
	<ul>
		<li><label for="nome">Seu nome:</label>
			<input type="text" name="nome" id="nome" />
		</li>
		<li><label for="email">Seu e-mail<strong>*</strong>:</label>
 
			<input type="text" name="email" id="email" />
		</li>
		<li class="textarea"><label for="texto">Comentário:</label>
			<textarea name="texto" id="texto" cols="20" rows="15"></textarea>
		</li>
	</ul>
	<p><strong>*</strong> - Ele não aparecerá em público. Serve apenas para eu te contatar,
	caso queira responder seu comentário.</p>
 
	<p><input type="submit" name="comenta" value="Comentar" /></p>
</form>
<?php
}
 
// 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.="nn";
	$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 "<script type="text/javascript">n";
	echo "ttop.document.title="$tit";n";
	echo "</script>n";
}
 
// Função para purificar os comentários depois do envio
function purifica($texto) {
	$t=ereg_replace("&", "&amp;", $texto);
	$t=ereg_replace("%", "&#37;", $t);
	$t=ereg_replace("<", "&lt;", $t);
	$t=ereg_replace(">", "&gt;", $t);
	$t=ereg_replace("[", "&#91;", $t);
	$t=ereg_replace("]", "&#93;", $t);
	$t=ereg_replace(""", "&quot;", $t);
	return $t;
}
 
// Função para editar artigos
function pra_textarea($texto) {
	$texto=ereg_replace("&", "&amp;", $texto);
	$texto=ereg_replace("<", "&lt;", $texto);
	$texto=ereg_replace(">", "&gt;", $texto);
	$texto=ereg_replace(""", "&quot;", $texto);
	return $texto;
}
 
?>

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

/artigos (ou /blog)

<?php
	$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.="<a href="/artigos/$i"";
?PHPSESSID=9ec34c96b02b3755051aa682d1e02001
		if ($i==$p) $paginacao.=" style="font-weight:bold; color:#c00;"";
		$paginacao.=">$i</a> ";
	}
	$paginacao="nn<p style="text-align:center;"><span style="color:#aaa; font-size:11px;">Ir para página:</span> $paginacao</p>nn";

	echo $paginacao;
 
	$artigos=new Artigos($artigosporpagina, ($p-1)*$artigosporpagina);
	echo "<ul>n";
	for ($i=0; $i<count($artigos->id); $i++) {
		echo "<li><a href="/post/{$artigos-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>permalink[$i]}">{$artigos->titulo[$i]}</a><br />";
		echo "<small>{$artigos->data[$i]} ";
		echo "<a class="comentarios" href="/post/{$artigos-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>permalink[$i]}#comentarios">{$artigos->comentarios[$i]} comentário(s)</a>";
		if ($_SESSION["tiagomadeira"]) {
			echo " <a href="/admin-edita&amp;id={$artigos-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>id[$i]}">[editar]</a>";
			echo " <a href="/admin-exclui&amp;id={$artigos-?PHPSESSID=9ec34c96b02b3755051aa682d1e02001>id[$i]}">[excluir]</a>";
		}
		echo "</small></li>n";
	}
	echo "</ul>n";
 
	echo $paginacao;
?>

/ (ou /ultimos)

<?php
	$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

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

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!

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

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:

<?php
if (!ereg("<code", $texto)) {
	$texto=replace($o, $d, $texto);
} else {
	preg_match_all("/</code>(.+)<code/sU", $texto, $mat1);
	for ($i=0; $i<sizeof($mat1[1]); $i++) {
		$texto=str_replace($mat1[1][$i], replace($o, $d, $mat1[1][$i]), $texto);
	}
	preg_match("/^(.+)<code/sU", $texto, $mat2);
	$texto=str_replace($mat2[1], replace($o, $d, $mat2[1]), $texto);
	$rev=strrev($texto); //Tenho medo do PHP5.0.5
	preg_match("/^(.+)>edoc/</sU", $rev, $mat3); //Nossa, que código louco!
	$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

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

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.

De volta à resolução de problemas

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.


Resultado do Superprime Rib

Hoje, depois de umas férias de dois meses, resolvi um problema lógico do USACO Training Gateway: o Superprime Rib é um problema bem simples em que precisa-se determinar os primos de N dígitos (com N máximo = 8 ) que, tirando o último dígito, continuam sendo primos. A solução é trivial, uma função recursiva bastante simples que se auto-explica no meu código:

//Superprime Rib - USACO Training Gateway - 2005
 
/*
ID: contato1
PROG: sprime
LANG: C
*/
 
#include <stdio.h>
#define NMAX 9
#define INFINITO 100000
 
int primos[NMAX][INFINITO], cont[NMAX];
 
int eh_primo(long int num) {
	int i;
 
	if (num==1||(!(num%2)&&num!=2)) {
		return 0;
	}
 
	for (i=3; i*i<=num; i+=2) {
		if (!(num%i)) {
			return 0;
		}
	}
 
	return 1;
}
 
void funcao(int n) {
	int i, j, num;
 
	cont[n]=0;
 
	if (n>1) {
		funcao(n-1);
 
		for (i=0; i<cont[n-1]; i++) {
			for (j=1; j<=9; j+=2) {
				num=primos[n-1][i]*10+j;
				if (eh_primo(num)) {
					primos[n][cont[n]++]=num;
				}
			}
		}
	} else {
		primos[1][0]=2;
		primos[1][1]=3;
		primos[1][2]=5;
		primos[1][3]=7;
		cont[1]=4;
	}
}
 
int main() {
	int n, i;
 
	FILE *in=fopen("sprime.in", "r");
	FILE *out=fopen("sprime.out", "w");
	fscanf(in, "%d", &n);
	fclose(in);
 
	funcao(n);
 
	for (i=0; i<cont[n]; i++) {
		fprintf(out, "%d\n", primos[n][i]);
	}
	fclose(out);
 
	return 0;
}

O problema passou de segunda porque na primeira, por falta de hábito, eu tinha colocado scanf e printf ao invés de usar o sistema da USACO onde deve-se usar arquivos de entrada e saída.

Agora para eu ir para a seção 2 do USACO Training Gateway falta só o programa Checker Challenge, que parece ser complicado.

Instalei os pacotes do Slackware 10.2, que saiu essa semana, no laptop. Não tem nenhuma grande mudança, mas é sempre bom estar com os programas atualizados…

O Paulo Matias (Thotypous) me convidou para fazer parte da equipe de desenvolvimento da distro Guaranix, consertando alguns bugs do XDirectFB (que eu citei aqui). Acho que irei pegar um trabalho com a Meetweb também (o Hugo Dias, para quem eu fiz o serviço da Coalizão Antituberculose me convidou) e estou acabando o site do Colégio Salesiano, que é totalmente administrável em PHP e usa um banco de dados MySql. Ele deve sair semana que vem…

Dia 24 é a segunda fase da Olimpíada Regional de Matemática. Essa semana fiz a folhinha de treinamento e dos seis problemas, consegui fazer cinco (na verdade, alguns problemas – ou todos – eram repetidos do ano anterior e por isso fica mais fácil, porque eu já lembrava o caminho).

Only variables can be passed by reference

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Instalei o PHP 5.0.5 no servidor do Colégio Salesiano na semana passada. E descobri que criaram um novo erro agora (do tipo fatal) para quando eu passo uma função como argumento de outra. “Fatal Error: Only variables can be passed by reference”. Bom… Uma função nada mais é que uma variável, afinal é pra isso que serve o seu retorno. Mas agora o PHP nos força, por exemplo, a fazer:

<?php
$variavel2=str_replace("a", "b", $variavel);
$variavel3=funcao($variavel2);
?>

… ao invés de fazer como eu sempre fiz para economizar linhas:

<?php
$variavel3=funcao(str_replace("a", "b", $variavel));
?>

Realmente não entendi o porquê da mudança. Pra mim tava muito bom do jeito anterior… E não sou só eu que faço isso. Os caras que fizeram o phpBB também passaram várias vezes funções como argumentos de outras e isso fez com que eu perdesse algum tempo hoje trocando todos as funções dessa maneira que mostrei acima no fórum do Colégio…

Alguém entende esses caras?

Escola, história, filosofia

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Para não citar os fatos inúteis da escola (que são maioria), resolvi elogiar as aulas de história deste terceiro bimestre escrevendo neste artigo principalmente sobre filosofia. (e dessa vez não é só a do software livre!)

Pitágoras

Nesse ano, voltamos a ter aulas de história de verdade, com uma professora de verdade e conteúdo de verdade. Quem conheceu o antigo professor Roberto, sabe do que eu estou falando… ;) Bom… Desde o começo do ano, estou gostando bastante de história. É uma matéria bem interessante que sempre nos faz pensar bastante e usar a lógica (aliás, a lógica lembra a razão, a Aristóteles e aos filósofos gregos). Não tá dando pra usar muito a lógica nas aulas de matemática, pois o professor se limita a ensinar PA, PG, funções de segundo grau e essas babaquices apenas usando fórmulas prontas. Sei que não é sua culpa, existe gente com sérias dificuldades de entendimento, mas acho que a escola muitas vezes é um repetir de fórmulas e exercícios que não ajudam a desenvolver o raciocínio. Então eu acho incrível que neste sentido, as aulas de história estão sendo as melhores deste ano.

Nesse bimestre, a professora Fabiana nos passou um trabalho sobre os filósofos gregos. O meu grupo falou sobre o filósofo Pitágoras, aquele que via números em tudo (e, sim, aquele mesmo que criou o Teorema) e aí comecei a ver uma relação (um pouco estranha) entre a matemática, a lógica, a razão, a filosofia e a história. E já que filosofia é amar a sabedoria, fica mais fácil entender toda essa relação, porque sabedoria é matemática… :D

O Mundo de Sofia

Bom… Agora estou relendo “O Mundo de Sofia”, desta vez lendo e relendo com atenção até as cartas de dezenas de páginas às vezes um pouco complicadas sobre a história de vários filósofos. E fica aí a sugestão desse excelente livro (é interessante as histórias que o autor conta, que deixam coisas complicadas bem mais simples, como entender a filosofia de Demócrito como o brinquedo Lego).

Ahnnn… E acho que esse post foi só pra falar disso mesmo, só para não concluir nada, mas só dizer como vai a escola e que ainda tem alguma coisa para se aprender lá, uma coisa pra fazer pensar lá. :) E, aliás, ainda não tô concluindo nada, só tô vendo as idéias dos filósofos “famosos” e refletindo sobre elas…

Agora em História, continuamos estudando a Grécia, e agora partindo para os etruscos para chegar em Roma, mas fica registrada aqui a minha felicidade por estar tendo a oportunidade de pensar (usando o raciocínio lógico) mesmo nesta disciplina.


Agora mudando radicalmente de assunto para dizer as últimas novidades, além da filosofia…

O beta do Firefox 1.5 saiu, já estou utilizando-o como padrão… Achei ele igual o meu outro Deerpark Alpha (a.k.a. Firefox 1.6a1) Já que no outro post já comentei sobre suas vantagens, pararei por aqui.

Olimpíada Regional de Matemática

A segunda fase da Olimpíada Regional de Matemática (catarinense) acontecerá no dia 24 deste mês e ainda não aprendi nada de novo sem ser filosofia, desde meu péssimo resultado na segunda fase da OBM.

A política no Brasil tá triste, não vejo escolhas sem mudar o sistema político, acabar com o capitalismo e com essa história de querer lucrar em tudo. Mas já que eu também sou um capitalista e nunca estudei direito sobre isso, e já tenho problemas menores suficientes para me incomodar, fica registrada aqui a tristeza mas o conformismo com essa situação. Na realidade, não sei quem não sabia ainda que os políticos brasileiros eram corruptos, mas agora é uma crise mais séria, tá tudo estourando… Não sei o que podemos fazer pra ajudar!

Fiz grandes alterações no meu site… Mudei a organização de todos os links, as regras do módulo ReWrite, adicionei feed do Flickr e criei um sitemap em XML do Google, mudei os permalinks dos artigos, as cores dos comentários, adicionei referências (permalinks) aos comentários… Um monte de coisa! :blink: E ainda tô querendo mexer em outras coisas… ;)

Tô testando uns sistemas de wiki para meu projeto de software livre para leigos, não tô conseguindo achar nada muito legal em PHP. Aquele “PHPWiki” não funciona direito, tive que modificar um monte de coisas e ainda assim apresentou problemas e tô quase decidindo fazer um eu mesmo.

Depois de um muito tempo, joguei RPG novamente este sábado… É meio esquisito interpretar um personagem na Idade Média, já é tão esquisito interpretar nós mesmos! :blink:

O site do Colégio tá quase pronto, estou precisando da biblioteca GD para trabalhar com redimensionamento de imagens e outras coisas com imagens no PHP e o cara que cuida do servidor FreeBSD ficou de instalar para mim, mas ainda não o fez… (gostaria tanto que fosse um Linux que eu mesmo tivesse configurado!)

Richard Stallman

Estou tentando fazer um Linux simples e acessível para minha família usar no computador que compartilha internet com o meu laptop, mas ainda não consegui nem instalar Linux (eu vivo instalando e desinstalando Linux aqui do lado… Esses caras não entendem como Linux é bom, a filosofia é linda e devemos parar de usar MSN e programas da Microsoft!). A mesma coisa eu quero fazer no Colégio depois que acabar de fazer o site. O Laboratório de Informática deveria ser só Linux. O KDE tem programas educativos tão legais, fora outros que podemos achar na internet… E tem programas para Ensino Médio que o nosso Lab. nem tem nem semelhantes. O problema é que ele tem uma grande quantidade de programas para a pré-escola e acho difícil encontrar bons clones para Linux. Eu acho que instalar Linux na escola é uma coisa indispensável e não pretendo sair de lá antes que esta missão esteja cumprida. Quero fazer ainda um esquema bem legal com um servidor e clientes usando NFS/NIS e com os clientes loggando no servidor e facilitando a vida da profa. de informática.

Fiz uma alteração nas Funções ZZ adicionando uma senha ao zzss (proteção de tela para console). O patch está disponível aqui no meu servidor: patch.zz e para patchar basta usar patch -p1 apontando para ele o arquivo do patch (patch.zz) e colocar no File to patch a localização do seu arquivo funcoeszz (tem que ser a última versão).

Para finalizar, não tenho produzido muitos códigos / solucionado problemas lógicos, mas tenho pensado bastante logicamente e até ando vendo alguns grafos no pensamento e criando quase inconscientemente uns algoritmos… Embora não esteja implementando ou escrevendo os algoritmos, acho que estou desenvolvendo-os… Hehehe… (parece que eu sou louco, né?)

Coloquei várias imagens aí em cima pro post não ficar muito sem graça, já que ficou um pouco grande… A maioria delas não é tão importante, mas são boas pra saber em que pedaço do texto estamos… :)

“Nem tão livre assim”

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

Sérgio Amadeu da Silveira

A Istoé publicou uma matéria sobre a saída de Sérgio Amadeu do ITI, com o nome “Nem tão livre assim”.

A notícia me deixou bastante triste e chocado com a crise no governo estar atingindo até uma coisa tão benéfica e interessante como é o software livre. Ver um cara como o Sérgio Amadeu saindo do governo é decepcionante depois de ver tantos projetos interessantes que ele coordenou e participou. Mas espero que os próximos em sua função no governo continuem com esses projetos e sempre inovando e criando novas idéias para o software livre no Brasil. O motivo da sua saída ele explica na seguinte frase de sua entrevista: “É bonito apoiar telecentro, computador barato para pobre, mas na hora de enfrentar interesses a favor do software livre, falta apoio, falta cara na reta.”

Para quem não conhece Sérgio Amadeu da Silveira, aproveito para citar um trecho de um texto dele de cerca de um ano atrás quando foi processado pela Microsoft por ter dito que a doação de software para governos é uma prática como a de traficantes: “[…] Gostaria de registrar que a contratação de software preservando os valores liberdade e abertura é, para o Governo Brasileiro, uma questão ligada de forma indissolúvel ao princípio democrático. E porque se percorreu um longo e doloroso caminho para chegar ao estágio atual de desenvolvimento da democracia neste país, não arrefeceremos em nossa luta. Se democracia é um valor repleto de ideologia, não é jamais um valor insignificante. Se democracia é um sonho, é um sonho do qual este País jamais acordará novamente. O futuro é livre.”


Estou participando do Festival de Música de Itajaí e também do projeto Banho de Cidadania do Colégio. Por isso, meu projeto de Software Livre está parado e não ando mais desenvolvendo nada. Fui muito mal na OBM nesse final de semana (também, eu não esperava ir bem e por isso nem me esforcei muito, ainda saí cedo porque tinha oficina de piano), mas isso não importa. Nesse ano, eu já esperava não ganhar nada na OBM. Fiz uma questão, mas pelo menos acertei ela… Agora tenho que me preparar para a ORM, que por ser só de Santa Catarina é bem mais fácil, e aí eu quero pegar uma medalha… ;)

Hoje meu grupo de choro tocou na Hora da Sineta. O show não foi muito bom, mas tudo bem… :D Também toquei na Sessão Cívica; essa apresentação foi um pouco melhor… Minhas aulas com o Michel Freidenson estão bem legais, embora ele esteja repetindo algumas coisas que eu já sei. Paralelamente, estou pegando o arranjo do Leandro Braga da música Naquele Tempo. É um choro bem legal do Pixinguinha e Benedito Lacerda, que no CD dele ficou bem interessante… Aliás, mandei um e-mail para ele pra ver se ele não escreveu a partitura.

Depois de amanhã vai sair o primeiro beta do Firefox
1.5! :P

PS1: Agora eu estou sabendo de “todas as notícias” porque tô finalmente usando os feeds dos sites de notícias do mundo, de informática e até as notícias do São Paulo! E, olha… Vale a pena usar esses feeds XML… Facilitam bastante a vida!

PS2: Coloquei ali nos botões ao lado direito um botão do Opera. Cada vez que alguém clica eu ganho um ponto e juntando 250 pontos, eu ganho o registro dele… Bom… Eu não uso Opera, a não ser para testar os sites que eu faço, mas sempre quis vez um Opera registrado pra ver se ele é bom sem aquelas ads feias! Então, quem quiser colaborar que fique a vontade! Hehehe…

Firefox 1.5 em breve!

ATENÇÃO: Este conteúdo foi publicado há 11 anos. Eu talvez nem concorde mais com ele. Se é um post sobre tecnologia, talvez não faça mais sentido. Mantenho neste blog o que escrevo desde os 14 anos por motivos históricos. Leia levando isso em conta.

A Mozilla publicou um documento sobre o primeiro beta do Firefox 1.5. O roadmap do Mozilla Firefox mostra como será a evolução do popular navegador…

Bom… Eu venho usando os alphas do Deerpark desde quando saiu o primeiro Alpha e agora estou usando o 1.6a1, que é um nightly build. Estou achando as mudanças muito boas e vejo cada vez mais o Firefox ganhando espaço na guerra dos browsers. Nesta nova versão, vem por padrão com recursos que antes só tinha como extensões, como as Tabbrowser Preferences e o Drop-down tabs e vem com aquele recurso de voltar “instantaneamente” (deixando a página no cache). Também tem mudanças no Gecko (agora está usando a versão 1.8) e uma mudança que percebi por acaso (fazendo o site do Colégio) é que o Deerpark vê texto de Flash como o Internet Explorer e não como os Firefox anteriores. Isso é… Eu não preciso converter o texto para UTF8 para ele ser mostrado com caracteres corretos. (não sei porque exatamente)

Bom… Recado passado! Dia 08 da semana que vem, Firefox 1.5 Beta! :)