29 diciembre 2008

Como obtener la dirección MAC en un Windows

A menudo para uno u otro fin deseamos obtener la dirección MAC de los dispositivos de red de nuestro equipo que corre el sistema operativo de las ventanitas.

Pues bien, la cosa no es tan difícil...

Procedemos a abrir la consola del sistema (opción ejecutar en el menú inicio, escribimos cmd y presionamos la tecla Intro/Enter) para luego escribir lo siguiente:

ipconfig /all

Presionamos nuevamente la tecla Intro y ya tendremos disponible la dirección MAC de todos los dispositivos de red en nuestro equipo.

...otra forma de hacerlo es con el comando

getmac

CAST(field AS DECIMAL) en MySQL 4.1

El tipo DECIMAL para la función CAST de MySQL en 4.1 no está implementado por lo que no disponemos de esta útil función al momento de querer convertir un dato a decimal. Empero, luego de darle vueltas al asunto, me encontré con que utilizando la función ROUND le podemos jugar la vuelta al MySQL.

SELECT ROUND(IFNULL(campo_de_texto,0),2) resultado FROM mi_tabla


...et voilà!

La función IFNULL es utilizada sólo para no tener sorpresas con campos que pudieran almacenar datos nulos, pues la función ROUND al igual que muchas al encontrar un dato nulo devuelve como resultado también nulo.

25 noviembre 2008

Comprobar si una tabla existe en Microsoft Access / VBA

Casi siempre, para un mismo problema, hay más de una solución.

Cuando trabajamos con VBA en Microsoft Access y deseamos comprobar la existencia de una tabla, son tres las formas de tratar el problema que vienen de inmediato a nuestra mente.

1) Recorrer los elementos de la colección TableDefs, para encontrar el elemento deseado.

Private Function TableExistsEx(ByVal Name As String) As Boolean
Dim i As Integer
Dim logEx As Boolean

Name = LCase(Name)
For i = vbEmpty To (CurrentDb.TableDefs.Count - 1)
If LCase(CurrentDb.TableDefs(i).Name) = Name Then
logEx = True
Exit For
End If
Next

TableExistsEx = logEx
End Function

2) Asignar el elemento de la colección TableDefs a un objeto de tal forma que al no existir nos genere un error.

Private Function TableExists(ByVal Name As String) As Boolean
Dim def As DAO.TableDef

On Local Error Resume Next

Set def = CurrentDb.TableDefs(Name)
TableExists = (Err.Number = vbEmpty)

On Local Error GoTo 0

End Function

3) Consultar la tabla MSysObjects

Private Function TableExists(ByVal Name As String) As Boolean

TableExists = _
Not (Nz(DLookup("[Name]", "MSysObjects", _
"[Name]='" & _
Name & "' And [Type]=6"), _
"No") = "No")
End Function

24 noviembre 2008

Transferir archivos a través de SSH con WinSCP

WinSCP es un cliente gráfico de SFTP (Security File Transfer Protocol) y SCP (Secure Copy) que hace uso del protocolo SSH (Secure SHell) tanto SSH-1 como SSH-2.

Permite realizar operaciones básicas con archivos, como descargar, subir, crear, renombrar y borrar. También permite crear y renombrar carpetas, cambiar las propiedades de un archivo o carpeta, entre otras cosas.

La interfaz está provista de paneles duales y nos permite escoger entre dos tipos de configuración, cada una de ellas muy personalizable. La interfaz tipo Explorador de Windows sería la más apropiada para la mayoría de usuarios, y la interfaz tipo Norton Commander para usuarios más exigentes.

La primera ventana que veremos es la ventana de inicio de sesión, que nos permite ingresar los datos para una nueva sesión, o elegir una almacenada previamente.


Cuando nos conectemos por primera vez a un equipo, nos pedirá que confirmemos que es un equipo de confianza.


Si en la ventana de inicio de sesión dejamos la contraseña en blanco o ingresamos una contraseña inválida nos mostrará la siguiente ventana para que proporcionemos una contraseña válida.


