domingo, 29 de septiembre de 2013

Save data like binary format less weight in disk (integer data)

Sometimes us want save number data (integer or dbl number). However integer numbers are lightweight in disk, in fact if you want save this numbers in binary file, I think you should wonder why?. This is because no the integer data use decimals therefore exist the answer, yes, the dbl numbers are heavy becuase it use decimal numbers.
One morning when I was take my deskfast in my work (I think that because I work in one proyect where I needed save data from inclinometer and then save it in binary files) I think How Save my information from inclinometer in lightweight binary file?, I was trying all methods (Or I thought this)

-String, number, dbl
-String, hexadecimal, dbl
-String, array number, array dbl

In these methods the result was the same: 8-14 Mb per file thus Was the issue?, Well the problem wasn't in all my strings process, the problem was in the DBL data, and I thought, "Well If I trying omit dbl datas then may be I saw differents effects In fact the solution was the next:

I received the numbers in string format, well the next step was convert it in bdl datas (because this information was decimal data) and then the next step was convert this in integer data. And the next question follow me: Who can convert dbl in integer data? If my information was decimal numbers. Well the solution is more more easy and this is the next:

The string of numbers only multiply per 100, and this way I had integer numbers, for example:

(635.5)(100) = 63550

Very nice I said xD I was found the solution for my problem.

Well I share my experiencie because I think that most of people was the same problem.I presume.
This files weighed 2 MB per file per 86400 data of numbers




lunes, 23 de septiembre de 2013

Save Time stamp like binary format (Labview)

Timestamp is very important when we need build a waveform (graphic waveform) or XY graph. Unlike time string, Timestamp is compatible with waveforms. For example when you save the time in string format and then you want put it in the graph we have some issues with the graph because the graph do not recognize string format for time.

In this case I show as save timesramp in binary format. I don't like explain all the progress theferore I put the following image : One image say more that a thousand words. I wonder why :)




domingo, 15 de septiembre de 2013

¿Cómo minimizar, maximizar o cerrar un Form con la propiedad Formborderstyle = none?

Cuando nosotros deseamos trabajar con un Form sin control de este, es decir, que hacemos desaparecer los botones de control (cerrar, minimizar y maximizar), es lógico que perdemos el control de nuestro form, ya que no podemos ni minimizarlo y cerrarlo. En algunas aplicaciones es importante añadir este control, ya sea en botones o labels, en ambos el procedimiento para esta implementacion es la mismo.

Ya sea que habéis optado por uno u otro, solo es cuestión de hacer uso de estos códigos en la propiedad click de nuestro item.

  • Me.close() 'Si queréis que el form se cierre cuando demos click en nuestro elemento (botón o label
  • Me.WindowState = 1 'Si queréis que el form se minimize cuando hagamos click en nuestro elemento
  • Me.WindowState = 2 'Si queréis que el form se maximize
  • Me.WindowState = 0 'Si queréis que el form regrese a su tamaño original

Con esto no volveremos a preocuparnos si desactivamos el borderstyle de nuestro form.


jueves, 12 de septiembre de 2013

Guardar datos tipo string en formato binario en labview


Ya hace tiempo me había topado con esta cuestión, sin embargo, si uno no sabe resolver sus dudad correctamente puede caer en un circulo vicioso donde no encuentre solución.
Es importante guardar la información en formato binario, ya que en este tipo de formato los archivos pesan una cuarta parte menos de que si se guardasen en Ascii, la velocidad para hacer lectura de estos es mucho mas rápido (refiriéndome a lectura como al proceso de decodificación), y claro si os queréis salvar la información para que nadie pueda leerla mas que vosotros, esta es la mejor opción.
Pues bien ya hace tiempo que me tope con LabVIEW, al principio me pareció algo burdo, sin embargo, a uno como programador le ahorra mucho tiempo, pues la programación es en diagrama de bloques, os aseguro que si lo prueban se sorprenderán de todo lo que podéis hacer.

En muchos sitios me eh encontrado con gente que se confunde entre el formato binario y la codificación binaria, que os aclaro son cosas muy distintas. El pasar el Ascci en unos y ceros en formato BCD (binario codificado en decimal) no significa que estemos guardando en formato binario, de echo seguimos en Ascci. Os aseguro que vosotros nos hemos topado con archivos en formato binario, si aquellos archivos que los abrimos y nos encontramos con puros símbolos extraños

