Geek & Roll » Cesar

Programando para la BlackBerry - Everlasting Flame II

Cesar December 30th, 2008 5 comentarios

Ver primera y segunda parte.

Everlasting Flame icon

Continuamos con el desarrollo de esta aplicación. Ya en la parte dos vimos cómo programar la funcionalidad básica: monitorear el tiempo de las llamadas y reaccionar de acuerdo a los límites establecidos (denominados soft y hard limit). Ahora sigue el turno de guardar a la memoria algunas de las opciones establecidas por el usuario y crear una interfaz gráfica para la configuración.

Como vimos, Everlasting Flame es una aplicación con la que el usuario no interactúa directamente y es por esto que no contiene una interfaz gráfica. La aplicación se ejecuta automáticamente cuando el teléfono inicia, de tal modo que al marcar un número comienza a contar el tiempo. Sin embargo es conveniente tener una interfaz de configuración donde podamos establecer los límites, así como también habilitar y deshabilitar el monitoreo de llamadas (por si queremos hacer una llamada más larga de lo normal sin que se corte).

Para este propósito se crea lo que se llama un punto de entrada alternativo, que como su nombre lo indica, servirá como punto de entrada a la aplicación ejecutando una serie de pasos distintos a los “normales”. En nuestro caso el punto de entrada normal es el que no tiene interfaz gráfica y el alternativo es iniciar la interfaz gráfica para configurar la aplicación. Lo primero es configurar el proyecto como aplicación del sistema (es decir, que no muestra interfaz gráfica) y que sea auto ejecutable. Esto se hace desde Eclipse modificando las propiedades del proyecto. Después creamos un proyecto nuevo vacío y en las propiedades lo configuramos como punto de entrada alternativo al proyecto original, pasando como parámetro alguna cadena de identificación (en mi caso, “init”).

De esta manera, cuando el usuario seleccione el icono de nuestra aplicación desde la BlackBerry, nuestra aplicación recibirá como argumento la cadena “init” y eso nos servirá como señal para iniciar la interfaz gráfica. Si la aplicación es iniciada automáticamente, no recibiremos la cadena “init” e iniciaremos la aplicación como antes. Modificamos EverlastingFlame.java de esta manera:

  1. public static void main(String[] args) {
  2.                 System.out.println(“On Endless main”);
  3.                 boolean startup = false;
  4.                
  5.                 for(int i=0; i < args.length; i++){
  6.                         if(args[i].equals(“init”)){
  7.                                 startup = true;
  8.                         }
  9.                 }
  10.                
  11.                 if(startup){
  12.                         System.out.println(“Called from regular entry point, display the GUI.”);
  13.                         MainGUI gui = new MainGUI();
  14.                         gui.enterEventDispatcher();
  15.                 }else{
  16.                         System.out.println(“Called from alternate entry point, start the EverlastingFlame.”);
  17.                         EverlastingFlame ef = new EverlastingFlame();
  18.                         ef.enterEventDispatcher();
  19.                 }
  20.         }

Como vemos en el código, si recibimos la cadena “init” creamos una nueva instancia de MainGUI y ejecutamos su event dispatcher para que el sistema despliegue la pantalla. El código de MainGUI.java se muestra a continuación:

  1. public class MainGUI extends UiApplication{
  2.         private MainScreen mainScreen;
  3.        
  4.         public MainGUI(){
  5.                 mainScreen = new EverlastingFlameScreen();
  6.                 LabelField label = new LabelField(“Everlasting Flame Configuration”, LabelField.ELLIPSIS
  7.                                 | LabelField.USE_ALL_WIDTH);
  8.                 mainScreen.setTitle(label);
  9.                 pushScreen(mainScreen);
  10.         }
  11. }

