Matrices escalonadas o "jagged arrays"

En mi anterior post hablaba sobre cómo definir matrices multidimensionales en .NET. Lo cierto es que hay una forma alternativa de hacerlo que tiene ventajas de rendimiento y de características y que está totalmente soportada por el compilador: las matrices escalonadas.


Entre otras cosas cambia la sintaxis y además nos permite definir matrices multidimensionales con diferentes tamaños en cada dimensión (en el modo normal son matrices rectangulares).


Estas matrices escalonadas son verdaderamente «matrices de matrices», tal y como comentñe en el post anterior.

Estas matrices én realidad sólo tienen una dimensión y cada elemento de las mismas es una matriz. Realmente lo que se hace es definir una matriz lineal normal y a cada elemento asignarle a su vez otra matriz, así por ejemplo:


Dim jArr As Integer()() = {
New Integer() {1, 2, 3, 4}, _
New Integer() {5, 6, 7}, _
New Integer() {8, 9}, _
New Integer() {10, 11, 12}, _
New Integer() {13}
}

De esta forma defines una verdadera matriz de matrices. Así, cada fila como se puede ver tiene diferente tamaño (la primera 4 elementos, la segunda 3, la tercera 2, la cuarta 3 y la quinta sólo 1).

Es importante fijarse en cómo se han definido dos paréntesis para acceder a los elementos, y no uno separado por comas como estamos acostumbrados. Ahora para acceder a un elemento escribiríamos:



Console.WriteLine( jArr(1)(2) )


que en este caso devuelve el tercer elemento de la segunda fila, o sea, un 7.


Espero que os resulte útil.

Definición de matrices multidimensionales en .NET

Este post sale, como el anterior, de una pregunta concreta que me ha hecho un alumno en campusMVP. La cuestión viene acerca de cómo se definen las matrices de varias dimensiones en .NET, lo cual es válido tanto para VB como para C#.


La clave está en que se debe pensar en las matrices de más de una dimensión como en «Matrices de matrices», y así se entiende mucho mejor.


Por ejemplo, si quieres utilizar coordenadas de 3 dimensiones del estilo de (x,y,z) realmente no te hace falta una matriz tridimensional, ya que puedes guardarla en una de dos dimensiones si piensas en lo he dicho de «matrices de matrices». Así, por ejemplo para guardar coordenadas como las anteriores puedes escribir:


int[,] arr1 = { {1,2,3}, {4,5,6} };

Es decir, aunque tus «ristras» de datos tengan tres elementos debes usar sólo dos dimensiones porque lo que obtienes es una matriz que contiene en cada fila a otras matrices, así que con la primera dimensión indicas la fila y con la segunda la columna, así:


Console.WriteLine( arr1[0,1] );

Así lo que consigues es una matriz bidimensional pero cuyas filas tienen tres elementos, es decir, una matriz en este caso de dos filas y tres columnas:



1   2   3
4   5   6


Al coger el elemento (0,1) estás indicando que te de el segundo elemento de la primera fila (recuerda que están basadas en cero), es decir, el número 2, pero si pidieras el (1,2) te devolvería el 6 (tercer elemento de la segunda fila).


Si quieres definir una matriz tridimensional tendrías que definir una «matriz de matrices de matrices», es decir, tendrías que hacer un doble anidamiento. Por ejemplo, puedes definir una matriz 3D así:

        int[,,] arr2 = {
            { {1,2,3}, {4,5,6} },
            { {7,8,9}, {10,11,12} }
            };
        
        Console.WriteLine( arr2[0,1,1] );

Esto devolvería el número 5 ya que coges la primera matriz de matrices, dentro de ésta coges la segunda matriz y dentro de ésta el segundo elemento.


Estos conceptos serían exactamente los mismos en VB, con una definición de matrices prácticamente idéntica:


