lunes, 15 de julio de 2013

Múltiples conexiones a bases de datos en cakephp

En esta ocasión me encuentro trabajando con un proyecto sobre Mysql y Cakephp 2.2, la situación y complejidad del proyecto se ha visto en la necesidad de consultar información de otro sistema que se utiliza en la organización, el cual tiene su base de datos en Sql Server 2008. La idea es poder interactuar con los 2 Sistemas Gestores de Bases de Datos, compartiendo  la información y centralizarla en un solo lugar.
Gracias a este post que encontré navegando en la web se puede observar la flexibilidad que tiene  Cakephp, el cual menciona lo siguiente:
En cakephp existen gran cantidad de posibilidades desconocidas que, en algunos casos, pueden resultar útiles.
Una de ellas es la posibilidad de declarar más de una conexión a base de datos, pudiendo elegir en cada momento cuál de ellas deseamos utilizar.

Puede resultar muy cómodo para organizar nuestros proyectos, para acceder a diferentes servidores de bases de datos o acceder a diferentes gestores de bases de datos.
El proceso es sencillo, en primer lugar añadiremos al archivo database.php situado en /app/config/ una nueva configuración de base de datos.

Podremos copiar la configuración por defecto, llamada default, y cambiarle el nombre.
El fichero database.php quedará así

class DATABASE_CONFIG {

        public $default = array(
                'driver' => 'mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'user',
                'password' => 'password',
                'database' => 'database',
                'prefix' => '',
        );

        public $nueva_conexion = array(
                'driver' => 'mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'user',
                'password' => 'password',
                'database' => 'database_2',
                'prefix' => '',
        );

        public $test = array(
                'driver' => 'mysql',
                'persistent' => false,
                'host' => 'localhost',
                'login' => 'user',
                'password' => 'password',
                'database' => 'test_database_name',
                'prefix' => '',
        );
}

Con esto habremos declarado otra conexión a la base de datos llamada nueva_conexion
Una de las opciones que tiene la configuración de la base de datos, es la de utilizar un prefijo, es decir, que todas las tablas de la configuración de la base de datos comiencen con una palabra, también puede ser utilizado para organizar las bases de datos.

Para utilizar la configuración de la base de datos que hemos creado, tendremos que añadir en el modelo desde donde queremos acceder a esas tablas la siguiente línea:
  public $useDbConfig ='nueva_conexion';

A partir de este momento, cada vez que accedamos a este modelo, cakephp utilizará las tablas existentes en la base de datos de esa conexión.

viernes, 3 de agosto de 2012

Sublime Text 2


Tutorial para Sublime Text 2

Al principio pensaba que estaba
relacionado a la marca de un chocolate (?)
Sublime Text 2 es un editor de texto simpático que funciona en Linux, Mac y Windows. El poder de Sublime Text 2 se encuentra en sus extensiones o plugins y en las múltiples características que contiene: completado inteligente, integración con Git, movimiento entre archivos de proyecto, diff, entre otras delicias para el programador que se dedica a escribir código todo el día usando PHP, Python, Ruby o cualquier otro lenguaje de programación sin IDE agradecerá.

A diferencia de Komodo, Notepad++ y gEdit con Plugins, debo afirmar que Sublime Text 2 tiene buen rendimiento, es ligero (No como Eclipse o NetBeans para PHP) y muy productivo, por tanto vale la pena pagar la licencia y sino, pues habrá que lidiar con el mensaje que recuerda a diario y si tiempo de caducidad el mensaje "UNREGISTERED".

Aquí va la razón de este tutorial. La primera vez que instalé Sublime Text 2 quise instalar plugins los famosos plugins pero encontré difícil entender como funciona el Install Package. Respiré profundo y busqué guias de Sublime Text 2 en Google, pero no encontré nada interesante que un novato pueda entender a primera vista. Borré Sublime de mi Computadora. Pero luego le di una segunda oportunidad y aquí estamos.

Fuera frustración, aquí vamos.


1. Instalar Sublime Text

Lo primero es descargar el programa desde http://www.sublimetext.com según el sistema operativo. Para OSX y Windows no es muy complicado hacer el proceso de instalación, el problema aparece cuando se trata de Linux. Hay que descargar, configurar...

Para facilitarnos la vida en Ubuntu 12.04 podemos usar un Deb creado por InfinitUbuntu. Descargamos el deb e instalamos en Ubuntu con un doble click sin complicaciones.

