26
Dec

Agregar Twitter @AnyWhere a los comentarios de WordPress

Siguiendo el tutorial sobre “How to Integrate Twitters @Anywhere with your WordPress Comments” pude integrar Twitter @AnyWhere en los comentarios de mi blog wordpress. El tutorial no es tan sencillo, pero como no encontré ningún plugin que lo haga de forma automática vamos a verlo de a poco.

Twitter AnyWhere

Utilizar la API de Twitter

Lo primero que hay que hacer es registrarse para utilizar la API de Twitter. Esto es necesario para utilizar Twitter @AnyWhere.

Agregar el campo de Twitter al formulario de comentarios

Lo primero es agregar el campo en el formulario de comentarios para que tus visitantes puedan ingresar su nombre de usuario de Twitter. Desde el editor del tema vamos al archivo comments.php y buscamos donde se agregan los campos del formulario y le agregamos los siguientes:

1
2
3
4
<p>
    <input type="text" name="twitter_username" id="twitter_username" class="text" value="<?php echo bm_getCurrentTwitterUser(); ?>" size="22" tabindex="4" />
    <label for="twitter_username"><?php _e('Twitter Username', BM_THEMENAME); ?></label>
</p>

Recordar el nombre de usuario de Twitter

Se va a guardar el nombre de usuario de Twitter en una cookie que será salvado más adelante. Esto sirve para que los usuarios que recurrentes no tengan que completar el campo campo cada vez que quieran comentar algo, de esta forma queda consistente con los demás campos del formulario. En el archivo functions.php debemos agregar la siguiente función:

1
2
3
4
5
6
7
8
9
10
11
function bm_getCurrentTwitterUser () {
    $comment_twitterUser = '';

    if (isset($_COOKIE['comment_twitteruser_' . COOKIEHASH])) {
        $comment_twitterUser = $_COOKIE['comment_twitteruser_' . COOKIEHASH];
        $comment_twitterUser = stripslashes ($comment_twitterUser);
        $comment_twitterUser = esc_attr ($comment_twitterUser);
    }

    return $comment_twitterUser;
}

Agregar el nombre de usuario de Twitter para los usuarios registrados

De esta forma los usuarios registrados podrán agregar su nombre de usuario de Twitter desde su perfil, así este valor se agregara automáticamente en los comentarios que estos usuarios dejen. Nuevamente en el archivo functions.php agregamos estas funciones:

1
2
3
4
5
6
function my_new_contactmethods( $contactmethods ) {
    $contactmethods['twitter'] = 'Twitter';
    return $contactmethods;
}

add_filter('user_contactmethods','my_new_contactmethods',10,1);

Guardando el nombre de usuario de Twitter en los comentarios

Para los usuarios que no están registrados en el blog debemos guardar este valor en cada comentario. Para esto en el archivo functions.php debemos agregar el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function bm_saveTwitterUser ($post_id) {
    global $user;

    // only save the twitter details for users who are not logged in
    if (!is_user_logged_in()) {

        // if an account name is specified
        if (isset($_POST['twitter_username'])) {
            // save cooke for...
            $comment_cookie_lifetime = apply_filters('comment_cookie_lifetime', 30000000);
            // sanitize username
            $twitter_user = esc_html ($_POST['twitter_username']);
            $twitter_user = str_replace('http://twitter.com/', '', $twitter_user);
            // save cookie to use in comment form
            setcookie('comment_twitteruser_' . COOKIEHASH, $twitter_user, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN);
            // save name to db
            add_comment_meta ($post_id, 'twitter_user', $twitter_user, true);
        }
    }
}

add_action ('comment_post', 'bm_saveTwitterUser');

Mostrar el nombre de usuario de Twitter en los comentarios

En esta parte es donde más pueden utilizar la imaginación para mostrar el nombre de usuario de Twitter, yo lo coloque seguido al nombre de quien comenta, pero lo pueden colocar en cualquier parte del comentario. El código se debe colocar en el archivo comments.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$twittername = '';
$commentAuthorUrl = get_comment_author_url();

if ($comment->user_id > 0) {
    $auth = get_userdata ($comment->user_id);
}

if (isset($auth->twitter)) {
    $twittername = $auth->twitter;
} else {
    $twitter_user_array = get_comment_meta (get_comment_ID(), 'twitter_user');
    if ($twitter_user_array[0]) {
        $twittername = $twitter_user_array[0];
    }
}

