Happy blog day, o mis primeras recomendaciones

Y bueno, en primer lugar Felicidades a todos aquellos que ocupan un poco de su tiempo para darnos su punto de vista y como es costumbre en este día (no mi costumbre, es primera vez que lo hago) acá van mis 5 blogs recomendados. Ojo, no se encuentran en ningún orden en especial:

  • Pitonizza Punto Com es el espacio de @pitonizza, en este blog encontrarán todo tipo de información, desde consejos, noticias, mucho humor acido y uno que otro artículo fumado filosófico, imprescindible en mi GReader
  • Phenobarbital con Soda o las aventuras de una píldora viajera, el espacio de este autoproclamado nerd y clon de Sheldon aunque no lo acepte (aka @phenobarbital), trata articulos de tipo tecnológicos, ya sea tutoriales o análisis, y tambien mucha critica sobre la sociedad y política venezolana actual desde el punto de vista de un NI-NI convencido.
  • Artescritorio.com aunque es relatívamente nuevo este blog ha tenido bastante éxito y en lo personal me ha gustado bastante, esto porque según lo que he vivido a las personas por lo general no le gusta GNU/Linux porque “es feo”, acá desmontan este mito con la cantidad de tips y aplicaciones, para este sistema y para otros.
  • Someone is loving. Someone is lying aún no se si una cuenta de tumblr califica o no como blog, pero mientras consigo una respuesta igual quiero recomendar la cuenta de tumblr de @ferpsychedelia esta chica estudiante de derecho y amant de la historia (sobre todo la IIWW y Rusia) publica fotografías y artículos personales bastante impactantes que usualmente (o por lo menos en mi caso) te dejan reflexionando un buen rato.
  • Usted Está Aquí es la cuenta de tumblr de @Jaycer17 periodista obsesionado con el cine, el origami y las tarjetas de presentación nos muestra en su espacio lo más interesante de su recorrido por el internet, sobre todo las imagenes de animales más espectaculares que haya visto, si no me creen echen un vistazo.

Tengo un total de 137 blogs sindicados en mi GReader y no fue facil escoger quienes estarían en esta lista, pero puedo decir que es para mi un placer revisar la lista de nuevos artículos y encontrarme con alguno de estos 5 por allí.

Feliz día del blog a todos :)

Tal vez te interese:

  • No hay Artículos relacionados
Publicado en Otras Yerbas | Etiquetado | 3 comentarios

TutoGambas #4: Manejo de Registros en una base de datos (Crear, Buscar, Modificar y Eliminar)

pero que bueno vale, a la gente le gusta lo que escribo y eso me motiva a seguir creando estos mini tutoriales, así que ahora viene el manejo de las funciones más básicas en una Base de datos.

Transacciones

Cuando Hablamos de una transacción en una base de datos nos referimos a una serie de cambios que, o todas tienen exito o todas fracasan, por ejemplo, si estamos intentando cambiar un registro, pero en alguno no coindiden los tipos, entonces todo el proceso se tiene que revertir y no se guarda nada.

Crear Registros

Lo primero que hacemos es iniciar la transacción con

$hConn.Begin

Luego creamos un objeto Result con el método Create

hRes = $hConn.CREATE("tabla")

Esto nos crea un registro vacio donde vamos a establecer los datos del registro:

hRes!campo1 = "Registro #1"
hRes!campo2 = 300
hRes!campo3 = DATE(Now())
hRes!campo4 = TRUE
hRes!campo5 = 2235644.232

El objeto Result también puede usarse como un Array para guardar los datos, sería algo como esto:

hRes["campo1"] = "Registro #1"
hRes["campo2"] = Rnd(200, 20000)
hRes["campo3"] = DATE(Now())
hRes["campo4"] = TRUE
hRes["campo5"] =  2235644.232

Una ventaja al hacerlo de esta manera es que podemos por ejemplo usar variables en lugar de cadenas, pudiendo potimizar mas el código, la opciones son variadas.

