Jun
30
2010
0

Torpedos, chuletas y cheat-sheets para el desarrollador web cojonudo, bacancito y cool.
Escrito por NomikOS el 30/Jun/2010 | 211 visitas

Aquí hay una buena muestra de las materias que debes conocer como desarrollador web. Imprímelas y pégalas en la puerta del baño, de manera que puedas estudiarlas mientras meditas en la levedad del ser. Ni se te ocurra linkear directamente a estas imágenes porque ando escaso de ancho de banda. Asi que si pasas por aquí de visita por favor entra sin comida ni mascotas –a menos que sean gatos. Cada una tiene una referencia para dar crédito a quien se lo merezca.


Expresiones regulares

http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/

(more…)

Jun
09
2010
0

phpMyAdmin – Mostrar todos los registros y otras configuraciones ocultas.
Escrito por NomikOS el 09/Jun/2010 | 221 visitas

phpmyadmin es muy mezquino al momento de listar registros de tablas, por defecto muestra sólo de a 30. Hay una manera de mostrar todos los registros apretando un botón.

En el archivo de configuración de phpmyadmin config.inc.php puedes agregar este valor:

1
$cfg['ShowAll'] = true;

Ahora tienes el botón [Show all] o [Mostrar todo]:

Puedes usarlo con confianza con hasta 3000 registros (dependiendo de la cantidad de columnas) –con demasiados puedes quedarte esperando eternamente.

Otros valores interesantes:

1
2
3
4
5
6
# Máximo de registros al listar tablas
$cfg['MaxRows'] = 300;
# Guardar en un log todas las consultas hechas
$cfg['QueryHistoryDB'] = TRUE;
# Si usas lo anterior conviene limitar el largo del log
$cfg['QueryHistoryMax'] = 100;

Estos y otros valores por defecto están definidos en libraries/config.default.php. Para cambiarlos copialos a config.inc.php.

Y dónde está config.inc.php?:

Sí los has instalado automáticamente, como por ejemplo con apt-get:

1
$ find /etc -name config.inc.php

Si no, busca donde lo instalaste (¬_¬), debiera estar en el directorio raíz de phpmyadmin. Si sólo encuentras config.sample.inc.php, cópialo a config.inc.php y ponle bueno.

Más info en http://wiki.phpmyadmin.net/pma/Config

Written by NomikOS in: Herramientas para programación web,PHP |
Jun
02
2010
0

Función PHP para obtener IP del cliente.
Escrito por NomikOS el 02/Jun/2010 | 132 visitas

Obtener la dirección IP del cliente sirve para muchas cosas, por ejemplo para guardarla en logs de acceso.

1
2
3
4
5
function getIp()
{
  $hostip = @gethostbyname($_SERVER['REMOTE_ADDR']);
  return long2ip(ip2long($hostip));
}

Pero también es muy útil para realizar depuración remota:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# anotar mi IP
$ip = 'xxx.xxx.xxx.xxx';

# si no estoy en localhost
if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1')
# comparar con mi IP
if ($this->getIp() != $ip)
{
    # si no coincide matar ejecucuón
    die('x_x morí en la línea ' . __line__ . ' del archivo ' . __file__);
 
    # o más grácilmente
    return;
}

Como obtener IP propia

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# en linux
$ ifconfig
eth1     Link encap:Ethernet  HWaddr e0:cb:4e:d4:e0:10  
          # aqui está
          inet addr:xxx.xxx.xxx.xxx  Bcast:190.100.123.255  Mask:x.x.x.x
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/xx Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:809347 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25086 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:75990540 (75.9 MB)  TX bytes:2637607 (2.6 MB)
          Interrupt:27 Base address:0x2000
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:25 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2411 (2.4 KB)  TX bytes:2411 (2.4 KB)
1
2
3
4
5
# En MS-Windows usar línea de comando
ipconfig

# O usar algún sitio web como
http://www.ip-adress.com/
Written by NomikOS in: PHP |
Jun
02
2010
0

Función PHP para depurar.
Escrito por NomikOS el 02/Jun/2010 | 95 visitas

Tal vez haya una mejor manera, pero este método lo uso hace mucho tiempo.

1
2
3
4
5
6
function d($var, $exit = 0)
{
    echo '<pre>' . var_export($var, 1) . '</pre>';
    if ($exit)
        exit;
}

Y dices:

1
2
3
4
5
6
7
8
9
# la puedes aplicar sobre cualquier tipo de variable:
# enteros, cadenas, objetos, etc...
d($objeto);

# resultado de ejemplo:
stdClass::__set_state(array(
   'user_login' => 'admin',
   'user_email' => 'direccion@email.com',
))

Más adelante me gustaría referirme a firephp que usa la consola de mensajes de firebug. La ventaja que tiene es no interrumpir el flujo del script, especialmente en depuración remota y en sitios online pero yo le veo un par de desventajas cruciales… Para depuración de verdad: xdebug

