Archivos Mensuales: diciembre 2010

Usando JSON con PHP, PHP-min y JQuery


Bien en este ejemplo manejaremos algo de JSON no sin antes manejar algunas cosas desde PHP-Min como lo es la base de datos para que quede un ejemplo como este.

Si les ha gustado, comenzaremos por Crear una tabla que es de donde obtendremos nuestros datos como la base de datos que tengo es de ejemplos y las tablas ahí son compartidas procederé a ponerle un nombre algo extraño a la tabla, ustedes podrán amoldarla a su gusto.


CREATE TABLE `ejemploJSONPHPJQuery` (
`ItemId` int(11) NOT NULL auto_increment,
`ItemNombre` varchar(100) collate latin1_general_ci NOT NULL,
PRIMARY KEY  (`ItemId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;

Haremos todos nuestros querys sobre esta tabla en este caso solo haremos selects, ya que los inserts y updates son exactamente iguales asi que se los dejaré a su imaginación.

Como siempre es recomendable desigrnar los archivos como van a quedar 😛

  • Modulos (Carpeta)
    • InsertarDatos.php
    • ObtenerJson.php
  • Includes (Carpeta)
    • phpdbc2.min.php (Descargar)
  • Js (Carpeta)
    • framework.js
    • JQuery.1.1.4.min.js (Descargar)
  • index.php

Bien de aqui en adelante comenzaremos con el código, al final como siempre plantaremos un ejemplo para que puedan descargarlo y jugar con el lo suficiente.

InsertaDatos.php

Este archivo nos permitirá recibir datos en JSON además de insertar un dato y traernos de vuelta todos los datos existentes, el código queda de la siguiente manera:


<?
include("../includes/phpdbc2.min.php");
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
$info = json_decode($HTTP_RAW_POST_DATA,true);
$INSERT = "INSERT INTO ejemploJSONPHPJQuery (ItemNombre) VALUES ('".utf8_decode($info["item"])."')";
$db->query($INSERT);
$SELECT = "SELECT ItemId As Id, ItemNombre As Descripcion FROM ejemploJSONPHPJQuery LIMIT 30";
$db->query($SELECT);
echo $db->toJSON();
?>

ObtenerJson.php

Este archivo solo hará un select y regresará los datos en JSON es parecido al archivo anterior solo que no existe un insert dentro del código.


<?
include("../includes/phpdbc2.min.php");
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
$SELECT = "SELECT ItemId As Id, ItemNombre As Descripcion FROM ejemploJSONPHPJQuery LIMIT 30";
$db->query($SELECT);
echo $db->toJSON();
?>

framework.js

El poderoso archivo framework, como los que visitan este blog amenudo, saben que ese archvio es el que contiene todas las funciones en javascript las cuales utilizamos para trabajar y dividir el trabajo entre el servidor y el cliente.


function AgregarItem() {
var Datos = "{ \"item\" : \"" + $('#item').val() + "\" }";
CargarPagina('#MuestraElementos', 'modulos/InsertarDatos.php', Datos);
}

function CargarPagina(div, url, datos) {
if (div != undefined) {
$.ajax({
type: "POST",
url: url,
data: datos,
contentType: "application/json; charset=utf-8",
dataType: "json",
beforeSend: function(respuesta) {
$(div).html("Cargando Información...");
},
success: function(respuesta) {
if (respuesta != null) {
$(div).html(RecorreJSON(respuesta));
} else { $(div).html("No existen Datos para Esta Busqueda."); }
},
error: function(objeto, quepaso, otroobj) {
alert("La busqueda de la información está tomando demaciado tiempo, la Red podría estar saturada, vuelva a intentarlo en unos segundos.");
}
});
}
}

function RecorreJSON(resp) {
var info = "";
$.each(resp, function(i, item) {
info = info + item.Id + " - "
info = info + item.Descripcion + "
"
});
return info;
}

index.php

El archivo index es la cereza del pastel y el mas simple de todos ya que en el esta incluido solo html


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ejemplo de uso de PHP MySQL JSON y PHP.min</title>
</head>
<script src="js/JQuery.1.1.4.min.js" type="text/javascript"></script>
<script src="js/framework.js" type="text/javascript"></script>
<body><fieldset>
<legend>Agregar Elemento </legend>
Agregar Item:
<input name="item" type="text" id="item" />
<input type="button" name="Submit" value="Agregar" onclick="AgregarItem()"/>
<input type="button" name="Submit2" value="Ver Lista"  onclick="CargarPagina('#MuestraElementos', 'modulos/ObtenerJson.php','')"/>
</fieldset>
<fieldset><legend>Lista de Elementos</legend>
<div id="MuestraElementos"></div>
</fieldset>
</body>
</html>

Sí, lo se, este ejemplo se pudo hacer con elementos estaticos para que fuera más rapido pero es divertido mostrar el phpdbc2.min funcionando 😛 y la simplificación del trabajo de jugar con el MySQL y el postgrest, un saludo y felices fiestas ya que creo este será el ultimo post de este año.

Descargar Ejemplo (Pendiente)

Anuncios

Procedimiento Almacenado y Estructuras de Control en MySQL WHILE, IF THEN ELSE, SWITCH


Bien como ya hemos visto los procedimientos almacenados son muy interesantes, aquí no hemos visto estructuras de control, como lo son IF, SWITCH, WHILE,VARIABLES, etc… y creo que es bueno comenzar con esta ultima.

VARIABLES

DECLARE edad INT;

Esta tendrá un ámbito local y cuando se acabe el procedimiento no podrá ser accedida. Una vez la variable es declarada, para cambiar su valor usaremos la sentencia SET  como en el siguiente ejemplo:

SET edad = 56 ;

Para poder acceder a una variable a la finalización de un procedimiento se tiene que usar parámetros de salida como en el siguiente Código:

IF THEN ELSE

delimiter //
CREATE procedure miProc(IN p1 int)     /* Parámetro de entrada */
begin
declare miVar int;        /* se declara variable local */
SET miVar = p1 +1 ;        /* se establece la variable */
IF miVar = 12 then
INSERT INTO lista VALUES(55555);
else
INSERT INTO lista VALUES(7665);
end IF;
end;
//

SWITCH

delimiter //
CREATE procedure miProc (IN p1 int)
begin
declare var int ;
SET var = p1 +2 ;
case var
when 2 then INSERT INTO lista VALUES (66666);
when 3 then INSERT INTO lista VALUES (4545665);
else INSERT INTO lista VALUES (77777777);
end case;
end;
//

Creo que no hacen falta explicaciones.

COMPARACIÓN DE CADENAS

delimiter //
CREATE procedure compara(IN cadena varchar(25), IN cadena2 varchar(25))
begin
IF strcmp(cadena, cadena2) = 0 then
SELECT "son iguales!";
else
SELECT "son diferentes!!";
end IF;
end;
//

La función strcmp devuelve 0 si las cadenas son iguales, si no devuelve 0 es que son diferentes.

USO DE WHILE

delimiter //
CREATE procedure p14()
begin
declare v int;
SET v = 0;
while v < 5 do
INSERT INTO lista VALUES (v);
SET v = v +1 ;
end while;
end;
//

Un while de toda la vida.

USO DEL REPEAT

delimiter //
CREATE procedure p15()
begin
declare v int;
SET v = 20;
repeat
INSERT INTO lista VALUES(v);
SET v = v + 1;
until v <= 1
end repeat;
end;
//

El repeat es similar a un “do while” de toda la vida.

Lista de Hosting’s PHP y MySQL Gratis para Pruebas


Muchas personas en la oficina e incluso algunos compañeros de trabajo me han preguntado que si es posible tener un webhosting de pruebas para poder mostrarlo en caso de ser necesario, si se quiere montar una pagina web y necesitas servicios de hosting PHP y MySQL, aqui veremos algunos sitios gratuitos.

Servicios de este tipo existen muchos pero la gran mayoría insertan publicidad en tu sitio web, cosa que a algunos no nos gusta, por eso aquí dejo una lista de los mejores servicios de hosting gratis y sin publicidad.
Todos estos servicios incluyen características que todo servicio profesional debe tener cómo: acceso por medio de FTP, soporte paraPHP y bases de datos MySql, la posibilidad de usar tu propio nombre de dominio y agregar subdominios, digamos, lo básico:

 

000WebHost

  • 500 MB de espacio en disco
  • 100 GB de Tranferencia
  • PHP y MySQL
  • Activación instantánea
  • Soporte FTP
  • 99.9% de Uptime
  • Sin publicidad

Tiene algunas características interesantes cómo:

  • PHP con las funciones mail() y Sendmail activadas.
  • Curl, librería GD2, ImageMagick y Zend
  • Soporte para fopen()Sockets PHP
  • safe_mode está en OFF, y soporta la carga de archivos.
  • Tiene el cPanel
  • Soporta algunos CMS cómo Drupal, Geeklog, Joomla, Xoops, WordPress, b2evolution, Support Logic Helpdesk, phpBB2, SMF, OS Commerce, ViPER Guestbook, Coppermine Photo Gallery, PhpWiki, PHPauction, WebCalendar y pueden ser instalados en 1 solo click.

Enlace a 000WebHost.

Zymic

  • 5 GB de espacio en disco
  • 50 GB de Transferencia
  • PHP 5, 5 bases de datos mySQL
  • Accesos FTP
  • 99.9% de Uptime
  • Sin publicidad

Tiene algunas características interesantes cómo:

  • Zymic Hosting Control Panel
  • PHPMyAdmin
  • Webalizer

Enlace a Zymic.

110MB Hosting

  • 5 GB de espacio
  • PHP 5 y MySql Support
  • FTP (con chmod activado)
  • Subdominio gratis del tipo (tusubdominio.110mb.com)
  • 99.9% de Uptime
  • Sin publicidad

Tiene algunas características interesantes cómo:

  • Sendmail (PHP Mail)
  • CGI/Perl
  • SSI
  • Soporte de IonCube y Zend
  • Generación de sitios mediante templates guiados
  • Debian Linux OS con Apache 2.0
  • GD Lib 2.0.28
  • Compression Gzip

Enlace a 110MB Hosting.

Sitesfree

  • 500Mb de espacio en disco
  • 7 GB de transferencia
  • Soporta PHP 5, 5 y bases de datos mySQL.
  • Subdominio gratis del tipo (tusubdominio.sitesfree.com)
  • Acceso por FTP
  • 99.9% de Uptime
  • Sin publicidad

Enlace a Sitesfree.

Your Free Hosting

  • 5GB de espacio en disco
  • 50GB de transferencia
  • Soporte para PHP 4 y 5, bases de datos mySQL
  • Activación instantánea
  • Subdominio gratis del tipo (tusubdominio.yourfreehosting.com)
  • Administrador de archivos
  • Soporte técnico 24/7
  • Acceso completo por FTP
  • 99.9% de Uptime
  • Sin publicidad

Enlace a Your Free Hosting.

Estos servicios básicamente se sostienen mediante la venta de otros paquetes que ofrecen, ya que una vez que hayas rebasado los límites de la cuenta te van a ofrecer paquetes “Premium” donde disminuyen las limitaciones, sin duda se trata de una muy buena alternativa para sitios web que apenas comienzan y que no tienen mucho tráfico.

via el foro / via anieto

Ahora, si bien el hosting gratuito es bueno para realizar pruebas y experimentos, el gran problema que existe con estos, es que nadie nos asegura cuánto tiempo vaya a durar. Por lo tanto, una vez que planeen lanzar algo “en serio”, nada como tener un hosting pagado, con una compañía de confianza.

Procedimiento almacenado sin parametros de salida en MySQL 5


Ahhh recuerdo la primera vez que utilize MySQL en su versión 3 la use en un hosting gratis llamado lycos.com no tengo ni idea si aun existe, aun que en esos tiempos yo no disponia de la renta de servidores me ha servido mucho para comprender el manejo de PHP a fondo pero esos fueron los viejos tiempos, ahora que MySQL forma parte de Sun, se puso las pilas y en su versión 5 implementó muchas características que permitieron dejar un SGBD muy rápido y además muy bien preparado para implementar bases de datos realmente “grandes” (La verdad es que aun tengo mis dudas con lo de las bases de datos grandes) y mantenibles.

Teoria

¿qué es realmente un procedimiento almacenado? Es un programa que se almacena físicamente en una tabla dentro del sistema de bases de datos. Este programa esta hecho con un lenguaje propio de cada Gestor de BD y esta compilado, por lo que la velocidad de ejecución será muy rápida.

Principales Ventajas :

  • Seguridad: Cuando llamamos a un procedimiento almacenado, este deberá realizar todas las comprobaciones pertinentes de seguridad y seleccionará la información lo más precisamente posible, para enviar de vuelta la información justa y necesaria y que por la red corra el mínimo de información, consiguiendo así un aumento del rendimiento de la red considerable.
  • Rendimiento: el SGBD, en este caso MySQL, es capaz de trabajar más rápido con los datos que cualquier lenguaje del lado del servidor, y llevará a cabo las tareas con más eficiencia. Solo realizamos una conexión al servidor y este ya es capaz de realizar todas las comprobaciones sin tener que volver a establecer una conexión. Esto es muy importante, una vez leí que cada conexión con la BD puede tardar hasta medios segundo, imagínate en un ambiente de producción con muchas visitas como puede perjudicar esto a nuestra aplicación… Otra ventaja es la posibilidad de separar la carga del servidor, ya que si disponemos de un servidor de base de datos externo estaremos descargando al servidor web de la carga de procesamiento de los datos.
  • Reutilización: el procedimiento almacenado podrá ser invocado desde cualquier parte del programa, y no tendremos que volver a armar la consulta a la BD cada que vez que queramos obtener unos datos.

Desventajas:

  • El programa se guarda en la BD, por lo tanto si se corrompe y perdemos la información también perderemos nuestros procedimientos. Esto es fácilmente subsanable llevando a cabo una buena política de respaldos de la BD.

Por lo tanto es recomendable usar procedimientos almacenados siempre que se vaya a hacer una aplicación grande, ya que nos facilitará la tarea bastante y nuestra aplicación será más rápida.

Ejemplo:

Comenzaremos por las reglas de negocio.

Vamos a crear dos tablas en una almacenaremos las personas mayores de 18 años y en otra las personas menores(Detalles de diseño! despues prometo poner otros ejemplos mucho más decentes).

CREATE TABLE ninos(edad int, nombre varchar(50));
CREATE TABLE adultos(edad int, nombre varchar(50));

Imagínate que ahora queremos introducir personas en las tablas pero dependiendo de la edad queremos que seintroduzcan en una tabla u otra, si estamos usando PHP podríamos comprobar mediante código si la persona es mayor de edad. Lo haríamos así:

$nombre = $_POST["nombre"];
$edad = $_POST["edad"];
</code><code>
if($edad &lt; 18){
mysql_query("INSERT INTO ninios VALUES(".$edad.",'".$nombre."')");
}else{
mysql_query("INSERT INTO adultos VALUES(".$edad.",'".$nombre."')");
}

Si la consulta es corta como en este caso, esta forma es incluso más rápida que tener que crear un procedimiento almacenado, pero si tienes que hacer esto muchas veces a lo largo de tu aplicación es mucho mejor irnos por el lado del procedimiento almacenado:

Se crea el procedimiento almacenado:

delimiter //

CREATE procedure&nbsp; introducePersona(IN edad int,IN nombre varchar(50))
begin
IF edad < 18 then
INSERT INTO ninos VALUES(edad,nombre);
else
INSERT INTO adultos VALUES(edad,nombre);
end IF;
end;
//

el delimiter le dice a MySQL que a partir de ahroa hasta que no introduzcamos // no se acaba la sentencia, esto lo hacemos así por que en nuestro procedimiento almacenado tendremos que introducir el carcter “;” para las sentencias, y si pulamos enter MySQL pensará que ya hemos acabado la consulta y dará error.

Con create procedure empezamos la definición de procedimiento con nombre introducePersona. En un procedimiento almacenado existen parámetros de entrada y de salida, los de entrada (precedidos de “in”) son los que le pasamos para usar dentro del procedimiento y los de salida (precedidos de “out”) son variables que se establecerán a lo largo del procedimiento y una vez esta haya finalizado podremos usar ya que se quedaran en la sesión de MySQL.

Para hacer una llamada a nuestro procedimiento almacenado usaremos la sentencia call:

call introducePersona(25,”Carlos”);

Una vez tenemos ya nuestro procedimiento simplemente lo ejecutaremos desde PHP mediante una llamada como esta:

$nombre = $_POST['nombre'];
$edad = $_POST['edad'];

mysql_query("call introducePersona(". $edad .",'".$nombre."');");

Peleas por quien lava el baño


Jajjajaj no manches bebiendo unas cervezas y viendo chicas es divertido y pensando en los agoritmod de manejo de rutas criticas si ya google maneja los geotags y las ecuaciones aniadidas seria dacil manejar una adecuacion de rutas criticas

Archivo postinst


Este es uno de los archivos más divertidos, ya que en el se conjugará todo el juego de la instalación, preguntas, respuestas, obtención de la información de la base de datos de los paquetes debian, y el que más dolor de cabeza me ha dado… comenzaremos viendo el código:


#!/bin/bash -e
#Nombre del paquete y versionamiento
PACKAGE="ejemplo"
SOURCE="ejemplo"
VERSION="4:2.9.1.1-13"
#llamamos al modulo de DebConf
. /usr/share/debconf/confmodule
db_version 2.0 || [ 0 -lt 30 ]
#Preguntamos si estamos en la opcion de Configuración
if [ "$1" = "configure" ]; then
#Pedimos la información con db_get
db_get ejemplo/ejemplo-licencia
#Si existe $RET entonces se la asignamos a la variable Licencia
if [ -n "$RET" ]; then
licencia="$RET"
else
# Si no  asignamos una variable por defecto
licencia="GENERICA"
fi
db_get ejemplo/ejemplo-hostdb
if [ -n "$RET" ]; then
hostdb="$RET"
else
hostdb="localhost"
fi
db_get ejemplo/ejemplo-nombredb
if [ -n "$RET" ]; then
db="$RET"
else
db="ejemplodb"
fi
db_get ejemplo/ejemplo-usuariodb
if [ -n "$RET" ]; then
usuariodb="$RET"
else
usuariodb="root"
fi
db_get ejemplo/ejemplo-passworddb
if [ -n "$RET" ]; then
passdb="$RET"
else
passdb="PassGenerico"
fi
db_get ejemplo/ejemplo-pmysql
if [ -n "$RET" ]; then
mysqlroot="$RET"
else
mysqlroot=""
fi

Con esta sección de código lo único que hacemos es obtener la información que se guardo en la Base de Datos de paquetes, recordemos que esto funciona solo en las Distribuciones que son Base Debian.

ahora veremos que más podemos hacer, como es un archivo de tipo bash podemos hacer lo que los comandos de linux permitan realizar, como por ejemplo verificar la información de Apache si este existe y si tiene la configuración de PHP Activa, lo cual nos permitirá activarla o no según sea su caso, podremos encontrar que esta información no la solicitamos en nuestro archivo Config, pero no importa ustedes pueden agregarla, al final recordemos que como en todas las paginas de esta Web se tendrá un programa de Ejemplo en este caso será un paquete deb.


#Configuración de Apache y PHP
if [ "$webserverconfigure" = "true" ]; then
		if [ -d /etc/apache2/mods-enabled ]; then
                    if [ ! -f /etc/apache2/mods-enabled/actions.load -a ! -h /etc/apache2/mods-enabled/actions.load ]; then
                        ln -s /etc/apache2/mods-available/actions.load /etc/apache2/mods-enabled/actions.load
                    fi
                    if [ -f /etc/apache2/mods-available/php4.load -a -f /usr/lib/apache2/modules/libphp4.so ]; then
                        if [ ! -f /etc/apache2/mods-enabled/php4.load -a ! -h /etc/apache2/mods-enabled/php4.load -a \
                             ! -f /etc/apache2/mods-enabled/php5.load -a ! -h /etc/apache2/mods-enabled/php5.load -a \
                             ! -f /etc/apache2/mods-enabled/php5_filter.load -a ! -h /etc/apache2/mods-enabled/php5_filter.load -a \
                             ! -f /etc/apache2/mods-enabled/fcgid.load -a ! -h /etc/apache2/mods-enabled/fcgid.load -a \
                             ! -f /etc/apache2/mods-enabled/fastcgi.load -a ! -h /etc/apache2/mods-enabled/fastcgi.load ]; then
                            ln -s /etc/apache2/mods-available/php4.conf /etc/apache2/mods-enabled/php4.conf
                            ln -s /etc/apache2/mods-available/php4.load /etc/apache2/mods-enabled/php4.load
                        fi
                    elif [ -f /etc/apache2/mods-available/php5.load -a -f /usr/lib/apache2/modules/mod_php5.so ]; then
                        if [ ! -f /etc/apache2/mods-enabled/php4.load -a ! -h /etc/apache2/mods-enabled/php4.load -a \
                             ! -f /etc/apache2/mods-enabled/php5.load -a ! -h /etc/apache2/mods-enabled/php5.load -a \
                             ! -f /etc/apache2/mods-enabled/php5_filter.load -a ! -h /etc/apache2/mods-enabled/php5_filter.load -a \
                             ! -f /etc/apache2/mods-enabled/fcgid.load -a ! -h /etc/apache2/mods-enabled/fcgid.load -a \
                             ! -f /etc/apache2/mods-enabled/fastcgi.load -a ! -h /etc/apache2/mods-enabled/fastcgi.load ]; then
                            ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
                            ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
                        fi
                    else
                        if [ ! -f /etc/apache2/mods-enabled/cgi.load -a ! -h /etc/apache2/mods-enabled/cgi.load -a \
                             ! -f /etc/apache2/mods-enabled/cgid.load -a ! -h /etc/apache2/mods-enabled/cgid.load -a \
                             ! -f /etc/apache2/mods-enabled/fastcgi.load -a ! -h /etc/apache2/mods-enabled/fastcgi.load -a \
                             ! -f /etc/apache2/mods-enabled/fcgid.load -a ! -h /etc/apache2/mods-enabled/fcgid.load ]; then
                            if /usr/sbin/apache2 -l 2>&1 | grep -qs prefork.c; then
                                cgi=cgi
                            else
                                cgi=cgid
                            fi
                            ln -s /etc/apache2/mods-available/$cgi.load /etc/apache2/mods-enabled/$cgi.load
                        fi
                    fi
                fi
fi
#Reinicial el Apace
if [ "$webserverrestart" = "true" ]; then
/etc/init.d/apache2 restart
fi
#Permisos de Ejecución a los demonios
if [ "$permisos" = "true" ]; then
#Checaremos si tenemos permisos en este caso no lo usaremos pero dejaré un ejemplo.
#recuerden tener mucho cuidado aquí, no queremos dejar agujeros de Seguridad.
echo 'www-data ALL=NOPASSWD:/usr/bin/which >> /etc/sudoers
fi

Ahora bien iremos sobre otra parte demaciado importante de la información como lo son permisos Generales

#Permisos generales a los archivos
chown -R www-data:www-data /var/www/
chmod -R 765 /var/www/
#solo si tenemos ejecutables y queremos que los administre en su momento Apache
chmod +x /var/www/ejemplo/daemons/

Esto es solo por poner un ejemplo, ni siquiera deberíamos meternos con esos directorios.

En este caso haremos algo muy bonito, y lo cual fue un gran y horrible dolor de cabeza y por eso precisamente lo voy a compartir, ya que hay secretos que no comparto y los guardo para mi.


cat << 'END' | sed 's/%DB%/'"$db"'/g;s/%HOST%/'"$hostdb"'/g;s/%USUARIO%/'"$usuariodb"'/g;s/%PASSWORD%/'"$passdb"'/g' > /tmp/ejemplo.sql
#Creamos la Base Ejemplo
CREATE DATABASE IF NOT EXISTS %DB%;
GRANT  SELECT, INSERT, UPDATE, DELETE, REFERENCES, LOCK TABLES, EXECUTE   ON %DB%.* TO '%USUARIO%'@'%HOST%' IDENTIFIED BY '%PASSWORD%';
USE %DB%;
CREATE TABLE IF NOT EXISTS `%DB%`.`Producto` (
`Id` bigint(20) NOT NULL auto_increment,
`Codigo` varchar(100) NOT NULL,
`Nombre` varchar(100) NOT NULL,
`Descripcion` text NOT NULL,
`Imagen` text NOT NULL,
`Precio` double(5,2) NOT NULL,
`Existencia` int(11) NOT NULL,
`ExistenciaMin` int(11) NOT NULL,
PRIMARY KEY  (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
END
haybase="true"
else
echo "No ha podide crearse la base de datos"
haybase="false"
fi

db_reset ejemplo/ejemplo-licencia || true
db_reset ejemplo/ejemplo-hostdb || true
db_reset ejemplo/ejemplo-usuariodb || true
db_reset ejemplo/ejemplo-passworddb || true
db_reset ejemplo/ejemplo-pmysql || true

db_stop

if [ "$haybase" = "true" ]; then
mysql -u root --password="$mysqlroot" < /tmp/ejemplo.sql
echo "Base de datos creada exitosamente"
fi
fi

Esto es para que se den una idea de como se pude ir desarrollando un archivo postinst, aprovecho para comentar que en los próximos días estare algo ocupado así que es probable que no pueda postear tan seguido, tengo mucho trabajo atrapado en cuanto a unos proyectos personales 🙂 si quieren ver el post inicial de esta entrada pueden hacerlo desde aquí

Archivo init.d


Este archivo se utilizará para crear un servicio ( Demonio ), que se iniciará cada vez que se inicie el sistema, servirá para hacer llamadas directas a otros servicios, pueden ser programas en C/ANSI Scripts de shell de perl o pyton técnicamente quedaría como el siguiente, si es que tuviéramos un servicio que quisiéramos iniciar nuestro caso no será ese, pero dejo un ejemplo funcional por si acaso:


#! /bin/sh
#
#
#        Escrito por Francisco Castán Gutiérrez .
#
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMONON=/var/www/samus/daemons/samus.on
DAEMONOFF=/var/www/samus/daemons/samus.off
DAEMONJARDINON=/var/www/samus/daemons/jardines.on
DAEMONJARDINOFF=/var/www/samus/daemons/jardines.off
PEPETO=/var/www/samus/daemons/jardines.off
NAME=samus
DESC=SAMUS4.4

test -x $DAEMONON || exit 0
test -x $DAEMONOFF || exit 0

# Include samus defaults if available
if [ -f /etc/default/samus ] ; then
. /etc/default/samus
fi

set -e

case "$1" in
start)
echo -n "Iniciando $DESC: "
$DAEMONON
$DAEMONJARDINON
;;
stop)
echo -n "Parando $DESC: "
$DAEMONOFF
$DAEMONJARDINOFF
;;
force-stop)
echo -n "Forzando la parada de $DESC: "
$DAEMONOFF
$DAEMONJARDINOFF
;;
reload)
echo "Recargando $DESC: "
$DAEMONON
$DAEMONJARDINOFF
;;
#force-reload)
#      ;;
restart)
echo "Reiniciando $DESC: "
$DAEMONON
$DAEMONJARDINOFF
;;
jardin-start)
echo "Inicialdo Jardines WEB de $DESC: "
$DAEMONJARDINON
;;
jardin-stop)
echo "Parando Jardines WEB de $DESC: "
$DAEMONJARDINOFF
;;
pepeto)
echo "Parando Jardines WEB de $DESC: "
$PEPETO
;;
#status)
#;;
*)
N=/etc/init.d/$NAME
echo "Usa: $N {start|restart|stop|force-stop|reload|jardin-start|jardin-stop|pepeto}" >&2
exit 1
;;
esac

exit 0

Archivo Rules


El archivo rules es quizá uno de los más interesantes junto con el postinst, este archivo nos permitirá hacer varias cosas en este caso nostros lo utilizaremos para copiar los archhivos que hemos puesto en la carpeta /var/www/ de nuestro ejemplo algo asi como /var/www/ejemplo/ y quedará más o menos como el siguiente:


#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

configure: configure-stamp
configure-stamp:
dh_testdir
# Add here commands to configure the package.

touch configure-stamp

build: build-stamp
build-stamp: configure-stamp
dh_testdir

# Add here commands to compile the package.
#$(MAKE)
#docbook-to-man debian/ejemplo.sgml > samus.1

touch $@

clean:
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp

# Add here commands to clean up after the build process.
#$(MAKE) clean

dh_clean

install: build
dh_testdir
dh_testroot
dh_prep
dh_installdirs
cp -R $(CURDIR)/var/www/* $(CURDIR)/debian/ejemplo/var/www/
# Add here commands to install the package into debian/ejemplo.
#$(MAKE) DESTDIR=$(CURDIR)/debian/ejemplo install

# Build architecture-independent files here.
binary-indep: install
# We have nothing to do by default.

# Build architecture-dependent files here.
binary-arch: install
dh_testdir
dh_testroot
dh_installchangelogs
dh_installdocs
dh_installexamples
dh_install
#    dh_installmenu
dh_installdebconf
#    dh_installlogrotate
#    dh_installemacsen
#    dh_installpam
#    dh_installmime
#    dh_python
dh_installinit
dh_installcron
dh_installinfo
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
#    dh_perl
#    dh_makeshlibs
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

obvio la linea que más nos interesa es cp -R $(CURDIR)/var/www/* $(CURDIR)/debian/ejemplo/var/www/ de ahí podemos jugar comentando y descomentando loque no vallamos a autilizar como son los dh_* y para eso podemos hacer un dpkg -L debhelper | grep bin

Comunicar WindowsForm Con Web y JavaScript con C#


Bien en este post veremos como comunicar un pequeño programa que tiene un Control WebBrowser, este accederá a una pagina en html que tendremos en local y utilizará JavaScript para Obtener Datos Simples dentro de otro WebBrowser

Lista de Elementos del Window Form:

  • BrowOrigen(WebBrowser)
  • BrowDestino(WebBrowser)
  • ObtieneDatos(Boton)
  • InvocaAlert(Boton)
  • Mensaje(TextBox)

Primero comenzaremos con el html que debe quedar más o menos asi:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>EjemploWindowsFromWebJavaScript HTML</title>
<script language="javascript" type="text/javascript">
function getMensaje() {
return document.getElementById('Mensaje').innerHTML;
}
function getFragmento() {
return document.getElementById('Fragmento').innerHTML;
}
</script>
</head>
<body>
<div id="Mensaje">Este Mensaje lo ver&aacute;s en el TextBox de la Aplicaci&oacute;n</div>
<div id="Fragmento"><h2 style="color:#0066FF;">Este es un Fragmento que ver&aacute;s en el WebBrowser</h2></div>
</body>
</html>

Dentro de la información de HTML es necesario que las etiquetas de JavaScript contengan los Tags language y type. Despues veremos que el form visualmente debe quedar así:

Luego nos de dicaremos a la parte interesante que es loque trae dentro queda de la manera siguiente:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace EjemploWindowFormWebJavaScript
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string url = AppDomain.CurrentDomain.BaseDirectory + "html\\index.html";
BrowOrigen.Url = new Uri(url);
}
private void InvocaAlert_Click(object sender, EventArgs e)
{
try
{
HtmlDocument htdoc = BrowOrigen.Document;
Mensaje.Text = htdoc.InvokeScript("getMensaje").ToString();
MessageBox.Show(Mensaje.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void ObtieneDatos_Click(object sender, EventArgs e)
{
HtmlDocument htdoc = BrowOrigen.Document;
BrowDestino.DocumentText = htdoc.InvokeScript("getFragmento").ToString();
}
}
}

Si notamos bien lo que nos ayuda a ejecutar funciones de JavaScript es InvokeScript, pueden descargar el ejemplo y jugar con el.

Descargar Ejemplo

Usando JSON, JQuery y .NET con C#


Bien está vez jugaremos un poco con Json y C# haremos un pequeño ejemplo que nos permitirá Serializar cualquier producto Json en una clase para que esta ultima sea usada más fácilmente. Primero descargaremos JQuery (Click con el botón derecho y seleccionar Guardar Como…). Después crearemos un nuevo proyecto de Visual Studio será un  ASP.NET Web Aplication de este modo:

Creando Proyecto

Creando Proyecto

Bien ahora la descripción del programa web, El sistema estará compuesto por un combo con dos elementos, de Estado (Veracruz y México). cada  vez que el combo sea seleccionado, este enviará una tabla de dos elementos al servidor en formato Json

La lista de Archivos que tendremos es la Siguiente:

  • js(Carpeta) [Contiene el JQuery]
    • JQuery.1.1.4.min.js (Descargar)
    • Framework.js [Archivo que contendrá nuestras funciones JavaScript]
  • Clases(Carpeta) [Contiene los archivos JSONHelper y Catalogo]
    • JSONHelper.cs [Contiene el Archivo JSONHelper, que nos permitirá serializar y deserializar el JSON]
    • Catalogo.cs [Es una clase sobre la que se Serializará el String. Sí, pasaremos de String a la Clase Catalogo]
    • Opcion.cs [Calse para obtener la información Seleccionada y Deserializada en JSon]
  • CreaTabla.ashx [Pasaremos el JSON a este archivo utilizando el Ajax de JQuery y el nos mostrará un html con la información]
  • Default.aspx [El contenedor de toda la información]

Continuaremos definiendo el archivo JSONHelper.cs, antes de crear el archivo necesitamos agregar la referencia System.ServiceModel.Web la cual nos permitirá utilizar la información contenida en using System.Runtime.Serialization.Json y agregaremos tambien System.Runtime.Serialization que nos permitirá utilizar los [DataContract] y [DataMember] como podemos ver en la siguiente imagen:

Agregando Referencias

Agregando Referencias

Una vez hecho esto continuaremos con la información de nuestro código queda de la siguiente manera:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace JSONHelper
{
public static class JsonSerializer
{
/// <summary>
/// Método extensor para serializar un string a JSON
/// </summary>
public static string SerializaToJson(this object objeto)
{
string jsonResult = string.Empty;
try
{
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(objeto.GetType());
MemoryStream ms = new MemoryStream();
jsonSerializer.WriteObject(ms, objeto);
jsonResult = Encoding.Default.GetString(ms.ToArray());
}
catch { throw; }
return jsonResult;
}
/// <summary>;
/// Método extensor para deserializar JSON cualquier objeto
/// </summary>;
public static T DeserializarJsonTo<T>(this string jsonSerializado)
{
try
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonSerializado));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
ms.Dispose();
return obj;
}
catch { return default(T); }
}
}
}

Una vez Generada esta clase nos iremos a otra no menos inportante como lo es Catalogo.cs que es muy simple y quedará de la siguiente forma:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
namespace JSONHelper
{
[DataContract]
internal class Catalogo
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Descripcion { get; set; }
}
}

Para poder deserializar el JSON a una clase de .NET es necesario manejar arriba de todas las clases el DataContract y el DataMember sin el como diría un compañero del trabajo sin eso, no somos nada…

Continuaremos con el proximo archivo que sería el Default.aspx en el cual utilizaremos un simple select generado apartir de html  y un contenedor dejandolo de la siguiente manera:


<head runat="server">
<title>Ejemplo de Uso de Json, JQuery y C#</title>
<script src="js/JQuery.1.1.4.min.js" type="text/javascript"></script>
<script src="js/Framework.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<select id="ddEstado" onchange="ObtenerMunicipios()">
<option value="1">Mexico</option>
<option value="2">Veracruz</option>
</select>
<div id="Municipios">
</div>
</form>
</body>
</html>

Noten que el elemento que va a hacer el trabajo dentro del select es el tag onchange=”ObtenerMunicipios()” este se comunicará con el archivo Framework.js permitiendo que JavaScript haga una parte del trabajo. Ahora crearemos el archivo Framework.js que nos permitrá manejar nuestras funciones de JavaScript como en el siguiente código:


/* Información de Nuestro Framework */
function ObtenerMunicipios() {
var Datos = "[{ \"Item\": \"TipoPromocion\", \"Valor\" : \"" + $('#ddEstado').val() + "\" }]";
CargarPagina('#Municipios', 'ObtenerMunicipios.ashx', Datos);
}

function CargarPagina(div, url, datos) {
if (div != undefined) {
$.ajax({
type: "POST",
url: url,
data: datos,
contentType: "application/json; charset=utf-8",
dataType: "json",
beforeSend: function(respuesta) {
$(div).html("Cargando Información...");
},
success: function(respuesta) {
if (respuesta != null) {
$(div).html(RecorreJSON(respuesta));
} else { $(div).html("No existen Municipios para esta opcion."); }
},
error: function(objeto, quepaso, otroobj) {
alert("La busqueda de la información está tomando demaciado tiempo, la Red podría estar saturada, vuelva a intentarlo en unos segundos.");
}
});
}
}

function RecorreJSON(resp) {
var info = "";
$.each(resp, function(i, item) {
info = info + item.Id + " - "
info = info + item.Descripcion + "<br/>"
});
return info;
}

Con esto el código que nos falta es ObtenerMunicipios.ashx que es donde realmente podrémos ver el ejemplo funcionando:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using JSONHelper;
using System.Text;

namespace EjemploJsonJQueryNet
{
/// <summary>
/// Summary description for $codebehindclassname$
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ObtenerMunicipios : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
StringBuilder resp = new StringBuilder();
if (context.Request.ContentType.Contains("json"))
{
var inputStream = new System.IO.StreamReader(context.Request.InputStream);
var inputJson = inputStream.ReadToEnd();
List<Opcion> collectionJson = inputJson.DeserializarJsonTo<List<Opcion>>();
if ((collectionJson[0].Item == "Municipio") && (collectionJson[0].Valor == "1"))
{
resp.Append(ObtenerMunicipiosVeracruz());
}
else if ((collectionJson[0].Item == "Municipio") && (collectionJson[0].Valor == "2"))
{
resp.Append(ObtenerMunicipiosMexico());
}
}
context.Response.ContentType = "application/json";
context.Response.Write(resp.ToString());
}

public string ObtenerMunicipiosVeracruz()
{
List<Catalogo> Municipios = new List<Catalogo>();
Catalogo cat = new Catalogo();
cat.Id = 1;
cat.Descripcion = "Veracruz";
Municipios.Add(cat);
Catalogo cat1 = new Catalogo();
cat1.Id = 2;
cat1.Descripcion = "Xalapa";
Municipios.Add(cat1);
Catalogo cat2 = new Catalogo();
cat2.Id = 3;
cat2.Descripcion = "Boca del Rio";
Municipios.Add(cat2);
Catalogo cat3 = new Catalogo();
cat3.Id = 4;
cat3.Descripcion = "San Andres";
Municipios.Add(cat3);
return Municipios.SerializaToJson();
}

public string ObtenerMunicipiosMexico()
{
List<Catalogo> Municipios = new List<Catalogo>();
Catalogo cat = new Catalogo();
cat.Id = 1;
cat.Descripcion = "Benito Juarez";
Municipios.Add(cat);
Catalogo cat1 = new Catalogo();
cat1.Id = 2;
cat1.Descripcion = "Cuahutemoc";
Municipios.Add(cat1);
Catalogo cat2 = new Catalogo();
cat2.Id = 3;
cat2.Descripcion = "Alvaro Obregon";
Municipios.Add(cat2);
return Municipios.SerializaToJson();
}

public bool IsReusable
{
get
{
return false;
}
}
}
}

Bien con esto terminamos espero les sirva de algo, como siempre dejo un rar con el código de Ejemplo.

Descargar Ejemplo

Actualizacion
Si quieres ver la atualizacion en el manejo de JQuery, Ajax y JSON puedes ver el siguiente post actualizado con MVC4 de .NET aquí