phpOCR: reconocedor óptico de caracteres

phpOCR, como su nombre muy bien indica, se trata de una librería OCR para PHP.
Cierto tipo de aplicaciones necesitan leer texto de documentos que están guardados como imágenes, para poder pasar esa imagen a texto plano, es necesaria una aplicación OCR.
Esta clase ofrece una implementación básica de este tipo de herramientas, ya que sólo reconoce texto en imágenes monocromo. Debe ser entrenada para reconocer cada letra escrita en la imagen, pudiendo después reconocer texto de documentos escaneados una vez entrenada la aplicación.
phpOCR
Vía / WebDevLogs

| | |

CSSVista: editor CSS para Firefox e IE6

CSSVista es una aplicación desarrollada por la gente de SiteVista que nos permite editar CSS y ver los resultados que se producen directamente en IE6 y Firefox.
cssvista.png
Se trata de una aplicación gratuita, todavía en fase de desarrollo que nos puede ser de gran utilidad cuando maquetamos un diseño y queremos que se vea correctamente en ambos navegadores. Aunque yo prefiero usar un editor normal y refrescar el contenido en el navegador que esté probando en ese momento.
CSSVista
Vía / Lifehacker

|

HTML Purifier: filtro HTML en PHP

htmlpurifier.pngHTML Purifier es un filtro HTML para PHP que no solo elimina código XSS, sino que asegura que tus HTML cumplan los estándares.
A parte admite configurar el filtro con una serie de parámetros, pudiendo decir si se quiere que sea XHTML Strict o Transitional, HTML o XHTML, indicar el nivel de filtro.
HTML Purifier
Vía / dzone

links for 2007-06-22

XRegExp: ampliación de expresiones regulares en Javascript

XRegExp es una ampliación de Javascript para las expresiones regulares, las cuales en Javascript flaquean a la hora de los modificadores.
En este caso, añade los modificadores s y x, lo cual amplía el uso que podemos darle a las expresiones regulares. El modificador s permite que el punto “.”, que representa a cualquier carácter, represente también al salto de línea, el cual suele ignorar. El modificar x ignora los espacios en la expresión regular, y así poder crear unas expresiones regulares más legibles.
XRegExp
Vía / dzone

Laburo: buscador de empleo

Laburo es un buscador vertical especializado en el mercado laboral que pone a disposición del usuario la mayor base de datos de ofertas de empleo en habla hispana. Es un proyecto en el que he participado en su desarrollo, por lo que estoy bastante contento de poder presentarlo.
El proyecto ha sido desarrollado por Novoclick, una joven empresa respaldada por gente tan cualificada como José Luis Perdomo, fundador de Bitacoras.com
laburo1.png
Laburo está orientado a una audiencia muy definida, la de aquellos internautas en busca de empleo para abrirse camino en el terreno profesional o para mejorar sus condiciones laborales.
Laburo rastrea información y recopila ofertas de trabajo en sites especializados, foros de empleo, diarios electrónicos, anuncios clasificados, así como en otras muchas fuentes de información online, y remite al usuario a estas ofertas en la fuente original, derivando el tráfico, sirviendo de puente y conectando oferta y demanda. Porque ése es su principal objetivo: poner en contacto al aspirante con aquel que requiere de sus conocimientos y aptitudes.
laburo2.png
Los usuarios dispondrán de una página inicial en la que se muestran las últimas ofertas agrupadas por la fuente en la que se obtienen (Infojobs, Monster, …). Esta página es personalizable, pudiendo mover las cajas y seleccionar que fuente se muestra en cada caja.
El proyecto está realizado en LAMP, habiendo sido desarrollado completamente, sin necesidad de un CMS. En la fase inicial del proyecto participó Daniel Mota, al cual me gustaría reconocer su trabajo y felicitarle por ello, ha sido un placer trabajar laburear con él.
Laburo

links for 2007-06-21

|

Laboratorio: triggers y procedimientos almacenados en MySQL

Unas opciones no muy usadas cuando se trabaja con MySQL son los triggers y los procedimientos almacenados (stored procedures), supongo que a que es algo nuevo en MySQL y la gente no está acostumbrada a estas dos funcionalidades.

Vamos a mostrar un ejemplo de uso de triggers y procedimientos almacenados paso a paso. Quizás el ejemplo no sea el más correcto, o simplemente sea poco útil, pero lo importante es el uso en sí, no el ejemplo.

Nuestro sistema tendrá dos tablas, una con ventas y la otra con comisiones. En la primera se almacenarán cada venta que se realiza en un comercio, y en la segunda las comisiones que le corresponden a cada vendedor en el momento.

CREATE TABLE `ventas` (
`vendedor` int(11),
`producto` int(11),
`importe` float
)
CREATE TABLE `comisiones` (
`vendedor` int(11),
`comision` float
)

Las comisiones se calcula de una forma especial, le corresponde un porcentaje de las ventas según el tipo de producto, y es importante para los vendedores el que se sepa en cada momento qué comisiones lleva ganadas (esto es una justificación para no usar un cron o algo parecido).

Para calcular qué comisión le corresponde a un vendedor, calcularemos los porcentajes para cada tipo de producto vendido y luego lo añadiremos/actualizaremos en la tabla de comisiones. Todo se realizará en un procedimiento almacenado.

DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_comisiones`$$
CREATE PROCEDURE `test`.`sp_comisiones` (IN mivendedor INT)
BEGIN
DECLARE micomision INT DEFAULT 0;
DECLARE suma INT;
DECLARE existe BOOL;
select IFNULL(sum(importe),0) into suma from ventas where producto = 1 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.15);
select IFNULL(sum(importe),0) into suma from ventas where producto = 2 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.1);
select IFNULL(sum(importe),0) into suma from ventas where producto = 3 and vendedor = mivendedor;
SET micomision = micomision + (suma * 0.2);
select count(1)>0 into existe from comisiones where vendedor = mivendedor;
if existe then
UPDATE comisiones set comision = comision+micomision where vendedor = mivendedor;
else
insert into comisiones (vendedor, comision) values (mivendedor, micomision);
end if;
END$$
DELIMITER ;

Ahora, para actualizar los datos de las comisiones usaremos un trigguer, así cuando se haga una venta (insert en la tabla ventas), se llamará al procedimiento almacenado (sp_comisiones), que recalculará la comisión para ese vendedor.

DELIMITER $$
DROP TRIGGER `test`.`tr_ventas_insert`$$
CREATE TRIGGER `test`.`tr_ventas_insert` AFTER INSERT on `test`.`ventas`
FOR EACH ROW BEGIN
call sp_comisiones(new.vendedor);
END$$
DELIMITER ;