Leccion aprendida instalar sphinx en ubuntu

Hola, escribo esto no solo paraque otros no caigan en el mismo error, si no que tambien para que yo no vuelva a cometerlo.

Instalar sphinx search en ubuntu puede ser tan facil como escribir;
sudo apt-get install sphinxsearch

Pero si queremos usar sphinx con el stemmer haciendo mas potentes nuestras busquedas el camino es cuesta arriba…

1) descarga y extrae la version estable de sphinx;
wget http://sphinxsearch.com/files/sphinx-0.9.9.tar.gz
tar xzf sphinx-0.9.9.tar.gz

2) instalemos las porqueris para usar mysql
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install build-essential
sudo apt-get install libmysqlclient15-dev

3) instalemos el stemmer
cd sphinx-0.9.9/
wget http://snowball.tartarus.org/dist/libstemmer_c.tgz
tar xzf libstemmer_c.tgz

4) instalemos todo, como veran yo lo instale en /usr/local/sphinx ustedes pueden instalarlo donde se les cante
./configure --prefix=/var/sphinx --with-libstemmer --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib/mysql
make
sudo make install

Luego tienen que crear el archivo de configuracion de sphinx y todo lo demas que ya deberian saber hacer.

Creando los indice.
/path/instalacion/indexer –all -c /path/de/configuracion/sphinx.conf

Luego tenes que cargar el demonio
/path/instalacion/searchd /path/de/configuracion/sphinx.conf

OJO! yo como un boludo en vez de searchd puse search, que es el binario para realizar busquedas, constantemente me tiraba error y pense que me habia mandado una cagada con el archivo de configuracion.

Bueno ahi lo tienen, facil no?

Monky, un pantallazo

Hola, hace cuanto que no escribo… estoy algo atareado construyendo a monky, un agregador de noticias open source que funciona bajo el framework cakePHP, comenzo siendo algo asi como un refactor de meneame, ahora si bien tomo algunas ideas de lo que escribio Ricardo Galli, podria decirse que no es meneame.

Les dejo un pantallazo para que vean como va el trabajo.

http://code.google.com/p/monky/

Saludos

Un componente y comportamiento para realizar bans

Hola, hoy revisando un poco mas el codigo de monky cree un Componente y un Behaviour para hacer bans.

El Componente puede informarnos;

  • si la ip del usuario esta baneada
  • si el proxy que usa el usuario esta baneado
  • si un mail dado esta baneado
  • si el nombre de una casilla (nombre@dominio.com) esta baneado
  • si el dominio de un mail esta baneado
  • si una direccion web esta baneada
  • si un texto tiene palabras baneadas

El Behaviour agrega metodos al modelo que se usaran para validar los datos ($validate);

  • si un mail dado esta baneado
  • si el nombre de una casilla (nombre@dominio.com) esta baneado
  • si el dominio de un mail esta baneado
  • si una direccion web esta baneada
  • si un texto tiene palabras baneadas

A continuacion dejo todo junto, incluyendo tests del componente!!

con un: Code Coverage: 98.51%.

http://code.google.com/p/ban-behaviour-component/downloads/list

el primer contratiempo en monky :(

Monky es un agregador de noticias que estoy escribiendo en base al meneame, y digo escribiendo ya que practicamente voy a tener que rehacer gran parte del codigo y de las bases de datos.

Por que? bien, principalmente las tablas de meneame hace uso del tipo de dato ENUM, hoy creando los fixtures para hacer test cases y asi alivianar el proceso de testeo me tope con que cakePHP 1.3 no soporta este tipo de datos para crear fixtures 😦
cakePHP solo soporta estos tipos de datos para mySQL;
http://book.cakephp.org/view/1002/Creating-Database-Tables#MySQL-1004

CakePHP doesn’t support enum datatypes because there’s no consistent implementation/support for it across various databases

Para solucionar esto se me ocurrio crear un model llamado Enum, que basicamente emula a un enum. Y asi eliminar el uso de enums en las tablas
sql:

CREATE TABLE `meneame3`.`enums` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;

Llenamos la tabla con los “enums”, ejemplo, insertamos;
1,in
2,out
3,ok
4,pendent
5,error

Luego agregamos al modelo el belongsTo hacia a el modelo enum, uno por cada enum que tenga.

Despues de descartar esta idea por que en vez de simplificar complicaba me encontre con esto;
http://www.irisoftonline.com/cakephp-testing-errors-database-table-not-found-enum-type-fields-ignored

Basicamente reescribimos los metodos que crea la base de datos y lo hacemos nosotros mismos;
ver archivo /cake/tests/lib/cake_test_fixture.php

Copio y pego el fixture y el test de los trackbacks;


trackback_fixture.php
<?php
/* Trackback Fixture generated on: 2010-07-13 17:07:48 : 1279053768 */
class TrackbackFixture extends CakeTestFixture {
var $name = 'Trackback';
function create(&$db) {
if (!isset($this->fields) || empty($this->fields)) {
return false;
}
return ($db->execute("
CREATE TABLE `test_suite_trackbacks` (
`trackback_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`trackback_link_id` int(11) NOT NULL DEFAULT '0',
`trackback_user_id` int(11) NOT NULL DEFAULT '0',
`trackback_type` enum('in','out') NOT NULL DEFAULT 'in',
`trackback_status` enum('ok','pendent','error') NOT NULL DEFAULT 'pendent',
`trackback_date` timestamp NULL DEFAULT NULL,
`trackback_ip_int` int(10) unsigned NOT NULL DEFAULT '0',
`trackback_link` varchar(250) NOT NULL,
`trackback_url` varchar(250) DEFAULT NULL,
`trackback_title` text,
`trackback_content` text,
PRIMARY KEY (`trackback_id`),
UNIQUE KEY `trackback_link_id_2` (`trackback_link_id`,`trackback_type`,`trackback_link`),
KEY `trackback_link_id` (`trackback_link_id`),
KEY `trackback_url` (`trackback_url`),
KEY `trackback_date` (`trackback_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
", array('log' => false)) !== false);
}
function drop(&$db) {
return ($db->execute("DROP TABLE `test_suite_trackbacks`", array('log' => false)) !== false);
}
}
?>


trackback.test.php
<?php
/* Trackback Test cases generated on: 2010-07-13 18:07:49 : 1279058389*/
App::import('Model', 'Trackback');
class TrackbackTestCase extends CakeTestCase {
var $fixtures = array('app.trackback');
function startTest() {
$this->Trackback =& ClassRegistry::init('Trackback');
}
function testFoo() {
sleep(25);
$this->assertEqual(1, 1);
}
function endTest() {
unset($this->Trackback);
ClassRegistry::flush();
}
}
?>

Eso es todo!,
Saludos

Proyecto Euler: problema 1

Hola, siguiendo el notable ejemplo de Aureliano, me voy a poner a resolver problemas del proyecto euler con la restriccion de publicar las soluciones solo en php.

A continuacion el problema nro 1;
Encontrar la suma de todos los numeros naturales multiplos de 3 o 5 y menores de 1000.
Ejemplo; si sumaramos todos los multiplos de 3 o 5 menores de 10 nos daria 23. 3+5+6+9

<?
$sum=0;
for($i=1;$i<1000;$i++){
	if((!($i%3))||(!($i%5))) {
		$sum+=$i;
	}
}
echo $sum."\n";
?>

Finalmente, la respuesta es; 233168

Saludos