viernes, 26 de diciembre de 2008

Estreno en el Peru de la pelicula Crepuesculo


Por fin despues de tanta espera se entrenara en Peru la pelicula crepusculo que esta basada en el primer libro de la saga "Crepusculo", su estreno sera el 1 de enero del 2009.

Aunque se puede apreciar la pelicula en copias ilegales de baja calidad desde hace algun tiempo, no he querido adelantarme a verlo hasta que se estrene en una sala de cine. Fuera de que me considero un fanatico a la saga y de haber leido ya 2 de los 4 libros de la saga, espero que la pelicula tenga la escencia del libro y que no sea una burla para los que se quedaron pegados con el libro.

Lo malo para mi es la fecha en la que escogieron el estreno, ya que pensaba no aparecerme en lima hasta el dia 4 de enero XD.

Instalar Mysql 5 sobre linux Debian 4

La instalacion de Mysql sobre linux se puede ser de una manera muy facil usando los paquetes de la distribucion Debian. Se empezara a listar los pasos por orden

1. Para instalar mysql usaremos el gestor de paquete APT, con la siguiente linea de comando
apt-get install mysql-server-5.0
2. Ahora instalamos el cliente de mysql para poder acceder a servidor de base de datos
apt-get install mysql-client-5.0
3. Una vez instado el Mysql se debe levantar el servidor de base de datos
/etc/init.d/mysql start
4. Una vez inicializado el servicio nos conectamos a la base de datos mysql, colocando el password en lugar de los asteriscos
mysql -uroot -p******
5. Por defecto, solo se podra acceder al servidor desde la misma maquina en la que se instalo. Para poder acceder desde cualquier otra maquina tenemos que habilitar la conexion remota.
GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'%' IDENTIFIED BY 'contrasena' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6. Por ultimo para que permita el acceso remotamente de varias computadoras deberemos modificar el archivo my.cnf
nano /etc/mysql/my.cnf
7. Dentro del archivo buscamos la palabra "bind-address" y lo comentamos con un michi (#)
#bind-address           = 127.0.0.1
8. Por ultimo, reiniciamos el servidor Mysql
/etc/init.d/mysql restart

domingo, 2 de noviembre de 2008

Instalar Mysql 5 sobre linux Centos 5

La instalacion de Mysql sobre linux se puede ser de una manera muy facil usando los paquetes de la distribucion Centos. Se empezara a listar los pasos por orden

1. Para instalar mysql usaremos el gestor de paquete YUM, con la siguiente linea de comando
yum install mysql-server
2. Ahora instalamos el cliente de mysql para poder acceder a servidor de base de datos
yum install mysql
3. Una vez instado el Mysql se debe levantar el servidor de base de datos
/sbin/service mysqld start
4. Una vez inicializado el servicio nos conectamos a la base de datos mysql, colocando el password en lugar de los asteriscos
mysql -uroot -p******
5. Por defecto, solo se podra acceder al servidor desde la misma maquina en la que se instalo. Para poder acceder desde cualquier otra maquina tenemos que habilitar la conexion remota.
GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'%' IDENTIFIED BY 'contrasena' WITH GRANT OPTION;
FLUSH PRIVILEGES

sábado, 11 de octubre de 2008

Grandes o Tontos errores de la Historia


  1. En 1879 fue introducida en Estados Unidos una sustancia para tratar la adicción a la morfina: la cocaína.
  2. En 1853 John Coffee construyó la cárcel en Dundalk, Irlanda. Quedó en bancarrota en el proyecto y se convirtió en el primer preso de su propia cárcel.
  3. El "hombre del año" en 1938 según la revista Time era Adolfo Hitler.
  4. Ronald Reagan, el ex-presidente de los Estados Unidos y exactor de cine, fue rechazado para el rol principal en una película de 1964 llamada "The Best Man" porque "no tenía apariencia de presidente".
  5. En 1943, Thomas Watson, director de IBM, hizo una declaración diciendo "yo creo que hay un mercado mundial para quizás cinco computadoras".
  6. "No nos gusta como suenan, y la música de la guitarra esta pasando de moda" dijeron los de Decca Recording Company en 1962 al rechazar a los Beatles.
  7. En un memorandum interno de Western Union en 1876 escribieron lo siguiente después de que Alexander Graham Bell les ofreció venderles los derechos para el teléfono: "Este 'teléfono' tiene muchas cosas en su contra como para ser seriamente considerado un medio de comunicación. El aparato no tiene ningún valor para nosotros".
  8. "640 Kb -de memoria- deben ser suficientes para cualquiera"... Bill Gates en 1981.
  9. El emperador en la silla eléctrica. En Agosto de 1890 un prisionero fue ejecutado en la silla eléctrica. Esta fue la primera ejecución que se hizo por ese método. Cuando el Emperador Menelik II de Abisinia (Etiopía hoy) se enteró, encargó tres sillas eléctricas a los Estados Unidos. El único problema fue que, al llegar el envío, descubrió que necesitaban electricidad para funcionar (Abisinia todavía no contaba con este adelanto). Como el emperador era muy inspirado pronto le encontró la solución. Uso una de ellas como su propio trono imperial.
  10. Las marmotas son pequeños mamíferos Asiáticos famosos por matar cobras, fueron llevadas por los agricultores de Hawaii para tratar de controlar la población de ratas, pero se les paso un pequeño detalle. Las marmotas son animales diurnos y las ratas son animales nocturnos. Hoy en día, las marmotas son consideradas en Hawaii como una plaga, casi tanto como las ratas.
  11. Peter Archer de 47 años de edad fue arrestado por correr desnudo por una calle en Melbourne, Australia, pero fue dejado libre cuando la policía supo que venía huyendo de una funeraria donde un doctor lo había pronunciado oficialmente muerto.

Formato de Fecha y Hora con SQL SERVER 2005

Para dar formato especifico de fecha y hora en sql server se debe hacer una conversion del tipo datetime a varchar, pero no solamente es cuestion hacer la conversion simple si no adicionalmente pasar el parametro del formato que se desea obtener de dicha convercion. Aqui se muestra el cuadro de conversiones para fechas.

Sin el siglo (aa) (1) Con el siglo ?(aaaa) Estándar Entrada/salida (3)

-

0 o 100 (1, 2)

Valor predeterminado

mes dd aaaa hh:mia.m. (o p. m.)

1

101

EE.UU.

mm/dd/aaaa

2

102

ANSI

aa.mm.dd

3

103

Británico/Francés

dd/mm/aaaa

4

104

Alemán

dd.mm.aa

5

105

Italiano

dd-mm-aa

6

106 (1)

-

dd mes aa

7

107 (1)

-

Mes dd, aa

8

108

-

hh:mi:ss

-

9 o 109 (1, 2)

Valor predeterminado + milisegundos

mes dd aaaa hh:mi:ss:mmma.m. (o p. m.)

10

110

EE.UU.

mm-dd-aa

11

111

JAPÓN

aa/mm/dd

12

112

ISO

aammdd

aaaammdd

-

13 o 113 (1, 2)

Europeo predeterminado + milisegundos

dd mes aaaa hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20 o 120 (2)

ODBC canónico

aaaa-mm-dd hh:mi:ss(24h)

-

21 o 121 (2)

ODBC canónico (con milisegundos)

aaaa-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

aaaa-mm-ddThh:mi:ss.mmm (sin espacios)

-

127(6, 7)

ISO8601 con zona horaria Z.

aaaa-mm-ddThh:mi:ss.mmmZ

(sin espacios)

-

130 (1, 2)

Hijri (5)

dd mes aaaa hh:mi:ss:mmma.m.

-

131 (2)

Hijri (5)

dd/mm/aa hh:mi:ss:mmma.m.



Ejemplo
SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS 'FECHA'
-- Muestra la fecha con formato dd/mm/aaaa

SELECT CONVERT(VARCHAR(8), GETDATE(), 108) AS 'HORA'
-- Muestra la fecha con formato hh:mi:ss

Link Oficial
http://technet.microsoft.com/es-es/library/ms187928.aspx

miércoles, 24 de septiembre de 2008

Retornar registros separada por comas con MSSQL

Otra vez reutilizando cosas que me habian funcionado en otro proyectos, pero con la diferencia de plataforma que ahora me obligan a usar, me nacio una duda que anteriormente resolvi y publique en el blog "Retornar registros separada por comas con MYSQL". Ahora el escenario es diferente ya que estoy usando MSSQL (Microsoft SQL Server 2005) con VB.NET 2005.

El punto es que buscaba la solucion para listar el resultado de una consulta de una manera mas personalizada y de forma horizontal usando como separadores la coma ",". Como escribi anteriormente en otro articulo en MYSQL es mucho mas facil por que contiene una funcion , pero lamentablemente BILL no nos da una funcion tan util como aquella, por lo que investigando encontre una forma personalizada para emular dicha funcion el MSSQL
-- Declaramos la variable que contendra el resultado
DECLARE @x varchar(8000)

-- Cargamos los registros consultados en la variable
SELECT @x = COALESCE(@x+', ','')+ISNULL(CONVERT(varchar,nombre),'')
FROM FILTROS
WHERE ID_FILTROPADRE = 169

-- Mostramos el valor de la consulta separada por comas
SELECT @x
Observacion: Lo malo de esta consulta es que si devuelve demasiados registros y al momento de concatenarlos en la variable supera la longitud de la cadena provoca un error.

domingo, 17 de agosto de 2008

Las Reglas de Motivación de Bill Gates


1' Regla:
La vida no es justa, acostúmbrate a ello.

2' Regla: Al mundo no le importara tu autoestima. El mundo esperara que logres algo, independiente si te sientes bien o no contigo mismo.

3' Regla: No ganaras mucho dinero después de haber salido de la preparatoria y no serás un vicepresidente hasta que con tu esfuerzo te hayas ganado ambos logros.

4' Regla: Si piensas que tu profesor es duro, espera a que tengas un jefe.

5' Regla: Dedicarse a voltear hamburguesas no te quita dignidad tus abuelos le llamaban de forma diferente “oportunidad".

6' Regla: Si metes la pata, no es culpa de tus padres, así que no lloriquees por tus errores; aprende de ellos.

7' Regla: Antes de que nacieras, tus padres no eran tan aburridos como son ahora. Ellos empezaron a serlo por pagar tus cuentas, limpiar tu ropa y escucharte hablar acerca da la nueva onda en la que estabas.

8' Regla: En la escuela puede haberse eliminado la diferencia entre ganadores y perdedores, pero en la vida real no.

9' Regla: La vida no se divide en semestres, y muy pocos jefes se interesaran en ayudarte en que te encuentres a ti mismo.

10' Regla: La televisión no es la vida diaria. En la vida cotidiana, la gente de verdad tiene que salir del café de la película para irse a trabajar.

11' Regla: Se amable con los "nerds"(los mas aplicados de tu clase) existen muchas probabilidades de que termines trabajando para uno de ellos.

miércoles, 25 de junio de 2008

Generacion automatica de backup en MSSQL 2005 Express con un Windows Service (Parte II)

La instalacion del servicio tiene como requerimiento que creemos una clase del tipo InstallerClass como el que creamos anteriormente llamado "InstallerService.cs", para la implementacion sigamos los siguientes pasos.

1er paso: Debemos importar la libreria System.ServiceProcess, esta nos permite definir los parametros de instalacion de nuestro servicio.
using System.ServiceProcess
2do paso: Sobre escribimos el metodo InstallerService y definimos los parametros de instalacion de nuestro service.
public InstallerService()
{
ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();
ServiceInstaller serviceInstaller = new ServiceInstaller();

//# Service Account Information

serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
serviceProcessInstaller.Username = null;
serviceProcessInstaller.Password = null;

//# Service Information

serviceInstaller.DisplayName = "Backup Service";
serviceInstaller.StartType = ServiceStartMode.Automatic;

//# This must be identical to the WindowsService.ServiceBase name

//# set in the constructor of WindowsService.cs

serviceInstaller.ServiceName = "BackupService";

this.Installers.Add(serviceProcessInstaller);
this.Installers.Add(serviceInstaller);
}
Con esto tenemos listo nuestra clase instaladora que nos permitira instalar el service en el sistema.

3er paso: la instalacion y desintalacion del service se hace a travez de comandos por lo que usamos la consola de comandos (CMD). Para instalar usamos "i" y para desinstalar la "u"
InstallUtil /i BackupService.exe
InstallUtil /u BackupService.exe
Lo que hice para facilitar la instalacion y desinstalacion del service fue crear 2 archivo bat donde ingreso dichos comandos.

Aqui te adjunto el codigo del service para la creacion de backup

Generacion automatica de backup en MSSQL 2005 Express con un Windows Service (Parte I)

La creación de backup de una base de datos es un proceso importante y al mismo tiempo monotomo para los que se encargan de hacerlos, en el caso de MSSQL 2005 este proceso puede ser realizado por tareas programadas, pero en el caso de MSSQL 2005 Express Edition que no posee este gestionador de tareas automaticas solo queda hacerlo manualmente cada cierto tiempo :(.

Para no tener que hacer esta tediosa tarea cada cierto periodo ( cosa que tenia que hacerlo yo :S ) , hice un pequeña aplicacion que en si es un Windows Service que genera un backup automaticamente cada dia.

1er paso: Crear un nuevo proyectollamado BackupServicio del tipo "Windows Service" con C#, esto creara 2 items por defecto el primero llamado Program.cs y Service1.cs lo renombramos BackupService.cs, ademas agregamos un item del tipo "InstallerClass" llamandolo InstallerService.cs. La clase BackupService.cs es donde ira la logica para generar el backup y en la clase InstallerService.cs ira la logica para la instalacion del servicio en el sistema.

2do paso: Agregamos 2 nuevas referencias a nuestro proyecto llamados Microsoft.SqlServer.Smo y Microsoft.SqlServer.ConnectionInfo, estos son importantes para poder hacer el backup de la base de datos y poder llamar a estas librerias.
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo
3er paso: Crearemos el metodo que realizara el trabajo de generar la base de datos, primero indicamos el nombre del archivo de backup para ello se toma como referencia la fecha actual. Segundo, indicamos el dispositivo donde se generara el backup por lo que indicamos "DeviceType.File" para crearlo como archivo, este se crea por defecto en la carpeta de backup del MSSQL. Por ultimo, indicamos la base de datos que queremos crearle su backup que esta representado por el valor de "this.database" y el nombre del servidor cuyo valor es representado por "this.server".
private void backupDB()
{
try
{
string fileBackup = "BACKUP_" + DateTime.Now.ToString("yyyyMMdd") + ".bak";

BackupDeviceItem bdi = new BackupDeviceItem(fileBackup, DeviceType.File);

Backup bu = new Backup();

bu.Database = this.database;
bu.Devices.Add(bdi);
bu.Initialize = true;

Server server = new Server(this.server);
bu.SqlBackup(server);
}
catch (Exception ex)
{
throw ex;
}
}
Este metodo solo se llamara cuando la hora señalada sea identica a la hora del sistema, para ello el servicio verifica cada segundo dicha condición.

4to paso: Creamos un Timer para que cada segundo verifique si la hora para generar el backup.
using System.Timers;

Timer timer = new Timer();

private void OnElapsedTime(object source, ElapsedEventArgs e)
{
try
{
String tm1 = DateTime.Now.Hour.ToString() + ':' + DateTime.Now.Minute.ToString() + ':' + DateTime.Now.Second.ToString();
String tm2 = this.hour + ':' + this.minute + ':' + this.second;

if (tm1.Equals(tm2))
{
this.backupDB();
EventLog.WriteEntry(this.ServiceName, "Se genero el backup con fecha " + DateTime.Now.ToShortDateString(), System.Diagnostics.EventLogEntryType.Information);
}
}
catch (Exception ex)
{
EventLog.WriteEntry(this.ServiceName, "Error: " + ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
}
}
5to paso: Inicializamos el Timer con la configuraciones para que valide cada segundo la condicion de la hora. Para ello usamos el metodo "OnStart" que es el metodo que se ejecuta al momento de inicial el servicio. Ademas, vemos que usamos ElapsedEventHandler este metodo no sirve para decirle que en cada intervalo de tiempo ejecute el metodo OnElapsedTime que contiene la condicion para verificar la hora de sistema.
protected override void OnStart(string[] args)
{
try
{
this.loadConfiguration();

timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);

timer.Interval = 1000;

timer.Enabled = true;
}
catch (Exception ex)
{
EventLog.WriteEntry(this.ServiceName, "Error: " + ex.ToString(), System.Diagnostics.EventLogEntryType.Error);
this.Stop();
}
}
Con esta breve descripcion puedo definir el funcionamiento del programa que aunque ya esta terminado no se puede probar hasta que se intale el servicio en el sistema.

Para instalacion del servicio sigamos sigamo con la segunda parte Aqui

viernes, 6 de junio de 2008

Error al devolver, eliminar o actualizar con Propel

Problema
La forma normal y la mas usada para devolver, eliminar o actualizar un registro usando PROPEL

Devolver un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
print $product->getNombre();
?>
Eliminar un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
$product->delete();
?>
Actualizar un registro:
<?php
$product = ProductosPeer::retrieveByPK($id);
$product->setNombre('TESTING');
$product->save();
?>
Funcionan siempre en la mayoria de casos, pero existe un error que se produce cuando se define en la base de datos un campo de fecha que acepte valores '0000-00-00' o que contenga este valor.

Para especificar como se produce este error veremos la primera linea de codigo donde obtenemos todo el registro segun su ID
<?php
$product = ProductosPeer::retrieveByPK($id);
?>
Es justo en este momento donde se produce un error, ya que lo que quiere es asignar al objeto todos los campos del registro obtenido. Esto no seria ningun problema si es que se uno de los campos del registro es del tipo date (fecha) y tiene asignado el valor '0000-00-00' . Esto produce un error y detiene la operacion.

Uno similar a este:

Fatal error: Uncaught exception 'PropelException' with message 'Error populating Productos object [wrapped: Unable to convert value at column 6 to timestamp: 0000-00-00 00:00:00]' in /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductos.php:383 Stack trace: #0 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(317): BaseProductos->hydrate(Object(MySQLResultSet)) #1 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(265): BaseProductosPeer::populateObjects(Object(MySQLResultSet)) #2 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductosPeer.php(548): BaseProductosPeer::doSelect(Object(Criteria), Object(MySQLConnection)) #3 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/Productos.php(100): BaseProductosPeer::retrieveByPK('73') #4 /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/index.php(165): Productos->editVisita('73') #5 {main} in /nfs/c02/h03/mnt/27113/domains/qtregalo.com/html/demo/libs/model/classes/om/BaseProductos.php on line 383

Solucion
Encontre una pequeña solucion para evitar (no arreglar) este problema. Para ello, no asigno todos los campos del registro obtenido desde la base de dato. Si no, utilizo el objeto CRITERIA que me servira para listarlo en un objeto de tipo mas generico del tipo RECORD

Devolver un registro:
<?php
// Genero una consulta para ver si existe el producto con ID especificado
$c = new Criteria();
$c->addSelectColumn(ProductosPeer::NOMBRE);
$c->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);
$rs = ProductosPeer::doSelectRS($c);

// Verifica si existe algun registro y si es asi solo devolvera un registro
if($rs->next()){
print $rs->getString(1)
}
Eliminar un registro:
<?php
// Genero una consulta para ver si existe el producto con ID especificado
$c = new Criteria();
$c->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);

// Llama al metodo eliminar para que elimine el registro devuelto por la consulta
ProductosPeer::doDelete($c);
?>
Actualizar un registro:
<?php
// Variable de conexion del propel
$conn = Propel::getConnection('proyecto');

// Criteria para elegir el registro que se desea modificar
$c1 = new Criteria();
$c1->add(ProductosPeer::ID_PRODUCTO,$id, Criteria::EQUAL);

// Criteria para actualizar el campo del registro
$c2 = new Criteria();
$c2->add(ProductosPeer::NOMBRE,$data['productName']);

// Llamar al metodo para actualizar
BasePeer::doUpdate($c1, $c2, $conn);
?>