Cómo conectarse en perl a una base de datos mysql

Supongamos que tenemos una base de datos mysql llamada ‘personas’ a la que podemos acceder con usuario ‘usudb’ y contraseña ‘clave’.

La base de datos contiene una tabla llamada ‘tabla’ con los siguientes campos:

  • nombre varchar(32)
  • edad integer
  • fecha_alta date

Podemos conectarnos a la base de datos, leer y escribir registros con el siguiente código en perl:

Como vemos, la librería DBI es la encargada de implementar la conectividad a mysql desde perl.

Cómo enviar un email desde un script perl

En ocasiones es interesante poder enviar un email desde nuestra aplicación. Un ejemplo puede ser el caso de un proceso que se ejecuta periódicamente en un servidor (quizá mediante una entrada en cron), y que avisa mediante un email cuando se produce alguna incidencia durante su ejecución.

 

En Perl, la manera más sencilla de enviar un email es llamando a una aplicación externa de envío de correos por línea de comandos que esté  disponible en el sistema, como pueden ser ‘mailx’, ‘mutt’ o el propio ‘sendmail’ en sistemas Linux:

Envío de email mediante a una llamada a sendmail

Para ello, podemos definir una función ‘send_email’ como sigue:

De este modo, podemos enviar un email mediante la llamada:

En la rutina send_email, el segundo argumento de la llamada a open(MAIL …) comienza con el caracter “|” (pipe). Así se dispara la ejecución del comando sendmail, y se asocia su standard input a la variable “MAIL”. De este modo, las siguientes llamadas “print MAIL  …” envían el texto  al programa sendmail.

El texto que se envía a sendmail consta de una cabecera de tres líneas con el remitente, el destinatario y el asunto del mensaje, seguida del cuerpo del mensaje. La cabecera debe estar separada del cuerpo por una línea en blanco, y por eso la tercera línea que se envía (con el asunto del mensaje) finaliza en “nn”.

Envío de emails con ficheros adjuntos

El mecanismo de llamar a un comando del sistema mediante una canalización (pipe) se puede aplicar a cualquier otro comando que queramos ejecutar. En concreto, si tenemos necesidad de enviar mensajes más elaborados (por ejemplo, mensajes HTML, o mensajes que incluyen ficheros adjuntos) podemos llamar a otro cliente de correo en lugar de a sendmail.  mutt es un ejemplo de cliente de correo disponible en sistemas linux que puede ser usado para añadir adjuntos a los mensajes que enviamos.

En funcion de las características de nuestro sistema, podemos también utilizar los comandos ‘mail’, ‘mailx’ o cualquier otro cliente de correo que ofrezca un interfaz de línea de comandos.

Otras posibilidades para enviar emails desde Perl

La biblioteca CPAN de módulos perl también dispone de numerosos módulos para el envío de correo, entre los que se encuentran Net::SMTP, Email::Sender, Email::MIME, MIME::Lite, etc.

Por ejemplo, podemos enviar un mensaje HTML utilizando MIME::Lite con el siguiente código:

Sigue leyendo

Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/Mono

Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/Mono – Jorge Iván Meza Martínez

Introducción.

