GeSHI (Generic Syntax Highlighter) es un script PHP que resalta el código que indiquemos realizado en un total de más de 50 lenguajes de programación, entre los que se encuentran PHP, Java, HTML, CSS, C#, Javascript y SQL.
Inicialmente desarrollado para el sistema de foros phpBB, finalmente ha pasado a ser un proyecto independiente. Entre sus caracterÃsticas destaca la cantidad de lenguajes que admite, la facilidad de añadir un lenguaje nuevo y la facilidad para modificar la salida del script.
Lo que más me gusta de este script es que enlaza con las URLs de las funciones de los lenguajes. GeSHI
Interesante script que mediante cURL realiza un backup de nuestra web y lo inserta en un servidor FTP. No es el método más eficiente ni el más recomendable, pero si nos puede servir como ejemplo para realizar procesos similares o, por ejemplo, para crear sites de administración que necesiten realizar copias de seguridad.
El ejemplo es útil. Create custom backups from your website using cURL
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.
Un completísimo tutorial de la gente de IBM que nos muestra paso a paso cómo integrar en nuestras aplicaciones PHP los calendarios de eventos de Google Calendar.
Se nos va a indicar cómo realizar las siguientes funcionalidades, explicándonos también el API de Google Calendar:
Recuperar eventos de una lista pública
Añadir más eventos
Modificar o borrar eventos
Buscar eventos por palabra clave o rango de fechas
PHP-FPM (FastCGI Process Manager) es una alternativa a PHP FastCGI que incluye algunas características adicionales como:
Administración de procesos, pudiendo pararlos y arrancarlos
Posibilidad de empezar procesos con diferente uid, gid, chroot, entorno o php.ini
Logs
Reinicio de emergencia
Soporte para upload acelerado
Slowlog
fastcgi_finish_request(), una función especia que ternima la petición, envía los datos al cliente (flush) y continúa realizando otra función (codificación de vídeo, proceso de estadísticas, …)
Recuerda mucho a Javascript y frameworks tipo jQuery, para ello utiliza métodos encadenados y un objeto genérico:
// Define a new class
$animal = $class->new()
->def('init', function($t, $name) {
$t->name = $name;
})
->def('speak', function($t) {
echo "My name is $t->name\n";
});
// Extend a class
$dog = $animal->extend()
->def('speak', function($t) {
echo "My name is $t->name, I have just met you and I love you, SQUIRREL!\n";
})
->def('bark', function($t) {
echo "Woof!\n";
});
Para poder realizar esto se necesita crear la clase Obj:
class Obj {
public function __construct($methods=array()) {
$this->methods = $methods;
}
public function method($name) {
if (!isset($this->methods[$name]))
throw new BadMethodCallException();
return $this->methods[$name];
}
public function fn($name, $fn) {
$this->methods[$name] = $fn;
return $this;
}
public function __call($name, $args) {
return call_user_func_array(
$this->method($name),
array_merge(array($this), $args)
);
}
}
// Allow chaining method calls off the constructor..
function Obj($methods=array())
{
return new Obj($methods);
}