if ($twittername != '') {
?>
                (<a class="twitter_anywhere" href="http://twitter.com/<?php echo $twittername; ?>">@<?php echo $twittername; ?></a>)
<?php
}
?>

Agregar el Javascript para mostrar la tarjeta de Twitter @AnyWhere

El código Javascript es el encargado de armar la tarjeta de Twitter @AnyWhere en los comentarios de WordPress. Se puede colocar en el archivo header.php dentro de las etiquetas head o hay quienes recomiendan colocarlo en el footer.php antes de cerrar la etiqueta body para que no interfiera con la carga de la página.

1
2
3
4
5
6
7
8
9
<script src="http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1"></script>
<script type="text/javascript">
    twttr.anywhere(function(twitter) {
        twitter('.commentlist').linkifyUsers();
        twitter('.twitter_anywhere').hovercards({
            infer: true
        });
    });
</script>

Es necesario sustituir “YOUR_API_KEY” en el javascript por la clave que nos dieron al registrar la aplicación.

27
Nov

Cómo agregar comentarios de Facebook a mi página web

Facebook cuenta con varios plugins sociales para integrar en nuestros sitios web, algunos más sencillos que otros al momento de integrar. Ayer implemente los comentarios de Facebook a mi página de videos de fútbol así que les voy a contar como se hace.

Lo primero que se debe hacer es crear una aplicación de Facebook para obtener la appId necesaria para hacer andar los comentarios. Y así es como debería quedar el código en tu página:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
&nbsp;

&nbsp;
<div id="fb-root"></div>
<script type="text/javascript">// <![CDATA[

      window.fbAsyncInit = function() {
        FB.init({appId: 'xxxxxxxxxxxxx', status: true, cookie: true,
                 xfbml: true});        
      };
      (function() {
        var e = document.createElement('script');
        e.type = 'text/javascript';
        e.src = document.location.protocol +
          '//connect.facebook.net/es_LA/all.js';
        e.async = true;
        document.getElementById('fb-root').appendChild(e);
      }()); 

// ]]></script>

En la etiqueta fb:comments debes cambiar xid=”id_comentario” y poner un identificador de tu página para que el plugin de Facebook sepa a que comentarios corresponde, también debes cambiar el title=”titulo_comentario”.

Con estos pasos ya vas a tener los comentarios de Facebook andando en tu página web sin necesidad de saber nada de programación.

31
Oct

Patrones de Diseño

¿Que es un patrón de diseño?

Es una descripción de objetos y clases comunicándose entre sí, que se personalizan para resolver un problema general del diseño de software en un contexto particular.
La descripción de la solución sl problema general se realiza en términos de estructura  (clases, interfaces, relaciones) y comportamiento (interacciones entre objetos).

Singleton

Problema: ¿Comó asegurar que una clase tenga una única instancia accesible globalmente?
Aplicabilidad: Utilice Singleton cuando una clase deba tener una única instancia globalmente accesible para cualquie cliente.
Estructura:
Comportamiento:
Consecuencias:
  • Permite el acceso controlado a una instancia.
  • Fácilmente modificable para permitir un conjunto de instancias.

Composite

Problema: ¿Cómo tratar objetos que pueden ser compuestos de otros objetos como si fueran objetos individuales?
Aplicabilidad:
  • Representar jerarquías de objetos compuestos de otros objetos así como de objetos individuales.
  • Los clientes ignoran las diferencias entre objetos individuales y objetos compuestos dentro de esa jerarquía y los manipulan indistintamente.
Estructura:
Consecuencias:
  • Fácil introducción de nuevos tipos de componentes sin modificar código cliente existente.
  • Los clientes son sencillos: evita lógica condicional en ellos y manipulan de igual forma los componentes.
  • Generalidad VS Control: el hecho de que los componentes sean tratados genéricamente (lo cual es una ventaja para el cliente) también presenta una desventaja en cuanto no poder controlar el tipo de elementos de un compuesto (ej: si se tienen dos tipos de hojas y se necesita que determinado elemento compuesto sólo tenga un tipo de hoja).

Proxy

Problema: ¿Cómo impedir el acceso directo a un objeto?
Aplicabilidad:
  • Remote Proxy: provee un representante local para un objeto que se encuentra en otra ubicación.
  • Virtual Proxy: crea objetos “caros” a demanda.
  • Protection Proxy: controla el acceso al objeto original.
