lunes, 26 de octubre de 2009

bueno haciendo algo de scripting de paginado, me di cuenta de que habia una forma de hacer que conserve todos los parametros y agregar solo los de numero de pagina para poder conservar una busqueda, este es el script generado, como pueden ver es muy sencillo


#macro( paginado )
#if($totalPages)
#if( $totalPages > 0 )
#foreach ($page in [1..$totalPages])
<a href="$link.addIgnore('pageNum').addAllParameters().addQueryData('pageNum',$page)"
>
$page
</a>
#end
#end
#end
#end

lunes, 5 de octubre de 2009

conectando midlets por recordstore

ultimamente he vuelto a trabajar j2me para desarrollar aplicaciones para moviles, esta vez voy a intentar algo que es en cierta forma algo no muy estandar, me refiero a hacer que 2 midlets se comuniquen entre si, para eso requerimos como paso inicial 2 midlets, recordstores, el primer paso es crear un midlet con la siguiente estructura para poder iniciar, este es el midlet de escucha, este podria ser un miniservidor, para eso el midlet requiere como codigo inicial:

protected void startApp() throws MIDletStateChangeException {
try {
//abrimos un recordstore con permisos de escritura de cualquier otro midlet
RecordStore rms = RecordStore.openRecordStore("owner", true, RecordStore.AUTHMODE_ANY ,true );
//agregamos un record listener generado por nosotros
rms.addRecordListener( new ListenerRMS() );
Display d = Display.getDisplay(this);
d.setCurrent(null);
} catch (RecordStoreFullException e) {
e.printStackTrace();
} catch (RecordStoreNotFoundException e) {
e.printStackTrace();
} catch (RecordStoreException e) {
e.printStackTrace();
}


}

este requiere una clase que implemente el codigo del recordlistener esto podria ser algo como esto:


public class ListenerRMS implements RecordListener {

public void recordAdded(RecordStore recordStore, int recordId) {
try {
byte[] data = recordStore.getRecord(recordId);
String rmsToCreate = new String( data );
System.out.println( "datos: " + rmsToCreate );
} catch (RecordStoreNotOpenException e) {
System.err.println( e.toString() );
} catch (InvalidRecordIDException e) {
System.err.println( e.toString() );
} catch (RecordStoreException e) {
System.err.println( e.toString() );
}
}

este codigo permite generar un pequeño server con listener como un rms

y este codigo del lado del otro midlet permite escribir en un recordstore compartido, con el vendor especificado, de manera que cuando agregues valores al record, el listener del otro midlet podra leer los datos generados desde otro midlet y ejecutar codigo

rms = RecordStore.openRecordStore("owner", "vendor","owner" );
byte[] data = "texto de prueba".getBytes();
rms.addRecord(data, 0, data.length);

para esto tienes primero que correr el midlet 1 y despues el midlet 2 y ejecutar un codigo que escriba en el otro recordstore. bueno esto aumenta el numero de posibilidades a la hora de conectar 2 midlets, sin embargo no todos los telefonos soportan esta caracteristica.

martes, 14 de julio de 2009


bueno en esta ocasion se subio el nuevo buscador de objetos para generar querys dinamicos, esta vez tiene soporte para transacciones con objetos :



search.addBatchObject(book1);
search.addBatchObject(book2);
search.addBatchObject(book3);
search.executeBatch();


http://sourceforge.net/projects/dinamicquerygen/

y tambien corrige algunos bugs y contiene algunos ejemplos de uso, y proximamente estara agregando mas sentencias.

miércoles, 3 de junio de 2009

hola de nuevo acabo de subir mi nuevo release del buscador de objetos, este corrige algunos bugs de seguridad anteriores, este permite subir correctamente las llaves primarias al momento de insercion, bueno un fix rapido, despues subo los demas archivos, mientras les dejo el link para que lo vean.

https://sourceforge.net/project/showfiles.php?group_id=250622&package_id=317069&release_id=687070

bueno que tengan una buena semana, nos vemos.

sábado, 30 de mayo de 2009

correcciones del sistema

hola a todos, esta vez he estado checando el sistema de busqueda de objetos y parece que tiene unos pequeños bugs a la hora de insertar, estare arreglando esto, espero que no me tome tiempo, pero apenas este listo saco la ultima actualizacion en linea. bueno como siempre esten pendientes de los cambios y mientras estoy haciendo unas actualizaciones en el corporativo de coca.

la pagina es:

http://www.coca-colamexico.com.mx/

por mientras estoy basandome en los estandares css para hacer la transicion correcta. para mas informacion les recomiendo el siguiente libro.



http://www.amazon.com/Pro-CSS-HTML-Design-Patterns/dp/1590598040

contiene la informacion acerca de estandares, los tips y las mejores practicas para css, tambien les recomiendo firebug en sus navegadores firefox para depuracion de css
















muy excelente libro lo recomiendo bastante en especial a los que les encanta hacer paginas web con diseños asombrosos, luego les recomiendo alguno para seo por mientras es todo.

sábado, 16 de mayo de 2009

buscador de objetos version 1.1

hola de nuevo, esta vez estoy publicando mi propia libreria para hacer busquedas en bases de datos, esta se comporta como un odbms, o un sistema de bases de datos de objetos, lo cual es diferente a un rdbms, debido a lo que se almacena no son registros, sino objetos, esta se conecta a un rdbms, haciendo que la forma de programar sea mas sencilla, debido a que uno ya no se dedica a buscar registros, sino objetos, esto hace que la programacion orientada a objetos sea mas sencilla, la pagina es:

http://sourceforge.net/project/showfiles.php?group_id=250622&package_id=306312

ahi se encuentra la libreria principal, un projecto de prueba en java server faces y un script de base de datos mysql para poder generar el proyecto de prueba, aun me falta documentacion del sistema pero ya voy por menos, esta vez prometo sacarla lo antes posible, el sistema recibira actualizaciones frecuentemente asi que no se preocupen los que siguen el post, mandenme algunas sugerencias y sientanse libres de inspeccionar el codigo, recuerden que el opensource hace nuestras vidas mas productivas y mejores en muchos aspectos, gracias a eso es que avanzamos mas como personas y tambien en cuestiones tecnologicas.

miércoles, 6 de mayo de 2009

Reflection

bueno hoy me lanzo a publicar algo de programación, en esta ocasion sera acerca de algo llamado reflection, ¿Qué es reflection?, reflection es un proceso en el cual el programa puede examinar y modificar su propia estructura y comportamiento, este tipo de programacion es la llamada programacion reflexiva, las ventajas de este tipo de programacion son varias, principalmente para convertir objetos a estructuras de datos , esto se usa normalmente para serializar , las aplicaciones pueden autoserializarse para convertir xml, extraer comportamientos, fabricar librerias inteligentes y muchas cosas mas, las posibilidades son bastantes, en cuanto a lo que se puede hacer.

aqui tenemos un ejemplo de uso de reflection.

public Object pullObjectFromProperty(Object o, String property) throws Exception {
//gets the current class
Class _class = o.getClass();
//gets the field of the object
Field field = _class.getDeclaredField(property);
Object result = null;
field.setAccessible(true);
//assign the value of the field to a result
result = field.get(o);
return result;
}

el siguiente fragmento puede sacar el valor del objeto conociendo el nombre del campo, tambien es posible obtener una lista de campos del objeto, una vez que conocemos esto podemos sacar las propiedades del objeto, tambien es posible invocar metodos o en dado caso obtener los metodos y saber como invocarlos, esto proporciona muchas ventajas a la hora de programar, podemos extraer la informacion de las superclases, interfaces y demas, todo esto y mas nos permite reflection, esto se genera al momento de ejecucion, como todo no debe de abusarse de esta tecnologia, debido a que puede hacer que una aplicacion disminuya su rendimiento, muestre comportamientos no adecuados, genere cosas inesperadas, sin embargo bien utilizada puede ser la herramienta perfecta.

recomiendo el siguiente libro de reflection, excelente libro.



http://www.manning.com/forman/

lunes, 27 de abril de 2009

emergenciasmac.com.mx

pues recientemente quisimos recuperar informacion de un disco duro iomega, de los de 360 gb debido a un formato accidental, y pues mi compañero jorge de la peña, le hablo a una empresa que se dedica a recuperar informacion de discos duros y demas,en ese aspecto ellos estaban por abrir su disco duro, jorge les dijo que no lo hicieran y despues recuperaron la informacion y le dieron formato completo al disco, evitando que fuere recuperable y ademas dijeron en tono ironico, aqui tenemos tus datos, de esa manera es un servicio que no tiene una forma etica de trabajar, en este caso si tienen emergencias para recuperar informacion de los discos duros, mejor usen programas como el ontrack, si necesitan info de donde descargarlo se los comentare en el proximo post, por mientras me despido :)

