• Comentarios

    • Miguel Andre: Me parece muy buena forma, porque el formato de fechas sólo he visto en versión inglés en php
    • Maryan Ana: Hasta los momentos no he podido crear una asistencia remota, siempre me da problema con algo, no se si un...
    • webpositer: Thank you, I’ve recently been looking for info about this topic for ages and yours is the greatest...
    • Shed Designs: Thinking about creating a shed? we have a lot of plans!

Clase en PHP para manipular archivos

[Actualización sab 27 marzo 2010]

* modifiqué la función create_thumbs_all para no generar thumbs de los thumbs si el directorio es el mismo
* modifiqué parcialmente la función file_to_numeric para ignorar los thumbs de archivos numericos que daban TRUE en el preg_match

*agregue el parámetro $sust a la funcion create_thumbs_all para poder o no, trabajar directamente con las originales

Bueno, he estado trabajando mucho con archivos y directorios, más específicamente listando, creando thumbnails y cosas así, decidí crear esta clase bastante simple para poder hacerlo, sé que a muchos les servirá. Se las dejo para que la chequen. Le agregué la clase SimpleImage.php para resize de imagenes así que también tiene eso.

Por el momento no podré explicar como funciona, para aquellos que inician en PHP, por que estoy de salida, pero lo haré pronto. Para los que ya están bastante empezados será sencillo entender como funciona hehe…