Estructura:
Consecuencias:
  • Introduce un nivel de indirección, cuya utilidad depende de la variante utilizada:
    • Remote Proxy: oculta el hecho que el objeto real se encuentra en una ubicación remota.
    • Virtual Proxy: realiza optimizaciones como crear un objeto a demanda en lugar de tenerlo instanciado siempre.
    • Protection Proxy: permite tareas de control y mantenimiento cada vez que el objeto real es accedido.
  • En los casos donde el Proxy no deba instanciar el objeto real, podría conocerlo a través de una interfaz.

Adapter

Problema: ¿Cómo hacer interactuar una clase ya creada con otra cuya interfaz cambió?
Aplicabilidad:
  • Si la clase A utiliza la clase B y los servicios que brinda B cambian, A se verá afectada y también deberá cambiar, a menos que se introduzca una clase X que se adapte al uso de A pero conociendo la nueva B.
    Es decir que se pasa de A > B a tener A > X > B
  • Resolver incompatibilidad de interfaces.
Estructura:
Consecuencias:
  • Un adaptador puede cambiar su clase de destino dinámicamente.
  • Un adaptador puede simplemente adaptar el nombre de una operación hasta adaptar toda una interfaz completa, incluyendo los parametros.
  • Generalmente el objeto adaptado ya no puede ser utilizado mediante su vieja interfaz (a menos que el adapter tambien lo permita).

Template Method

Problema: Definir el esqueleto de un algoritmo en una operación, relegando algunos pasos a subclases. Las subclases redifinirian ciertos pasos del algoritmo sin cambiar su estructura.
Aplicabilidad:
  • Implementar las partes invariantes de un algoritmo una única vez y delegar los pasos variables a subclases.
  • Para factorizar comportamiento común de subclases en una nueva clase abstracta.
Estructura:
Consecuencias:
  • Es importante diferenciar aquellas operaciones utilizados por los templates method que deban ser reddefinidas (que serán abstractas en la super clase) de las que puedan ser redefinidas (que serán concretas en la super clase).
  • El template method no debera ser redefinido.
  • Cuantas más operaciones abstractas se definan en la clase abstracta, más trabajo deberán realizar las clases concretas.

Observer

Problema: Definir una dependencia “uno a muchos” entre objetos de tal forma que cuando el “uno” cambie, los “muchos” sean notificados.
Aplicabilidad:
  • Cuando un elemento tenga dos aspectos, uno dependiente del otro, y encapsularlos en objetos diferentes permite modificarlos y reutilizarlos independientemente.
  • Cuando cambios en un objeto requieran cambios en otros objetos, y no se sabe cuántos de éstos últimos serán.
  • Cuando un objeto deba notificar a otros sin acoplarse a éstos.
Estructura:
Consecuencias:
  • El Subject puede separarse en dos: una clase abstracta Subject con operaciones de attach, detach y notifyAll (ya predefinidas) y una subclase ConcreteSubject que representa el tipo de objeto que será observado.
  • En la estructura se mostró que el Subject posee un método ( operación() ) el cual desencadena el cambio de estado, por lo que deberá invocar a notifyAll() el cual fue declarado como privado. Sin embargo, no tienen porqué ser dos métodos diferentes.
  • La operación notify() puede enviar parámetros que contengan información sobre el cambio ocurrido en el Subject.
  • Generalmente son los propios observadores los que cambian el estado del Subject (en este caso invocando operacion() ).
  • Para que un objeto sea notificado:
    1. Su clase debe implementar la interfaz Observer
    2. El objeto debe registrarse ante el Subject

State

Problema: Permitir a un objeto alterar su comportamiento cuando su estado interno cambie. El objeto parecerá haber cambiado de clase.
Aplicabilidad:
  • Cuando el comportamiento de un objeto dependa de su estado y debe cambiar su comportamiento en tiempo de ejecución dependiendo de ese estado.
  • Cuando las operaciones contengan sentencias condicionales que dependan del estado del objeto.
Estructura:
Consecuencias:
  • El patrón State representa el estado como un objeto por sí mismo, con una subclase por cada estado posible del objeto.
  • Los cambios de estado pueden ser manejados ya sea por los propios estados o bien por el Context.
  • Si los cambios los manejan los propios estados, entonces el Diagrama de Clases debe modificarse colocándose las dependencias entre estados que correspondan.
  • El Context puede enviar información mediante parametros de oper() o bien enviarselos a si mismo para que los estados puedan consultar información.
  • El patrón State puede combinarse con Singleton para hacer que los estados concretos tengan una unica instancia.
  • Agregar nuevos tipos de estados concretos tiene un bajo impacto, pues únicamente implica que alguien debe devolver ese nuevo estado concreto.
  • Se puede utilizar un Diagrama de Estados para representar como es la lógica de cambio de estado del objeto.
  • En caso de no ser apropiado que oper() retorne el nuevo estado entonces el Context puede proveer una operación pública de cambio de estado.

