Previous Page Page 2 of 4 in the Misc category Next Page
Buff, han pasado muchos dispositivos móviles por estos bolsillos, desde mi primer teléfono móvil un Nokia 232 (que era una gozada) a un segundo con la entrada del GSM, el Nokia 2110, después un 8110 como el de Matrix y después un 6210 y un 6310 y un sin fin de etc..
 
Más tarde tuve una Palm m500 a la vez que el teléfono lo cual me permitía tener mi agenda sincronizada con el PC, después de la Palm vino una PDA con Windows CE y más tarde un PDA con Windows CE y teléfono, que parecía la solución definitiva, pero que no lo fue.
Se colgaba en exceso y coger el correo por gprs era carisisisismo, en aquel entonces, además el correo solo podía cogerlo de una cuenta POP3 y la sincronización con el Exchange solo se hacía conectando el cacharrito en su cuna.
Pero un buen día aparecieron las Blackberrys, feas, feísimas, pero hacían las dos cosas más importantes para mí y lo hacían bien. El teléfono y el correo. Con el BES tenía todo mi outlook movilizado, contactos, email, notas, calendario y tareas. Y una vez que te acostumbrabas a la ruedita y superabas el tema del tamaño y el diseño, eras el hombre más feliz del mundo.
Paso el tiempo, y Microsoft incorporo el correo push al Exchange, los dispositivos fueron mejorando y desde entonces he probado algunos pero finalmente me quedaba con la black.

Tengo una qtek 9100 que me regalo un amigo y que uso en casa. Mi qtek 9100 tiene cámara de fotos y ranura de expansión mini SD, en la cual llevo libros, mapas, música y un sin fin de aplicaciones (4gb). Algunas que me vuelven loco de felicidad, como el lector de feeds (Sbp Insight), la calculadora financiera (PowerOne finance), el diccionario de inglés Collins, el lector de CHM, (CHM eBook Reader), el Explorardor de archivos de Resco (Resco Explorer 2007) y un sin fin de maravillosas aplicaciones…
Pero, pero, en el día a día, no me encuentro tan cómodo, la notificación sonora de los mensajes no se puede independizar del resto, de manera que cuando esta se encuentra en un volumen alto, el cacharrito de marras pita cada vez que haces algo, el llamar por teléfono, requiere de las dos manos con lo cual de vez en cuando te encuentras haciendo malabares, llamar a veces es un infierno.
Y en cuanto al correo, no logro superar el hecho de que solo te informe de los mensajes que entran en la bandeja de entrada. Con la cantidad ingente de reglas que tengo para que todo quede perfectamente archivado, mi maravillosa black, te notifica siempre que te llegue un mensaje a cualquiera de las carpetas, sin embargo mi qtek (Outlook mobile) NO.
Esta semana la he actualizado con el Windows Mobile 6 con la esperanza de que hubieran resulto este problema, pero no…
Así como supongo que os pasa a más de uno, me entra la (CDT) Crisis del Diseño Tecnológico en su versión Soft, que podría ser algo como (MAP) Manía al Programador, que lo hizo y que tiene su antónimo, en un (GAG) Gracias al Gurú de turno, por encontrar un Workarround, ó en un (GAUM) Gracias a la utilidad de marras que me ha salvado la vida.
Pero sigo sin encontrar al GAG ni la GAUM, de modo que continuaré con mi black en el bolsillo…
No me he podido aguantar, el viernes pasado mientras explicaba cómo realizar una extranet con SharePoint, estábamos trabajando con todos los equipos de producción virtualizados con VMWare ESX.
Realmente me quede impresionado con el rendimiento, y las capacidades del ESX. Así que ayer sábado mientras ordenaba mi despacho, me baje el ESX y la licencia de demo de la página de VMWare.
Lo instalé en apenas 15 minutos en un HP Proliant ML350 g4p con un Xeon a 3Ghz, 2Gb de Ram, y 3x72Gb en RAID 5, es un servidor que utilizo para pruebas y en donde tenía ahora algunas máquinas virtuales con VMWare Server.

Las máquinas virtuales que tenía las convertí con el VMWare converter, una vez convertidas las pasa él solito al ESX. Pasé las 4 máquinas virtuales, de mi banco de pruebas, las cuales no suelo ejecutar a la vez porque el rendimiento es penoso.
- Isrv – Active directory + sql server 2005 - Imoss – Microsoft Office SharePoint Server 2007 - Icrm – Microsoft CRM - Imail – Microsoft Exchange
Y ya que estábamos, también pase algunas de mis máquinas que tengo en Microsoft Virtual Server, más que nada por ver el impacto que tenía una posible conversión.

