Skin for Launchy

| 0 comentarios

Vaya!!, no he llevado un curso oficial de diseño gráfico(Si me preguntan la teoría del color, no sabría que contestar) pero pss.... hay me defiendo con el photoshop puesto que a veces necesito plasmar esa ideas o curiosidades visuales que quiero.

Por está razón cuando revisé la estructura de los skin que trae por default Launchy no me costo crear una nueva versión, pues solo se necesita crear las imagenes y modificar el archivo 'style.qss' el cual esta basado en CSS y 'misc.txt'. Para finalmente colocarlo dentro de una carpeta bajo el directorio 'skin' del directorio de instalación de Launchy.

Este es el archivo 'style.qss' que uso


#launchy {
}

#opsButton {
border: none;
background: url(opsButton.png);
qproperty-geometry: rect(265 15 14 15);
}

#workingAnimation {
qproperty-geometry: rect(249 15 16 16);
}

#opsButton:pressed {
border: none;
background-image: url(opsButtonPressed.png);
}

#input {
font: 16px Verdana, Arial;
border-width: 0px;
background-color: rgba(0,244,120,0%);
border-style: solid;
color: #666666;
qproperty-alignment: AlignLeft;
qproperty-geometry: rect(77 40 205 18);
}

#output {
font: 10px Verdana, Arial;
border-width: 0px;
background-color: rgba(0,244,120,0%);
border-style: solid;
color: white;
qproperty-alignment: AlignCenter;
qproperty-geometry: rect(25 70 255 18);
}

#outputIcon {
qproperty-geometry: rect(26 33 32 32);
}

#alternatives {
color:#3c3c3c;
font: 11px Verdana, Arial;
alternate-background-color: rgb(242,242,242);
background: white;
selection-background-color: rgb(0,160,227);
selection-color: white;
border: none;
qproperty-geometry: rect(75 92 205 20);
}

QScrollBar#altScroll:vertical {
image: url(scrollBack.png);
width: 16px;
margin: 16px 0px 16px 0px;
}

QScrollBar#altScroll::handle:vertical {
background: qlineargradient(x1:0, y1:0.5, x2:1, y2:0.5, stop:0 white, stop:0.1 rgb(85,85,85), stop:0.7 rgb(40,40,40), stop:0.9 rgb(60,60,60), stop:1 white);
}

QScrollBar#altScroll::sub-line:vertical {
width: 16px;
height: 16px;
subcontrol-position: top;
subcontrol-origin: margin;
image: url(scrollUp.png);
}

QScrollBar#altScroll::add-page:vertical {
background: url(scrollBack.png);
}

QScrollBar#altScroll::sub-page:vertical {
background: url(scrollBack.png);
}

QScrollBar#altScroll::add-line:vertical {
width: 16px;
height: 16px;
subcontrol-position: bottom;
subcontrol-origin: margin;
image: url(scrollDown.png);
}






Descargar Skin

Link de descarga, descomprime la carpeta y colócala bajo el directorio skin de Launchy.

Crear webs para iPhone,iPad y iPod

| 0 comentarios

iPhone

Al día de hoy los geeks aprecian los gadgets de la empresa Apple al grado que son los productos más pedidos en internet. Es por esta razón que estos aparatos están onmipresentes en las visitas de diversos sitios web, que para disgusto de muchos de los visitantes son web's poco amigables y en algunos casos incompatibles a la hora de mostrar el contenido (Caso de Web's puras en Flash entre otros casos)

Por esta razón si en las estadísticas de tu sitio web observas que son varios los visitantes con estos dispositivos, pues no desaproveches esa oportunidad para que tu web incursione en este nicho de dispositivos; aunque hay que aclarar que un buen numero de usuarios son muy exigentes, para ello tu sitio web no solo debe de ser compatible sino además debe de ser amigable y optimizado.

Para ello hay que leer las cabeceras HTTP en cada petición del usuario y enviar un CSS diferente o incluso una pagina diferente para sacar provecho a las dimensiones fisicas que se disponen en estos dispositivos.

El contenido del user-Agent pudiera ser (Con alguna variación en la versión):
iPhone


Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3

iPod

Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3

iPad

Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) version/4.0.4 Mobile/7B367 Safari/531.21.10


Es mejor tener un sitio web que se visualice en diversos dispositivos y navegadores, ahora; para asertar al tipo de dispositivo del Apple puedes usar los siguientes Scripts:

PHP

// Apple detection array
$Apple = array();
$Apple['UA'] = $_SERVER['HTTP_USER_AGENT'];
$Apple['Device'] = false;
$Apple['Types'] = array('iPhone', 'iPod', 'iPad');
foreach ($Apple['Types'] as $d => $t) {
$Apple[$t] = (strpos($Apple['UA'], $t) !== false);
$Apple['Device'] |= $Apple[$t];
}
// is this an Apple device?
echo
"

Apple device? ", ($Apple['Device'] ? 'true' : 'false'),
"

\n

iPhone? ", ($Apple['iPhone'] ? 'true' : 'false'),
"

