Bitácora de Javier Gutiérrez Chamorro (Guti)
Tira del día de Garfield en castellano
Septiembre 30th, 2008 - [Enlace local]
Hace algo más de tres años, que publiqué en Tira del día de Garfield, un sencillo script para tener acceso diario la última tira de Garfield publicada.
Hoy os lo traigo actualizado y mejorado, obteniendo el contenido de la página en castellano.
El código está basado en la anterior versión, con un par de añadidos, y no es precisamente un buen ejemplo para nada:
<script language="Javascript" type="text/javascript">
var sUrl='';
var dteToday=new Date();
if (dteToday.getFullYear()<100)
{
sUrl+='http://www.garfield-es.com/tiras/tiras/' + (dteToday.getFullYear() + 2000) + '/';
}
else
{
sUrl+='http://www.garfield-es.com/tiras/tiras/' + dteToday.getFullYear() + '/';
}
if ((dteToday.getMonth() + 1)<10)
{
sUrl+='0' + (dteToday.getMonth() + 1 + '/');
}
else
{
sUrl+=(dteToday.getMonth() + 1) + '/';
}
if (dteToday.getYear()<2000)
{
if (dteToday.getYear()<10)
{
sUrl+='ga0' + dteToday.getYear();
}
else
{
sUrl+='ga' + dteToday.getYear();
}
}
else
{
if (dteToday.getYear()<2010)
{
sUrl+='ga0' + (dteToday.getYear() - 2000);
}
else
{
sUrl+='ga' + (dteToday.getYear() - 2000);
}
}
if ((dteToday.getMonth() + 1)<10)
{
sUrl+='0' + (dteToday.getMonth() + 1);
}
else
{
sUrl+=(dteToday.getMonth() + 1);
}
if (dteToday.getDate()<10)
{
sUrl+='0' + dteToday.getDate();
}
else
{
sUrl+=dteToday.getDate();
}
sUrl+='.gif';
document.write('<img src="' + sUrl + '" title="La tira de Garfield de hoy" border=0>');
</script>
» Leer más, comentarios, etc...
.NET o no .NET, esa es la cuestión
El mundo del libro electrónico anda revolucionadillo
Septiembre 30th, 2008 - [Enlace local]
Primero una empresa saca una cosa rara que parece ser es un e-book reader pero que en la propia presentación casi se les escacharra (véase el vídeo con el aparato mostrando una raya más o menos por la mitad de la pantalla).
Luego nos salta iRex (recordemos que es una filial de Philips, que es la empresa que casi ha inventado todo pero siempre lo licencia a terceros) con su iRex DR1000. Este producto, que ya se puede comprar, es un lector con una pantalla de 10.4 cm en diagonal con la que al parecer se pueden leer cómodamente documentos en A4. También cuenta con una mejoradísima ergonomía respecto a la castaña del iLiad; destaca que al parecer se puede pasar página desde cualquier lado del aparato y cuenta con un diseño más suave que las abruptas e irregulares líneas del iLiad. Por supuesto es totalmente incompatible con el anterior, no podía ser menos.
También HanLin saca la versión 2.00 de su firmware para el LBook, el V3 y cualquiera de sus variantes. La principal mejora es que soporta el formato Mobipocket, tanto con DRM como sin él.
El Cybook GEN3 también actualizó el firmware hace muy poco, aunque más que novedades lo que trae son “estabilizaciones” y solución de bugs. No obstante, ahora tengo PDFs que no puedo leer y antes sí podía…
iRex, no nos convences
Voy a contar lo que nadie cuenta del nuevo modelo DR1000. No, no lo he comprado y espero poder resistirme a comprarlo. Y voy a explicar por qué. En primer lugar, lo que voy a comentar está documentado en la FAQ del producto, pero hay que leer entre líneas y tener la experiencia con su anterior producto. También está en castellano, gracias a Juan Luis Chulilla y su blog Tinta-e
En primer lugar, igual que con el iLiad, el producto no está acabado. Le faltan un montón de opciones que dicen irán añadiendo en futuras revisiones del software. ¿No le suena a nadie eso de algo? Lo mismo dijeron con el iLiad, y éste se quedó sin soporte para sonido, con un formato a medio hacer (el Mobipocket y todos los asociados como texto y html) y con más cosas prometidas y nunca cumplidas.
Es decir, prometen suspender a RAM y a disco, pero en futuras versiones. Prometen soportar futuros formatos, pero en futuras versiones. En fin más de lo mismo.
Pero la gran mentira está en la duración de la batería. En la FAQ, la pregunta te redirige a la página http://www.irextechnologies.com/batteries, en la que te cuentan lo mismo que para el iLiad. Se habla de 50 horas de duración, pero ya hay gente comentando que ni por asomo llega a esa duración…
Además, si veis el vídeo de la presentación (está en el primer enlace que pongo), veréis la espantosamente rapidez en pasar páginas… vamos, que ni un XT ejectuando el Autocad.
Así que, como dijo aquél, “una y no más, santo Tomás”. Mi recomendación es no comprar el producto.
HanLin, en el camino correcto (pero aun te falta mucho)
A la espera de que HanLin saque su lector A4 (que lleva como un año anunciado pero siempre retrasado por problemas con la pantalla), tenemos la versión 2 del firmware para el LBook alias V3 alias <otros nombres>.
La gran novedad es el soporte Mobipocket. Pero casi como si no fuera novedad, porque la visualización de las tres fuentes disponibles es, por decirlo suavemente, peor que penosa. Leer se puede leer, pero parece que estemos delante de una pantalla CGA de las de 320 x 200 píxeles. Otro tema es el interlineado. Parece que es de dos líneas, y como ya han dicho por ahí, mucho espacio en blanco entre letras… Los mentideros comentan que en general ni funcionan los enlaces, ni el índice y que el uso de diccionarios es testimonial (al parecer sólo funciona un solo diccionario, el Longman nosequé).
En cuanto al PDF, sigue con el bug de la separación de las palabras, aunque parece que me han dicho cómo evitarlo con OpenOffice y guardando de forma especial. Ya veremos.
Otra cosa no he visto, pero seguro que actualiza y mejora algo el formato nativo, el FB2.
Pues eso es todo.
» Leer más, comentarios, etc...
Cerebro en la Sombra » Técnico
Conexiones VPN entre máquinas Linux y Windows con autentificación a través de servidor Radius y MySQL
Septiembre 30th, 2008 - [Enlace local]
Un día, harto de tener que abrir puertos y más puertos para cada cosa que quería hacer con el servidor Linux que tengo en casa, se me ocurrió hacer algo para poder conectarme directamente a ésa máquina y tener todos los servicios a mi disposición sin tener que crearlos uno a uno. La solución estaba clara, establecer una VPN contra ese servidor y automáticamente tendría acceso a todos los servicios disponibles. El problema principal a la hora de establecer esta red virtual era que tenía que ser sencilla, rápida de crear y, sobre todo, no necesitar software adicional ya que así podría utilizarla desde cualquier ordenador en cualquier localización. Es más, si me lo montaba bien tendría un sistema perfecto para dar soporte remoto a mis hermanas a través de VNC sin tener que abrirles esos puertos
.
Por defecto todos los equipos Windows traen de serie un cliente VPN que puede contectarse a redes privadas virtuales, pero no de cualquier tipo, sólo PPTP. Podríamos haber escogido otro sistema basado en IPsec o incluso OpenVPN, pero necesitaríamos software adicional además de cerficados en ámbos extremos de la VPN, lo que no cumpliría los requisitos que nos habíamos impuesto. PPTP es un protocolo desarrollado por Microsoft (por eso viene de serie con Windows) y, gracias a eso, ha tardado mucho en haber un cliente (y más aún un servidor) que funcione bajo Linux. No es el más seguro de los protocolos de VPN
pero dejémoslo en que cumple sus funciones.
La idea es, por tanto, montar un servidor PPTP bajo Linux. Una vez tengamos el servidor veremos como conectar tanto desde Linux como desde Windows. Aunque la idea de este artículo parte de un entorno doméstico es completamente aplicable a pequeñas empresas que necesiten dar acceso remoto a sus empleados sin complicarles la vida ni realizar grandes desembolsos en routers dedicados o en un servidor Windows (entendiendo esto como una máquina con algún Windows Server
.
Servidor PPTP bajo Linux
Vamos a enrevesar un poco más nuestro servidor. Para da más versatilidad haremos que la autentificación de los usuarios se realice a través de un servidor Radius que posteriormente podemos utilizar para autenticar cualquier otro servicio que se nos ocurra (ftp, email, hotspot inalámbrico…).
Creo que aún es muy sencillo, vamos a complicarlo más aún. El servidor Radius autenticará, así mismo, contra una base de datos MySQL, con lo que tendremos un sistema muy facil de administrar sin tener que estar tocando archivos de texto para crear usuarios nuevos. El escenario es, por tanto PPTP+Radius+MySQL.
Como software vamos a utilizar:
- Servidor Linux, Centos 5.2 en mi caso.
- PopTop, servidor PPTP bajo Linux.
- PPTP Client, cliente PPTP bajo Linux.
- FreeRadius como servidor Radius.
- Radiusclient como cliente Radius, para que PopTop pueda consultar el servidor Radius.
Para instalar el software, en mi caso, nada más sencillo. Primero instalamos el repositorio yum de PopTop:
-
rpm -Uvh http://poptop.sourceforge.net/yum/stable/fc7/pptp-release-current.noarch.rpm
Y ya podemos instalar todo el software:
-
yum –enablerepo=poptop-stable install freeradius freeradius-mysql radiusclient pptp pptpd
Creo que con eso sería suficiente y tendríamos todo lo necesario. Asumimos, por supuesto, que ya tienes MySQL instalado.
Antiguamente era más complicado instalar PopTop ya que había que parchear el kernel, pero hoy en día, si tu núcleo es superior a 2.6.15 (si no lo es, ¿a qué esperas para actualizarlo?), no es necesario este paso. De todos modos, si tuvieses que hacerlo, es totalmente seguro, yo mismo lo hice durante mucho tiempo. En la web de PopTop tienes las instrucciones para hacerlo.
Suponiendo que hemos instalado correctamente todo el software sin ningún problema, ya sólo nos queda configurar todos y cada uno de los pasos que conforman nuestro servidor VPN.
Configurando PopTop
Lo primero que debes hacer es decidir que direccionamiento utilizarás en tu VPN. En mi caso tengo uno independiente de todo lo demás (192.168.3.0), así puedo gestionarlo a mi antojo, permitiendo o denegando lo que se me ocurra de una manera sencilla. A continuación indico los archivos de configuración a toquetear y como tengo los míos.
/etc/pptpd.conf
-
[osus@servidor ~]# cat /etc/pptpd.conf
-
option /etc/ppp/options.pptpd
-
localip 192.168.3.1-5
-
remoteip 192.168.3.6-10
El parámetro localip tendrá las IP’s que utilizará tu servidor como locales cada vez que reciba una conexión mientras que en remoteip indicarás las que va a dar dinámicamente a los clientes. Tendrás que poner un rango lo suficientemente amplio como para cubrir las posibles conexiones simultáneas que puedas tener.
/etc/ppp/options.pptpd
-
[osus@servidor ~]# cat /etc/ppp/options.pptpd
-
name pptpd
-
refuse-pap
-
refuse-chap
-
refuse-mschap
-
require-mschap-v2
-
require-mppe-128
-
proxyarp
-
lock
-
nobsdcomp
-
novj
-
novjccomp
-
nologfd
-
plugin radius.so
Sería recomendable que consultases las páginas man para saber qué hace cada parámetro.
Como véis, al final de todo indicamos al servidor PPTP que utilice el pluggin para Radius, así que configuremos todo lo relativo a Radius.
Configurando FreeRadius
/etc/raddb/clients.conf
-
[osus@servidor ~]# cat /etc/raddb/clients.conf
-
client 127.0.0.1 {
-
secret = TUCLAVESECRETA
-
shortname = localhost
-
}
Debemos indicar, para cada servidor Radius que tenemos, una clave de conexión y el nombre del mismo. La clave deberán utilizarla los clientes radius para consultar al servidor. Lo normal en un entorno como el nuestro es que el servidor Radius sea el mismo donde reside el servidor VPN.
El siguiente archivo es el más importante ya que se indica a FreeRadius que autentifique las peticiones contra un servidor MySQL. Como es muy largo pondré solamente las partes relevantes:
/etc/raddb/radiusd.conf
-
mschap {
-
authtype = MS-CHAP
-
use_mppe = yes
-
require_strong = yes
-
}
-
-
authorize {
-
preprocess
-
mschap
-
suffix
-
eap
-
sql
-
}
-
-
authenticate {
-
Auth-Type MS-CHAP {
-
mschap
-
}
-
eap
-
}
-
-
preacct {
-
preprocess
-
suffix
-
files
-
}
-
-
accounting {
-
detail
-
acct_unique
-
sql
-
}
-
-
session {
-
sql
-
}
En /etc/raddb/sql.conf debes configurar correctamente el acceso a tu base de datos MySQL, servidor, usuario, clave y base de datos que veremos un poco más adelante.
Configurando el cliente Radius
/etc/radiusclient/servers
-
[osus@servidor ~]# cat /etc/radiusclient/servers
-
localhost TUCLAVESECRETA
Donde la clave es la misma que pusiste en /etc/raddb/clients.conf y localhost la dirección de tu servidor si es distinto al que tiene el pptpd.
En /etc/radiusclient debes tener el archivo dictionary.microsoft. Creo recordar que tuve algunos problemas con él, por si acaso dejo el que tengo ahora mismo que no es el que venía por defecto.
En /etc/radiusclient/radiusclient.conf asegurate que tienes los siguientes parámetros apuntando a la IP de tu servidor Radius si no es el mismo donde reside el servidor VPN:
-
authserver localhost
-
acctserver localhost
Si son distintos a localhost, no te olvides de configurarlos aquí.
Creando la base de datos MySQL
Llegamos al último paso.
Crea una nueva base de datos (create database radius) y un usuario con permisos sobre ella. Recuerda configurar ahora /etc/raddb/sql.conf con estos datos.
Ahora crea la estructura de la base de datos. Con el paquete FreeRadius viene la estructura que necesitas.
-
mysql radius < /usr/share/doc/freeradius-1.1.3/examples/mysql.sql
El paso que viene a continuación siempre lo ignoran cuando alguien explica cómo configurar FreeRadius contra MySQL y creedme que no es nada intuitivo.
¿Cómo se rellenan las tablas de autentificación?
Buena pregunta Manel
.
- Tabla radcheck: mantiene las cuentas de usuario con los siguientes campos:
- UserName: nombre de usuario.
- Attribute: Password (literalmente, no la clave del usuario sino la palabra Password).
- op: == (dos signos de igual).
- Value: clave del usuario.
- Table radreply: contiene parámetros de inicialización de los clientes que se conectan. Aquí yo configuro las IP’s que quiero dar a determinados clientes por cuestiones de comodidad. Además indico que sólo voy a permitir una conexión simultánea con el mismo usuario.
- UserName: nombre de usuario que estás configurando (según lo introducido en la tabla radcheck).
- Attribute: la palabra Framed-IP-Address ó Simultaneous-Use, según indiques la IP a asignar a ese usuario o el número máximo de sesiones con el mismo nombre.
- op: = (un sólo signo igual)
- Value: 192.168.3.99 (la IP que quieras) ó el número máximo de conexiones simultáneas con el mismo usuario.
- Table usergroup: agrupa los usuarios en grupos.
- UserName: nombre de usuario
- GroupName: nombre de grupo.
La tabla radact contiene el log de actividad del servidor, sesiones iniciadas, duración, etc.
Últimos pasos
Recuerda que debes abrir en tu router y/o firewall el puerto 1723 para que permita conexiones entrantes ya que es el usado por el protocolo PPTP.
Aunque como veremos más adelante podemos auditar las conexiones al servidor Radius (y por ende al servidor VPN) puede ser interesante tener un mecanismo de aviso de que un cliente se ha conectado. Una forma de hacerlo es consultando las interfaces de red disponibles en el servidor (ifconfig), habrá tantos pppX como usuarios activos. Pero hay otro método que te permite recibir, por ejemplo por email, un aviso cada vez que un usuario conecta o desconecta.
Cada vez que se levanta una interfaz ppp se ejecuta el script /etc/ppp/ip-up.local con todos los parámetros relativos a esa conexión, ip remota, local, interfaz… Igualmente cuando se desconecta se lanza /etc/ppp/ip-down.local. Solo debemos adaptar este script a nuestras necesidades. Estos scripts reciben todos los parámetros necesarios para identificar al usuario. Haríamos algo así, por ejemplo para ip-up.local.
-
#!/bin/sh
-
if [ "$5" == "192.168.3.10" ]
-
then
-
cliente="pepito"
-
fi
-
echo "Conexion VPN
-
Interfaz: $1
-
VPN Local: $4
-
VPN Remota: $5
-
IP Remota: $6
-
1: $1
-
2: $2
-
3: $3
-
4: $4
-
5: $5
-
6: $6
-
" | mail -s "Conexion VPN - $cliente" <a href="mailto:osus@osusnet.com">osus@tudominio.com</a>
De este modo recibirías un email cada vez que un usuario levanta un tunel VPN con tu servidor y sabrías qué ip tiene el usuario y, si le has otorgado una IP fija en la configuración de Radius, sabrás qué usuario es, en este caso “pepito“.
Con ip-down.local harías un script semejante sólo que en vez de Conexión VPN en el asunto del email pondríamos Desconexión VPN. Los parámetros son exactamente los mismos.
Estos scripts podemos aprovecharlos también para crear/modificar/eliminar determinadas rutas en función de los túneles creados.
El propio paquete pptpd te habrá instalado el script de inicio necesario, en mi caso /etc/init.d/pptpd. Sólo debo añadirlo a la secuencia de arranque del runlevel de mi servidor y automáticamente estará siempre disponible el servicio.
En teoría, todas las vpn’s que se hagan contra el servidor tienen enrutamiento entre sí, es decir, podrías llegar desde un cliente a otro pasando por el servidor sin toquetear nada más. Digo en teoría porque esa es la función del parámetro proxyarp que configuramos hace un rato. Puede que este enrutamiento no sea suficiente y que necesites que los clientes VPN puedan acceder a otras subredes de tu infraestructura. Puedes hacerlo como quieras, incluso configurar un bridge, pero para estas cosas nada mejor que iptables.
Supongamos un escenario en el que tenemos una lan local de la que forma parte nuestro servidor (direccionamiento 192.168.0.0) y la nueva red que creamos para las VPN’s (direccionamiento 192.168.3.0). Para permitir el enrutamiento completo entre las dos redes haríamos algo como:
-
#!/bin/sh
-
echo 1 >/proc/sys/net/ipv4/ip_forward
-
LAN="192.168.0.0/16"
-
VPN2="192.168.3.0/24"
-
iptables -A FORWARD -s $LAN -d $VPN2 -j ACCEPT
-
iptables -A FORWARD -s $VPN2 -d $LAN -m state –state ESTABLISHED,RELATED -j ACCEPT
-
iptables -t nat -A POSTROUTING -d $VPN2 -j MASQUERADE
Sencillo. Si sólo quisiésemos que ciertos usuarios accediesen a la red local modificaríamos la variable VPN2 por la IP que radius le da al usuario.
FreeRadius desde un entorno web, dialup_admin
Vale, es cierto, es un auténtico coñazo gestionar FreeRadius y todos sus parámetros, así que, que mejor que un sencillo entorno web para la gestión de usuarios y visualización de actividad y log del sistema. Esta utilidad es dialup_admin. No me detendré en su instalación ya que creo que se sale fuera de este artículo y, además, es una sencilla aplicación web sin mucha dificultad.
Con esta herramienta será mucho más sencillo crear usuarios y sus propiedades y hacer un seguimiento de los que están conectados, periodos de conexión que han tenido, etc.
Estableciendo la VPN desde Windows
Sencillísimo. Desde Conexiones de red, se crea una conexión nueva, escoges Conectarse a la red de mi lugar de trabajo y prácticamente sólo queda introducir el host o IP de tu sevidor VPN y conectarse. Recomiendo desmarcar la opción Usar puerta de enlace predeterminada en la red remota en las propiedades de esta nueva conexión, Funciones de red, Protocolo TCP/IP, Opciones avanzadas, de otro modo todo el trafico de Internet normal lo harás a través de la VPN.
Si todo va bien conectarás a tu servidor y tendrás acceso al mismo como si estuvieses en tu propia red local.
Estableciendo la VPN desde Linux
Desde Linux es un pelín más complicado ya que, como casi siempre, hay que hacer la configuración a mano. Existe una utilidad gráfica que permite crear las conexiones de un modo similar a Windows, pero prefiero explicar cómo hacerlo desde la consola por si tu máquina no tiene entorno gráfico.
-
[osus@servidor ~]# cat /etc/ppp/options.pptp
-
lock
-
noauth
-
refuse-eap
-
refuse-chap
-
refuse-mschap
-
nobsdcomp
-
nodeflate
Ahora indicamos el usuario y la contraseña que se utilizará para conectar. IdentificadorRed será el nombre que le demos a la conexión, puede ser lo que quieras.
-
[osus@servidor ~]# cat /etc/ppp/chap-secrets
-
usuario IdentificadorRed clave *
Ahora creamos la configuración para la conexión que vas a crear con el IdentificadorRed que comentamos antes. En TUIP debes poner el host o ip de tu servidor VPN.
-
[osus@servidor ~]# cat /etc/ppp/peers/IdentificadorRed
-
remotename IdentificadorRed
-
linkname IdentificadorRed
-
ipparam IdentificadorRed
-
pty "pptp TUIP –nolaunchpppd "
-
name usuario
-
require-mppe
-
require-mschap-v2
-
refuse-eap
-
refuse-pap
-
refuse-chap
-
refuse-mschap
-
#demand
-
holdoff 5
-
persist
-
maxfail 0
-
ipcp-accept-remote
-
ipcp-accept-local
-
noauth
-
192.168.3.1:192.168.3.254
Aquí hay dos opciones interesantes:
- persist: vuelve a crear el tunel automáticamente si se cortase por alguna razón de manera que permanece siempre activo.
- demand: crea automáticamente el tunel cuando se accede a la IP del servidor o a alguna otra que esté enrutada a través de este tunel, mientras no se necesite permanece inactivo. Obviamente no debe estar en modo persist, de otro modo estará siempre activa.
Finalmente creamos un sencillo script de arranque para poder lanzarla automáticamente o simplemente para no tener que recordar los parámetros.
-
[osus@servidor ~]# cat /etc/init.d/IdentificadorRed
-
#!/bin/sh
-
case "$1" in
-
start)
-
echo -n "Iniciando VPN IdentificadorRed "
-
echo
-
touch /var/lock/subsys/pptpd
-
/usr/sbin/pppd call IdentificadorRed logfd 1 updetach &
-
;;
-
stop)
-
echo -n "Parando VPN IdentificadorRed: "
-
echo
-
kill -TERM `head -n 1 /var/run/ppp-IdentificadorRed.pid`
-
;;
-
*)
-
echo "Usage: $0 {start|stop}"
-
exit 1
-
esac
-
exit 0
Y eso es todo amigos. Me ha costado bastante más de lo previsto escribir este artículo ya que a medida que lo iba redactando me iba saltando nuevos recuerdos sobre detalles que se deberían nombrar.
Tened en cuenta que mi experiencia con PPTP se remonta cinco años atrás con lo que puede ser que algún detalle haya cambiado los últimos años. Después de aquel primer servidor VPN el año pasado migramos el sistema operativo a Centos5 y al configurar de nuevo el servidor VPN dejamos prácticamente todos los parámetros como estaban. No creo que tengáis ningún problema a la hora de solucionar algún pequeño detalle que pueda surgir.
» Leer más, comentarios, etc...
The New Cult of Dead Cow
Definicion de Sistema Operativo
Septiembre 30th, 2008 - [Enlace local]
Sistema informatico encargado de una eficiente administración de los recursos de una computadora o dispositivo y que proporciona una API más sencilla al desarrollador de aplicaciones.
» Leer más, comentarios, etc...
Yet Another Programming Weblog
Reescribiendo una cola sin bloqueos
Septiembre 30th, 2008 - [Enlace local]
Herb Sutter se quejó en Lock-Free Code: A False Sense of Security(*) de lo difícil que es escribir código sin bloqueos incluso para expertos y lo hizo poniendo un ejemplo de una implementación errónea de una cola. Ahora ha retomado el tema para demostrar como sería una implementación correcta en Writing Lock-Free Code: A Corrected Queue.
(*) Hablamos de este artículo en Varios sobre concurrencia: los peligros de 'Lock-Free' y JVM
La misma entrada y más comentarios en Reescribiendo una cola sin bloqueos en barrapunto
» Leer más, comentarios, etc...
niko's mini factory
Links for 2008-09-29 [del.icio.us]
Septiembre 30th, 2008 - [Enlace local]
» Leer más, comentarios, etc...
PHP Senior
Grupo 4, iniciado lunes 20:50
Septiembre 30th, 2008 - [Enlace local]