La conversión le ha costado desde 45 minutos a una hora y media, dependiendo de la máquina y del tamaño de los discos.

Una vez realizada he metido las 4 primeras, les he asignado un pool garantizando 500mhz y 512mb de ram, y las he arrancado todas.
Después de trastear un buen rato, me he quedado impresionado con el rendimiento.
De modo que he añadido el resto de las máquinas que he pasado desde el Virtual Server y en este momento tengo 6 máquinas funcionando con un rendimiento un poco justo pero funcionando.

Evidentemente un segundo procesador ayudaría y desde luego más RAM. Entre las grandes ventajas de EXS es que el automáticamente redistribuye los recursos del host (RAM y CPU) entre las distintas máquinas virtuales.


Me queda por probar las copias de seguridad de las máquinas virtuales, que me gustaría hacer esta semana, porque visto el precio que tiene la licencia es probable que finalmente adquiera uno para el datacenter del trabajo.
De regreso de mi primer MVP Summit, que os puedo contar, la verdad es que lo pase estupendamente, y como siempre en estos saraos hice nuevos amigos y tuve la oportunidad de conocer a algunos con los que tengo estrecha relación desde hace tiempo y por eso de la distancia no nos conocíamos personalmente. Hemos tenido tiempo de todo, risas, fiestas frikis, turismo, salidas nocturnas y currelo.
|
Currando...
|
Karaoke
|
 Bill Keynote |
|
 Palermo's Party |
 Souvenir |
 Lawrence, Luis & Mike |
| |
|
|
De vuelta a la realidad...
Tagged by Mark Kruger
1- I used to read 4 or 5 books at time and they are all over my home; in the kitchen, in the bathroom, in the sitting room ... 2- Many years ago I’m able to read and understand Englishg books but I’m unable to speak English (at moment) 3- My favourite films are the old black & white movies like the Maltese Falcon (1941) and muy soundtrack is Once Upon a Time in America by Ennio Morricone 4- I like grunge music, specially Pearl Jam, Nirvana, Alice in Chains and Soundgarden 5- I love cooking and good meals (as good Navarro I am).
1- Puedo leer entre 4 y 5 libros al mismo tiempo, los voy dejando por toda la casa, en la cocina, en el baño, el cuarto de estar etc… 2- Leo inglés desde hace muchos años pero soy incapaz de hablarlo (por el momento) 3- Mis películas favoritas son las de blanco y negro, mi película favorita es el Halcón Maltes (1941) y mi banda sonora cinematográfica es la de “Erase una vez en América” de Ennio Morricone. 4- Me gusta el grunge, en especial Pearl Jam (esto supongo que es conocido), Nirvana, Alice in Chains y Soundgarden 5- Me encanta la cocina y la buena mesa (como buen Navarro)
Os a tocado: Gustavo Velez, Luis Du Solier, Iñaki Ayucar, Ander Muñoz y Elena Santacana
Well, today the first day of 2007,I Want to thank all the people who read this blog for this stats. Also today I received my MVP award renewal. Gracias a todos los que me leéis, seguiré dando la lata
También mis felicitaciones para Miguel Jimenez, Rodrigo Corral, Marco Amoedo, Haaron Gonzalez



