jueves, 15 de marzo de 2012

Poder sin Límites... o el sueño de cualquier nerd


A pesar de que en México es casi nula su promoción, me tope en cartelera esta película y decidí ir a verla, recordando un trailer que vi hace un tiempo y un vídeo viral que salio en las noticias de gente volando en Nueva York. La película esta grabada en el formato de falso documental así que si les gusto Cloverfield o REC, esta definitivamente les agradará.

Sin ganas de hacer spoiler, imagínense a tres chavos que un día se encuentran una extraña roca, al puro estilo kriptonita, que les otorga unos extraños poderes para mover cosas con la mente, volar y una gran fuerza. El sueño de cualquier nerd adolescente..., por que a poco no imaginaron defenderse de lo brabucones o impresionar a las chicas con tales poderes, por que yo si, aunque bueno... esa es otra historia.

El chiste de la película no es solo las demostraciones de los chavos y sus habilidades, si no tal como es la campaña del filme, ¿de que serían capaces?... como diría Ben Parker "con un gran poder viene una gran responsabilidad". ¿Que harían si tuvieran una super fuerza, pudieran volar o movieran cosas con la mente?, ¿serían super heroes luchando por el bien y la justicia?... o ¿se dejarían llevar por el lado oscuro?.

Pues la película presenta una muy buena historia, al principio muy clásica ("ah, eso ya lo he visto") pero que avanza captando la atención con sus acciones, después con su comportamiento y al final con un enfrentamiento entre los mas profundos instintos de los protagonistas.

Y el estilo de falso documental le da un sentido más "protagónico" por que te hacen sentir uno de ellos, siendo parte de las bromas, volando por los aires o incluso haciendo a un lado las "molestias". También agrada mucho el hecho de que no es solo una cámara la que cuenta la historia, si no varias que se van presentando durante la película, y aunque al final ya no sabes cuál es cuál la que esta tomando a quien, no se pierde la sensación de ser un protagónico más.

Realmente me busco la película, son de esas de las que sales de la sala tratando de hacer lo que viste, imaginándote salir volando o preguntándote las cosas que harías si tuvieras esos poderes. Lo genial que sería ser malo, o lo bien que te sentirías haciendo el bien.

En fin, si no se marean fácilmente, es una buen película que disfrutarán; y aunque su duración es de casi 90 minutos, te deja con buen sabor de boca y preguntándote si habrá una 2da parte. Bueno, me adelanto contestándoles que al parecer sí, puesto que ha generado muchas ganancias alrededor del mundo por lo que la FOX ya esta preparando la secuela.


lunes, 12 de marzo de 2012

Como cambiar el título de una página con Code Behind

De regreso con algo extremadamente sencillo, pero que puede ser útil al manejar eventos en páginas ASPX. A veces, en base a ciertas condiciones pueden cambiar aspectos, como colores, títulos, etc., y en este ejemplo, el título de la página.

Lo que hacemos normalmente con los tags <title>Título</title>en el Code Behind usando C# es con Page.Title:

this.Page.Title = "Este es el nuevo título de la página";

Como se ve, la propiedad Title recibe una cadena de texto que aplicará como el título de la página. También se puede utilizar:

this.Header.Title = "Hola";

Como ven, es muy fácil aplicar dicho cambio. Cabe mencionar que Page tiene muchas propiedades como ErrorPage (para obtener o establecer la página personalizada en caso de error) o StyleSheetTheme (para obtener o establecer el tema CSS de la página) entre otros que valdría la pena probar.

Hasta el próximo post...

miércoles, 15 de septiembre de 2010

BlindMaiden.com

Voy a replicar lo que encontre en la página de Taringa acerca de Blind Maiden, lo cual, si dejamos que la idea nos invada y por un momento imaginemos estar en esa situación, entonces si es de miedo...

