DotNetNuke Azure Accelerator Released!!

Saliéndome un poco por la tangente del trabajo que venía haciendo adaptando código de DotNetNuke a Azure, le he estado echando un vistazo al Accelerator de Umbraco para ver cómo estaba implementado, sobre todo después del post de Gisela en MSDN que me llamó la atención sobre la utilización de los Cloud Drives para almacenar los contenidos.

El resultado es lo que viene a ser el primer Accelerator para llevar DotNetNuke a Azure, ¡no podía ser que no tuviera!

He publicado el resultado en CodePlex y he comprobado que el proceso de instalación funciona correctamente. Podéis echarle un vistazo en:

http://dnnazureaccelerator.codeplex.com/

DNNAcceleratorArch

También podéis echar un vistazo a un ejemplo de DotNetNuke funcionando con el Accelerator en http://dnnaccelerator.cloudapp.net

La imagen que incorpora el proyecto en una unidad VHD es de la última versión disponible en este momento (DotNetNuke Community 5.6.1), y tiene preinstalados todos los módulos disponibles de esta versión: foros, blogs, etc.

No quiero alargar más este post, ya que en Codeplex tenéis más información y seguramente seguiré escribiendo sobre ello.

Espero que lo disfrutéis.

Un saludo,

David Rodríguez

Copiar una base de datos SQLAzure a un servidor distinto -en otra suscripción- con T-SQL

Si tienes una base de datos en un entorno de desarrollo en Azure, es normal que cuando quieras pasar a producción desees copiar la base de datos con la que has estado trabajando a una suscripción en producción, sobre todo cuando la suscripción final es del cliente y la facturación de uso de Azure se debe facturar a éste.

Para ello podemos usar distintas herramientas para traspasar esquema y datos, como RedGate SQLCompare 9, SQL Azure Migration Wizard, o el mismo MS SQL Server Management Studio 2008 R2.

Sin embargo, hay una manera muy sencilla de copiar dicha base de datos entre distintos servidores, que no es otra que la de ejecutar un comando T-SQL. Sé que este post no es muy novedoso, pero lo hago para utilizarlo como chuleta propia, que siempre ando buscando estos scripts cada vez que tengo que hacer esta tarea.

NOTA: esta sintaxis tiene la limitación de que sólo se puede hacer entre servidores SQL Azure que se encuentren en la misma sub-región o Datacenter.

Cómo copiar la base de datos entre distintos servidores

1) Crear un login en el servidor destino, con el mismo nombre de usuario y contraseña que el DBO de la base de datos origen y asignarle el rol “dbmanager”

-- Ejecutar en la master del servidor destino
-- Crear el Login
CREATE LOGIN MiLogin WITH password='MiPassword';
GO
-- Crear el usuario
CREATE USER MiUsuario FROM LOGIN MiLogin
GO
-- Asignar Rol dbmanager
EXEC sp_addrolemember 'dbmanager', 'MiUsuario';
GO

2) Copiar la base de datos origen con el comando CREATE DATABASE, ejecutándolo en el servidor destino (es un proceso asíncrono y para ver el resultado debéis ejecutar las consultas del siguiente paso). Si el nombre del servidor es xxxxx.database.windows.net, el “NombreServidorOrigen” es “xxxxx”. No se admiten copias entre distintas regiones, sub-regiones o datacenters:

-- Ejecutar iniciando sesión en destino con el 
-- usuario que creamos en el paso anterior
-- Copiar base de datos
CREATE DATABASE NombreBDDestino AS COPY OF NombreServidorOrigen.NombreBDOrigen
GO

3) Monitorizar el estado del proceso de copia a través de las consultas siguientes. Cuando el estado de la base de datos pase de “COPYING” a “ONLINE”, podremos operar ya con la base de datos.

-- Obtener el estado de las bases de datos
SELECT name, state, state_desc 
FROM sys.databases

-- Obtener detalles de los procesos de copia
SELECT * 
FROM sys.dm_database_copies

 

