Feliz Navidad
Desde los headquarters (we wish) de Geek & Roll les deseamos una feliz navidad a todos nuestros comentaristas, lurkers, trolls y visitantes ocasionales. Va un abrazo.
Desde los headquarters (we wish) de Geek & Roll les deseamos una feliz navidad a todos nuestros comentaristas, lurkers, trolls y visitantes ocasionales. Va un abrazo.
Si te da hueva instalar tooooodo el wordpress nomás para evitarte las extensiones .php (o las de tu religión elegida), o de plano no lo necesitas, no te pierdas de ésta fíchur. Suponiendo que vivas en el maravilloso mundo de Apache, puedes arrojar este archivito .htaccess para que te haga el paro instantáneamismamente de quitar las extensiones .php de todos tus archivos, ok ok, en realidad los redirecciona pero es la misma, no?
Si lo que quieres es ahorrarte los horrores de ?var=value&this=siht&foo=barrio y esas cosas del diablo que no le gustan a Google y sus compas, también se puede; sólo tienes que editar unas líneas del archivo para alcanzar la felicidad instantánea. El archivo está así por default:
# RewriteRule ^folder/(.*)/$ /file.php?image=$1
# RewriteRule ^kind$ /category.php?cat=kind
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Las dos líneas que empiezan con el gato (#) son las que pueden habilitar esa onda, por ejemplo en el primer caso, puedes tener el url original:
http://sitio.com/fotos.php?src=verano.jpg&w=300&h=200&zc=1
y con unos cambios hacerlo así: http://sitio.com/fotos/verano especialmente útil si usas TimThumb o algo así.
El segundo caso considera el ejemplo una tienda en línea, o cualquier tipo de sitio que use una base de datos para clasificar varios elementos (o records) en categorías y haga una lista. Por ejemplo, puedes tener: http://mitiendita.com/articulos.php?tipo=jeans
y pasar a: http://mitiendita.com/jeans.
Hay más cosas que se pueden hacer con éste simple código, pero éstas son las más frecuentes. Si se te ocurre alguna otra posibilidad, déjala en los comentarios.
Instalación:
En efecto, esto fue un chiste de april’s fools. Somos norteñitos agringados pues.
Por fin tenemos activo el rediseño en el que hemos estado trabajando en los últimos meses. Aunque ya lo están viendo, se los platico:
Sabemos que el cambio de tonos oscuros a la paleta tan colorida puede resultar un poco shocking para los usuarios tradicionales de este blog, pero también sabemos que ellos nos leen principalmente en el Feed RSS y decidimos dar una imagen mas “alegre” para aquellos nuevos visitantes que caen por medio de google.
Otra cosa que queríamos hacer hace mucho es redondear todas las esquinas. ¡Ahora cada bloque tiene esquinas redondeadas!. También, como sabemos que el contenido es el rey, decidimos dejar de apoyarnos en ridiculeces como la manita del link haciendo los cuernitos rocanroleros y los bullets en forma de alien de space invaders. Nuestro contenido se mantiene por si mismo, asi que no necesitamos esas distracciones.
Y ya, en un tema ligeramente relacionado, estamos a unas semanas de cambiar wordpress por un administrador en .net que está desarrollando César en su tiempo libre. Por ahora estaremos actualizando el blog desde Windows Live Writer para irnos despegando un poco de wordpress.
Un saludo, y esperamos sus comentarios y críticas constructivas :)
El mejor (único?) auto-hangup para BlackBerry, Everlasting Flame, ha sido actualizado a su versión 1.1. ¿Qué mejoras incluye? Veamos la extensa lista:
Phew!!! me cansé de escribirlas.
La aplicación se encuentra ya disponible en el repositorio SVN del proyecto, mientras que los binarios aún están pendientes. Visita el sitio Web del proyecto para mantenerte informado sobre la fecha del lanzamiento de los binarios.
Como siempre, gracias a todos los que han colaborado con el proyecto. Visiten la sección de Contribuye para saber como puedes ayudar.
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:
public static void main(String[] args) {
System.out.println("On Endless main");
boolean startup = false;
for(int i=0; i < args.length; i++){
if(args[i].equals("init")){
startup = true;
}
}
if(startup){
System.out.println("Called from regular entry point, display the GUI.");
MainGUI gui = new MainGUI();
gui.enterEventDispatcher();
}else{
System.out.println("Called from alternate entry point, start the EverlastingFlame.");
EverlastingFlame ef = new EverlastingFlame();
ef.enterEventDispatcher();
}
}
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:
public class MainGUI extends UiApplication{
private MainScreen mainScreen;
public MainGUI(){
mainScreen = new EverlastingFlameScreen();
LabelField label = new LabelField("Everlasting Flame Configuration", LabelField.ELLIPSIS
| LabelField.USE_ALL_WIDTH);
mainScreen.setTitle(label);
pushScreen(mainScreen);
}
}
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:
public class EverlastingFlameScreen extends MainScreen{
private CheckboxField chkActive;
public EverlastingFlameScreen(){
super();
chkActive = new CheckboxField("Start monitoring service?",Options.getActive());
add(chkActive);
}
protected boolean onSavePrompt(){
if(isDirty()){
int option = Dialog.ask(Dialog.D_SAVE,
"Do you want to save changes?");
if(option == Dialog.SAVE){
onSave();
boolean chkState = chkActive.getChecked();
Options.setActive(chkState);
if(Options.getActive()){
Dialog.inform("Calls will be monitored, Mujajaja!");
}else{
Dialog.inform("Calls are no longer monitored.");
}
}else{
chkActive.setChecked(Options.getActive());
return false;
}
}
return true;
}
}
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:
if(Options.getActive()){
if(callTimeSeconds == softLimit){
System.out.println("Soft limit reached");
injectDTMFTone(Phone.getActiveCall());
}else if(callTimeSeconds == hardLimit){
System.out.println("Hard limit reached, hanging up!");
injectEndCall();
}
}else{
System.out.println("Service not active");
}
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).
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:
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.
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:
var BraCalculator = {
unknownString: "Unknown",
cupSizes: ["A", "B", "C", "D", "DD", "E", "EE", "F", "FF", "G", "GG", "H", "HH","J", "JJ", "K", "KK", "L", "LL", "M", "MM", "N", "NN"],
calculateSize: function(underBust, overBust) {
var bandSize = this.calculateBandSize(underBust);
var cupSize = this.calculateCupSize(bandSize, overBust);
if (bandSize && cupSize) {
return bandSize + cupSize;
} else {
return this.unknownString;
};
},
calculateBandSize: function(underBust) {
var underBust = parseInt(underBust, 10);
return underBust + (underBust % 2) + 2;
},
calculateCupSize: function(bandSize, overBust) {
var bandSize = parseInt(bandSize, 10);
var overBust = parseInt(overBust, 10);
var diff = overBust - bandSize;
var result = this.cupSizes;
//return false if we couldn't lookup a cup size
return result ? result : false;
}
};
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.
Vuelvo después de un fin de año ajetreadísimo, con viajes laborales (desgraciadamente no para geek & roll, sino para mi trabajo del MundoReal™), mucho que hacer, fiestas y afortunadas visitas familiares.
Esperamos que este año sea aún mejor que 2007 en el tópico geek, y miren que el año viejo dejó la barra alta: el iPhone y Android por citar un par de ejemplos. Se vienen los cambios también para Geek & Roll, sólo tenemos que cruzar los dedos para que las dos mitades de este blog se puedan reunir un día de estos y ponerse de acuerdo en lo que viene.
En fin, FELIZ 2008. Los dejo con Dilbert.

Imaginen la cantidad de transacciones que procesan los mainframes de la bolsa de valores de New York… incalculables no?. pues la gran noticia es que estos mainframes estan siendo reemplazados por servidores IBM con AIX y por máquinas HP con Linux. Aqui vemos un caso más de las apuestas inteligentes que hacen por mejorar; pues obviamente a todos nos gusta lo bueno, lo bonito y lo barato.
En el caso de los servidores p Series de IBM, el sistema operativo que utilizarán será AIX, un eminente descendiente de los Unix originales. Las otras máquinas son servidores HP basados en arquitecturas x86 con Linux gobernándolos, aunque no se especifica qué distribución en particular.
Esto nos aclara la importancia que se le esta dando a las implantaciones de Linux como soporte para los procesos, y sin duda alguna este mismo caso nos deja entrever la valiosa apuesta que se esta haciendo en la bola de valores de NY.