Luego se actualiza el registro, para guardar estos datos:

hRes.Update

Con esto nos aseguramos de que ingresen los datos al registro, finalmente cerramos la transacción:

$hConn.Commit

En caso de error echamos todo el proceso para atras:

CATCH
$hConn.Rollback

Podemos ver el código completo acá:

DIM hRes AS Result

$hConn.Begin

hRes = $hConn.CREATE("tabla")

hRes!campo1 = "Registro #1"
hRes!campo2 = Rnd(200, 20000)
hRes!campo3 = DATE(Now())
hRes!campo4 = TRUE
hRes!campo5 = 2235644.232

hRes.Update

$hConn.Commit

CATCH
$hConn.Rollback

Buscar Registros

Para buscar un registro podemos usar el método Find del objeto Collection:

hRes = $hconn.Find("tabla") ' Esto es equivalente a SELECT *  FROM tabla

Esto crea un objeto Result de solo lectura que nos guardará, en este caso buscamos todos los datos que están guardados en la tabla, podemos filtrar con la clausula where de esta manera:

hRes = $hconn.Find("tabla", "campo2 < 10000") ' Esto es equivalente a SELECT *  FROM tabla WHERE campo2 < 10000

Con esta tendremos como resultado todos los registros cuyo valor para campo2 sea menor a 10000.

Solo nos queda enumerar la salida

FOR EACH hRes
PRINT hRes!campo1
PRINT hRes!campo2
PRINT hRes!campo3
PRINT hRes!campo4
PRINT hRes!campo5
NEXT

Al final el código nos queda así:

DIM hRes AS Result

hRes = $hconn.Find("tabla", "campo2 < 10000")

FOR EACH hRes
PRINT hRes!campo1
PRINT hRes!campo2
PRINT hRes!campo3
PRINT hRes!campo4
PRINT hRes!campo5
NEXT

Editar un Registro

Lo primero que debemos hacer es iniciar una transacción

$hconn.Begin

Luego creamos un objeto Result de lectura y escritura usando la función Edit de la clase Connection, al igual que la función Find usaremos como primer parametro el nombre de la tabla y como segundo parametro la clausula where para obtener resultados mas precisos.

hRes = $hconn.Edit("tabla", "campo2 < 10000")

En este caso buscará todos los registros cuyo valor de campo2 sea menor a 10000, generalmente se busca editar un solo registro, para esto buscamos por ejemplo el campo que sea clave primaria que en nuestro ejemplo es id.

Ahora editamos los campos.

FOR EACH hRes
hRes!campo1 = "Campo con valor menor a 10000"
hRes.Update
NEXT

En este caso iremos registro por registro editando campo1, es importante que luego se coloque la linea hRes.Update para guardar los registros, si solo van a editar un registro no necesitar usar el FOR EACH.

Otra cuestión que hay que acotar es sobre el limite que le colocamos a los campos, si recordamos en el TutoGambas #2 habíamos creado campo2 como un campo de tipo string y una longitud de 16 caracteres pero en la edición colocamos una cadena de 29, no nos dará error pero si vemos el resultado solo nos guardará “Campo con valor “.

Finalizamos cerrando la transacción.

$hconn.Commit

O devolviendola si ha ocurrido un error.

CATCH
$hconn.Rollback

El código completo se vería así.

  DIM hRes AS Result

$hconn.Begin
hRes = $hconn.Edit("tabla", "campo2 < 10000")

FOR EACH hRes
hRes!campo1 = "Campo con valor menor a 10000"
hRes.Update
NEXT
$hconn.Commit

CATCH
$hconn.Rollback

El método Exec

Si alguno de métodos anteriores se queda corto siempre podemos crear nuestras propias sentencias SQL usando el el metodo Exec

hRes = hConn.EXEC("Tu sentencia SQL")

Este método siempre va a devolver un objeto Result aunque no será necesario en todos los casos.

Tal vez te interese:

Publicado en TutoGambas | Etiquetado , | Deja un comentario

La Vida Boheme en las Mercedes

Acá está el video del concierto que acaban de lanzarse en la plaza Alfredo Sadel de las Mercedes

Tal vez te interese:

  • No hay Artículos relacionados
Publicado en Otras Yerbas | Deja un comentario

Instalando eyeOS 2.2

Hace poco que se liberó la versión 2.2 de eyeOS, entre varias mejoras veo que ya viene con un Instalador más amigable

  • Bajamos el paquete de acá.
  • Descomprimimos y copiamos en la carpeta del servidor.
  • Damos a la carpeta permisos de escritura.

En mi caso renombré la carpeta a eyeos2 y la copié en /var/www, ahora si entran directamente a http://localhost/eyeos2 (en mi caso) verán la pantalla de login, aunque no podrán hacer nada, primero hay que instalar el sistema.

Instalamos las dependencias necesarias:

sudo aptitude install php5-curl php5-gd php5-mcrypt  php5-mysql php5-mysql php5-sqlite php-db pdo-mysql pdo-sqlite  python-support python-simplejson python-uno

El paquete stomp.py, necesario para habilitar las capacidades colaborativas de eyeOS no están en los repositorios (por lomenos no en los de trisquel que es la distro que uso), así que podemos descargar de acá e instalarla

Necesitamos tambien correr el demonio de OpenOffice en el espacio de usuario de www-data:

sudo su www-data
soffice "-accept=socket,host=localhost,port=2002;urp;" -headless
exit

Hay una cuestion llamada ActiveMQ Daemon que en primer lugar no logré instalar y en segundo lugar me da ladilla tener algo que ver con java, en fin , si lo logro hacer algún día lo pongo y si lo hacen ustedes pueden comentarlo que yo lo coloco acá con sus respectivos créditos :)