Esta clase extiende a UiApplication porque precisamente es una aplicación con interfaz gráfica. Contiene una MainScreen con el título de “Everlasting Flame Configuration”. Por último empujamos la pantalla para que sea mostrada en el teléfono. La MainScreen es realmente una instancia de EverlastingFlameScreen, una clase que hereda de MainScreen e implementa la interfaz gráfica y los eventos que nos interesan:

  1. public class EverlastingFlameScreen extends MainScreen{
  2.         private CheckboxField chkActive;
  3.        
  4.         public EverlastingFlameScreen(){
  5.                 super();
  6.                
  7.                 chkActive = new CheckboxField(“Start monitoring service?”,Options.getActive());
  8.                 add(chkActive);
  9.         }
  10.        
  11.         protected boolean onSavePrompt(){
  12.                 if(isDirty()){
  13.                         int option = Dialog.ask(Dialog.D_SAVE,
  14.                                         “Do you want to save changes?”);
  15.                         if(option == Dialog.SAVE){
  16.                                 onSave();
  17.                                 boolean chkState = chkActive.getChecked();
  18.                                 Options.setActive(chkState);
  19.                                 if(Options.getActive()){
  20.                                         Dialog.inform(“Calls will be monitored, Mujajaja!”);
  21.                                 }else{
  22.                                         Dialog.inform(“Calls are no longer monitored.”);
  23.                                 }
  24.                         }else{
  25.                                 chkActive.setChecked(Options.getActive());
  26.                                 return false;
  27.                         }
  28.                 }
  29.                 return true;
  30.         }
  31. }

Para efectos de este ejemplo, la pantalla se compone solamente de un checkbox que sirve para habilitar o deshabilitar el servicio de monitoreo. Si este checkbox se encuentra activo, Everlasting Flame monitorea las llamadas, inyectando el tono DTMF y colgando cuando es necesario. De más está decir que si se encuentra desactivado, las llamadas transcurren normales. En el constructor se crea el checkbox en cuestión y se le pasa una cadena que será su etiqueta, así como también el estado inicial del checkbox (seleccionado o no seleccionado).

El estado inicial se obtiene de las opciones del usuario, gracias a una clase Options que nos sirve para guardar las preferencias del usuario en memoria no volátil (más de esto en la siguiente entrega de esta serie de posts). La magia ocurre en el método onSavePrompt. Este método se ejecuta cuando el sistema cree que hubo algún cambio que debe ser guardado. Nosotros sobreescribimos el método y agregamos una pequeña validación.

Cuando el sistema ejecuta onSavePrompt, verificamos el estado de la pantalla. isDirty nos indica que hubo cambios y por lo tanto hay que preguntar al usuario (por medio del método estático ask de la clase Dialog) si desea guardar. En caso de si desear guardar, verificamos si el usuario activó o desactivó el servicio y por último informamos al usuario que sus cambios han sido aplicados.

Queda solamente modificar el PhoneListener para tomar en cuenta el estado del servicio (activado o desactivado). Esto es muy sencillo utilizando la clase Options que se verá más adelante:

  1. if(Options.getActive()){
  2.                     if(callTimeSeconds == softLimit){
  3.                         System.out.println(“Soft limit reached”);
  4.                         injectDTMFTone(Phone.getActiveCall());
  5.                     }else if(callTimeSeconds == hardLimit){
  6.                         System.out.println(“Hard limit reached, hanging up!”);
  7.                         injectEndCall();
  8.                     }   
  9.                 }else{
  10.                         System.out.println(“Service not active”);
  11.                 }

Si el servicio se encuentra activo, realiza las mismas validaciones anteriores. En caso de encontrarse inactivo, simplemente no hace nada.

Lo que queda es explicar la clase Options y por supuesto agregar mayor funcionalidad a la interfaz gráfica, como por ejemplo la configuración de los límites, la acción a realizar en cada uno de ellos y cambiar el funcionamiento entre modo “naco” (funcione para todos los números) y modo “VIP” (sólo para números seleccionados).

10 placeres culposos geek

Cesar December 29th, 2008 3 comentarios

