Wednesday, December 23, 2009

Feliz Navidad 2009!


Se nos acaba el año 2009...es por eso que es tiempo de desearles una...

FELIZ NAVIDAD Y PRÓSPERO AÑO NUEVO!!!

Que este año 2010, sea excelente para todos nosotros, que podamos alcanzar todas nuestras metas y seguir siendo tan Geeks como podemos serlo -;)

Saludos,

Blag.

Tuesday, December 15, 2009

Edita tus fotos a la AIR


El otro día estaba revisando la página de mi amigo Duane "Chaos" Nickull llamada Technoracle(a.k.a "Duane's World") y encontré que está dando gratis 50 licencias para Citrify . Por supuesto...me arriesgué y felizmente fuí uno de los elegidos -:) Ahora soy un usuario de Citrify -;)

Pero...que es Citrify? Es una aplicación en Adobe AIR que se usa para editar las fotos en una forma fácil y divertida.


Escoge una imagen...


Puedes ajustar el Brightness (Brillo), Contrast (Contraste), Hue (Matiz), Saturation (Saturación), Resize (Tamaño), Rotate (Rotación) and Sharpen (Enfoque).


También pueden hacer retoques con with Airbrush (Aerógrafo), Blemish (Mancha), Glare (Luminosidad), Redeye (Ojo rojo), Toothbrush (Cepillo de dientes) and Wrinkle (Arruga).


Por supuesto...no se olviden de los efectos, pueden utilizar Halftone (Medio tono), Flashback (Retrospectiva), Watercolor (Acuarela), Hulkify (Hulkificar), Obamify (Obamizar), Sepia (Sepia), Black & White (Blanco y negro) and Pencil sketch (Dibujo a lápiz).


Jugando un poco con estos efectos y ajustes, puedes hacer que las fotos se vean muy extrañas, como esta -:)

Realmente recomiendo este software...fácil de usar, construído con Adobe AIR...qué mas pueden pedir?

Saludos,

Blag.

Sunday, December 13, 2009

ChessJam - Ajedrez en línea


Debo admitir que soy muy malo en Ajedrez...pero eso no significa que no me guste -;)
Así que cuando estaba navegando en mi RSS Reader, encontré ChessJam.

ChessJam es una aplicación construida con Adobe Flex y ColdFusion corriendo en Adobe AIR.

Pero se estarán preguntando...porque tanta conmoción por un juego de Ajedrez? Fácil...puedes jugar contra robots o contra gente de cualquier lugar del mundo...chat incluido...para mi...eso es asombroso -:)


Debemos crear una cuenta y luego logearnos.


Podemos escoger entre un juego simple of chatear y retar a otros jugadores....


Podemos escoger varios tipos de juegos (Dependiendo del tiempo de duración) o entrar en un Torneo.


Tenemos muchas oportunidades para decidir si queremos jugar con un robot o con otro ser humano.


Podemos escoger entre una vista 3D...


o una clásica vista 2D...


Cuando te inscribes...debes indicar tu país de residencia...para que el sistema pueda correr algunas interesantes estadísticas.

Así que...porque no lo dan a este juego una oportunidad? Juegenlo...disfrutenlo y pasenselo a sus amigos -;)

Saludos,

Blag.

Saturday, December 12, 2009

Herramienta matemática con RegEx y JavaScript


Post original "RegEx and JavaScript Mathematical Tool".

Si me conocen...ya saben que amo los nuevos lenguajes de programación y las herramientas. Aunque las Expresiones Regulares y el JavaScript no son exactamente nuevos, no han sido explotados en ABAP, es por eso que quiero que este blog muestre todo lo que podemos lograr utilizándo cualquiera de estas dos adiciones al lenguaje.

La historia en resumen, es así...Estaba revisándo mi Google Reader como todas la mañanas, cuando vi este excelente y muy gracioso comic de XKCD...


Supe que era la hora de intentar convertirme en un heroe del RegEx...

Debo admitir que el RegEx no es fácil...a veces es complejo y avaro...pero creánme...llegas a amarlo (Ok...no todo el mundo lo ama...)

Así que, supe que era hora de que construyera una pequeña herramienta utilizándo mis nuevas habilidades. Así que construí una pequeña herramienta matemática, utilizándo tanto RegEx como JavaScript...y lo gracioso aquí es que mientras me rompía la cabeza con RegEx, recordé que utilizándo JavaScript tenía el trabajo prácticamente hecho...pero como soy un Geek...no podía simplemente tomar el camino fácil...seguí luchando hasta que mi RegEx funcionó, pero dejé mi JavaScript como una manera de decir..."Hay más de una manera de hacer que las cosas funcionen...".

Dejenme mostrarles algunas imagenes primero, y luego les muestro el código fuente...


Podemos pasar una expresión muy simple...


O una expresión muy compleja...


Y probarlas ya sea con RegEx o con JavaScript...


Ahora el código fuente...


*&-----------------------------------------------------------*
*& Report ZDUMMY_SANDBOX *
*&-----------------------------------------------------------*
*& Sandbox application only for testing porpouses. *
*&-----------------------------------------------------------*
REPORT zdummy_sandbox.

*INTERNAL TABLES
DATA: message TYPE string,
t_results TYPE match_result_tab,
t_precedence TYPE match_result_tab,
t_operations TYPE match_result_tab.

*VARIABLES
DATA: g_number TYPE string,
g_sum TYPE i,
g_sum_text TYPE string,
g_operator TYPE string,
g_string TYPE string,
source TYPE string,
return_value TYPE string,
js_processor TYPE REF TO cl_java_script.