€H@     €J@      M@     €H@      I@      M@      H@      L@      "@     €H@     €J@      M@     €H@      I@      M@      H@     €L@

La codificación anterior es de un archivo binario, los símbolos que se encuentran antes y después del "@ indican una cadena, esta cadena es un timestamp en formato 12 horas (la hora 00:00:00), y del otro extremo se encontraría respectivamente 00:00:01, entonces "@ da a entender que es un espacio en blanco.

Pues bien no os daréis una cátedra de esta codificación, pasemos a lo interesante.

¿Como salvar cadenas string en este formato?

Primero tenéis que tener instalado el LabVIEW (os recomiendo que se familiaricen con el lenguaje), si ya lo conocéis y so entráis para consultar el tema abajo os explicareis el código.



Este código codifica en formato binario, y en otro tiempo decodifica esta información.

-Es importante pasar toda nuestra cadena string a su significado numérico (para cada elemento de la cadena), no todo es automático en labview, y esto es un algoritmo hecho por mi mismo. Esto es necesario porque el codificador no acepta ascii como tal, si os queréis grabar el ascii puro en binario, sencillamente labview no codificara nada.

-En la parte de la decodificacion es importante saber que en binario, como todo esta en formato numérico, es necesario medir el archivo (numero bytes) y partirlos para asi tomar cada elemento para leerlo y decodificarlo, por eso agregue el "Quotient & remainder" cual nos facilita este trabajo.

-Es importante transformar lo numérico a string al momento de visualizar la cadena en ascii.

Pues bien me hubiera gustado profundizar mas en el tema pero carezco de tiempo, si os tenéis una duda podéis contactarme.

domingo, 8 de septiembre de 2013

How to install audacious in Centos RHEL 6 or other distributions of Linux

Well I promise that everyone who visited mi site know about this problem.

Normally when you trying install Audacious we find with the problem of the “audacious-plugins>= x.x.x version” needed for the installation, well the solution is very easy.

The first steep is go to this site: http://pkgs.org/download/audacious-plugins

And then select your distro linux (in my case is Centos 6 (RHEL 6)), when you select the distro the site requires that mirror download, I always select “ATrpms mirror” is taste affair, well in all mirrors exist various versions of audacious plugins (the version is not important). In the page find this: (of course Go ahead the steeps!, in my case for my distribution I followed this steep, change in each distros)

Install How to

Download the latest atrpms-repo rpm from

http://dl.atrpms.net/el6-x86_64/atrpms/stable/

Install atrpms-repo rpm:

# rpm -Uvh atrpms-repo*rpm

Install audacious-plugins rpm package:
# yum install audacious-plugins

 After that you try install Audacious
# yum install audacious

Agregar Fecha y Reloj digital en nuestro Form

En ocasiones es necesario colocar la fecha en nuestro form, esto es muy sencillo. Para hacer esto requerimos de 2 labels, uno para la fecha y el otro para el reloj, o ocupar uno solo, y concatenar ambos.

Sin concatenar:
        lblHora.Text = Format(Now(), "Long Time")
        lblFecha.Text = Format(Now(), "Long Date")
Concatenado

lblHoraAndDate.Text = Format(Now(), "Long Time") & " | " & Format(Now(), "Long Date")
NOTA: Si queremos tener esto en tiempo real, tenemos que agregar un timer en nuestro form y agregar el codigo dentro del timer, recuerda que debes activar este reloj en su propiedad Enable = True. El intervalo de nuestro Timer debera de ser 1000 ms = 1 segundo.


Mover PictureBox con el mouse y con teclado

Una aplicación muy común es construir un visor de imágenes como el de Windows. El primer requisito de un visor es que en este sea posible hacer zoom a nuestra imagen, sin embargo, el Basic no nos ofrece ninguna herramienta para hacer esto (a menos a simple vista no).
La solución a nuestro problema es hacer el picturebox mas grande, es decir, que en su propiedad Size tendríamos que cambiar las dimensiones para que la imagen se expandiera, quedando como sigue:

PictureBox1.Size = New System.Drawing.Size(x, y)
Donde "x" y "y" son las dimensiones de nuestro picturebox (largo y ancho respectivamente). Aparentemente hemos solucionado el problema del zoom, sin embargo, intente usted mover la imagen ¿Puede?

