<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-37346067</id><updated>2009-05-05T08:29:23.319-07:00</updated><title type='text'>Tech·Ed by raona</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-37346067.post-116481941547852263</id><published>2006-11-29T08:43:00.000-08:00</published><updated>2006-11-29T08:56:55.563-08:00</updated><title type='text'>DEV302 - XNA &amp; the future of game development</title><content type='html'>EEehhhh.... una sesión de XNA en el Tech·ed??? Pues sí.&lt;br /&gt;&lt;br /&gt;Vale, vale fue muy introductoria, pero es que tampoco estábamos en la &lt;a href="http://www.gdconf.com/"&gt;GDC&lt;/a&gt; o en el &lt;a href="http://www.microsoftgamefest.com/"&gt;Gamefest&lt;/a&gt;, así que supongo que no se podía esperar otra cosa. En cualquier caso fue una sorpresa muy agradable... al menos para mí, y al juzgar por el lleno de la sala, por más gente.&lt;br /&gt;&lt;br /&gt;La sesión estuvo muy bien aunque sólo fuera para cambiar un poco el chip y para los que desarrollamos juegos como hobby todavía mejor. En fin, si queréis un comentario más técnico de la sesión, pasaros por &lt;a href="http://burbujasmdx.blogspot.com/2006/11/xna-en-el-teched.html"&gt;este post&lt;/a&gt; de &lt;a href="http://burbujasmdx.blogspot.com/"&gt;mi blog dedicado al desarrollo de videojuegos en XNA&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para los que quieran un resumen rápido: XNA es el nuevo framework de desarrollo de videojuegos usando .NET (C# por el momento). La versión actual (beta 2) trabaja sobre DirectX9 y .NET Framework 2.0. Sustituye a la API de Managed DirectX y facilita enormemente la creación de videojuegos.&lt;br /&gt;Evidentemente hay un impacto de rendimiento que no hace muy factible desarrollar un videojuego comercial 100% en XNA hoy dia, pero es posible que en un futuro a medio plazo eso deje de ser así. Y además XNA tiene un as en la manga: es cross-platform entre PC y XBOX 360.&lt;br /&gt;En la sesión se desarrolló un juego partiendo desde cero. Era un juego simple, en 2D, pero contenía los elementos básicos de cualquier juego (gráficos, animaciones y audio).&lt;br /&gt;&lt;br /&gt;En fin... una sesión &lt;span style="font-style: italic;"&gt;distinta&lt;/span&gt;, sin duda.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116481941547852263?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116481941547852263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116481941547852263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481941547852263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481941547852263'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev302-xna-future-of-game-development.html' title='DEV302 - XNA &amp; the future of game development'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116481844174321131</id><published>2006-11-29T08:08:00.000-08:00</published><updated>2006-11-29T08:40:41.876-08:00</updated><title type='text'>ARC309 - Security is a feature</title><content type='html'>Vale... no debería decir esto pero.... vaya tostón de sesión que fue esa.&lt;br /&gt;&lt;br /&gt;Seguramente la culpa no fue del ponente, quizá fue que mis expectativas al respecto de la sesión no se correspondieron a la realidad.&lt;br /&gt;Antes que nada, los que sepáis catalán pasaros por el &lt;a href="http://easbyraona.blogspot.com/"&gt;blog que hicimos en raona cuando asistimos al Enterprise Architect Summit 2005&lt;/a&gt;. Una vez estéis allí le dais a Ctrl+F y buscais "&lt;span style="font-style: italic;"&gt;Workshop: Developing and Enforcing Security Policies&lt;/span&gt;" y iréis a parar un post mío sobre una sesión de seguridad que se dio en el EAS2005. Pues bien, el 80% de la sesión del EAS2005 se repitió en esta del tech·ed. La verdad es que salí con una sensación de &lt;span style="font-style: italic;"&gt;deja-vu&lt;/span&gt; (y buscando paredes que no existían), hasta que recordé donde había oído antes lo mismo (o algo muy parecido).&lt;br /&gt;&lt;br /&gt;La sesión versaba sobre 10 consejos para mejorar la seguridad, siempre teniendo el principio que daba título a la sesión: como la seguridad no es un añadido si no una funcionalidad debe pensarse sobre ella &lt;span style="font-style: italic;"&gt;en el tiempo de análisis&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 1. Analizar los posibles ataques&lt;br /&gt;&lt;/span&gt;Basarse en el modelo STRIDE de ataques. Este modelo determina los siguientes tipos de ataques:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;S&lt;/span&gt;poofing identity&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante quiere ser alguien que no es (puede ser client spoofing para acceder a recursos de un servidor o server spoofing para obtener datos de clientes).&lt;/li&gt;&lt;li&gt;Mitigación: Mecanismos de autenticación fuertes. Alternativas a login/pwd&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;ampering with data&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante modifica los datos de la aplicación&lt;/li&gt;&lt;li&gt;Mitigación: Usar firmas digitales, hash codes y canales seguros de comunicación&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;R&lt;/span&gt;epudiation&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante puede negar acciones que haya hecho&lt;/li&gt;&lt;li&gt;Mitigación: Logs de auditoría, firmas digitales y timestamps&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;I&lt;/span&gt;nformation disclosure&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante puede acceder a datos &lt;span style="font-style: italic;"&gt;confidenciales&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Mitigación: Obscuración, encriptación, control de acceso, autenticación fuerte&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;D&lt;/span&gt;enial of Service&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante puede generar DoS debido a males diseños&lt;/li&gt;&lt;li&gt;Mitigación: Aumentar disponibilidad y fiabilidad. Diseñar medidas preventivas.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;E&lt;/span&gt;scalation of Privilege&lt;/li&gt;&lt;ul&gt;&lt;li&gt;El atacante obtiene privilegios que no le corresponden (generalmente por inyección de código).&lt;/li&gt;&lt;li&gt;Mitigación: Validar todas las entradas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Consejo 2: Protección, detección y reacción&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Protección al 100% para todos los problemas es imposible. Por ello no sólo es importante la detección de todos los problemas sinó también la reacción tomada cuando son detectados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 3: All input is evil&lt;/span&gt;&lt;br /&gt;Una de las máximas de seguridad: Toda entrada provenga de donde provenga es susceptible de generar problemas de seguridad (generalmente por ataques de inyección). Debe validarse toda entrada de datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 4: No reinventar la rueda&lt;/span&gt;&lt;br /&gt;Basarse en tecnologías conocidas y probadas antes que en tecnologías propias. P.ej. no desarrollar nuestros protocolos de seguridad o encriptación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 5: Usar siempre el mínimo privilegio necesario&lt;/span&gt;&lt;br /&gt;Ejecutar las aplicaciones siempre con el privilegio mínimo. La mayoría de aplicaciones no requieren privilegios de administrador.&lt;br /&gt;Bueno, aquí tengo una nota personal: muchas aplicaciones de windows están mal diseñadas y requieren privilegios administrativos cuando no deberían. Ello, junto con que windows mismo exige privilegios administrativos para ejecutar muchas acciones han hecho que la mayoría de usuarios sean (seamos) administradores locales. La tecnología UAC de Vista va precisamente en este camino: ejecutar las aplicaciones sin privilegios administrativos y sólo darlos bajo determinadas circunstancias de forma controlada.&lt;br /&gt;Por otro lado en .NET existe la posibilidad de que una aplicación se reduzca a si misma los privilegios de seguridad, aunque el usuario y la configuración de la máquina le den más privilegios. Este camino es muy interesante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 6: Criptografía NO garantiza seguridad&lt;/span&gt;&lt;br /&gt;Pues eso. De nada sirve encriptar todos nuestros mensajes si las claves generadas son débiles, o no están bien guardadas o son intercambiadas por canales no seguros.&lt;br /&gt;Además debe tenerse presente de que la criptografía no garantiza la integridad de los datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 7: Firewalls NO garantizan seguridad&lt;/span&gt;&lt;br /&gt;Un firewall protege la red, pero las aplicaciones requieren ser accedidas (por lo que el firewall no las protege)... y más del 70% de las vulnerabilidades de seguridad están a nivel de aplicación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 8: Secure defaults &amp; failure modes&lt;/span&gt;&lt;br /&gt;No habilitar nada por defecto que pueda suponer un problema de seguridad. P.ej. la instalación por defecto de IIS7 no instala ningún módulo susceptible de ser atacable (comparar eso con versiones de hace algunos años...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 9: Usar herramientas&lt;/span&gt;&lt;br /&gt;No solucionan todo, pero ayudan.&lt;br /&gt;Realizar tests de penetración y revisión de código. Si es necesario, externalizarlos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consejo 10: Sentido común&lt;/span&gt;&lt;br /&gt;Seguramente el primero en importancia ;-)&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;En fin, eso fue lo que dio de si esta sesión... que seguramente no fue mala, pero para mis expectativas demasiado básica (lo reconozco: yo esperaba una sesión sobre lo que ofrece .NET 3.0 y Vista a nivel de seguridad).&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116481844174321131?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116481844174321131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116481844174321131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481844174321131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481844174321131'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/arc309-security-is-feature.html' title='ARC309 - Security is a feature'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116481474374146273</id><published>2006-11-29T06:29:00.000-08:00</published><updated>2006-11-29T07:41:17.453-08:00</updated><title type='text'>DEV212 - .NET vs J2EE</title><content type='html'>MMmm... asistí a esta sesión para saciar mi morbosidad: qué podian decir de una comparación entre .NET y J2EE en un tech·ed?&lt;br /&gt;Bueno, antes que nada aclarar que el ponente era &lt;a href="http://www.davidchappell.com/"&gt;David Chapell&lt;/a&gt;, que es una de esas personas que tiene la virtud de  no decir casi nada pero divertir al personal (por algo es consultor). David Chapell es un consultor externo a Microsoft, así que al menos la sesión podía tener &lt;span style="font-style: italic;"&gt;algo&lt;/span&gt; de objetividad.&lt;br /&gt;Todo lo que se contó fue muuuuuy introductorio pero al menos pasamos un buen rato :)&lt;br /&gt;&lt;br /&gt;Primero hizo una história de las dos plataformas enfrentadas (Microsoft vs Java), remontándose al 1996. Los principales &lt;span style="font-style: italic;"&gt;hitos&lt;/span&gt; de esa historia serian:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;1996: Microsoft &lt;span style="font-style: italic;"&gt;lanza&lt;/span&gt; DNA, que no es mas que un paraguas que agrupa numerosas de las tecnologías existentes en aquel momento (ASP, ADO, MTS). Por aquel entonces Java era un lenguage orientado al cliente. Pasada ya la excitación de los applets, el focus de Java eran las aplicaciones de escritorio.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;1999: Sun &lt;span style="font-style: italic;"&gt;lanza&lt;/span&gt; la especificación J2EE, que recoge varias APIs y tecnologías para Java para el desarrollo de aplicaciones de escritorio. En este punto la &lt;span style="font-style: italic;"&gt;batalla&lt;/span&gt; es entre COM+ y EJBs, entre ASP y JSP/Servlets y entre ADO y JDBC.&lt;/li&gt;&lt;li&gt;2002: Microsoft lanza .NET 1.0, con un conjunto de tecnologías nuevas (ASP.NET, ADO.NET, Enterprise services y ASMX).&lt;/li&gt;&lt;li&gt;2003: Sun lanza la revisión 1.4 de J2EE. La gran incorporación es JAX-RPC que &lt;span style="font-style: italic;"&gt;compite&lt;/span&gt; directamente con ASMX.&lt;/li&gt;&lt;li&gt;2005: Sale el .NET Framework 2.0 que no aporta ninguna novedad destacable.&lt;/li&gt;&lt;/ol&gt;Y el futuro (bueno, en el caso de .NET ya es el presente)?&lt;br /&gt;Por parte de .NET se trata de .NET Framework 3.0, que presenta WF, WCF y WPF como principales novedades.&lt;br /&gt;Por parte de Java??? pues depende a que actor Java sigamos.&lt;br /&gt;&lt;br /&gt;Por parte de Sun, a través de la JCP, saldrá Java EE 5 (nueva denominación de J2EE), cuyas principales novedades son EJB3 y Jax-ws (que reemplaza al obsoleto jax-rpc).&lt;br /&gt;Por parte de OpenSoA el futuro de Java se encamina a SCA (Service Components Architecture) y SDO (Service Data Objects).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comparación .NET 3 vs Java EE 5&lt;/span&gt;&lt;br /&gt;Java EE 5 es una &lt;span style="font-style: italic;"&gt;evolución&lt;/span&gt; de las APIs contenidas en J2EE 1.4. Una de las principales novedades es que en EJB3 los entity bean desaparecen y son sustituídos por JPA (Java Persistence Api). JPA no solo deja obsoletos a los entity beans sino también a JDO.&lt;br /&gt;No tiene equivalente a Workflow Foundation&lt;br /&gt;No tiene equivalente a Windows Communication Foundation. En Java EE 5, siguen habiendo varias APIs de comunicación (RMI, EJB3, jax-ws y JMS) en función del tipo aplicación que se esté construyendo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Comparación .NET 3 vs OpenSoA&lt;/span&gt;&lt;br /&gt;OpenSoA mapea mucho mejor a .NET Framework 3&lt;br /&gt;El equivalente de Workflow Foundation en OpenSoA es BPEL&lt;br /&gt;BPEL es un lenguage XML (mantenido por OASIS), del cual dijo que era poco productivo pero que existían numerosas herramientas gráficas que lo generaban. El principal problema de BPEL es que aunque es estándard le hacen falta &lt;span style="font-style: italic;"&gt;extensiones no estándares&lt;/span&gt; para dar soporte a actividades que quedan fuera de su definición, pero que son necesarias (p.ej. interacción humana, acceso a datos). El problema es el de siempre: cada motor de BPEL ha terminando desarrollando sus propias extensiones.&lt;br /&gt;&lt;br /&gt;El equivalente a WCF en OpenSoA es SCA, que ofrece una API de comunicaciones unificada.&lt;br /&gt;&lt;br /&gt;Chapell se posicionó a favor de Workflow Foundation en contra de BPEL, y al respecto de WCF vs SCA dijo que a su parecer son muy parecidas aunque en algunos aspectos SCA le parece ligeramente mejor enfocada que WCF (pero no dijo cuales).&lt;br /&gt;&lt;br /&gt;Ni en Java EE 5 ni en OpenSoA hay equivalente para WPF, pero seguramente este seria un componente más de cliente que de servidor. En el mundo Java actual hay tres grandes APIs para el desarrollo de interfaces gráficas: la obsoleta AWT (de Sun), SWING/JFC (de Sun) y SWT (IBM/Eclipse).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusiones&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Chapell planteó aquí que uno de los problemas de Java es que al no estar todo en manos de una misma compañía había ciertos desarrollos que eran casi imposibles. Por ejemplo algo parecido a LINQ (que requiere modificar Visual Studio, el lenguage C# y el CLR) es muy complicado en el mundo Java, porque el entorno de desarrollo está en unas manos (eclipse), el lenguaje en otras (sun) y los servidores en otras (Bea, Ibm,...). Evidentemente esa decentralización también puede verse como una ventaja, todo son puntos de vista ;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;Mis&lt;/span&gt; conclusiones&lt;/span&gt;&lt;br /&gt;Estoy bastante de acuerdo con muchas de las ideas de David Chappell. Que Sun no ha hecho las cosas bien con Java creo que hay una gran mayoría de gente que lo piensa. Lo cierto es que Chappell criticó con dureza a Sun y repartió elogios entre OpenSoA y Microsoft. Que OpenSoA se han posicionado como una muy buena alternativa a Sun para el futuro de Java es un hecho constatado, pero deberá verse la acogida que tenga SCA cuando salga y si es capaz de aglutinar a su alrededor a la comunidad de desarrolladores de Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Links finales&lt;br /&gt;&lt;/span&gt;Este post ha sido prolífico en siglas y conceptos, así que voy a poner un conjunto de enlaces para más información.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Los contendientes: Por un lado &lt;a href="http://www.microsoft.com/net/default.mspx"&gt;.NET&lt;/a&gt; y por otro &lt;a href="http://www.sun.com/java/"&gt;Java&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Los equipos: El &lt;a href="http://www.netfx3.com/"&gt;Framework 3.0&lt;/a&gt; por un lado. &lt;a href="http://java.sun.com/javaee/"&gt;J2EE&lt;/a&gt; por otro y &lt;a href="http://www.osoa.org/"&gt;OpenSoA&lt;/a&gt; por otro.&lt;/li&gt;&lt;li&gt;Las tecnologías&lt;/li&gt;&lt;ol&gt;&lt;li&gt;.NET: &lt;a href="http://wpf.netfx3.com/"&gt;WPF&lt;/a&gt;, &lt;a href="http://wcf.netfx3.com/"&gt;WCF&lt;/a&gt;, &lt;a href="http://wf.netfx3.com/"&gt;WF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Java EE: &lt;a href="http://java.sun.com/products/ejb/"&gt;EJB3&lt;/a&gt;, &lt;a href="https://glassfish.dev.java.net/javaee5/docs/DocsIndex.html"&gt;JPA&lt;/a&gt;, &lt;a href="http://java.sun.com/webservices/jaxws/"&gt;JAX-WS&lt;/a&gt;, los obsoletos &lt;a href="http://java.sun.com/products/jdo/"&gt;JDO&lt;/a&gt; y &lt;a href="http://java.sun.com/webservices/jaxrpc/"&gt;JAX-RPC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;OpenSoA: &lt;a href="http://www.osoa.org/display/Main/Service+Component+Architecture+Home"&gt;SCA&lt;/a&gt;, &lt;a href="http://www.osoa.org/display/Main/Service+Data+Objects+Home"&gt;SDO&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oasis-open.org/"&gt;OASIS&lt;/a&gt;: &lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel"&gt;BPEL&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Otras tecnologías mencionadas: &lt;a href="http://java.sun.com/products/jdk/awt/"&gt;AWT&lt;/a&gt;, &lt;a href="http://java.sun.com/products/jfc/tsc/sightings/"&gt;Swing&lt;/a&gt;, &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No hay nostalgia en Microsoft... (&lt;a href="http://www.microsoft.com/dna"&gt;www.microsoft.com/dna&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116481474374146273?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116481474374146273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116481474374146273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481474374146273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481474374146273'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev212-net-vs-j2ee.html' title='DEV212 - .NET vs J2EE'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116481049964291351</id><published>2006-11-29T05:58:00.000-08:00</published><updated>2006-11-29T06:28:20.200-08:00</updated><title type='text'>DEV232 - IIS 7.0: End to End Overview</title><content type='html'>Una nueva sesión del Tech·Ed... Esta iba sobre las novedades de IIS7.0 y ofrecía una visión general del mismo.&lt;br /&gt;&lt;br /&gt;Primero vimos las principales novedades de IIS7 respecto IIS6&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Seguridad: Muchos componentes que antes estaban en el "kernel" ahora son modulares (p.ej. CGI).&lt;/li&gt;&lt;li&gt;Extensibilidad: IIS7 aporta una API nueva (tanto nativa como managed)  para temas de extensibilidad. Además ofrece soporte integrada para los módulos ASP.NET&lt;/li&gt;&lt;li&gt;Configuración: Basada en ficheros XML, con el mismo esquema que los ficheros de configuración de ASP.NET. Aparece además inetmgr una herramienta de configuración con interfaz gráfica (a l'estilo de lo que viene haciendo MS últimamente).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Managment: Aparece una herramienta de línea de comandos que permitee realizar &lt;span style="font-style: italic;"&gt;cualquier&lt;/span&gt; operación con IIS.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Modularidad&lt;/span&gt;&lt;br /&gt;Uno de los aspectos claves de IIS7 es su construcción modular. Casi todo es un módulo que se carga o no en función de lo que indique el fichero de configuración. Existen más de 40 módulos. Por ejemplo varios módulos de autenticación (Digest, Windows,...), varios de desarrollos de aplicaciones (ASP, ASP.NET,...) y así ir siguiendo.&lt;br /&gt;El setup por defecto de IIS7 instala solamente los módulos necesarios para servir páginas estáticas con autenticación anónima (jejejee... problemas de seguridad mínimos).&lt;br /&gt;Es posible incluso desactivar todos los módulos y IIS sólo carga la pipe-line (la pipe-line es quien genera los distintos eventos a los que los módulos se pueden suscribir).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Extensibilidad&lt;/span&gt;&lt;br /&gt;IIS6 se extiende mediante filtros ISAPI y extensiones ISAPI. Muy potentes pero complejas de desarrollar y no hay soporte managed para ISAPI.&lt;br /&gt;Con IIS6 se pueden crear módulos con código managed pero esos módulos deben ser procesados por la extensión ISAPI de ASP.NET &lt;span style="font-style: italic;"&gt;antes&lt;/span&gt; de ser invocados.  Es decir, la request debe pasar por toda la pipe-line de IIS6, hasta llegar a la extensión ISAPI de ASP.NET y entonces pasar por toda la pipe-line de ASP.NET.&lt;br /&gt;En IIS7 se pueden combinar Handlers de ASP.NET (&lt;span style="font-style: italic;"&gt;IHttpHandler&lt;/span&gt;s)  con los nativos (filtros o extensiones ISAPI) y la pipe-line &lt;span style="font-weight: bold;"&gt;es compartida&lt;/span&gt;&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;Eso significa que una request ya no debe pasar por el pipe-line de ASP.NET antes de poder ser tratada por un IHttpHandler.&lt;br /&gt;De igual forma podemos tener módulos ASP.NET (&lt;span style="font-style: italic;"&gt;IHttpModule&lt;/span&gt;s) que se pueden suscribir a esta pipe-line compartida. Esos IHttpModules también se cargan o no en función de lo que indique el fichero de configuración del servidor.&lt;br /&gt;&lt;br /&gt;Aquí hizo una demo, donde creo un IHttpHandler, que capturaba todas las requests a imágenes y les añadía una marca de agua a modo de copyright. A diferencia de IIS6 este IHttpHandler era a nivel de &lt;span style="font-weight: bold;"&gt;servidor IIS&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuración&lt;/span&gt;&lt;br /&gt;Muere la metabase de IIS y toda la configuración es ahora basada en fichero XML (basada en el esquema de ASP.NET). El fichero principal se llama ApplicationHost.config (jejeeee... se ve que IIS tiene pretensiones de servidor de aplicaciones).&lt;br /&gt;La configuración de cada aplicación web se realiza mediante el web.config (por lo que es compartido automáticamente si la aplicación es asp.net), y los ficheros de configuración de cada aplicación pueden redefinir parámetros establecidos en el ApplicationHost.config siempre que éste último lo permita.&lt;br /&gt;&lt;br /&gt;Aquí hizo una demo: habilito la cache (tag &amp;lt;cacge&amp;gt; de web.config) y comprobamos como el IHttpHandler de la demo anterior pasaba de soportar tasas de 8 req/s a más de 400 req/s.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Managment&lt;/span&gt;&lt;br /&gt;IIS7 viene con un proveedor WMI completamente nuevo.&lt;br /&gt;Nueva herramienta de configuración con interfaz gráfica (no basada en MMC, como todas las últimas).&lt;br /&gt;La herramienta en línea de comandos AppCmd permite configurar cualquier cosa del servidor, ya no son necesarios los scripts vbs que vienen con IIS6 (de hecho para que funcionen los scripts  de managment de IIS6 debe instalarse un módulo de compatibilidad que no se instala por defecto).&lt;br /&gt;En este punto nos hizo una demo de AppCmd, creando 10 aplicaciones web desde un fichero bat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resolución de errores&lt;/span&gt;&lt;br /&gt;IIS7 añade páginas renovadas para errores HTTP 500 con detalles adicionales del error y soporte mejorado para &lt;span style="font-style: italic;"&gt;custom-errors&lt;/span&gt;. Al estilo de ASP.NET las páginas pueden ser distintas para localhost y para clientes externos.&lt;br /&gt;Aparece también la herramienta FREB que permite realizar un seguimiento de lo ocurrido cuando una request falla. Genera un xml (con una xslt asociada para su visualización) donde hay información de la request en cada paso de la pipe-line. Se guarda un xml por cada request fallada, dentro del directorio de logs.&lt;br /&gt;&lt;br /&gt;Y esto fue todo lo que nos contaron... Bastante interesante todo, no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116481049964291351?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116481049964291351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116481049964291351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481049964291351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116481049964291351'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev232-iis-70-end-to-end-overview.html' title='DEV232 - IIS 7.0: End to End Overview'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116479336217996115</id><published>2006-11-29T01:36:00.000-08:00</published><updated>2006-11-29T01:45:01.750-08:00</updated><title type='text'>DEVWD30 - Developing for Windows Vista</title><content type='html'>Buenoooo... el título no era exactamente así, pero no me acuerdo del título exacto.&lt;br /&gt;Esta sesión era una &lt;span style="font-style: italic;"&gt;whiteboard discussion&lt;/span&gt;,  es decir una sesión más íntima, en una sala más pequeña (a rebosar, eso sí) y donde la participación del público se convierte en el hilo conductor de la charla.&lt;br /&gt;Esta charla iba sobre el desarrollo de aplicaciones Windows Vista. En concreto sobre que es lo que aporta de nuevo Vista y que no está en el .NET Framework 3.0. Así se comentaron temas de UAC, Restart Manager y Aero. La verdad es que teoricamente la sesión trataba 10 puntos fundamentales para la programación de aplicaciones Vista, pero apenas hubo tiempo de tratar estos tres, ya que la participación fue constante haciendo multitud de preguntas.&lt;br /&gt;&lt;br /&gt;Fue una sesión muy, muy, muy interesante, y es que ahora que el .NET Framework 3.0 también está en XP, es un valor añadido saber aprovechar las capacidades adicionales de Vista para que las aplicaciones se integren en el nuevo sistema operativo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116479336217996115?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116479336217996115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116479336217996115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116479336217996115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116479336217996115'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/devwd30-developing-for-windows-vista.html' title='DEVWD30 - Developing for Windows Vista'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116479164688160467</id><published>2006-11-29T00:18:00.000-08:00</published><updated>2006-11-29T01:14:08.636-08:00</updated><title type='text'>DEV306 - LINQ to SQL</title><content type='html'>Buenooo... una nueva sesión sobre LINQ, continuación de la anterior &lt;span style="font-style: italic;"&gt;DEV323 (C# 3.0)&lt;/span&gt;.  En este caso se trataba de explorar las capacidades de LINQ para el mapeo de entidades relacionales de la BBDD a objetos de negocio.&lt;br /&gt;&lt;br /&gt;Antes que nada un repaso a los principales problemas de usar comandos SQL embebidos en cadenas para acceder a la BBDD:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Queries son cadenas, por lo tanto el compilador no puede ayudar.&lt;/li&gt;&lt;li&gt;Parámetros son loosely-bound y tipo de retorno es un loosely-typed resultset, por lo tanto no se pueden hacer chequeos en tiempo de compilación.&lt;/li&gt;&lt;/ol&gt;La idea de LINQ to SQL es la misma que la multitud de &lt;a href="http://www.howtoselectguides.com/dotnet/ormapping/"&gt;ORM mappers&lt;/a&gt; que existen hoy día: generar un conjunto de clases para representar la estructura de datos de la BBDD subyacente. En el caso de LINQ:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La conexión a la BBDD és una clase derivada de DataContext&lt;/li&gt;&lt;li&gt;Tablas y vistas son convertidas a clases&lt;/li&gt;&lt;li&gt;Columnas y Relaciones son propiedades de las clases.&lt;/li&gt;&lt;li&gt;Stored procedures son métodos.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Generación del mapping&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para crear el mapping entre la BBDD y las clases de LINQ:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Decidir que tablas de la BBDD se quieren mapear a clases .NET&lt;/li&gt;&lt;li&gt;Usar el atributo [Column] a las propiedades que se quieran mapear.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Usar [Column(Id=true)] para la clave primaria.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Usar el atributo [Table(Name="Foo")] para mapear tablas.&lt;/li&gt;&lt;li&gt;Declarar la clase Db derivada de DataContext.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Añadir miembros Table&amp;lt;T&amp;gt; siendo T las clases Table que hemos creado.&lt;/li&gt;&lt;li&gt;Invocar al constructor de DataContext con la cadena de conexión correspondiente.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Crear métodos en la clase Db para los stored procedures y usar el atributo [StoredProcedure] para mapearlos.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Crear objeto Db y lanzar consultas usando &lt;span style="font-style: italic;"&gt;query expressions&lt;/span&gt;.&lt;/li&gt;&lt;ol&gt;&lt;li&gt;LINQ convierte la query expression en consultas SQL de forma automática.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;Otra opción es usar un fichero XML que tenga información sobre el mapping, en lugar de tener que usar atributos: las clases deben crearse igualmente pero sin usar ningún atributo, y al crear la clase Db se crea pasando un parámetro XmlMappingSource(XmlMappingSource.FromUrl("..."));&lt;br /&gt;&lt;br /&gt;La tercera opción para generar el mapeo es usar Visual Studio: Project -&gt; Add -&gt; LINQ to SQL Mappint y usar el &lt;span style="font-style: italic;"&gt;server explorer&lt;/span&gt; de Visual Studio, para arrastrar tablas y generar el código (genera partial clases).&lt;br /&gt;&lt;br /&gt;Así el mapping es flexible:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Podemos crear las clases primero y luego decidir cuales de ellas y como las mapeamos a la BBDD.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Podemos crear la BBDD primero y luego generar todas las clases de mapping.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Consultas de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para consultar objetos se usan las query expressions.&lt;br /&gt;P.ej. dada la siguiente clase:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;public class Northwind  : DataContext&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;public Table&amp;lt;Customer&amp;gt; Customers;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;donde Customer es una clase con el atributo [Table] aplicado, entonces una vez creado un objeto Norhwind (llamésmole db) entonces para realizar consultas:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;// Escojer los customers de NY amb 5 o mes ordres&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;from c in db.Customers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;where &lt;span style="font-weight: bold;"&gt;c.City == "NY " and c.Orders.Count &gt;= 5&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;select new {c.CompanyName, c.OrderID};&lt;br /&gt;&lt;br /&gt;// Escoger los customers de NY con sus Orders del 1997&lt;br /&gt;from c in db.Customers&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;where c.City == "NY"&lt;/span&gt;&lt;br /&gt;from o in c.Orders&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;where o.OrderDate.Value.Year = 1997&lt;/span&gt;&lt;br /&gt;select new {c.CompanyName, c.OrderID, o.OrderDate};&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;LINQ asegura que &lt;span style="font-weight: bold;"&gt;existe un sólo objeto en memoria&lt;/span&gt; para una misma PK de una tabla (&lt;span style="font-style: italic;"&gt;identity mapping&lt;/span&gt;). Es decir, si mediante una query obtenemos un registro con una determinada PK, y luego mediante &lt;span style="font-style: italic;"&gt;otra&lt;/span&gt; query obtenemos otra vez el mismo registro, el objeto devuelto por LINQ será el mismo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;var cust = db.Customers.Single (c =&gt; c.CustomerID == "CONSH");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;var query = from c in db.Customers select c;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;foreach (var c in query) { Console.WriteLine( c==cust);}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la primera línea se guarda en la variable &lt;span style="font-style: italic;"&gt;cust&lt;/span&gt;, el objeto Customer que representa al registro con la PK 'CONSH'.&lt;br /&gt;En la segunda línea se obtiene un IEnumerable de Customers con &lt;span style="font-weight: bold;"&gt;todos&lt;/span&gt; los customers.&lt;br /&gt;En la tercera línea se itera sobre el IEnumerable obtenido y por cada objeto Customer contenido en la lista se imprime si es &lt;span style="font-style: italic;"&gt;el mismo&lt;/span&gt; que el objeto referenciado por cust.&lt;br /&gt;Este código imprime tantos "false" como registros haya en la tabla de la BBDD, excepto una vez que imprime "true" (correspondiente al Customer 'CONSH').&lt;br /&gt;Es decir, la variable &lt;span style="font-style: italic;"&gt;cust&lt;/span&gt; y la colección query contienen referencias al mismo objeto Customer, por tanto una modificación realizada desde cualquier sitio será visible al resto (cosa lógica, puesto que es &lt;span style="font-style: italic;"&gt;el mismo&lt;/span&gt; registro de la BBDD).&lt;br /&gt;&lt;br /&gt;La navegación entre las propiedades equivale a las joins clásicas de BBDD:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;var query = &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;from o in db.Orders&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;where &lt;span style="font-weight: bold;"&gt;o.OrderDetails.Any (d =&gt; d.Product.ProductName == "Tofu")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;select new {o.Customer.Company.CompanyName, o.OrderID}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Escoje todas las Orders que tengan alguna OrderDetail que contenga un producto llamado "Tofu". Es decir equivale a una join entre Order, OrderDetail y Product.&lt;br /&gt;&lt;br /&gt;En las query expressions se usa la palabra clave join, cuando se quieren unir resultados que &lt;span style="font-weight: bold;"&gt;no tienen relación de FK&lt;/span&gt; en la BBDD (si hay relación de FK en la BBDD entonces se usan las propiedades como en el ejemplo anterior).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;from c in db.Customers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;join s in db.Suppliers on c.Country equals s.Country&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;select new &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    CustomerName = c.CompanyName,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    SupplierName = s.CompanyName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Devuelve el nombre de un Customer y de sus Suppliers que sean del mismo país. Es decir realiza una join entre el pais de un Consumer y de un Supplier. Esa relación no existe en la BBDD en forma de FK.&lt;br /&gt;&lt;br /&gt;En LINQ cuando se declara una query:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;var query = from c...&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; La query se prepara pero &lt;span style="font-weight: bold;"&gt;no se ejecuta&lt;/span&gt; hasta que se necesario acceder a los resultados. Eso hace posible usar una query dentro de otra query y que sólo se envie a la BBDD el SQL combinado más óptimo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;var query1 = from c in db.Customers where c.City == "NY" select c;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;var query2 = from c in query1 select new { c.CompanyName;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La primera query selecciona todos aquellos Customers de NY.&lt;br /&gt;La segunda query selecciona el nombre de la empresa de todos los customers devueltos por la primera query.&lt;br /&gt;Cuando se acceden a los resultados devueltos por query2 es cuando esta se ejecuta y lo que se hace &lt;span style="font-weight: bold;"&gt;es enviar a la BBDD el SQL combinado de las dos queries&lt;/span&gt;. Es decir el SQL que se enviaría a la BBDD sería algo como:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;SELECT companyName FROM CUSTOMERS WHERE CITY = 'NY'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Modificación de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para insertar datos se llama al método Add de la clase tabla correspondiente y luego el método SubmitChanges.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;db.Customers.Add(myNewCustomer);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;db.SubmitChanges();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Para modificar datos, se obtiene el objeto que deseamos modificar, modificamos sus propiedades y luego llamamos a SubmitChanges:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;// Escogemos un customer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Customer cust = db.Customers.Single ( c =&gt; c.CustomerID == "EXISTINGID");  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;cust.ContactName = "A new Name";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;db.SubmitChanges();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Los updates cuando se traducen a SQL sólo modifican las propiedades modificadas (no todas).&lt;br /&gt;Para tratar los conflictos de concurrencia de modificaciones LINQ aplica una aproximación optimistica: Al realizar el UPDATE añade una cláusula WHERE con &lt;span style="font-style: italic;"&gt;todos&lt;/span&gt; las propiedades tal y como estaban cuando se recuperó el registro. De esta manera si alguien ha modificado el registro &lt;span style="font-style: italic;"&gt;antes&lt;/span&gt; el UPDATE no tiene efecto. Si tenemos en la BBDD alguna columna tipo rowid se puede indicar a LINQ que haga el WHERE contra esa columna en lugar de contra todas las propiedades.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Acceso a SQL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno... todo eso de LINQ está muy bien, pero a veces nos puede interesar realizar consultas directamente usando SQL. Para ello LINQ proporciona el método ExecuteQuery en la clase DataContext. Es un método genérico, y el parámetro genérico sirve para indicar el tipo devuelto por la query, para de esa manera poder tener resultsets tipados:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;var query = db.ExecuteQuery&amp;lt;Contact&amp;gt;("Select CompanyName as Name, Phone from Customers where city = 'NY'");&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Bueno.... básicamente eso fue todo lo que dio de si esa charla... bastante información y ejemplos constantes. En mi opinión fue una muy buena charla (divertida, lo que se dice divertida, no... pero interesante sí).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116479164688160467?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116479164688160467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116479164688160467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116479164688160467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116479164688160467'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev306-linq-to-sql.html' title='DEV306 - LINQ to SQL'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116472790420483327</id><published>2006-11-28T07:03:00.000-08:00</published><updated>2006-11-28T07:31:45.013-08:00</updated><title type='text'>ARC201 - Patterns &amp; antipatterns for SOA</title><content type='html'>Esta era la segunda sesión del track de arquitectura a la asistía en este tech·ed. En la primera me aburrí bastante, pero en esta segunda me divertí un montón. No es que el ponente (Ron Jacobs) contase muchas cosas pero las que contó fueron interesantes... y divertidas.&lt;br /&gt;&lt;br /&gt;Básicamente la sesión comentó tres cosillas básicas de la filosofía SoA y luego analizó un conjunto de patrones y antipatrones de SoA.&lt;br /&gt;&lt;br /&gt;Lo que dijo primero sobre SoA fue que:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Las aplicaciones fuertemente acopladas no son satanás: tienen su sentido cuando el rendimiento es vital.&lt;/li&gt;&lt;li&gt;Debe preferirse siempre el comportamiento explícito al implícito.&lt;/li&gt;&lt;li&gt;Los servicios son la puerta de entrada a procesos de negocio. Si algo no es un proceso de negocio, quizás no se trate de un servicio.&lt;/li&gt;&lt;li&gt;Las barreras deben ser explícitas (sin llegar a suponer impedimentos).&lt;/li&gt;&lt;li&gt;Los servicios deben ser &lt;span style="font-weight: bold;"&gt;autónomos&lt;/span&gt;. Los servicios comparten sólo su interfaz (y las políticas asociadas).&lt;/li&gt;&lt;li&gt;La compatibilidad entre servicios viene dada por sus políticas asociadas (que define protocolos de transporte, temas de transaccionalidad, reliable messageing, ...).&lt;/li&gt;&lt;/ol&gt;Luego empezó a enumerar algunos antipatrones clásicos de SoA:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;CRUDy interface:&lt;/span&gt; Un servicio cuyo interfaz sea únicamente operaciones CRUD (Create, Read, Update, Delete) debe hacernos plantear si realmente estas operaciones son procesos de negocio (recordar el punto 3 anterior) o simples modificaciones de datos. Las interfaces CRUDy tienden a aparecer cuando se diseñan aplicaciones débilmente ligadas a partir de la experiencia del pasado (aplicaciones fuertemente ligadas).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Enumeration:&lt;/span&gt; Un servicio cuya interfaz tenga los clásicos métodos &lt;span style="font-style: italic;"&gt;Object current()&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;bool moveNext()&lt;/span&gt;. Debemos plantearnos dos preguntas: la primera es quien contiene la colección y los recursos necesarios (puede violar la regla de que los servicios deben ser autónomos). La segunda pregunta es que podemos hacer con un &lt;span style="font-style: italic;"&gt;Object&lt;/span&gt;? Básicamente nada, sólo convertirlo a la &lt;span style="font-style: italic;"&gt;clase real contenida en la colección&lt;/span&gt;, y eso implica un conocimiento que va más allá de la interfaz.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Chatty Interface:&lt;/span&gt; Interface que contiene métodos del tipo &lt;span style="font-style: italic;"&gt;UpdateAddress()&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;UpdateName()&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;CommitChanges()&lt;/span&gt;. Durante las llamadas a UpdateXXX y hasta que no se llama a CommitChanges, existen datos "incosistentes". Todas las operaciones que requieren más de un mensaje para realizarse son potencialmente peligrosas.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Loosey Goosey:&lt;/span&gt; Dio una traducción al español de lo que significaba Loosey Goosey, pero sinceramente no me acuerdo. Se trata de evitar interfaces tan genéricas que no sirvan de nada. Por ejemplo una interfaz con un método &lt;span style="font-style: italic;"&gt;XmlDocument Execute(XmlDocument request)&lt;/span&gt;, es extremadamente flexible, adaptable (y reutilizable) pero es completamente inútil: necesitamos saber el formato del XML de entrada y de salida, que es información que no está en la propia interfaz. Resumiendo: interfaces flexibles y adaptables sí, pero todo tiene un límite.&lt;/li&gt;&lt;/ol&gt;Luego pasamos a ver un par de par de patrones válidos en arquitecuras SoA: &lt;span style="font-style: italic;"&gt;Document processor&lt;/span&gt; y &lt;span style="font-style: italic;"&gt;Reservation&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Document Processor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este patrón se basa en las siguientes claves:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Operaciones asíncronas&lt;/li&gt;&lt;li&gt;Fronteras bien definidas&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Decidir que proceso quiere implementarse.&lt;br /&gt;Decomoponer el proceso en actividades realizables mediante un workflow.&lt;br /&gt;Crear el contrato:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Definir los mensajes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Definir las operaciones&lt;/li&gt;&lt;li&gt;Agrupar operaciones relacionadas dentro de servicios.&lt;/li&gt;&lt;/ol&gt;Como ejemplo de &lt;span style="font-style: italic;"&gt;Document Processor&lt;/span&gt; puso el proceso de apuntarse a una universidad, pero no una de actual, si no una de hace unos 10 años. Cuando uno se apunta una universidad debe asignarsele aula, horario, profesor, ...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Existen un conjunto de formularios a rellenar (mensajes)&lt;/li&gt;&lt;li&gt;Cada persona implicada en la operación recibe el formulario (mensaje) correspondiente y realiza su tarea (operaciones asíncronas).&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Reservation&lt;/span&gt;&lt;br /&gt;Sistemas de transacciones distribuídas asumen un grado de confianza que en aplicaciones loosely coupled muchas veces no son deseables (no siempre se quiere dar el control final de una transaccion al &lt;span style="font-style: italic;"&gt;transaction manager&lt;/span&gt; de otro sistema). Para evitar esto y al mismo tiempo seguir tenir transacciones se establece un estado intermedio llamado &lt;span style="font-style: italic;"&gt;reserva&lt;/span&gt;. Es nuestra responsabilidad definir bien los estados por los que pasa una reserva hasta que es consolidada y que mensajes son intercambiados  en cada caso.&lt;br /&gt;Como ejemplo puso el de las compañías aéreas: Cuando el cliente llama para pedir un vuelo, como no confían en el cliente para cerrar la transacción, permiten hacer una reserva. Hasta que el cliente no pague (mensaje) la reserva no pasa al estado de confirmado.&lt;br /&gt;&lt;br /&gt;Finalmente terminó la sesión con un par de consejos básicos: intentar usar tipos portables entre plataformas (p.ej. evitar DataSets que se mapean a "any" en WSDL) y evita el comportamiento implícito (p.ej. no asumir que los datos vienen en un orden determinado si el contrato no lo especifica de forma clara).&lt;br /&gt;&lt;br /&gt;Eso es todo lo que dio de si la sesión, muy introductoria pero eso sí: muy divertida.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116472790420483327?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116472790420483327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116472790420483327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472790420483327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472790420483327'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/arc201-patterns-antipatterns-for-soa.html' title='ARC201 - Patterns &amp; antipatterns for SOA'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116472573443796263</id><published>2006-11-28T06:41:00.000-08:00</published><updated>2006-11-28T06:55:36.120-08:00</updated><title type='text'>DEV311 - WCF: Managing WCF Services</title><content type='html'>Una nueva sesión de WCF a la que asistí... la tercera del tech·ed. Haber asistido a la primera era requisito casi obligatorio para entender algo de esta sesión.&lt;br /&gt;&lt;br /&gt;Si las sesiones anteriores habían tratado del desarrollo de servicios bajo WCF, en esta se hablaría del tema del managment de esos servicios, esto es: como configurarlos, monitorizarlos y depurarlos.&lt;br /&gt;&lt;br /&gt;Fue una sesión bastante light, que se puede resumir básicamente en los siguientes puntos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Modelo de configuración de WCF está basado en XML. El modelo XML es muy complejo, pero la herramienta visual &lt;span style="font-style: italic;"&gt;WCF Config Editor&lt;/span&gt; ayuda mucho en este punto. Con esta herramienta se pueden configurar servicios, pero también activar temas realcionados con el diagnóstico (trazas, logs, perfcounters).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;WCF proporciona un proveedor de WMI integrado, por lo tanto cualquier herramienta de monitorización de WMI (Tivoli, MOM, ...) puede monitorizar servicios WCF.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Los &lt;span style="font-style: italic;"&gt;Diagnostical behaviours&lt;/span&gt; (activar/desactivar logs,...) se pueden modificar sin necesidad de reiniciar el servicio.&lt;/li&gt;&lt;li&gt;WCF incorpora varios contadores de rendimiento (perfcounters) para las métricas más comunes. Existen contadores a nivel de servicio, endpoint y operación.&lt;/li&gt;&lt;li&gt;Un servicio puede definir sus propios contadores de rendimiento. Esto permite crear contadores mixtos que correlen datos de negocio con datos de rendimiento.&lt;/li&gt;&lt;li&gt;WCF incorpora hasta 5 niveles de trace. El trace de mensajes está disponible, sin que sea necesario instalar sniffers ni ninguna herramienta parecida.&lt;/li&gt;&lt;li&gt;El trace de mensajes permite correlar llamadas entre servicios: se añade automáticamente un &lt;span style="font-style: italic;"&gt;ActivityID&lt;/span&gt; a cada mensaje que es el mismo para llamadas encadenadas (es decir si un cliente envia un mensaje al servicio SA y este como consecuencia envía un mensaje a otro servicio SB, los dos mensajes tendrán el mismo &lt;span style="font-style: italic;"&gt;ActivityID&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Existe una herramienta visual para tratar con los logs.&lt;/li&gt;&lt;li&gt;WCF al ser un framework no incorpora herramientas de &lt;span style="font-style: italic;"&gt;Governabilidad&lt;/span&gt; (Governance), aunque da facilidades para que estas sean construídas (en este punto hizo una demo de un servicio que monitorizaba continuamente un fichero de configuración (no el suyo propio) y si este cambiaba, modificaba &lt;span style="font-style: italic;"&gt;su&lt;/span&gt; fichero de configuración para que fuese igual al modificado y se reiniciaba.  Eso permitiría tener n servicios que compartiesen un fichero (o parte de un fichero) de configuración).&lt;/li&gt;&lt;/ol&gt;Finalmente terminó con unos consejos, los más destacables para mi fueron:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Usar contratos dúplex para que los servicios puedan informar de cambios en &lt;span style="font-style: italic;"&gt;su estado de salud&lt;/span&gt;, a las aplicaciones sin que esas deban estar preguntando continuamente.&lt;/li&gt;&lt;li&gt;Vigilar la seguridad de WMI. El proveedor WMI de WCF permite descubrir todos los servicios activos, lo que podría derivar en ataques de &lt;span style="font-style: italic;"&gt;floodeo&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Proteger los ficheros de logs generados. Contienen &lt;span style="font-style: italic;"&gt;mucha&lt;/span&gt; información.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116472573443796263?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116472573443796263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116472573443796263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472573443796263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472573443796263'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev311-wcf-managing-wcf-services.html' title='DEV311 - WCF: Managing WCF Services'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116472484067550021</id><published>2006-11-28T06:09:00.000-08:00</published><updated>2006-11-28T06:40:41.220-08:00</updated><title type='text'>OFF306 - Understanding Workflow in Windows Sharepoint Services (WSS) and Microsoft Office SharePoint Server 2007</title><content type='html'>Toma cacho título para la sesión, eh?&lt;br /&gt;&lt;br /&gt;Esa sesión versaba sobre Workflow Foundation y como MOSS 2007 lo extiende. Fue una sesión bastante interesante, aunque por algunos momentos un poco durilla de seguir.&lt;br /&gt;&lt;br /&gt;Primero comentó los aspectos claves de Workflow Foundation (WF):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Es un framework para generar workflows, no un servidor de aplicaciones ni nada parecido.&lt;/li&gt;&lt;li&gt;Se trata básicamente de un motor de ejecución de workflows y de una API expuesta bajo .NET Framework 3.0 para dicho motor.&lt;/li&gt;&lt;li&gt;Los workflows se dividen en &lt;span style="font-style: italic;"&gt;actividades&lt;/span&gt; (piezas reutilizables entre workflows).&lt;/li&gt;&lt;/ol&gt;En este punto nos realizó una demo del workflow designer, que se integra en VS2005 cuando se instalan las extensiones para .NET Framework 3.0.&lt;br /&gt;La demo consistió en crear un workflow con una CodeActivity y codificar el evento ExecuteCode y así generar el clásico &lt;span style="font-style: italic;"&gt;Hello World&lt;/span&gt;.&lt;br /&gt;Luego nos demostró como los Workflows pueden ser definidos usando código o bien en formato XML.&lt;br /&gt;&lt;br /&gt;Luego nos comentó como MOSS extiende WF, proporcionando nuevas actividades y como MOSS soporta workflows en items y documentos y como los workflows de MOSS pueden ser iniciados (aunque no obligatoriamente) por acciones de usuario.&lt;br /&gt;Vimos que los workflows de MOSS pueden tener definidos el &lt;span style="font-style: italic;"&gt;init form&lt;/span&gt; y el &lt;span style="font-style: italic;"&gt;association form&lt;/span&gt;, que son formularios (aspx) que se muestran cuando se inicializa un workflow y cuando se asocia el workflow a una document library o a un item. Esos dos formularios que forman parte del workflow permiten configurar el workflow con datos propios para cada caso concreto.&lt;br /&gt;&lt;br /&gt;Finalmente hizo una demostración de creación, definición y ejecución de un workflow bajo MOSS:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Creación de una document library y asociar en ella documentos de word.&lt;/li&gt;&lt;li&gt;Creó una workflow association entre esta document library y uno de los workflows previamente instalados en el servidor.&lt;/li&gt;&lt;li&gt;En este punto se muestra el &lt;span style="font-style: italic;"&gt;association form&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Ir a la document library e iniciar el workflow para un documento en concreto.&lt;/li&gt;&lt;li&gt;En este punto se muestra el &lt;span style="font-style: italic;"&gt;init form&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;En los clientes Office 2007, tan buen punto se salva un documento en una document library que tenga algún workflow asociado, este workflow pasa a ser disponible (y puede ser iniciado desde los propios clientes de Office).&lt;br /&gt;&lt;br /&gt;Finalmente vimos como con una extensión adicional se podían crear desde VS2005 workflows para MOSS (aparecen las actividades propias de los workflows de Sharepoint).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116472484067550021?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116472484067550021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116472484067550021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472484067550021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116472484067550021'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/off306-understanding-workflow-in.html' title='OFF306 - Understanding Workflow in Windows Sharepoint Services (WSS) and Microsoft Office SharePoint Server 2007'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116471659564070465</id><published>2006-11-28T03:30:00.000-08:00</published><updated>2006-11-28T04:30:23.743-08:00</updated><title type='text'>DEV323 - C# 3.0</title><content type='html'>Bueno... como es habitual el título no era tan escueto, pero vamos, la presentación iba sobre eso: las novedades que Orcas traerá al lenguaje C#.&lt;br /&gt;Hace ya algún tiempo (más o menos un añito) probé una alfa de LINQ y venia con C# 3.0, así que pude probarlo. Mis impresiones de entonces están en mi &lt;a href="http://blogs.clearscreen.com/edu"&gt;blog personal&lt;/a&gt;, en concreto &lt;a href="http://blogs.clearscreen.com/edu/archive/2005/11/10/2557.aspx"&gt;en este post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Digamos que la &lt;span style="font-weight: bold;"&gt;gran&lt;/span&gt; novedad de C# 3.0 es LINQ y que el resto de novedades incorporadas al lenguage se han incorporado en mayor o en menor medida para poder dar un buen soporte a lo que es LINQ... pero vayamos por partes y enumeremos las diferentes novedades que se nos fueron presentando.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Local variable type inference&lt;/span&gt;&lt;br /&gt;El compilador puede determinar el tipo de una variable en función del tipo del rvalue correspondiente (es decir en función de lo que se encuentre &lt;span style="font-style: italic;"&gt;a la derecha del signo igual&lt;/span&gt;). Existe una nueva palabra clave "&lt;span style="font-weight: bold;"&gt;var&lt;/span&gt;" para declarar variables.&lt;br /&gt;var foo = new Dictionary&amp;lt;bar,baz&amp;gt;();&lt;br /&gt;En esta línea automáticamente la variable foo queda definido de tipo Dictionary&amp;lt;bar,baz&amp;gt;. Debe notarse que declarar variables con var &lt;span style="font-weight: bold;"&gt;no hace que C# sea débilmente tipado&lt;/span&gt;, el lenguaje continua siendo fuertemente tipado. Es simplemente para no tener que escribir de forma redundante.&lt;br /&gt;Hay otra razón por la que "var" se ha introducido en el lenguaje (se comenta más abajo).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Extension methods&lt;/span&gt;&lt;br /&gt;Permiten extender una clase sin necesidad de crear una clase derivada. Interesante cuando no queremos (o no podemos) derivar.&lt;br /&gt;Para ello simplemente declaramos un método estático cuyo primer parámetro se declare con la palabra clave this:&lt;br /&gt;&lt;br /&gt;static FooType foo (&lt;span style="font-style: italic;"&gt;this&lt;/span&gt; BarType bar, Baz baz) { .... }&lt;br /&gt;Este método funciona como un extension method a la clase BarType. Es decir sobre los objetos de la clase BarType se puede invocar el método foo() pasando como parámetro un objeto Baz.&lt;br /&gt;Los extension methods se implementan a nivel de compilador, no hay implicación para el CLR en ellos.&lt;br /&gt;Si se implementa un extension method sobre una interfaz sólo debe implementarse una vez, y queda implementado para todas las clases que implementen la interfaz.&lt;br /&gt;&lt;br /&gt;Evidentemente extension methods, es un mecanismo muy potente a la vez que peligroso: mal usado hace que al final uno no tenga ni idea donde está definido un método determinado. Por lo tanto es un recurso que debe usarse en último lugar (mmm... veremos como evoluciona).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Lambda expressions&lt;/span&gt;&lt;br /&gt;Jejejee... todos los que odiaban lamda-calculus en la carrera y creían que ya podían olvidarlo para siempre... pues no.&lt;br /&gt;Lo más importante de als lambda expressions es que permiten pasar código como parámetros. Por lo tanto se usan en muchos puntos donde antes usábamos un delegate.&lt;br /&gt;&lt;br /&gt;La definición de una lambda expression es:&lt;br /&gt;param_list =&gt; código&lt;br /&gt;donde param_list es una lista de parámetros.&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;c =&gt; c.State == "WA";&lt;br /&gt;Define una expresión lambda que recibe un parámetro (c) y cuyo resultado es la evaluación del código (c.State == "WA").&lt;br /&gt;&lt;br /&gt;Lo más interesante de las lambda expressions es cuando sustituyen a delegates.&lt;br /&gt;Por ejemplo este código seria C# 2.0 usando delegates:&lt;br /&gt;&lt;br /&gt;public delgate bool Predicate&amp;lt;t&amp;gt;(T item);&lt;br /&gt;Predicate&amp;lt;Customer&amp;gt; isFromWA = CustomerFromWA;&lt;br /&gt;&lt;br /&gt;private static bool CustomerFromWA (Customer c)&lt;br /&gt;{ return c.State == "WA"; }&lt;br /&gt;&lt;br /&gt;Y el código equivalente usando expresiones lambda:&lt;br /&gt;&lt;br /&gt;Predicate&amp;lt;Customer&amp;gt; isFromWA =  c=&gt; c.State == "WA";&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Object initializers&lt;/span&gt;&lt;br /&gt;Se pueden crear e iniciar objetos en una sola línea:&lt;br /&gt;&lt;br /&gt;Point a = new Point {X=0, Y=1};&lt;br /&gt;equivale a:&lt;br /&gt;Point a=new Point();&lt;br /&gt;a.X=0;&lt;br /&gt;a.Y=1;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Collection initializers&lt;/span&gt;&lt;br /&gt;Se pueden inicializar colecciones junto con su declaración:&lt;br /&gt;&lt;br /&gt;List&lt;int&gt; foo = new List&lt;int&gt;{100,200,300};&lt;br /&gt;Para que funcione la clase debe tener dos requisitos:&lt;br /&gt;&lt;/int&gt;&lt;/int&gt;&lt;ol&gt;&lt;li&gt;Implementar IEnumerable&lt;/li&gt;&lt;li&gt;Tener un método publico llamado Add()&lt;/li&gt;&lt;/ol&gt;El método Add() puede tener más de 1 parámetro:&lt;br /&gt;&lt;br /&gt;var foo = new Dictionary&amp;lt;int,string&amp;gt; { { 0,"zero"},{1,"one"}};&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Automatic properties&lt;/span&gt;&lt;br /&gt;Bueno... esa es una pequeña modificación para evitar tener que crear código para crear propiedades get/set que únicamente devuelven/acceden a una variable miembro.&lt;br /&gt;&lt;br /&gt;public class Product {&lt;br /&gt;public String Name {get; set;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;equivale a:&lt;br /&gt;&lt;br /&gt;public class Product {&lt;br /&gt;private string _name;&lt;br /&gt;public String Name { get { return _name;} set { _name = value; } }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;La variable privada _name y el código de get/set lo crea el compilador para nosotros :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Query expressions&lt;/span&gt;&lt;br /&gt;Query expressions es la sintaxis propia de C# para LINQ.&lt;br /&gt;Las nuevas palabras clave (p.ej. select o join) sólo lo son dentro del contexto de una query expression. El inicio del contexto de una query expression la marca la palabra clave from. Eso significa que el resto de palabras clave de LINQ no se comportan como tal fuera del contexto de una query expression.&lt;br /&gt;&lt;br /&gt;var query =  from c in customers&lt;br /&gt;where c.State == "WA"&lt;br /&gt;select new {c.Name, c.Phone};&lt;br /&gt;&lt;br /&gt;LINQ está implementada como un conjunto de extension methods (p.ej. muchos de ellos sobre IEnumerable). El compilador traduce las query expressions a las llamadas a métodos LINQ equivalentes. La query expression anterior el compilador la traduciria a:&lt;br /&gt;&lt;br /&gt;var query = customers.Where(c =&gt; c.State == "WA").Select( c=&gt; new {c.Name, c.Phone});&lt;br /&gt;&lt;br /&gt;Es aquí donde se pone de manifiesto que la mayoría de añadidos al lenguaje C# 3.0 lo son para poder dar soporte a LINQ (esa línea de "código convertido" usa anonymous types, lambda expressions, object initializers y local variable type inference).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Anonymous Types&lt;/span&gt;&lt;br /&gt;Permite declarar objetos de clases &lt;span style="font-style: italic;"&gt;anónimas&lt;/span&gt;, sin necesidad de declarar la clase.&lt;br /&gt;Se usan mucho en LINQ:&lt;br /&gt;&lt;br /&gt;IEnumerable&amp;lt;Contact&amp;gt; plq = from c in customers&lt;br /&gt;where c.State == "WA"&lt;br /&gt;select new Contact { Name = c.Name, Phone = c.Phone};&lt;br /&gt;&lt;br /&gt;Esa consulta, tal y como está redactada nos obliga a implementar la clase Contact, que debe tener al menos, dos propiedades (Name y Phone).&lt;br /&gt;Con anonymous types podemos usar el siguiente código:&lt;br /&gt;var plq = from c in customers&lt;br /&gt;where c.State == "WA"&lt;br /&gt;select &lt;span style="font-style: italic;"&gt;new {Name = c.Name, Phone = c.Phone}&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;La parte marcada en cursiva es la creación del objeto de un tipo anónimo (se pone new sin poner el nombre de la clase). Debe notarse que ahí estamos obligados a definir la variable plq usando "var" porque &lt;span style="font-weight: bold;"&gt;no hay manera de saber el tipo de un objeto anónimo&lt;/span&gt; (esa es la razón de peso por la cual "var" se ha introducido en el lenguaje).&lt;br /&gt;&lt;br /&gt;Si queremos iterar sobre plq (que es un IEnumerable de un tipo anónimo) también estamos obligados a usar var:&lt;br /&gt;&lt;br /&gt;foreach (var item in plq) {...}&lt;br /&gt;La variable item es del tipo anónimo creado por el compilador, por lo que item.Name compila perfectamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expressions Tree (Code as Data)&lt;/span&gt;&lt;br /&gt;Expressions Tree es un nuevo modelo de clases y objetos que permite obtener el DOM de una expresión. De esta manera se pueden crear expresiones de forma dinámica.&lt;br /&gt;&lt;br /&gt;Imaginemos que tenemos un delegate Func definido como:&lt;br /&gt;public delegate T Func&amp;lt;a0, T&amp;gt; (A0 arg);&lt;br /&gt;es decir representa a una función de un argumento de tipo A0 y que devuelve un valor de tipo T.&lt;br /&gt;Usando lambda expressions podríamos definir el delegate apuntando a una función:&lt;br /&gt;Func&amp;lt;double,double&amp;gt; f = x =&gt; x*2 + 1;&lt;br /&gt;(para invocarlo: f(10.2);)&lt;br /&gt;&lt;br /&gt;La classe Expression es el punto de entrada a la API de Expressions Tree:&lt;br /&gt;Expression&amp;lt;Func&amp;lt;double, double&amp;gt;&amp;gt; e = x =&gt; x*2+1;&lt;br /&gt;&lt;br /&gt;La variable e contiene el árbol DOM que usa el compilador para evaluar la expresión. Entre otras cosas lo que podemos hacer  es compilar la expresión y obtener el código MSIL correspondiente (y por lo tanto asignarlo a un delegate):&lt;br /&gt;Func&amp;lt;double,double&amp;gt; foo = e.Compile();&lt;br /&gt;&lt;br /&gt;Evidentemente al ser un árbol DOM podemos añadir, quitar, mover, modificar nodos, lo que a la práctica siginifica que podemos crear expresiones de forma dinámica, y al final compilarlas y asignarlas a delegates!&lt;br /&gt;&lt;br /&gt;Y eso fue todo lo que dio la sesión de si... como podeis ver bastante cosa, no????&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116471659564070465?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116471659564070465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116471659564070465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116471659564070465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116471659564070465'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev323-c-30.html' title='DEV323 - C# 3.0'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116470556609246775</id><published>2006-11-28T00:40:00.000-08:00</published><updated>2006-11-28T01:19:26.173-08:00</updated><title type='text'>DEV214 - Introducing WCF</title><content type='html'>Esta sesión era la primera de una serie de sesiones sobre WCF que se dieron en el tech·ed. La verdad es que fue una sesión bien explicada e interesante.&lt;br /&gt;Antes que nada, nos comentó los principios de diseño de WCF:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Unificar tecnologías existentes&lt;/li&gt;&lt;li&gt;Aumentar la productividad&lt;/li&gt;&lt;li&gt;Permitir la integración con otras tecnologías de mensajería (de otros fabricantes o de la propia MS).&lt;/li&gt;&lt;/ol&gt;Luego vino el dibujo general de lo que es WCF: Un cliente y un servicio que intercambian mensajes a través de un endpoint. Si el cliente puede crear un endpoint &lt;span style="font-style: italic;"&gt;compatible&lt;/span&gt; con alguno de los endpoints expuestos por el servidor, entonces la comunicación es posible. Los servicios pueden estar hospedados en un IIS pero también en una aplicación CLR (p.ej. una aplicación WinForms).&lt;br /&gt;&lt;br /&gt;Luego creó paso a paso el "Hello World" de WCF:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crear la clase servidor que tendrá el hosting del servicio. Clase estándard con el Main().&lt;/li&gt;&lt;li&gt;Crear un &lt;span style="font-style: italic;"&gt;interface&lt;/span&gt; para definir el contrato (què puede hacer) del servicio.&lt;/li&gt;&lt;li&gt;Implementar el interface en una clase (la clase servicio).&lt;/li&gt;&lt;li&gt;Usar la clase ServiceHost para hospedar el servicio en la clase Servidor.&lt;/li&gt;&lt;li&gt;Activar el servicio (desde la clase servidor) usando ServiceHost.Open().&lt;/li&gt;&lt;/ol&gt;Al compilar y ejecutar la clase servidor... excepción al canto. La razón: faltaban definir los endpoints de acceso al servicio. Dicha definición puede hacerse por configuración (app.config) o bien por código. Definió el endpoint (en el app.config) y la aplicación se ejecutó correctamente.&lt;br /&gt;Ahora el siguiente paso era crear el cliente. Aquí nos comentó que, dado que los clientes necesitaban crear un endpoint compatible con alguno de los endpoints del servicio para comunicarse, debía existir una manera de que el servicio expusiera todos sus endpoints a sus clientes. La manera en como los servicios WCF exponen sus endpoints a sus posibles clientes es usando WSDL, pero que no lo hacen automáticamente, si no que para ello debe configurarse un &lt;span style="font-style: italic;"&gt;behaviour&lt;/span&gt; concreto llamado &lt;span style="font-style: italic;"&gt;behaviour metadata&lt;/span&gt;. Lo configuró en el app.config del servidor (entre la información que introdujo fue en que URL estaría el WSDL del servicio). Entonces ya pudo crear el cliente: añadio una &lt;span style="font-style: italic;"&gt;service reference&lt;/span&gt; desde Visual Studio, y automáticamente se creó la clase proxy para acceder al servicio usando un endpoint correcto.&lt;br /&gt;&lt;br /&gt;Una vez hecha esa demo, entramos un poco más en profundidad en cada uno de los aspectos básicos de WCF, siempre teniendo presente el ABC de WCF: endpoint = Address + Binding + Contract.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Contracts&lt;br /&gt;&lt;/span&gt;Los contratos definen que puede hacer un servicio. En WCF hay tres tipos de contratos, dos de ellos se usan constantemente y el tercero es más raro.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Service Contract: Define los métodos que un servicio expone a sus clientes.&lt;/li&gt;&lt;li&gt;Data Contract: Define la composición de los parámetros  de los métodos definidos en el service contract. Es en definitiva el nuevo modelo de serialización que lleva WCF.&lt;/li&gt;&lt;li&gt;Message Contract: Es el tipo de contrato que no suele usarse. Permite especificar a nivel de mensaje que datos van en la cabecera y en el cuerpo.&lt;/li&gt;&lt;/ol&gt;Luego vimos la definición de contratos.&lt;br /&gt;Para Service Contracts: Definir una interface y aplicar el atributo [OperationContract] a cada método que se desea que el servicio exponga. Sólo los métodos que tengan ese atributo serán expuestos por el servicio a sus clientes.&lt;br /&gt;Para Data Contracts: Definir una clase y aplicar el atributo [DataMember] a cada miembro de la clase que deba ser serializado. Sólo los miembros que tengan ese atributo serán serializados (y por lo tanto pasados/recibidos a/desde el servicio cuando se opere con datos de esa clase).&lt;br /&gt;&lt;br /&gt;Luego vimos varios puntos interesantes sobre los contratos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Como mapear llamadas desconocidas a un método en concreto del servicio (p.ej. si un cliente envía un mensaje con un método que no existe se puede mapear esa llamada a un método inexistente a un método en concreto).&lt;/li&gt;&lt;li&gt;Como declarar métodos asíncronos [OperationContract(AsyncPattern=true)]&lt;/li&gt;&lt;li&gt;Como declarar métodos one-way (de los que no se espera respuesta) [OperationContract(IsOneWay=true)]&lt;/li&gt;&lt;li&gt;Como definir contratos &lt;span style="font-style: italic;"&gt;duplex&lt;/span&gt;: Un contrato duplex es aquel que permite que el servicio invoque una función de callback al cliente, para informar de que una operación ha terminado. Para ello el cliente debe implementar la interfaz de callback.&lt;/li&gt;&lt;li&gt;Como declarar que un método de un servicio puede lanzar una excepción de tipo X. Se declaran en el contrato con [FaultContract(typeof(X))], se lanzan en el servicio con throw new FaultException&lt;x&gt;(...) y se capturan en el cliente con catch (X ex).&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Bindings&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Si los contratos definen que hace un servicio, los bindings definen como acceder al servicio. Un binding se compone de tres partes:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Un protocolo de transporte (p.ej http o tcp)&lt;/li&gt;&lt;li&gt;Una codificación determinada (p.ej. binario o soap)&lt;/li&gt;&lt;li&gt;Uno o más protocolos de funcionamiento (p.ej. Transacciones, reliable messaging, ...)&lt;/li&gt;&lt;/ol&gt;Los bindings se pueden configurar en el app.config.&lt;br /&gt;&lt;br /&gt;Aquí hizo una demo curiosa: un servicio con dos endpoints. En uno de los endpoints el binding era con transporte http y en el otro era con transporte msmq (el resto era todo igual). Luego tenía dos clientes (eran el mismo programa que en función de un parámetro creaba un endpoint compatible con http o con msmq). Puso en marcha el servidor y los dos clientes y enseñó que todo funcionaba bien. Luego paró el servidor y mandó mensajes desde los dos clientes. El cliente http dio un error, mientras que el cliente msmq no dio ninguno. Luego puso en marcha el servidor de nuevo, y los mensajes enviados anteriormente por el cliente msmq fueron recibidos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Behaviours&lt;/span&gt;&lt;br /&gt;Los Behaviours son elementos locales al cliente o al servidor (no forman parte de los endpoints). Los behaviours permiten controlar aspectos relativos a la infraestructura de WCF, pudiendose controlar entre otros aspectos lo siguiente:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Como el servicio expone su metadata (WSDL)&lt;/li&gt;&lt;li&gt;Gestión de las instancias del servicio (singletons, un servicio por cliente, un servicio por mensaje).&lt;/li&gt;&lt;li&gt;Máximo número de clientes admitidos.&lt;/li&gt;&lt;li&gt;Información de enrutamiento&lt;/li&gt;&lt;/ol&gt;Aquí nos hizo una demo de un servicio que controlaba el número de mensajes recibidos, y jugando con el behaviour (definido en app.config) de gestión de instancias comprobamos que se trataba de un singlenton, o de un servicio por cliente o de un servicio que era creado y destruido para cada mensaje.&lt;br /&gt;&lt;br /&gt;Eso fue todo lo que dio de si esa sesión (que no fue poco)... y era sólo la primera de una serie de tres o cuatro que hubieron en el tech·ed sobre WCF.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116470556609246775?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116470556609246775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116470556609246775' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470556609246775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470556609246775'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev214-introducing-wcf.html' title='DEV214 - Introducing WCF'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116470320192665138</id><published>2006-11-28T00:25:00.000-08:00</published><updated>2006-11-28T00:40:01.936-08:00</updated><title type='text'>DEV351 - Expression and Ajax</title><content type='html'>Bueno... el título real era muchi más rimbomabante pero ese permite ver por donde fueron los tiros de esa sesión. No fue una sesión muy interesante la verdad (más bien al contrario).&lt;br /&gt;&lt;br /&gt;Antes que nada nos comentó la importancia de una buena &lt;span style="font-style: italic;"&gt;User Experience&lt;/span&gt;. Como ejemplo nos mostró el ipod: triunfa frente a reproductores más avanzados y más baratos porque proporciona una mejor experiencia de uso. Entonces comentó que uno de los principales problemas del desarrollo de aplicaciones web de hoy día es que los diseñadores van por un lado y los desarrolladores por otro. Que generalment el diseñador entrega al desarrollador un conjunto de maquetas y un conjunto de gráficos que se ven genial, y luego el desarrollador hace algo que se termina pareciendo a lo diseñado, pero que muchas veces no es igual. Este proceso redunda en una pérdida de &lt;span style="font-style: italic;"&gt;user experience&lt;/span&gt;. La solución pasa por integrar a los desarrolladores dentro del proceso de creación de las aplicaciones web y que éstos no entreguen gráficos y cuatro HTML estáticos a los desarrolladores si no que les entreguen páginas aspx, y que los programadores básicamente tengan que añadir el code-behind.&lt;br /&gt;Ahí es donde entraba Expression. Esta herramienta es un editor visual para ASP.NET. Viene a ser como un Dreamweaver pero especializado en ASP.NET y con soporte para algunas capacidades avanzadas como data-binding (de esta manera el diseñador puede ver como queda el diseño cuando muestra datos "reales" y modificarlo de forma acorde a las necesidades).&lt;br /&gt;Entonces vinieron unos tediosos 45 minutos donde el ponente navegó por muchos de los menús y las opciones de Expression, ensalzando sus maravillas. Evidentemente Expression puede abrir un proyecto asp.net de Visual Studio existente o bien crear uno nuevo: desarrolladores y diseñadores pueden trabajar sobre el mismo repositorio de código fuente.&lt;br /&gt;Finalizado este tour de force por las características de Expression le tocó el turno a la Microsoft Ajax Library. Evidentemente las aplicaciones web que usan Ajax tienen mucha mejor &lt;span style="font-style: italic;"&gt;User experience&lt;/span&gt; que las que no. Lo que hizo fue abrir el proyecto generado con Expression y retocarlo con Visual Studio usando la Ajax Library para añadir funcionalidad. Debe reconocerse que tocó casi nada del diseño de la página generado en Expression. Las funcionalidades que añadió fueron: autocomplete en un text-box a partir de los datos devueltos por un web service y luego nos mostró varios de los controles web que la Microsoft Ajax Library contiene. Esa segunda parte de la demostración estaba demasiado compensada (por lo que el ponente cada dos por tres tenía que copiar-pegar páginas enteras de código sin poder comentar que hacían ni de donde salían).&lt;br /&gt;&lt;br /&gt;En resumen: la parte dedicada a Expression no creo que aportase mucho la verdad, y la parte dedicada a la Ajax Library estaba tan condensada que era casi imposible entender nada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116470320192665138?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116470320192665138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116470320192665138' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470320192665138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470320192665138'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev351-expression-and-ajax.html' title='DEV351 - Expression and Ajax'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116470221670739867</id><published>2006-11-27T23:42:00.000-08:00</published><updated>2006-11-28T00:24:24.860-08:00</updated><title type='text'>DEV201 - Introduction to Windows FX</title><content type='html'>Bueno... con la barriga bien llena (es imposible no comer hasta rebentar en el Tech·Ed), me fuí a esta sesión que pintaba bastante interesante, pero que al final no lo fue tanto.&lt;br /&gt;&lt;br /&gt;La sesión fue una introducción a las novedades del .NET Framework 3.0 (antes conocido como WinFX), es decir una introducción a WPF, WCF, WF y Cardspace.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows Presentation Foundation (WPF)&lt;/span&gt;&lt;br /&gt;Fue la primera API que se nos presentó.  Nos comentó que los objetivos básicos de WPF eran:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Permitir que las aplicaciones tengan un estilo muy personalizado (poder dotar de estilo de "marca" a las aplicaciones.&lt;/li&gt;&lt;li&gt;Ofrecer un aspecto gráfico innovador aprovechando las capacidades 3D de las actuales tarjetas gráficas.&lt;/li&gt;&lt;li&gt;Permitir integrar a diseñadores dentro del proceso de creación del software (de ahí que esté basada en XAML).&lt;/li&gt;&lt;/ol&gt;Luego nos enseñó un par de demos de WPF: la primera era una demostración de varios controles WPF (desde los más básicos como botones, hasta los más elaborados como el reproductor de vídeo o gráficos en 3D). La segunda demo era una aplicación desarrollada por el &lt;span style="font-style: italic;"&gt;New York Times&lt;/span&gt;, para leer las noticias del diario que aprovechaba WPF para dotar a la aplicación de un aspecto idéntico al del periódico en papel.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows Communication Foundation- WCF&lt;/span&gt;&lt;br /&gt;La nueva API de comunicaciones de Microsoft fue la segunda que nos fue presentada. No comentó mucho sobre WCF, básicamente que viene a sustituir las diversas APIs de comunicaciones que actualmente existen en el mundo Microsoft (ASMX, WSE, .NET Remoting, System.Messaging y Enterpise Services) por un modelo unificado.&lt;br /&gt;Luego nos dio un repaso rapidísimo a los fundamentos de WCF: es una API basada en el concepto de &lt;span style="font-style: italic;"&gt;mensajes&lt;/span&gt;, que se intercambian los &lt;span style="font-style: italic;"&gt;servicios&lt;/span&gt;, a través de los &lt;span style="font-style: italic;"&gt;endpoints&lt;/span&gt;. Un endpoint está formado por lo que se conoce por el ABC de WCF: Address (donde está el servicio - URI de acceso), Binding (cómo acceder a él  - protocolo y codificación), Contract (que puede hacer el servicio - métodos disponibles).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Windows Workflow Foundation - WF&lt;br /&gt;&lt;/span&gt;Una de las novedades más interesantes del .NET Framework 3.0 és el framework para la creación de Workflows. No enseñó apenas nada de WF, sólo la extensión de Visual Studio para la creación de workflows de forma gráfica, y realizaó un workflow (que de "&lt;span style="font-style: italic;"&gt;flow&lt;/span&gt;" tenía poco porque eran dos actividades ejecutándose una tras otra). Luego comentó que Sharepoint extendía WF añadiendo nuevas actividades.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cardspace&lt;/span&gt;&lt;br /&gt;Carspace es una API destinada a mejorar la seguridad en el proceso de autenticación y evitar problemas de phising o robo de credenciales. La idea es sustituir la autenticación por login/password por unas &lt;span style="font-style: italic;"&gt;cards&lt;/span&gt; que las aplicaciones compatibles con Cardspace reconocen como válidas. Esas &lt;span style="font-style: italic;"&gt;cards&lt;/span&gt; pueden ser emitidas por organizaciones de confianza o por uno mismo (algo parecido a lo que ocurre con los certificados para SSL). La posesión de la &lt;span style="font-style: italic;"&gt;card&lt;/span&gt; garantiza el acceso a la aplicación en concreto.&lt;br /&gt;El ejemplo que nos enseñó fue el siguiente: una aplicación web compatible con Cardspace (el acceso a Cardspace desde html se puede hacer a través de &amp;lt;object&amp;gt;), con dos botones "login" y "sign-up". Primero se dio de alta en la aplicación. Entonces apareció el asistente de Cardspace de Vista y él creó una &lt;span style="font-style: italic;"&gt;card&lt;/span&gt; nueva para esa aplicación. De los varios campos que se pueden entrar algunos eran obligatorios y otros no, eso lo define la aplicación que solicita la &lt;span style="font-style: italic;"&gt;card&lt;/span&gt;: la idea es que sólo se entren los datos realmente necesarios para la aplicación.  Una vez creada la &lt;span style="font-style: italic;"&gt;card&lt;/span&gt; en el sistema, accedió de nuevo a la aplicación y le dio a "login". Entonces, de nuevo apareció el asistente de Cardspace en Vista y le permitió seleccionar la &lt;span style="font-style: italic;"&gt;card&lt;/span&gt; con la que entrar en la aplicación. Nos mostró que si escogía la que había creado podía entrar, si escogía cualquier otra que tuviese el acceso quedaba denegado.&lt;br /&gt;Finalmente nos comentó que el asistente de Cardspace se ejecuta &lt;span style="font-weight: bold;"&gt;siempre&lt;/span&gt; en una sesión de escritorio nueva (Alt+Tab no sirve de nada) para evitar falsificaciones.&lt;br /&gt;Personalmente me quedaron varias dudas sobre Cardspace, debido a que no conocía para nada esa API y que esa introducción era muy corta. Hubo un par de sesiones sobre Cardspace en el Tech·Ed pero no pude asistir a ninguna. Eso sí, la API parece muy interesante (supongo que la clave será en estandarizar las organizaciones de confianza que emitan las &lt;span style="font-style: italic;"&gt;cards&lt;/span&gt; y como acceder a ellas desde cualquier ordenador).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116470221670739867?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116470221670739867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116470221670739867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470221670739867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116470221670739867'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/dev201-introduction-to-windows-fx.html' title='DEV201 - Introduction to Windows FX'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116469975358980481</id><published>2006-11-27T23:29:00.000-08:00</published><updated>2006-11-27T23:42:33.600-08:00</updated><title type='text'>KEY001 - Key note</title><content type='html'>La keynote dio el inicio al Tech·Ed: Developers 2006. Como es habitual en estos casos es la única presentación que no comparte horario con ninguna otra, y sirve de presentación a lo que veremos durante los próximos cuatro días. Se realizó en un escenario espectacular: el auditorium del CCIB.&lt;br /&gt;&lt;br /&gt;En la keynote quedó patente que las grandes áreas de este Tech·Ed iban a ser Office 2007, .NET Framework 3.0, el desarrollo para Vista, y el desarrollo de aplicaciones web con tecnología Ajax (usando la Microsoft Ajax Library, antes conocida como Ajax, y Expression la nueva herramienta de MS destinada a diseñadores web).&lt;br /&gt;&lt;br /&gt;Nos presentaron una demo, realmente espectacular, que unía esas tres tecnologías en una aplicación para el control de ventas de una empresa de ropa llamada Fabrikam (jejeje... de que me suena ese nombre?). La aplicación estaba compuesta de tres partes fundamentales: un portal web, desarrollado con Ajax, donde los clientes podían navegar por el catálogo y empezar procesos de compra, que eran procesados por workflows en un Sharepoint 2007. Finalmente una aplicación integrada en el task pane de Excel permetía todo tipo de consultas (de forma rápida y fácil), y obtener al instante gráficos y los valores en excel, para poder tratarlos...&lt;br /&gt;... sólo faltó una aplicación cliente de WPF para poder navegar en el catálogo, ya que hubiera sido espectacular, debido a las capacidades gráficas de WPF. Pero no nos la enseñaron en la demo, porque nos mostraron un vídeo de un caso real, que era precisamente eso: una aplicación WPF, para poder navegar por el catálogo on-line de una tienda virtual. Las imágenes que se veían de la aplicación eran muy espectaculares.&lt;br /&gt;&lt;br /&gt;Después de esa demo, nos mecionaron las novedades que traerá Orcas, a destacar: soporte completo para WPF y WCF, integración de LINQ, soporte para equipos distribuidos (en la versión equivalente a la actual Team System), VSTO 2007 y soporte para integrar Ribbon en aplicaciones propias.&lt;br /&gt;&lt;br /&gt;Finalmente hubo una pequeña demo, muy introductoria, de LINQ, donde con un rápido ejemplo se nos enseñó como realizar consultas sobre objetos de negocio (basta implementar IEnumerable), tablas BBDD y generar XML. El resultado: un RSS con todos los procesos que se están ejecutando en la máquina en este momento.&lt;br /&gt;&lt;br /&gt;En resumen, fue una keynote entretenida, sobretodo por lo espectacular de su demo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116469975358980481?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116469975358980481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116469975358980481' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116469975358980481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116469975358980481'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/key001-key-note.html' title='KEY001 - Key note'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-37346067.post-116298717335291402</id><published>2006-11-08T03:49:00.000-08:00</published><updated>2006-11-08T04:05:22.630-08:00</updated><title type='text'>Tech·Ed 2006 by raona</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/1689/557/1600/teched_head.gif"&gt;&lt;img style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/1689/557/320/teched_head.gif" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="left"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/1689/557/1600/by_raona.gif"&gt;&lt;/a&gt;&lt;a href="http://photos1.blogger.com/blogger/1689/557/1600/by_raona.0.gif"&gt;&lt;img style="CURSOR: hand" alt="" src="http://photos1.blogger.com/blogger/1689/557/320/by_raona.0.gif" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;Hola a todos! :)&lt;br /&gt;&lt;br /&gt;En este blog encontrareis mis opiniones y comentarios sobre el Tech·Ed 2006, al cual he asistido en nombre de raona.&lt;br /&gt;&lt;br /&gt;Para hacer más amena la espera os invito a repasar experiencias anteriores de raona en distintas conferencias a las que hemos asistido:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://itforumbyraona.blogspot.com/"&gt;IT Forum 2005 by raona&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://easbyraona.blogspot.com/"&gt;Enterpise Architect Summit 2005 by raona&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://passecbyraona.blogspot.com/"&gt;PASS European Conference 2006 by raona&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://medce2006byraona.blogspot.com/"&gt;MEDC 2006 by raona&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Y obviamente recomendaros que os paseis por la &lt;a href="http://www.raona.com"&gt;página web de raona&lt;/a&gt;, donde encontrareis los distintos blogs que estamos realizando.&lt;/p&gt;&lt;p&gt;Nos vemos en breve ;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37346067-116298717335291402?l=techedbyraona.blogspot.com'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://techedbyraona.blogspot.com/feeds/116298717335291402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=37346067&amp;postID=116298717335291402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116298717335291402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/37346067/posts/default/116298717335291402'/><link rel='alternate' type='text/html' href='http://techedbyraona.blogspot.com/2006/11/teched-2006-by-raona.html' title='Tech·Ed 2006 by raona'/><author><name>epna</name><uri>http://www.blogger.com/profile/02568454383791432108</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12115267828685173273'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>