Una vez realizadas estas operaciones, si lo deseamos podemos crear nuevos usuarios e inicios de sesión para la base de datos en el servidor de destino, para que tengan credenciales distintas que en el servidor origen.

Errores conocidos

1) CREATE DATABASE permission denied in database ‘<NombreDBOrigen>’.

Este error lo da si el usuario con el que estamos intentando realizar la copia no es el DBO de la base de datos origen. Aseguraos de que estáis ejecutando el comando con el usuario correcto.

2) “Cannot open server "<NombreServidorOrigen>" requested by the login.  The login failed.”

Aseguraos que el nombre de usuario con el que estáis ejecutando el comando en el servidor destino tiene el mismo nombre y contraseña en el servidor origen. También debéis aseguraos de que el servidor origen está dentro de la misma sub-región o Datacenter. NO SE PUEDEN COPIAR BASES DE DATOS ENTRE DISTINTOS DATACENTERS con esta sintaxis. Para ello hay que acudir a otro tipo de herramientas como las comentadas al inicio del post.

3) “A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 – An existing connection was forcibly closed by the remote host.)”

Este error se debe a un error de conexión por reglas del firewall. También debéis tener en cuenta que no se puede hacer copia entre servidores que estén en datacenters distintos –ver error anterior.

Referencias:

Jornada sobre Cloud Computing – CEOE Tenerife

cloud_powerLa Confederación Provincial de Empresarios de Santa Cruz de Tenerife (CEOE-TENERIFE), en colaboración con Telefónica Movistar y el Centro Tecnológico de Canarias (CETECA), tiene previsto desarrollar el próximo 17 de febrero de 2011, a las 10:00 horas la Jornada Informativa “Cloud Computing: Ventajas de la nube para las empresas”.

El principal objetivo de esta jornada es acercar al tejido empresarial las nuevas formas en que se ofrecen los recursos informáticos, reduciendo significativamente sus costes, tiempos de implementación y puesta en marcha.

Tengo el placer de formar parte en la presentación del mismo, así que te animo a que te inscribas y así poder despejar todas las dudas que tengas sobre este nuevo paradigma de computación.

Os dejo los datos del evento y el programa de la jornada para más información.

> Descargar en formato PDF

Jornada sobre Cloud Computing – CEOE Tenerife

Fecha:

17 de febrero de 2011, 10:00am (GMT+0)

Lugar de celebración:

Sede principal de CEOE-Tenerife
Rambla de Santa Cruz, 147, Edf. Tulipán, bajo

Programa de la jornada:

HORARIO PROGRAMA
10:00 horas Inauguración de la Jornada
Confederación Provincial de Empresarios de Santa Cruz de Tenerife (CEOE-Tenerife)
Centro Tecnológico de Canarias (CETECA)
Movistar
10:15 horas ¿Qué es Cloud Computing? ¿Qué ventajas tiene para las empresas trabajar en la “nube”?
D. David Rodríguez
Socio Tecnológico del Centro Tecnológico de Canarias (CETECA)
11:00 horas Productos relacionados con Cloud Computing
D. Marco Antonio Cabrera León
Responsable en Cloud de Marketing de Negocios de Telefónica
11:30 horas Casos de éxito
Experiencias de Empresas Canarias en Cloud Computing
12:00 horas ¿Cómo financiar un proyecto de innovación tecnológica?
Dña. Tania Bethencourt González
Técnica Centro CIDE de CEOE-Tenerife
12:30 horas Ruegos y Preguntas / Clausura

AFORO LIMITADO: se ruega confirmación de asistencia cumplimentando sus datos de contacto a tbethencourt@ceoe-tenerife.com o llamando al 922 285 958 (Srta. Tania Bethencourt)

RedGate SQLCompare y SQLDataCompare 9 Beta, con soporte para SQL Azure

Logo_Redgate01Una de las tareas que tenía pendiente desde hace un par de meses, era comprobar si Red Gate, tenía en marcha la adaptación de dos de sus herramientas –para mí imprescindibles en las labores de DBA- a SQL Azure.

