Desktop Limpio

Una de las cosas a las que me acostumbrado es tener un desktop limpio, esto, a raíz, que cada vez que veo algo en el desktop siento la necesidad de hacer algo: realizar una acción, almacenarlo etc. En la Leopard, Hazel se encarga de poner en los folders apropiados lo que haya en el desktop de forma automática. Sin embargo mucha veces prefiero realizar estas acciones de forma manual. De esta práctica se deslindo mi fascinación por un desktop limpio, fue entonces cuando empece a quitar iconos y accesos directos.

En Leopard esto es sencillo; pero en el caso de Windows paso lo contrario. Empece a quitar Mi Pc, Mis Documentos y todos esos accesos directos que se ponen por default. Sin embargo me encontre con un problema: todos los accesos podían quitarse excepto la Papelera de reciclaje. Después de un poco de investigación encontre dos métodos para quitar la Papelera.

El primer método consiste en entrar al menú de Administración de la computadora (dando click derecho en el icono de "Mi Pc" por ejemplo). Una vez ahí, solamente se navega hasta Configuración de Usuario -> Plantillas administrativas -> Escritorio -> Quitar del escritorio el icono de Papelera de reciclaje. Esta opción se habilita y eso es todo.

El otro método consta de un script. Para que funcione hay que guardar el siguiente script en un archivo con extension .reg y ejecutarlo dandole doble click. El script crea una opción dentro del menu Opciones de Carpeta que permite poner y quitar la Papelera.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\RecycleBinOnDesktop]
"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\NewStartPanel"
"Text"="Mostrar la Papelera de reciclaje"
"Type"="checkbox"
"ValueName"="{645FF040-5081-101B-9F08-00AA002F954E}"
"CheckedValue"=dword:00000000
"UncheckedValue"=dword:00000001
"DefaultValue"=dword:00000000
"HKeyRoot"=dword:80000001




El resultado de ambos métodos: un desktop completamente vacio :D

Agregar Días Hábiles


Hace un par de meses, en el trabajo se requirio un calendario que al llenarlo automáticamente llenara otro calendario, sumando 45 días habiles a la fecha del primero. Todo esto sería mostrado en una página web, por qué la fecha del segundo calendario debía cumplir la regla de los 45 días por default, pero también debía estar abierto a que se editara independientemente; el sistema esta con servlets planos y JSP así que javascript era la opción. Dada que dicha funcionalidad era para "ayer" lo primero que hice fue buscar algún código que ya lo hiciera en lugar de hacerlo yo. Esto fue lo que encontre:

Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
}
Date.prototype.addBusDays = function(dd) {
var wks = Math.floor(dd/5);
var dys = dd.mod(5);
var dy = this.getDay();
if (dy === 6 && dys > -1) {
if (dys === 0) {dys-=2; dy+=2;}
dys++; dy -= 6;}
if (dy === 0 && dys < 1) {
if (dys === 0) {dys+=2; dy-=2;}
dys--; dy += 6;}
if (dy + dys > 5) dys += 2;
if (dy + dys < 1) dys -= 2;
if(this.getDay()===0 && dd.mod(5)===0){
dys-=3;
}
this.setDate(this.getDate()+wks*7+dys);
}

Lo único que hice fue realizar unas pruebas y a agregar ese último if, ya que tenía problemas cuando el día era Domingo y sumabas multiplos de cinco a la fecha.

Ya entregado el requerimiento, me di tiempo para arreglar el código, lo que tenía planeado era revisarlo y refactorizarlo. Lo primero que note fue que (this%n)+n)%n) no tenía sentido ya que (((x mod n) + n) mod n) es lo mismo que (x mod n). Después de esto, y de contar el número de condiciones en el código, cambie de plan y decidí hacer uno propio. Un rato después termine con esto:


Date.prototype.addBizDays = function(n){
var day = this.getDay();
var d = new Date();
var wkn = (n < 0 ? -2 : 2);
d.setDate(this.getDate()+n+(day === 6 ? 2 : +!day) +(Math.floor((Math.abs(n)/5))*wkn));
return d;
}


Lo único que rescate del código anterior fué el Date.prototype que te permite usar la función de la siguente manera

var date = new Date();
date.addBizDays(10);

La suma, o resta, de días esta descompuesta de la siguiente manera:

n número de días hábiles requeridos.

(day ===6 ? 2:+!day) Si el día es Lunes, Martes, Miercoles, Jueves o Viernes no se suman ningún día adicional. Si el día es Sábado se suman dos días, es decir se recorre hasta el Lunes. Si es Domingo se agrega un día.

(Math.floor((Math.abs(n)/5))*wkn) Agregar los fines de semana que se atraviesen, es decir suma o resta dos días más por cada fin de semana que se atraviese.

Hasta el momento la función se ha comportado bien, comentarios y refactorizaciones son bienvenidos.