\n

iPod? ", ($Apple['iPod'] ? 'true' : 'false'),
"

\n

iPad? ", ($Apple['iPad'] ? 'true' : 'false'),
'

';

Javascript

// Apple detection object
var Apple = {};
Apple.UA = navigator.userAgent;
Apple.Device = false;
Apple.Types = ["iPhone", "iPod", "iPad"];
for (var d = 0; d < Apple.Types.length; d++) {
var t = Apple.Types[d];
Apple[t] = !!Apple.UA.match(new RegExp(t, "i"));
Apple.Device = Apple.Device || Apple[t];
}
// is this an Apple device?
alert(
"Apple device? " + Apple.Device +
"\niPhone? " + Apple.iPhone +
"\niPod? " + Apple.iPod +
"\niPad? " + Apple.iPad
);


Así para redireccionar podrías hacer un
if (Apple.iPhone) window.location.href="http://iphone.mysite.com/";

Algunos sitios web para el ocio

Revisando el mail, me encontre con una lista de sitios web que alguna vez estuvieron dentro del top de los 300 sitios más visitados aquí en México. Es curioso ver la tematica de cada uno.

  • STARTVG.COM>
  • OYUNLAR1.COM
  • TELCEL.COM
  • MEGAUPLOAD.COM
  • COMPUTRABAJO.COM.MX
  • ELNORTE.COM
  • NEOPETS.COM
  • MUNDONICK.COM
  • HABBO.ES
  • WORDPRESS.COM
  • TAGGED.COM
  • DISNEYLATINO.COM
  • SOFTONIC.COM
  • AVISOSDEOCASION.COM
  • UNIVISION.COM
  • WAMBA.COM
  • UNAM.MX
  • PHOTOBUCKET.COM
  • CINEPOLIS.COM.MX
  • JUEGOSDIARIOS.COM


Saludos.

Ebook 'Windows 7: Tips and Tricks'

| 0 comentarios

EbookCortesía del MVP vasu jain el cual consiste en una compilación de 50 tips y sugerencias muy buenas sobre el uso de Windows 7.

Link de descarga: Windows 7 : Tips& Tricks PDF Tamaño : 5.8 MB

Disponible en formato XPS. Windows 7 : Tips& Tricks XPS Tamaño : 6.44 MB

JChat 0.6beta

| 1 comentarios

Bueno desde hace días me baje el proyecto JChat 0.5b de sourceForge.Net, este consiste en una aplicación desarrollada en J2SE, en el cual se implementa un cliente y un servidor para el envío de mensajes en una LAN usando sockets con la API del JDK 1.3.

El proyecto esta sencillo, y bastante olvidado (Su ultima actualización fue en 2001). Entonces mi intervención fue para realizar las mejoras a mi alcance en tiempo y capacidades, abra quien diga que es mejor crear una aplicación desde cero, puesto que el código se encuentra muy ofuscado y contiene partes tenebrosas de código mal implementado, pero bueno; en corto había que aplicar arqueología del software (Resulta arduo entender lo que alguien más hizo sin una buena documentación).




Modificaciones realizadas

  • Refactorización de código, para poder integrar los respectivos frontales Cliente/Servidor
  • Control de algunas excepciones en los Thread de servidor
  • Corrección de warnings según especificación Java 6
  • Reducción de acoplamiento entre clases


Modificaciones que se podrían realizar
  • Aplicar algún patrón de diseño, pues no hay en sí una arquitectura definida
  • Usar non-blocking sockets,para permitir que el proceso de comunicación entre el cliente y el servidor no sean bloqueantes (Java.nio)
  • Uso de Log4j para guardar el log del servidor
  • Cifrado en los datos que se envían por la red


DescargaJchat

Descarga la Versión 0.6beta, recomiendo utilizarla con fines didácticos puesto que aún es versión beta y muy seguro se quede así por largo rato.

Programación de agentes con Robocode API

| 0 comentarios

Introducción
Con el lema "Buir the best - destroy the rest" fue desarrollado el juego Open Source llamado Robocode; iniciado por Mathew Nelson y que hasta la fecha se mantiene vigente debido a las contribuciones de la comunidad y el auspicio de SourceForge. Este juego fue diseñado para ayudar a las personas a programar en el lenguaje Java y de paso divertirse con esta experiencia.

Básicamente consiste en escribir código Java en base a la API proporcionada de tal grado que mejor se defienda y sobreviva un tanque robot 'agente inteligente' del resto, obviando que las batallas se puedan dar en equipos, uno contra uno, o todos contra todos.

Entorno e instalación
Como requisitos:

  • Tener instalado al menos la versión 5 de java que incluya JRE Y JDK; preferentemente el de SUN
  • Tener correctamente configurada la variable del sistema JAVA_HOME

Resulta sencillo ir al sitio oficial del proyecto, descargarse el JAR de la ultima versión y ejecutarlo desde la línea de comandos con:

java -jar robocode-setup-x.y.z.jar



Anatomía del Robocode