Hasta la fecha no tenía constancia del lanzamiento de las mismas, pero parece ser que desde hace algo más de un mes han liberado la versión 9 Beta de dos de mis herramientas favoritas: SQLCompare y SQLDataCompare, y sobre todo con la intención de tener soporte completo para SQL Azure.

Para el que no conozca la suite de herramientas, comentarles que la primera, SQLCompare, es una herramienta para el mantenimiento y sincronización de esquemas de bases de datos muy reconocidas por los DBAs. La segunda, SQLDataCompare, hace lo mismo pero a nivel de datos, con lo que podemos sincronizar bi-direccionalmente dos bases de datos distintas a través de T-SQL autogenerado. Si alguien conoce el SQL Azure Migration Wizard que se encuentra en CodePlex, se trata de dos herramientas que realizan la misma tarea pero de una forma mucho más completa –su número de versión 9 lo avala.

Si queréis probar el funcionamiento de las mismas, debéis acceder a través del siguiente enlace http://www.red-gate.com/azure y rellenar la encuesta inicial. Al enviar la encuesta os presenta en pantalla los enlaces para la descarga:

RedGateDownload

SQLCompare

Una vez realizada la descarga e instalada la herramienta, creamos el proyecto con la configuración de las dos bases de datos que queremos comparar. En principio para el ejemplo de las capturas de pantalla he seleccionado una base de datos en blanco en Azure para realizar la migración inicial. Al guardar el proyecto, podemos sincronizar los esquemas desde Azure a local, y viceversa. Si os fijáis, la base de datos puede estar en línea, ser un backup, un snapshot o estar dentro de control de código fuente. Muy potente.

EditProject

También podemos seleccionar entre unos 50 parámetros distintos para alterar el comportamiento de los scripts de sincronización que genera, para que sean compatibles con SQL Azure.

OptionsProjecct

CompareSuccess

Una vez que se realiza la comparación, se nos presenta el interfaz principal a través del cual podemos ver qué objetos del esquema son iguales o distintos en las bases de datos, llegando al nivel de detalle de generar automáticamente el T-SQL. Lo bueno de trabajar en modo intermedio con scripts, es que siempre podemos revisarlos antes de pasar a producción, además de poder dejar ese trabajo a los encargados de hacerlo.

CompareDetail

SQLDataCompare

La segunda herramienta es muy similar a la anterior, sólo que ésta en vez de compara y sincronizar esquemas, trabaja sobre los datos, comparando cada valor de cada registro de cada tabla (podemos seleccionar qué tablas queremos comparar, no os asustéis). También se pueden seleccionar otras tantas opciones de sincronización como se hizo en el proyecto de esquemas. Toda esta configuración se guarda en un archivo de proyecto para futuros mantenimientos.

EditProjectData

OptionsProjectData

Respecto al traspaso de datos, entre otras cosas ofrece algo que el SQL Azure Migration Wizard no da, que es la generación del T-SQL de alteración de los datos –el primero utiliza BCP para realizar el upload de los datos-, muy útil cuando quieres automatizar una instalación inicializando la base de datos.

DataComparison

ReviewScript

Por lo que he probado, está funcionando correctamente. Eso sí, la base de datos que tenía en local de DotNetNuke hace tiempo que le hice algunas correcciones para que no me diera tantos problemas al migrar a Azure.

Espero que resulte útil. Un saludo y happy…DBAing?

Integrando Exchange Online Services con DotNetNuke

Una de las características que nos encontramos cuando tenemos alojado DotNetNuke en Azure es que no disponemos de un servidor SMTP para el envío de los correos de notificación que usa el gestor de contenidos.

La solución pasa por una de las siguientes alternativas muy bien expuestas en el post de Christian Weyer:

  • Usar un proveedor externo que pueda ayudar en el envío de correos
  • Conectar a tu servidor SMTP On-Premises
  • Usar APIs/Servicios expuestos por terceros para el envío

