Como poner Firma en los comentarios del autor de Blogger

[1] En primer lugar incluimos las modificaciones en la plantilla que se explican en esa entrada si no lo hemos hecho anteriormente.

[2] Una vez tengamos incluidos todos los cambios para distinguir nuestros comentarios del resto, añadimos la llamada a la imagen en el mismo código que habíamos colocado:


<b:if cond='data:comment.author == data:post.author'>
<dd class='blog-author-comment'>
<p><data:comment.body/><img class='firma' src='URL DE LA FIRMA (IMAGEN)'/></p>
</dd>
<b:else/>

Como podéis ver, le hemos dado una clase (class) a la imagen (en el ejemplo "firma") aunque podéis poner cualquier nombre.

[3] Colocamos ahora en el CSS de la plantilla (antes de ]]></b:skin>) el código necesario para controlar la posición de la firma dentro del cuerpo del comentario:

.firma {
display:block;
width: 45px;
height: 28px;
}


En width: pondremos el ancho que tiene nuestra imagen y en height: el alto.

El resultado será entonces algo así:

Firma comentario

Para controlar la posición de la firma, añadimos una nueva instrucción en el mismo código anterior:

.firma {
display:block;
width: 45px;
height: 28px;
padding-left: 90%;
}


Tendremos que variar el porcentaje (90% en el ejemplo) según la posición que queramos conseguir para la imagen.

Firma controlada


Compartir Enlace

Últimos comentarios personalizados con icono en Blogger

Este script mostrará los últimos comentarios del blog en la sidebar, tal como lo venían haciendo los que he explicado anteriormente en el Escaparate con la diferencia de que, delante de cada comentario, se mostrará una imagen o icono que hayamos escogido previamente.

El script hará que se muestre un icono personalizado para el autor o autores del blog, otro para los demás comentaristas (los que comentan logueados) y uno más para los comentaristas anónimos.
El script puede aplicarse directamente en el mismo gadget, así que no vamos a necesitar de ningún alojamiento externo, ni vamos a depender de ningún servicio externo que nos deje "colgados" sin previo aviso.

[1] Elegimos las imágenes que vamos a usar que, como siempre os recomiendo en casos parecidos, lo mejor es que sean de las mismas medidas y estilo.
Las subimos a un alojamiento adecuado o al mismo Blogger, para obtener la url de cada una de ellas ya que tendremos que incluirlas en el código.

[2] En la parte de Diseño de nuestro panel, añadimos un nuevo gadget HTML y colocamos dentro este código:


