Lessn: script para acortar URLs
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
Hace tiempo hice un script para PHP que permitía postear en WordPress usando Jabber (por ejemplo GTalk). Ahora he mejorado un poco el script para que admita poner categorías (si no las hay, las crea) y subir imágenes mediante una URL (ajustándolo a un ancho máximo).
Existen distintas palabras claves para separar los distintos elementos del post dentro del texto que se envía: titulo, contenido, tags, categorias e image. Las distintas secciones se separan con ‘##’ para diferenciarlas unas de otras y se separarán por dos puntos ‘:’ formando pares clave:valor. Un ejemplo para escribir en el IM sería el siguiente:
titulo:Titulo del post##contenido:Lorem Ipsum... con todo el HTML que querramos##tags:etiqueta1, etiqueta2, etiqueta3##categorías:Categoria1,Categoria2#image:http://servidor.com/ruta/imagen.png
El código principal es el siguiente:
$e";'), explode("\n", $contenido)));
}
if (isset($image)) {
$img_content = file_get_contents($image);
$im = imagecreatefromstring($img_content);
$w = imagesx($im);
$h = imagesy($im);
$imgtype = exif_imagetype($image);
if ($w > $max_width) {
$image_p = imagecreatetruecolor($max_width, intval($h*$max_width/$w));
imagecopyresampled($image_p, $im, 0, 0, 0, 0, $max_width, intval($h*$max_width/$w), $w, $h);
ob_start();
imagepng($image_p);
$img_content = ob_get_contents();
ob_end_clean();
$imgtype = IMAGETYPE_PNG;
$w = $max_width;
$h = intval($h*$max_width/$w);
}
$imgname = "img".time().image_type_to_extension($imgtype);
$f = new xmlrpcmsg('metaWeblog.newMediaObject',
array(php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('name'=>$imgname, 'bits'=>new xmlrpcval($img_content, 'base64'))))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if(!$r->faultCode()) {
$v=$r->value();
$datos = simplexml_load_string($v->serialize());
$url = $datos->xpath('//member/name[. ="url"]/following-sibling::*/string');
$contenido = '
'.$contenido;
} else {
return "Error a la hora de subir la imagen: $image [".$r->faultString()."]";
}
}
//$contenido .= mb_convert_encoding($contenido, 'UTF-8');
$f = new xmlrpcmsg('wp.getUsersBlogs',
array(php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if(!$r->faultCode()) {
$v=$r->value();
$datos = simplexml_load_string($v->serialize());
$blogid = $datos->xpath('//member/name[. ="blogid"]/following-sibling::*/string');
$blogid = is_array($blogid) ? (string) $blogid[0] : (string) $blogid;
$f = new xmlrpcmsg('metaWeblog.newPost',
array(php_xmlrpc_encode($blogid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('title'=>$titulo, 'description'=>$contenido, 'mt_keywords'=>$tags)), php_xmlrpc_encode(1))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->request_charset_encoding = 'UTF-8';
$c->setDebug(0);
$r=&$c->send($f);
if($r->faultCode()) {
return "Ha habido un error al intentar crear un nuevo post [".$r->faultString()."]";
} else {
$datos = simplexml_load_string($r->serialize());
$postid = $datos->xpath('//value/string');
$postid = is_array($postid) ? (string) $postid[0] : (string) $postid;
$f = new xmlrpcmsg('metaWeblog.getPost',
array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if($r->faultCode()) {
return "Ha habido un error al intentar recuperar información sobre el post insertado [".$r->faultString()."]";
} else {
$datos = simplexml_load_string($r->serialize());
$permalink = $datos->xpath('//member/name[. ="permaLink"]/following-sibling::*/string');
$permalink = is_array($permalink) ? (string) $permalink[0] : (string) $permalink;
$title = $datos->xpath('//member/name[. ="title"]/following-sibling::*/string');
$title = is_array($title) ? (string) $title[0] : (string) $title;
if (isset($categorias)) {
$f = new xmlrpcmsg('mt.getCategoryList',
array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if(!$r->faultCode()) {
$datos = simplexml_load_string($r->serialize());
$catsblog = $datos->xpath('//struct');
foreach(explode(',', $categorias) as $cat) {$cats[$cat] = null;}
foreach($catsblog as $cat) {
foreach($cats as $_cat=>$val) {
if (strtolower((string) $cat->member[1]->value->string) == strtolower($_cat)) {
$cats[$_cat] = (string) $cat->member[0]->value->string;
}
}
}
foreach($cats as $cat=>$val) {
if (!$val) {
$f = new xmlrpcmsg('wp.newCategory',
array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode(array('name'=>$cat, 'slug'=>str_replace(' ', '_', strtolower($cat)), 'parent_id'=>1, 'description'=>'')))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if(!$r->faultCode()) {
$datos = simplexml_load_string($r->serialize());
$catid = (string) $datos->xpath('//int');
$cats[$cat] = $catid;
} else {
return "Ha habido un error a la hora de crear la categoría $cat";
}
}
}
foreach($cats as $val) {
$catlist[] = array('categoryId'=>$val);
}
$f = new xmlrpcmsg('mt.setPostCategories',
array(php_xmlrpc_encode($postid), php_xmlrpc_encode($blog_usuario), php_xmlrpc_encode($blog_contraseña), php_xmlrpc_encode($catlist))
);
$c=new xmlrpc_client($blog_xmlrpc_path, $blog_url, $blog_puerto);
$c->setDebug(0);
$r=&$c->send($f);
if($r->faultCode()) {
return "Hubo un error a la hora de modificar las categorías del post";
}
} else {
return "Ha habido un error al intentar recuperar las categorias del blog";
}
}
return "Se ha publicado '$title': $permalink";
}
}
} else {
return "Ha habido un error al intentar recuperar información sobre el blog [".$r->faultString()."]";
}
}
//Use XMPPHP_Log::LEVEL_VERBOSE to get more logging for error reports
//If this doesn't work, are you running 64-bit PHP with < 5.2.6?
$conn = new XMPPHP_XMPPOld($jabber_host, $jabber_puerto, $jabber_usuario, $jabber_contraseña, 'xmpphp', $jabber_host, false,
XMPPHP_Log::LEVEL_ERROR);
$conn->autoSubscribe();
$conn->useEncryption(false);
try {
$conn->connect();
while(!$conn->isDisconnected()) {
$payloads = $conn->processUntil(array('message', 'presence', 'end_stream', 'session_start'));
foreach($payloads as $event) {
$pl = $event[1];
switch($event[0]) {
case 'message':
if (trim($pl['body']) == '') break;
$conn->message($pl['from'], $body=post($pl['body']), $type=$pl['type']);
if($pl['body'] == 'quit') $conn->disconnect();
if($pl['body'] == 'break') $conn->send("");
break;
case 'presence':
// print "Presence: {$pl['from']} [{$pl['show']}] {$pl['status']}\n";
break;
case 'session_start':
//print "Empezamos\n";
$conn->getRoster();
$conn->presence($status="Asonesss jefeeeeeee!");
break;
}
}
}
} catch(XMPPHP_Exception $e) {
echo 'ERROR:';
die($e->getMessage());
}
Podéis bajaros el código aquí.
Avanzando en el framework de Zend, hoy vamos a ver cómo crear documentos PDF. Quizás a muchos no les vaya a ser útil, pero un documento PDF es un formato bastante extendido.
De forma sencilla, ya que la librerÃa del framework es algo extensa, vamos a explicar que métodos son necesarios para crear un PDF.
Para cargar la librerÃa:
require_once 'Zend/Pdf.php';
Para crear un nuevo documento PDF:
$pdf = new Zend_Pdf();
Para crear una nueva página:
$pdf->pages[] = ($page = $pdf->newPage('A4'));
$pdf->pages[] = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4);
$pdf->pages[] = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);
Obtener ancho y alto de la página:
$ancho = $page->getWidth();
$alto = $page->getHeight();
Usar estilos:
$estilo = new Zend_Pdf_Style();
$estilo->setFillColor(new Zend_Pdf_Color_RGB(0, 0, 0));
$font = Zend_Pdf_Font::fontWithPath('/path/fuente.ttf');
$estilo->setFont($font, 10);
$estilo->setStyle($style);
Escribir texto:
$page->drawText("Hola Mundo", $x, $y);
Insertar imágenes:
$img = Zend_Pdf_ImageFactory::factory('sentidoweb.png');
$page->drawImage($img, $x, $y, $x+&ancho, $y+$alto);
Devolver la salida:
echo $pdf->render();
Eso sÃ, antes hay que tener en cuenta que tenemos que devolver al inicio del script el Content-Type:
header("Content-Type: application/pdf");
// Si queremos que se devuelva como un fichero adjunto
header("Content-Disposition: attachment; filename=\"prueba.pdf\"");
Si, se que parece muy resumido, pero otro dÃa habrá un ejemplo más completo, mejor ir paso a paso.
CodeIgniter, el framework de PHP y uno de los que personalmente más me gustan, ha sacado una nueva versión, lo que no tengo muy claro es cual, porque ellos indican en la noticia que es la 1.5.2, cuando ya hace tiempo salió la 1.5.4, por lo cual, viendo el código se puede ver que es la 1.6.0
// CI Version
define('CI_VERSION', '1.6.0');
Tampoco le hagáis mucho caso (por ahora) a lo que diga el changelog, ya que muestra el de la version 1.5.2, en el changelog del SVN se pueden ver los cambios realizados a esta última versión:
¿Para que crear un formulario de contacto en un theme si ya existe algún plugin que te lo hace todo y muy bien?. Fácil, porque cuando subes un theme a wordpress.org, no te deja meter plugins, y si lo quieres vender, no puedes meter mil instrucciones para instalarlo, lo lógico es que copie el theme y poco más.
El tutorial explica paso a paso cómo crear la página, hacer que WordPress la entienda, crear el formulario de contacto, validación por jQuery haciendo uso de un plugin y envío del email.
How to create a built-in contact form for your WordPress theme
Vía / DZone
Cuando tenemos nuestra página en mantenimiento y el motor de Google (Googlebot) u otro motor de búsqueda, se pasa por nuestra página para indexarla, no es correcto que obtenga una página no encontrada (404) o un error del servidor (500).
Según dicen en Google Webmaster Central lo correcto es mandar un código de red no disponible (503), pero el autor de este post recomienda también enviar un Retry-After para que vuelva a pasarse más tarde. También recomienda que a los motores de búsqueda se les envie a una página 503 y a los visitantes (menos a él) a una página 404 (página no encontrada).
Instruct Search Engines to come back to site after you finish working on it
Un gran tutorial que explica cómo crear documentos PDF con Haru, una librería realizada en C que nos permite generar PDFs con texto, líneas e imagenes, añadir enlaces y anotaciones, comprimir documentos, usar TTFs, PDFs encriptados, y muchas cosas más.
El tutorial empieza mostrándonos cómo instalar Haru en nuestro PHP, y luego sigue con una serie de ejemplo sencillos hasta decirnos como añadir shapes o proteger el documento.
Dynamically Generating PDF Files with PHP and Haru
Comments are closed.
Voy a parecer la mosca cojonera del blog, pero aún asÃ:
Se ha estado hablando mucho de los acortadores de URLs. No son buenos.
-aportan un nuevo punto de fallo
-ocultan la dirección final (no sé donde me estoy dirigiendo, podrÃa ser un sitio con fama de contener virus y otro software dañino)
en caso de que se den de baja ( http://tr.im ) lo intentó hace poco y armó una buena en la blogosfera obligándoles a rectificar
-resulta innecesario su uso en la mayorÃa de ocasiones y, como se indica en varios sitios, lo correcto es una de las siguientes dos opciones:
1) que cada sitio se gestione sus propias URLs cortas de forma que si el sitio se da de baja también se pierden las URLs cortas, pero al menos ya depende de un punto de fallo (la página en la que se publican).
2) que los sitios más importantes empiecen a ofrecer el servicio de URLs cortas como permalinks a los artÃculos. Si el script publicado aquà tiene esa finalidad, perfecto, ese serÃa el camino a seguir.
Estoy de acuerdo con alsanan, y añado otro argumento: el rendimiento. Una redirección extra significa más tiempo de espera y mayor carga para las conexiones y servidores. De hecho, la existencia de los acortadores sólo tiene sentido por cosas como Twitter –lo cual me parece una estupidez porque bien podÃa Twitter permitir poner enlaces sin ser necesario poner la URL en el texto del mensaje–, y de hecho yo ya he visto ejemplos donde se utilizan acortadores para ocultar el verdadero destino del enlace (publicitario).
No obstante, si se van a usar acortadores de URL, mejor que sean scripts conocidos y libres como el que presenta el post.
Un saludo.