bloco de ips da china e da coréia

Pra quem quiser bloquear toda china ou coréia para acessar um servidor web, emails, etc. pode usar as listas abaixo:

Coréia: http://www.okean.com/antispam/korea.html
China: http://www.okean.com/antispam/china.html

De acordo com o autor, a lista é atualizada cerca de 2 a 3 vezes por semana e não há problemas em agendar uma cron pra atualizar automaticamente, desde que o intervalo dessa cron seja maior do que 12 horas (ele recomenda a cada 24 horas)

Encontrando arquivos que foram modificados nos ultimos 15 minutos

Sempre me perguntei como os empacotadores de rpm deb compilavam as coisas e depois faziam o pacote com os binários/libs pré-compilados

Depois de uma longa pesquisa no gooogle aliado a uma boa leitura do man/help descobri um comando que pode ser muito útil.

Basicamente eu baixo os tar.gz do que eu quero instalar (ex. nginx) descompacto, compilo com as infos que eu quero, depois executo o comando abaixo para verificar quais arquivos foram modificados nos últimos 15 minutos. Para um resultado mais preciso, basta cronometrar quanto tempo levou o make install e ajustar no comando conforme necessidade.

find / -type f -mmin -15 |egrep -v "^/proc|^/home|^/root|^/.|^/tmp|.log$"

Esse egrep serve pra filtar o conteúdo que não é desejado, por exemplo: Não me importa se houve modificações no /proc ou /tmp

Classe php para trabalhar com oracle

Compartilho com todos a classe criada por mim para utilização com oracle, todos estão livres para utilizar, copiar e modificar, mas por favor, peço que mantenahm os créditos, pois dediquei um bom de pesquisa nisso!

final class oracle
{

		/*
		 * Classe para conexão e queries a banco oracle
		 * Criado em 02/10/2011 por Felipe Braz
		 * Versão 1.1
		 * Duvidas sugestões: fbraz3 [arroba] gmail.com
		 * Copia/modificação livre desde que se mantenham os créditos
		*/

        public $oci_error;

		private $conexao  = null;
        private $username = null;
        private $password = null;
        private $uri      = null;

		public function get_instance($username, $password, $uri)
		{
			$this->username = $username;
			$this->password = $password;
			$this->uri		= $uri;
			return $this;
		}

        public function __construct()
        {
            //Sem construtor
        }

        public function connect()
        {
                if (!$this->conexao = @oci_connect($this->username, $this->password, $this->uri)) {
                        $this->oci_error = @oci_error($this->conexao);
                        die("Erro ao conectar ao Oracle " . $this->oci_error['text']);
                }
        }       

        public function query($sql)
        {
                $stmt = @oci_parse($this->conexao, $sql);
                $r = @oci_execute($stmt);
                $this->oci_error = oci_error($stmt);
                return $r;
        }
}

Exemplos de uso:

Instanciar conexão ao banco com os seguintes dados:
Banco de dados: testeoracle
Senha: s3nh40r4cl3
URL de conexao: 10.1.1.1/oracle

$obj = new oracle;
$obj->get_instance('testeoracle','s3nh40r4cl3','10.1.1.1/oracle')->connect();

Uma vez conectado pode-se efetuar uma query livre usando o método query()

$res = $obj->query("SELECT * FROM USUARIOS");
var_dump($res);

Para obter todos os dados da tabela, pode-se usar a função do php oci_fetch_array()

$res = $obj->query("SELECT * FROM USUARIOS");
while($r = oci_fetch_array($res))
{
   echo $r['usuario']."n";
}

Os erros retornados ficam no atributo publico oci_error.

Exemplo de tratamento de erro:

//conexão
$obj = new oracle;
$obj->get_instance('testeoracle','s3nh40r4cl3','10.1.1.1/oracle')->connect();

//Consulta na tabela USUARIOS
$res = $obj->query("SELECT * FROM USUARIOS");

//Se retornou erro, debuga ele e mata o script
if($obj->oci_error)
{
	print_r($obj->oci_error);
	die();
}

//Loop para obter todos os dados da tabela
while($r = oci_fetch_array($res))
{
   echo $r['usuario']."n";
}

COmo podem ver, a classe é bem simples, porém extremamente funcional para uso com oracle.

Função para verificar load average do servidor

Funciona na maioria dos servers compartilhados:

function get_server_load($windows = 0) {
        $os = strtolower(PHP_OS);
        if(strpos($os, "win") === false) {
  if(file_exists("/proc/loadavg")) {
         $load = file_get_contents("/proc/loadavg");
         $load = explode(' ', $load);
         return $load[0];
  }
  elseif(function_exists("shell_exec")) {
         $load = explode(' ', `uptime`);
         return $load[count($load)-1];
  }
  else {
         return "";
  }
        }
        elseif($windows) {
  if(class_exists("COM")) {
         $wmi = new COM("WinMgmts:\\.");
         $cpus = $wmi->InstancesOf("Win32_Processor");
         
         $cpuload = 0;
         $i = 0;
         while ($cpu = $cpus->Next()) {
    $cpuload += $cpu->LoadPercentage;
    $i++;
         }
         
         $cpuload = round($cpuload / $i, 2);
         return "$cpuload%";
  }
  else {
         return "";
  }
        }
}