"Tal vez se trate solo de eso,de una nueva Leyenda Urbana,pero de no ser así, nos encontrariamos ante un suceso escalofriantemente desconcertante que nos llevaría, una vez más, a la terrible conclusión de que no existen límites ni fronteras para el horror. Un horror que se adapta camaleónicamente a los tiempos y se vale de todos sus eventos para manifestarse ante nosotros.

Son muchos los que cuentan haber entrado en una página web llamada www.blindmaiden.com (blind maiden significa doncella ciega). Normalmente, si pretendes acceder a ella, por más que lo intentes, tu explorador no te lo permitirá y aparecera otras cosas ya que para hacerlo deberás cumplir tres condiciones. Encontrarte completamente solo, hacerlo exactamente en la medianoche de un dia sin luna y tener apagadas todas las luces de la casa. Entonces, solo entonces se te permitirá el acceso. Una vez dentro, enseguida tras un impactante viaje por las imágenes que ofrece, sin necesidad de que nadie te explique nada, comprenderás, como dice el slogan de presentación de la página, que estarás ante 'una experiencia real de horror absoluto'. Tendrás que emplear tus cincos sentidos y poner especial cuidado en no clicquear, ni por error, el botón de 'Aceptar' en participar activamente en la experiencia. Si asi lo hicieses seria tu fin y quedarias transformado en una imagen más del amplio archivo de incautos que, antes que tu, osaron, tal vez incrédulos, tal vez curiosos, a probar esta experiencia.

Pero ¿que es lo que se supone que ocurre una vez que haces clic sobre aquel botón? . Para tu sorpresa y horror observarás en tu monitor como una siniestra silueta se pasea... por tu propia casa!!! Querrás despertar de lo que desearás que sea una pesadilla cuando veas como ese espectro se acerca y entra en la misma habitación en la que te encuentras... te verás en tu monitor a ti mismo, de espaldas... entonces sentirás su presencia detrás de ti... te girarás no pudiéndolo soportar más y... lo último que verás, antes de morir, será el rostro de la doncella ciega que, despiadadamente te arrancará los ojos..."

Obviamente, si hacemos un whois al dominio veremos que esta en venta (o eso decia), y la verdad no creo que sea verdad... solo una leyenda urbana más que podría estar basada en una de las tantas películas que hay hoy en día...

Aunque insisto, imaginarse estar en esa situación si da escalofríos...

lunes, 13 de septiembre de 2010

Filtrar y Ordenar un DataTable con un DataView

Los que usamos DataTables para llenar controles de .NET como DataGrids, ComboBox, CheckBoxList, etc., generalmente obtenemos los datos de una consulta SQL, y como bien saben, en ella podemos agregar filtros y ordenamiento de la información.

¿Pero que pasa en los casos en que el DataTable se llena manualmente o los datos son manipulados con código?, por ejemplo la traducción de los Nombres de los Productos. No siempre los filtros o el ordenamiento lo podemos hacer en el origen o mediante una consulta SQL.

Usando algunos de los métodos y propiedades de los DataViews de System.Data podemos lograr el objetivo, por ejemplo:

//Llenamos un DataTable con la información requerida
DataTable myDT = mifuncionLlenado();

//Creamos un DataView com el DataTable
DataView myDV = new DataView(myDT);

/*Para ordenar los datos usamos la propiedad Sort del DataView con el campo o los campos con los que queremos hacerlo, muy parecido a SQL*/
myDV.Sort = "nombreProducto ASC";

/*Y para filtrarlo usamos la propiedad RowFilter*/
myDV.RowFilter = "productoTipo = 1";

//Establecidas las propiedades llenamos un Control con el DataView
this.myDataGrid1.DataSource = myDV;

/*Y todavia podemos llenar otro control con el mismo DataView pero con diferente filtro*/
myDV.RowFilter = "productoTipo = 2";
this.myDataGrid.DataSource = myDV;

El DataView puede ser la vista de un DataTable al que se le puede aplicar filtros, ordenamiento, entre otras cosas, pero haciendolo en memoria.

Espero sea de ayuda y apoyo este artículo.

Happy Coding!!

Fuente: http://msdn.microsoft.com/es-es/library/system.data.dataview(VS.80).aspx