Bajo el último enfoque entran los servicios expuestos por Exchange Online, servicio que a través del pago de 5$ al mes/usuario podemos contar con la capacidad de un servidor de Exchange alojado en la nube –recordad que podéis probar la suite BPOS durante un periodo de 30 días sin compromiso.

Para usar los servicios de Exchange Online desde DNN realizaremos una serie de modificaciones en el portal para usar los servicios web que nos ofrece. El WSDL de estos servicios está accesible según la región donde se hayan solicitado los mismos:

Asia y Pacífico (APAC) https://red003.mail.apac.microsoftonline.com/ews/Services.wsdl
Europa (EMEA) https://red002.mail.emea.microsoftonline.com/ews/Services.wsdl
Norte América (NA) https://red001.mail.microsoftonline.com/ews/Services.wsdl

El WSDL nos ofrece una completa información acerca de los webmethods disponibles para operar remotamente con Exchange, aunque para simplificar su uso utilizaremos la EWS Managed API 1.1, que podéis descargar desde este enlace.

WSDL

En los pasos siguientes vamos a realizar unas pequeñas modificaciones en nuestro portal DNN para usar estos servicios web de Exchange Online.

Modificar el DNN core para conectar con BPOS

Como lo que deseamos es ampliar la funcionalidad actual del DNN para soportar BPOS y permitir seguir seleccionando un servidor SMTP, comencemos por modificar las opciones de configuración del host –para realizar estas modificaciones será necesario disponer del código fuente de DotNetNuke Community, que pueden descargar la última versión desde este enlace.

1. Añadir el enumerado MailServerType en el proyecto DotNetNuke.Library, en el archivo LibraryServicesMailMailServerType.vb (crear el archivo):

Namespace DotNetNuke.Services.Mail
    Public Enum MailServerType
        SMTP
        BPOS
    End Enum
End Namespace

2. Añadimos en la clase DotNetNuke.Entities.Host.Host la propiedad MailServerType:

''' <summary>
''' Gets the MailServerType (SMTP or BPOS)
''' </summary>
Public Shared ReadOnly Property MailServerType As DotNetNuke.Services.Mail.MailServerType
   Get
      Return CType(HostController.Instance.GetInteger("MailServerType"), DotNetNuke.Services.Mail.MailServerType)
   End Get
End Property

3. Agregamos una referencia a la EWS Managed API. La instalación no la coloca en la GAC para prevenir problemas con otras posibles instalaciones futuras –ese es el motivo que pone en la documentación-, así que tenemos que buscar la librería que por defecto se instala en la ruta: C:Program FilesMicrosoftExchangeWeb Services1.1Microsoft.Exchange.WebServices.dll. Aseguraos de poner el ensamblado como “Copia local=true” para que se copie automáticamente el ensamblado en el “bin” de DotNetNuke al generar el core.

AddReference

Assembly

4. Importar el espacio de nombres Microsoft.Exchange.WebServices.Data a través de las propiedades del proyecto

5. Añadir un discriminador en la rutuna SendMail de la clase “Mail” para detectar si el envío es a través de Exchange Online:

' Send using BPOS instead of SMTP
If Host.MailServerType = MailServerType.BPOS AndAlso SMTPServer = Host.SMTPServer Then
   Return SendMailBPOS(MailFrom, MailTo, Cc, Bcc, ReplyTo, Priority, Subject, BodyFormat, BodyEncoding, Body, Attachments, SMTPServer, SMTPUsername, SMTPPassword)
End If

6. Agregar la rutina del envío de mensajes usando la API de Exchange:

        Public Shared Function SendMailBPOS(ByVal MailFrom As String, ByVal MailTo As String, _
            ByVal Cc As String, ByVal Bcc As String, ByVal ReplyTo As String, _
            ByVal Priority As MailPriority, ByVal Subject As String, _
            ByVal BodyFormat As MailFormat, ByVal BodyEncoding As System.Text.Encoding, ByVal Body As String, _
            ByVal Attachments As List(Of Attachment), ByVal WebServiceURL As String, _
            ByVal Username As String, ByVal Password As String) As String

            SendMailBPOS = ""
            Try
                Dim service As New ExchangeService(ExchangeVersion.Exchange2007_SP1)
                service.Url = New Uri(WebServiceURL)
                service.Credentials = New System.Net.NetworkCredential(Username, Password)

                Dim objMail As EmailMessage = New EmailMessage(service)
                objMail.From = New EmailAddress(MailFrom)
                If MailTo <> "" Then
                    objMail.ToRecipients.Add(MailTo)
                End If
                If Cc <> "" Then
                    objMail.CcRecipients.Add(Cc)
                End If
                If Bcc <> "" Then
                    objMail.BccRecipients.Add(Bcc)
                End If

                If ReplyTo <> String.Empty Then objMail.ReplyTo.Add(New EmailAddress(ReplyTo))
                Select Case Priority
                    Case MailPriority.High : objMail.Importance = Importance.High
                    Case MailPriority.Low : objMail.Importance = Importance.Low
                    Case Else : objMail.Importance = Importance.Normal
                End Select
                objMail.Subject = HtmlUtils.StripWhiteSpace(Subject, True)
                objMail.Body = New MessageBody(CType(IIf(BodyFormat = MailFormat.Html, BodyType.HTML, BodyType.Text), BodyType), Body)

If Attachments.Count > 0 Then
objMail.Save()
' Add Attachments, converting from MailAttachments to Exchange Attachements
For Each myAtt As Attachment In Attachments
Dim mFilename As String = IO.Path.GetTempFileName()
Using fStream As New IO.FileStream(mFilename, IO.FileMode.OpenOrCreate)
Dim bArray As Byte()
ReDim bArray(CInt(myAtt.ContentStream.Length))
myAtt.ContentStream.Read(bArray, 0, CInt(myAtt.ContentStream.Length))
fStream.Write(bArray, 0, bArray.Length)
fStream.Close()
End Using
objMail.Attachments.AddFileAttachment(mFilename).Name = myAtt.Name
' It's is necessary to call .Save() in order to upload the attachment to the server
objMail.Save()
Next
End If
' send the message
objMail.SendAndSaveCopy()
Catch objException As Exception
' mail configuration problem
If Not IsNothing(objException.InnerException) Then
SendMailBPOS = String.Concat(objException.Message, ControlChars.CrLf, objException.InnerException.Message)
LogException(objException.InnerException)
Else
SendMailBPOS = objException.Message
LogException(objException)
End If
End Try

End Function

 

Añadir posibilidad de configuración

Ahora toca modificar el interfaz de usuario para agregar soporte de configuración a los superusuarios del portal. Para ello, realizamos los pasos siguientes.

1. Abrir el archivo ~DesktopModulesAdminHostSettingshostsettings.ascx y buscamos en el marcado la tabla “tblSMTP”

2. Modificamos el marcado para agregar la posibilidad de indicar el tipo de servidor. También modificamos las etiquetas “tr” correspondientes a la autenticación y SSL para poder mostrarlas y ocultarlas desde el código de servidor.

    <tr>
        <td class="SubHead" style="width: 250px">
            <dnn:Label ID="plMailServerType" Text="Server type:" ControlName="cboMailServerType" runat="server" /> 
        </td>
        <td align="left">
            <asp:DropDownList ID="cboMailServerType" runat="server" AutoPostBack="true">
                <asp:ListItem Value="SMTP" resourceKey="MailServerTypeSMTP">Servidor SMTP</asp:ListItem>
                <asp:ListItem Value="BPOS"  resourceKey="MailServerTypeBPOS">Exchange Online</asp:ListItem>
            </asp:DropDownList>
        </td>
    </tr>

3. Agregamos las entradas correspondientes en los archivos .resx de recursos en la subcarpeta App_LocalResources

Resources

4. Modificamos la rutina ShowHideSMTPCredentials() y agregamos código en el evento de selección de la lista para mostrar/ocultar parámetros según esté seleccionado el tipo de servidor.

        Private Sub ShowHideSMTPCredentials()
            If optSMTPAuthentication.SelectedValue = "1" OrElse cboMailServerType.SelectedValue = "BPOS" Then
                trSMTPPassword.Visible = True
                trSMTPUserName.Visible = True
            Else
                trSMTPPassword.Visible = False
                trSMTPUserName.Visible = False
            End If
            rowSMTPAthentication.Visible = cboMailServerType.SelectedValue = "SMTP"
            rowSMTPEnableSSL.Visible = rowSMTPAthentication.Visible
        End Sub

        ''' <summary>
        ''' Fires when the Mail server type dropdownlist changes
        ''' </summary>
        Protected Sub cboMailServerType_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboMailServerType.SelectedIndexChanged
            Try
                ShowHideSMTPCredentials()
            Catch ex As Exception
                ProcessModuleLoadException(Me, ex)
            End Try
        End Sub