Tratando de robar un poco del spotlight en el que se encuentran mis amigos de 10puntos.info, les comparto una lista de 10 placeres culposos geek compilada por mi en orden de relevancia ascendente y numeración inversa:

  1. Aprender diálogos de tu película favorita, y repetirlos a cada rato. No vasta con contarle al mundo el numero de 6 cifras que suman las veces que haz visto The Lord of the Rings (la trilogia completa y de una sentada, porque según tu, no existe otra manera de verlas), o tratar de impartir lecciones de vida con lo “aprendido” en The Fight Club. Por si fuera poco, te aprendes los diálogos y los repites en todas y cada una de las ocasiones que crees relevante además de, claro está, cuando estas viendo la película y es el turno de la escena en cuestión.
  2. Japón. Ya sea por querer aprender Japones, pregonar a los cuatro vientos tu fascinación con la mujer Japonesa (o con la imagen que tu crees que es representativa de la mujer Japonesa) o simplemente tu amor por las artes marciales de dicho país, parece ser como si todo lo proveniente del Japón ocasionara un click en tu mente que hace que te agrade y lo quieras.
  3. Escribir un blog. Porque seguramente a todo el mundo le interesa lo que tu haces. El momentum decrece cuando te das cuenta de los otros millones de individuos que también tienen tus grandes ideas, solo que antes que tu, además de ser más jóvenes, han logrado más cosas que tu a su edad y a la tuya además de que ellos sí aprendieron Japones.
  4. Diseñar camisetas graciosas (Tees). Todo geek tiene excelentes ideas para camisetas y pondría su propia tienda de camisetas por Internet, si tan sólo tuviera el tiempo (es que las más de 70 horas y contando de Final Fantasy XII no lo dejan).
  5. Leer feeds. Todo empezó con la necesidad organizar y tener a la mano las grandes cantidades de información regada por muchos sitios que visitamos frecuentemente. Se introdujeron los feeds RSS y todo fue perfecto… hasta que la desorganización empezó dentro de nuestros propios feeds. Sabes que eres adicto a esto cuando pasas de 1000+ en el Reader a 17 en menos de 30 minutos, y la mayoría de las veces tan solo lees unos cuantos, luego solo los títulos, y luego simplemente presionas Mark all as read.
  6. Defender la piratería. Lo llamas de mil maneras, menos piratería (porque piratería es atacar barcos mercantes, y eso es muy malo). Defiendes el hecho de que te bajas la discografía completa de Topo Gigio porque los cerdos avariciosos de la iTunes Store la ofrecen con ese asqueroso DRM. Al final, lo único que quieres es no pagar por la música y terminas comprando reproductores que alimentan a la máquina del DRM (como iPods, iPhones, Zunes).
  7. Comprar nuevos gadgets. Necesito un iPod con mas capacidad. Necesito una tabla Wacom. Necesito un celular nuevo. Necesito, Necesito, Necesito. No necesitas nada de eso, más bien lo deseas con todas tus entrañas sobrealimentadas de pizza y coca cola.
  8. Internet en la casa. Después de todo el día laboral en la computadora y conectado a Internet, llegas a tu casa… a estar en la computadora y usar Internet por supuesto.
  9. Twitter. Por algo se le hace tan estúpido a la mayoría de la gente, ¿O es que la mayoría son estúpidos?
  10. Apple. Todos los productos de Apple son un enorme placer culposo, y punto.

Regalos Geek de Navidad edición 2008

Cesar December 28th, 2008 9 comentarios

Pasó Navidad y es hora de preguntar: ¿Qué regalos geek recibieron o se autoregalaron esta Navidad? Yo empiezo:

  1. El Blu-Ray edición especial de “The Dark Knight”

Como ven, mi presupuesto para regalos se lo llevó completamente otro regalo al que no considero Geek así que no hay mucho que presumir. Seguramente ustedes si, así que a presumir en los comentarios.

Retrospectiva, mi 2008 in a nutshell

Cesar December 22nd, 2008 3 comentarios