Por las dudas lo comento aquí si el email con la notificación para entrar al taller llegara a caer en la bandeja de Spam. Ya les envié un email a todos los que han hecho el pago para le Grupo 4, que fuera de todos los pronósticos cerramos con 21 personas ;-)
Como he comentado en el blog, estuve todo el fin de semana sin conexión a Internet, y recién se solucionó a la misma hora que envié la notificación (estuve haciendo todo el ingreso de los usuarios desde otra conexión)
Para tratar de bajar la ansiedad de todos (lo cual es entendible) creé los usuarios lo más rápido posible, por lo tanto verán que sus datos no están completos (solo aparece la cuenta de gmail, sin nombre y apellido, sin foto). En el correr de los días iré actualizando esta información, ya que considero muy importante que entre todos nos tratemos directamente a través de nuestros nombres y poder asociar una "cara humana".
PD: si todavía quedó alguien fuera, muy sobre la hora, envíame un email y veo la posibilidad de agregarte en este último grupo que recién inició (uno más, uno menos, no va a hacer la diferencia).
Saludos y gracias a todos por el interés y la confianza en este talle ;-)
» Leer más, comentarios, etc...
Picando Código
Script: No sé qué hacer
Septiembre 29th, 2008 - [Enlace local]
Elrohir, dejó el siguiente shell script en el foro de programación. Para esos días en que no sabemos qué hacer. Se ingresan 3 opciones, y el script elige cuál hacer, inspirado en la película Chaos Theory:
#!/bin/bash sugerido=$[$RANDOM % 3] echo "Opcion 1?";read op1; echo "Opcion 2?";read op2; echo "Opcion 3?";read op3; clear; if [ $sugerido -eq 0 ]; then echo "Hacer "; echo $op1; fi if [ $sugerido -eq 1 ]; then echo "Hacer "; echo $op2; fi if [ $sugerido -eq 2 ]; then echo "Hacer "; echo $op3; fi
» Leer más, comentarios, etc...
Variable not found
Liame, ofuscación de emails para ASP.NET y otras tecnologías
Septiembre 29th, 2008 - [Enlace local]
Ya lo comentaban Rodrigo Corral y algún otro amigo en geeks.ms después de leer el post sobre formas efectivas de ofuscar emails en páginas web: el siguiente paso era "empaquetar" en forma de componente las técnicas que, según se recogía en el post, eran las más seguras a la hora de ocultar las direcciones de correo de los spammers.
Recapitulando, las técnicas de camuflaje de emails que habían aguantado el año y medio del experimento de Silvan Mühlemann, y por tanto se entendían más seguras que el resto de las empleadas en el mismo, fueron:
- Escribir la dirección al revés en el código fuente y cambiar desde CSS la dirección de presentación del texto.
- Introducir texto incorrecto en la dirección y ocultarlo después utilizando CSS.
- Generar el enlace desde javascript partiendo de una cadena codificada en ROT13.
En tiempo de ejecución, el control es capaz de generar código javascript que escribe en la página un enlace
mailto: completo, partiendo de una cadena previamente codificada creada desde el servidor. Dado que todavía no está generalizado entre los spambots la ejecución de javascript de las páginas debido al tiempo y capacidad de proceso necesario para realizarlo, podríamos considerar que esta es la opción más segura.
Para codificar los textos en principio iba a utilizar ROT-13, pero ya que estaba en faena pensé que quizás sería mejor aplicar una componente aleatoria al algoritmo, por lo que al final implementé un ROT-N, siendo N asignado por el sistema cada vez que se genera el script.Pero, ah, malditos posyaques... la verdad es que con un poco de refactorización era posible generalizar el procedimiento de codificación y decodificación mediante el uso de clases específicas (Codecs), así que me puse manos a la obra. Liame incluye, de serie, cuatro algoritmos distintos de ofuscación para ilustrar sus posibilidades: ROT-N (el usado por defecto y más recomendable), Base64, codificación hexadecimal, y un codec nulo, que me ha sido muy útil para depurar y usar como punto de partida en la creación de nuevas formas de camuflaje. Algunos, además, aleatorizan los de nombres de funciones y variables para hacer que el código generado sea ligeramente distinto cada vez, de forma que un spammer no pueda romperlo por una simple localización de cadenas en posiciones determinadas; en fin, puede que sea una técnica un poco inocente, pero supongo que cualquier detalle que dificulte aunque sea mínimamente la tarea de los rastreadores, bueno será.
Incluso si así lo deseamos podremos generar, además del javascript de decodificación del enlace, el contenido de la etiqueta
<noscript>, en la que se incluirá el código HTML de la dirección a ocultar utilizando los dos trucos CSS descritos anteriormente y también considerados "seguros" por el experimento. De esta forma, aunque no estará disponible el enlace para este grupo de usuarios, podrán visualizar la dirección a la que podrán remitir sus mensajes.
El control Liame es muy sencillo de utilizar. Una vez agregado a la barra de herramientas, bastará con arrastrarlo sobre la página (de contenidos o maestra) y establecer sus propiedades, como mínimo la dirección de email a ocultar. Opcionalmente, se puede añadir un mensaje para el enlace, su título, la clase CSS del mismo, etc., con objeto de personalizar aún más su comportamiento a la hora de generar el script, así como las técnicas CSS a utilizar como alternativa.Sin embargo, aún quedaba una cosa pendiente. El control de servidor está bien siempre usemos ASP.NET y que el rendimiento no sea un factor clave, puesto que al fin y al cabo estamos cargando de trabajo al servidor. Para el resto de los casos, Liame incluye en el proyecto de demostración un generador de javascript que, partiendo de los parámetros que le indiquemos, nos creará un script listo para copiar y pegar en nuestras páginas (X)HTML, PHP, Java, o lo que queramos. Como utiliza la base de Liame, cada script que generamos será distinto al anterior.
He publicado el proyecto en Google Code, desde donde se puede descargar tanto el ensamblado compilado como el código fuente del componente y del sitio de demostración. Esta vez he elegido la licencia BSD, no sé, por ir probando ;-)
La versión actual todavía tiene algunos detallitos por perfilar, como el control de la entrada en las propiedades (en especial las comillas y caracteres raros: ¡mejor que nos los uséis!), que podría dar lugar a un javascript sintácticamente incorrecto, pero en general creo que se trata de una versión muy estable. Ha sido probada con Internet Explorer 7, Firefox 3 y Chrome, los tres navegadores que tengo instalados.
También, por cortesía de Mergia, he colgado un proyecto de demostración para que pueda verse el funcionamiento en vivo y en directo, tanto del control de servidor como del generador de javascript.