Entramos a la carpeta install (http://localhost/eyeos2/install en mi caso y verán este dialogo, donde haremos click en el enlace Install eyeOS2 on my server:

Si hicimos bien los puntos anteriores entraremos a la ventara de requerimientos con casi todos satisfechos, solo falta la ultima que dice ActiveMQ Daemon: Not running (Needed for real time notifications), en fin, le damos click al enlace

El siguiente paso es colocar los datos de conexión a la base de datos, aca es importante señalar que auqnue no da ningun error en la instalación, la base de datos no se crea automáticamente, lo que implica que hay que crearla manualmente, luego hacemos click a Continue with the instalation

Esperamos …

Y listo, ya está el sistema instalado, ahora tenemos que borrar la carpeta install y finalmente solo nos queda ir a la autenticación haciendo click en Go to my new eyeOS

Los logueamos con el usuario root y la contraseña que colocamos en la instalación y listo, ya tenemos un sistema eyeOS instalado y funcional :D

Esto es todo por ahora, solo queda jugar con el, experimentar, conocer. Ya en próximos post conoceremos las diferentes funcionalidades del sistema.

Tal vez te interese:

Publicado en eyeOS | Etiquetado , , | Deja un comentario

TutoGambas #3: Abrir firefox desde gambas (o como manejar comandos externos)

Este Tutorial viene luego de revisar en el google analytics con qué palabras clave llegan los lectores a mi blog, una que me llamó la atención fue esta “abrir firefox desde gambas” lo que me inspiró a hacer esta pequeña introducción a los procesos en Gambas:

la forma mas simple para llamar a un comando externo es esta:

EXEC ["firefox"]

O esta:

SHELL "firefox"

Listo, esto es suficiente para abrir cualquier aplicación, aunque podemos hacer cosas mas complicadas, primero vamos a establecer algunas diferencias.

La instrucción EXEC lanza una aplicación junto con los parametros que se indiquen por ejemplo, si queremos abrir Firefox con una página en específico usamos esta linea:

EXEC ["firefox", "http://willicab.gnu.org.ve"]

o

SHELL "firefox http://willicab.gnu.org.ve"

EXEC tiene la ventaja de facilitar la escritura de los parámetros , por ejemplo, si queremos reproducir una canción con mplayer pero la ruta contiene espacios, no es necesario escribir caracteres especiales como \ o encerrarlos entre comillas.

Aunque mayor ventaja la tiene el uso de la instrucción SHELL, ya que esta llama al interprete de comandos (por ejemplo BASH o SH) pudiendo ejecutar funciones propias del interprete que no podríamos ejecutar con EXEC o trabajar con tuberías entre otras potencialidades del interprete de comandos, por ejemplo, si quiero saber usando amixer cuales son los microfonos que tengo puedo usar esta linea:

SHELL "amixer scontrols | grep  Mic"

Si lo ejecutamos veremos la siguiente salida de la aplicación en la consola de gambas:

Simple mixer control 'Ext Mic',0
Simple mixer control 'ExtMic',0
Simple mixer control 'Int Mic',0
Simple mixer control 'IntMic',0

Pero si queremos solamente el nombre del control(en este caso Ext Mic, ExtMic, Int Mic e IntMic) necesitamos guardar esta salida en una variable, esto lo hacemos con TO:

DIM sSalida, Linea AS STRING
DIM Lineas, Palabras AS STRING[]

SHELL "amixer scontrols | grep  Mic" TO sSalida
Lineas = Split(sSalida, "\n")
FOR EACH Linea IN Lineas
Palabras = Split(Linea, "'")
TRY PRINT Palabras[1]
NEXT

Esto nos devolverá:

Ext Mic
ExtMic
Int Mic
IntMic

La clase Process

Si queremos mas control sobre las aplicaciones externas que estamos ejecutando podemos recurrir a esta clase, por ejemplo:

DIM hProcess AS Process
IF Dialog.OpenFile() THEN RETURN
hProcess = EXEC ["mplayer", Conv$(Dialog.Path, Desktop.Charset, System.Charset)] FOR READ WRITE

En este ejemplo abrimos un diálogo donde escogemos un archivo de audio o video para reproducirlo con mplayer, podemos ver que hay varias cuestiones que no habíamos visto:

  • Creamos un objeto Process desde donde controlaremos la aplicación.
  • Agregamos al final FOR READ WRITE, esto nos sirve para:
    • READ para leer la salida del proceso a medida que se va ejecutando.
    • WRITE para enviarle señales al proceso.

Como colocamos READ podemos leer la salida de la aplicación, para hacerlo debemos escribir algo como esto:

PUBLIC SUB Process_Read()
DIM Salida AS STRING
READ #LAST, Salida, -256
PRINT Salida
END

Acá estamos llamando al método Read de la clase Process, luego leemos el proceso y lo imprimimos.

En MPlayer usamos la tecla espacio para pausar la canción, sabiendo esto podemos usarlo en el código, por ejemplo, usamos un boton llamado btnPlayPause para esto:

PUBLIC SUB btnPlayPause_Click()
PRINT #hProcess, " ";
END

Así de simple, hay muchas cosas más pero dije que sería un tutorial corto así que dejaré que investiguen lo demás, aunque si les quedó alguna duda no duden dejarme un comentario :D

Tal vez te interese:

Publicado en TutoGambas | Etiquetado , , | Deja un comentario

gbReport 1.0

Y bueno, ya hace tiempo que la tenía lista pero por diferentes razones no había tenido oportunidad de publicarla, es una versión ya estable de la aplicación gbReport con nuevas caracteristicas:

  • Por dentro
    • Agregados nuevos metodos y eventos en la clase.
    • La clase fue renombrada a cReporte.
    • Se consiguió mejorar el rendimiento en el renderizado y en la exportación.
  • Por Fuera
    • Ahora existe una barra de progreso que te indica cuantas paginas lleva exportando

Luego de esta actualización me he dado cuenta de un par de errores, por un lado la cantidad de páginas en la vista es diferentes en el número de paginas del PDF exportado o la impresión, tambien me di de cuenta lo malo que soy para documentar los cambios, se que hay mas de los que mencioné pero los he olvidado D:

En fin, para conseguir el código fuente de la versión vayan a la página del proyecto, como siempre les estaré muy agradecido de los comentarios, criticas y posibles mejoras del programa :D

Tal vez te interese:

Publicado en Proyectos | Etiquetado , , | Deja un comentario

TutoGambas #2: Bases de datos con Gambas, creación de tablas y campos

En primer lugar muchas gracias por sus comentarios en el Post del TutoGambas #1 supongo que si hay gente interesada en lo que escribo, así que acá va la segunda parte :D

Ahora que ya sabemos como crear una base de datos y conectarnos a ella, procederemos a crear tablas y sus respectivos campos en esa base de datos.

DIM hTabla AS Table
hTabla = $hConn.Tables.Add("tabla")

hTabla.Fields.Add("id", db.Serial)
hTabla.Fields.Add("campo1", gb.STRING, 16, "Sin Nombre")
hTabla.Fields.Add("campo2", db.INTEGER,, 1)
hTabla.Fields.Add("campo3", gb.DATE)
hTabla.Fields.Add("campo3", gb.BOOLEAN)
hTabla.Fields.Add("campo4", gb.FLOAT)

hTabla.PrimaryKey = ["id"]

hTabla.Update

Primero declaramos una variable de tipo Table, luego con la función

hTabla = $hConn.Tables.Add(Nombre_De_La_Tabla)

Creamos una nueva tabla en la base de datos que guardaremos en hTabla.

El siguiente paso es crear los campos, para eso usamos la función

hTabla.Fields.Add(Nombre, Tipo, Tamaño, Valor_Por_Defecto)

El primer parametro es el nombre del campo.

El segundo parametro es el tipo de dato que va a guardarse allí, los tipos disponibles son:

db.Blob = -2
db.Serial = -1
db.BOOLEAN = 1
db.INTEGER = 4
db.LONG = 5
db.FLOAT = 7
db.DATE = 8
db.STRING = 9

Asumo que los nombres de las constantes definen por si mismas por eso no las explico, a excepción de db.Serial, esta constante define el tipo de datos auto_increment.

Luego está el tamaño del campo, y el valor por defecto, eso tampoco necesita mucha explicación.

Cuando ya tenemos todos los campos creados establecemos (en este caso) el campo “id” como clave primaria, se darán cuenta en la linea

hTabla.PrimaryKey = ["id"]

Vemos que “id” está entre corchetes, esto es porque la variable PrimaryKey es una String Array por lo que podemos agregar más de una clave primaria.

Al final actualizamos la tabla y listo, ya tenemos una tabla con sus campos.

Sigo esperando sus comentarios, preguntas y sugerencias :)