Cuando iniciamos este blog no teníamos muy clara la idea de lo que sería, en que se convertiría o de que se trataría. Todo inició con un: “Hey, nuestros blogs se parecen. ¿Porque no escribimos en uno solo?”. Mi respuesta a Axel (el de la idea y el de la fotito de abajo con la greña alborotada) fue “¡Buena idea!” aunque mentalmente fue “Hmm… no, así estoy bien”. La buena noticia es que me equivoqué, juntos los dos - y ahora tres - logramos hacer algo que por separado no lograría capturar el feeling geek de los tres. Por si no se han dado cuenta, cada uno de los tres inyecta un lado de la geekes general de Geek&Roll. La mala noticia es que perdí mi blog personal.

Las razones para cerrar mi blog personal fueron varias y no todas tuvieron que ver directamente con el compromiso de Geek&Roll. Aun así, la mayoría de los temas tratados en mi blog personal comenzaron a aparecer en forma de posts de un servidor aquí, pero obviamente los temas más personales se fueron directo a /dev/null (algo como la papelera de reciclaje pero sin la opción de recuperar lo ahí depositado). Desde entonces los temas personales que decido hacer públicos en la red se desbaratan entre Tweets, posts, Facebook, Picasa, conversaciones de IM y no se que tantas cosas más.

La larga introducción es para justificar el siguiente post 100% personal. Para mi, el 2008 fue un año de evolución más que de cambio. Evolución que me trajo experiencias que difícilmente voy a dejar de recordar en los años venideros. En el 2008 viví algunos de los momentos más memorables de mi vida hasta la fecha, algunos públicos como la despedida completamente impromptu de todos mis amigos y compañeros de maestría, otros privados de los que por obvias razones no daré ejemplo. Días con tintes de despedida de grandes amigos, amigas y otros personajes, así como también emocionantes bienvenidas de personajes mucho tiempo atrás olvidados.

El 2009 se perfila como la culminación a manera de cambio del largo hilo evolutivo del 2008. Quiero terminar con un simple gracias a todas las personas con las que tuve el privilegio de compartir este 2008. Gracias a mis amigos de Geek&Roll, el staff, los visitantes elite que siempre vuelven sin importar de las desviaciones en la calidad y la frecuencia de posteo que solemos tener, a todos los lectores que hacen comentarios o los anónimos. Gracias a Rafyta por siempre echarme la mano con la cosa de las imágenes y esas cosas de diseño de las que no entiendo nada y por ende son Del Diablo™. Gracias a las personas que me han permitido invertir en lo único que me va a quedar si llego a viejo: los recuerdos de una vida plena.

Gracias, y que venga el 2009.

PS3 Home rifa y controla

Cesar December 11th, 2008 7 comentarios

Home Acabo de probar la beta pública de Home, el mundo virtual a la second life de Sony para la PS3. En este post voy a plasmar mis impresiones, aunque pueden encontrar reseñas mucho mas completas en otros blogs, aquí les contaré mi experiencia personal con el servicio.

Primero la descarga. 77 megas. Se descargó e instaló sin problemas. Al tratar de hacer login me pidió que aceptara un acuerdo de usuario y después de aceptarlo sin ver lo que decía no me pude conectar. Volví a intentar y nada. Me salí, mandé un tweet con mi frustración, consulté los foros, volví a intentar y ahora si se pudo. ¡Eureka!

Lo primero que te pide es crear un usuario. Aunque muchos se irán por tratar de recrearse a sí mismos virtualmente (cosa que es bastante posible por la flexibilidad de la herramienta) yo elegí por hacer un usuario a como me dio la gana. No dudo que habrá gente que aproveche y se cree un alter-ego, después de todo es una de las gracias de un mundo virtual como estos. Una vez con tu avatar, Home te lleva directamente a tu departamento donde te da un mini tutorial de como interactuar con el mundo virtual.

En este punto yo estaba pensando ¿Y? ¿Es todo? El mundo virtual de Home se divide en varias secciones acomodadas por stacks. En la beta pública están el stack de Home, de Uncharted y de Killzone 2 si mal no recuerdo. Cada stack cuenta con varios escenarios, el stack de Home tiene tu departamento, la plaza central, la sala de juegos, el cine, entre otras cosas. Otra vez ¿Y? ¿Es todo?