Advanced Encryption Standard (AES), también conocido como Rijndael (pronunciado “Rain Doll” en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología (NIST) como FIPS PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un proceso de estandarización que duró 5 años.  Se transformó en un estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica.

El cifrador fue desarrollado por dos criptólogos belgas, Joan Daemen y Vincent Rijmen, ambos estudiantes de la Katholieke Universiteit Leuven, y enviado al proceso de selección AES bajo el nombre “Rijndael”.

Tomado del artículo Advanced Encryption Standard de Wikipedia.

Implementación con strings.

La aplicación de demostración de esta técnica requiere del uso de por lo menos los siguientes namespaces.

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

Establecer la clave y el vector de inicio.

Estos valores pueden ser especificados manualmente o de manera automática por el framework.  La implementación para permitir que se definan automáticamente estos valores es la siguiente.

Rijndael rijndael = Rijndael.Create();
byte[] key = rijndael.Key;
byte[] iv  = rijndael.IV;

Es posible forzar la generación de nuevas claves y nuevos vectores de inicio para el algoritmo utilizando los métodos rijndael.GenerateKey() y rijndael.GenerateIV() respectivamente.

Si por el contrario se desea especificar estos valores manualmente su implementación es la siguiente siendo strKey y strIv, la clave y el vector de inicialización como cadenas de texto.

byte[] key = UTF8Encoding.UTF8.GetBytes(strKey);
byte[] iv  = UTF8Encoding.UTF8.GetBytes(strIv);

Especificando estos valores manualmente es necesario garantizar que sus longitudes sean válidas para el algoritmo.  En este caso se utilizará una longitud de clave de 32 bits y una longitud de vector de inicio de 16 bits.

int keySize = 32;
int ivSize = 16;

Array.Resize(ref key, keySize);
Array.Resize(ref iv, ivSize);

Cifrado de cadenas de texto.

Para cifrar la información se requiere de los siguientes parámetros.

  1. Cadena de texto con los datos a cifrar.
  2. Clave.
  3. Vector de inicio.

El proceso retornará finalmente una cadena de texto con los datos cifrados.

/**
 * Cifra una cadena texto con el algoritmo de Rijndael
 *
 * @param	plainMessage	mensaje plano (sin cifrar)
 * @param	Key		        clave del cifrado para Rijndael
 * @param	IV		        vector de inicio para Rijndael
 * @return	string		        texto cifrado
 */

public static string encryptString(String plainMessage, byte[] Key, byte[] IV)
{
    // Crear una instancia del algoritmo de Rijndael

    Rijndael RijndaelAlg = Rijndael.Create();

    // Establecer un flujo en memoria para el cifrado

    MemoryStream memoryStream = new MemoryStream();

    // Crear un flujo de cifrado basado en el flujo de los datos

    CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                 RijndaelAlg.CreateEncryptor(Key, IV),
                                                 CryptoStreamMode.Write);

    // Obtener la representación en bytes de la información a cifrar

    byte[] plainMessageBytes = UTF8Encoding.UTF8.GetBytes(plainMessage);

    // Cifrar los datos enviándolos al flujo de cifrado

    cryptoStream.Write(plainMessageBytes, 0, plainMessageBytes.Length);

    cryptoStream.FlushFinalBlock();

    // Obtener los datos datos cifrados como un arreglo de bytes

    byte[] cipherMessageBytes = memoryStream.ToArray();

    // Cerrar los flujos utilizados

    memoryStream.Close();
    cryptoStream.Close();

    // Retornar la representación de texto de los datos cifrados

    return Convert.ToBase64String(cipherMessageBytes);
}

Descifrado de cadenas de texto.

El proceso inverso, el de descifrado, se realiza de manera antagónica.  Para hacerlo es necesario contar con los siguientes parámetros.

  1. Cadena de texto con los datos cifrados.
  2. Clave.
  3. Vector de inicio.

El proceso retornará finalmente una cadena de texto con los datos descifrados.

/**
 * Descifra una cadena texto con el algoritmo de Rijndael
 *
 * @param	encryptedMessage	mensaje cifrado
 * @param	Key			clave del cifrado para Rijndael
 * @param	IV			vector de inicio para Rijndael
 * @return	string			texto descifrado (plano)
 */

public static string decryptString(String encryptedMessage, byte[] Key, byte[] IV)
{
    // Obtener la representación en bytes del texto cifrado

    byte[] cipherTextBytes = Convert.FromBase64String(encryptedMessage);

    // Crear un arreglo de bytes para almacenar los datos descifrados

    byte[] plainTextBytes = new byte[cipherTextBytes.Length];

    // Crear una instancia del algoritmo de Rijndael

    Rijndael RijndaelAlg = Rijndael.Create();

    // Crear un flujo en memoria con la representación de bytes de la información cifrada

    MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

    // Crear un flujo de descifrado basado en el flujo de los datos

    CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                 RijndaelAlg.CreateDecryptor(Key, IV),
                                                 CryptoStreamMode.Read);

    // Obtener los datos descifrados obteniéndolos del flujo de descifrado

    int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

    // Cerrar los flujos utilizados

    memoryStream.Close();
    cryptoStream.Close();

    // Retornar la representación de texto de los datos descifrados

    return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
}

Implementación con archivos.

El cifrado y descifrado de mensajes en archivos se realiza de manera similar al expuesto anteriormente con cadenas, sin embargo varían los flujos (streams) utilizados para obtener y dirigir el flujo de la información.