Dim arr1(,) As Integer = { {1,2,3}, {4,5,6} }
Console.WriteLine( arr1(0,1) )
Dim arr2(,,) As Integer = _
{ _
{ {1,2,3}, {4,5,6} }, _
{ {7,8,9}, {10,11,12} } _
}
Console.WriteLine( arr2(0,1,1) )

Espero que os resulte útil.

Llamadas asíncronas a servicios Web: la sobrecarga menos conocida

Hoy en uno de los cursos de campusMVP un alumno me ha hecho una pregunta cuya respuesta creo que puede interesar a más de uno. Se refería a la llamada asíncrona a servicios Web y una segunda sobrecarag de los métodos xxxxAsync que toma un parámetro adicional.


como es sabido cuando definimos un servicio Web y lo consumimos desde una aplicación cliente es posible hacer llamadas asíncronas al mismo para dejar que se siga ejecutando la aplicaicón sin necesidad de quedar con el hilo a la espera de que terminen operaciones largas en dicho servicio. Desde .NET 2.0 esto es muy sencillo ya que el proxy que se genera para llamar al servicio añade para cada método un método adicional con el mismo nombre y seguido de la palabra «Async» de modo que podamos utilizarlo para hacer la llamada asíncrona. así, si tenemo sun método GetdatosFromClientes, podemos llamarlo asíncronamente con GetdatosFromClientesAsync.


Nota: Ojo porque si la referencia al servicio Web la añadimos usando WCF para generar el proxy y las llamadas deberemos marcar explícitamente que se generen los método asíncronos pues por defecto no lo hace:



Vale. Entonces la llamada síncrona es tan sencilla como asignar un método como método a llamar cuando regrese la llamada desde el servidor (ahí procesamos y obtenemos el resultado de la llamada al método), y llamar a este método xxxAsync sin parámetros.


No obstante el método Async tiene una sobrecarga que nos permite pasarle un objeto de referencia a la llamada. El objeto de este parámetro adicional en esta sobrecarga es el de añadir información de contexto a la llamada, generamente para distinguir unas de otras y/o añadir información contextual sobre la llamada si el manejador se reutiliza entre varias de ellas. Dado que le podemos pasar un objeto de una clase cualquiera definida por nosotros nos sirve para pasar cualquier tipo de información. Luego dicho objeto de contexto se recupera en el manejador del retorno de la llamada a través de la propiedad UserState del segundo parámetro de dicho método.


Veamos un ejemplo práctico de cómo usarlo. Imaginemos un método cualquiera de un servicio al que vamos a llamar asíncronamente (de nombre, por ejemplo, HelloWorld, da lo mismo). Lo llamamos varias veces (en nuestro ejemplo simplificado dentro de un bucle) y queremos visualizar por pantalla en qué orden se devuelven las llamadas asíncronas, que con mucha probabilidad no tiene porqué ser el mismo orden en el que fueron hechas. Podemos escribir este código (en VB):

Sub Main()
Dim s As New WSEjemplo.ServiceSoapClient()
AddHandler s.HelloWorldCompleted, AddressOf FinHola

For i As Integer = 1 To 10
s.HelloWorldAsync(i)
Next
    
Console.ReadLine()
End Sub

Private Sub FinHola(ByVal sender As Object, ByVal e As WSEjemplo.HelloWorldCompletedEventArgs)
Dim idLlamada As Integer = CType(e.UserState, Integer)
Console.WriteLine(idLlamada)
End Sub


Lo que conseguimos es que, tras cada llamada se obtiene el orden en el que se inició la misma desde la informción de contexto pasada con el método Async. Así veremos que el orden en el que se reciben las respuestas no es generalmente el original de las llamadas, por ejemplo el de la figura:



Como vemos en este ejemplo práctico sencillo, esta segunda sobrecarga de las llamadas asíncronas puede sernos de mucha utilidad para sincronizar o distinguir por contexto unas llamadas asíncronas de otras.


Espero que te sea útil!

Barcelona día 5: TechEd día 4 – Iván total y definitivamente KO. Ponencia cancelada. Despido comunicación.