Al poner pie en la plaza sale el montón de personas caminando por todos lados. Inmediatamente se me acercó un personaje a preguntarme que si de donde era, que si quería ser su amigo, esa clase de interacción nunca me ha llamado la atención. No veo el beneficio de “conocer” a alguien virtual sin un interés común. Es distinto conocer a alguien enmedio de un tiroteo en Resistance o retándolo a un duelo de guitarras en Guitar Hero 3, ¿pero parado al lado de un lago de alta definición, o viendo un trailer de Twilight? no es para mi, no gracias.

Apunto de desconectarme del servicio veo que JPDA, uno de mis amigos en la PlayStation Network (PSN) y a quien también conozco en el MundoReal se conecta. Le envío un mensaje para ver en que parte del mundo virtual anda y coincidimos en la plaza. Es una sensación extraña estar platicando con una representación virtual de alguien que tu conoces y estas acostumbrado a platicar en el MundoReal. Después de unos cuantos tortuosos mensajes de texto introducidos con el control, nos pusimos de acuerdo para jugar boliche virtual. Antes de entrar a la sala de boliche llegó otro personaje hablando español como nosotros, nos preguntó de donde somos y supuestamente nos seguiría a jugar boliche pero no volvimos a saber de él.

Después de la ronda de boliche virtual en la que descubrí que no sirvo para eso, decidimos dar la vuelta por la sala de juegos para tratar de ganar una mesa de billar. No me explico como le hará Home para manejar eso, porque como están las cosas ahora en el Beta la sala de juegos estaba demasiado poblada y las pocas mesas de billar estaban todas ocupadas. No me quiero imaginar cuando Home sea utilizado por más y más personas.

En Home también te puedes comunicar por voz, simplemente acercándote a alguien y hablando. Hablar con la representación virtual de alguien a quien conoces en MundoReal es, como ponerlo, freaking cool. Desde Home te puedes poner de acuerdo para echarte una retita de algún juego que los dos tengan, invitar a gente a tu departamento virtual, ver películas en un cine virtual y otras actividades que ya están disponibles o lo estarán proximamente.

Presiento todo un éxito para este Home tan esperado. Y vaya que lo necesita la consola de Sony.

Programando para la Blackberry - Everlasting Flame

Cesar December 6th, 2008 4 comentarios

Ver primera parte: Intro

Everlasting Flame icon

En la introducción se vió un poco sobre lo que es programar una aplicación para la BlackBerry haciendo un pequeño “Hola Mundo” muy sencillo. Ahora toca explicar las bases de la aplicación que se menciona en aquel post llamada “Everlasting Flame”. El nombre es el título de una canción del grupo de Thrash Aleman Kreator. Tengo la mala costumbre de nombrar a todos mis proyectos con titulos de canciones metaleras.

Primero un poco de teoría. Las aplicaciones de BlackBerry pueden ser de dos tipos: sin GUI o con GUI. Típicamente el punto de entrada de las que tienen GUI es cuando el usuario selecciona el ícono correspondiente en la pantalla. Las que no tienen GUI generalmente cuentan con otro punto de entrada, como al momento de hacer una llamada telefónica, enviar un SMS, solicitar datos, etc. En nuestro caso nuestra aplicación es sin GUI y su punto de entrada es al momento de realizar una llamada telefónica.

En el API de RIM hay dos clases que nos interesan actualmente: Applicationy UiApplication para aplicaciones sin UI o con UI, respectivamente. También nos interesa el PhoneListener que nos sirve para registrar una clase que consume los eventos generados por la aplicación de teléfono en la BlackBerry. También nos interesa la clase Phone que nos permite interactuar con la aplicación que se encarga de marcar el teléfono en la BlackBerry.