Si usted quiere intentarlo me parece perfecto, pero para ahorrarle tiempo yo le diré que en efecto no es posible, por mas que intente mover la imagen para poder ver el resta, usted no podrá. He aquí nuestro gran problema, si bien existen dos formas de solucionarlo, y comenzare por la mas sencilla.

Mover PictureBox con el teclado (flechas de dirección)

Para mover nuestra imagen en zoom que ya tenemos en pantalla después de aplicar nuestro código anterior, solo basta clickear en la propiedad KeyDown de nuestro form, y llamar a la propiedad e.KeyCode y asignar las teclas para mover nuestro picturebox:

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles SplitContainer1.KeyDown

Select Case e.KeyCode
                Case Keys.Up
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X, Me..PictureBox1.Location.Y + 10)

                Case Keys.Down
         Me.PictureBox1l.Location = New Point(Me..PictureBox1.Location.X, Me..PictureBox1.Location.Y - 10)

                Case Keys.Left
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X + 10, Me..PictureBox1.Location.Y)

                Case Keys.Right
         Me.PictureBox1.Location = New Point(Me..PictureBox1.Location.X - 10, Me..PictureBox1.Location.Y)

            End Select
End sub

Las primeras dos lineas (Keys.Up y Keys.Down) son necesarias para mover el picturebox a lo largo del eje Y de nuestro form, la magnitud 10 nos indica, cuando se desplazar hacia arriba o hacia abajo, cada vez que se presione la tecla correspondiente. Homologamente para Left y Right ocurrira lo mismo. Observe que si vamos a desplazar Qel picturebox alrededor del eje Y, X no es modificado y no se le agrega una magnitud, poner "Me..PictureBox1.Location.X" es igual que poner "Me..PictureBox1.Location.X+0".

Mover PictureBox con el mouse (dar click sobre la imagen y después desplazarla)

Lamentablemente mover un picturebox, un form u otra cosa con el mouse no es tan sencillo, pues requiere llamar ciertas librerias, y después aplicar nuestro ingenio, no explicare a detalle el procedimiento pues requiere demasiada explicacion, sim embargo, les compartiré el código.


  • El primer paso es llamar las librerias en la parte donde usted declare sus variables a utilizar.

Private Const WM_NCLBUTTONDOWN = &HA1
    Private Const HTCAPTION = 2
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                 (ByVal hwnd As Integer, ByVal wMsg As Integer, _
                  ByVal wParam As Integer, ByVal lParam As String) As Integer
    Private Declare Sub ReleaseCapture Lib "user32" ()


  • El segundo paso es ingresar a la propiedad mousemove de nuestro form y poner lo siguiente:

            Dim lHwnd As Int32
            lHwnd = ptcGeneral.Handle
            If lHwnd = 0 Then Exit Sub
            ReleaseCapture()
            SendMessage(lHwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&) 

Finalmente queda ejecutar nuestro programa y ver lo que ocurre :)

sábado, 7 de septiembre de 2013

Archivo de imagen se bloquea cuando es establecida la propiedad PictureBox

Un problema común en el Basic es cuando deseamos visualizar una imagen en un PictureBox, pero al mismo tiempo esta imagen se debe actualizar (es decir sobrescribir) cada cierto intervalo de tiempo.
Usualmente usaríamos el siguiente codigo:

PictureBox.Image = Image.FromFile("C:\Users\Images\Imagen.jpg")

Sin embargo al usar este código nos encontramos con un conflicto, y como lo dije lineas arriba, el principal conflicto es que en el tiempo de ejecución de nuestro programa, no podemos hacer uso del archivo (No podemos actualizarlo ni suprimirlo) debido a que se encuentra en uso por el picturebox, es decir, es como si este item abriera un visor de windows y estuviera visualizándose ahí, solo que en este caso lo vemos mediante nuestro picturebox.

Para evitar este problema, tenemos que utilizar el objeto FileStream como sigue:

Dim fs As System.IO.FileStream
fs = New System.IO.FileStream("C:\Users\Images\Imagen.jpg", 
     IO.FileMode.Open, IO.FileAccess.Read)
PictureBox.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
De esta manera estaríamos solucionando el conflicto mencionado anteriormente, y ahora la imagen podrá ser utilizada por terceros mientras estamos ejecutando nuestro visor

viernes, 6 de septiembre de 2013

Visual Basic: Técnicas basicas