Una vez establecida la conexión veremos la interfaz gráfica de la aplicación, tal y como la tengamos configurada.


WinSCP es una aplicación bajo licencia GNU y parte de su código deriva de PuTTY.

Referencias:

Página oficial
Descargar...

21 noviembre 2008

Visor de imágenes IrfanView

IrfanView es en mi opinion el mejor visor de imágenes para las plataformas Microsoft Windows. Tiene la capacidad de visualizar y reproducir una gran cantidad de formatos.


Esta aplicación está diseñada teniendo en mente su tamaño, rapidéz, facilidad de uso e incluso la portabilidad.

Aunque la primera versión apareció en 1996, no fue sino hasta el año 98 que la empecé a utilizar y es una más de las aplicaciones que componen mi caja de herramientas.

El programa se llama así por su creador, Irfan Skiljan de Bosnia y Herzegovina.

Entre los formatos que soporta están los siguientes.

Formatos gráficos:

ANI, CUR, AWD*, B3D*, BMP, DIB, CAM*, CLP, CPT, CRW/CR2*, DCM/ACR/IMA*, DCX, DDS*, DJVU, IW44*, DXF, DWG, HPGL, CGM, SVG*, ECW*, EMF, EPS, PS, PDF*, EXR*, FITS*, FPX*, FSH*, G3*, GIF, HDR*, HDP, WDP*, ICL, EXE, DLL, ICO, ICS*, IFF, LBM*, IMG*, JP2, JPC, J2K*, JPG, JPEG, JPM*, KDC*, LDF*, LWF*, Mac PICT, QTIF, MP4*, MNG, JNG*, MRC*, MrSID, SID*, DNG, EEF, NEF, MRW, ORF, RAF, DCR, SRF/ARW, PEF, X3F*, NLM, NOL, NGG*, PBM, PCD, PCX, PDF*, PGM, PIC*, PNG, PPM, PSD, PSP*, PVR*, RAS, SUN*, RAW, YUV*, RLE*, SFF*, SFW*, SGI, RGB*, SIF*, SWF, FLV*, TGA, TIF, TIFF, TTF*, TXT, VTF*, WAD*, WAL*, WBMP*, WMF, XBM*, XPM*

Audio/Video:

AIF, AU, SND, MED*, MID, MP3*, OGG*, RA*, WAV, ASF, AVI, MOV*, MP4*, MPG, MPEG, WMA, WMV

* = Requiere PlugIn.

Es gratuito para uso privado, y requiere un registro pagado para su uso comercial.

Referencias:

Página oficial
Descargar...

19 noviembre 2008

Cambiar el editor predeterminado en Linux

Para cambiar el editor predeterminado en la consola de Linux basta la siguiente instrucción.

El "vi", que es el editor predeterminado en la mayoría de distribuciones, no es muy amigable con herrmientas como PuTTY. La solución, como lo vemos en la imagen de arriba, es la instrucción

export EDITOR=nano

Para que el cambio sea permanente al usuario, debemos agregar la instrucción en el archivo .bash_profile que se encuentra en la carpeta del usuario.

Si queremos que el cambio sea para todos los usuarios, agregamos la instrucción al archivo profile en la carpeta /etc para lo cual deberemos tener los privilegios necesarios.

PuTTY el mejor cliente SSH

Como todas las herramientas es un asunto de preferencias... pero en mi USB una que no puede faltar es PuTTY, en mi opinión, el mejor cliente SSH que he encontrado.

La primera pantalla que veremos corresponde a la configuración de la conexión. Podemos conectarnos directamente o almacenar la configuración de las sesiones que usamos con frecuencia.
La primera vez que nos conectemos a un equipo nos mostrará un cuadro de diálogo pidiendo que confirmemos si es un equipo de confianza.

Una vez establecida la conexión completamos el proceso de autentificación en el equipo destino.