Como se mencionó en el post de introducción, el funcionamiento es el siguiente: marco un número e inicia un contador. Si llego a un determinado número de segundos (soft limit) el teléfono me avisa inyectando un tono DTMF a la llamada. Si llego a otro límite mayor (hard limit) la llamada se termina automáticamente. Para esto vamos a usar las clases antes mencionadas.

Nuestro programa consta básicamente de 2 clases: la clase principal que extiende a Application, y una clase que implementa la interfaz PhoneListener, o más específicamente extiende a AbstractPhoneListener, misma que implementa a PhoneListener y nos evita el tener que implementar todos los métodos abstractos de PhoneListener, enfocándonos solo a aquellos que necesitamos.
Leer el resto de este post.

Los clientes FTP son feos

Cesar December 3rd, 2008 18 comentarios

Todos los clientes FTP que he probado son feos (con F de Foco Fundido). Si también el overhyped transmit es feo. Uno más o menos aceptable es SmartFTP. El más bonito en mi lista es Cyberduck, pero es OSX only al igual que mi editor de texto favorito: TextMate. Maldita manzana y sus aplicaciones.

De vuelta al tema. Los clientes FTP son feos. Funcionales (algunos más que otros) pero feos. Hasta CuteFTP que por el nombre esperarías algo menos feo, también era feo. ¿Qué se necesita para que un cliente FTP sea bonito? Según un servidor una interfaz minimalista, intuitivo y con estilo. Algo parecido a Chrome. Con lo básico para un cliente FTP y nada más.

Mi pregunta es ¿Qué funcionalidad es la mínima absolutamente necesaria en un cliente FTP? digo, aparte de lo obvio: transferir archivos a un servidor FTP.

Programando para la BlackBerry - Intro

Cesar December 1st, 2008 9 comentarios

Con este post inicio una serie de escritos sobre programación para la BlackBerry. Hace poco me compré un aparato de estos (una BlackBerry Pearl 8110 para ser exactos) sin saber mucho de sus capacidades, modelos existentes o herramientas de programación. Realmente el motivo por el cual adquirí una BlackBerry fue la curiosidad por probar este dispositivo y ver si sus capacidades push son tan buenas y “adictivas” como dicen.

Después de unos días de uso estaba claro que necesitaba programar la funcionalidad que me hacía falta en el dispositivo. Algo crítico para mi es que el móvil me avise del tiempo que llevo en la llamada, ya que mi plan incluye llamadas nacionales sin cargo adicional siempre y cuando se encuentren por debajo de los 5 minutos (plan sin fin de Telcel). Para evitar cargos extra todas mis llamadas a los 10 números que tengo registrados deben durar menos de 5 minutos y es ahí donde entra la parte smart del smartphone.

Idealmente lo que la aplicación debe hacer es lo siguiente: si estas llamando a uno de tus 10 números registrados, comienza a contarte el tiempo. Si la llamada cruza el softlimit suena una alarma. Si cruza el hardlimit, cuelga la llamada automáticamente. Claro que todo esto configurable, tanto los dos límites como las acciones que se ejecutan cuando se supera cualquiera de los dos límites. Bastante sencillo y uno pensaría que es funcionalidad que cualquier smartphone trae por defecto. Pero no.

Para mi sorpresa la BlackBerry se programa con Java, más específicamente es Java ME con una API específica para estos dispositivos. Puedes programar una aplicación para BlackBerry utilizando exclusivamente Java ME, pero si quieres hacer algo verdaderamente interesante (push de datos, usar el bluetooth, WiFi, guardar datos, utilizar el GPS o la red celular) necesitas usar esta API propietaria. Básicamente lo que se necesita es (cabe mencionar que por el momento esto es Windows only desafortunadamente):

  • El Java Development Kit (JDK)
  • El JDE de Research in Motion (RIM para los amigos) que incluye la API propietaria, un simulador, un IDE, entre otras cosas
  • Llaves para firmar tu código en caso de ser necesario (más sobre este punto después)

Leer el resto de este post.

Calculadora de tamaño del bra en JavaScript

Cesar November 28th, 2008 1 comentario

Y el post light por fin de semana…