Iniciare esta sección con cuestiones practicas, y dando por entendido que el usuario ya tiene conocimientos del lenguaje, es decir, solo algunas técnicas que facilitan el diseño del software en el Basic.

Descargar archivos de la red.

Es común diseñar un proyecto donde se nos pida que bajemos archivos de la red y almacenarlos en algún medio de almacenamiento del ordenador. Sin embargo en muchas otras ocasiones es común bajar el mismo archivo cada cierto intervalo de tiempo, debido a que este se actualiza y tiene un contenido mas reciente, y es necesario sobrescribir el archivo descargado, pues bien aunque parezca sencillo de hacer, implementar este algoritmo requiere de practica. Existen dos formas de hacerlo y es lo que explicare.

Supongamos que se nos asigna la tarea de tomar captura de alguna cámara digital cada 30 segundos, sin embargo, el software que se encarga de tomar la captura y almacenar dicha imagen ya se encuentra echo, por lo tanto nuestro trabajo es solo tomar el archivo del servidor donde alojo esta imagen y visualizarla en alguna especie de contenedor gráfico (PictureBox).

El método clásico es usar el siguiente código:
 
Sub timer_1
Dim time As Integer
time = 0
If time <= 30 then
time = time + 1
else
My.Computer.Network.DownloadFile _
("http://www.tuServidoroIP.com/Imagenjpg", _
"C:\Monitoreo\Imagen.jpg")
time = 0
End If
End sub

Todo pareciera indicar que tenemos el problema resuelto, y en efecto así es. Sin embargo pensemos que cierto día nuestra conexión a internet pierde comunicación con el servidor por unos cuantos mili segundos, y supongamos que en ese intervalo de tiempo (entre la perdida de conexión) le correspondía a nuestro software actualizar tomar la imagen del servidor y posteriormente almacenarla y mostrarla.

¿Que ocurriría?

Pues bien, nuestro código es tan sencillo que carece de condiciones contra errores, y por lo tanto nos generaría un error y se saldría de la ejecución, de echo, seria la muerte si fuera para un empresa, y el software se colgara en un fin de semana.

¿Como solucionar el problema?

Pues bien, como bien dice el dicho: no hay mal que dure cien años...
No explicare a detalle el siguiente código, pues me tomaría mas tiempo explicarles el funcionamiento de cada sentencia, sin embargo, el lector tiene toda la libertad de experimentar e investigar.

Try
            Dim wc As New System.Net.WebClient()
            wc.DownloadFile("http://" & ip & "/Imagen.jpg", "C:\Monitoreo\Imagen.jpg")
        Catch ex As System.Net.WebException
            Dim response As System.Net.HttpWebResponse = ex.Response
        End Try

Este código lo que hace, es omitir nuestro problema anterior, lo único que bastaría hacer es cambiar este fragmento de código por el anterior:

My.Computer.Network.DownloadFile _
("http://www.tuServidoroIP.com/Imagenjpg", _
"C:\Monitoreo\Imagen.jpg")
Eh aquí nuestra solución, cabe mencionar que el código anterior puede reemplazar la imagen automáticamente, a diferencia del primer código que nos causaba error, a ese código tenemos que implementarle un algoritmo para borrar la imagen y volverla a escribir.

Nuevo blog

Bien como podrán darse cuenta e migrado del wordpress al blogger, pues bien yo espero pronto valla subiendo varios contenidos sobre programación y linux, en algunos casos haré uso del ingles (como pueden darse cuenta), y en otros español. Hago esto por motivos personales y también didácticos. Espero poder subir mas contenidos interesantes y que les pudieran servir en su vida practica.

How to install Nvidia Drivers in CentOS or RedHat

When I was trying install Nvidia Drivers in my Linux I had some mistakes in the installation. The first problem was on the Kernel and gcc headers. When you were installing RedHat or CentOS or any version based or RedHat code by first time you must installing this

1) By first you must be loguin as root and then you must be type this in the console
yum -y install kernel-devel gcc-c++
yum -y upgrade kernel
Before that you must restart your computer and after that you must desactivated the nouveau controller in this grub configuration in: /boot/grub/grub.conf

and then you must added this code (the code in quotes)

title CentOS (2.6.32-358.11.1.el6.x86_64)…"quiet rdblacklist=nouveau nouveau.modeset=0
initrd /initramfs-2.6.32-358.11.1.el6.x86_64.img”

Finally you must restar your computer and then begining the installation in the classic mode:

sh Nvidia...