<script type="text/javascript">
function showrecentcomments(json) {
  for (var i = 0; i < numcomments; i++) {
    var entry = json.feed.entry[i];
    var alturl;

    if (i == json.feed.entry.length) break;
    for (var k = 0; k < entry.link.length; k++) {
      if (entry.link[k].rel == 'alternate') {
        alturl = entry.link[k].href;
        break;
      }
    }
   var photoslink=new Array()
   photoslink[0]='<img src="http://1.bp.blogspot.com/_8PJ-pgoBhWQ/SeJp1pMWkLI/AAAAAAAAGmo/ggSsVIrdtms/s320/otros.png"/>';
   rosa='<img src="http://2.bp.blogspot.com/_8PJ-pgoBhWQ/SeJpxgrXlGI/AAAAAAAAGmg/7KS4S9cQiro/s320/yo.png"/>';
   anonymous='<img src="http://3.bp.blogspot.com/_8PJ-pgoBhWQ/SeJp4vL4RKI/AAAAAAAAGmw/x20-2kKSkEU/s320/anonymous.png"/>';

   alturl = alturl.replace("#", "#comment-");
   var postlink = alturl.split("#");
   postlink = postlink[0];
   var linktext = postlink.split("/");
   linktext = linktext[5];
   linktext = linktext.split(".html");
   linktext = linktext[0];
   var posttitle = linktext.replace(/-/g," ");
   posttitle = posttitle.link(postlink);
   var commentdate = entry.published.$t;
   var cdyear = commentdate.substring(0,4);
   var cdmonth = commentdate.substring(5,7);
   var cdday = commentdate.substring(8,10);
   var monthnames = new Array();
   monthnames[1] = "Ene";
   monthnames[2] = "Feb";
   monthnames[3] = "Mar";
   monthnames[4] = "Abr";
   monthnames[5] = "May";
   monthnames[6] = "Jun";
   monthnames[7] = "Jul";
   monthnames[8] = "Ago";
   monthnames[9] = "Sep";
   monthnames[10] = "Oct";
   monthnames[11] = "Nov";
   monthnames[12] = "Dic";
   if ("content" in entry) {
     var comment = entry.content.$t;}
   else
   if ("summary" in entry) {
     var comment = entry.summary.$t;}
   else var comment = "";
   var re = /<S[^>]*>/g;
   comment = comment.replace(re, "");
   if (!standardstyling) document.write('<div class="bbrecpost">');
   if (standardstyling) document.write('<br/>');
   if (showcommentdate == true) document.write('El ' + cdday + ' ' + monthnames[parseInt(cdmonth,10)] + ' ');

if( entry.author[0].name.$t == 'Rosa'){ document.write(rosa)}
else{
if( entry.author[0].name.$t == 'Anonymous'){ document.write(anonymous)}
else{document.write(photoslink)}
}
   document.write('<a href="' + alturl + '">' + entry.author[0].name.$t + ', dijo' +'</a>   ');
   if (showposttitle == true) document.write(' en ' + posttitle);
   if (!standardstyling) document.write('</div><div class="bbrecpostsum">');
   if (standardstyling) document.write('<div class="txtmsg"><br/></div>');
   if (comment.length < numchars) {
         if (standardstyling) document.write('<i>');       
         document.write(comment);
         if (standardstyling) document.write('</i>');}
   else
        {
         if (standardstyling) document.write('<i>');
         comment = comment.substring(0, numchars);
         var quoteEnd = comment.lastIndexOf(" ");
         comment = comment.substring(0, quoteEnd);
         document.write(comment + '...<a href="' + alturl + '">(leer mas)</a>');
         if (standardstyling) document.write('</i>');}
   if (!standardstyling) document.write('</div>');
   if (standardstyling) document.write('<br/>');
  }
if (!standardstyling) document.write('<div class="bbwidgetfooter">');
if (standardstyling) document.write('<br/>');
if (!standardstyling) document.write('</div>');}

</script>
<script type="text/javascript">
var numcomments = 8;
var showcommentdate = true;
var showposttitle = true;
var numchars = 50;
var standardstyling = true;
</script>
<script src="http://elescaparatederosa.blogspot.com/feeds/comments/default?alt=json-in-script&callback=showrecentcomments"></script>

[3] En el CSS de nuestra plantilla, antes de ]]></b:skin>, colocamos este código:

/* ultimas opiniones */
.txtmsg {margin: -20px 0 0 0;}


[4] Guardamos los cambios. El resultado será algo como lo que veis en la imagen.

ultimos comentarios icono
Como podéis comprobar el script muestra una serie de datos en cada comentario: la fecha, el icono respectivo, el nombre del autor, el título de la entrada, un resumen del comentario y, por último, un "leer más".

Todos esos datos podemos controlar si mostrarlo o no, en esta parte del script:

var numcomments = 8 Número de comentarios que mostraremos.
var showcommentdate = true; La fecha. Para ocultarla ponemos false.
var showposttitle = true; El título del post. false para ocultarlo.
var numchars = 50; Número de caracteres que muestra el resumen del comentario
var standardstyling = true; Estilo del resumen, true o false.




Notas:
En el código podéis ver destacado en negrita, donde tenéis que poner y como el nombre del autor del blog, es decir, vuestro nick. En mi caso dice Rosa y fijaros que debe ir en letras minúsculas en todos los casos menos en uno que va en mayúsculas, y que ha de estar escrito tal como lo usáis en el blog.

En color naranja he destacado la url del icono que acompaña a todos los comentaristas, en rojo la url del icono de autor y en verde la de los comentaristas anónimos.
He dejado incluidas la url de las imágenes que uso yo en el código por si queréis usarlas y también para que podáis probar el gadget con ellas antes de incluir las vuestras.