Olvídense del Hello World! o los clientes de Twitter, la calculadora de tamaño de bra es la nueva tendencia en programación. Como su autor lo indica, calcular el tamaño del bra es una tarea arcana, casi mágica, y dominarla no es fácil para los hombres. Para salvarte del dolor y tormento de tener que estimar el tamaño de algún bra, se hizo esta herramienta:

  1. var BraCalculator = {
  2.     unknownString: “Unknown”,
  3.  
  4.     cupSizes: [“A”, “B”, “C”, “D”, “DD”, “E”, “EE”, “F”, “FF”, “G”, “GG”, “H”, “HH”,“J”, “JJ”, “K”, “KK”, “L”, “LL”, “M”, “MM”, “N”, “NN”],
  5.  
  6.     calculateSize: function(underBust, overBust) {
  7.         var bandSize = this.calculateBandSize(underBust);
  8.         var cupSize  = this.calculateCupSize(bandSize, overBust);
  9.    
  10.         if (bandSize && cupSize) {
  11.             return bandSize + cupSize;
  12.         } else {
  13.             return this.unknownString;
  14.         };
  15.     },
  16.  
  17.     calculateBandSize: function(underBust) {
  18.         var underBust = parseInt(underBust, 10);
  19.         return underBust + (underBust % 2) + 2;
  20.     },
  21.  
  22.     calculateCupSize: function(bandSize, overBust) {
  23.         var bandSize = parseInt(bandSize, 10);
  24.         var overBust = parseInt(overBust, 10);
  25.         var diff     = overBust - bandSize;
  26.        
  27.         var result   = this.cupSizes[diff];
  28.        
  29.         //return false if we couldn’t lookup a cup size
  30.         return result ? result : false;
  31.     }
  32. };

Lo que hace es calcular el tamaño de copa y de banda de acuerdo al tamaño del busto (en pulgadas) pero no es difícil cambiarlo al sistema métrico decimal, estoy seguro que algún hacker estaría dispuesto a hacerlo y depurarlo ;) Dada ciertas medidas de entrada, el formato de la salida es, por ejemplo “32B”.

Liga a la aplicación: JavaScript bra size calculator.

Windows Vista, su propósito: molestarte

Cesar November 27th, 2008 1 comentario

Después de unos cuantas semanas he tenido la “oportunidad” de usar Windows Vista por más tiempo del que me gustaría aceptar. He visto sus puntos fuertes y sus fallas. Lo encuentro un sistema operativo medianamente estable (no más que XP o 2000) que en 3 semanas ya me mostró una pantalla azul y se ha recuperado de un error al iniciar dos veces. No se si la culpa sea algún driver, configuración o software que haga conflicto. La verdad me importa poco. La realidad es que con una laptop específicamente creada para soportar Windows Vista (así lo dice el sticker que trae en el descansabrazos) y con Vista Business instalado de fábrica no funciona del todo bien.

Pero eso no es lo que me molesta. Las constantes solicitudes de confirmación de ciertas acciones son realmente molestas, pero aprendes a vivir con eso. La gota que derramó el vaso fue ayer que instaló actualizaciones (hasta ahí todo bien, supongo) al iniciar la computadora. Después, me solicitó reiniciarla tan solo minutos después de haberla prendido. Y yo dije un rotundo NO, y busqué en el cuadro de diálogo la opción que le transmitiera a Vista mi sentir sobre su petición absurda y mal programada (en tiempo, timing, no código). Pero las opciones que me muestra son el equivalente a:

  1. ¡Claro que si! Lo que tu digas
  2. Ahorititititita reinicio
  3. Dame unos minutitos
  4. ‘perame ¿ok? Estoy ocupado

Aunque la opción 4 suena bastante acercada, no es exactamente lo que yo quiero. Lo que yo quiero es un NO rotundo, no un esperame, no un ahorita, un NO. Y no hay forma de decírselo. Al parecer Vista se empeña en molestarme de varias maneras.

Posts anteriores

Busca

Categorías

Meses