*CONSTANTS
CONSTANTS: c_operator TYPE string VALUE '+*/-%'.

*FIELD-SYMBOLS
FIELD-SYMBOLS: <fs_results> LIKE LINE OF t_results,
<fs_precedence> LIKE LINE OF t_precedence,
<fs_operations> LIKE LINE OF t_operations.

*SELECTION-SCREEN
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.
PARAMETERS:
p_msg TYPE string OBLIGATORY,
p_js RADIOBUTTON GROUP sa DEFAULT 'X',
p_re RADIOBUTTON GROUP sa.
SELECTION-SCREEN END OF BLOCK b01.

*START-OF-SELECTION
START-OF-SELECTION.

message = p_msg.

IF p_re EQ 'X'.
*REGULAR EXPRESSIONS
WHILE sy-subrc EQ 0.

FIND REGEX '[^\+\-]\*.*' IN message RESULTS t_precedence.
IF sy-subrc EQ 0.
READ TABLE t_precedence INDEX 1 ASSIGNING <fs_precedence>.
g_string = message+<fs_precedence>-offset(<fs_precedence>-length).
CONCATENATE '(' g_string ')' INTO g_string.
REPLACE REGEX '[^\+\-]\*.*' IN message WITH g_string.
CONDENSE g_string.
ENDIF.

FIND REGEX '\(([0-9]{0,9}|[\* \+ \- \/])+\)' IN message RESULTS t_results.
READ TABLE t_results INDEX 1 ASSIGNING <fs_results>.
IF sy-subrc NE 0 AND <fs_results> IS NOT ASSIGNED.
EXIT.
ENDIF.
g_string = message+<fs_results>-offset(<fs_results>-length).
CONDENSE g_string.
FIND ALL OCCURRENCES OF REGEX '([\(]|[0-9]{0,9}|[\* \+ \- \/]|[\)])'
IN g_string RESULTS t_operations.

LOOP AT t_operations ASSIGNING <fs_operations>.
g_number = g_string+<fs_operations>-offset(<fs_operations>-length).
IF g_number EQ '(' OR g_number EQ ')'.
CONTINUE.
ENDIF.
IF g_sum EQ space.
g_sum = g_number.
ENDIF.
IF g_number CA c_operator.
g_operator = g_number.
CONTINUE.
ENDIF.
CASE g_operator.
WHEN '+'.
g_sum = g_sum + g_number.
CLEAR g_operator.
WHEN '-'.
g_sum = g_sum - g_number.
CLEAR g_operator.
WHEN '*'.
g_sum = g_sum * g_number.
CLEAR g_operator.
WHEN '/'.
g_sum = g_sum / g_number.
CLEAR g_operator.
WHEN '%'.
g_sum = g_sum MOD g_number.
CLEAR g_operator.
ENDCASE.
ENDLOOP.

g_sum_text = g_sum.
REPLACE REGEX '\(([0-9]{0,9}|[\* \+ \- \/])+\)' IN message
WITH g_sum_text.

FIND REGEX '[^\+\-]\*.*' IN message RESULTS t_precedence.
IF sy-subrc EQ 0.
READ TABLE t_precedence INDEX 1 ASSIGNING <fs_precedence>.
g_string = message+<fs_precedence>-offset(<fs_precedence>-length).
CONCATENATE '(' g_string ')' INTO g_string.
REPLACE REGEX '[^\+\-]\*.*' IN message WITH g_string.
CONDENSE g_string.
ENDIF.

CLEAR: g_sum,g_operator,g_number.
ENDWHILE.

FIND ALL OCCURRENCES OF REGEX '([\(]|[0-9]{0,9}|[\* \+ \- \/]|[\)])'
IN message RESULTS t_operations.
LOOP AT t_operations ASSIGNING <fs_operations>.
g_number = message+<fs_operations>-offset(<fs_operations>-length).
IF g_number EQ '(' OR g_number EQ ')'.
CONTINUE.
ENDIF.
IF g_sum EQ space.
g_sum = g_number.
ENDIF.
IF g_number CA c_operator.
g_operator = g_number.
CONTINUE.
ENDIF.
CASE g_operator.
WHEN '+'.
g_sum = g_sum + g_number.
CLEAR g_operator.
WHEN '-'.
g_sum = g_sum - g_number.
CLEAR g_operator.
WHEN '*'.
g_sum = g_sum * g_number.
CLEAR g_operator.
WHEN '/'.
g_sum = g_sum / g_number.
CLEAR g_operator.
WHEN '%'.
g_sum = g_sum MOD g_number.
CLEAR g_operator.
ENDCASE.
ENDLOOP.

WRITE:/ 'The result is:', g_sum.

ELSE.
*JAVASCRIPT
js_processor = cl_java_script=>create( ).
CONCATENATE
'var string = ' message ';'
'function Set_String() '
' { string = eval(string); '
' } '
'Set_String(); '
'string; '
INTO source SEPARATED BY cl_abap_char_utilities=>cr_lf.

return_value = js_processor->evaluate( source ).

WRITE:/ 'The result is:', return_value.
ENDIF.

Utilicé RegEx para extraer las operaciones dentro de los parentesis y para construir la precedencia de operadores.

Si encuentran algún bug (Realmente espero que no), no duden en decirmelo -:)

Si quieren más información sobre RegEx por favor lean esto en el SCN.

ABAP Geek 14 - Regular Expressions Made Easy

Express Yourself Regularly with SAP NetWeaver 7.0, Part 1

Express Yourself Regularly with SAP NetWeaver 7.0, Part 2

Express Yourself Even More Regularly

Saludos,

Blag.