http://www.infinitubuntu.com/2012/06/sublime-text-22181-linux-deb.html

Otra manera es usando los repositos (cosa que no funciona muy bien para mi a la hora de recibir actualizaciones en Ubuntu y para otros sí)

$ sudo add-apt-repository ppa:webupd8team/sublime-text-2
$ sudo apt-get update
$ sudo apt-get install sublime-text-2

En fin.

2. Instalar el Package Control

Sublime Text 2 tiene un gestor de paquetes. El truco es activar el gestor. Busqué en los menús, pero no encontré nada obvio con la palabra "Install Package" o algo parecido con "Package". Solo encuentroPreference > Browse Package. que me envía a una carpeta del sistema. Muy raro.

Para instalar el gestor abrimos la consola en el menú View > Show Console y en la línea inferior pegamos lo siguiente:

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'

Se vería así:
Hay que adminitilo: Una manera Friki de instalar Package Control en Sublime Text 2
Enter luego, reiniciamos Sublime Text 2 y notamos que hay algo nuevo en el menú. Ahora hay un elemento nuevo en Preference > Package Control. Mágico.

 Si te gustan las emociones intensas y deseas probar el modo manual de instalar el Package Control recomiendo visitar las instrucciones que se presentan enhttp://wbond.net/sublime_packages/package_control/installation

De acuerdo, presionamos Shift + Ctrl + P para obtener un menú oculto, escribimos "Install Package", presionamos Enter y esperaremos un poco hasta que el menú nos entregue la lista de paquetes disponibles para descarga. Seleccionamos en la lista el paquete que nos interesa y Listo, añadimos extensiones a Sublime Text 2.

Shift + Ctrl + P es el conjuro para llamar al menú oculto de Sublime Text 2
2. Paquetes de Sublime Text 2 recomendados


Son muchos los paquetes de Sublime Text 2, probarlos todos nos daría mucho tiempo, así que hice una pequeña lista de paquetes fundamentales que te pueden interesar:

SublimeLinter
Subraya los potenciales errores de un programa, por ejemplo, olvidaste el punto y coma al final o una expresión no tiene los paréntesis necesarios.
SublimeLinter ayuda mucho.
Alignment
Formatear código rápido presionando Ctrl + Alt + a.
Mucho mejor y más claro.
FileDiffs
Compara archivos entre los Tabs actuales.
Diff Sencillo sin problemas.
SublimeCodeIntel
Completa el código.
Extrañaba el completado, sobretodo en PHP.
Yii Framework Snipped
Soporte para PHP Yii Framework.

CodeIgniter Framework Snipped 
CodeIgniter también tiene su espacio.
Referencia Original de http://www.vidaamarilla.com/2012/07/tutorial-para-sublime-text-2.html

lunes, 5 de marzo de 2012

PHP: Contar archivos de una carpeta o directorio

A veces tenemos que lidiar con algunos codigos para tener control de nuestro sitio web.

A continuacion les dejo un codigo que seguro les ayudara para contar archivos (en este caso imagenes) de una carpeta o directorio especifico

Pueden usar otras extensiones si lo desean (doc, pdf, swf, etc.)

Codigo


$total_imagenes = count(glob("carpeta/{*.jpg,*.gif,*.png}",GLOB_BRACE));
echo "total_imagenes = ".$total_imagenes;
}
?>

Tambien pueden contar un archivo especifico.

Codigo


$total_imagenes = count(glob("carpeta/mi_foto.jpg",GLOB_BRACE));
echo "total_imagenes = ".$total_imagenes;
}
?>

martes, 28 de febrero de 2012

960px El Tamaño Ideal Para Una Página


Me encuentro en Xybernéticos que el tamaño perfecto para diseñar una página es de 960 pixeles (aunque la teoría de la usabilidad dice que tiene que ser de menos de 800 por aquello de que todos puedan ver las cosas igual)… pero bueno porque 960?.. porque es un número que es divisible entre 1, 2, 3, 4, 5, 8 y 10, de esta forma podemos tener ese mismo número de columnas en el sitio conservando la simetría y proporción.

Que es una DMZ?

Una DMZ (del inglés Demilitarized zone) o Zona DesMilitarizada. Una zona desmilitarizada (DMZ) o red perimetral es una red local que se ubica entre la red interna de una organización y una red externa, generalmente Internet.

El objetivo de una DMZ es que las conexiones desde la red interna y la externa a la DMZ estén permitidas, mientras que las conexionesdesde la DMZ sólo se permitan a la red externa, es decir: los equipos locales (hosts) en la DMZ no pueden conectar con la red interna.