Written by NomikOS in: PHP |
May
31
2010
0

MOC – music on console. Edición de playlist.
Escrito por NomikOS el 31/May/2010 | 120 visitas

PHP tiene una sintaxis basada en C. Así que si sabes PHP no debiera costarte mucho leer código C estructurado (C++es orientado a objetos y es muy diferente) Así que estudiando el playlist_file.c sabemos como moc lee y escribe sus playlists en formato m3u.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
...
/* Save plist in m3u format. Strip pathes by strip_path bytes.
 * If save_serial is not 0, the playlist serial is saved in a
 * comment. */

static int plist_save_m3u (struct plist *plist,
                           const char *fname,
                           const int strip_path,
                           const int save_serial)
{
   FILE *file;
   int i;

   debug ("Saving playlist to '%s'", fname);

   if (!(file = fopen(fname, "w"))) {
      error ("Can't save playlist: %s", strerror(errno));
      return 0;
   }

   if (flock(fileno(file), LOCK_EX) == -1)
      logit ("Can't flock() the playlist file: %s", strerror(errno));

   if (fprintf(file, "#EXTM3U\r\n") < 0) {
      error ("Error writing playlist: %s", strerror(errno));
      fclose (file);
      return 0;
   }

   if (save_serial && fprintf(file, "#MOCSERIAL: %d\r\n",
            plist_get_serial(plist)) < 0) {
      error ("Error writing playlist: %s", strerror(errno));
      fclose (file);
      return 0;
   }

   for (i = 0; i < plist->num; i++)
      if (!plist_deleted(plist, i)) {
         int ret;

         /* EXTM3U */
         if (plist->items[i].tags)
            ret = fprintf (file, "#EXTINF:%d,%s\r\n",
                  plist->items[i].tags->time,
                  plist->items[i].title_tags ?
                  plist->items[i].title_tags
                  : plist->items[i].title_file);
         else
            ret = fprintf (file, "#EXTINF:%d,%s\r\n", 0,
                  plist->items[i].title_file);

         if (ret < 0) {
            error ("Error writing playlist: %s",
                  strerror(errno));
            fclose (file);
            return 0;
         }

         /* file */
         if (fprintf(file, "%s\r\n", plist->items[i].file
                  + strip_path) < 0) {
            error ("Error writing playlist: %s",
                  strerror(errno));
            fclose (file);
            return 0;
         }
      }

   if (flock(fileno(file), LOCK_UN) == -1)
      logit ("Can't flock() (unlock) the playlist file: %s",
            strerror(errno));

   if (fclose(file)) {
      error ("Error writing playlist: %s", strerror(errno));
      return 0;
   }

   return 1;
}
...

Básicamente:

1
2
3
4
# La línea 42 escribe duración (radios online: -1) y título:
fprintf (file, "#EXTINF: %d, %s", time, tags ? tags : title);
# La línea 59 escribe nombre archivo
fprintf (file, "%s", file);

Ejemplo:
archivo: ~/.moc/playlist.m3u

/**

#EXTM3U
#MOCSERIAL: 512
#EXTINF:-1,Groove Salad (Soma FM)
http://streamer-mtc-aa01.somafm.com:80/stream/1018
#EXTINF:258,Groove Armada - groove is on (Love Box)
/home/nomikos/Music/Groove Armada - Love Box/groove_is_on.mp3

**/

Written by NomikOS in: Music on console - moc,PHP |
May
31
2010
0

La función explode es sensible a mayúsculas y minúsculas.
Escrito por NomikOS el 31/May/2010 | 171 visitas

explode es sensible a mayúsculas y minúsculas… :o Y me acabo de dar cuenta! Después de re-tantos años de usarlo. Cierto es que el uso más común de explode es trozar pizzas, como lo ejemplifica el manual de PHP:

1
2
3
4
5
# Example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

Pero no siempre se aplica así. Estaba recién cortando cadenas de texto con la desfachatez que dan años de circo:

1
2
3
4
$name = 'Audi A4 1.9 TDI 130 Quattro Sport 5dr';
$tok = 'AUDI';
$model = explode($tok, $name);
$model = strtok($model[1], ' ');

Lo anterior debe dar el modelo: “A4″. O debiera, si explode no fuera a sensible a mayúsculas y minúsculas. Pero como lo es me quedo sin poder determinar el modelo del autazo.

Tuve que ir al manual de PHP http://php.net/manual/en/function.explode.php para convencerme. Y sorpresa, no dice nada al respecto! Ya podría echarle la culpa a alguien si se perdía plata :|