viernes, 20 de marzo de 2009

action man sucks

hoy les quiero contar algo, en el blog de oscar arzona, amigo mio, y excelente programador php, nos compartio su blog http://oscararzola.com/blog con excelentes articulos, comentarios del mundo de la programación recibio comentarios fuera de lugar en un foro que no tiene nada que ver con lo que es trato personal y forma de trabajo, absolutamente nada que ver uno con el otro, en este caso se trata de un antiguo compañero de trabajo, frustrado y convertido en el titere de un cliente, en fin uno de mis mas fuertes proyectos, junto con el sistema para desarrollo de querys, les traere un adelanto la proxima semana, debido a que estoy terminando la documentación y ejemplos necesarios para poder echarlo a andar, espero sus comentarios y dudas. En fin mi recomendación es que digan las cosas como deben de ser y no se anden ocultando, esto solo los hace ver como un monton de cobardes, los verdaderos y originales nunca andamos como anonimos, en fin un saludo para aquellos que leen el blog y nos leemos proximamente.....

jueves, 12 de febrero de 2009

ofix 2oo7 original

tenía una clave no válida hasta que encontré un método que si me funcionó y sin necesitar nada de esos molestos cracks que ni me funcionaron .
Bueno aquí va como hacer dicho método:
1. Primero debemos cerrar todo producto de Microsoft Office.
2. Vamos a Inicio > Ejecutar > Escribimos regedit

3. Debemos buscar esta entrada:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\ Registro (ami me aparece “Registration”)

Una vez encontrada dicha entrada, debemos de buscar otra subentrada como esta:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\ Registro\ {90120000-0030-0000-0000-0000000FF1CE

O una como esta:
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\12.0\ Registro\ {91120000-0011-0000-0000-0000000FF1CE

4. Debes de asegurarte que aparezca dentro de esas subentradas el nombre del producto del Office, como por ejemplo:
ProductName=Microsoft Office Professional Plus 2007
ProductName=Microsoft Office Enterprise 2007

5. Una vez encontrada las algunas de las claves antes mencionadas, busca estas entradas del regedit y eliminalas:
DigitalProductID
ProductID
Lo que hicimos fue borrar la clave del producto del Microsoft Office, ahora haremos que nunca más la pida.
6. Vamos a la carpeta de instalación del Microsoft Office 2007, que debe de estar en esta dirección:
C:\Archivos de programa\Archivos comunes\Microsoft Shared\OFFICE12\Office Setup Controller\Proof.es

También debemos hacerlo para la carpeta Proof.en, que es esta:
C:\Archivos de programa\Archivos comunes\Microsoft Shared\OFFICE12\Office Setup Controller\Proof.en
Buscamos el archivo: proof.xml y lo abrimos con el Bloc de Notas *
Y editamos la penúltima línea:




Le quitamos el AlwaysInstalled y le ponemos: neverInstalled. Debe de quedar algo así:





Después de todo ese rollote vamos ahttp://www.microsoft.com/genuine/ le damos en "Validar Office" y listo Office Validado al 100%.
Este método también sirve para los que compraron máquinas nuevas con Vista y que traen la versión de prueba de 30 días

miércoles, 28 de enero de 2009


Este codigo sirve para activar tu w1nd0w5 xP y dejarlo como original, solo copia el codigo y pegalo en un bloc de notas y guardalo como licencia.reg , dale doble clic y listo.



Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]

"CurrentBuild"="1.511.1 () (Obsolete data - do not use)"
"ProductId"="55274-640-1011873-23081"

"DigitalProductId"=hex:a4,00,00,00,03,00,00,00 ,35, 35,32,37,34,2d,36,34,30,2d,\

31,30,31,31,38,37,33,2d,32,33,30,38,31,00,2e,00,00 ,00,41,32,32,2d,30,30,30,\

30,31,00,00,00,00,00,00,00,86,56,4e,4c,21,1b,2b,6a ,a3,78,8e,8f,98,5c,00,00,\

00,00,00,00,dd,da,47,41,cc,6b,06,00,00,00,00,00,00 ,00,00,00,00,00,00,00,00,\

00,00,00,00,00,00,00,00,00,00,00,38,31,30,32,36,00 ,00,00,00,00,00,00,b5,16,\
00,00,83,83,1f,38,f8,01,00,00,f5,1c,00,00,00,00,00 ,00,00,00,00,00,00,00,00,\

00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ,66,e5,70,f3

"LicenseInfo"=hex:33,b7,21,c1,e5,e7,cd,4b,fd,7 c,c6 ,35,51,fd,52,57,17,86,3e,18,\

d3,f4,8c,8e,35,32,7b,d1,43,8d,61,38,60,a4,ca,55,c9 ,9a,35,17,46,7a,4f,91,fc,\

4a,d9,db,64,5c,c4,e2,0f,34,f3,ea

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WPAEvents]