Este será casi con seguridad mi último post del 2006, pero eso no lo puedo asegurar ya que cuando me pica la curiosidad, siento esa irresistible necesidad de saciarla. Y eso es lo que me ha ocurrido esta mañana. Como había comentado antes no había usado punteros en c# y este hecho me ha picado, de modo que he tratado ver como son manejados por el CLR.
Bien, todo era normal hasta que he visto este código IL en donde no entendía el misterioso conv.u, el código que estaba usando es el siguiente:
public static unsafe float TestPointer2() { float f = -128.625f; int* i = (int*) &f; float* fp = (float*)i; return *fp; }
Mi sesión de depuración: !clrstack -a
PDB symbol for mscorwks.dll not loaded
OS Thread Id: 0xb7c (2940)
ESP EIP
0012f3f4 00e600ed TestCastPointer.Test.TestPointer2()
LOCALS:
0x0012f400 = 0x00000000
<CLR reg> = 0x00000000
<CLR reg> = 0x00000000
0x0012f3f4 = 0x00000000
0012f444 00e6009a TestCastPointer.Program.Main(System.String[])
PARAMETERS:
args = 0x01321b5c
0012f69c 79e88f63 [GCFrame: 0012f69c]
!ip2md 00e600ed
MethodDesc: 00973078
Method Name: TestCastPointer.Test.TestPointer2()
Class: 009713d0
MethodTable: 00973090
mdToken: 06000003
Module: 00972c14
IsJitted: yes
m_CodeOrIL: 00e600c0
!dumpil 00973078
ilAddr = 0040208c
IL_0000: nop
IL_0001: ldc.r4 -128.625000 //Carga (push) el valor float (4bytes) en el stack
IL_0006: stloc.0 //Saca del stack y carga en la variable 0
IL_0007: ldloca.s VAR OR ARG 0 //Carga la dirección de la variable local existente
//en la dirección (0) en el stack de evaluación.
IL_0009: conv.u //Aquí este misterioso conv.u que se supone convierte
//el valor del stack en un unsigned int
IL_000a: stloc.1 //Saca el valor (pop) del stack y lo carga en var 1
Estado del stack
0x0012f3f4 = 0xc300a000 (-128,625f)
CLR reg = 0x0012f3f4 (var 1)
IL_000b: ldloc.1 //Carga la var 1 en el stack de evaluación
IL_000c: stloc.2 //Saca el valor (pop) del stack y lo carga en var 2
IL_000d: ldloc.2 //Carga la var 2 en el stack de evaluación
IL_000e: ldind.r4 //Carga en la pila un float indirectamente
IL_000f: stloc.3
IL_0010: br.s IL_0012
IL_0012: ldloc.3
IL_0013: ret
Obviamente, hay muchas cosas que todavía no entiendo del IL y menos el ensablador que es generado por el JIT, pero de eso hablaré el año que viene. LA cuestión es la siguiente, es ese conv.u. He puesto como se queda el estado de la pila del CLR tras ejecutar el IL_000a. La reflexión que me he hecho es la siguiente; si lo que hemos colocado en el stack es una dirección de memoria, en este caso la de la variable f, para que quiero convertirla a un int, ¿no es la dirección de memoria un int32?
Tras darle algunas vueltas he visto el código que genera el JIT, ¿donde esta el conv.u? 25: float f = -128.625f;
0000002e mov dword ptr [ebp-3Ch],0C300A000h //carga el valor en [ebp-3Ch] (f)
26: int* i = (int*) &f;
00000035 lea eax,[ebp-3Ch] //carga en el acumulador la dirección de f
00000038 mov edi,eax //mueve el acumulador al índice de destino (edi)
27:
28: float* fp = (float*)i;
0000003a mov esi,edi //mueve el índice de destino al índice fuente (esi)
29: return *fp;
0000003c fld dword ptr [esi] //carga el contenido del índice fuente como float
0000003e fstp dword ptr [ebp-48h] //almacena el contenido del puntero base - 48h
00000041 nop
00000042 jmp 00000044
30: }
00000044 fld dword ptr [ebp-48h] //prepara el stack para la devolución cargando el float
Entonces ha sido cuando leyendo el Ecma-335 (1.1.4.2 Managed Pointers) me he encontrado con esto:
Managed pointers that do not point to managed memory can be converted (using conv.u or conv.ovf.u) into unmanaged pointers, but this is not verifiable.
¿tendrá que ver con esto?, yo creo que me quedo aquí.
Cuando regresaba a casa en el coche he estado pensando sobre las dos soluciones que he propuesto para el problema que puso Ricardo, la cuestión es ¿engaña lo sexy?. Me explico, la primera versión que puse de la solución no era sexy, en el despacho, tengo una pizarra de esas velleda y pinte la estructura de un número de coma flotante, durante el día le eché unas miraditas pensando cómo hacerlo… en un momento del día se me ocurrió la primera solución, la cual tras implementarla no tenía nada de sexy:
public float Solucion1(float f) { Byte[] bits; bits = BitConverter.GetBytes(f); BitArray ba = new BitArray(bits); BitArray ba2 = new BitArray(32); // sign ba2[31] = !ba[31]; // exp for (int i = 0; i < 8; i++) { ba2[30 - i] = ba[23 + i]; } // mantissa for (int i = 0; i < 23; i++) { ba2[22 - i] = ba[i]; } ba2.CopyTo(bits, 0); float ff = BitConverter.ToSingle(bits, 0); return ff; }
No sé, será una apreciación mía, ó una deformación de tantos años pero hay veces que un conjunto de líneas de código me parecen sexys y esta primera solución desde luego que no lo era, de modo que al postearla puse un orgulloso LUEGO LA OPTIMIZO …
Durante la mañana de hoy, he retomado el problema y he dado con otra solución, esta desde luego a mi parecer era mucho, mucho más sexy (mi musa opina lo mismo que yo). Me gustaría conocer vuestras opiniones al respecto. La solución usa punteros, para evitar casts, desmonta un número float usando operaciones AND, OR y desplazamiento de bits, después los reversa y por último monta de nuevo el float al más puro estilo de C.
Bien, de regreso, como he comentado al principio, he pensado (hay que ver lo que es capaz de pensar uno) en eso la belleza y la sensualidad del código (jeje, como suena esto) y venia recreándome en lo bonita que había quedado. En ningún caso he pensado que la primera solución fuera mala, solo que no me parecía sexy, lo cual me ha llevado a pensar en las distintas formas que hay de dar solución a los problemas y demás… (Esto para otra discusión)
En el preciso momento de aparcar el coche, UNA DUDA me ha asaltado, ¿Y si el código SEXY no es tan eficiente como el otro? ¡¡¡¡HORRRORR!!!!!, no puede ser…
Mierda, he cenado y he tenido que comprobarlo (que le vamos a hacer) y ¿cuál ha sido el resultado? ¿ENGAÑA LO SEXY?.
He ejecutado los dos fragmentos de código para 10000 números aleatorios y el código sexy es unos 15ms más lento que el otro.
Hummm… pero para 100000 las cosas cambian… el código sexy es unas 5 veces más rápido
Ale el debate está abierto, ya veís para un día que tiene de fiesta uno y lo dedica a pensar en estas cosas ...
Seguro que este será uno de los blogs (Programancia101) que más asiduamente leeré, lo primero por que estoy seguro de que va ha ser divertido y además es de un tipo al que considero un crack (Ricardo Varela).. en fin no ha hecho más que empezar... dije que: si tenia tiempo trataría de hacer una versión optimizada, aun así creo que se puede hacer mejor. Entre otras cosas, me a servido para usar los punteros en .Net cosa que no tocaba desde mis tiempos C/C++
Bueno, aprovecho para felicitaros la navidad y la llegada del próximo año.
public unsafe float ReverseFloat(float f) { int* ip = (int *)&f; int ff = 0; // Descomponemos el float // signo - bit 31 int s = ((*ip >> 31) == 0) ? 0 : 1; // exp - int e = ((*ip >> 23) & 0xFF); // mantissa int m = (*ip & 0x007fffff); // reversamos //s = ~s; e = ReverseBits(e, 8); m = ReverseBits(m, 23); // montamos de nuevo el float ff |= s << 31; ff |= e << 23; ff |= m; // evitamos casts float* fp = (float*)&ff; return *fp; }
public int ReverseBits(int i, int bits) { int reverse = 0; while (bits-- > 0) { reverse <<= 1; reverse = reverse + (i & 1); i >>= 1; } return reverse; }
El viernes 15 tuve la oportunidad de asistir a mi segundo Open Day y reencontrarme con toda esa gente tan especial, para los que solo tengo palabras de agradecimiento. También echamos de menos a algunos buenos amigos que no pudieron asistir, y a los que desde aquí les mando un saludo.
Por la tarde, me uní a las sesiones de desarrollo las cuales fueron sensacionales, David Salgado e Ignacio Alonso, nos dieron una charla sobre Depuración en entornos de producción .Net realmente fantástica, (David, a ver si organizamos lo de las camisetas [Be a pointer my friend]), después tuve la oportunidad de ver la sesión sobre Infopath y Forms Server que dio Cesar de la Torre, y por último antes de que nuestros tecnico-less hicieran acto de presencia, Unai Zorrilla (O bruxo mobile) dio una magnifica charla sobre el servicio de persistencia de Windows Workflow Foundation.
(la foto gracias a Luis Franco)

Previous Page Page 2 of 4 in the Misc category Next Page
|
Copyright © 2008 Carlos Segura. All rights reserved.
|
|