Esto permite que los equipos (hosts) de la DMZ’s puedan dar servicios a la red externa a la vez que protegen la red interna en el caso de que intrusos comprometan la seguridad de los equipos (host) situados en la zona desmilitarizada. Para cualquiera de la red externa que quiera conectarse ilegalmente a la red interna, la zona desmilitarizada se convierte en un callejón sin salida.

La DMZ se usa habitualmente para ubicar servidores que es necesario que sean accedidos desde fuera, como servidores de e-mail, Web y DNS.

Esto se ve muchísimo más claro en un esquema:

Las conexiones que se realizan desde la red externa hacia la DMZ se controlan generalmente utilizando port address translation (PAT).

Habitualmente una configuración DMZ es usar dos cortafuegos, donde la DMZ se sitúa en medio y se conecta a ambos cortafuegos, uno conectado a la red interna y el otro a la red externa. Esta configuración ayuda a prevenir configuraciones erróneas accidentales que permitan el acceso desde la red externa a la interna. Este tipo de configuración también es llamado cortafuegos de subred monitoreada (screened-subnet firewall).

Origen del término:

El término zona desmilitarizada es tomado de la franja de terreno neutral que separa a ambas Coreas, y que es una reminiscencia de la Guerra de Corea, aún vigente y en tregua desde 1953. Paradójicamente, a pesar de que esta zona desmilitarizada es terreno neutral, es una de las más peligrosas del planeta, y por ello da nombre al sistema DMZ.

Un término relacionado directamente con esta tecnlogía es el llamado equipo bastión, éste, normalmente a través de dos tarjetas de red (interfaces) mantiene aislada la red local de la red externa, es decir, la LAN de la WAN.



miércoles, 18 de enero de 2012

Ajustar width del jqgrid a un div contenedor

Saludos, esta ocasión les comento como podemos hacer para que nuestro elemento jqgrid pueda ser ajustado al contenedor padre, en este caso solo debemos escribir la siguiente linea de código después de la llamada principal al jqgrid

$("#grid_id").setGridWidth($('#box-content').width(), true);

con esto no necesariamente deberemos asignar un width estático en las propiedades del elemento jqgrid

Nos leemos en la proxima entrada.

martes, 6 de diciembre de 2011

Múltiples llamadas AJAX en CakePHP causa error 403 o logout

Situación:

Desarrollando una aplicación web, tiene un formulario que contenía entre otros elementos una etiqueta SELECT de HTML con varias etiquetas OPTION que al seleccionarlas hace una llamada AJAX (utilizando jQuery) para buscar una información en específica y desplegarla.

Problema:

Cuando haces rápidamente clicks a varias de las etiquetas OPTION, lo que resulta en varias llamadas AJAX simultáneas, la primera llamada es procesada y la segunda y/o posteriores dan un error 403, y si tienes activado un módulo de seguridad te devolverá la página de login.

Solución:

Luego de Googlear la solución y leer foros encontré que la solución es una modificación bien sencilla, simplemente debes de cambiar el valor de la constante ‘Security.level’ de ‘high’ a ‘medium’ que se encuentra en el archivo ‘/app/config/core.php’.

Explicación:

Cuando configuramos el nivel de seguridad de CakePHP a ‘high’ cada llamada que se realiza entre el cliente al servidor es encriptada con un valor diferente lo cual afecta al reseteo y cambia valor constante de las Cookies de seguridad utilizadas por CakePHP. Cuando reconfiguramos el nivel de seguridad a ‘medium’ la medida ya descrita es pasada por alto.

viernes, 21 de octubre de 2011

Funciones de ordenamiento en php

Veamos directamente las funciones disponibles para ordenar arrays.

sort()

Es la función más básica para ordenar arrays en PHP. Ordena el array de valores menores a mayores. Lo vemos con un ejemplo.

//Ordenar desde el menor al mayor
$alumnos = array("Pepe", "Juan", "Marcelo", "Alberto", "Gerardo");
sort($alumnos);
foreach ($alumnos as $key => $val) {
echo "alumnos[" . $key . "] = " . $val . "
";
}

Que dará como resultado:
alumnos[0] = Alberto
alumnos[1] = Gerardo
alumnos[2] = Juan
alumnos[3] = Marcelo
alumnos[4] = Pepe

rsort()

Esta función ordena el array por valores. La "r" delante quiere decir que ordena en orden reverso, de mayor a menor.