Strategy

Problema: Definir una familia de algoritmos, encapsular cada uno de ellos en una clase y hacerlos intercambiables. Strategy permite variar el algoritmo independientemente de los clientes que lo utilicen.
Aplicabilidad:
  • Cuando muchas clases relacionadas difieran sólo en su comportamiento.
  • Cuando necesite diferentes diferentes variantes de un algoritmo.
  • Cuando una clase contenga diferentes comportamientos mediante sentencias condicionales.
Estructura:
Consecuencias:
  • El Context puede enviar información mediante parámetros o bien eviarse a sí mismo para que las estrategias concretas puedan consultar información.
  • El Cliente tiene a su disposición una familia de algoritmos de la cual elegir una para crear el Context, luego de lo cual el Cliente sólo interectuará con éste.
  • La estrategia concreta puede cambiarse dinamicamente.
  • El Cliente conoce las estrategias concretas y selecciona una para su utilización. Esto significa que Strategy debe utilizarse cuando este acoplamiento sea aceptable.
  • Las estrategias concretas pueden ser Singleton y ser compartidas por todos los Context.
  • Opcionalmente, el Context puede contener una implementación por defecto del algoritmo, con lo que permitiría su uso aún sin haber creado ninguna estrategia concreta.
31
Oct

Envio de Mails con Asp.Net

El envio de Mails con Asp.Net es muy sencillo. Primero necesitamos una cuenta de mail con todos los datos para poder acceder desde nuestro codigo.

Para poder realizar el envio hay que agregar los siguientes espacios de nombres:

using System.Net;
using System.Net.Mail;

El codigo a utilizar es el siguiente:

MailMessage mail = new MailMessage();
mail.To.Add(“destinatario@mail.com”);
mail.From = new MailAddress(“prueba@adinet.com.uy”);
mail.Subject = “Mail de prueba”;
mail.Body = “Probando el envio de Mails con Asp.Net”;
mail.IsBodyHtml = false;
mail.Priority = MailPriority.Normal;

SmtpClient smtp = new SmtpClient();
smtp.Host = “adinet.com.uy”;
smtp.Credentials = new NetworkCredential(“prueba”, “password”);
smtp.Send(mail);

Primero creamos el objeto Mail:
MailMessage mail = new MailMessage();

Le agregamos las direcciones de mails de los destinatario , al ser una colección se pueden agregar vairas direcciones en el mismo envio:
mail.To.Add(“destinatario@mail.com”);

La dirección desde donde va a ser enviado el Mail:
mail.From = new MailAddress(“prueba@adinet.com.uy”);

El asunto del Mail:
mail.Subject = “Mail de prueba”;

El contenido del Mail:
mail.Body = “Probando el envio de Mails con Asp.Net”;

Especificamos si el Mail esta en formato Html:
mail.IsBodyHtml = false;

La prioridad del Mail:
mail.Priority = MailPriority.Normal;

Hasta aca eran los datos del Mail, ahora veremos los datos del servidor.

Creamos el objeto SmtpClient:
SmtpClient smtp = new SmtpClient();

Le asignamos el SMTP del servidor (en este caso lo hice con Adinet):
smtp.Host = “adinet.com.uy”;

Los datos del mail desde donde se va a enviar (usuario y contraseña):
smtp.Credentials = new NetworkCredential(“prueba”, “password”);

Y finalmente enviamos el Mail:
smtp.Send(mail);

*Los datos utilizados en el ejemplo no son reales, solo utilizados a modo de ejemplo.
31
Oct

QueryString – Parametros en la URL

Una de las posibles formas de pasar parametros entre páginas es a traves de la url.

Para empezar a agregar parametros lo unico que tenemos que hacer es agregarle a la dirección el signo ? colocar el nombre del parametro y el valor.

Response.Redirect(“Prueba.aspx?id=15”);

En la páginaPrueba.aspx para recuperar el valor sería de la siguiente manera:

string valor = Request.QueryString[“id”];

Para agregar varios parametros en la url podemos juntarlos con el signo &

Response.Redirect(“~/Prueba.aspx?id=15&titulo=Titulo”);

Los recuperamos de la misma manera:

string valor = Request.QueryString[“id”];
string titulo = Request.QueryString[“titulo”];