5. Modificamos la rutina BindData() para volcar la propiedad configurada en el dropdown

'...
cboMailServerType.SelectedValue = Entities.Host.Host.MailServerType.ToString()
ShowHideSMTPCredentials()
'...

6. Modificamos el evento cmdUpdate_Click para guardar el dato:

 HostController.Instance.Update("MailServerType", [Enum].Parse(GetType(MailServerType), cboMailServerType.SelectedValue), False)

7. Con esto podemos configurar tanto el servidor SMTP como el servidor BPOS según nos convenga:

SMTPConfig

BPOSConfig

Al pulsar sobre el enlace “Probar” que trae incorporado DNN, realiza un envío de mensaje de prueba, que como podemos observar procesa correctamente nuestro Exchange Online.

EnvioCorrecto

Conclusión

En este artículo hemos visto la posibilidad de realizar envíos de correos desde DNN a través de Exchange Online. Para ello hemos utilizado la EWS Managed API 1.1, que facilita el manejo de los servicios web expuestos por Exchange.

Si en este ejemplo lo que hemos visto es cómo realizar los envíos a través de estos servicios, los servicios que ofrece la API son numerosos pudiéndose realizar casi cualquier cosa.

¿Cuándo comenzaremos a ver módulos desarrollados para explotar las características de Exchange desde nuestro portal DNN? Voy a ver si veo alguno por SnowCovered Sonrisa

Espero que os haya servidor de ayuda.

Un saludo y happy coding!

Examinando Razor-Helpers

Continuando con la serie de artículos sobre WebMatrix, Razor y su integración con DotNetNuke, hoy vamos a echar un vistazo a los Helpers que están a nuestra disposición para agregar funcionalidad de terceros a nuestros portales de una manera sencilla y rápida.

Si bien en este artículo me he centrado en el uso desde DotNetNuke, la información es totalmente válida para la integración con cualquier otro portal o tecnología como ASP.NET MVC3 que implementen las librerías de extensión que dan soporte a Razor.

Libraries

NOTA IMPORTANTE: hay una librería (System.Web.WebPages.Deployment) que no está incluida en la instalación actual de DotNetNuke y que viene incluida en la instalación de MVC 3. Hay que tenerla en el equipo para que funcione correctamente. A través de este enlace tenéis más información sobre el error.

Actualmente, la lista de Helpers no es que sea muy grande, pero hay buenos y útiles ejemplos. Esperemos que en un futuro este ecosistema siga extendiéndose para facilitar las integraciones con terceros.

Twitter Helper

Para comenzar hoy con un ejemplo muy sencillo, echémosle un vistazo al Helper de Twitter con el objetivo de incluir un módulo en la barra lateral de nuestro sitio.

Para ello, agregamos un módulo RazorHost a una página cualquiera –para este ejemplo he creado una página en blanco en el sitio:

Twitter