/*
fileSys.php (BETA)
by vrS
*/
class fileSys{
function listaDir($path=false,$tipo=false,$clean=false){
if(!$path)
return;
$dir=dir($path);
if(!$tipo)
return;

switch ($tipo)
{
case 'img':
$tipos=array('jpg','gif','jpeg','png');
break;
case 'video':
$tipos=array('flv');
break;
case 'php':
$tipos=array('php');
break;
case 'txt':
$tipos=array('txt');
break;
case 'doc':
$tipos=array('doc');
break;
default:
exit("Tipo de archivo NO VÁLIDO");
break;
}

while ($file = $dir->read())
{
$f=$this->sacaExtension($file,$path,$clean);
if($file!='.' && $file!='..' && in_array($f[0][ext],$tipos))
{
$files[]=$f[0];
}
}
$dir->close();
return $files=(!count($files))?"No hay nada que listar con la extension '$tipo'":$files;

}

function sacaExtension($str,$path=false,$clean=false) {

if($clean)
{
if($path){
$str=$this->cleanName($str,$path);
//$dir=$path."/".$str;
}
else
return "Error sacando extension, verifica el directorio";
}
if(!file_exists($dir=$path."/".$str))
exit("Error sacando extension: No se encontro el archivo $dir");
$file=explode('.',$str);
$ext=strtolower(trim(array_pop($file)));
$name=trim($file[0]);
$f[]=array
(
'ext'=>$ext,
'name'=>$name,
'fullname'=>$str,
'path'=>$path,
'pathname'=>$dir
);
return $f;

}

function cleanName($str,$dir='.'){
if($str=='.'||$str=='..')
return;
$path=$dir."/".$str;
$tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ ´`^";
$replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn____";
$nvo=strtolower(strtr($str,$tofind,$replac));
if(!is_dir($path)&&!file_exists($dir."/".$nvo)){
if(@copy($path,$dir."/".$nvo))
unlink($path);
else
exit("Error Limpiando Los nombres de los archivos");
}

return $nvo;
}

function file_to_numeric($ruta=false,$tipo='img',$chkthumbs=false){
if(!$ruta || !is_dir($ruta))
return "Parametros insuficientes";
$files=$this->listaDir($ruta,$tipo);
$c=0;
foreach ($files as $file)
{

if($chkthumbs)
{
if(!preg_match('/^[0-9]+$/',$file[name])&&!preg_match('/^.+t$/',$file[name]))
{
while(file_exists($ruta."/".++$c.".".$file[ext]));
$nuevoname=$ruta."/".$c.".".$file[ext];
if(!@rename($file[pathname],$nuevoname));
echo "Error renombrando $file[pathname]<br/>";
}
}else
{
if(!preg_match('/^[0-9]+$/',$file[name]))
{
while(file_exists($ruta."/".++$c.".".$file[ext]));
$nuevoname=$ruta."/".$c.".".$file[ext];
if(!@rename($file[pathname],$nuevoname));
echo "Error renombrando $file[pathname]<br/>";
}
}
}

}
function create_thumbs_all($path='.',$dest='thumbs',$size=50,$sust=false){
if(!file_exists($path."/".$dest))
if(!@mkdir($path."/".$dest,0775))
exit("Hubo un error creando thumbs en $path verifica los permisos del directorio");

$files=$this->listaDir($path,'img');
foreach ($files as $file){

if(!file_exists($new=$path."/".$dest."/".$file[name]."t.".$file[ext])&&$dest!='')
{

$this->load($file[pathname]);
$this->resizeToWidth($size);
$this->save($new);

}elseif($dest==''&&!preg_match('/^.+t$/',$file[name]))
{
$this->load($file[pathname]);
$this->resizeToWidth($size);
if($sust)
$this->output($file[pathname]);
else
$this->save($new);

}
}

}

/* Comienza porción de código tomado de SimpleImage
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
*/
var $image;
var $image_type;

function load($filename) {
$image_info = getimagesize($filename);
$this->image_type = $image_info[2];
if( $this->image_type == IMAGETYPE_JPEG ) {
$this->image = imagecreatefromjpeg($filename);
} elseif( $this->image_type == IMAGETYPE_GIF ) {
$this->image = imagecreatefromgif($filename);
} elseif( $this->image_type == IMAGETYPE_PNG ) {
$this->image = imagecreatefrompng($filename);
}
}
function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image,$filename,$compression);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image,$filename);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image,$filename);
}
if( $permissions != null) {
chmod($filename,$permissions);
}
}
function output($image_type=IMAGETYPE_JPEG) {
if( $image_type == IMAGETYPE_JPEG ) {
imagejpeg($this->image);
} elseif( $image_type == IMAGETYPE_GIF ) {
imagegif($this->image);
} elseif( $image_type == IMAGETYPE_PNG ) {
imagepng($this->image);
}
}
function getWidth() {
return imagesx($this->image);
}
function getHeight() {
return imagesy($this->image);
}
function resizeToHeight($height) {
$ratio = $height / $this->getHeight();
$width = $this->getWidth() * $ratio;
$this->resize($width,$height);
}
function resizeToWidth($width) {
$ratio = $width / $this->getWidth();
$height = $this->getheight() * $ratio;
$this->resize($width,$height);
}
function scale($scale) {
$width = $this->getWidth() * $scale/100;
$height = $this->getheight() * $scale/100;
$this->resize($width,$height);
}
function resize($width,$height) {
$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
$this->image = $new_image;
}

}

Si lo mejoran, agradecería que lo rolaran x)

Listar contenido semanalmente con PHP

Bueno, ayer un cuate me comentó que quería mostrar los videos de la semana, y lo 1ro que se me ocurrió es hacer estas funciones… Todavía no sé si es la mejor forma, pero esta fue mi idea inicial… les comentaré luego si la mejoré, por lo pronto las dejo. A alguien le puede servir la lógica o por qué no, criticarla y mejorarla :)

#acentos omitidos en comentarios intencionalmente
#Separe las funciones para que sea mas entendible
#La siguiente funcion contiene los dias de la semana, la semana comienza el lunes. Retorna la posicion del dia que recibe
function dias_semana($dia){
	$dias=array(
	1=>'lunes',
	2=>'martes',
	3=>'mi&eacute;rcoles',
	4=>'jueves',
	5=>'viernes',
	6=>'s&aacute;bado',
	7=>'domingo'
	);
	$s=array_search($dia,$dias);
	return $s;
}

#funcion para pasar a español la fecha
function mifecha($cadena){
	$diasEs=Array("lunes","martes","mi&eacute;rcoles","jueves","viernes","s&aacute;bado","domingo");
	$mesesEs=Array("enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre");
	$diasEn=Array("Monday","Tuesday","Wednesday","Thursday","Friday", "Saturday","Sunday");
	$mesesEn=Array("January", "February", "March", "April", "May", "June","July","August", "September", "October", "November", "December");
	$horasEn=Array("th", "st", "nd", "rd");
	$horasEs=array("","","");
	return	str_replace($horasEn,$horasEs,str_replace($mesesEn,$mesesEs,str_replace($diasEn,$diasEs,$cadena)));

}

#Esta funcion listara hara las consultas semanalmente...
function videos_semanales(){
 	$dias_menos=dias_semana(mifecha(date('l')))-1; //obtenemos cuantos dias restaremos a partir del dia actual para saber que dia es "lunes"
//Hacemos un loop para hacer las consultas
 	for($i=0;$i<7;$i++){
               $dia_semana=date('Y-'.date('j',mktime(0, 0, 0, date("m")  , (date("d")-$dias_menos)+$i, date("Y"))).'-m'); //esto genera un formato parecido a este: "2010-22-03"
 		echo "select * from videos where fecha='".$dia_semana."'"; //Simulo la consulta...
 		echo "<br/>";

 	}
 }

Y listo, solo basta con llamar a la función de la siguiente manera

videos_semanales();

este ejemplo imprime únicamente algo como esto..
select * from videos where fecha='2010-22-03'
select * from videos where fecha='2010-23-03'
select * from videos where fecha='2010-24-03'
select * from videos where fecha='2010-25-03'
select * from videos where fecha='2010-26-03'
select * from videos where fecha='2010-27-03'
select * from videos where fecha='2010-28-03'

Herramientas, técnicas y otras cosas saltar firewalls

Me topé con este “manual” de “howto_bypass_internet_censorship” muy bueno

http://nautopia.coolfreepages.com/libertades_civiles/howto_bypass_internet_censorship.htm

Array Unique de numeros aleatorios con PHP

/**
 * Función que permite obtener un array unique de numeros aleatorios
 *
 * @param int $de
 * @param int $max
 * @param int $cuantos
 * @return array unique
 */
function rand_pos($de=0,$max=0,$cuantos=false)
	{
		$i=0;
		$rand_nums=array();
		$de=(!preg_match('/^[0-9]+$/',$de)||$de>$max)?0:$de;
		$max=(!preg_match('/^[0-9]+$/',$max))?0:$max;
		$cuantos=($cuantos&&!preg_match('/^[0-9]+$/',$cuantos))?1:$cuantos;

		while($i<=$max)
		{
			while(in_array($rand=rand($de,$max),$rand_nums));
			$rand_nums[]=$rand;
			if($cuantos&&$i == $cuantos-1)
				return $rand_nums;
			$i++;
		}
		return $rand_nums;
	}

Bueno para un trabajo que hacía, requería mostrar cierto numero de registros de una tabla de manera aleatoria y pues bueno, hice esa función que es simple pero funcional.

Ejemplo con Base de datos:

$q=mysql_query("select autor,nombre_blog from blog_tb where blog_activo=1");
while($r=mysql_fetch_object($q))
{
        $row[]=array
         (
                 'autor'=>$r->autor,
                 'blog'=>$r->nombre_blog
         );
}
//supongamos que obtenemos 50 registros como resultado de esa consulta pero quiero mostrar sólo 5...

//tamaño del array con los datos
$num_regs=count($row)-1; 

/*
Llamamos a la funcion para que regrese el array con posiciones aleatorias dentro del rango que le mandamos en los primeros 2 parámetros
Nota: Se puede definir un numero, en el primer parámetro enviado, del cual queremos que parta el random. Si el valor es mayor que el segundo parámetro o no es valor entero, el primero será 0 (cero)
*/

$posiciones=rand_pos(0,$num_regs,5); //llamada a la funcion

//una vez obtenido el array con las posiciones aleatorias, lo recorremos...
foreach($posiciones as $i)
{
	echo "Nombre del blog: ".$row[$i][blog]."<br/>";
      echo "Autor: <i>".$row[$i][autor]."</i><hr>";

}

No sé si es el mejor método para hacer esto, pero en este momento fue lo que se me ocurrió y quise postearlo. Tal vez a alguien le sirva.

JSONP(mootools) + Youtube

Una de las “modas” actualmente es el uso de XHR para dejar todo del lado del cliente, lo que facilita entre otras cosas el envio de peticiones y recepción de respuestas en el formato que mejor nos parezca. Como algunos saben. Ya hace algún tiempo que ando metido en mootools y bueno, si no soy un programador veterano de mootools, he aprendido a usar, extender y exprimir cada funcionalidad de este maravilloso framework.

El siguiente ejemplo que hice muestra la manera de obtener información de un video directamente de youtube usando XHR mediante JSONP en mootools

 


NOTA: En el ejemplo no funcionan correctamente el boton “siguiente” pero sólo por el uso de mooshell. Prueben el codigo en su local y funcionará bien.

How-to:Eliminar espacios en nombres de archivos de un directorio (linux)

Este bash script sirve para eliminar los espacios en los nombres todos los archivos de un directorio

#!/bin/sh
#ftrim by vrS
find . -name '* *' | sort | while read FILE
do
NEWFILE=`echo ${FILE} | sed 's/ /_/g;'`
mv "${FILE}" ${NEWFILE}
echo ${NEWFILE}
done

Instalación
El proceso para “instalarlo” es el mismo que el de avi2dvd

Uso
Usando la consola, ubíquense en el directorio en el cual quieren eliminar los espacios de sus archivos y ejecuten el script
bash~$ ftrim