Ventajas:

Es muy fácil de implementar.

Desventajas:

Tienen un tamaño máximo.
Los parametros quedan visibles, hay que tener cuidado con la información que se maneja.
Los parametros quedan accesibles a ser modificados por el usuario facilmente.
Tiene limitaciones con respecto a algunos caracteres.
31
Oct

Crear Login en WinForms

Lo primero que debemos hacer es crear en nuestra base de datos (en este caso vamos a utilizar la base de datos Northwind) las tablas necesarias para la creacion de usuarios y roles.
Para esto vamos a abrir la consola: Inicio/Ejecutar… cmd
Debemos llegar hasta donde tenemos instalado el FrameWork:

cd \windows\Microsoft.net\framework\v2.0.50727

Luego debemos ejecutar el siguiente comando:

aspnet_regsql.exe -E -S localhost -d Northwind -A all -sqlexportonly c:\membership.sql

De esta forma creamos un script de sql llamado membership en C:
Debemos abrirlo y ejecutarlo en el SQL Server Management Studio para crear las tablas necesarias en nuestra base de datos.

En nustra aplicación Windows debemos crear el archivo App.config, para esto simplemente agregamos un nuevo Archivo de configuración de aplicación a nuestro proyecto.
Este debe quedar de la siguiente forma:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<system.web>
<membership defaultProvider=”SqlProvider”>
<providers>
<clear />
<add name=”SqlProvider” type=”System.Web.Security.SqlMembershipProvider”
connectionStringName=”MiConnectionString” applicationName=”NombreAplicacion”
enablePasswordRetrieval=”false” enablePasswordReset=”false”
requiresQuestionAndAnswer=”false”
requiresUniqueEmail=”true” passwordFormat=”Hashed” />
</providers>
</membership>
</system.web>
<connectionStrings>
<add name=”MiConnectionString”
connectionString=”Mi string de conección a la base de datos”
providerName=”System.Data.SqlClient” />
</connectionStrings>
</configuration>

Al proyecto debemos agregarle una nueva referencia a System.Web

Login Winform

En el codigo de nuestra ventana de autenticación agregamos el espacio de nombres System.Web.Security

Para crear nuevos usuarios utilizaremos el siquiente codigo:

try
{
Membership.CreateUser(“Usuario”, “Contra$ena1”, “mail@mail.com”);
}
catch(Exception es)
{
MessageBox.Show(es.ToString());
}

Para validar a nuestros usuarios el codigo seria el siguiente:

if (Membership.ValidateUser(txtUsuario.Text, txtContrasena.Text))
{
MessageBox.Show(“Usuario válido”);
}
else
{
MessageBox.Show(“Usuario no válido”);
}

Con esto ya tendriamos nuestro Login pronto.

27
Oct

Tareas Programadas en Sql Server 2005

Las tareas programadas son llevadas a cabo por el SQL Server Agent por lo tanto hay que asegurarse que esta inicializado.

Primer paso vamos a dar de alta un Trabajo (Job). Para eso expandimos el SQL Server Agent –> Job –> New Job

Debemos completar el nombre de nuestro Trabajo (Job) y una descripción sería bueno antes de pasar a la siguiente pestaña (Steps).

En esta pestaña vamos a elegir la tarea (o tareas) a realizar por el trabajo. Vamos al botón “Nuevo” o “New” y nos va a abrir una nueva ventana.

Elegimos un nombre para nuestra Tarea (Job) y escribimos el comando que vamos a ejecutar.

En nuestro caso vamos a hacer un respaldo completo de la Base de Datos Adventure Works.

BACKUP DATABASE [AdventureWorks] TO  DISK = N’C:\AdWorks’ WITH NOFORMAT, NOINIT,
NAME = N’AwProdUy’, SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO

Una vez completados los datos le damos OK y volvemos a la ventana anterior a la que podemos seguir agregando Tareas o pasar a la siguiente pestaña donde vamos a agendar el Trabajo (Job).

Nuevamente vamos al boton “Nuevo” o “New” y se nos abre una nueva ventana con los datos para agendar nuestro Trabajo (Job).

En nuestro caso seleccionamos para que se ejecute todos los días a las 2 de la mañana a partir del 16 de noviembre del 2008. Presionamos el botón de OK para guardar y volver a la ventana anterior.

Hasta aquí tenemos todos los pasos para realizar una tarea programada. Podemos agregar más opciónes como enviar notificaciones pero eso lo voy a dejar para más adelante.