Use com moderação 😉

Benchark Oracle vs MySQL

Estou estudando a tecnologia oracle, as soluções são realmente interessantes principalmente com “oracle rac”.

Algumas coisas impressionam, como por exemplo,  você está fazendo uma query usando um dos nós do cluster, se o servidor reboota, ou da algum problema, ele roteia automaticamente para o próximo nó e continua a query do ponto que parou, fizemos testes e de fato isso e real, a query para por alguns poucos segundos e depoi segue a execução normalmente.

Fiz um for simples em php para inserção de 10000 registros (sim tem maneiras melhor de inserir, mas era um teste simples) numa tabela chamada “teste” possuindo dois fields:
-> id int key  –> sem auto-increment
-> reg varchar(50)

Trecho do código que usei para o for (em oracle)

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        $oracle->query($sql);
}

Trecho do código em php

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        mysql_query($sql, $link);
}

utilizei a função time() do php para medir o timestamp inicial e final, a diferença deles é o tempo da operação em segundos.

Resultados:

–> inicio e fim são timestamp, tempo total em segundos
Oracle:
INICIO: 1316194690
FIM: 1316194729
Tempo Total: 39
Espaço ocupado: 500kb

MySQL INNODB:
INICIO: 1316194769
FIM: 1316194772
Tempo Total: 3
Espaço ocupado: 416Kb

MySQL MyISAM:
INICIO: 1316194854
FIM: 1316194857
Tempo Total: 3
Espaço ocupado: 336.99Kb

Conclusão:
Foi um teste muito simples para afirmar qual é o melhor, mas podemos ver que para operações simples, o mysql é quase 10 vezes mais rápido e ocupa menos espaço em disco.
Porém é fato sabido que o mysql perde performance na medida em que a quantidade de dados vai crescendo, já no oracle, quando isto acontece ele se mantem estável (com perda mínima, ou sem de performance).

Wireless travando ubuntu

Olá pessoal,

Neste último final de semana resolvi finalmente criar vergonha na cara e remover o windows7 que veio pré-instalado no meu notbook.

Ele é um HP DV5-2112BR, sei que existem notebook muito melhores, mais foi o que o meu dinheiro conseguiu comprar rsrsrs

Bom, primeiramente instalei uma distribuição que gosto muito, o opensuse, porém tive alguns problemas com aceleração 3D e skype,  e devido ao meu limitado tempo não foi possível pesquisar mais a fundo para solução. Logo baixei a ISO do ubuntu 11.04 e instalei.

Tudo funcionou uma marvailha, menos a rede wiereless, o led no F11 (tecla para ativar/desativar a wifi) ficava piscando como louca, alternando constantemente entre ligado/desligado, ele achava as redes sem fio mas nao conectava em nenhuma (nem nas abertas!) e o pior, qdo eu apertava o F11 o ubuntu simplesmente congelava, nem o mouse se mechia, somente resetando!

Pesquisando na net, descobri que o chipset dessa placa de rede (RaLink RT-3090) era compatível com a RT2800, logo provavelmnte o ubuntu estava carregando o driver (modulo) errado ocasionando o erro.

Bem, aqui fica dica e solução, porém vão ter que ter uma rede cabeada pra poder baixar os pacotes dos repositorios (tudo via apt, nem pensem em ficar compilando coisas 😉

Primeiramente, adicione o repositorio do markus no arquivo /etc/apt/sources.list

deb http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu maverick main
deb-src http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu natty main

Uma observação importante, nesse ponto, substituir a palavra “natty” no comando acima pela versão do seu ubuntu, abaixo as versões suportadas pelo repositório:

jaunty (9.04)
karmic (9.10)
lucid (10.04)
maverick (10.10)
natty (11.04)

Será necessário tambem importar a chave pgp

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86F4C28E

Agora atualizaremos os pactoes e instalaremos o driver

apt-get update
apt-get install rt3090-dkms

Infelizmente o trabalho não termina aqui, temos mais alguns arquivos para editar.
Lembrando então que a causa da falha é o fato de carregar o modulo/driver errado, instalar o novo não resolve esse problema, ele ira carregar o modulo certo, depois o errado e irá travar novamente!

Para resolver esta questão temos que colocar o modulo errado na blacklist, e adicionar o correto no arquivo de autoload dos modulos:

Deste modo, edita o arquivo /etc/modprobe.d/blacklist inserindo no final a seguinte linha:

blacklist rt2800pci

E finalmente, para carregar o modulo certo, adicionar no final do arquivo /etc/modules o texto:

rt3090sta

Agora sim, basta reiniciar o seu ubuntu e tudo estará funcionando! ;D

OBS: Os codinomes das versões do ubuntu, retirei de: http://ufpa.br/dicas/linux/li-u-ver.htm