Tal vez te interese:

Publicado en TutoGambas | Etiquetado , | 3 comentarios

¿Qué pesa más, una onza de algodón o una onza de oro?

En la noche del sabado luego de la clausura del CNSL nos fuimos a una pizzería(?) a cenar, mientras esperabamos que las pizzas estuvieran hechas (hey y esperamos bastantes, en realidad demasiado) hablabamos de diferentes cosas, en algun momento Art3mis4 comentó la famosa pregunta que que pesa más, si un kilo de algodón o un kilo de plomo, inmediatamente recordé que hace muchos años había leido un pregunta parecida, pero las medidas no eran en kilogramos sino en onzas y no hablaban de plomo sino de oro, la cuestión es que planteé la pregunta y di la respuesta, ahora que vuelvo a recordar la situación me puse a investigar y me di cuenta que estaba equivocado, había dicho que la onza de algodón pesaba más cuando no era así, he aquí la explicación (via Wikipedia):

A la onza se le llama ounce en inglés, abreviada Oz y de símbolo ℥ (Unicode U+2125). Actualmente sólo se usan 2 tipos de onza:

Es decir que despues de todo una onza de oro pesa más que una onza de algodón.

Tal vez te interese:

  • No hay Artículos relacionados
Publicado en Otras Yerbas | Etiquetado | 1 comentario

