Archive for the ‘programación’ Category

0 28
06
2013

Personalizar el login de WordPress

Viernes, junio 28th, 2013

Hoy vamos a ver una sencilla forma de customizar o personalizar nuestra página de login de WordPress.

Simplemente, vamos a cambiar la imagen de wordpress que aparecen en el momento de realizar login, por una imagen personalizada de nuestro proyecto.

Por supuesto, podrás encontrar multitud de plugins wordpress que te permitirán realizar esta tarea, pero vamos a evitar terminar instalando

Este pequeño cambio, le dará a la entrada de nuestra web, un aspecto más profesional, sobre todo pensando en proyectos que realicemos para clientes.

Para cambiar o customizar la imagen de bienvenida en la página de login de wordpress, simplemente debemos añadir el siguiente código en el archivo functions.php de nuestro tema.

<pre><em id="__mceDel">
//============================================================================//
 //---------------------------- START CUSTOM LOGIN ----------------------------//
 //============================================================================//

function custom_login() {
 echo '<style type="text/css">
 h1 a {
 background-image:url(URL_TU_LOGO) !important; }
 </style>';
 }

add_action('login_head', 'custom_login');

//============================================================================//
 //----------------------------- END CUSTOM LOGIN -----------------------------//
 //============================================================================//

De esta sencilla forma, podemos sobreescribir los estilos para añadir una imagen personalizada a la página de login de wordpress, teniendo un resultado final como este:

Custom Login WordPress

Custom Login WordPress

16 03
02
2013

Encriptar y desencriptar en PHP

Domingo, febrero 3rd, 2013

Hoy vamos a implementar una manera sencilla de encriptar y desencriptar cadenas de texto en PHP.

Seguramente ya conocerás que existen diferentes tipos de encriptación, que podríamos englobar en 2 grandes grupos.

  • Encriptación en 2 sentidos o reversible o simétrica: es decir, permite encriptar y desencriptar un texto. Ejemplos de este tipo de encriptación para PHP son base64 (base64_encode y base64_decode) o mcrypt.
  • Encriptación en 1 único sentido o irreversibles o asimétrica: esto es, no se permite la desencriptación del texto encriptado previamente. Dado que recuperar la cadena original se hace imposible, esto hace que la encriptación asimétrica sea más segura que la encriptación simétrica o en 1 único sentido. Ejemplos de funciones PHP de este tipo de encriptación son md5, sha1, crypt, crc32.

A partir de estas herramientras que PHP nos proporciona para realizar labores de encriptación y desencriptación, vamos a construir nuestra clase Encrypter con 2 sencillos métodos:

  • encrypt: nos permitirá encriptar un texto
  • decrypt: permitirá desencriptar un texto previamente encriptado mediante la misma clase Encrypter.

Esta clase Encrypter, con el objetivo de fortalecer la seguridad de la encriptación, se apoyará además en una clave secreta definida de forma interna en el atributo $key.

Por lo tanto, sobra decir que, toda desencriptación que queramos realizar de un texto, deberá realizarse bajo la misma clave secreta que haya sido utilizada en el proceso de encriptación.


/**
* Description of Encrypter
*
* @author jose
*/
class Encrypter {

	private static $Key = "dublin";

	public static function encrypt ($input) {
		$output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), $input, MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))));
		return $output;
	}

	public static function decrypt ($input) {
		$output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), base64_decode($input), MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))), "\0");
		return $output;
	}

}

El uso de la clase Encrypter es más que sencillo, en la primera línea del siguiente código encriptaremos la variable $texto que contiene el string “son unos corruptos”. En la siguiente línea, desencriptamos la variable $texto_encriptado previamente encriptado.

El resultado de la desencriptación guardado en la variable $texto_original, deberá ser igual que el de la variable inicial $texto.


$texto = "Son unos corruptos";

// Encriptamos el texto
$texto_encriptado = Encrypter::encrypt($texto);

// Desencriptamos el texto
$texto_original = Encrypter::decrypt($texto_encriptado);

if ($texto == $texto_original) echo 'Encriptación / Desencriptación realizada correctamente.';

0 26
05
2012

String Replace Ignore Case en C# y VB.NET

Sábado, mayo 26th, 2012