Cifrado a archivos.

/**
 * Cifra una cadena texto con el algoritmo de Rijndael y lo almacena en un archivo
 *
 * @param	plainMessage	mensaje plano (sin cifrar)
 * @param	filename	        nombre del archivo donde se almacenará el mensaje cifrado
 * @param	Key		        clave del cifrado para Rijndael
 * @param	IV		        vector de inicio para Rijndael
 * @return	void
 */

public static void encryptToFile(String plainMessage, String filename, byte[] Key, byte[] IV)
{
    // Crear un flujo para el archivo a generarse

    FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);

    // Crear una instancia del algoritmo Rijndael

    Rijndael RijndaelAlg = Rijndael.Create();

    // Crear un flujo de cifrado basado en el flujo de los datos

    CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                 RijndaelAlg.CreateEncryptor(Key, IV),
                                                 CryptoStreamMode.Write);

    // Crear un flujo de escritura basado en el flujo de cifrado

    StreamWriter streamWriter = new StreamWriter(cryptoStream);

    // Cifrar el mensaje a través del flujo de escritura

    streamWriter.WriteLine(plainMessage);

    // Cerrar los flujos utilizados

    streamWriter.Close();
    cryptoStream.Close();
    fileStream.Close();
}

Descifrado de archivos.

/**
 * Descifra el contenido de un archivo con el algoritmo de Rijndael y lo retorna
 * como una cadena de texto plano
 *
 * @param	filename		nombre del archivo donde se encuentra el mensaje cifrado
 * @param	Key			clave del cifrado para Rijndael
 * @param	IV			vector de inicio para Rijndael
 * @return	string			mensaje descifrado (plano)
 */

public static string decryptFromFile(String filename, byte[] Key, byte[] IV)
{
    // Crear un flujo para el archivo a generarse

    FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate);

    // Crear una instancia del algoritmo Rijndael

    Rijndael RijndaelAlg = Rijndael.Create();

    // Crear un flujo de cifrado basado en el flujo de los datos

    CryptoStream cryptoStream = new CryptoStream(fileStream,
                                                 RijndaelAlg.CreateDecryptor(Key, IV),
                                                 CryptoStreamMode.Read);

    // Crear un flujo de lectura basado en el flujo de cifrado

    StreamReader streamReader = new StreamReader(cryptoStream);

    // Descifrar el mensaje a través del flujo de lectura

    string plainMessage = streamReader.ReadLine();

    // Cerrar los flujos utilizados

    streamReader.Close();
    cryptoStream.Close();
    fileStream.Close();

    return plainMessage;
}

   Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/Mono – Jorge Iván Meza Martínez 

Aplicación de demostración.

La aplicación de demostración incluye los conceptos y el código expuestos en este artículo.  Con ella es posible cifrar y descifrar un mensaje que consiste en una cadena de texto arbitraria en memoria y en un archivo.

Aplicación de demostración del uso del algoritmo Rijndael
Aplicación de demostración del uso del algoritmo Rijndael

Construír la aplicación.

La aplicación de demostración puede construírse utilizando la solución incluída en la distribución con MonoDevelop o Visual Studio.  También es posible construírla desde línea de comando (Mono) mediante la siguiente instrucción.

$ gmcs “/out:RijndaelSample.exe” “/r:/usr/lib/mono/2.0/System.dll” /t:exe “RijndaelSample/Main.cs”

Enlaces.

Cifrado y descifrado simétrico con Rijndael (AES) utilizando C#/Mono

MIME Types for ClickOnce deployment

When you are hosting a ClickOnce deployment on a webserver, you need have certain MIME types defined so the server knows how to handle the files. You can host a ClickOnce deployment on any server regardless of the operating system. So you can host a ClickOnce deployment on an Apache server just as easily as a server running Microsoft Windows Server. You just need to set up the right MIME types.

When you install the .NET Framework, it registers the MIME types automatically. This is why you don’t have to set up MIME types if you install IIS on your desktop machine and test your deployments by deploying to localhost. Carrying that forward, if you have the .NET Framework installed on your server, the MIME types should already be registered.

This is generally one of the first things to check when you’re having problems downloading the deployment. A definite sign that your MIME types are not set up correctly is if your customers try to install the application and it shows the XML of the deployment manifest (the .application file) in Internet Explorer rather than installing the application.