Pues eso: Iván ha tenido que entrar en urgencias hoy, está para el arrastre y tiene al menos para 4 días más según le dicen. Pobre hombre, eso es lo peor.


Además yo no he dado la talla para defender la ponencia de ambos yo solo así que, lamentándolo mucho, la hemos tenido que suspender. Mejor eso que hacerla a medias o con un mal «feeling» y que nos puntuen bajo los asistentes. Así que se acabó lo que se daba. Quizá otro año. Una lástima.


Así que he estado todo el día concentrado tratando de cerrar la charla yo solo (la parte de TI me queda algo lejos), sin tiempo para asistir a ninguna sesión, y no tengo mucho que contar salvo las malas noticias :-(((


Así que despido la conexión y ya recuperaré los post normales cuando vuelva a casita y recupere el trabajo de estos últimos días.


Gracias a todos los que nos habéis dado ánimos estas últimas semanas.


Saludos


JM.

Barcelona día 4: TechEd día 3 – Iván en cama. Ponencias de Miguel. Cena de los españoles.

Pues nada, ya que me he metido en este embolado de narrar diariamente mis experiencias en el TechEd 2008, ahí va la cosa.


Hoy nos hemos levantado con muy malas noticias: la gripe de Iván fue a peor y el «pobriño» se levantó «con la cabeza como un piano» (palabras textuales). Está para el arrastre así que se quedó en cama todo el día bien tapadito y a base de medicinas. Aparte de lo obvio estamos preocupados porque no sabemos si va a llegar con fuerzas para nuestra conferencia del viernes y a ver cómo la hago yo solo. Tenemos preparada una cosa muy chula, pero hacen falta dos :-(((


Esperemos que entre mañana jueves y el viernes por la mañana esté lo suficientemente recuperado como para ir a la ponencia. Luego que se meta en cama todo el fin de semana.


Bueno, con toda esta movida de Iván lo cierto es que hoy sólo he podido ir a las dos conferencias de Miguel Jiménez. La de la mañana «Nerdvana Annihilation: Improving Silverlight UX without out-of-thebox controls» muy chula (ver foto a continuación). Enganchó muy bien a la audiencia desde el principio pero el Expression Blend le jugó una mala pasada y tuvo que escribir muchísimo código a mano en las demos, lo cual enfrió a la audiencia y deslució un poco la sesión. Una pena, pero de todos modos muy bien.




Miguel en plena explicación de la experiencia de usuario de una tostadora 😉 (no es coña)


La ponencia de la tarde sobre DeepZoom, sin embargo, la clavó. Muy interesante, muy amena y muy espectacular. Hasta él salió bastante satisfecho (todos los ponentes salen diciendo lo mal que lo han hecho, jeje).


A la noche cena con los españoles que estábamos en el TEchEd (no muchos en proporción al total, eso está claro) en un restaurante próximo al Centro Internacional de Conferencias de Barcelona llamado «La casa del pesacado», en donde curiosamente nos sirvieron carne 😛


En fin, mañana más. A ver como se levanta Iván…

Barcelona día 3: TechEd día 2 – El mundo TIC dentro de 10 años. Ponencia de Hadi.

De lo que he podido ver hoy, lo mejor del día en TechEd ha sido la ponencia sobre el futuro del mundo TI dentro de 10 años. Además, dado que no era contenido técnico pienso que esta debería haber sido sin duda la ponencia del KeyNote de ayer, y no el tostón que nos soltaron, que pegaba más para una sala de menor tamaño.


El hombre (no tengo claro su nombre, porque anunciaron a tres ponentes y sólo salió él) nos habló de temas sociológicos y económicos de las TI. Empezando por los «nativos digitales», gente que ha nacido de lleno en la era digital y que ya no son como nosotros por mucho que nos creamos que los de nuestra generación estamos muy metidos en esto. Ellos lo han mamado y a nosotros nos llegó mucho más tarde. La diferencia es sustancial. De esto se desprende cómos será la sociedad digital del futuro y qué aplicaciones y nuevos paradigmas necesitaremos. El coeficiente intelectual (CI) sube de 7 a 10 puntos de media cada década. Tenemos una capacidad de conocimiento creciente en las nuevas generaciones. En lugar de imponer hay que tender puentes hacia ellos.


También cómo serán los empleados y los líderes del futuro (es la Digital identity). Una afirmación que me sorprendió pero que no está falta de sentido fue esta: si quieres ver quiénes y cómo serán los líderes y el tipo de liderazgo en 5 años, echa un vistazo a los juegos online. El hombe contaba el caso de una entrevista de trabajo real a un flipao de World of Warcraft y que cómo experiencia dirigiendo personas alegaba que era nivel nosecuantos en WoW, algo que realmente implica dotes, carisma y estrategia, por lo que no era en el fondo ninguna tontería. Es decir, ya hoy en día cosas que haces en el mundo virtual sirven para el mundo real: ¿te expresas bien y te gusta escribir?: enséñame tu blog, ¿eres sociable y con capacidad de relación?: dónde estás en las diferentes redes sociales… Esto condujo a una interesante y simpática comparación entre la pirámide de Maslow y la tecnología, y cómo la tecnología ayuda a los nativos digitales en cada paso de la pirámide (incluyendo la web social: puedes construir tu propio mundo de amigos, obtener reconocimiento, incluso amor aún viviendo en un sitio remoto como Alaska).


Por supuesto habló de Green Computing, y de cómo cada vez tiene más importancia el ahorro de energía. La verdad es que hasta hoy todo este tema lo había visto como una moda más, resultado de campañas de imagen de las marcas, pero la charla demostró que hay mucho más fondo real del que parece en todo ello. Y una cosa a resaltar: la importancia de que las grandes empresas elijan sitios fríos, remotos y bien conectados para sus Data Centers. No es ninguna tontería y sitios como Islandia (especialmente afectada por la crisis) deberían explotar mucho estos aspectos que poseen.


Otro tema que no podía faltar era el softwatre como servicio (SaaS) y el Cloud Computing. La pregunta es: cuando pinchas el portátil al enchufe, ¿piensas en si la electricidad que te llega es nuclear, hidraulica, etc…? No, sólo quieres  pinchar el ordenador y trabajar. Pues algo similar pasará cuando los servicios en la nube estén más extendidos. Se convierte todo en un servicio más (commodity), sin importarte qué sistema operativo tenga debajo la nube, en dónde estén tus datos guardados, etc… Lo único que querrás es fiarte de tu proveedor para que la info esté segura y accesible.


Y esto nos lleva a otro tema relacionado y que, yo al menos, no tengo presente habitualmente: la regulación y la legislación de estos servicios en la nube. Las TI es son de las pocas indusrtias que no están reguladas a findo, pero lo necesitas para poder confiar. ¿por que confías en que la corriente tenga el nivel adecuado y no te va a freir el ordenador cuando lo pinchas  a la pared? ¿porque te fías de que al abrir una botella de agua te la puedes beber sin miedo? Por que hay regulación de esos servicios y sus calidades. En CC, a medida que más empresas y servicios de nuestras vidas dependan de ellos habrá que regularlos para que no pasen catástrofes, ya que dependeremos de ellos tanto como de la luz o el agua.


En fin, la charla incluyó esto y muchas otras cosas, demasiadas para poner aquí sin estar escribiendo dos horas, pero baste decir que a pesar de lo que pueda parecer a algunos, aún no siendo técnica resultó de lo más interesante y motivadora. Me quedo con una de las «perlas de sabiduría» (como él las llaamaba) que puso en sus slides: «Find out what the other guy is doing, the do something else». Ahí queda eso.


Por fin, hoy habló el primero de los españoles: Hadi Hariri. Como decirlo sin que suene exagerado: ¡es un puñetero crack!. De verdad. Un dominio del inglés alucinante (claro, es nativo en este idioma además del español), control absoluto de las pausas dramáticas, el movimiento de los brazos y por el escenario, los «chascarrillos» en el momento justo… Nos dejó alucinados y ha metido unos cuantos bares de presión en todos los demás españoles que vamos a tener ponencia (Iván y yo y Miguel). Un fenómeno que ha hecho valer su amplia experiencia como conferenciante internacional.




Vista desde tercera fila de la charla de Hadi. Era la sala más grande después del auditorio.


Mañana le toca a Miguel. Ya os contaré. Y el viernes a la tarde Iván y yo. Resulta que hay tanta gente apuntada a nuestra charla (más de 600) que nos han movido a una sala de las grandes como la de Hadi. Más presión para la conferencia. A ver si no reventamos 😉


Y encima Iván está con gripe: ¡espero y confío en que llegará en plenas facultades al viernes!

Barcelona día 2: TechEd día 1 – Menudo despliegue. Keynote aburridísima. ASP.NET 3.5 SP1, AJAX 4.0

Bueno, primer día de TechEd (segundo en BCN) y arranca todo el evento. LLegamos, y un despliegue de medios impresionante: miles de personas, comida y bebida por todas partes… Gestionar un evento de esta magnitud debe de ser complicadísimo. Para que te hagas una idea mira uno de los dos comedores para los asistentes que están siempre preparados (y no está pillado desde el extremo de todo):



Los speaker, claro, tenemos una zona privada con comida un poco mejor, jejeje 😉


Bueno, el caso es que a las 14:00 se dio el pistoletazo de salida de este año con la Keynote, o conferencia principal del evento. Ésta suele ser bastante marketiniana, con jefes de Microsoft hablando de sus cosas. Esta vez aunque se abrió de esta forma después hubo una charla técnica presentando las principales novedades de Visual Studio 2010. Nunca pensé que diría esto pero… ojalá hubiera seguido el tipo de marketing. ¡Qué charla tan aburrida! El hombre (no diré el nombre para no vituperarlo demasiado públicamente) fue muy monótono y encima no se veía absolutamente nada en la pantalla porque usaba letra pequeña y no usaba el zoom. Además, tampoco es que hiciera nada especialmente agradecido para las demos. Todos con lo que hablé coincidían conmigo. Una pena:




Aspecto del auditorio en el que se celebró la Keynote, con miles de personas dispuestas a disfrutar.


Las conferencias «de verdad» comenzaron un poco más tarde. Al haber tantas sesiones en paralelo es muy difícil escoger sólo una, pero mientras no tengamos el don de la ubicuidad como los santos, hay que elegir cuidadosamente a cual vas a ir. Yo, claro está, me decidí por las que tienen que ver con el desarrollo Web.


Así, a primera hora de la tarde asistí a la conferencia sobre novedades de ASP.NET 3.5 SP1, aunque ya con cosas bastante sabidas, la verdad es que estuvo muy bien. Dos personas del equipo de ASP.NET en Redmond nos contaron multitud de cosas sobre Daat Services, Dynamic Data, nuevas posibilidades de AJAX, URL Routing, etc.. y luego contestaron a unas cuantas preguntas. Mereció la pena, sobre todo porque en los próximos días van a profundizar por separado en cada cosa y así los que no estuvieran al tanto podían ir ya aleccionados de antemano. Quizá más interesante fue la sesión en el auditorio sobre las novedades que nos depara ASP.NET AJAX en su próxima versión, sobre todo en lo que respecta al manejo y acceso a datos con JavaScript en el lado de cliente. Espero que me sirva para, en los próximos meses, ir metiendo en este blog muchas pequeñas cosas sobre este tema.




Una de las muchas zonas con ordenadores para que la gente pueda ver el correo y navegar.


Al final, de 19:00 a 21:00 estuvimos en la zona de Ask The Experts, donde los asistentes podían acercarse a las diferentes zonas de expertos y así preguntar las dudas sobre cada tecnología a los que allí estaban. Aparte de mi compi Iván que estuvo como un jabato contestando cosas sobre IIS y Windows Server 2008, pudimos ver también a Bruno Capuano, Luis Fraile, Isabel Miragaya (de Microsoft) y unos cuantos españoles más dejando el pabellón bien alto. A Iván, «pobriño», le toca también mañana y pasado. A mi el jueves por la tarde. Si estáis por ahí pasaos y charlamos.


Mañana más 🙂

Barcelona: TechEd día 1 – Aterrizaje. Check-in. Cenita. A dormir.

Bueno, pues hace ya un rato que aterrizamos en BCN para comenzar mañana el TechEd. Mola esto de ser speaker: un cochazo esperándonos en el aeropuerto y descarga en la puerta del hotel. Así da gusto, jeje 😉


El hotel es estupendo, con un Spa integrado que esperamos poder usar para relajarnos algún día de esta semana:



Zonas de esparcimiento del hotel (planta sotano) con agua cayendo y todo ese rollo Zen 🙂


Nada más hacer el registro y dejar las cosas, a cenar antes que nos cerraran los sitios. Como estamos al lado del puerto deportivo, la elección era fácil. Nos pusimos tibios a base de paella:




Iván aguantándose las ganas de devorar el arroz mientras yo sacaba la foto


Tras la opípara cena vuelta al hotel y a roncar, que mañana (ya hoy) comienza el macro-evento. Aparte de seguir pendientes del trabajo (maldita sea) trataremos de asistir a muchas charlas y contaros cositas aquí. Hasta mañana.


Guadalajara: charlas técnicas y gymcana este fin de semana

Llevo unos cuantos días de Tour por España y como no tengo demasiado tiempo para postear contenido técnico he pensado que sería divertido ir contando aquí alguna de las cosas interesantes o divertidas que vaya viendo o haciendo.


Tras haber estado de trabajo en Madrid el jueves y viernes (dos días muy duros a salto de mata de una punta a otra de la ciudad), este fin de semana tocaba evento técnico y lúdico en Guadalajara. Nos juntamos una jauría de frikis para degustar charlas de la última tecnología y divertirnos un poco disfrutando de la buena compañía.


El sábado todo el día evento técnico: mucho Azure, Windows 7, nuevas versiones del lenguaje. También hubo tiempo para hablar de temas más atemporales como usabilidad, habilidades para presentaciones o discutir con algunos profesores universitarios qué lenguaje era más apropiado hoy en día para los primeros cursos de ingeniería informática. Muy guay 🙂


A la noche fiestuki en el hotel, con futbolines, billares, XBox 360 y barra libre:



Lo más divertido vino al día siguiente. Tuvimos la oportunidad de conocer la preciosa ciudad de Guadalajara. Yo nunca había estado allí y la verdad es que me sorprendió mucho positivamente. Una maravilla: 



Tuvimos la oportunidad de conocerla a fondo buscando sus monumentos y sitios especiales a través de un juego de situación muy divertido ambientado en la edad media. Os dejo algunas fotos de lo bien que lo pasamos:



El bueno de Carlos Segura y una amiga luchando contra el Minotauro para
resolver una de las pruebas de habilidad que nos pusieron.



La «troupe» de animadores, ambientados de época que nos divirtieron pero
también nos pusieron difícil resolver los enigmas. Una gente encantadora.


Ahora, tras aterrizar en Barcelona, Iván González y yo nos disponemos a comenzar el TechEd Developers, que dura toda la semana. Como sabéis este año somos ponentes los dos. Intentaré ir poniendo aquí todos los días de hoy al viernes las cosas interesantes que veamos por aquí, además de también añadir algunas fotos y cosas lúdicas que vayamos viendo.


¡Hasta dentro de un rato!