domingo, 29 de agosto de 2010

Transacciones en SQL Server 2005

Después de un rato de no estar por aquí regreso con esta pequeña entrada que se me hace muy interesante y sobre todo útil. Las Transacciones sobre SQL Server son de mucha ayuda al realizar consultas algo complejas que impliquen afectar de manera riesgosa la integridad de la tablas en la Base de Datos.

Todo lo que se incluya dentro de la sección de la Transacción se realizará, a menos que ocurra un problema, ya que si esto pasa, todo lo que se llevaba hecho hasta entonces regresará a su estado anterior... como si nunca hubiera pasado nada.

Y utilizando el Try... Catch SQL Server podran obtener cierta información el error ocurrido.

BEGIN TRY
BEGIN TRANSACTION
--Codigo riesgoso aqui. Lo que sigue es ejemplo
declare @d decimal
set @d = (select 5 / 0)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
select 'Lo sentimos ocurrio un Error. Revise los siguientes datos para mas información.' as Mensaje, error_number() AS Numero_de_Error, error_severity() AS Gravedad_del_Error, error_state() AS Estado_del_Error, error_procedure() AS Procedimiento_del_Error, error_line() AS Linea_de_Error, error_message() AS Mensaje_de_Error;
ROLLBACK TRANSACTION
END CATCH

Como conclusión, el uso de las Transacciones protege los datos de la Base de Datos ante un error ocurrido durante la ejecución de las querys. De esa manera, se pueden ejecutar con mucho mas confianza.

Happy Coding!!

jueves, 27 de noviembre de 2008

Como crear Reportes Dinámicos con Crystal Reports y C# en WebForms usando DataSets y DataTables

Hace tiempo me tope con la necesidad de generar reportes en ASP.NET e imprimirlos. Investigando un poco, me tope con el detalle que no es tan fácil realizarlo como sería en un ambiente de escritorio. De hecho, se complicaba un poco más ya que debía de utilizar DataSets dinámicos, es decir, generados durante el uso de la aplicación, no desde un principio.

Decidí utilizar Crystal Reports, ya que se encuentra implementado dentro de Visual Studio 2005, incluyendo opciones como exportación a diferentes formatos como Excel y PDF.

Investigando un poco, me encontré con un código proporcionado por Fernando Berenguer Doménech en el cuál explicaba el método para realizarlo. Basándome en este gran apoyo, pude dar con la solución que a continuación expongo:

Principalmente agregó al proyecto un reporte Crystal Reports desde el Explorador de Soluciones. Yo le deje el nombre de CrystalReport.rpt

Más adelante le daremos formato al reporte. Por mientras lo dejaremos tal cuál como se agrego. Posteriormente insertamos a nuestro formulario un CrystalReportViewer, al cuál yo le puse de nombre crv1; este control será por el cuál mostraremos nuestro reporte o archivo .rpt


Es importante mencionar que ya contamos con el DataSet que queremos imprimir. Recordando que dentro de este contamos con diferentes DataTables identificados por un índice o nombre.

public static DataSet ds1 = new DataSet();

Durante el desarrollo de la aplicación lleno mi DataSet con una consulta SQL.

Ahora veremos el código que utilicé para enviar a imprimir un DataSet generado dinámico.