Ahora podemos trabajar con toda tranquilidad...

Referencias:

Página oficial de PuTTY Tray
Descargar...

11 noviembre 2008

Configurar Gmail para el envío del Diario en Cobian Backup Amanita

Para usar nuestra cuenta de Gmail para el envío del Diario en Cobian Backup 9, debemos ingresar la configuración en la sección SMTP de la ventana de opciones.



Además de ello habrá que seleccionar el nivel de seguirdad "Implícito" en las opciones SSL.



NOTA: como se menciona en el comentario de abajo, se deberá usar SSLv23.

06 noviembre 2008

Orden de eventos para un formulario en Microsoft Access

Cuando se abre un formulario, la secuencia de los eventos es:

Open -> Load -> Resize -> Activate -> [GotFocus ->] Current

NOTA: El evento GotFocus se dispara antes de Current si el formulario no tiene controles que puedan recibir el foco (activos).

...al cerrar el formulario, la secuencia es:

Unload -> Deactivate -> Close

04 septiembre 2008

Google Chrome (Beta)

Luego de tenerlo instalado en mi PC por dos días y haberlo probado en varias páginas como todo producto Beta tiene largo camino que recorrer...

Aunque pude reproducir varios problemas reportados por diversos usuarios de esta versión una que no funcionó fue la de ejecución de código arbitrario contenido en archivos Jar.

En aparienca me convenció de inmediato, tiene una interfaza bastante simple y fácil de utilizar, lo cual me parece bastante acertado ya que para los usuarios es menos estresante una aplicación que no expone demasiadas opciones.

Algo que me parece curioso es la velocidad con que se cargan algunas páginas comparado con el todo lento IE7 o el Firefox 3.0, aunque también es curioso que algunas de esas páginas no se cargan correctamente cono el sitio de Guate360

Pues bien, como decía... en Chrome la página en cuestión se cargo en una fracción de lo que tardó en cargarse en el Firefox, empero no cargó todas las imágenes y en el texto los caracteres que no corresponden al alfabeto inglés no se muestran correctamente.

Otro asunto que no termina de convencerme es el no poder ingresar a Blogger desde dicho Navegados ya que al intentar acceder a mi cuenta aparece una ventanita como se muestra a continuación

...esto desde luego a persar de tener seleccionada la opción "Mostrar todas las Cookies" en la configuración de Cookies de las opciones del navegador.

Una cosa que sí me parece preocupante es que se apoya mucho en la configuración del Internet Explorer, no se hasta que grado, pero hasta ahora se sabe que lo hace en lo que corresponde a Certificados y configuración de Proxies.

No nos queda sino esperar a que la siguiente actualización incluya la corrección a la mayor parte de los problemas que los usuarios han encontrado en estos primeros días de arduas pruebas.

26 agosto 2008

VB.NET no tiene StrPtr o equivalente

Pues eso, que el VB.NET hasta la versión 2008 no tiene un equivalente al StrPtr del Visual Basic 6, así que en el caso del InputBox no hay forma de saber cuando un usuario ha presionado el botón y cuando ha ingresado un texto vacío.

VB6

Dim dato As String

dato = InputBox("Ingrese el dato","Título")
If StrPtr(dato) = vbEmpty Then
'El usuario ha presionado Cancelar
Else
'Lo que sea...
End If

VB.NET

Dim dato As String = InputBox("Ingrese el dato","Título")

If dato Is Nothing Then
'El usuario ha presionado el botón Cancelar
'...o ingresó un texto vacío

Else
'Lo que sea...
End If

25 agosto 2008

Este es mi escritorio de trabajo...

Creo que el título lo dice todo.

05 junio 2008

Acceder a un servidor de correo POP3 usando Telnet

Con Telnet, es posible iniciar una sesión en un servidor de correo POP3 y efectuar varias tareas como: listar los mensajes de correo, eliminarlos y verlos (en texto plano).