[5] Como podéis ver estoy usando el script en el Escaparate con algunas modificaciones, os explico los cambios que tenéis que hacer en el código si queréis que el gadget se vea como aquí:

  • Localizáis en el código ,dijo (con la coma incluida) y lo sustituis por dos puntos :
  • Ponéis false en estas dos líneas del script:
    var showcommentdate = false; y var showposttitle = false;
  • Por último, colocáis estas líneas de código en el CSS de la plantilla (antes de ]]></b:skin>):

    /* ultimos comentarios */
    .txtmsg {
    margin: -20px 0 0 0;
    border-bottom: 1px dashed #88B3C3;
    }

[6] Por último estoy segura que algunos vais a preguntar por la manera de incluir en el gadget a más de un autor (en el caso de blogs compartidos), así que os explico como hacerlo.

Supongamos que el nick del otro autor que vamos a incluir es "Abel".
Localizamos en el script la línea que corresponde a la imagen de "Anónimo":

anonymous='<img src="http://3.bp.blogspot.com/_8PJ-pgoBhWQ/SeJp4vL4RKI/AAAAAAAAGmw/x20-2kKSkEU/s320/anonymous.png"/>';

Y justo debajo pegamos una nueva para el otro autor (en realidad es una copia de las anteriores a la que cambiamos el nick):

abel='<img src="http://3.bp.blogspot.com/_8PJ-pgoBhWQ/SeJp4vL4RKI/AAAAAAAAGmw/x20-2kKSkEU/s320/icons.png"/>';

Una vez añadida y modificada esa línea, vamos a localizar en el código algo más abajo estas líneas:

if( entry.author[0].name.$t == 'Rosa'){ document.write(rosa)}
else{
if( entry.author[0].name.$t == 'Anonymous'){ document.write(anonymous)}
else{document.write(photoslink)}
}


Justo debajo de la del autor del blog, añadimos la del nuevo autor, que al igual que antes es una copia de esta misma a la que cambiamos el nick y añadimos también una nueva llave de cierre:

if( entry.author[0].name.$t == 'Rosa'){ document.write(rosa)}
else{
if( entry.author[0].name.$t == 'Abel'){ document.write(abel)}
else{
if( entry.author[0].name.$t == 'Anonymous'){ document.write(anonymous)}
else{document.write(photoslink)}
  }
}


Compartir Enlace

Como Destacar los enlaces visitados en los posts

Hace tiempo que usaba este sistema de pequeños iconos en el Escaparate para señalar los enlaces de las entradas que ya habían sido visitados, hoy he vuelto a incluirlo.

Los enlaces solo en el cuerpo de las entradas (post-body) se verán resaltados como muestra la imagen:


Ejemplo de links

Como veis, para el enlace normal (a la vista) no añadiremos ningún código, con lo que mostrará el mismo aspecto que los demás enlaces del blog.
Una vez que alguien haya visitado ese enlace y vuelva después a esa entrada, el enlace se mostrará con un pequeño icono de color gris que avisa de que ya hemos pinchado antes en ese enlace.
Si aún así, pasamos el ratón sobre ese enlace, el icono gris cambiará a uno de color rojo para "reforzar" el aviso.
Por supuesto podéis usar otros iconos distintos a estos, cambiando la url en el código por la de vuestras imágenes.

Y este es el código para los enlaces, que colocaremos en el CSS (antes de ]]></b:skin>) de nuestra plantilla:

/* Posts links
----------------*/
.post-body a:visited {
color:#006699;
padding-right: 13px;
background: url(http://i33.photobucket.com/albums/d100/manas_tripathy/visitedLink.gif) no-repeat 100% 50%;
}
.post-body a:visited:hover {
background: url(http://i33.photobucket.com/albums/d100/manas_tripathy/visitedHoverLink.gif) no-repeat 100% 50%;
padding-right: 13px;
color:#4192e5;
}

color:#006699; Color del enlace visitado.
color:#4192e5; Color del enlace al paso del ratón.
padding-right: 13px; Distancia para dejar espacio al icono (el ancho del icono en pixeles).

Compartir Enlace

Cómo cambiar la imagen de arranque de Windows XP

Si un PC con Windows instalado tarda mucho en cargar su propietario acabará odiando el logotipo del famoso sistema operativo de Microsoft.


También puede ocurrir que le guste personalizar cada elemento de Windows y le fastidie ver cada día la misma imagen. En cualquiera de los casos la solución es bien sencilla.
Con unos pequeños retoques se puede cambiar la imagen de arranque de Windows XP por cualquier otra.

Lo primero que hay que hacer es editar el archivo boot.ini que está en el directorio raíz. No se ve si se en las opciones de carpeta se han ocultado los archivos de sistema.
Una vez desactivada la casilla de ocultar, hay que editar boot.ini que suele ser algo así:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect

Lo único que hay que hacer es añadir /bootlogo/noguiboot detrás de fastdetect y guardar. Quedaría así:

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows XP Professional” /noexecute=optin /fastdetect/bootlogo/noguiboot

Por si acaso conviene hacer una copia de seguridad del archivo. Lo siguiente que debemos hacer es elegir una imagen y guardarla con una resolución de 640×480, 16 colores y 4 píxeles de profundidad. Hay que guardarla en el directorio Windows con el nombre boot.bmp




Compartir Enlace

Facebook: Primeros pasos


En muy poco tiempo, Facebook se ha vuelto una herramienta de comunicación tan importante como el correo electrónico o el chat. Con un diseño a medio camino entre una bitácora y una tarjeta de visita virtual, esta red social cuenta ya con 350 millones de usuarios en todo el mundo.


Darse de alta en Facebook es fácil, pero ocurre que los perfiles se abandonan por no saber exactamente qué hacer con ellos. En esta serie de entregas iremos ilustrando lo esencial para que disfrutes de Facebook desde el primer momento. Empezamos por lo básico: darte de alta y conectar con los demás.


El aterrizaje en Facebooklandia

Alta en FacebookHay muchas formas de llegar a Facebook. Tal vez recibiste el correo de algún conocido, o hayas oído hablar de esta red social mientras tomabas una cerveza; quizá sólo quieras curiosear en los perfiles de tus amigos. Sea como sea, el proceso de alta siempre es el mismo, y pasa por introducir tus datos en un breve formulario.
Por raro que parezca, no vale introducir cualquier nombre o apellido. Facebook filtra los que en su opinión son ficticios y, en ese caso, te impide proseguir el alta hasta que los cambies. Lo que puede parecer un obstáculo a tu libertad tiene por objetivo el conseguir una comunidad de calidad y con personas reales. De todas formas, el filtro no es perfecto, y con un poco de empeño puede saltarse.


¡Bienvenido!

Tras pasar la comprobación de seguridad y contestar el correo de confirmación, ya serás un nuevo miembro de Facebook. Si te invitó alguien, verás su petición de amistad en la página de bienvenida. Será tu primer contacto, pero es posible que quieras tomarte un tiempo de reflexión. Lo divertido empieza en el segundo paso del alta:

¿Quieres ser mi amigo?

Facebook sin contactos es como un bar sin bebidas: inútil. El paso 2 del alta te permite conectar con la libreta de direcciones de tu correo web para agregar a personas que conozcas. Es un proceso seguro: la contraseña no será almacenada por Facebook bajo ningún concepto.

También puedes buscar personas en tus contactos de mensajería instantánea. Cada sistema es distinto, y requerirá acciones diferentes para que se te identifique como el propietario de la cuenta de correo o chat. Una vez encontrados los contactos, Facebook te mostrará los que ya están dados de alta:

¡Contacto! ¡Wow!

¿No es emocionante? Nuestro consejo es que NO añadas a todo lo que veas. Facebook no sabe si tus contactos son de fiar, así que deberás recurrir a tu sentido común. Si un usuario no tiene foto, es posible que creara el perfil y lo abandonara tal cual, con lo que añadirle no tendría mucho sentido (a menos que te guste conversar con momias). Ten en cuenta que este paso se puede omitir y retomar en otro momento.
Antes de finalizar, el paso 2 te muestra la lista de contactos que no tienen cuenta en Facebook. Si no quieres ser recordado de manera poco cariñosa, no uses la opción Seleccionar todos. Sé selectivo e invita únicamente a las personas que podrían estar interesadas en el invento. De otro modo, te ganarás una merecida fama de spammer.

¡Redes!

Las redes son la forma que tiene Facebook de conectarte a más personas en otro nivel menos personal. Ejemplos de redes son el país, la empresa en la que trabajas, el instituto al que fuiste o la universidad en la que estudiaste (si es tu caso). En el tercer paso puedes elegir tus redes principales. El cuarto paso, más sencillo, pregunta en qué ciudad vives. A partir de ella, se te insertará en la red correspondiente al país.

¡Portada!

Parecía eterno, pero el proceso de alta ha terminado. No te preocupes si has pulsado Omitir o Saltar en las pantallas, es algo muy humano. De lo vacía que está, la portada de tu nuevo Perfil pide a gritos que la llenes. ¿Por qué no empezar por tus datos?

Un poco de sano egocentrismo

Editar el perfilUn perfil vacío es más triste que un mimo bajo la lluvia, y no sólo no será útil, sino que puede generar desconfianza cuando dejes tu huella en perfiles ajenos. Tampoco hay que contar tu vida y milagros: bastará con rellenar la información básica.  Para ello, dirígete a tu perfil pulsando el segundo botón de la barra azul. Luego, haz clic en la pestaña Información. Dale al enlace Editar Información. Verás un formulario para editar el apartado de Información básica:

Editando la información personal

Los campos se explican por sí solos. Ten especial cuidado con Situación sentimental, Ideología política y Creencias religiosas, pues son los datos que más barullo pueden generar en tu red de amigos. Algunos optan por introducir opciones irónicas. El otro apartado Información personal, no aparecerá a menos que lo rellenes. Es totalmente accesorio, pero puede ayudar para que los demás te conozcan un poco mejor (por ejemplo, puedes dejar claro que odias el reggaeton).

Contacto

En Información de contacto tienes el otro apartado importante del perfil. Ninguno de los datos es obligatorio, pero muchas personas utilizan Facebook como tarjeta de visita. En este sentido, poner tus cuentas de mensajería instantánea, correos electrónicos y teléfonos puede ser una forma válida para que tus amigos puedan contactar contigo. Eso sí, acuérdate de pulsar los pequeños iconos de candado al lado de cada campo para determinar quién podrá ver los datos. Será tu primer contacto con la configuración de privacidad, que veremos con más detalle en otra entrega.

Privacidad

Cambiar la fotoLa última sección, Formación y empleo, sirve para darle un tono más profesional a tu perfil sin que parezca un curriculum. No olvides guardar los cambios cuando hayas terminado. ¿A que ahora tiene otro aspecto?
Sin embargo, te falta lo más importante: ¡la foto! Colócate sobre la silueta blanca y pulsa sobre ella o sobre el enlace Cambiar foto. Luego, haz clic en Cambiar foto del perfil si no tienes ninguna lista. Puedes cargar una imagen desde tu disco duro o capturarla con tu cámara web:

Añadir foto de perfil

Elegir miniaturaUna vez cargada la imagen, la verás a la izquierda del formulario de carga. Además, podrás mover ligeramente la miniatura para que esté centrada en tu rostro (o en lo que hayas decidido mostrar de ti). Guárdala para que no tengas que modificarla en otra ocasión.
¡Ya está! Tu perfil está ahora listo para la acción. En la próxima entrega explicaremos qué tipo de cosas se pueden hacer en Facebook.

 Compartir Enlace

5 formas de poner límites a Windows

Lo más usual es querer incorporar nuevas funciones a Windows, pero también se da el caso en el que desees limitarlas. Generalmente sucede en ordenadores compartidos donde existe el temor de que cualquier persona toquetee la configuración.
A continuación vamos a ver cinco formas concretas de limitar el acceso a determinadas características de Windows.


1. Impedir crear Accesos directos

¿Crees que los usuarios del ordenador no tienen ninguna necesidad de crear accesos directos? Puedes restringir su creación del siguiente modo.

En Windows 98, Me, NT, 2000 y XP

Ejecuta regedit.exe (Menú Inicio / Ejecutar) y ve a esta clave:
HKEY_CLASSES_ROOT\.lnk\ShellNew
En el panel de la derecha, haz doble clic sobre Command y borra por completo el texto contenido dentro de Información del valor.



Este pequeño truco, no muy elegante, eso sí, hará que el usuario obtenga un error cada vez que intente crear un acceso directo.

En Windows Vista, 2003 y Windows 7

En Windows Vista el proceso es similar pero no idéntico. En esta ocasión también debes ejecutar regedit.exe e ir a la siguiente clave:

HKEY_CLASSES_ROOT\.lnk\ShellNew

Una vez estés en ella, elimínala. El menú contextual para la creación de accesos directos desaparecerá por completo.

NOTA IMPORTANTE: Antes de realizar estos cambios crea una copia de seguridad del Registro.

2. Impedir copiar, cortar y pegar archivos

Es habitual que desees que tus archivos permanezcan donde están, sin que nadie ande copiándolos por ahí. En este caso el modo de desactivarlo es más sencillo pues no implica realizar ningún cambio definitivo en el Registro.
En su lugar dispones de una sencilla utilidad llamada Stopper. Mientras se encuentra en memoria impide acceder a las funciones copiar y pegar del Portapapeles. Si deseas recuperarlas, debes cerrar el proceso stopper.exe desde el Administrador de Tareas.

3. Quitar el botón de Inicio

En este caso no se trata de una limitación con la que impedir que alguien acceda a una función, sino más bien de una modificación estética. Si consideras que el botón Inicio es inútil ya que siempre accedes al menú inicio con la tecla Windows, puedes librarte de él con Start Killer.
Además, si cambias de opinión sólo tienes que cerrar el programa y todo volverá a la normalidad.


 

4. Impedir el cambio del fondo de pantalla

¿Quieres que el fondo de pantalla sea siempre el mismo y nadie pueda cambiarlo? Para lograrlo ejecuta regedit.exe y navega hasta la siguiente clave:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies

Una vez estés en ella, crea, si no existía ya, una clave llamada System, haciendo clic derecho y seleccionando Nuevo / Clave.



Después de haber creado la clave System, navega hasta su contenido y crea en su interior un nuevo valor alfanumérico llamado Wallpaper y cuyo valor sea la ruta exacta hasta el archivo JPG o BMP que hará de fondo.



Para controlar el modo en que se muestra el fondo de pantalla, es decir, centrado, ampliado o en mosaico, debes crear otra clave alfanumérica. En este caso el nombre es WallpaperStyle y su valor es un número según las siguientes pautas:

  • 0 significa centrado
  • 1 significa en mosaico
  • 2 significa estirado hasta ocupar la superficie del Escritorio

 

5. Impide cerrar ventanas sin querer pulsando sobre la X de cierre

Estar haciendo algo importante y pulsar sin querer sobre el botón de cierre de una ventana y perderlo es una auténtica faena. Si deseas impedirlo tienes a tu disposición una pequeña aplicación gratuita cuyo nombre es NoClose.
Este programa deshabilita tras pulsar un atajo de teclado (Control + 1) la función de cierre mediante el ya nombrado botón. De este modo, aunque hagas un clic accidental, no lograrás cerrarlo. Si cambias de opinión y deseas cerrar el programa no tienes más que pulsar otra vez la misma combinación o acceder al cierre de ventana desde el menú contextual.


Compartir Enlace

G4L Ghost For Linux

| 0 comentarios

G4L es una utilidad que nos permite clonar o realizar imágenes del disco duro de nuestro ordenador, incluyendo el sistema operativo.

En las siguientes páginas intento hacer una guía de referencia rápida - manual, tutorial - del mismo para tres situaciones concretas:

  1. Copia local en un equipo .



    Videotutorial elaborado para el curso piloto coordinadores tic del cnice

  2. Mediante Red:: subimos la imagen a través de una red local a un servidor ftp y la restauramos en ese mismo equipo o en otro con el mismo hardware
  3. Mediante multidifusión: Lanzamos las imágenes a múltiples equipos mediante multidifusión de manera simultánea, por tanto, a varios equipos , por ejemplo para montar un aula de ordenadores.
  4. Cargar mediante arranque en Red nuestro g4l: arrancamos el equipo que queremos clonar mediante la opción de BIOS arranque en red y mediante PXE nos cargaría automáticamente y sin emplear el CD de g4l el live cd del mismo para comenzar a usarlo en nuestro equipo.
CopyPasteandoLink