SAP TechEd USA
SCN TOP CONTRIBUTOR 2008 SCN Moderator

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.

Labels:

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.

Labels: ,

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.

Labels: ,

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.

Labels: ,

Monday, November 16, 2009

Donde me había metido?


Se que hace varios meses no posteo nada en el blog -:( Lo que pasa es que he estado bastante ocupado con mis nuevas funciones de Project Manager, el SAP TechEd de Phoenix y un proyecto que estoy haciendo para mi compañía (Una vez Geek...siempre Geek)...

No voy a decir "Ahora voy a postear como antes!" porque no creo que sea verdad...para ser sinceros...espero podear postear por lo menos una vez a la semana -:)

Eso si...estoy pensando sacar la segunda edición de mi libro El Arte de Programar NetWeaver, así que estén atentos -;)

Saludos,

Blag.

Labels: , , ,

Monday, August 24, 2009

Biz Partner - Servicios de Consultoría SAP


Normalmente no escribiría esto en mi blog, pero dado que ahora mi función es de Project Manager y encargado del Área Comercial...

La empresa donde trabajo Biz Partner ofrece servicios de consultoría tanto a nivel técnico (ABAP, BSP, WebDynpro) como a nivel funcional (FI, SD, MM) entre muchos otros. Así como servicios de Implementación, Roll-Out y Mejora continua.

Pueden contactarme directamente en:

Alvaro Tejada Galindo
Project Manager - SAP Mentor
Biz Partner.
atejada@bizpartner.biz
(511)-6280214

Saludos,

Blag.

Labels: ,

Tuesday, August 11, 2009

Learning on Demand por SAP


Siendo un SAP Mentor recibo muchos beneficios y regalos de gente muy buena y amable.

Hace unos días recibí el acceso a Learning on Demand por SAP, así que por supuesto me puse a jugar un poco.


Cuando te logeas puedes navegar por los cursos disponibles, los cuales no serán muchos pero van a crecer en el tiempo.


Por supuesto, lo primero que hice fué buscar cursos de ABAP -;) Ahora seré un Project Manager pero aún soy un apasionado de la programación en ABAP.


Encontré el TAW11 - ABAP Details y empezé a leerlo...está muy bien hecho, fácil de seguir y con información muy útil.


Algo que me gustó mucho fué el hecho de que estaba esperando solo un grupo de diapositivas en Power Point...pero en realidad, son un grupo de diapositivas con voz -:)


Pienso que LoD es una gran idea...un lugar en donde puedes aprender sobre varios temas, con muy buen material. Mis recomendaciones...espera a que madure un poco más y luego subscribete. Siendo un servicio relativamente nuevo, necesita corregir algunas cosas y mantener una librería más grande...

Saludos,

Blag.

Labels: ,

Thursday, June 11, 2009

TechEd Phoenix Countdown para BlackBerry


Si me siguen en Twitter sabrán que me compré un BlackBerry Pearl 8100...mi primer Smartphone dicho sea de paso...

Lo primero que hice, obviamente, fué instalarme algunas aplicaciones y juegos necesarios...pero también descargué el Eclipse Plug-In que permite desarrollar aplicaciones para el Berry.

Como deben recordar, construí un SAP TechEd Phoenix 2009 countdown utilizando Adobe AIR así que está vez quise construir lo mismo, pero esta vez utilizando Java para BlackBerry.

De mi experiencia desarrollandolo...debo decir que me tomó muy pocas modificaciones trasladar la versión ActionScript a la versión Java...así que programar para el BlackBerry es sencillo y divertido -:)

Quieren probarlo? Descarguelo aquí. Incluye los archivos .ALX y .COD así que deberán utilizar el Desktop Manager.

Por siacaso...es una aplicación muy simple...pero que más pueden esperar de una aplicación de cuenta regresiva? -:)

Saludos,

Blag.

Labels: , ,

Saturday, May 23, 2009

Blag's Flex 3 compiler - Edición ejecutable