Hay una página de manual de PHP alternativa en que un usuario lo comenta y propone una función explodei, que es case-insensitive:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
/**
siavash79_99 at yahoo dot com
19-Nov-2003 05:24
here is a tested case-insensitive explode I named it explodei()
works cool :-)
**/


function explodei($separator, $string, $limit = false )
{
   $len = strlen($separator);
   for ($i = 0; ; $i++)
   {
       if (($pos = stripos($string, $separator )) === false
          ||
          ($limit !== false && $i > $limit - 2 ))
       {
           $result[$i] = $string;
           break;
       }
       $result[$i] = substr($string, 0, $pos);
       $string = substr($string, $pos + $len);
   }
   return $result;
}

/**
If your php version is < 5, you'll need to add stripos() to your script.
See http://php.net/function.stripos
**/

?>

Fuente: http://theserverpages.com/php/manual/en/function.explode.php#37563

A simple vista parece correcta, pero hay una manera más simple y rápida:

1
2
3
4
$name = 'Audi A4 1.9 TDI 130 Quattro Sport 5dr';
$tok = 'AUDI';
$model = explode(strtoupper($tok), strtoupper($name));
$model = strtok($model[1], ' ');

Sí, usando explode en cadenas con igual case debiera funcionar. Es un truco que se usa bastante en consultas a bases de datos cuando interesa considerar mayúsculas y minúsculas como iguales.

1
SELECT * FROM tabla WHERE UPPER(esto) = UPPER('Esto');

Ja! Lo comenté en php.net y ahora forma parte del manual en línea de PHP. 8)
clap, clap, clap, gracias, clap, clap, clap, gracias, gracias.

Written by NomikOS in: PHP |
May
23
2010
0

Codificación de caracteres: UTF-8 o ISO-8859-1.
Escrito por NomikOS el 23/May/2010 | 442 visitas

Usar UTF-8 (Unicode) o ISO-8859-1 (Alfabetos usados en occidente) en la codificación de caracteres no es una decisión que deba hacerse a la ligera.

Consideraciones principales:

1.- Bytes requeridos: UTF-8 puede usar hasta 4 bytes para codificar en vez de uno solo (ISO-8859-1). Un byte alcanza para 256 combinaciones con sus ocho bits que son suficientes para todo el alfabeto latino usado en occidente. Con dos bytes abarca el cirílico (ruso) y griego (también usado en matemáticas). Más bytes pueden ser necesarios para alfabetos extremadamente complicados como el chino, árabe o hindi.
Esto debe ser considerado al definir campos en una base de datos.

2.- Funciones manejadoras: En PHP funciones para tratar cadenas de texto como substr(), strpos(), strlen() no están pensadas para ambientes multibytes. Esto fácilmente puede devenir en variados errores. También la función mail() y las para expresiones regulares pueden verse afectadas. Para estos casos existen funciones dedicadas cuyo sufijo es mb_ (de multibyte).
No es necesario reescribir el código para adaptar scripts a un ambiente multibyte. PHP puede realizar sobrecarga de funciones (Function Overloading Features) si se lo indicas en su archivo de configuración php.ini, con lo que automáticamente usará las funciones más adecuadas.

1
2
3
4
5
# usa 1 para sobrecargar mail()
# usa 2 para sobrecargar funciones de cadenas
# usa 4 para sobrecargar expresiones regulares
# usa la suma para varias opciones
mbstring.func_overload = 7

Averiguar si tienes la extensión mbstring necesaria para tener estas características:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ php -i|grep mbstring
# si la tienes debe responder algo como esto
mbstring
mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.
mbstring.detect_order => no value => no value
mbstring.encoding_translation => Off => Off
mbstring.func_overload => 7 => 7
mbstring.http_input => pass => pass
mbstring.http_output => pass => pass
mbstring.internal_encoding => no value => no value
mbstring.language => neutral => neutral
mbstring.strict_detection => Off => Off
mbstring.substitute_character => no value => no value

# puedes ver todos los módulos (extensiones) cargados con la opción -m
$ php -m

$ php -m|grep mbstring
mbstring

Si no está puedes instalar esta extensión PHP fácilmente (phpMyAdmin siempre la pide a gritos):

1
2
3
4
# Ubuntu
sudo apt-get install php5-mbstring
# Red Hat y compañia
sudo yum install php-mbstring

Si puedes elegir prefiere UTF-8 que es un sobreconjunto de ISO-8859-1. Ambos funcionarán igual de bien para aplicaciones en español o inglés. Pero si se da el caso en que debas considerar idiomas no occidentales, entonces estos consejos te servirán.

Otros comandos útiles pueden ser los siguientes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# codificación de caracteres interna en PHP
mb_internal_encoding('UTF-8');

# codificación de caracteres en la base de datos
# al iniciar una conexión con PHP
mysql_query("SET NAMES 'utf8';");
mysql_query("SET CHARACTER SET 'utf8';");