imagenConsta de tres partes:
  • Cuerpo - Lleva el arma con el radar en la parte superior. El cuerpo es utilizado para mover el robot hacia adelante y hacia atrás, así como girar a la izquierda oa la derecha.
  • Arma - Utilizado para disparar balas de energía. El cañón puede girar a la izquierda o a la derecha.
  • Radar - Se utiliza para buscar otros robots cuando se mueven. El radar puede girar a la izquierda oa la derecha. El radar genera eventos onScannedRobot cuando se detectan los robots.

Otras de sus características:
  • Tiene ciertas reglas físicas, como movimiento, apuntar, velocidad, que debes tomar en cuenta a la hora de atacar y defenderte
  • Tiene sensores que debes programar para ver a tus objetivos
  • Hay obstáculos contra los que tu tanque puede chocar.
En sí su comportamiento es igual al de un agente inteligente, puesto que cumple con la siguiente definición propuesta por Hayes-Roth:
Los agentes inteligentes continuamente ejecutan tres funciones: perciben las condiciones dinámicas del entorno, actúan para afectar condiciones en el entorno, y razonan para interpretar percepciones, resolver problemas, trazar inferencias, y determinar acciones
por sí esto fuera poco la programación en estos puede ser genética.

Arquitectura del engine de simulación del Robocode



Técnicas, tips y trucos
Resumo algunas técnicas utiliazadas por los maestros del robocode:

  • Evitar la pared factor - Utilizado para evitar que el bot quede atrapado entre las paredes o se desvíe mucho de una dirección
  • Movimiento antigravedad - Consiste en algoritmos para definir algunos puntos en el mapa para así poder evitarlos y crear patrones de movimientos.
  • Objetivos predictivos - Algoritmo que es utilizado para determinar las posiciones del enemigo con mayor precisión y poder realizar disparos más eficaces.

Creación del robot

Para programar un robot acceder al menú Robot>Editor> posteriormente en el editor de robot File>New>Robot. Especificar el nombre del robot (Clase java) y el paquete al que pertenece. Prácticamente hay que extender de una clase llamada Robot (No es más que un hilo) y generar aquellas porciones de código en base a las técnicas, habilidades y trucos existentes, más detalles en la API. Posteriormente guardar y compilar la clase desde Compiler>compile


package robot1;
import robocode.*;
//import java.awt.Color;

/**
* Exterminador - a robot by (Gabriel Mtz.)
*/
public class Exterminador extends Robot
{
/**
* run: Exterminador's default behavior
*/
public void run() {
// After trying out your robot, try uncommenting the import at the top,
// and the next line:
//setColors(Color.red,Color.blue,Color.green);
while(true) {
// Replace the next 4 lines with any behavior you would like
ahead(100);
turnGunRight(360);
back(100);
turnGunRight(360);
}
}

/**
* onScannedRobot: What to do when you see another robot
*/
public void onScannedRobot(ScannedRobotEvent e) {
fire(1);
}

/**
* onHitByBullet: What to do when you're hit by a bullet
*/
public void onHitByBullet(HitByBulletEvent e) {
turnLeft(90 - e.getBearing());
}

}



Test

Determinar si un año es bisiesto

| 0 comentarios

Hace ya un rato, alguien me pidio ayuda con la logica de un programa para calcular si el entero pasado como parametro en un metodo es un año bisiesto. Si por allí alguien tiene la misma duda chequen el siguiente ejemplo realizado con el lenguaje JAVA, el cual puede ser ampliamente adaptado a cualquier otro lenguaje; para fines meramente didacticos:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* Haz un programa que pida un año por pantalla y diga si es bisiesto.
* Un año es bisiesto bajo las Siguientes condiciones:
* - Un año divisible por 4 es bisiesto.
* - Un año divisible por 100 no es bisiesto.
* - Un año divisible por 400 es bisiesto
*
*/
public class Bisiesto {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(input);
int tmp=0;
int num[] = new int[4];

public static void main(String args[]){
Bisiesto ej = new Bisiesto();
ej.ingreso();
}

private void ingreso() {
System.out.print("Ingrese un año: ");
tmp = leerEntero();
if( (tmp%400==0) && !(tmp%100==0) || (tmp%4==0 ) )
System.out.print("El año es bisiesto");
else
System.out.print("El año no es bisiesto.");
}

private int leerEntero() {
try {
tmp = Integer.parseInt( buffer.readLine() );
} catch (NumberFormatException e) {
System.out.print("Solo números, vuelva a ingresar el valor:");
leerEntero();
} catch (IOException e) {
System.out.println("Se ha producido un error");
return 0;
}
return tmp;
}
}

Ahora bien, con fines productivos se puede usar la subclase de java.util.Calendar llamada java.util.GregorianCalendar el cual posee un metodo llamado isLeapYear el cual retorna un booleano indicando si el entero pasado como parametro es bisiesto o no.

public boolean isLeapYear(int year)

La ventaja de usar la API java.util.GregorianCalendar es que podemos revisar un año antes de cristo (En ingles B.C.)