El año pasado, escribí un blog en el SCN titulado Blag's Flex 3 Compiler que era basicamente, una aplicación Ruby que usaba WxRuby para el GUI y Flex 3 SDK para compilar aplicaciones Flex y AIR.

Se preguntarán por qué vuelvo a postear luego de un largo año...fácil...finalmente pude crear una versión ejecutable.

Cuando desarrollé el compilador por primera vez, intenté hacer un archivo .EXE utilizando RubyScript2Exe y Exerb, que son excelentes scripts para compilar Ruby en archivos .EXE...pero los dos fallaron cuando utilizé WxRuby...

Hace unos cuantos días...encontré Ocra. Debo decirlo...Ocra es excelente! Is veloz, compila cualquie cosa y lo más importante...mantiene los archivos .EXE generados, relativamente pequeños...

Así que, acá está el link del compilador...y no se olviden del leer el archivo README (Solo está en Inglés...la verdad me da mucha flojera traducirlo) -;)


Saludos,

Blag.

Labels: ,

Thursday, May 14, 2009

Shoes y SAP


Seguramente se estarán preguntando...Que es Shoes? Bueno...de acuerdo con why the lucky stiff es:

Shoes is a tiny graphics toolkit, designed for beginners. But make no mistake: this is real programming. You can make real, colorful apps in Shoes
(Shoes es un pequeño toolkit gráfico, diseñado para principiantes. Pero no se equivoquen: esto es verdadera programación. Puedes hacer aplicaciones reales y coloridas en Shoes)

Shoes viene como un archivo ejecutable que puede ser descargado de Download Shoes.

Para poder hacer la integración con SAP, deben bajar este archivo de la página de Piers Harding, descomprimirlo y copiar el contenido de la carpeta SAP dentro de la carpeta Lib de su instalación de Shoes.

Con eso, estamos listos para empezar.


require 'rubygems'
gem 'saprfc'
require "SAP/Rfc"

class SE16 < Shoes
url '/', :index
url '/table', :table
url '/show', :show

def index
stack :margin => 10 do
para 'Host: '
@Host = edit_line :width => 100
end
stack :margin => 10 do
para 'System Number: '
@Sysnr = edit_line :width => 100
end
stack :margin => 10 do
para 'Client: '
@Client = edit_line :width => 100
end
stack :margin => 10 do
para 'User: '
@User = edit_line :width => 100
end
stack :margin => 10 do
para 'Password: '
@Password = edit_line :width => 100, :secret => true
end
stack :margin => 10 do
button('Login') do
$rfc = SAP::Rfc.new(:ashost => @Host.text,
:sysnr => @Sysnr.text,
:lang => "EN",
:client => @Client.text,
:user => @User.text,
:passwd => @Password.text,
:trace => 1)
visit "/table"
end
end
end

def table
stack :margin => 10 do
para 'Table: '
@Table = edit_line :width => 100
stack :margin => 10 do
button('Show') do
$Table = @Table.text
visit "/show"
end
end
end
end

def show
$itab = $rfc.discover("RFC_READ_TABLE")

$itab.query_table.value = $Table
$itab.delimiter.value = "|"

$rfc.call($itab)

$Fields = Array.new
$Data = Array.new
$Data_Fields = Array.new
$Data_Split = Array.new
$Data_Names = Array.new

$itab.fields.hashRows {|field| $Fields.push(field) }
$Fields_Len = $Fields.length
$itab.data.hashRows {|field|
$Data.push(field['WA'].to_s.strip!) }
$Data_Len = $Data.length
$itab.fields.hashRows {|field| $Data_Names.push
(field['FIELDNAME'].to_s.strip)}

para "Tabla: #{$Table}"

for i in 0...$Data_Len
stack :margin => 10 do
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
flow :margin => 10 do
for i in 0...$Fields_Len
para "#{$Data_Split[i].to_s.strip} |"
end
end
end
end
end
end

Shoes.app :width => 600, :height => 450

Ahora, algunas imágenes...





Espero que les guste -:)

Saludos,

Blag.

Labels: ,