En el día a día del programador, suelen surgir multitud de dudas, que aunque parecen más que obvias, siempre te hacen acudir a internet a buscar la mejor solución.

Hace un par de días, me encontré ante la necesidad de algo tan sumamente sencillo como reemplazar un texto por otro en una cadena, pero ignorando mayúsculas y minúsculas, trabajando en C# .NET.

Lo primero en lo que pensé es que el método String.Replace de .NET permitiría añadir un parámetro opcional para indicar este modificador, pero no es así, por lo que tenemos que buscarnos las habichuelas por otra parte.

Cierto es que tampoco nos tenemos que ir muy lejos, y es nuevamente el poder de las expresiones regulares el que nos permite construir nuestro propio String Replace siendo insensible a mayúsculas y minúsculas.

Ejemplo de Replace Ignore Case en C#

    public string ReplaceIgnoreCase(string original, string search, string replace)
    {
	// Reemplazo habitual
        string value = original.Replace(search, replace);
	// Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
        string value2 = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        return value2;
    }

...
        string original = "La parte contratante de la primera parte";
        string search = "PaRtE";
        string replace = "cosa";
        string replaced = ReplaceIgnoreCase(original, search, replace);

...

Ejemplo de Replace Ignore Case en VB.NET

Public Function ReplaceIgnoreCase(original As String, search As String, replace As String) As String
	' Reemplazo habitual
	Dim value As String = original.Replace(search, replace)
	' Reemplazo utilizando expresiones regules ignorando mayúsculas y minúsculas
	Dim value2 As String = System.Text.RegularExpressions.Regex.Replace(original, search, replace, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
	Return value2
End Function
1 05
05
2012

Cannot locate java installation in specified jdkhome

Sábado, mayo 5th, 2012

Hace algunos días, actualicé mi sistema operativo Ubuntu a su última versión 12.04 LTS Precise Pangolin, y si bien debo reconocer mejoras apreciables en el rendimiento diario del sistema, también me voy encontrando alguna sorpresa inesperada sobre programas usados hasta entonces que se han visto afectados por la actualización.

NetBeans logo

NetBeans logo

Una de esas sorpresas me la encontré hace unos minutos, al intentar abrir el IDE NetBeans, retornando el mensaje de error:

Cannot locate java installation in specified jdkhome

/usr/lib/jvm/…

Do you want to try to use default version?

Parece que la actualización a Ubuntu 12.04 LTS se llevó consigo la actualización de la instalación de Java, y ahora NetBeans es incapaz de localizarla.

Por lo tanto, simplemente vamos a avisar a nuestro IDE NetBeans la ruta donde se encuentra instalado Java para que todo vuelva a la normalidad. Para ello editamos el archivo netbeans.conf que encontrarás bajo

/usr/local/netbeans-7.x/etc/netbeans.conf

y modificamos la variable netbeans_jdkhome indicando tu directorio de instalación Java.

0 24
03
2012

Failed to access IIS metabase ASP.NET

Sábado, marzo 24th, 2012

Si estás intentando ejecutar tu aplicativo web sobre Internet Information Server (IIS) y recibes el siguiente mensaje de error

Failed to access IIS metabase

probablemente has instalado IIS después de instalar .NET Framework.

La solución pasa por reparar la instalación de ASP.NET Framework 2.0, para ello ejecutamos desde la consola de comandos de Visual Studio:

aspnet_regiis.exe -i

o desde la línea de comandos de Windows:

%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i

NOTA: Comprueba tu versión concreta de .NET Framework para indicarlo en la línea anterior.

Saludos a todos

1 23
01
2012

Cómo crear un Servicio de Windows

Lunes, enero 23rd, 2012

Hoy vamos a realizar un pequeño y rápido repaso de cómo crear un Servicio de Windows, en nuestro caso, desde Visual Studio 2008.

Tomaremos como base el siguiente enlace oficial de microsoft: http://msdn.microsoft.com/es-es/library/9k985bc9(v=VS.90).aspx

Creando Windows Service

En primer lugar, seleccionaremos el tipo de plantilla Windows Service o Servicio de Windows para nuestro proyecto.

Plantilla Visual Studio de Windows Service

Plantilla Visual Studio de Windows Service

Una vez generado el proyecto, Visual Studio generará a partir de plantilla los siguientes archivos:

  • Service1.cs (renombrado por manías del guión como Service.cs)
  • Program.cs
Nuevo proyecto de Windows Service

Nuevo proyecto de Windows Service

En la clase Service.cs (recordemos que originalmente se llamaba Service1.cs), creamos los siguientes métodos:

  • onstart
  • onstop
  • oncontinue

#region "Service Methods"
protected override void OnStart(string[] args)
{
Console.WriteLine("Inicio servicio");
}

protected override void OnStop()
{
Console.WriteLine("Fin servicio");
}

protected override void OnContinue()
{
Console.WriteLine("Servicio en ejecución");
}

#endregion "Service Methods"

En el ejemplo simplemente escribimos por consola una traza del método que estamos ejecutando.

Métodos (OnStart, OnStop, OnContinue) Windows Service

Métodos (OnStart, OnStop, OnContinue) Windows Service

Llegados a este punto, el servicio ya podría arrancar, pero dependiendo de la lógica que deba implementar el servicio, tomaremos diferentes formas de mantener vivo el servicio:

Ejemplo 1: Queremos que nuestro servicio se mantenga a la escucha de recibir mensajes de fuentes externas, el pseudocódigo sería algo así:


while (true) {

listener.receive();

}

Ejemplo 2: Queremos que nuestro servicio ejecute tareas cada x tiempo, para lo cual necesitaríamos un Timer para gestionar la ejecución temporal de dichas tareas. En futuros posts crearemos un ejemplo de este tipo de servicios de windows con timer.

Instalando Windows Service

Vamos a preparar ahora nuestro servicio de windows para que podamos instalarlo, para ello:

1. Añadimos los servicios de instalación, clickando sobre el botón derecho sobre el diseñador de Service y clickamos en “Add Installer” o “Añadir Instalador“.

Agregar instalador en Windows Service

Agregar instalador en Windows Service

2. El paso anterior nos genera un nuevo archivo ProjectInstaller.cs como el de la imagen siguiente, agregando 2 nuevos componentes.

Instalador Servicio de Windows

Instalador Servicio de Windows

En las propiedades de ambos componentes del servicio podremos editar el nombre del servicio, el tipo de arranque (manual, automático o deshabilitado), la cuenta con la que se ejecutará el servicio, etc.

Propiedades instalador Windows Service

Propiedades instalador Windows Service

Por último, vamos a preparar la Instalación del servicio de Windows

Crearnos 2 archivos .bat uno para instalación y otro desinstalación, que ejecutarán el comando InstallUtil

Por ejemplo para instalar y desinstalar respecticamente

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil “C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe”pause

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil -u “C:\Inetpub\wwwroot\myservice\bin\Release\myservice.exe”pause

0 27
11
2011

No encontrado en Custom Post Type

Domingo, noviembre 27th, 2011

Toda una tarde de domingo perdida, creando tipos de post customizados en wordpress, y encontrándome un bonito error 404 no encontrado o not found cada vez que quería acceder a un post determinado, o a la página general de la categoría.

Este es uno de mis custom post types que había generado, y que al intentar acceder a los post generados bajo esta categoría, me encontraba con el mensaje No encontrado.


	register_post_type( 'story',
		array(
			'labels' => array(
				'name' => __( 'Stories' ),
				'singular_name' => __( 'Story' )
			),
                        'public' => true,
                        'publicly_queryable' => true,
                        'show_ui' => true,
                        'query_var' => true,
			'has_archive' => true,
			'rewrite' => array('slug' => 'stories'),
                        'menu_position' => 5,
                        'supports' => array (
                            'title', 'editor', 'thumbnail',
                        ),
                        'capability_type' => 'post',
                        'publicly_queryable' => true,
                        'taxonomies' => array('category', 'post_tag')
		)
	);

Pues bien, después de pensar durante horas que existía algún fallo en el código, después de probar con diferentes plugins de wordpress, me da por buscar el problema Not found utilizando los custom post types, y gracias a que siempre existe alguien capaz de compartir sus experiencias en esto de la programación, encontramos la solución:


flush_rewrite_rules( false );

Añade la opción

'has_archive' => true,

a tu código register_post_type.

0 22
10
2011

Habilitar la pluralización de nombres

Sábado, octubre 22nd, 2011

Recientemente me encontraba realizando un proyecto en el que estaba utilizando linq para trabajar con base de datos.

Para ello, generamos nuestro modelo de datos mapeando la base de datos a través de la funcionalidad que proporciona Visual Studio: LINQ to SQL classes.

A grandes rasgos, lo que consigues mapeando tu base de datos a través de un modelo de datos, en este caso a través de LINQ, es generar clases correspondientes a cada una de las tablas existentes.

En próximos posts nos adentraremos más a fondo en cómo funciona LINQ, porque hoy es únicamente momento de explicar cómo habilitar la pluralización de nombres.

Pues bien, como hemos dicho, por cada tabla, se crea una clase, y ahí está el fin de este artículo. El proyecto del que os hablo, lo estaba realizando en diferentes ordenadores sobre Visual Studio 2008, y daba la casualidad, de que al regenerar el modelo de datos (LINQ to classes), en ocasiones aparecían los nombres de las clases en plural y en otras ocasiones los nombres de las clases en singular.

La primera vez no le di mayor importancia, seguro por desconocimiento, y lo achaqué a algún despiste inicial en la generación del diseño de datos.

Pues bien, nada más lejos de la realidad. Estos nombres de clases en plural o singular en nuestro modelo de datos generado para linq, podemos elegir si los deseamos trabajar en plural o singular.

Para ello, simplemente debemos configurar Visual Studio de la siguiente forma:

Herramientas –> Opciones

Dentro del cuadro de diálogo de Opciones, expandimos la sección de Herramientas para base de datos, para seleccionar a continuación la opción O/R Designer.

Una vez llegados a este punto, simplemente debemos elegir True o False para habilitar o no la pluralización de nombres del diseño de bbdd.

Nombres en plural modelo de datos LINQ

Nombres en plural modelo de datos LINQ

Para más información podéis acceder al siguiente enlace de microsoft: activar y desactivar la pluralización

3 16
09
2011

Solucionando … Error Fetching http headers soap

Viernes, septiembre 16th, 2011

Si has llegado hasta aquí, seguramente ya hayas trabajado con Web Services en diferentes lenguajes de programación.
Y si has obtenido la excepcioń “Error Fetching http headers”, estarás trabajando en estos momentos con PHP.

En primer lugar comentarte que este mensaje de error tan descriptivo Error Fetching http headers se habrá producido con gran probabilidad porque ha transcurrido demasiado tiempo ejecutando la llamada al web services, o en otras palabras un poco más técnicas, porque ha expirado el tiempo máximo de espera de ejecución sobre el Web Services.

Lo que en otras plataformas como Java o .NET recibiríamos como una excepción del tipo TimeoutException, aquí lo recibimos como Error Fetching http headers soap.

¿Cómo podemos entonces indicarle a PHP que queremos incrementar el tiempo de espera?

Si tienes acceso a la configuración del servidor, basta con que busques en tu fichero php.ini la variable default_socket_timeout y definas el nuevo tiempo máximo de ejecución (en segundos) que quieras establecer.

default_socket_timeout = 6000

Si por el contrario no tienes acceso al fichero de configuración php.ini, o simplemente prefieres establecer el valor de timeout sobre el web service en tiempo de ejecución, siempre puedes definir este tipo de variables de configuración del sistema a través de la función ini_set(string $varname , string $newvalue).

ini_set('default_socket_timeout', 600);

Espero que la solución te sea de utilidad como me ha sido a mí.

9 25
07
2011

Java y los ficheros .properties

Lunes, julio 25th, 2011

Seguro que muchos ya conocéis qué son y cómo funcionan los ficheros .properties en Java, pero para aquellos que no estén muy familiarizados con este tipo de ficheros de configuración, haremos una pequeña introducción a continuación.

¿Qué son los ficheros .properties para Java?

Los ficheros .properties son archivos que nos permiten almacenar variables de configuración de nuestra aplicación.

En la práctica, no deja de ser un fichero de texto donde almacenar por cada línea, un par clave valor, indicando el nombre de la variable y su valor.

Por ejemplo, podemos almacenar en este tipo de ficheros nuestras variables de configuración para conectar contra base de datos, de esta forma, una vez que el desarrollo pase a un entorno de producción, éste será fácilmente reconfigurable.

Ejemplo:


# DataBase Server
dataBaseServer=localhost

# DataBase Catalog
dataBaseCatalog=mydatabase

# DataBase User
dataBaseUser=myuser

# DataBase Password
dataBasePassword=mypswd

NOTA: Las almohadillas funcionan como comentarios de la línea

¿Cómo trabajar y acceder a los ficheros .properties con Java?

Para trabajar con este tipo de ficheros, Java proporciona la clase java.util.Properties, que a efectos prácticos, no deja de ser una tabla Hash con alguna facilidad más.

Una vez que ya conocemos en qué consisten los ficheros properties, vamos a comprobar cómo trabajar con ellos.

Lo primero que debemos hacer es crear una instancia de java.util.Properties y cargar el fichero de configuración.

Para cargar dicho fichero de propiedades, usaremos el método java.util.Properties.load(input), el cual necesita un parámetro de tipo InputStream, indicando la ruta donde se encuentra el fichero de configuración.

. . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("file.properties");
defaultProps.load(in);
in.close();
...

Vamos a proponer una pequeña variación algo más dinámica para la carga usando getClassLoader y getResourceAsStream.


        this.properties = new Properties();
        try {
            properties.load(Configuration.class.getClassLoader().getResourceAsStream("file.properties"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

En este caso, mi archivo de propiedades se encuentra al nivel del primer paquete/package, tal y como se puede ver en la imagen, dentro de la carpeta src, por lo que cuando genere el proyecto (una aplicación web), el archivo de propiedades quedará dentro del directorio classes.

Accediendo a .properties en Java

Accediendo a .properties en Java

Cómo acceder .properties en Java

Cómo acceder .properties en Java

Ya tenemos cargado desde Java nuestro archivo de configuración mediante un fichero .properties, así que únicamente necesitamos poder acceder a las propiedades de configuración.

Como ya hemos dicho, la clase java.util.Properties, no deja de ser una tabla Hash optimizada para este uso, así que acceder a las variables será muy intuitivo.

Podemos hacer uso del método getProperty de la siguiente manera sobre la instancia creada originalmente.


this.properties.getProperty(key)

 

Clase final para acceder a .properties en Java

Visto a grandes rasgos cómo acceder y trabajar con un fichero .properties desde Java, vamos a crear una clase Configuration.java implementando el patrón Singleton (que explicaremos en próximos artículos), que nos permitirá cargar y gestionar de forma transparente nuestro fichero de propiedades .properties desde una clase Java.

Para que la gestión sea más sencilla, añadiremos también dentro de la propia clase Configuration, unas cuantas constantes que nos permitan acceder de forma más sencilla a la propiedad que estamos buscando.


package com.v3.blog;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

/**
 *
 * @author v3rgu1
 */
public class Configuration {

    Properties properties = null;

    /** Configuration file name */
    public final static String CONFIG_FILE_NAME = "Configuration.properties";

    /** Data base server */
    public final static String DATABASE_SERVER = "dataBaseServer";

    /** Data base name */
    public final static String DATABASE_CATALOG = "dataBaseCatalog";

    /** Data base user */
    public final static String DATABASE_USER = "dataBaseUser";

    /** Data base password */
    public final static String DATABASE_PSWD = "dataBasePassword";

    private Configuration() {
        this.properties = new Properties();
        try {
            properties.load(Configuration.class.getClassLoader().getResourceAsStream(CONFIG_FILE_NAME));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }//Configuration

    /**
     * Implementando Singleton
     *
     * @return
     */
    public static Configuration getInstance() {
        return ConfigurationHolder.INSTANCE;
    }

    private static class ConfigurationHolder {

        private static final Configuration INSTANCE = new Configuration();
    }

    /**
     * Retorna la propiedad de configuración solicitada
     *
     * @param key
     * @return
     */
    public String getProperty(String key) {
        return this.properties.getProperty(key);
    }//getProperty
}

¿Cómo será la llamada?

Configuration.getInstance().getProperty(Configuration.DATABASE_SERVER)