"OOBETimer"=hex:ff,d5,71,d6,8b,6a,8d,6f,d5,33, 93,f d

jueves, 22 de enero de 2009

Expresiones Regulares

Las expresiones regulares son modelos que describen las combinaciones de caracteres en el texto. Se podrían definir como una serie de carácteres que forman un patrón, que representan a otro grupo de carácteres mayor, de tal forma que podemos comparar el patrón con otros conjuntos de carácteres para ver las coincidencias. Las expresiones regulares pueden utilizarse en múltiples lenguajes de programación pero en esta entrada vamos a ver un ejemplo de validación de formularios mediante Javascript y haciendo uso de expresiones regulares.

Un buen tutorial para iniciarse en el manejo de expresiones regulares lo podemos encontrar en Desarrolloweb. Para realizar el ejemplo siguiente no hay porque conocer en profundidad su manejo. A continuación muestro una serie de tablas a modo de chuleta para que podamos utilizarlas con un simple corta y pega.

La tabla siguiente contiene los caracteres especiales de las expresiones regulares.

Carácter


Texto buscado

^


Principio de entrada o línea.

$


Fin de entrada o línea.

*


El carácter anterior 0 o más veces.

+


El carácter anterior 1 o más veces.

?


El carácter anterior una vez como máximo (es decir, indica que el carácter anterior es opcional).

.


Cualquier carácter individual, salvo el de salto de línea.

x|y


x o y.

{n}


Exactamente n apariciones del carácter anterior.

{n,m}


Como mínimo n y como máximo m apariciones del carácter anterior.

[abc]


Cualquiera de los caracteres entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [a-f] es equivalente a [abcdef]).

[^abc]


Cualquier carácter que no esté entre corchetes. Especifique un rango de caracteres con un guión (por ejemplo, [^a-f] es equivalente a [^abcdef]).

\b


Límite de palabra (como un espacio o un retorno de carro).

\B


Cualquiera que no sea un límite de palabra.

\d


Cualquier carácter de dígito. Equivalente a [0-9].

\D


Cualquier carácter que no sea de dígito. Equivalente a [^0-9].

\f


Salto de página.

\n


Salto de línea.

\r


Retorno de carro.

\s


Cualquier carácter individual de espacio en blanco (espacios, tabulaciones, saltos de página o saltos de línea).

\S


Cualquier carácter individual que no sea un espacio en blanco.

\t


Tabulación.

\w


Cualquier carácter alfanumérico, incluido el de subrayado. Equivalente a [A-Za-z0-9_].

\W


Cualquier carácter que no sea alfanumérico. Equivalente a [^A-Za-z0-9_].

La tabla siguiente contiene algunos de los patrones más utilizados a la hora de validar formularios. Si alguien conoce alguna expresión regular más -que pueda ser útil en la validación de formularios- la puede poner en los comentarios y yo la incorporaré a esta tabla.

Cualquier letra en minuscula


[a-z]

Entero


^(?:\+|-)?\d+$

Correo electrónico


/[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/

URL


^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\’\/\\\+&%\$#_]*)?$

Contraseña segura


(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$
(Entre 8 y 10 caracteres, por lo menos un digito y un alfanumérico, y no puede contener caracteres espaciales)

Fecha


^\d{1,2}\/\d{1,2}\/\d{2,4}$
(Por ejemplo 01/01/2007)

Hora


^(0[1-9]|1\d|2[0-3]):([0-5]\d):([0-5]\d)$
(Por ejemplo 10:45:23)

Número tarjeta de crédito


^((67\d{2})|(4\d{3})|(5[1-5]\d{2})|(6011))(-?\s?\d{4}){3}|(3[4,7])\ d{2}-?\s?\d{6}-?\s?\d{5}$

Número teléfono


^[0-9]{2,3}-? ?[0-9]{6,7}$

Código postal


^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$

Certificado Identificación Fiscal


^(X(-|\.)?0?\d{7}(-|\.)?[A-Z]|[A-Z](-|\.)?\d{7}(-|\.)? [0-9A-Z]|\d{8}(-|\.)?[A-Z])$