Correr una aplicación sin privilegios

¡Hola gente!

Yo generalmente corro todo el software en mi linux como root. No es porque sea re heavy re jodido, sino porque prefiero perder toda la información en mi computadora antes que escribir mi contraseña 300 veces por día. Además, lo único “de valor” que hay en mi computadora es mi información personal y correr como un usuario sin privilegios no protege eso.

De todas maneras hay aplicaciones que no son seguras para correr como root. Si alguien hackea una computadora, es muy probable que lo haga a través de algo como un servidor apache, una aplicación que esta siendo ejecutada por este, o por un browser.

Creé un script que ejecuta el comando que le damos como un usuario de menor rango – una especie de opuesto de sudo -, de manera que podemos ejecutar nuestro browser como otro usuario haciendo algo tan simple como

# lower chromium-browser

El código fuente y la documentación la pueden encontrar en el foro de puppy linux.

Un abrazo grande,
Pedro

Obtener URL con PHP

¡Hola gente!

Hace muy poco, me encontré con una situación en la que tenía que obtener la URL desde la que se estaba ejecutando el script. El siguiente código obtiene, tal como el original, además de la url, los parámetros GET. La diferencia con éste es que nos permite eliminar uno o varios parámetros GET.

function getCurrentUrl($exceptions) {
	/*
	 * @param array $exceptions an array containing the string keys of get to be skipped
	 */
		$pageURL = 'http';
		if ($_SERVER ["HTTPS"] == "on") {
			$pageURL .= "s";
		}
		$pageURL .= "://";
		if ($_SERVER ["SERVER_PORT"] != "80") {
			$pageURL .= $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . $_SERVER ["REQUEST_URI"];
		} else {
			$pageURL .= $_SERVER ["SERVER_NAME"] . $_SERVER ["REQUEST_URI"];
		}
		
		foreach($exceptions as $e) {
			$e = preg_quote($e);
			$pageURL = preg_replace('/(?<=(&|\?))'.$e.'=.*?(&|$)/', "", $pageURL);
		}
		
		return $pageURL;
	}

¡Espero que les sea de utilidad!

Un saludo,
Pedro

Capturar la parte final de una URL

¡Hola gente!

Quería compartir esta expresión regular, que me sirvió para obtener la parte final de una url, independientemente de si es https://droope.wordpress.com o google.com o lo que sea, siempre obtiene solo el sector final ( “droope.wordpress.com”, “google.com”).

$regex = '/(?:http:\/\/)?(?:www\.)?([\w\d]+\.[\w]+(\.[\w]+)?)/';

También creé una función que lo hace toda la matemática por nosotros:

function valid_url_get($url) {
	
	if(preg_match('/(?:http:\/\/)?(?:www\.)?([\w\d\-]+\.[\w]+(\.[\w]+)?)/i', $url, $matches)) {
		return $matches[1];
	} else {
		return false;
	}
	
}

Retorna false si no es válida. En caso contrario, retorna el sector final de la url ;)

Un saludo,
Pedro

Utilizar grep recursivamente

¡Hola Amigos!

En alguna ocasión sintieron un profundo deseo de buscar una cadena de texto a través de todos los archivos de un directorio.

Yo se que si.

A continuación, el código que satisface ese deseo:

grep -nHR "cadena a buscar" ./directorio

Fácil, ¿Eh? :P

Un abrazo grande,
Pedro

Devolver el número de fila en una consulta SQL

¡Hola amigos!

Para aquellos que estén buscando lo que promete el título, la consulta es

select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000

Para los demás, dejo una consulta muy sencilla, que sirve para obtener el lugar que ocuparía una fila en determinada consulta ( es útil para redirigir a un usuario, luego de un evento exitoso, al lugar en el que estaba, en lugar de la página uno. Obteniendo el resultado que nos da esta consulta, y dividiendolo por el número de elementos que mostramos por página, obtendremos el número de página )

SET @rownum = 0;
SELECT row FROM (select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000) result WHERE result.gid = 3675

:)

Un saludo,
Pedro

Slugify: Creación de slugs

¡Hola amigos!

Hasta hoy, al momento de crear strings, me encontraba utilizando str_replaces y un montón de cosas mas, cosas que siempre me llevaban a urls amigables un tanto feas.

Hoy busqué y encontré una función que permite crear slugs fácilmente, y que además convierte letras del tipo ‘á’ a ‘a’.

Sin mas, el código:

function slugify($text, $encoding = "utf-8") {

   $text = preg_replace ( '~[^\\pL\d]+~u', '-', $text );

   $text = trim ( $text, '-' );

   if (function_exists ( 'iconv' )) {
       $text = iconv ( $encoding, 'us-ascii//TRANSLIT', $text );
   }

   $text = strtolower ( $text );

   // remove unwanted characters
   $text = preg_replace ( '~[^-\w]+~', '', $text );

   if(empty($text)) {
       return false;
   }

   return $text;

}

¡Espero que les sea de utilidad!

Un saludo,
Pedro

Función para generar RSS

¡Hola gente!

Los RSS son de gran utilidad para compartir información sobre nuestro sitio. El otro día me encontré en una situación en la que necesité generar uno dinámicamente. Busqué en google por el tema, pero no encontré nada… asique decidí compartir esto con ustedes.

/*
 * generates a rss feed. If an item has a key, it will be considered a tag like <$key>$value</$key>. 
 * Otherwise, $value will be placed straight in the rss
 * @author droope <pedro@worcel.com>
 * @param string $encoding the rss' encoding
 * @param array $channelProperties an array such as array('title' => 'Our cool RSS', 'link' => $site_url) 
 * @param array $items an array of arrays containing items and their properties. array(array('title' => 'Why we rule', '<enclosure url="logo.gif" type="image">'), array('title' => 'Lorem ipsum is simply dummy!'));
 * @param bool $output if set to true, headers will be set and rss will be ouptutted to the screen. Otherwise, output will be returned
*/
function rss_generate($encoding, $channelProperties, $items, $output = true) {
	
	$rss_url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	
	if($output) {
		header("Content-type: text/xml; charset=utf-8");
	}
	$output = '<?xml version="1.0" encoding="'.$encoding.'" ?>
	<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	
	<channel>
	<atom:link href="'.$rss_url.'" rel="self" type="application/rss+xml" />
	';
	foreach($channelProperties as $property => $value) {
		if(!empty($property)) {
			preg_match("/^([\w:]+)(?:\s)?/", $property, $match);
			$closeTag = $match[1];
			$output .= "<$property>$value</$closeTag>";
		} else {
			$output .= $value;
		}
	}
	foreach($items as $item) {
		$output .= "<item>";
		foreach($item as $property => $value) {
			if(!empty($property)) {
				preg_match("/^([\w:]+)(?:\s)?/", $property, $match);
				$closeTag = $match[1];
				$output .= "<$property>$value</$closeTag>
				";
			} else {
				$output .= $value . "
				";
			}
		}
		$output .= "</item>";
	}
	$output .= "</channel></rss>";
	
	if($output) {
		echo $output;
	} else {
		return $output;
	}
	
}

Los RSS generados validan y cumplen todas las recomendaciones de el validador oficial de RSS. Este código ha sido testeado en +-70 sitios y funciona bien. En caso de que encuentre alguna anomalía, recordaré actualizar el código posteado aqui.

¡Espero que sea de utilidad! Feliz generación de RSS con php :D

Un saludo,
Pedro