Here are the basic MIME types you need for every ClickOnce deployment:

.application –> application/x-ms-application
.manifest –> application/x-ms-manifest
.deploy –> application/octet-stream

If you are targeting .NET 3.5 or .NET 4.0, you need these as well:

.msp –> application/octet-stream
.msu –> application/octet-stream

If you are deploying an Office application (VSTO add-in), you need this one:

.vsto –> application/x-ms-vsto

If you are deploying a WPF application, you need these:

.xaml –> application/xaml+xml
.xbap –> application/x-ms-xbap

Click one of these links to see how to set MIME types in IIS 6 or IIS 7.

If your application is hosted on an Apache webserver, you can set up your own MIME types by putting entries in the .htaccess file in the root folder of your deployment. The syntax for adding the MIME types is this:

AddType Mime-type file-extension

For example, for the first three MIME types above, you would add these lines to your .htaccess file:

AddType application/x-ms-application application
AddType application/x-ms-manifest manifest
AddType application/octet-stream deploy

You can create the .htaccess file simply by opening notepad or some other text editor and adding the lines above to it, and saving it with the file name of .htaccess. Then copy it to the root of your deployment folders, and those MIME types will work for that folder and all of its subfolders.

For more information than you ever wanted to know about .htaccess files, check out this article.

Cómo crear, modificar y eliminar un DSN mediante programación

Cómo crear, modificar y eliminar un DSN mediante programación
Por Enrique Martínez Montejo[Microsoft Most Valuable Professional - Visual Basic]
Última revisión: 14/08/2003

El siguiente artículo explica la manera de configurar un origen de datos
con nombre mediante programación, lo que proporcionará una flexibilidad mayor
a la hora de tener acceso a los datos, ya que el usuario no necesitará
explícitamente utilizar el Adminitrador de orígenes de datos ODBC para crear,
configurar, modificar y eliminar un DSN. Para ello utilizaremos la función API
SQLConfigDataSource incluída en la biblioteca de vínculos dinámicos
ODBC32.DLL, cuya declaración es la siguiente:

Private Declare Function SQLConfigDataSource Lib
"ODBCCP32.DLL" ( _

ByVal hwndParent As Long, ByVal fRequest As Long, _

ByVal lpszDriver As String, ByVal lpszAttributes As String)
As Long

Argumentos de la función

hwndParent

Manipulador de la ventana padre. Si el manipulador es nulo, no se
visualizará ningún cuadro de diálogo de configuración. Si por el contrario le
indicamos el valor de la propiedad hWnd de un formulario, se mostrará
el correspondiente cuadro de diálogo de configuración para validar que todos
los datos sean correctos. Si el orígen de datos con nombre ya existe, el cuado
de diálogo nos preguntará si deseamos sobreescribir el DSN ya existente.

fRequest

Tipo de petición. Éste argumento puede contener uno de los siguientes
valores:

Constante Valor Descripción
ODBC_ADD_DSN 1 Añade un nuevo DSN de usuario.
ODBC_CONFIG_DSN 2 Condigura (modifica) un DSN de usuario ya existente.
ODBC_REMOVE_DSN 3 Elimina un DSN de usuario existente.
ODBC_ADD_SYS_DSN 4 Añade un nuevo DSN de sistema.
ODBC_CONFIG_SYS_DSN 5 Modifica un DSN de sistema ya existente
ODBC_REMOVE_SYS_DSN 6 Elimina un DSN de sistema existente.

lpszDriver

La descripción del controlador que se utilizará. Éste es el nombre
presentado a los usuarios en lugar del nombre del controlador físico (archivo
DLL). Entre otros muchos, algunos valores pueden ser:

Microsoft Access Driver (*.mdb) Para bases de datos Microsoft Access.
Microsoft Excel Driver (*.xls) Para archivos de libros de trabajo de Microsoft Excel.
Microsoft Text Driver (*.txt; *.csv) Para archivos de texto con formato de tabla.
SQL Server Para bases de datos Microsoft SQL Server.
Microsoft dBASE Driver (*.dbf) Para archivos de base de datos dBASE.

Para conocer la descripción de los controladores que puede utilizar en su
sistema, revise las subclaves especificadas en la siguiente clave del Registro
de Windows:

HKEY_LOCAL_MACHINESOFTWAREODBCODBCINST.INI

lpszAttributes

Lista de los atributos en forma de "nombre de clave=valor". Estas cadenas
deberán estar separadas por terminaciones Null. Los atributos especificados son
generalmente entradas predeterminadas específicas del controlador, y que se
incluyen en el Registro de Windows. No es necesario proporcionar todas las
entradas, ya que el controlador puede solicitárselas al usuario mediante un
cuadro de diálogo, siempre y cuando que en el parámetro
hwndParent se
haya establecido en Null.

Valor de retorno

La función devolverá 1 si ésta ha terminado correctamente, y 0 en caso de
error. Si al llamar a la función no existe ninguna entrada en el Registro de
Windows, la función devolverá 0.

Crear un DSN de usuario para Microsoft Access

Un origen de datos de usuario ODBC almacena la información de conexión al
proveedor de datos indicado, y sólo es visible y utilizable en el equipo
actual por el usuario indicado. Por cada nuevo orígen de datos de usuario, se
creará una subclave en la siguiente clave del Registro de Windows:

HKEY_CURRENT_USERSoftwareODBCODBC.INI

A continuación vamos a crear un nuevo DSN de usuario, que utilizará el
driver de Microsoft Access para conectarse con el origen de datos:

Dim dl As Long               ' Valor devuelto por la función API

Dim sPath As String          ' Ruta de la base de datos

Dim sAttributes As String    ' Aributos

Dim sDriver As String        ' Nombre del controlador

Dim sDescription As String   ' Descripción del DSN

Dim sDsnName As String       ' Nombre del DSN

Const ODBC_ADD_DSN As Long = 1
' Se creará un DSN de usuario

' Establecemos los atributos necesarios

sDsnName = "Ejemplo_DSN_Usuario"

sDescription = "Nuevo DSN de usuario para Access"

sPath = "C:Mis documentosBd1.mdb"

sDriver = "Microsoft Access Driver (*.mdb)"

' Los pares de cadenas acabarán en valor Null

sAttributes = "DSN=" & sDsnName & Chr(0)

sAttributes = sAttributes & "Description=" & sDescription & Chr(0)

sAttributes = sAttributes & "DBQ=" & sPath & Chr(0)

' Indicamos la ruta del archivo de información de grupos de trabajo

sAttributes = sAttributes & "SystemDB=C:WindowsSystemSystem.mdw" & Chr(0)

' El usuario que inicia sesión por defecto

sAttributes = sAttributes & "UID=Admin" & Chr(0)

' La contraseña del usuario por defecto

sAttributes = sAttributes & "PWD=123456" & Chr(0)

' Creamos el nuevo origen de datos de usuario especificado

dl = SQLConfigDataSource(0&, ODBC_ADD_DSN, sDriver, sAttributes)

If (dl = 1) Then

MsgBox "El DSN de usuario se ha creado correctamente."

Else

MsgBox "No se ha podido crear el DSN de usuario
especificado."

End If

Crear un DSN de sistema para Microsoft SQL Server

Un origen de datos de sistema ODBC almacena información acerca de cómo
conectarse al proveedor de datos indicado. Un origen de datos de sistema es
visible para todos los usuarios de un equipo, incluidos los servicios de NT. A
diferencia del lugar donde se almacena la información del DSN de usuario, por
cada nuevo orígen de datos de sistema se creará una subclave en la siguiente
clave del Registro de Windows:

HKEY_LOCAL_MACHINESOFTWAREODBCODBC.INI

A continuación vamos a crear un nuevo DSN de sistema, que utilizará el
driver de Microsoft SQL Server para conectarse con el origen de datos:

Dim dl As Long                          ' Valor devuelto por la función API

Dim sAttributes As String               ' Aributos

Dim sDriver As String                   ' Nombre del controlador

Dim sDescription As String              ' Descripción del DSN

Dim sDsnName As String
' Nombre del DSN

Const ODBC_ADD_SYS_DSN As Long = 4      ' Se creará un DSN de sistema

Const vbAPINull As Long = 0&            ' Puntero NULL

' Establecemos los atributos necesarios

sDsnName = "Ejemplo_DSN_Sistema"

sDescription = "Nuevo DSN de sistema para SQL Server"

sDriver = "SQL Server"