/*Yo lo puse dentro del evento Page_Load*/
protected void Page_Load(object sender, EventArgs e)
{
/*Construimos un DataSet y un DataTable para ser enviados como origen de datos a Crystal Reports. El DataTable lo indentificaremos con un nombre especifico*/

DataSet myDS = new DataSet();

DataTable myDT = new DataTable("dataset");


/*Mezclamos el DataTable que acabamos de crear con el DataTable que proviene de nuestro DataSet donde esta el resultado de una consulta SQL. Para esto utilizamos el método Merge*/


myDT.Merge(ds1.Tables[0]);

/*Agregamos el nuevo DataTable al DataSet que será el origen de datos de Crystal Reports
*/
myDS.Tables.Add(myDT);


/*Ahora creamos un archivo XML que contendrá nuestro DataSet. En teoría, este será escrito temporalmente en este archivo, que a su vez se convertirá en el origen de datos en el Reporte de Crystal Reports. Cabe mencionar que es muy importante que se tengan los permisos necesarios en la carpeta*/
myDS.WriteXml(@"C:\Inetpub\wwwroot\proyecto\xml\report.xml");

/*Ahora cargamos el archivo .rpt De igual manera hay que considerar los permisos necesarios*/

CrystalDecisions.CrystalReports.Engine.ReportDocument myrpt;

myrpt = new CrystalDecisions.CrystalReports.Engine.ReportDocument();

myrpt.Load(@"C:\Inetpub\wwwroot\proyecto\rpts\CrystalReport.rpt");


/*Establecemos como Origen de Datos el DataSet que llenamos */

myrpt.Database.Tables["preview"].SetDataSource(myDS);


/*Llenamos el CrystalReportViewer con la información*/
crv1.ReportSource = myrpt; crv1.DataBind();
}

Ahora… aun no funciona como debería ser. Es turno de trabajar con el reporte CrystalReport.rpt y prepararlo para que muestre la información como debería de ser. En este archivo tendremos que configurar en el Explorador de Campos el origen con un DataSet creado en un archivo xml.

Aquí es muy importante considerar que en el DataSet, el DataTable y los campos deben de llamarse igual que a los del resultado de la consulta SQL. A continuación creamos el archivo report.xml


Nótese el nombre del campo después de “NewDataSet”, ”preview” es como se llama nuestro DataTable.

Una vez tengamos creada esta “Base de Datos Temporal”, nos ubicaremos en el CrystalReport.rpt y utilizaremos el Explorador de Campos para dar de alta nuestro DataSet del XML.


Sobre la opción Campos de Base de Datos, daremos clic derecho y elegiremos Asistente de Base de Datos. En la ventana nueva, abriremos la carpeta Datos del Proyecto y Objetos .NET; será entonces donde podremos elegir en Ruta del Archivo el XML que creamos anteriormente.


Ya que tengamos cargado el DataSet, lo pasaremos por completo a la lista de Tablas Seleccionadas. De esta manera habremos determinado como Origen de Datos nuestro DataSet, con un DataTable llamado “preview” y con sus campos; los cuáles podremos pasar manualmente a nuestro CrystalReport .rpt



A estos campos podremos darle el formato que deseemos, la ubicación en el reporte, etc. Si todo salió bien, al momento en que probamos nuestra aplicación, el DataSet en el XML será llenado y el reporte lo podrá visualizar desglosando el listado de registros.

Cualquier duda ya saben donde encontrarme.

lunes, 20 de octubre de 2008

PHP y Postgres

Es relativamente fácil utilizar la base de datos Postgres en PHP. Si anteriormente habías conectado PHP con MySQL, es practicamente lo mismo.

1.- Modificamos el PHP.ini para agregar la extensión de pgsql. En ambiente Windows basta con teclear en menú ejecutar php.ini para abrirlo y modificarlo. En linux deberas de localizarlo en la carpeta de Apache.

2.- Dentro de este archivo, en el caso de windows bastara con descomentar la siguiente línea:

extension=php_pgsql.dll

3.- En ambiente Linux son varias líneas que se pueden descomentar y modificar; cada una de ellas tiene comentado su descripción, por ejemplo:

pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0

4- Todo esto con el fin de preparar la conexión. Es importante reiniciar el servidor Apache una vez guardados los campos.

5.- Para establecer una conexión PHP - Postgres, crearemos un archivo al que llamaremos conec.php e incluiremos las siguientes lineas:

/*Utilizamos una función para establecer la conexión*/
function Conectarse()
{
/*Mediante una condicion determinamos si se establecio o no la conexion.
Usamoa la pg_connect donde colocamos los parámetros:
dbname=Nombre de la Base de Datos
port=Puerto de Conexion a la Base de Datos
user=Nombre de Usuario para conectarse
password=Password para conectarse*/
if (!($conexion = pg_connect("dbname=gyc port=5432 user=usuario password=password")))
{
/*Si la conexion no es exitosa se mostrara el siguiente mensaje y salimos*/
echo "No pudo conectarse al servidor";
exit();
}
/*No importa si se establecio o no la conexion, esta sera devuelta por la funcion*/
return $conexion;
}

/*Ahora mandamos a llamar la funcion*/
Conectarse();

6.- Este archivo lo podemos guardar en alguna parte de nuestro proyecto y usar su ruta absoluta, pero en el caso de este ejemplo, lo colocaremos en la misma carpeta donde estara el archivo en donde usaremos la Base de Datos. Este archivo se llamara ejemplosql.php




7.- En ejemplosql.php incluiremos el siguiente código:

/*Incluimos el archivo de conexión*/
include("conec.php");

/*Guardamos en una variable el valor retornado de la función de conexión*/
$con=Conectarse();

/*Guardamos en una variable la sentencia SQL, en este caso del tipo SELECT*/
$sql_select_1 = "select nombre, edad from alumnos where id_alumno = '10'";

/*Realizamos la conexión y ejecutamos la consulta SQL mediante la función
pg_Exec con los parámetros de conexión a la Base de Datos ($con) y la sentencia SQL ($sql_select_1)*/
$query_select_1 = pg_Exec($con, $sql_select_1);

/*Si todo salio bien, obtendremos un objeto con los datos obtenidos de la consulta SQL,
mediante la funcion pg_fetch_object. Solo para los casos de SELECT*/
$query_result_1 = pg_fetch_object($query_equipos);

/*Una vez obtenido los datos, los podemos todavia extraer de forma mas particular,
mediante los nombres de los campos y guardandolos en variables*/
$nombre = $query_result_1->nombre;
$edad =$query_result_1->edad;

/*Imprimos las variables, comprobando el resultado.*/
echo "El nombre es: ".$nombre;
echo "Y su edad es: $edad años";

8.- Hasta este punto, hemos logrado realizar una conexión PHP - Postgres. Si obtuvimos algun error, podremos buscarlo por medio del numero de línea, así mismo si el error esta en la sentencia SQL.

9.- La clase de sentencia SELECT que utilizamos es para obtener datos específicos en una sola fila. Si deseamos recuperar información en un resultado SELECT de mas de una línea:

/*Incluimos el archivo de conexión*/
include("conec.php");

/*Guardamos en una variable el valor retornado de la función de conexión*/
$con=Conectarse();

/*Guardamos en una variable la sentencia SQL, en este caso del tipo SELECT*/
$sql_select_2 = "select nombre, edad, grado from alumnos where edad < '18'";

/*Realizamos la conexión y ejecutamos la consulta SQL mediante la función
pg_Exec con los parámetros de conexión a la Base de Datos ($con) y la sentencia SQL ($sql_select_2)*/
$query_select_2 = pg_Exec($con, $sql_select_2);

/*Obtenemos el número de filas del resultado con la función pg_num_rows*/
$no_filas = pg_num_rows($query_select_2);

/*Mediante un ciclo for, leemos cada una de las filas*/
for ($i=0;$i<$no_filas;$i++)
{

/*Guardamos en un vector cada una de las filas durante el ciclo con la función
pg_fetch_array con los parametros del objecto SQL y el numero de fila durante el ciclo*/
$array_local = pg_fetch_array($query_ausencias_local,$i);

/*Creado el vector, y durante el ciclo, podemos leer cada una de las filas mediante sus posiciones*/
echo "Su nombre es: $array_local[0], tiene $array_local[1] años y esta en el $array_local[2] grado";
}

10.- Para el caso de sentencias SQL como update, delete e insert, se utiliza como se muestra a continuacion:

$sql_update = "update alumnos set nombre = 'Mauricio', edad = '24', grado = '8'";
pg_Exec($con, $sql_update);