# codificación de caracteres enviada al cliente o
# navegador desde PHP
header('Content-type: text/html; charset=UTF-8');

# encabezado en documentos XML
<?xml version="1.0" encoding="utf-8" ?>

# META en documentos HTML/XHTML
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

Unicode poster
Creative Commons License photo credit: Max Braun
Written by NomikOS in: PHP |
Dec
01
2009
0

SheBang (sharp bang) #!.
Escrito por NomikOS el 01/Dec/2009 | 84 visitas

Los símbolos #! (sharp bang) aparecen en la primera línea de muchos scripts, especialmente los de perl. Tambien podemos usarlos en PHP. SheBang es un alias geek de sharp bang.

Nota: El shell es el intérprete de comandos en tu terminal linux. Generalmente bash.

Lo que hace es indicarle al shell que cargue el programa descrito a continuación de ! (bang) y que le pase el nombre del archivo (del script en que está) como primer parámetro.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# en archivo hello-world.php:
#! /usr/bin/php
<?php
echo "Hello World!\n";
?>

# hacer archivo ejecutable
chmod a+x hello-world.php

# ahora si ejecutamos
./hello-world.php

# producirá
Hello World!

Como # inicia comentarios en PHP no será tomado en cuenta por el propio interprete PHP, sólo por el shell. Incluso no es necesaria la extensión .php.

Fuente: http://c2.com/cgi/wiki?SheBang

Written by NomikOS in: Linux,PHP |
Oct
23
2009
0

WordPress escapa automáticamente las comillas simples!.
Escrito por NomikOS el 23/Oct/2009 | 248 visitas

En wp-settings.php alrededor de la línea 581 de wordpress 2.8 encontramos:

1
2
3
4
5
6
7
8
9
10
11
12
// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
    $_GET    = stripslashes_deep($_GET   );
    $_POST   = stripslashes_deep($_POST  );
    $_COOKIE = stripslashes_deep($_COOKIE);
}

// Escape with wpdb.
$_GET    = add_magic_quotes($_GET   );
$_POST   = add_magic_quotes($_POST  );
$_COOKIE = add_magic_quotes($_COOKIE);
$_SERVER = add_magic_quotes($_SERVER);

O sea que independientemente de tu configuración en php.ini:

1
2
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off

WP siempre escapará las comillas.

Luego en teoría no sería necesario usar addslashes o addslashes_gpc:

1
$keyword = addslashes_gpc(trim($_POST['keyword']));

Y siempre deberíamos usar stripslashes al reescribir datos pasados por $_POST:

1
<input type="text" name="keyword" value="<?php echo htmlspecialchars(stripslashes($_POST['keyword'])) ?>">

La verdad es que no me gusta nada. Pero no queda más que aceptarlo como una medida de seguridad adecuada para permitir la creación de tantos plugins para WP a la mayor cantidad de codificadores.

Como sea, es mejor no olvidar esta característica de WP.

Written by NomikOS in: PHP,Wordpress/Buddypres |
Oct
01
2009
10

Actualizando php 5.2 en Centos 5.
Escrito por NomikOS el 01/Oct/2009 | 10 comentarios | 503 visitas

Centos 5 viene con php 5.1.6.
Hay importantes paquetes que necesitan php 5.2+ como por ejemplo phpmyadmin 3.2.2. Encontré un repositorio dedicado a esto.

Haz un nuevo archivo:

1
vi /etc/yum.repos.d/centos-test.repo

Agrega estas líneas:

1
2
3
4
5
6
[c5-testing]
name=CentOS-5 Testing
baseurl=http://dev.centos.org/centos/5/testing/$basearch/
enabled=0
gpgcheck=1
gpgkey=http://dev.centos.org/centos/RPM-GPG-KEY-CentOS-testing

Ejecuta la actualización con yum

1
yum --enablerepo=c5-testing update php

Ahora lo tienes…

1
2
3
4
php -v
PHP 5.2.9 (cli) (built: Jul  8 2009 06:03:36)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

Aprovecha de actualizar php-mcrypt para tranquilizar a phpmyadmin.

1
yum --enablerepo=c5-testing update php-mcrypt

Chequea que php-mcrypt sea de la misma version que php (5.2.9 en este caso).

1
2
rpm -qa | grep php-mcrypt
php-mcrypt-5.2.9-2.el5.centos.3

Ahora las extensiones para php son cargadas desde sus propios archivos .ini ubicados en /etc/php.d

1
vi /etc/php.d/mcrypt.ini

Para habilitar mcrypt asegúrate de remover ; en la segunda línea.

1
2
; Enable mcrypt extension module
extension=mcrypt.so

Reinicia apache

1
service httpd restart
Written by NomikOS in: Linux,PHP |

motor: WordPress. tema: TheBuckmaker modificado por NomikOS.