' Los pares de cadenas acabarán en valor Null

sAttributes = "DSN=" & sDsnName & Chr(0)

sAttributes = sAttributes & "Server=(Local)" & Chr$(0)

sAttributes = sAttributes & "Description=" & sDescription & Chr(0)

sAttributes = sAttributes & "Database=pubs" & Chr(0)

' Si deseamos utilizar la autenticación de Windows NT, deberemos de

' especificarlo en la cadena de atributos

sAttributes = sAttributes & "Trusted_Connection=True" & Chr(0)

' Creamos el nuevo origen de datos de usuario especificado.

' Si deseamos que aparezca el cuadro de diálogo, tendremos que

' especificar la propiedad «hWnd» del formulario donde se realiza

' la llamada a la función API.

dl = SQLConfigDataSource(vbAPINull, ODBC_ADD_SYS_DSN, sDriver, sAttributes)

If (dl) Then

MsgBox "Se ha creado el DSN de sistema."

Else

MsgBox "No se ha podido crear el DSN de sistema."

End If

Modificar un DSN de usuario para Microsoft dBASE Driver

Para que la función API modifique los valores que deseemos, necesariamente
tendremos que indicar el nombre del origen de datos de usuario (o de sistema)
así como el nombre del driver ODBC utilizado. Igualmente, el parámetro
fRequest
deberá de tener el valor de la constante ODBC_CONFIG_DSN (para modificar un
DSN de usuario) o
ODBC_CONFIG_SYS_DSN (para modificar un DSN de sistema).

A continuación vamos a modificar la ruta del directorio por defecto que
tenemos especificado en un DSN de usuario, el cual utiliza el driver ODBC de
Microsoft dBASE:

Dim dl As Long                     ' Valor devuelto por la función API

Dim sAttributes As String          ' Aributos

Dim sDriver As String              ' Nombre del controlador

Dim sDsnName As String
' Nombre del DSN

Const ODBC_CONFIG_DSN As Long = 2  ' Se modificará un
DSN de usuario

' Establecemos los atributos necesarios

sDsnName = "dBASE Files"

sDriver = "Microsoft dBASE Driver (*.dbf)"

' Los pares de cadenas acabarán en valor Null

sAttributes = "DSN=" & sDsnName & Chr(0)

sAttributes = sAttributes & "DefaultDir= C:Mis documentos" & Chr(0)

' Modificamos el origen de datos de usuario especificado

dl = SQLConfigDataSource(0&, ODBC_CONFIG_DSN, sDriver, sAttributes)

If (dl = 1) Then

MsgBox "El DSN de usuario se ha modificado correctamente."

Else

MsgBox "No se ha podido modificar el DSN de usuario
especificado."

End If

Si no se especifica el parámetro DefaultDir, el driver ODBC para
dBASE utilizará el directorio actual del sistema, salvo que en la cadena de
conexión especifiquemos explícitamente dicho parámetro.

Eliminar un DSN de sistema

Para eliminar un nombre de origen con nombre, simplemente deberemos de
especificar el nombre del DSN así como el driver ODBC utilizado. El parámetro
fRequest
deberá de tener el valor de la constante ODBC_REMOVE_DSN (para eliminar un DSN
de usuario) o ODBC_REMOVE_SYS_DSN (para eliminar un DSN de
sistema).

El siguiente ejemplo eliminará definitivamente un DSN de sistema:

Dim dl As Long                 ' Valor devuelto por la función API

Dim sDriver As String          ' Nombre del controlador

Dim sDsnName As String         '
Nombre del DSN

Const ODBC_REMOVE_SYS_DSN As Long = 6    ' Se eliminará un DSN
de sistema

' Establecemos los atributos necesarios

' CUIDADO: no dejar espacios en blanco entre el parámetro

' «DSN», el signo igual y el nombre del DSN (DSN=Nombre DSN)

sDsnName = "DSN=Ejemplo_DSN_Sistema"

sDriver = "SQL Server"

' Modificamos el origen de datos de usuario especificado

dl = SQLConfigDataSource(0&, ODBC_REMOVE_SYS_DSN, sDriver, sDsnName)

If (dl = 1) Then

MsgBox "El DSN de sistema se ha eliminado correctamente."

Else

MsgBox "No se ha podido eliminar el DSN de sistema
especificado."