Al pulsar el botón de añadir, hemos agregado un módulo en blanco RazorHost con el título Twitter. Ahora hay que entrar a configurarlo, ya que hasta que no se le indique el script Razor que tiene ejecutar no hará nada.

Para hacerlo, hay que tener en cuenta que los administradores del portal sólo pueden seleccionar scripts predefinidos por los superusuarios, por lo que si se desea agregar y/o modificar un script es necesario iniciar sesión como super-usuario.

ModAdminModSuperUser

TwitterScript

TwitterResultEntrando como superusuario y pulsando sobre el botón “Edit Script”, nos sale el interfaz de edición de Razor Script. Tenemos la suerte que el Helper de Twitter viene como uno de los ejemplos en la instalación de DotNetNuke, con lo que si lo seleccionamos y modificamos unos cuantos parámetros –ver documentación completa del Helper de Twitter– ya tenemos la integración con Twitter resuelta al pulsar el botón “Guardar Script y Volver”.

 

Conclusión

Como ya hemos visto, integrar con RazorHost un Helper de terceros es sumamente sencillo, siendo el widget de Twitter un buen ejemplo. En los siguientes artículos iremos viendo la integración con otros Helpers más interesantes, como pueden ser la integración con Facebook, PayPal o ¡Windows Azure! Sí también hay helper de Windows Azure para manejar tablas y blobs.

Por lo que he visto, WebMatrix está pensado para desarrollos que no sean complejos ni que vayan a requerir un alto grado de mantenimiento, con un enfoque hacia el desarrollador iniciado que necesite una herramienta sencilla pero con un alto grado funcional.

Si bien trabajar con Razor puede que haga recordar que volvemos a trabajar con ASP tradicional (no ASP.NET), creo que encaja muy bien en aquellos desarrollos cortos en presupuesto y tiempo. Tampoco hay que olvidar la posibilidad de desarrollar nuestros propios helpers Razor para que puedan ser integrados, con lo que también podría facilitar la integración de distintos roles en los equipos de desarrollo.

¿Vosotros qué opináis?

Un saludo y ¡Happy Coding!

Helloworld Geeks.ms

GeeksDespúes de unos días algo ajetreados, estoy de vuelta ante el Live Writer dispuesto a hacer un resumen de las cosas que he ido viendo durante la semana y que por una serie de acontecimientos no me ha dado tiempo de comentar.

Antes de entrar en materia, quiero agradecer a Rodrigo Corral el permitir unirme a Geeks.ms como miembro activo. Sé que tiene una agenda apretadísima y aún así ha sacado tiempo para hacer que pueda participar en esta comunidad.

También quería agradecer a José Fortes, Alberto Díaz y a Josue Yeray el apoyo desinteresado que me han brindado y hacerme ver las cosas desde otro punto de vista.

A modo de presentación, para los que no me conozcan desde Geeks, he sido desarrollador, analista y responsable de equipo de desarrollo durante 14 años, especializado en sistemas de reservas para compañías marítimas y aéreas. Los últimos años he estado dedicando todo mi interés hacia el desarrollo en la nube y Windows Azure, y por una carambola el año pasado acabé metiéndome de lleno también con DotNetNuke al conseguir migrar el portal a Windows Azure. Así que últimamente mis posts se centran en experiencias sobre Windows Azure y DNN, aunque pueden esperar que escriba sobre cualquier cosa sobre desarrollo .NET, SOA o TFS. En este enlace tenéis la entrada con la que abrí mis paseos por la nube en la que podéis conocerme mejor.

A la gente que ha venido siguiéndome en mi blog habitual, comentarles que publicaré de igual modo en ambos blogs, con lo que podrán encontrar el mismo contenido que publicaré en Geeks. Si quieres saber más sobre qué es Geeks puedes echarle un vistazo a esta entrada de Rodrigo Corral en la que se explica con mayor detalle su filosofía.

Espero que mis artículos sigan siendo de interés y enriquecerme con vuestros comentarios.

Un saludo,

David Rodríguez