TutoGambas #1: Bases de datos con Gambas, Conexión y Creación de bases de datos

Este Articulo lo copio de mi blog anterior, espero poder continuar una serie de tutoriales de Gambas, claro, todo dependerá de sus comentarios :D

A pesar de lo que me gusta desarrollar con Gambas y el tiempo que llevo haciéndolo, nunca he publicado un artículo, tutorial o lo que sea sobre este maravilloso entorno de programación, así que comenzaré por algo sencillo para ir poco a poco profundizando sobre este tema, bases de datos con Gambas :) .

Conectandonos a una base de datos

Antes que nada es necesario activar el componente de Bases de datos (gb.db) en la pestaña componentes de la ventana propiedades en el menú Proyecto, luego podemos usar un código como este:

PUBLIC HConn AS Connection

PUBLIC SUB Main()
HConn = NEW Connection
HConn.Type = "mysql"
HConn.Host = "localhost"
HConn.Login = "root"
HConn.Password = ""
HConn.Name = "basedatos"
HConn.OPEN
END

En la primera línea declaramos una variable de tipo Connection yo la hice pública que pueda ser usada en otros módulos del proyecto en dado caso

En el procedimiento Main creamos primero el objeto y luego colocaremos algunos datos necesarios para iniciar la conexión, cabe destacar que estos datos son los unicos que deben modificarse, por ejemplo, el codigo anterior funcionará tanto para mysql, si quieres conectarte usando SQLite solo tendrías que colocar la ruta de la base de datos en la propiedad Host e ignorar las propiedades Login y Password, para conectar con ODBC es relativamente mas complicado, aquí les dejo Un Link con un tutorial al respecto.

Crear una base de datos

En el ejemplo anterior tenemos la siguiente linea de código:

HConn.Name = "basedatos"

La propiedad Name indica el nombre de la base de datos a la que nos queremos conectar, pero es posible que esa base de datos aún no exista, en ese caso nos daria el siguiente error:

Cannot open database: Unknown database ‘basedatos’

Podemos modificar el código para crear la base de datos en caso de que esta no exista, por ejemplo:

PUBLIC HConn AS Connection

PUBLIC SUB Main()
HConn = NEW Connection
HConn.Type = "mysql"
HConn.Host = "localhost"
HConn.Login = "root"
HConn.Password = ""
HConn.Name = "basedatos"
HConn.OPEN

IF NOT HConn.Databases.Exist("basedatos") THEN
HConn.Databases.Add("basedatos")
ENDIF

HConn.CLOSE
HConn.Name = "basedatos"
Hconn.OPEN
END

Podemos ver varios cambios, en primer lugar vemos que ya no nombramos la base de datos antes de abrir la conexión, primero verificamos con esta linea:

IF NOT HConn.Databases.Exist("basedatos") THEN

Si existe o no la base de datos, si no existe la creamos con la siguiente función:

HConn.Databases.Add("basedatos")

Luego que ya tengamos la base de datos creada debemos cerrar la conexión para nombrar la base de datos como parametro:

HConn.CLOSE
HConn.Name = "basedatos"
Hconn.OPEN

Ya con esto nos evitamos la posibilidad de que ocurra un error al no existir la base de datos, claro que una base de datos contiene tablas y campos que también pueden crearse desde el código, pero esto es tema para otro post, espero cualquier comentario, pregunta o sugerencia :)

Tal vez te interese:

Publicado en TutoGambas | Etiquetado , | 9 comentarios

Mis Dents de Identi.ca para el 2010-07-06

Powered by modified Twitter Tools.

Tal vez te interese:

  • No hay Artículos relacionados
Publicado en Otras Yerbas | Deja un comentario