Sphinx es un buscador de texto bastante rápido y potente (pensado para bases de datos grandes), que permite ser integrado con otras bases de datos como MySQL.
Acaban de sacar la versión 0.9.8 después de 15 meses de trabajo (y justo después de que yo ayer me bajara la versión anterior y la instalara). Existen más de 70 nuevas características, de las cuales destacaría:
Soporte para libstemmer, permitiendo stemmers para nuevos lenguajes.
MySQL es una de las bases de datos más populares que hay dentro del desarrollo web. Hay gente que la defiende, y otros que no la tienen entre sus BD favoritas. Para aquellos que tengan que decidirse en la elección de MySQL como BD de su sistema, esta lista de pros y contras le puede ser de mucha utilidad.
Es barata: aunque pertenece a MySQL AB, MySQL es open source, que sea barata implica que al inicio del proyecto el gasto vaya a otras partes que puedan necesitarlo, en vez de gastar dinero en licencias.
Es flexible y escalable: dispone de muchos tipos de almacenamiento, pudiendo seleccionar el que más nos convenga, y os procedimientos almacenados nos permiten escalabilidad.
LibrerÃas nativas para lenguajes: ofrece librerÃas para lenguajes como PHP y Ruby.
Contras
Yo no estoy personalmente de acuerdo con todas ellas, pero quien escribe el artÃculo tiene sus razones para indicarlas y hay que tenerlas en cuenta.
Licencia GPL: en algunos entornos, la licencia BSD es más adecuada.
Falta de integración con entornos existentes: existen muchas circustancias en los que los DBA no tienen un entorno con el que tratar con MySQL.
Falta de madurez: en comparación con otras BDs como Oracle (que cumple 30 años), le falta madurez, lo que indica posicionamiento y estabilidad.
Falta de caracterÃsticas: hay caracterÃsticas importantes, que aunque a veces no son muy utilizadas, pueden acabar con un proyecto debido a la necesidad de uso.
Certificación: a muchas empresas les gusta la certificación, aunque ofrecer certificación, esta está muy lejos de parecerse a la de Oracle o MS-SQL Server.
Para mí, uno de los mayores fracasos de Twitter es su API, una limitación de su uso increíble para algo que le podría dar mucho juego a la aplicación. Ahora mismo no sé en cuánto está el límite, pero la posibilidad de realizar una aplicación basada en Twitter es una pesadilla.
Para aquellos que no quieran sufrir lo que hemos sufrido con TwitterPoster (los espacios en blanco es porque la gente actualiza su imagen y no podemos recuperar la de todos los usuarios por el límite en el API de Twitter), les recomiendo usar Twitter mediante CURL.
Os paso un script sencillito que he realizado:
<?php
// Primer hacemos login
$url ="https://twitter.com/sessions";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
// Por si tienen limitación por navegador
curl_setopt($ch, curlOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)");
// Poned una ruta para las cookies
curl_setopt ($ch, CURLOPT_COOKIEJAR, '/temp/');
curl_setopt ($ch, CURLOPT_COOKIEFILE, '/temp/');
curl_setopt ($ch, CURLOPT_POSTFIELDS, "username_or_email=[usuario]&password=[contraseña]");
// Para que funcione el https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, curlOPT_SSL_VERIFYHOST, 2);
curl_exec ($ch);
// Cargamos el home, porque Twitter añade dos campos ocultos para poder publicar por web
$url ="http://twitter.com/home";
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec ($ch);
// Recuperamos los campos ocultos
preg_match('//', $result, $match);
$authenticity_token = $match[1];
preg_match('//', $result, $match);
$siv = $match[1];
// Insertamos el texto
$res = $url ="http://twitter.com/status/update";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'siv='.$siv.'&authenticity_token='.$auth.'&status=[texto]');
curl_exec ($ch);
curl_close ($ch);
unset($ch);
?>
¿Qué fallo tiene este script? pues que si cambian el HTML (campos de formulario, …) o las URLs deja de funcionar, pero al menos no tenemos limitaciones. Eso sí, es más costoso para sus servidores y para los nuestros, porque en vez de hacer una llamada, hacemos 3, y en nuestro caso, a parte parseamos una página para obtener dos campos ocultos.
Muy buen tutorial que nos explica como combinar PHP y Flex usando el Zend Framework para crear aplicaciones más completas.
En el ejemplo usarán PHP (mediante el Zend Framework) para llevar la lógica de la aplicación, mientras que Flex se usará para la presentación. Se trata de leer los feeds de DevZone y añadir imágenes de Flickr para cada entrada. Lo primero será pasar el contenido de cada entrada por el Content Analyzer de Yahoo, el cual nos devolverá las palabras clave. Con estas etiquetas accederemos a Flickr y mostraremos la imágen.
Aunque en este caso se usa el Zend Framework, está claro que se puede hacer con otro framework o directamente desarrollando nosotros todo el código.
En Zend Developer Zone cada dÃa nos sorprenden con algo nuevo. Flex and PHP: Party in the Front, Business in the Back
Las tiendas online son uno de los productos más usados en desarrollo web, pero suele ser lo que más dolores de cabeza da debido al pago por tarjeta de crédito. Afortunadamente, Paypal ofrece la posibilidad de pagar mediante tarjeta de crédito. Para ello, Paypal dispone de una API NVP muy cómoda de usar.
Para los usuarios de Codeigniter existe una librería que nos facilita toda la tarea. En el controlador primero debemos indicar el SetExpressCheckout que prepara la transacción. Cuando aceptemos el OK de la llamada se redireccionará a Paypal para que el usuario pueda realizar la compra, que devolverá la llamada a una URL nuestra y en ese caso, cogiendo los datos devueltos por Paypal podremos confirmar la transacción:
define('PAYPAL_URL', 'https://www.sandbox.paypal.com/webscr&cmd=_express-checkout&token=');
class Demo extends Controller {
function Demo()
{
parent::Controller();
}
function index() {
$this->paypal_api_lib->add_nvp('RETURNURL', 'http://servidor/demo/ok');
$this->paypal_api_lib->add_nvp('CANCELURL', 'http://servidor/demo/cancel');
$this->paypal_api_lib->add_nvp('NOSHIPPING', '0');
$this->paypal_api_lib->add_nvp('ALLOWNOTE', '1');
$this->paypal_api_lib->add_nvp('SOLUTIONTYPE', 'Sole'); // esto es lo que no obliga a que se tenga que tener cuenta Paypal
$this->paypal_api_lib->add_nvp('LANDINGPAGE', 'Billing');
$this->paypal_api_lib->add_nvp('AMT', '69.00');
$this->paypal_api_lib->add_nvp('NOSHIPPING', '2');
$this->paypal_api_lib->add_nvp('HDRIMG', 'http://servidor/logo.gif');
$this->paypal_api_lib->add_nvp('CURRENCYCODE', 'EUR');
$this->paypal_api_lib->add_nvp('L_NAME0', 'Librito');
$this->paypal_api_lib->add_nvp('L_AMT0', '59.00');
$this->load->library('session');
$sesion = array('paypalAmount'=>'69.00');
$this->session->set_userdata($sesion);
if($this->paypal_api_lib->send_api_call('SetExpressCheckout')){
if (strtoupper($this->paypal_api_lib->nvp_data["ACK"]) =="SUCCESS") {
$token = urldecode($this->paypal_api_lib->nvp_data["TOKEN"]);
$payPalURL = PAYPAL_URL.$token;
header("Location: ".$payPalURL);
exit();
}
}
paypal_errors();
}
function ok() {
$this->load->library('session');
$this->paypal_api_lib->add_nvp('TOKEN', $_REQUEST['token']);
$this->paypal_api_lib->add_nvp('PAYERID', $_REQUEST['PayerID']);
$this->paypal_api_lib->add_nvp('PAYMENTACTION', 'Sale');
$this->paypal_api_lib->add_nvp('AMT', $this->session->userdata('paypalAmount'));
$this->paypal_api_lib->add_nvp('CURRENCYCODE', 'EUR');
$this->paypal_api_lib->add_nvp('IPADDRESS', $_SERVER['SERVER_NAME']);
if($this->paypal_api_lib->send_api_call('DoExpressCheckoutPayment')) {
var_dump($this->paypal_api_lib->nvp_data);
} else {
paypal_errors();
}
}
}
La gente de Amazon ha sacado una nueva SDK PHP para AWS que puede ser usada para acceder a los servicios que ofrece: Amazon Elastic Compute Cloud (EC2), the Amazon Simple Storage Service (S3), Amazon CloudFront, Amazon CloudWatch, Amazon SimpleDB, Amazon Simple Notification Service (SNS), Amazon Simple Queue Service (SQS) y Amazon Identify and Access Management (IAM).