End If

http://mvp-access.es/softjaen/vb6/api/odbc/sjtodbc002.htm

Cómo: Crear mediante programación un objeto de conjunto de datos jerárquicos con ADO.NET en Visual Basic .NET

Imports System
Imports System.Data
Imports System.XML

 

Dim myDS As New Data.DataSet("CusOrd")
Dim myCustomers As Data.DataTable = myDS.Tables.Add("Customers")
Dim myOrders As Data.DataTable = myDS.Tables.Add("Orders")
Dim myDr As Data.DataRow

With myCustomers
.Columns.Add("CustomerID", Type.GetType("System.String"))
.Columns.Add("CompanyName", Type.GetType("System.String"))
.Columns.Add("ContactName", Type.GetType("System.String"))
End With

With myOrders
.Columns.Add("OrderID", Type.GetType("System.Int32"))
.Columns.Add("CustomerID", Type.GetType("System.String"))
.Columns.Add("EmployeeID", Type.GetType("System.Int32"))
.Columns.Add("OrderDate", Type.GetType("System.DateTime"))
.Columns.Add("RequiredDate", Type.GetType("System.DateTime"))
End With

myDS.Relations.Add("rel_Customers_Orders", _
myDS.Tables("Customers").Columns("CustomerID"), _
myDS.Tables("Orders").Columns("CustomerID"))

myDr = myCustomers.NewRow()
myDr("CustomerID") = "9876"
myDr("CompanyName") = "Lucerne Publishing"
myDr("ContactName") = "Kim Ralls"

myCustomers.Rows.Add(myDr)

myDr = myOrders.NewRow()
myDr("OrderID") = 6521
myDr("CustomerID") = "9876"
myDr("EmployeeID") = 852
myDr("OrderDate") = #1/5/2002#
myDr("RequiredDate") = #2/1/2002#
myOrders.Rows.Add(myDr)

Console.WriteLine(myDS.GetXml())

http://support2.microsoft.com/kb/316260/es

Instalar mcrypt en PHP 5.3.3 on CentOS

Para verificar si se encuentra disponible el paquete en los repositorios:

yum list php* | grep mcry

De estar disponible se procede a la instalacion del paquete mediante:

yum install php53-mcrypt

yum install php-mcrypt

Con la siguiente linea se puede agregar el repositorio para poder realizar la instalación

rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm yum install php53-mcrypt

Creacion de tablas con valores predeterminados e indices