Esto puede servirnos para consultar nuestros mensajes desde cualquier equipo sin tener que configurar la cuenta en un cliente de correo... aunque también nos resulta util como herramienta de diagnóstico cuando desde determinado equipo no nos es posible recuperar los mensajes.


1) Para ello abrimos la consola del sistema ("Símbolo del sistema" en Win2) y ejecutamos Telnet pasándole como parámetros el servidor y el puerto correspondiente al protocolo POP3 (110). Cabe mencionar que en Win2 Vista el cliente Telnet no viene instalado de manera predeterminada en el sistema.

C:\telnet servidor.com 110

2) Una vez establecida la conexión con el servidor, éste nos dará una respuesta indicandonos que la conexión está abierta. Aquí es donde procedemos a identificarnos con la instrucción USER .

+OK servidor.com POP3 Server (Version 1.020h) ready.
user mreynoso


3) El servidor nos solicitará que le proporcionemos la contraseña para dicho usuario, lo cual haremos la instrucción PASS .

+OK please send PASS command
pass 123


4) Si el usuario no es validado correctamente el servidor nos mostrará un mensaje de error. En este caso tendremos que reintentar identificarnos enviando nuevamente la instrucción USER y la instrucción PASS.

-ERR invalid usercode or password, please try again

5) Si el usuario se validó correctamente, el servidor nos lo indicará con un mensaje similar al siguiente (en el cual nos informa que tenemos un mensaje disponible):

+OK 1 messages ready for mreynoso in /home/servidor/servidor-mail/mreynoso

6) Habiendo llegado a este punto, disponemos de las siguientes intrucciones para manipular nuestros mensajes: DELE, LAST, LIST, NOOP, RETR, RSET, STAT, TOP, UIDL y QUIT

De estas instrucciones las más utilizadas son:

  • STAT: devuelve el estado de buzón, indicandonos la cantidad de mensajes disponibles.

  • LIST: lista todos los mensajes, mostrandonos el identificador (secuencia) y el tamaño. También es posible pasarle como parámetro el identificador.

  • TOP : permite ver el encabezado del mensaje más la cantidad de líneas especificadas.

  • RETR : recupera y muestra el contenido de un mensaje, donde es el número del mensaje.

  • DELE : marca el mensaje indicado para su eliminación.

  • QUIT: cierra la sesión. Es en este momento que se eliminan los mensajes previamente marcados para ello.

23 mayo 2008

Número de fila en MySQL

Luego de buscar información en la red y de haber navegado a través de varios foros me encontré con la que me pareció la solución más bonita para obtener el número de fila en el conjunto de datos recuperado con la instrucción SELECT.

Habiendo visto varias soluciones de tipo "crear tabla temporal con un campo autonumérico" o "utilizar LEFT OUTER JOIN" me encontré con una variante de lo que a continuación expongo:

SET @i = 0;
SELECT
(@i := @i + 1) linea, nombre FROM personas ORDER BY nombre;

Estas dos instrucciones nos devolverán para todos los registros de la tabla [personas], la línea y el nombre. Si no inicializamos la variable @i (primera instrucción) el valor quedará disponible por lo que al volver a ejecutar una consulta que utilice dicha variable notaremos el resultado.

Si lo que deseamos es enumerar los registros dentro de un grupo, por ejemplo, si agruparamos a las personas por la columna [id_tipo], quedaría de la siguiente forma .

SET @tipo = 0;
SELECT id_tipo, IF(@tipo = id_tipo,@tipo := @tipo + 1,@tipo := 1) linea , nombre
FROM personas
ORDER BY id_tipo, nombre;

Una alternativa para no tener que fijar el valor de la variable en una instrucción por separado sería, agregar la subconsulta

(SELECT @tipo := 0) dummy

como aparece a continuación:

SELECT id_tipo, IF(@tipo = id_tipo,@tipo := @tipo + 1,@tipo := 1) linea , nombre
FROM personas, (SELECT @tipo := 0) dummy
ORDER BY id_tipo, nombre;