Finalmente, algunos aspectos que creo interesante comentar. En primer lugar, me gustaría recordaros que las técnicas empleadas por Liame no aseguran, ni mucho menos, que los emails de las páginas van a estar a salvo de los del lado oscuro eternamente, aunque de momento así sea. Lo mejor es no confiarse.
En segundo lugar, es importante tener claro que todas las técnicas aquí descritas pueden resultar bastante nocivas para la accesibilidad de las páginas en las que las utilicéis. Tenedlo en cuenta, sobre todo, si tenéis requisitos estrictos en este sentido.
Y por último, añadir que estaré encantado de recibir vuestras aportaciones, sugerencias, colaboraciones o comentarios de cualquier tipo (sin insultar, eh?) que puedan ayudar a mejorar este software.
Enlaces
Publicado en: www.variablenotfound.com.
» Leer más, comentarios, etc...
Javier Pérez :: Blog
El izquierdismo infantil de los informáticos
Septiembre 29th, 2008 - [Enlace local]
Ya habló Lenin sobre la enfermedad del "izquierdismo", que en nuestros días ha pasado a ser una auténtica lacra. Hoy día es raro el izquierdista que no tenga una camiseta del Ché para exhibir ante todo el mundo que se es "de izquierdas" (mi querido Ché te daría un tiro en la cabeza, por imbécil). O llevar un pañuelo palestino (made in China) para exhibir tu solidaridad con el pueblo palestino, o ir zarrapastroso para exhibir tu solidaridad con los pobres y tu rechazo al consumismo descontrolado (mientras se tiene en casa una televisión de plasma de 52 pulgadas, la PS3 con todos sus juegos, suscripción a Playboy TV y juegos online, jamón de bellota cada día, etc.), o... en fin, ¿para qué seguir? La enfermedad infantil del "izquierdismo".
¿Y el "izquierdismo" en el mundo de la informática? Además de usar Linux, que es "muy de izquierdas", un "izquierdista" informático no es ingeniero... eso es de burgueses, y de frikis antisociales. Un auténtico informático "de izquierdas" se declara a sí mismo, y así se exhibe ante el mundo, como obrero. Un obrero que crea código javascript y diseña sistemas de interacción en una oficina con aire acondicionado, o que realiza un diagrama entidad-relación sentado en su sillón mientras se toma una taza de té, por ejemplo. El obrero informático, en contraposición ideológico-cultural al burgués y capitalista ingeniero informático.
Y claro, así nos va...
» Leer más, comentarios, etc...
EsLoMas.com
Identificación de variaciones sintácticas de etiquetas en folksonomías
Septiembre 29th, 2008 - [Enlace local]
El pasado viernes presentamos en el congreso WSKS08 un artículo de la tesis que estoy haciendo sobre sistemas de etiquetado. El artículo trata de la utilización de técnicas de pattern matching para tratar de aumentar las capacidades de búsqueda y navegación en las folksonomías, a partir de la identificación de variaciones sintácticas de etiquetas. El objetivo es identificar variaciones sintácticas de etiquetas como errores tipográficos, plurales y singulares, uso de separadores, etc. y agrupar todas estas variaciones bajo una misma etiqueta, de forma que cuando un usuario busque cualquiera de las variaciones obtenga todos los recursos anotados por el conjunto de las variaciones.
En el artículo hemos analizado dos técnicas clásicas como son Levenshtein y Hamming, obteniendo buenos resultados para algunos tipos de variaciones, aunque para otros tipos como las transposiciones de caracteres adyacentes y los plurales complejos se han comportado peor. Para resolver estos problemas estamos trabajando en la utilización de un algoritmo basado en un autómata fuzzy que trabaja con costes variables, de forma que es posible adaptarlo a los casos que queremos resolver.
Más información
» Leer más, comentarios, etc...
Yet Another Programming Weblog
¿Cómo funcionan los cierres de exclusión mutua?
Septiembre 29th, 2008 - [Enlace local]
Vía reddit veo un artículo muy didáctico de como funcionan internamente los cierres de exclusión mutua que usamos diariamente y así hacernos a la idea de lo que hay debajo.
La misma entrada y más comentarios en ¿Cómo funcionan los cierres de exclusión mutua? en barrapunto
» Leer más, comentarios, etc...
Yet Another Programming Weblog
“Patrones en programación paralela” por Ralph Johnson
Septiembre 29th, 2008 - [Enlace local]
Ralph Johnson, coautor del conocidísimo Design Patterns dió una charla sobre patrones en programación paralela: Parallel Programming Patterns, que está disponible online en un flash con las transparencias integradas para un mejor seguimiento. [Vía Sutter's Mill]
La misma entrada y más comentarios en "Patrones en programación paralela" por Ralph Johnson en barrapunto
» Leer más, comentarios, etc...
PHP Senior
Fin de semana sin conexión, iniciamos lunes con todo atrasado
Septiembre 29th, 2008 - [Enlace local]
Estimados, luego de un mes con cortes intermitentes en mi conexión a Internet, última semana sin conexión de tarde y para premio este fin de semana sin conexión el sábado y domingo (a lo que se sumó también la señal de clave).
Luego de estar a los insultos con la empresa, Fibertel / Argentina, obviamente a la fecha aún sin conexión, y estoy viendo desde el trabajo que tengo 55 correos sin leer, la mayoría relacionados con el taller (consultas, usuarios nuevos para el grupo 4, etc).
Sepan entender la demora, en el correr del día estará todo en orden e iniciado el Grupo 4 (aunque me tenga que quedar a dormir en el trabajo o morir en un cybercafé hasta la madrugada).
Ahora me actualizaré con las nuevas altas y los pagos, obviamente se respetará el orden de entrada de cada uno.
Saludos, no desesperen (que para eso ya estoy yo).
» Leer más, comentarios, etc...
.: El Blog de Inwe :. » Programación
Netbeans para PHP: Blog, Ide y más
Septiembre 29th, 2008 - [Enlace local]
Sun a sacado un blog (Netbeans for PHP weblog) donde van comentado todas las noticias relativas a Netbeans y PHP, el cual a partir de la versión 6.5 te lo puedes descargar de inicio como un IDE dedicado a PHP (en lugar de extensión sobre el IDE base de Java). Si queréis probarlo, lo podéis descargar aquí, aunque está en versión Beta, Netbeans 6.5 for PHP (20MB).
Documentación: PHP Learning Trail
Screencasts: PHP Editor in Netbeans 6.5
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
Problema (y solución) al instalar .NET Framework 3.5 (IV)
Septiembre 29th, 2008 - [Enlace local]
Para continuar con la serie de problemas que nos están dando las instalaciones del .NET Framework 3.5, aquí tenéis otro error al instalarlo:[XX/XX/XX,XX:XX:XX] RGB Rast: [2] Error: Installation failed for component RGB Rast. MSI returned error code 1601[XX/XX/XX,XX:XX:XX] WapUI: [2] DepCheck indicates RGB Rast is not installed.En el directorio temporal del usuario (%TEMP% en Inicio -> Ejecutar)
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
Problema (y solución) al instalar .NET Framework 3.5 (III)
Septiembre 29th, 2008 - [Enlace local]
Como no hay dos sin tres, os presento otro problema que nos ocurrió al instalar el .NET Framework 3.5:[XX/XX/XX,XX:XX:XX] WIC Installer: [2] Setup Failed on component WIC Installer[XX/XX/XX,XX:XX:XX] WapUI: [2] DepCheck indicates WIC Installer is not installed.[XX/XX/XX,XX:XX:XX] WIC Installer: [2] Error code 1603 for this component means "Error grave durante la instalación."Al revisar el fichero
» Leer más, comentarios, etc...
PROGRAMANDO EN .NET
Problema (y solución) al instalar .NET Framework 3.5 (II)
Septiembre 29th, 2008 - [Enlace local]
Seguimos con los problemas que nos vamos encontrando al instalar el .NET Framework 3.5, hay que tener en cuenta que las instalaciones se realizan en una gran cantidad de equipos (más de 2.000) con diferentes versiones de Windows y con distintas políticas de administración. Si bien es cierto que la gran mayoría no dan problemas, hay algunos en los que los errores de instalación son bastantes
» Leer más, comentarios, etc...
.: El Blog de Inwe :. » Programación
Transparencias de la ZendCon 08 disponibles
Septiembre 29th, 2008 - [Enlace local]
Como cada año, se ha celebrado la ZendCon, donde se han celebrado múltiples conferencias sobre PHP (Zend Framework, Zend Studio, etc…) y tecnologías asociadas a él. Por suerte Zend ha puesto a disposición las transparencias (casi 50) de las distintas conferencias que se celebraron la semana pasada en la ZendCon, muchas de las cuales son realmente interesantes.
Vía: ZendCon 08 Slides
» Leer más, comentarios, etc...
Fetishcode...Thinking in objects
Red Social:debug_mode=ON
Septiembre 29th, 2008 - [Enlace local]
A
» Leer más, comentarios, etc...
Arragonán
Tog ya es público
Septiembre 29th, 2008 - [Enlace local]
En el blog de Linking Paths han ido escribiendo mucho sobre tog, y desde la semana pasada es pública la versión 0.2(licencia MIT).
¿Pero qué es tog?
Es una plataforma open source extensible para crear redes o aplicaciones sociales bajo Ruby on Rails. Da la base social casi sin esfuerzo y se puede añadir funcionalidad mediante la arquitectura de plugins, usando los existentes o creándolos nosotros mismos, e incluso personalizar los plugins para nuestras necesidades puntuales. Quien pueda pensar en un clon de Ning, anda desencaminado, esto es una plataforma para desarrollar y no un servicio(aunque sí se podría crear un clon con tog
)
Para dar a conocer la plataforma, se ha organizado un evento de introducción el día 9 de octubre en Madrid, para el que obviamente ya me he registrado
, el evento es gratuito pero las plazas son limitadas. Si te interesa ver la evolución de tog, no dejes de seguir su blog, que es donde se publicarán las novedades que vayan surgiendo.
Como opinión personal, después de un tiempo utilizando la plataforma dentro de Linking Paths, estoy convencido en que es una buena elección para posibles proyectos sociales que me surjan. Además, tengo pensado usarlo en un proyecto personal, si lo empiezo algún día(que visto lo visto no será en breve
).
» Leer más, comentarios, etc...
Una sinfonía en C#
Sindicar contenido con WCF y sobrecarga de métodos
Septiembre 28th, 2008 - [Enlace local]
Syndication con WCF, sobrecarga de métodos de paso.
Otra de las funcionalidades que se agregaron con el assemblie System.ServiceModel.Web es la posibilidad de sindicar contenido al estilo .net o sea, fácil y tipificado de verdad, es tán fácil que vamos a ir diréctamente al ejemplo de código. Vamos a ver que en este caso definí una interface del servicio con los atributos, esto es lo más natural y nos da un extra de flexiblidad y un poco más de limpieza en el código que hacerlo como en los ejemplos anteriores:
[ServiceContract] [ServiceKnownType(typeof(Atom10FeedFormatter))] //indica la forma de serializar los datos Atom [ServiceKnownType(typeof(Rss20FeedFormatter))] public interface IServicioPrueba { [OperationContract] [WebGet] //se usa webget porque tanto RSS con Atom corren sobre HTTP y se invocan con verbos HTTP SyndicationFeedFormatter Feed(string tipo); [OperationContract] [WebGet] SyndicationFeedFormatter Feed(); }
public class ServicioPrueba : IServicioPrueba { /// <summary> /// Este método nos permite elegir si queremos Atom, sino RSS /// </summary> public SyndicationFeedFormatter Feed(string tipo) { SyndicationFeed feed = GenerarFeed(); if (tipo.Equals("atom")) { return new Atom10FeedFormatter(feed); } else { return new Rss20FeedFormatter(feed); } } /// <summary> /// Genera un feed con dos entradas /// </summary> private static SyndicationFeed GenerarFeed() { IList<SyndicationItem> items = new List<SyndicationItem>(); items.Add(new SyndicationItem("primer noticia", "extra extra cupido apesta!", null)); items.Add(new SyndicationItem("segunda noticia", "Meteoro no seas tonto el enmascarado es tu hermano", null)); SyndicationFeed feed = new SyndicationFeed(items); return feed; } /// <summary> /// En este método lo publicamos como Rss las clases Rss20FeedFormatter y Atom10FeedFormatter heredas /// de SyndicationFeedFormatter por lo tanto se pueden intercambiar casi indistintamente (tiene su especialización) /// </summary> /// <returns></returns> public SyndicationFeedFormatter Feed() { return new Rss20FeedFormatter(GenerarFeed()); } }
Por último el host
static void Main(string[] args) { string address = "http://localhost:8080/servicio/"; using(ServiceHost host = new ServiceHost(typeof(ServicioPrueba))) { //Creamos un endpoint igual al de REST ServiceEndpoint endPoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IServicioPrueba)), new WebHttpBinding(), new EndpointAddress(address)); endPoint.Behaviors.Add(new WebHttpBehavior()); host.Description.Endpoints.Add(endPoint); Console.WriteLine("inicializando.."); host.Open(); Console.WriteLine("iniciado.."); Console.ReadLine(); Console.WriteLine("cerrando..."); host.Close(); Console.WriteLine("listo"); } }
Lo que hice fue crear dos métodos, uno (Feed) que devuelve siempre el canal en Rss y otro con un parámetro que nos permite elegir el formato. Si intentamos correr esto vamos a recibir un error muy feo del tipo InvalidOperationException y es porque estamos intentando sobrecargar métodos en WCF.
Sobrecarga de método en WCF
Sí, se pueden sobrecargar métodos en WCF, de echo lo hacemos y al compilar todo va bien, hasta que hacemos Open() del host y todo explota. ¿Qué ocurre? simple, al hacer Open() WCF comieza a generar la metadata para el servicio, como siempre utilizar WSDL y WSDL es SOAP (o naturalmente lo es), y a pesar que SOAP es "Simple Object Access Protocol" (ya sé que desde la versión 1.2 no lo es), no soporta conceptos de orientación a objetos como la sobrecarga por lo tanto BOOM, no funciona.
La metadata generada para el servicio a pesar que el WebHttpBinding es WSDL
<?xml version="1.0" encoding="utf8" ?> <wsdl:definitions name="ServicioPrueba" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis200401wsswssecurityutility1.0.xsd" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex"> <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import schemaLocation="http://localhost:8080/servicio/?xsd=xsd3" namespace="http://tempuri.org/" /> <xsd:import schemaLocation="http://localhost:8080/servicio/?xsd=xsd0" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> <xsd:import schemaLocation="http://localhost:8080/servicio/?xsd=xsd1" namespace="http://schemas.datacontract.org/2004/07/System.ServiceModel.Syndication" /> <xsd:import schemaLocation="http://localhost:8080/servicio/?xsd=xsd2" namespace="http://www.w3.org/2005/Atom" /> </xsd:schema> </wsdl:types> <wsdl:message name="IServicioPrueba_Feed_InputMessage"> <wsdl:part name="parameters" element="tns:Feed" /> </wsdl:message> <wsdl:message name="IServicioPrueba_Feed_OutputMessage"> <wsdl:part name="parameters" element="tns:FeedResponse" /> </wsdl:message> <wsdl:portType name="IServicioPrueba"> <wsdl:operation name="Feed"> <wsdl:input wsaw:Action="http://tempuri.org/IServicioPrueba/Feed" message="tns:IServicioPrueba_Feed_InputMessage" /> <wsdl:output wsaw:Action="http://tempuri.org/IServicioPrueba/FeedResponse" message="tns:IServicioPrueba_Feed_OutputMessage" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="WebHttpBinding_IServicioPrueba" type="tns:IServicioPrueba"> <wsdl:operation name="Feed"> <wsdl:input /> <wsdl:output /> </wsdl:operation> </wsdl:binding> <wsdl:service name="ServicioPrueba"> <wsdl:port name="WebHttpBinding_IServicioPrueba" binding="tns:WebHttpBinding_IServicioPrueba" /> </wsdl:service> </wsdl:definitions>
¿Entonces cuál es la solución?
La solución es utilizar un alias para los métodos, ya sé que van a decir que entonces es como si tuvieran otro nombre, y tienen razón, pero parcialmente, si consumimos un servicio WCF desde WCF podemos llamar al mismo método en una u otra sobrecarga (utilizando la interface cliente no el proxy svcutility.exe en caso de usar el proxy se puede editar a mano)
Entonces el código de la interface queda así:
[ServiceContract] [ServiceKnownType(typeof(Atom10FeedFormatter))] //indica la forma de serializar los datos Atom [ServiceKnownType(typeof(Rss20FeedFormatter))] public interface IServicioPrueba { [OperationContract(Name = "default")]//alias para esta operación [WebGet] //se usa webget porque tanto RSS con Atom corren sobre HTTP y se invocan con verbos HTTP SyndicationFeedFormatter Feed(string tipo); [OperationContract] [WebGet] SyndicationFeedFormatter Feed(); }
Y listo, ahora funciona
Mágico una vez más, hasta la próxima.
Referencias
» Leer más, comentarios, etc...
Jorge Dieguez Blog
Algunos proyectos interesantes para SharePoint en CodePlex
Septiembre 28th, 2008 - [Enlace local]
Hoy de nuevo he estado revisando proyectos bajo la categoría SharePoint y MOSS en Codeplex.
Entre gran numero de proyectos útiles e interesantes he seleccionado algunos que me han llamado la atención.
SilverPart (Beta 2.0)
http://www.codeplex.com/silverpart
Este proyecto consiste en un WebPart que permite incluir en las paginas de un sitio SharePoint contenido Silverlight.
El WebPart tiene numerosas propiedades para facilitar al máximo la inclusión de contenido Silverlight.
SharePoint 2007 WCM Web Parts
http://www.codeplex.com/SPWCMWebParts
Este proyecto es una colección de 3 WebPart,cada uno de los webpart cuenta con un documento que explica el código fuente y le funcionamiento:
FAQWebPart v0.9: Este permite configurar listas de FAQ(Preguntas mas Frecuentes)
RandomFlashMovieWebPart v0.9: Reproduce películas Flash almacenadas en una biblioteca. Puede reproducir varias películas en una secuencia aleatoria.
ThumbnailWebPart v0.9: Permite visualizar las miniaturas(thumbinail) de una colección de imágenes. (Pena que las miniaturas no se generan automáticamente:-()
SharePoint Inspector
Herramienta muy útil que permite explorar de forma visual los objetos de SharePoint(Granjas, Servidores, Servicios, Características, Soluciones, Bases de Datos, Aplicaciones, Tipos de Contenidos, etc.)![]()
WSS / MOSS Log File Reader
http://www.codeplex.com/wssmosslogfilereader
Esta herramienta hace posible la revisión de los ficheros .LOG de SharePoint directamente desde el Interfaces de SharePoint(para los usuarios que tengan permisos de administración). Me parece muy útil.
Stramit SharePoint 2007 Master Picker
http://www.codeplex.com/SPMasterPicker
Esta herramienta permite seleccionar la una MasterPage para el sitio(o los subistios). Esto es muy interesante para los sitios WSS en los que no se puede cambiar las paginas maestras desde el interfase de usuario(MOSS si cuenta con esta posibilidad).
![]()
A Google Mapcontrol for MOSS or Sharepoint WSS3 as a webpart
http://www.codeplex.com/MapCtrlMOSS
Este WebPart permite incorporar mapas de GoogleMap en las paginas de un sitio SharePoint.![]()
MultimediaFieldControl v0.9
http://www.codeplex.com/SPWCMFieldControls/Release/ProjectReleases.aspx?ReleaseId=5038 Se trata de un campo(Custom Field) que permite visualizar contenidos multimedia(SWF, PDF, WMV, MPEG, AVI, MPG, MOV) indicando la URL del contenido. Acompañado de código fuente y comentarios sobre el mismo.![]()
» Leer más, comentarios, etc...
Variable not found
jQuery, Microsoft y tú
Septiembre 28th, 2008 - [Enlace local]
ScottGu, Hanselman y John Resig han publicado hoy una noticia muy esperada por los entusiastas de la popular librería jQuery y de las herramientas de desarrollo de Microsoft: jQuery va a formar parte de la plataforma oficial de desarrollo de la compañía.
Esto se traduce, en primer lugar, en que será distribuida con Visual Studio, pero eso sí, tal cual, sin modificaciones ni aditivos que puedan suponer la separación de las versiones oficiales de jQuery. Por ejemplo, ASP.NET MVC incluirá de serie la librería en las plantillas de los nuevos proyectos.
Pero no acaban ahí los compromisos. También facilitarán versiones con anotaciones que permitirán disfrutar totalmente de la experiencia intellisense mientras trabajemos con ella, que según comentan estará disponible como una descarga gratuita independiente en unas semanas. Incluso el soporte 24x7 para desarrolladores podrán abrir cuestiones relacionadas con esta librería.
Asimismo, se pretende darle uso para la implementación de controles para el ASP.NET AJAX Control Toolkit, para la construcción de helpers para el framework MVC, y, en general, integrarla con todas las nuevas características y desarrollos que vayan apareciendo.
Buena noticia, sin duda... :-)
Publicado en: www.variablenotfound.com.
» Leer más, comentarios, etc...
Mal Código
Un poco de videojuegos
Septiembre 28th, 2008 - [Enlace local]
Doodle Hex Este verano por fina salio a la venta el juego en el que trabaje como programador. El juego se llama Doodle Hex y a pesar de que salieron muy pocas copias y casi no pueda encontrarse en las tiendas, se puede comprar a través de Amazon.co.uk (tambien viene en español) Estoy muy orgulloso de este trabajo, y merece la pena jugarlo. Y a pesar de que yo hize de programador, lo que mejor