CREATE TABLE dbo.status_tabla
(
id int NOT NULL,
status_tabla nvarchar(50) NOT NULL
)  ON [PRIMARY]
GO
ALTER TABLE dbo.status_tabla ADD CONSTRAINT
PK_status_tabla PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
CREATE UNIQUE NONCLUSTERED INDEX IX_status_tabla ON dbo.status_tabla
(
status_tabla
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

Creacion de tablas, valores predeterminados e integridad referencial en SQL Server

CREATE TABLE dbo.presupuesto
(
id int NOT NULL,
idorden int NOT NULL,
fecha smalldatetime NOT NULL,
idusuario_captura int NOT NULL,
fechautoriza smalldatetime NULL,
idusuario_autoriza int NOT NULL,
importotal money NOT NULL,
idstatus_presupuesto int NOT NULL
)  ON [PRIMARY]
GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
DF_presupuesto_fecha DEFAULT GETDATE() FOR fecha
GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
DF_presupuesto_importotal DEFAULT 0 FOR importotal
GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
DF_presupuesto_idstatus_presupuesto DEFAULT 0 FOR idstatus_presupuesto
GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
PK_presupuesto PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
fk_presupuesto_orden FOREIGN KEY
(
idorden
) REFERENCES dbo.orden
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
fk_presupuesto_usuario_captura FOREIGN KEY
(
idusuario_captura
) REFERENCES dbo.usuario
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
fk_presupuesto_usuario_autoriza FOREIGN KEY
(
idusuario_autoriza
) REFERENCES dbo.usuario
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuesto ADD CONSTRAINT
fk_presupuesto_status_presupuesto FOREIGN KEY
(
idstatus_presupuesto
) REFERENCES dbo.status_presupuesto
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuesto SET (LOCK_ESCALATION = TABLE)
GO

CREATE TABLE dbo.presupuestodet
(
id int NOT NULL,
numpar int NOT NULL,
idpresupuesto int NOT NULL,
cant float NOT NULL,
idproduc int NOT NULL,
idreparaclasif int NOT NULL,
idrepara int NOT NULL,
fechvigencia smalldatetime,
precio float NOT NULL,
impor float NOT NULL,
)  ON [PRIMARY]
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
PK_status_presupuesto PRIMARY KEY CLUSTERED
(
id
) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_cant DEFAULT 0 FOR cant
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_idproduc DEFAULT 0 FOR idproduc
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_idreparaclasif DEFAULT 0 FOR idreparaclasif
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_idrepara DEFAULT 0 FOR idrepara
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_fechvigencia DEFAULT GETDATE() FOR fechvigencia
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_precio DEFAULT 0 FOR precio
GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
DF_presupuestodet_impor DEFAULT 0 FOR impor
GO

ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
fk_presupuestodet_presupuesto FOREIGN KEY
(
idpresupuesto
) REFERENCES dbo.presupuesto
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
fk_presupuestodet_produc FOREIGN KEY
(
idproduc
) REFERENCES dbo.produc
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
fk_presupuestodet_reparaclasif FOREIGN KEY
(
idreparaclasif
) REFERENCES dbo.reparaclasif
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO
ALTER TABLE dbo.presupuestodet ADD CONSTRAINT
fk_presupuestodet_repara FOREIGN KEY
(
idrepara
) REFERENCES dbo.repara
(
id
) ON UPDATE  NO ACTION
ON DELETE  NO ACTION

GO

Expresiones regulares en PHP

Validar un nombre de usuario

Esta regla es para permitir usuarios de 4 hasta 28 caracteres de longitud, alfanuméricos y permitir guiones bajos.

$string = "userNaME4234432_";
if (preg_match('/^[a-zd_]{4,28}$/i', $string)) {
    echo "example 1 successful.";
}

Números telefónicos
Esto es para validar números de teléfono (en el formato de Estados Unidos, Canadá y México) el número debe ser de la siguiente manera: (###)###-####

$string = "(032)555-5555";
if (preg_match('/^((?[0-9]{3,3})?|[0-9]{3,3}[-. ]?)[ ][0-9]{3,3}[-. ]?[0-9]{4,4}$/', $string)) {
echo "ejemplo 2 realizado con  éxito.";
}

El número de teléfono puede ser escrito así (###) ###-####, o así ###-###-#### y también va a validar.

Direcciones de Email

No hace falta decir más el código es el siguiente.

$string = "first.last@domain.co.uk";
if (preg_match(
'/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/',
$string)) {
    echo "ejemplo 3 realizado con éxito.";
}

Códigos postales

Códigos postales de que permite solo números en el siguiente formato xxxxx y xxxxx-xxxx

$string = "55324-4324";
if (preg_match('/^[0-9]{5,5}([- ]?[0-9]{4,4})?$/', $string)) {
    echo "ejemplo 4 realizado con éxito.";
}

Direcciones IP

No necesitamos hacer un PING ni nada por el estilo, sólo verificamos que estén bien escritas, cómo este ejemplo 255.255.255.0.

$string = "255.255.255.0";
if (preg_match(
'^(?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)(?:[.](?:25[0-5]|2[0-4]d|1dd|[1-9]d|d)){3}$',
$string)) {
    echo "ejemplo 5 realizado con éxito.";
}

Colores hexadecimales

Ya que hablamos de números tambien podemos verificar valores hexadecimales de números en sus 2 formas la normal y la abreviada (#333, 333, #333333 o 333333) con el símbolo # opcional.

$string = "#666666";
if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) {
    echo "ejemplo 6 realizado con éxito.";
}

Buscar comentarios multi-línea

Una forma simple de buscar o eliminar comentarios multilínea en PHP/CSS/Otros lenguajes.

$string = "/* commmmment */";
if (preg_match('/^[(/*)+.+(*/)]$/', $string)) {
    echo "ejemplo 7 realizado con éxito.";
}

Fechas
Uno de los formatos de fechas típicos es el MM/DD/YYYY y su validación es la siguiente.

$string = "10/15/2007";
if (preg_match('/^d{1,2}/d{1,2}/d{4}$/', $string)) {
    echo "ejemplo 8 realizado con éxito.";
}