//ordenar de mayor a menor (orden inverso... Reverse order)
$alumnos = array("Pepe", "Juan", "Marcelo", "Alberto", "Gerardo");
rsort($alumnos);
foreach ($alumnos as $key => $val) {
echo "alumnos[" . $key . "] = " . $val . "
";
}

Que daría como respuesta:
alumnos[0] = Pepe
alumnos[1] = Marcelo
alumnos[2] = Juan
alumnos[3] = Gerardo
alumnos[4] = Alberto

ksort()

También podemos ordenar un array por el índice o llave, que quiere decir que en lugar de ordenar atendiendo a los valores, se ordenaría atendiendo al índice que tienen. Para ver este ejemplo utilizaremos arrays asociativos, que son los que tienen índices de texto en vez de números.

En el array siguiente vemos que tenemos índices como "h", "e", "a", en lugar de números. Lo que hará este tipo de ordenación es fijarse en esos índices para poner el array ordenado por ellos.

//Ordenar arrays por su índice
$calles = array("h"=>"Leganitos", "e"=>"Castellana", "a"=>"Bailén", "z"=>"Fuencarral");
ksort($calles);
foreach ($calles as $key => $val) {
echo $key ." = " . $val . "
";
}

Esto dará como resultado esta ordenación:
a = Bailén
e = Castellana
h = Leganitos
z = Fuencarral

krsort()

También podemos ordenar por índices pero en sentido inverso. Es decir, por índices pero de mayor a menor.

//ordenar por índice o clave, pero en orden inverso
$calles = array("h"=>"Leganitos", "e"=>"Castellana", "a"=>"Bailén", "z"=>"Fuencarral");
krsort($calles);
foreach ($calles as $key => $val) {
echo $key ." = " . $val . "
";
}

En este caso el resultado sería el siguiente:
z = Fuencarral
h = Leganitos
e = Castellana
a = Bailén

asort()

Esta función ordena los elementos de un array, pero manteniendo la correlación entre índices y valores a los que están asociados. Ordena por valores. Se utiliza generalmente en arrays asociativos.

//ordenar manteniendo los índices
$capitales = array("España" => "Madrid", "Argentina" => "Buenos Aires", "México" => "Ciudad de México", "Brasil" => "Brasilia");
asort($capitales);
foreach ($capitales as $key => $val) {
echo $key ." = " . $val . "
";
}

Dará como resultado el siguiente orden de array:
Brasil = Brasilia
Argentina = Buenos Aires
México = Ciudad de México
España = Madrid

arsort()

Es lo mismo que asort(), pero realiza el orden en inverso de los valores de los arrays. Como decíamos, lo habitual es realizar este tipo de orden en arrays asociativos, pero en este caso vamos a ver el orden en un array normal (con índices numéricos) para que se vea mejor cómo trabaja la función:

//ordenar manteniendo los índices, Reverso
$ciudades = array("Madrid", "Barcelona", "Valencia", "Sevilla", "Bilbao");
arsort($ciudades);
foreach ($ciudades as $key => $val) {
echo $key ." = " . $val . "
";
}

El resultado obtenido es este:
2 = Valencia
3 = Sevilla
0 = Madrid
4 = Bilbao
1 = Barcelona

natsort()

Para acabar vamos a ver esta función que hace una ordenación natural de los elementos del array, es decir, ordena tal como lo haría una persona. Hay una pequeña diferencia sobre el orden que haría sort(). La función natsort mantiene la asociación clave - valor.

$productos = array ("producto 11", "producto 1", "producto 12", "producto 2");
natsort($productos);
foreach ($productos as $key => $val) {
echo $key ." = " . $val . "
";
}

Esto daría como respuesta:
2 = producto 1
4 = producto 2
1 = producto 11
3 = producto 12
0 = producto 20

Ahora, para que se vea la diferencia con un orden normal, vamos a ordenar ese mismo array con la función sort(), que hace un orden alfanumérico normal.

$productos = array ("producto 11", "producto 1", "producto 12", "producto 2");
sort($productos);
foreach ($productos as $key => $val) {
echo $key ." = " . $val . "
";
}

El resultado de este orden será el siguiente:
0 = producto 1
1 = producto 11
2 = producto 12
3 = producto 2

Como se puede ver, el orden es distinto, porque en ese caso ordena por un orden alfanumérico estricto, sin tener en cuenta los valores como un humano lo haría.

ShareThis