Android corriendo en un iPhone
Que opinará Steve Jobs de este vídeo que muestra como Android OS de Google, corre en su aclamado iPhone, después de haber dicho que Android es para ver porno.
¿Qué es MVC?
El Modelo se encarga de interactuar con la base de datos y también se ejecuta las reglas de negocio.
El Controlador procesa las peticiones de la pagina web (vista), y envía estos datos a la capa modelo, para que esta le devuelva la información adecuada para mostrarla en la capa vista.
La vista es el código HTML que se muestra al usuario, con la información proveniente del controlador.
¿Porqué útilizar MVC?
El fácil mantenimiento de código en un futuro, ya que al estar separadas los distintos procesos según su tipo.
Si quisieramos por ejemplo cambiar de tipo de base de datos, solo tendremos que cambiar la capa modelo.
Para una mejor percepción de esta arquitectura, muestro la transformación de una lista de artículos de un blog.
Este código es lo necesario para cumplir con el proposito de listar los artículos
< ?
// conexion a la base de datos
$cn = mysql_connect('localhost', 'usuario', 'clave');
mysql_select_db('db', $cn);
// consulta SQL para traer los artículos
$resultado=mysql_query('SELECT fecha, titulo FROM articulo', $cn);
?>
Listado de Artículos
Fecha Titulo
< ?php
// recorre el resultado pintando la fecha y titulo
while ($fila = mysql_fetch_array($resultado, MYSQL_ASSOC))
{
echo "";
echo " ".$fila['fecha']." ";
echo " ".$fila['titulo']." ";
echo "";
}
?>
< ?php
//cerramos la conexion
mysql_close($cn);
?> Observaciones
En la misma pagina nos conectamos al servidor ( solo funcionara si es MySQL ) y seleccionamos una base de datos.
Realizamos una consulta (no hay manejo de errores y/o excepciones).
Pintamos el código HTML (combinamos código HTML dentro del código PHP, dejando los tags (
Utilizando el Controlador y la Vista
El ejemplo anterior los separaremos en dos archivos, uno se llamara controlador y el otro vista.
controlador.php
view plaincopy to clipboardprint
< ?
$cn = mysql_connect('localhost', 'usuario', 'clave');
mysql_select_db('db', $cn);
$resultado = mysql_query('SELECT fecha, titulo FROM articulo', $cn);
$articulos = array();
while($articulo = mysql_fetch_assoc($resultado))
{
$articulos[] = $articulo;
}
mysql_close();
require('vista.php');
?>
vista.php
view plaincopy to clipboardprint
Listado de Articulos
| Fecha | Titulo |
|---|---|
| < ?php echo $articulo['fecha']?> | < ?php echo $articulo['titulo']?> |
De esta manera tenemos separada en el controlador.php casi todo el código php con la lógica de negocios, mientras que en vista.php solo recorremos un array con datos.
Lo recomendable en la vista seria utilizar instrucciones PHP mas conocidad, como: if, endif, foreach, endforeach. Y no utilizarlas con llaves “{”, ya que dificulta reconocer donde empieza y termina.
Otro problema seria si queremos utilizar nuevamente el listar articulo en otra pagina, tendríamos que reescribir el controlador.php de nuevo.
Para esto separaremos el controlador(controlador.php) en modelo.php y controlador.php.
Utilizando el Modelo
modelo.php
view plaincopy to clipboardprint
< ?php
function getArticulos()
{
$cn = mysql_connect('localhost', 'usuario', 'clave');
mysql_select_db('db', $cn);
$resultado = mysql_query('SELECT fecha, titulo FROM articulo', $cn);
$articulos = array();
while($articulo = mysql_fetch_assoc($resultado))
{
$articulos[] = $articulo;
}
mysql_close();
}
?>
controlador.php
view plaincopy to clipboardprint
require('modelo.php');
$articulos = getArticulos();
require('vista.php');
Despues de esta separación el controlador quedaría tan solo como un agente para pasar datos del modelo hacia la vista, pero en aplicaciones mas complejas el controlador es quien realiza las tareas de autenticación de usuarios, manejo de sesiones, filtrar y validar entradas de datos por GET o POST.
Cambiando el gestor de Base de Datos
La respuesta seria, cambiar todas las funciones del modelo (mysql_connect, mysql_query, …) por las correspondientes, y eso nos tomaría mucho tiempo.
Para hacer un mejor uso de MVC o mejor dicho cambiando el patrón un poco, se podría separar el modelo en dos capas:
La capa de Acceso a Datos
La capa de Abstracción de la Base de Datos
Si se diera el caso de cambiar de gestor de base de datos, solo tendríamos que actualizar la capa de abstracción de la base de datos
Ejemplo de las dos capas
Abstracción de datos
view plaincopy to clipboardprint
function crearConexion($servidor, $usuario, $clave)
{
return mysql_connect($servidor, $usuario, $clave);
}
function cerrarConexion($cn)
{
mysql_close($cn);
}
function consulta($consulta, $base_datos, $cn)
{
mysql_select_db($base_datos, $cn);
return mysql_query($consulta, $cn);
}
function getResultado($resultado, $tipo = MYSQL_ASSOC)
{
return mysql_fetch_array($resultado, $tipo);
}
Acceso a Datos
view plaincopy to clipboardprint
function getTodosLosArticulos()
{
$cn = crearConexion('localhost', 'usuario', 'clave');
$resultado=consulta('SELECT fecha, titulo FROM articulo', 'db', $cn);
$articulos = array();
while ($articulo = getResultado($resultado))
{
$articulos[] = $articulo;
}
cerrarConexion($cn);
return $articulos;
}
Ahora tenemos la capa de Acceso a Datos sin ninguna dependencia de funciones de alguna gestor de base de datos, y podremos reutilizar las funciones de la capa de abstracción de base de datos en otras funciones de acceso a datos de nuestro modelo.
Soporta los Framework .NET 2.0, 3.0 y 3.5, aportando compatibilidad con Visual Studio Express y Visual Studio 2008. Gracias a que este paquete es de código abierto los desarrolladores pueden crear sus propios añadidos (http://wiki.sharpdevelop.net/3rdPartyAddins.ashx ) para mejorar las cualidades y automatizar tareas a la hora de generar nuestro código fuente.
Integra diferentes herramientas orientadas a la calidad de nuestro código como un potente Debugger que nos permitirá localizar cómodamente los errores, un sistema de análisis de código automático, una unidad de comprobación y lo mejor, un sistema de control de versiones (TortoiseSVN) con el que mantener y compartir el código sin temor a perder nuestros avances.
Te lo puedes descargar en: http://www.icsharpcode.net/OpenSource/SD/
Pagina web: http://www.icsharpcode.net/OpenSource/SD/
Los diez errores más comunes en el diseño de una base de datos
Hola SQLeros,Louis Davidson es un experto en el diseño de Base de Datosy es autor del libro SQL Server 2005 Database Design and Optimization en el artículo aquí enlazado presenta los diez errores más comunes en el diseño de una BD que el ha detectado a lo largo de su experiencia:
- Mala planeación del diseño
- Ignorar la normalización
- Estándares de nomenclatura deficientes
- Falta de documentación
- Una sola tabla para guardar todos los valores del dominio
- Usar columnas GUID como la única llave de una tabla
- No usar las funcionalidades SQL para preservar la integridad de los datos
- No usar Stored Procedures para acceder a los datos
- Intentar construir objetos genéricos en los stored procedures
- Falta de pruebas
En mi experiencia la mayoría de los desarrollos donde he trabajado presentan algunas de estas deficiencias en su base de datos. Creo yo que en muchos de los casos es porque se deja a un programador diseñar la base cuando debe ser haber un DBA involucrado en el proceso. Se que muchos proyectos no pueden pagar el sueldo de un DBA en exclusivo pero creo que al menos debe haber un DBA por organización que supervise el diseño elaborado por los programadores, lo mejore y le de su visto bueno.
Con las bases de datos pasa como con el diseño web, cuando se deja en manos de un programador elresultado puede ser un desastre e imagino que la mayoría de ustedes ha tenido que lidiar con chapuzas como una tabla totalmente desnormalizada (digo a veces está bien desnormarlizar para ganar en desempeño pero hay límites) y que necesita de 5 o más campos para tener una llave compuesta (y dile adios a tu idea de usar un ORM para la capa de datos), o una tabla con 20 campos que se llaman campo1, campo2, .. campoN y que nadie en la organización sabe que diablos es el campo7 o quién era el encargado de actualizarlo pero sin él tu aplicación no funciona, en fin no seguiré descargando mi frustración aquí . En mi opinión una forma de evitarle frustraciones a los otros programadores es que, dado que las empresas no van a querer pagar un DBA para auxiliarte en el 70% de los casos,nosotros nos documentemos con artículos como el de Louis para realizar un mejor trabajo que programar no es solo usar Spring o el último patrón de diseño.
Snaptü: Facebook, Twitter y Más En La Palma de Tú Mano!
Facebook tiene una muy bien conocida versión móvil de su web que en la mayoría de los casos sirve para realizar las actividades más comunes dentro de nuestra red social favorita desde cualquier dispositivo móvil que pueda navegar al menos sitios wap, y de hecho es la forma en la que lo utilizan miles de personas que tienen más a mano su celular que una computadora en muchas ocasiones. Pero como toda versión móvil de un sitio web, sus características y uso resultan muy limitados en experiencia y funcionalidad, y mientras que en Windows Mobile ya existe una aplicación oficial de Facebook creada por Microsoft al mismo tiempo que casi todo sistema operativo para smartphones tiene al menos una similar en calidad, en un celular común es más difícil conseguir algo por el estilo para despegarse de la muchas veces incómoda versión móvil de su sitio web.
Una buena opción que se puede usar si se atraviesa por este dilema es Snaptu, una aplicación compatible con cualquier celular que admita aplicaciones Java J2ME, y que consiste es una plataforma de widgets con diversas funciones y servicios. Aunque está orientado mayormente al mercado británico, este servicio permite utilizar a Facebook desde su aplicación móvil como un widget más, permitiéndonos una forma de ingresar mucho más dinámica y con más practicidad que desde su web móvil. Con Snaptu Facebook se pueden ver y enviar mensajes a nuestros contactos fácilmente, ver imágenes de los mismos en pantalla completa, y también tendremos la opción de enviarles una invitación para que descubran Snaptu. En el video a continuación puede verse la fluidez de su interface.
Para descargar la aplicación de Snaptu sólo hace falta ingresar con el celular a m.snaptu.com, cabe señalar que en el video esta en ingles, pero se puede cambiar el lenguaje de la aplicación. Existiendo también un video disponible que muestra como hacerlo paso a paso desde uno, aunque también se puede ingresar desde una PC y luego transferir la aplicación al teléfono vía el cable de datos. Como sucede en todos los casos en los que se usa una aplicación que realiza consumo intensivo de transferencia de datos por Internet, hay que tener en cuenta si utilizamos Snaptu muy asiduamente que a menos que tengamos algún plan de datos contratado con nuestro operador de telefonía celular ó activada la opción de banda ancha ramms y también debemos ser conscientes de las posibles implicancias con respecto a la privacidad cada ves que habilitamos el acceso a una cuenta nuestra, en este caso de Facebook, a un tercero. Si tenemos estos dos temas cubiertos, Snaptu Facebook es una alternativa ideal para evitar la limitada web móvil de Facebook y utilizarlo de una forma más placentera y práctica.
Un Saludo!
VSTS 2010. Herramientas de Diseño y Arquitectura
Plataforma de Microsoft Ibérica, nos habla sobre las novedades que incorpora el nuevo Visual Studio 2010 para los arquitectos de software.
César presenta de forma práctica algunas de estas novedades, desde el soporte integrado para UML 2.1, pasando por la arquitectura por capas y terminando con el nuevo Architecture Explorer.
Agencia Espacial Mexicana
Tuvieron que pasar cuatro años para que laAgencia Espacial Mexicana fuera realidad. Con 280 votos a favor en la Cámara de Diputados, los legisladores aprobaron este martes la creación de este nuevo organismo que coordinará la política espacial de México. La iniciativa fue presentada en abril de 2006, y después de numerosas modificaciones y discusiones, al fin ha sido aprobada su creación.
José Hernández, astronauta mexico-americano, ha mostrado su alegría porque el país cuente con un proyecto espacial. Hernández ha aceptado la propuesta de los legisladores para fungir como asesor de la agencia. El presupuesto inicial del organismo será de 10 millones de pesos, y se empleará en esta primera etapa para el diseño institucional. Aún no se define la sede, aunque el estado que cuenta con más posibilidades para albergarlo es Hidalgo, seguido de Campeche yYucatán. El objetivo es que la Agencia Espacial Mexicana no sólo sea un organismo descentralizado, sino también autosuficiente.
La Agencia Espacial Mexicana estará conformada por un consejo de quince integrantes, y será encabezada por el Secretario de Comunicaciones. Entre los integrantes estarán subsecretarios de Gobernación, Relaciones Exteriores, Educación Pública, Hacienda, Defensa Nacional y Marina; así como los rectores de la Universidad Autónoma de México (UNAM), del Instituto Politécnico Nacional (IPN), entre otros miembros del ámbito académico.
La creación de la Agencia Espacial Mexicana ha desatado un debate encarnecido en diferentes sectores de la población (basta darle un vistazo a los comentario del periódico El Universal). Mientras unos lo ven como un gran impulso para el desarrollo científico y tecnológico del país, otros lo ven como un despilfarro presupuestal y un gasto en un rubro innecesario. ¿Inversión o capricho? La mejor opinión, como siempre, es la de ustedes. ¿Qué opinan del nacimiento de esta nueva agencia?
Crear Servicio Web En PHP Con NüSoap
2.- Después descomprimes ese archivo y lo copias a tu sitio web (para este ejemplo el sitio se llama miwebservice y los archivos de NuSOAP los puse en un directorio llamado lib-nusoap.
3.- Luego ejecutas en tu Servidor MySQL el script de la Base de Datos db_productos.sql que lo puedes descargar desde esta pagina.
4.- Luego crea una pagina PHP (en este ejemplo la pagina se llama servicioweb.php) y codificas lo siguiente:
[sourcecode language="php"]
< ?php
require_once('lib-nusoap/nusoap.php');
$server = new soap_server;
$ns="http://localhost/aplicativo"; // espacio de nombres; Sitio donde estará alojado el web service
$server->configurewsdl('MiWebService'); //nombre del web service
$server->wsdl->schematargetnamespace=$ns;
/************ REGISTRANDO EL ARRAY A DEVOLVER(array de productos) **************/
$server->wsdl->addComplexType(
'ArregloProductos', // Nombre
'complexType', // Tipo de Clase
'array', // Tipo de PHP
'', // definición del tipo secuencia(all|sequence|choice)
'SOAP-ENC:Array', // Restricted Base
array(),
array(
array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:Productos[]') // Atributos
),
'tns:Productos'
);
/************ REGISTRANDO LA ESTRUCTURA DE DATOS PRODUCTOS **************/
$server->wsdl->addComplexType('Productos', 'complexType', 'struct', 'all', '',
array(
'ProductoID'=> array('name' => 'ProductoID','type' => 'xsd:int'),
'Nombre' => array('name' => 'Nombre', 'type' => 'xsd:string'),
'Precio' => array('name' => 'Precio', 'type' => 'xsd:string')
)
);
/*METODO DEL WEB SERVICE*/
function ListarProductos($estado){
if($estado!=''){
$db = new mysqli(); //mysqli exclusivo para usar procedimientos almacenados
$db_result = $db->connect ("localhost", "root", "","db_productos");
$sql=sprintf("call usp_ListarProductos('%s');",$estado); //intentando filtrar el SQL Injection
$result = $db->query($sql);
if (mysqli_errno($db)) printf("mySQL error %s\n", $db->error); //si es que hubo error se muestra
$db->close();
$i=0;
if($result->num_rows>0){
while($row = mysqli_fetch_assoc($result)){
$toc[$i]['ProductoID'] = $row["producto_id"];
$toc[$i]['Nombre'] = $row["nombre"];
$toc[$i]['Precio'] = $row["precio"];
$i++;
}
$result->free; //liberando memoria
return $toc;
}
}
return '';
}
/************ REGISTRANDO EL METODO **************/
$server->register(
'ListarProductos', // Nombre del Método
array('estado' => 'xsd:string' ), // Parámetros de Entrada
array('return' => 'tns:ArregloProductos') //Datos de Salida
);
/******PROCESA LA SOLICITUD Y DEVUELVE LA RESPUESTA*******/
$input = (isset($HTTP_RAW_POST_DATA)) ? $HTTP_RAW_POST_DATA : implode("\r\n", file('php://input'));
$server->service($input);
exit;
?>
[/sourcecode]
Si deseas puedes descargar el ejemplo completo desde aquí. Varios usuarios me han hecho la observación en la cual no funciona el código, esto es por el nombre de la carpeta comprimida que llame SQLeros-NüSoapEjemplo.zip, para que funcione bien solo cambienle el nombre por: SQLeros-NuSoapEjemplo.zip
También veremos como consumir el servicio desde C#,VB.Net y Java. Saludos
Ctrl Alt Supr
Enero de 2004. La prensa especializada deja caer entre sus artículos uno dedicado a un ingeniero de IBM que despues de muchos años abandona la empresa. ¿Qué puede tener de especial una persona para merecer ese titular? El protagonista de esta historia se llama David J. Bradley. Tiene 55 años. Formó parte del equipo que creó el primer ordenador personal. Debe sus quince minutos de fama a haber sido quien ideó la combinación de teclas "Control+Alt+Supr" para reiniciar un ordenador.
Por esta razón Bradley entra en el Club de los Históricos de ARRAI.
¿Cuantas veces hemos usado esta combinación de teclas para reiniciar nuestros equipos? El "Control+Alt+Supr" (en inglés "Control+Alt+Delete") es uno de los pequeños iconos culturales del mundillo de la informática.
Corría el año 1981. 12 ingenieros, "los 12 del patíbulo", creaban en los laboratorios de IBM situados en Boca Ratón, Florida, el primer ordenador personal, el IBM-PC. Entre ellos estaba David J. Bradley. Fue el encargado de diseñar la BIOS de aquel primer equipo de uso doméstico. El resto de su trabajo para el "gigante azul" queda empañado por la anécdota: la creación del código de reinicio del PC.
El ingeniero David Bradley
Entró en IBM en 1975, y formó parte a partir de 1980 del equipo que desarrolló el primer ordenador personal. Entre otras cosas, es responsable del código de la ROM BIOS que llevaban los primeros PCs. Despues de 28 años y medio en IBM, Bradley la abandonó en enero de 2004. En la actualidad continúa impartiendo clase en la Universidad Estatal de Carolina del Norte. Para este ingeniero en electricidad e informática, cuantos más estudiantes vayan a carreras de ciencia y tecnología, mayor será la fuerza económica del país (en su caso, de los Estados Unidos).
Control Alt Delete
¿Por qué se desarrolló esta función? Bradley explica que a principios de los 80 en IBM se estaban haciendo pruebas de forma intensa con nuevo hardware y nuevo software. Esto provocaba que los ordenadores se quedasen colgados con facilidad. Para volver a arrancar un equipo era necesario apagarlo, esperar unos segundos a que reposara para no provocar daños al hardware, volver a arrancarlo y esperar por las rutinas de autocomprobación que ejecutaba el PC. Se tardaba más de un minuto en volver a tener el equipo operativo.
La idea de Bradley era crear un mecanismo que permitiese el reinicio "en caliente", sin tener que seguir todo ese proceso. El ahorro de tiempo era considerable, y por eso esta funcionalidad, que en un principio estaba destinada únicamente a ser conocida por los desarrolladores de IBM, se difundió paulatinamente entre el público.
¿Porqué esas tres teclas?
¿Por qué estas tres teclas? Se trataba de encontrar una combinación que no se pudiese teclear por accidente. Se eligieron dos teclas de uso poco común (Control y Alt) y la tercera se buscó justo al otro lado del teclado. Al principio Bradley pensó en la tecla "+", pero creyó que DELETE tendría más sentido. Una vez definida la solución, Bradley afirma que programarla no le llevó más de cinco minutos.
La actualidad de "Control Alt Delete"
Ya no es lo que era, ahora es más. Las versiones de Windows 2000 y XP capturan esta combinación y ofrecen un panel de opciones: el administrador de tareas, cerrar sesión o apagar de forma civilizada. En los casos extremos en que esto ya no funciona, no hay más remedio que volver al fatídico botón de reset.
Tambien se incorpora en Windows 2000 para arranque de sesión, con lo que "Control+Alt+Supr", tambien conocido como "La llave de Vulcano", o "El saludo de los tres dedos", ha dejado definitivamente de ser un truco no escrito a ser una combinación de teclas de obligado conocimiento, mucho más usada si cabe.
Hacerlo famoso
Cuando se celebraba el vigésimo aniversario de la creación del Pc, compartían escenario en una mesa redonda Bill Gates y David Bradley, entre otros. Durante una parte del evento, el tema de conversación era el mecanismo de reinicio. En el vídeo cuyo enlace ofrecemos se puede oir a Bradley bromeando con Gates, aunque este último no pone cara de estar divirtiéndose. Bradley dice: "Hacerlo llevó cinco minutos, no sabía que iba a crear un icono cultural. Pero tengo que compartir el mérito, puede que yo lo haya inventado, pero ha sido Bill el que lo ha hecho famoso."
Seguramente, Bradley fue el primer sorprendido por la fama alcanzada por su código. Algo que en principio era simple, que no llevó más de cinco minutos, se acaba convirtiendo en un icono cultural. Quizá esto nos puede enseñar a apreciar los detalles y los trabajos pequeños. Si están bien hechos y son útiles, pueden convertirse en algo con un gran significado.
La idea de Bill Gates es distinta. Adoptó el código de Bradley, le era útil y lo utilizó como un complemento para construir algo mayor. Es tambien una forma de ver como lo que hacemos, si lo compartimos, puede servirle a otra gente. Aunque podemos adivinar que Gates hubiese preferido que el "Ctrl+Alt+Supr" no fuese tan conocido por sus usuarios.
Ahora una rola del reno renardo al respecto.
Wow Ebook.Com
Una página en la cual podremos ver una gran gama de manuales, tutoriales,libros de referencia,etc.
Ampliamente recomendable proporciona material muy bueno y sobre todo …
Bueno ya se darán cuenta.
Un Saludo SQLeros.
SQLeros: LINQ to SQL En ASP.Net
Un videotutorial para hacer altas, bajas, eliminaciones y consultas con LINQ to SQL, fácilmente en ASP.Net, Un saludo!
Exporta Datos Fácilmente desde PHP a Excel
Soporte Mono Touch para Ipad
Microsoft SQL Server es superior a la de MySQL o no? ¿Cuáles son los pros y los contras de utilizar de SQL Server a través de MySQL? MySQL es lo suficientemente maduros como para competir con un gran jugador como Microsoft y Oracle? ¿Podemos comparar ambos productos bastante?
Solución
En mi modesta opinión, no hay una respuesta sencilla a esta pregunta, porque no estamos comparando manzanas con manzanas.Microsoft SQL Server es una base de datos ricos de la característica en comparación con MySQL sin embargo, el objetivo de MySQL no es mantener con MSSQL u Oracle lugar, las prioridades de MySQL son la fiabilidad, rendimiento y facilidad de uso.
Así pues, en mi opinión, la respuesta a la pregunta "¿superior de SQL Server a MySQL o no" es: depende. Depende del tipo de aplicación, el medio ambiente y el presupuesto que tenemos que trabajar.
En el nivel básico, MySQL y SQL Server tienen mucho en común. La siguiente tabla resalta las principales.
- De alta disponibilidad de base de datos en clúster
- SQL Server se basa en tecnología de clustering de Microsoft
- MySQL tiene su propia parte clúster de motor nada de almacenamiento (NDB)
- ANSI SQL, subconsultas, se une, cursores, sentencias preparadas
- Procedimientos almacenados, disparadores, SQL y funciones definidas por
- Vistas actualizables
- Transacciones ACID con Commit, Rollback
- Transacciones distribuidas
- Bloqueo a nivel de
- Snapshot / Consistente lecturas repetibles (los lectores no bloquean los escritores y viceversa)
- Server cumplir la integridad referencial
- Fuerte apoyo de datos de tipo (numérico, VARCHAR, BLOB, etc)
- De alta precisión tipos de datos numéricos
- Indexación (agrupado, B-tree, hash, de texto completo)
- Cachés de memoria dinámica de
- Optimizador basado en costos
- Unicode, UTF-8
- XML, XPath
- Apoyo Geoespacial
- Replicación
- Y el índice de la tabla de particiones
- VLDB (terabytes) capaz
- De alta velocidad, datos de utilidad de carga de
- Online Backup con el punto en el tiempo de recuperación
- Reinicio automático / Crash Recovery
- Automatic Storage Management (auto-expansión, administración rollback)
- Comprimido y Archivo de la mesa
- Esquema de información / del diccionario de datos
- De Seguridad (GRANT / REVOKE, SSL, los privilegios de objetos de grano fino)
- Construido en el cifrado y descifrado de datos
- Construido en el Programador de tareas
- Drivers (ODBC, JDBC,. NET, PHP, etc)
- GUI de gestión y desarrollo de herramientas de
En mi opinión, con el lanzamiento de SQL Server 2008, Microsoft ha introducido características sólidas y valiosas como el apoyo paralelo para los objetos con particiones, cifrado de datos transparente, que regulan los recursos, el rendimiento de recogida automatizada de datos, captura de datos modificados (CDC), y mucho de lo que es no está disponible en cualquier versión de MySQL.
Si nos fijamos como algunas funcionalidades, podemos observar que tanto MySQL y SQL Server admiten SIG Sin embargo, SQL Server es más robusto que MySQL. Planificador de tareas de Microsoft es mejor y más fácil de usar luego de MySQL.
Por otra parte, creo que MySQL proporciona más opciones para diversos tipos de particiones: MySQL ofrece la gama, hash, clave, lista, y la partición compuesto mientras que SQL Server sólo ofrece la gama. Por otra parte, me parece partición MySQL es mucho más fácil de usar ya que está definido el derecho a la tabla a través de DDL durante el tiempo de creación frente a la creación de objetos de partición en SQL Server (esquemas de partición y funciones) que luego son aplicadas a las tablas.
/ * Ejemplo de MySQL de la partición Rango * / |
/ * SQL Server muestra de mapas de todo el esquema de partición Rango partición mismo grupo de archivos * / |
A continuación se muestra un ejemplo de una partición de la lista (sólo disponible en MySQL). La principal diferencia con la gama de particiones es que, en la lista de particiones, cada partición se define y seleccionados en base a la pertenencia de un valor de columna en uno de una serie de listas de valores, en lugar de en uno de una serie de áreas contiguas de los valores.
/ * Lista de partición de MySQL * / |
Seguridad de SQL Server es la forma superior y más robusto que MySQL. Con MySQL no se pueden definir funciones o dependen de la autenticación externa (OS de autenticación). Sólo se puede restringir el acceso basado en el nombre de usuario y la IP de origen, además, capacidades de auditoría son bastante débiles en comparación con SQL Server ..
En este punto, parece claro que SQL Server tiene más características que MySQL, sin embargo es importante prestar atención a un estudio de investigación realizado por Forrester Research, que afirma que el 80% de las instalaciones de base de datos actual sólo hacen uso de alrededor del 30% de la conjunto de características de proveedor. Así que, antes de escoger una plataforma de base de datos debemos preguntarnos qué función y las características de base de datos son necesarios para el negocio específico.
Me gustaría concluir este extremo, enumerando las características que he utilizado y que más me gusta en ambas plataformas de base de datos:
Microsoft SQL Server 2005/2008
- DMV
- Database Mirroring
- Instantánea de base de datos
- Extended Events
- Auditoría
- Cifrado de datos transparente
- Captura de datos modificados (CDC) de
- El regulador de recursos
MySQL 5.x y por encima de
- Capacidad para funcionar en varios SO
- Compartir Nada Cluster
- Fácil de escalar en los productos básicos de hardware
- MySQL Proxy
- Replicación
- Motores de almacenamiento de múltiples
Próximos pasos
Creo que tanto las tecnologías de base de datos están preparados y lo suficientemente maduros para ser utilizado en entornos de producción del mundo real. En mi opinión, la adopción de una sobre la otra tecnología depende del presupuesto disponible y, sobre todo, necesidades y requisitos de SLA. Creo que, si tenemos un buen diseño de base de datos general y la aplicación, podemos sacar el máximo provecho de ambas tecnologías y usarlas donde son más adecuados y convenientes.
Sistema de Boletaje para Terminales de Autobuses
En hora buena y que este año todos los deseos e ilusiones se vuelvan en logros y satisafcciones.
Un saludo!!
Compartir sesiones con MySql en diferentes servidores
Muchos sitios necesitan correr desde varios servidores, por ejemplo para aprovechar la localidad
de los usuarios con respecto al servidor, para balancear la carga, para compartir usuarios registrados o simplemente como resguardo
por si alguno de los sitios falla. Uno de los aspectos a contemplar para este menester es el
manejo de sesiones, aqui explicamos como mantener sesiones entre multiples servidores.
Descripcion del problema
Supongamos que tenemos 2 servidores que corren el mismo sitio por ejemplo mexico.foo.org y espana.foo.org,
los sitios pueden ser exactamente iguales o bien tener algunas diferencias entre si, lo que es claro es que
los usuarios de foo.org pueden comenzar por cualquiera de los sitios y moverse de un sitio a otro si les
parece conveniente
Sesiones
El uso de sesiones permite mantener presistencia entre las distintas paginas de un site en forma limpia
y eficiente, PHP4 permite manejar sesiones en forma sumamente sencilla, por ejemplo:
session_start(); |
Todas las paginas que usen sesiones deben empezar con session_start() o al menos hacer el session_start() antes de generar cualquier tipo de salida al browser. Una vez inicializada la sesion se utiliza session_register para guardar una variable en la sesion, notar que a session_register se le pasa elnombre de la variable y no la variable misma.
Una vez registrada la variable podemos tener otra pagina php distinta con:
session_start(); |
Y la variable $data tomara el valor "hola" ya que habia sido guardada en la sesion con dicho nombre, se puede tambien
eliminar variables de la sesion y algunas otras cosas mas, pueden encontrar el manual en español sobre el uso de sesiones en esta direccion
Bien, podemos suponer ahora que sabemos usar sesiones, las sesiones son muy utiles para llevar datos pertenecientes
al usuario, como por ejemplo su userid u otros datos importantes, si tenemos dos servidores para el mismo sitio es logico
que la sesion se mantenga cuando el usuario pasa de un sitio a otro, pero esto no ocurre automaticamente
El problema
Internamente y sin modificaciones PHP4 guarda los datos de las sesiones en /tmp, periodicamente el mecanismo de "garbage collection" elimina las sesiones vencidas, la duracion maxima de una sesion sin actividad puede configurarse en php.ini (usualmente en /usr/local/lib). Como es evidente al cambiar de un servidor a otro el segundo no tiene acceso al directorio /tmp del primero por lo que la sesion se pierde, el session_start del nuevo servidor mas que abrir la sesion anterior debe crear una nueva y perdemos los datos que veniamos arrastrando en la sesion
Una primera alternativa que funciona es usar NFS para que los dos servidores puedan acceder a /tmp en un mismo lugar, sin embargo, esto no siempre es posible y muchas veces no queremos usar NFS unicamente por esta razon.
La solucion al problema
La solucion mas practica al problema de la persistencia de la sesion entre multiples servidores reside en usar una base de datos, por ejemplo MySQL, para almacenar los datos de la sesion. De esta forma ambos servidores pueden acceder a la misma base de datos (en un solo servidor) para consultar los datos de la sesion. Tantos servidores como deseemos pueden compartir la sesion siempre y cuando puedan acceder al mismo servidor MySQL.
Para que los datos de la sesion se guarden en MySQL es necesario modificar la forma en que PHP maneja sesiones
Cambiando los Session-Handlers
PHP4 dispone de un mecanismo que permite cambiar la forma en la cual se almacenan las sesiones por cualquier metodo que el usuario desee, para ello se usa la funcion session_set_save_handler. La funcion recibe 6 parametros que son los nombres a 6 funciones que se describen a continuacion:
- Primera funcion:Abrir la sesion
- Segunda funcion:Cerrar la sesion
- Tercera funcion:Leer los datos de la sesion
- Cuerta funcion:Escribir los datos de la sesion
- Quinta funcion:Destruir una sesion
- Sexta funcion:Eliminar sesiones vencidas
Por ejemplo:
session_set_save_handler ( |
En el ejemplo seteamos los nombres de las 6 funciones que seran usadas para manejar sesiones, veamos ahora que
prototipo debe tener y que hace cada funcion
| Funcion | Prototipo | Descripcion |
| mysql_session_open | mysql_session_open($sess_path, $session_name); | Esta funcion es llamada para inicializar la sesion, recibe el path en donde guardar las sesiones si se usan archivos y el bombre de la sesion, en MySQL ninguno de los parametros nos interesa |
| mysql_session_close | mysql_session_close() | Esta funcion se llama cuando la pagina termina y el handler necesita dejar cerrado el archivo o lo que sea que haya usado para mantener la sesion, no elimina la sesion solo deja todo listo para volver a abrirla con open |
| mysql_session_read | mysql_session_read($key) | Esta funcion se usa para leer los datos asociados a una sesion,las sesiones se identifican por una clave que se recibe como parametro, no es necesario preouparse por los datos que se recuperan ya que esto lo maneja php4 internamente, si el usuario registra 4 variables los handlers solo guardan y recuperan un par clave-valor, la forma en que las 4 variables se serializan y desserializan esta a cargo del PHP |
| mysql_session_write | mysql_session_write($key,$val) | Esta funcion se usa para almacenar el contenido de la sesion indicada por $key, $val tiene todas las variables de la sesion serializadas y listas para ser almacenadas.Est funcion se suele llamar al final de cada script antes de hacer el close. |
| mysql_session_destroy | mysql_session_destroy($key) | Es invocada para eliminar los datos de una sesion. |
| mysql_session_gc | mysql_session_gc($maxlifetime) | Esta funcion debe eliminar todas las sesiones que tengan mas de $maxlifetime segundos de vida. |
Preparando la base para guardar sesiones
Una vez que hemos analizado como funcionan los handlers es bueno analizar como vamos a guaradar la informacion en MySQL, si entendimos bien el mecanismo solo necesitamos guardar algo de tipo clave-valor por cada sesion y ademas un timestamp que permita saber hace cuanto tiempo que no se usa la sesion. Podemos crear una tabla de la forma:
DROP TABLE IF EXISTS PHPSessions; CREATE TABLE PHPSessions ( SessionID CHAR(32) NOT NULL PRIMARY KEY, LastActive INTEGER NOT NULL, Data TEXT ); |
SessionID es la clave de la sesion, LastActive la ultima fecha de uso de la sesion y Data los datos de la sesion, notemos que al estar definida como PRIMARY KEY la columna SessionID esta indexada lo cual agiliza mucho el manejo de sesiones cuando hay miles de usuarios en el sistema.
Handlers para Mysql
Analicemos ahora que debe hacer cada funcion para almacenar las sesiones en Mysql
| Funcion | Descripcion |
| mysql_session_open($path,$name); | En esta funcion tenemos que abrir la conexion a la base, usar mysql_pconnect con una conexion persistente es muy recomendable, ademas seleccionamos la base con mysql_select_db. Los dos parametros que recibe la funcion se ignoran. |
| mysql_session_close(); | Aqui no hace falta hacer nada ya que no es necesario cerrar la conexion a la base |
| mysql_session_read($key); | Esto es simplemente un select a la base y devolvemos la columna data para la clave recibida. Ademas actualizar el timestamp del registro. |
| mysql_session_write($key,$data); | Aquie hay que hacer un update si la sesion ya existe o bien un insert en caso contrario. Ademas actualizamos el timestamp del registro. |
| mysql_session_destroy($key); | Un simple delete de la base |
| mysql_session_gc($maxlifetime); | Borramos de la tabla todos los registros para los cuales la diferencia entre el ultimo tiempo de acceso y el actual sea mayor al parametro recibido |
El codigo
Una vez analizado que es lo que hay que hacer solo resta programarlo, a continuacion presentamos el codigo y que pueden obtener tambien desde este link
<? |
Como usar el los nuevos handlers
Para usar los nuevos handlers tenemos que, en primer lugar crear la tabla PHPSessions con el codigo provisto para alguna base mysql, si se quiere se puede crear una nueva base para las sesiones, una vez creada la tabla modificar el script con los handlers indicando HOST,USER,PASS y BASE en la funcion mysql_session_open, luego solamente resta poner el script en el servidor y hacer un include del mismo "antes" del session_start, y eso es todo, pueden probarlo y ver como los datos se almacenan en la tabla y se mantiene la persistencia de la sesion. Para usarlo en otro server el proceso es el mismo, no olviden poner correctamente el HOST, USER,PASS en la funcion de conexion para que los dos servidores se conecten a la misma base MySQL.
Conclusiones
Las tecnica que hemos descripto permite compartir sesiones facilmente entre servidores y ademas ha demostrado ser
mucho mas limpia y eficiente incluso en instalaciones con un unico servidor, esta es una de las cosas a tener en cuenta
cuando nos lancemos a construir multiples sitios o sitios que quieran compartir usuarios en forma limpia y efectiva.
Silverlight: Universal GUI toolkit
The upcoming version of Silverlight will no longer be a Web-only technology. It will now be possible to build full desktop applications with Silverlight.
Desktop Silverlight applications differ from the standard Silverlight in a few ways:
- Full access to the host file system, like any other .NET application would have.
- None of the socket connectivity limitations that are present on the sandboxed versioned of Silverlight. Full network access (we should build a MonoTorrent UI for it!)
- Built-in Notifications API to show up bubbles to the user when they need to interact with the application.
Although Moonlight has supported this mode of operation since day one, turning this into a standard way to develop applications was going to take a long time. We would have needed to port Moonlight to Windows and OSX and then we would have to bootstrap the ecosystem of "Silverlight+" applications.
But having Microsoft stand behind this new model will open the gates to a whole new class of desktop applications for the desktop. The ones that I was dreaming about just two weeks ago.
This was a big surprise for everyone. For years folks have been asking Microsoft to give Silverlight this capability to build desktop apps and to compete with Air and it is now finally here. This is a case of doing the right thing for users and developers.
Desktop Tools in Silverlight?
Now that this technology is available, perhaps it is a good time to start a movement to create a suite of Silverlight-based desktop applications.
The benefits to me are many:
- .NET applications that actually look good. In the past your choices were basically of Gtk# or Winforms, neither one really designed for this graphic-designer driven world.
- We can join forces with Windows/MacOS developers to create the next generation of desktop applications.
- Developers can tap into the large ecosystem of third-party controls that exists for Silverlight.
For the Moonlight team, this means that there is a lot of work ahead of us to bring every Silverlight 3 and 4 feature. I think I speak for the whole Mono team when I say that this is exciting, fascinating, challenging and feels like we just drank a huge energy boost drink.
If you want to help, come join us in the #moonlight or #mono channels on the IRC server at irc.gnome.org.
Silverlight 4
There are many other great features in Silverlight 4, but none as important as Silverlight becoming a universal runtime for the CLR. This is a revolution.
If you are curious about all the new tactical features of the revolution, check Tim's Complete Guide to the new Silverlight Features.
If you have the time, watch Scott's keynote's presentation where he introduced the new features (he starts at 1:02). I loved the use of HTML as a Silverlight brush (paint with HTML and even Flash). If you have time, these are some great sessions on Silverlight:
- Microsoft Silverlight 4 Overview: A good intro, repeats a lot from Scott's keynote.
- Improving and Extending the Sandbox with Silverlight 4: Joe Stegman's presentation on the revolution.
- RIA Services: The technique that lets you "remove four acronyms" from your development, mindblowing.
Invocar funciones PHP desde Flex con AMFPHP
Adobe Flex es un framework de desarrollo que nos permite crear rápida y facilmente aplicaciones RIA (Aplicaciones de Internet Enriquecidas), basado en la plataforma Flashcombinando el lenguaje de marcas MXML y ActionScript. También, gracias a su entorno de desarrollo se simplifica el desarrollo de aplicaciones AIR.
En esta oportunidad quiero explicar cómo hacer uso de Flex para invocar funciones hechas enPHP (no entraré en detalles, pues no conozco a fondo ActionScript). Una forma de hacerlo es mediante AMFPHP. Pero ¿qué es AMFPHP? Es un RPC (Llamada a Procedimientos Remotos) que nos permite comunicar datos de aplicaciones-funciones entre el cliente (JavaScript, Flash, Flex, etc) y servidor (PHP, ASP, JSP, etc). En este caso AMFPHP realiza la comunicación de procesos remotos entre Flash (y por extensión aplicaciones RIA en Flex y AIR) y PHP.
Vamos por paso para la implementación de un proyecto en Flex que llame a funciones en PHP.
1. Descargar y extrae la carpeta amfphp que contiene la siguiente estructura (y para no perderse en el tutorial, colocala en la raíz de tu sitio web de tal forma que quede así:http://localhost/amfphp)
+ ampphp
+services
+core
+browser
-gateway.php
-globals.php
-.htaccess
-json.php
-xmlrpc.php
-phpinfo.php
2. Verificar el funcionamiento del amfphp. Para ello abres tu navegador y escribeshttp://localhost/amfphp/browser. Aparecera una ventana de configuración donde se muestra la ubicación del archivo gateway que actuará como puerta de enlace. En esta ventana solo dale clic en Save.
Podrás apreciar un especie de explorador. En la vista árbol a tu izquierda se mostrarán todas las clases en PHP que podemos usar. Para que una clase aparezca allí debes guardarla en el directorio services.
3. Vamos crear una clase en PHP. Vamos a lista una relación de clientes de una base de datos MySQL. La estructura de la tabla es la siguiente (ingresa un par de registros luego):
CREATE TABLE IF NOT EXISTS `cliente` (
`id` tinyint(7) NOT NULL auto_increment,
`nombres` varchar(50) NOT NULL,
`ciudad` varchar(50) NOT NULL,
`sexo` char(1) NOT NULL,
`telefono` varchar(10) NOT NULL,
`fecha_nacimiento` datetime NOT NULL,
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
En archivo PHP debe tener el mismo nombre que la clase, en este caso se llama sample.php:
<?php
class sample{
function getUsers () {
$mysql = mysql_connect(localhost, "root", "");
mysql_select_db( "empresa" );
$Query = "SELECT * from cliente";
$Result = mysql_query( $Query );
while ($row = mysql_fetch_object($Result)) {
$return[] = $row;
}
return( $return );
}
}
?>
Volvamos a http://localhost/amfphp/browser y podemos apreciar en la lista de servicios, a la mano izquierda, nuestra clase llamada sample. Si la seleccionamos se muestran sus métodos, en este caso getUsers, y pulsamos el botón call se mostrará el resultado en la parte inferior.
4. Abrimos Flex (en mi caso Flex Builder 3) y creamos un nuevo proyecto Flex de nombresample.
Configuramos la ruta en nuestro servidor local:
El archivo autogenerado sample.mxml lo dejamos allí por un momento. Ahora vamos agregar un archivo de ActionScript a nuestro proyecto, para ello le damos clic derecho en la carpeta srcy seleccionamos New > ActionScript File.
El archivo RemotingConnection.as contiene un clase que llama a una conexión remota especificando la url de ésta.
package {
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
public class RemotingConnection extends NetConnection
{
public function RemotingConnection( sURL:String )
{
objectEncoding = ObjectEncoding.AMF0;
if (sURL) connect( sURL );
}
public function AppendToGatewayUrl( s : String ) : void
{
//
}
}
}
Ahora el archivo autogenerado sample.mxml, lo reemplazamos por el siguiente contenido:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns="*" creationComplete="initApplication()">
<mx:DataGrid dataProvider="{dataProvider}">
<mx:columns>
<mx:DataGridColumn headerText="ID" dataField="id"/>
<mx:DataGridColumn headerText="Nombres" dataField="nombres"/>
<mx:DataGridColumn headerText="Ciudad" dataField="ciudad"/>
<mx:DataGridColumn headerText="Telefono" dataField="telefono"/>
<mx:DataGridColumn headerText="Sexo" dataField="sexo"/>
<mx:DataGridColumn headerText="Fecha Nacimiento" dataField="fecha_nacimiento"/>
</mx:columns>
</mx:DataGrid>
<mx:Script>
<![CDATA[
[Bindable]
public var dataProvider:Array;
public var gateway : RemotingConnection;
public function initApplication()
{
gateway = new RemotingConnection( "http://localhost/amfphp/gateway.php" );
gateway.call( "sample.getUsers", new Responder(onResult, onFault));
}
public function onResult( result : Array ) : void
{
dataProvider = result;
}
public function onFault( fault : String ) : void
{
trace( fault );
}
]]>
</mx:Script>
</mx:Application>
Hemos creado un DataGrid para mostrar los datos de la consulta al servidor MySQL. Dentro de las etiquetas <mx:Script/> hacemos uso de ActionScript para llamar a la claseRemotingConnection que creamos anteriormente. La función initApplication() se encarga de conectar con la puerta de enlace: gateway.php, y llama al método getUsers() de la clasesample. La respuesta la recibe la función onResult() que pasa los datos a la variabledataProvider y ésta pasa al DataGrid.
6. Ahora simplemente compilamos el proyecto (Ctrl + F11) y podemos apreciar el resultado en el navegador web.
De esta forma podemos crear aplicaciones web complejas que incluyan inserción y actualización de datos. Pero eso no esto, incluso podemos crear aplicaciones de escritorio gracias a AIR con esta funcionalidad, es decir llamadas a procesos remotos. Les dejo los archivos de este tutorial para que lo prueben en su servidor local.
Lo vi en: Flex and PHP Using AMFPHP