Wednesday, April 30, 2008

Inform 7 - Creando Ficción Interactiva


Mi pasión por los juegos de Ficción Interactiva ha regresado gracias a que descargué la última versión de Inform 7 un motor para creación de juegos de este genero.

El creado de Inform Graham Nelson es todo un Gurú puesto que su creación hace que la programación de juegos IF sea muy sencilla...Sobre todo con la versión 7, puesto que se utiliza el Natural Language...Es decir, se programa como si se estuviera escribiendo un libro.

"Hello World" by "I.F. Author"

The story headline is "An Interactive Example".

The Living Room is a room. "A comfortably furnished living room." The Kitchen is north of the Living Room. The Front Door is south of the Living Room. The Front Door is a closed locked door.

El entorno de programación es simple pero directo, es decir, ayuda mucho -:)





Claro, si les preocupa que todo esté en Inglés...Pues bueno, siempre hay una solución -;) Pueden descargar InformATE! que es una versión de Inform 6 totalmente en Español...Y por supuesto, la página del CAAD es al lugar donde hay que ir para conseguir juegos, ayuda y algunos buenos amigos -;)

Saludos,

Blag.

Tuesday, April 29, 2008

Master Mind - Juego en ABAP


En la tarde, publiqué este blog en el SDN ABAP's Mind Game, así que me toca publicarlo aquí también -;)

Hice un juego al estilo de Master Mind, que es donde la PC piensa en el orden de 5 números y nosotros tenemos que adivinar cual es...Claro que el sistema nos indica si las posiciones que ingresamos son correctas o incorrectas.

Primero comencé con un simple Dynpro...


Luego, escribí el código fuente...

REPORT ZABAP_MIND_GAME.

*&---------------------------------------------------------*
* CONSTANTS *
*&---------------------------------------------------------*
CONSTANTS: line_length TYPE i VALUE 254.

*&---------------------------------------------------------*
* TYPES *
*&---------------------------------------------------------*
TYPES: BEGIN OF ty_rand_table,
value(1) TYPE c,
END OF ty_rand_table.

*&---------------------------------------------------------*
* INTERNAL TABLES *
*&---------------------------------------------------------*
DATA: t_rand_table TYPE STANDARD TABLE OF ty_rand_table,
t_user_table TYPE STANDARD TABLE OF ty_rand_table,
t_game_lines TYPE TABLE OF tline-tdline,
data_rand TYPE REF TO data,
data_lines TYPE REF TO data.

*&---------------------------------------------------------*
* FIELD-SYMBOLS *
*&---------------------------------------------------------*
FIELD-SYMBOLS: <fs_rand_table> LIKE LINE OF t_rand_table,
<fs_user_table> LIKE LINE OF t_user_table,
<fs_rand_value> LIKE LINE OF t_rand_table.

*&---------------------------------------------------------*
* VARIABLES *
*&---------------------------------------------------------*
DATA: custom_container TYPE REF TO cl_gui_custom_container,
text_editor TYPE REF TO cl_gui_textedit,
w_ucomm TYPE sy-ucomm,
ran_int TYPE qf00-ran_int,
flag TYPE c,
counter TYPE c,
gv_line TYPE string,
button_count TYPE c,
xtext TYPE tline-tdline,
game_win TYPE string,
game_counter TYPE string.

DATA: message_one TYPE string,
message_two TYPE string,
message_three TYPE string,
message_four TYPE string,
message_five TYPE string.

DATA: gv_one TYPE c,
gv_two TYPE c,
gv_three TYPE c,
gv_four TYPE c,
gv_five TYPE c.

DATA: gv_flag_one TYPE c,
gv_flag_two TYPE c,
gv_flag_three TYPE c,
gv_flag_four TYPE c,
gv_flag_five TYPE c.

DATA: gv_user_one TYPE c,
gv_user_two TYPE c,
gv_user_three TYPE c,
gv_user_four TYPE c,
gv_user_five TYPE c.

*----------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------*
START-OF-SELECTION.
CALL SCREEN 0100.

*&---------------------------------------------------------*
*& Form call_editor *
*&---------------------------------------------------------*
FORM call_editor.

IF text_editor IS INITIAL.
CREATE OBJECT custom_container
EXPORTING
container_name = 'CUSTOM_CONTROL'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.

CREATE OBJECT text_editor
EXPORTING
wordwrap_mode =
cl_gui_textedit=>wordwrap_at_fixed_position
wordwrap_position = line_length
wordwrap_to_linebreak_mode = cl_gui_textedit=>true
parent = custom_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
others = 6.

CALL METHOD text_editor->set_readonly_mode
EXPORTING readonly_mode = 1.
ENDIF.

PERFORM get_randoms.

ENDFORM.

*&---------------------------------------------------------*
*& Form get_randoms *
*&---------------------------------------------------------*
FORM get_randoms.

CREATE DATA data_rand TYPE ty_rand_table.
ASSIGN data_rand->* TO <fs_rand_table>.

WHILE flag EQ space.
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING
ran_int_max = 5
ran_int_min = 1
IMPORTING
ran_int = ran_int
EXCEPTIONS
invalid_input = 1
OTHERS = 2.

READ TABLE t_rand_table ASSIGNING <fs_rand_value>
WITH KEY value = ran_int.
IF sy-subrc NE 0.
<fs_rand_table>-value = ran_int.
APPEND <fs_rand_table> TO t_rand_table.
counter = counter + 1.
IF counter EQ 5.
flag = 'X'.
ENDIF.
ENDIF.
ENDWHILE.

game_counter = 1.

ENDFORM. " get_randoms

*&---------------------------------------------------------*
*& Form validate_game *
*&---------------------------------------------------------*
FORM validate_game.

LOOP AT t_rand_table ASSIGNING <fs_rand_value>.
IF gv_one IS INITIAL.
gv_one = <fs_rand_value>-value.
ELSEIF gv_two IS INITIAL.
gv_two = <fs_rand_value>-value.
ELSEIF gv_three IS INITIAL.
gv_three = <fs_rand_value>-value.
ELSEIF gv_four IS INITIAL.
gv_four = <fs_rand_value>-value.
ELSEIF gv_five IS INITIAL.
gv_five = <fs_rand_value>-value.
ENDIF.
ENDLOOP.

CLEAR: gv_user_one,gv_user_two,gv_user_three,
gv_user_four,gv_user_five.

LOOP AT t_user_table ASSIGNING <fs_user_table>.
IF gv_user_one IS INITIAL.
gv_user_one = <fs_user_table>-value.
ELSEIF gv_user_two IS INITIAL.
gv_user_two = <fs_user_table>-value.
ELSEIF gv_user_three IS INITIAL.
gv_user_three = <fs_user_table>-value.
ELSEIF gv_user_four IS INITIAL.
gv_user_four = <fs_user_table>-value.
ELSEIF gv_user_five IS INITIAL.
gv_user_five = <fs_user_table>-value.
ENDIF.
ENDLOOP.

CLEAR: game_win.

IF gv_one EQ gv_user_one.
message_one = 'First is Ok!'.
game_win = game_win + 1.
ELSE.
message_one = 'First is Wrong!'.
game_win = game_win - 1.
ENDIF.
IF gv_two EQ gv_user_two.
message_two = 'Second is Ok!'.
game_win = game_win + 1.
ELSE.
message_two = 'Second is Wrong!'.
game_win = game_win - 1.
ENDIF.
IF gv_three EQ gv_user_three.
message_three = 'Third is Ok!'.
game_win = game_win + 1.
ELSE.
message_three = 'Third is Wrong!'.
game_win = game_win - 1.
ENDIF.
IF gv_four EQ gv_user_four.
message_four = 'Forth is Ok!'.
game_win = game_win + 1.
ELSE.
message_four = 'Forth is Wrong!'.
game_win = game_win - 1.
ENDIF.
IF gv_five EQ gv_user_five.
message_five = 'Fifth is Ok!'.
game_win = game_win + 1.
ELSE.
message_five = 'Fifth is Wrong!'.
game_win = game_win - 1.
ENDIF.

IF game_win EQ 5.
CLEAR: message_one,message_two,message_three,
message_four,message_five.
message_one = 'You win!'.
CONCATENATE 'In' game_counter 'tries'
INTO message_two SEPARATED BY space.
ELSE.
game_counter = game_counter + 1.
CLEAR: gv_flag_one,gv_flag_two,gv_flag_three,
gv_flag_four,gv_flag_five,sy-ucomm.
ENDIF.

ENDFORM. " validate_game

*&---------------------------------------------------------*
*& Module STATUS_0100 OUTPUT *
*&---------------------------------------------------------*
MODULE status_0100 OUTPUT.

SET PF-STATUS 'MAIN'.
SET TITLEBAR 'TITLE'.

IF flag EQ space.
PERFORM call_editor.
ELSE.

LOOP AT SCREEN.
IF screen-name EQ 'ONE' AND gv_flag_one EQ 'X'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'TWO' AND gv_flag_two EQ 'X'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'THREE' AND gv_flag_three EQ 'X'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'FOUR' AND gv_flag_four EQ 'X'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
IF screen-name EQ 'FIVE' AND gv_flag_five EQ 'X'.
screen-invisible = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.

IF button_count EQ 5.

CLEAR button_count.

SHIFT gv_line LEFT DELETING LEADING space.

SPLIT gv_line AT space INTO TABLE t_user_table.

PERFORM validate_game.

xtext = gv_line.
APPEND xtext TO t_game_lines.

CLEAR gv_line.

CALL METHOD text_editor->set_text_as_r3table
EXPORTING table = t_game_lines.

ENDIF.
ENDIF.

ENDMODULE. " STATUS_0100 OUTPUT

*&---------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT *
*&---------------------------------------------------------*
MODULE user_command_0100 INPUT.

w_ucomm = sy-ucomm.

CASE w_ucomm.
WHEN 'BACK' OR 'CANCEL' OR 'EXIT'.
SET SCREEN 0.
EXIT.
WHEN 'ONE'.
CONCATENATE gv_line '1' INTO
gv_line SEPARATED BY space.
button_count = button_count + 1.
gv_flag_one = 'X'.
WHEN 'TWO'.
CONCATENATE gv_line '2' INTO
gv_line SEPARATED BY space.
button_count = button_count + 1.
gv_flag_two = 'X'.
WHEN 'THREE'.
CONCATENATE gv_line '3' INTO
gv_line SEPARATED BY space.
button_count = button_count + 1.
gv_flag_three = 'X'.
WHEN 'FOUR'.
CONCATENATE gv_line '4' INTO
gv_line SEPARATED BY space.
button_count = button_count + 1.
gv_flag_four = 'X'.
WHEN 'FIVE'.
CONCATENATE gv_line '5' INTO
gv_line SEPARATED BY space.
button_count = button_count + 1.
gv_flag_five = 'X'.
ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

Finalmente, tomé algunos pantallazos -;)




Espero que les guste -:)

Saludos,

Blag.

Monday, April 28, 2008

Ein Ami comes to Lippstadt


El sábado recogí de la oficina de correos el libro de mi amigo Craig Cmehil titulado Ein Ami comes to Lippstadt que vendría a significar Un Norte Americano viene a Lippstadt.


El libro, es bastante interesante, puesto que cuenta en versión resumida como Craig salió de Estados Unidos para irse a Alemania. A modo de historias cortas nos damos cuenta de como las costumbres y modo de vida pueden cambiar tanto de un país a otro o de un continente a otro...Realmente disfruté mucho leyendo el libro, así que les recomiendo que lo compren -;)

Saludos,

Blag.

Wednesday, April 23, 2008

Mis discos favoritos de Punk


Llevo escuchando Punk desde hace 16 años...Así que está es una pequeña lista gráfica de mis discos favoritos de todos los tiempos -;)


Never Mind the Bollocks - Sex Pistols



Fresh Fruit for Rotting Vegetables - Dead Kennedys



Against the Grain - Bad Religion



Are young and good looking - The Dwarves



White Trash, Two Heebs and a Bean - NOFX



Famous Monsters - Misfits


Saludos,

Blag.

Tuesday, April 22, 2008

Bienvenida Kiarita!!!


Algunos de ustedes deben saberlo...otros seguramente no...Pero ya soy padre -:')

Mi hija Kiara nació el Jueves 17 de Abril pesando 2,854 kilos y midiendo 48.5 centimetros...No expresar la alegría cuando la vi por primera vezy cuando la sostuve en mis brazos...No hay nada que se compare con la experiencia de ser un padre...

Marilyn Pratt escribió un emotivo blog en el SCN para celebrar este evento SAP Community Network: An Extended Family To Some

Les dejo un par de fotos -:)




Saludos,

Blag.

Wednesday, April 16, 2008

Quien está mal...SAP o los negocios?


Revisando el SAP Facts encontré uno realmente muy bueno... Fact
SAP doesn't need enhanced. It is your business process that is wrong.

Traduciendo...
SAP no necesita ser mejorado. Es tu proceso de negocio el que está mal.

Saludos,

Blag.

Flex 4?


Al parecer, la gente de Adobe no descanza...A pesar de que hace relativamente poco tiempo lanzaron Flex 3 ahora están trabando en Flex 4 código clave Gumbo.

Definitivamente estas son buenas noticias, Flex me encanta...Es versatil, fácil de programar y realmente ha redefinido las páginas web...Pero yo digo...Uno se compró Flex 2...Al poco tiempo tuvo que actualizarse a Flex 3 y a finales de año podría actualizar a Flex 4 Beta? Además...Adobe no tiene tiendas en Perú...Por lo cual por más que quiera no podría comprarlo -:(

En fin...Supongo que no podemos detener la tecnología solamente por el hecho de que avanza más rápido de lo que nosotros aprendemos...

Saludos,

Blag.

La caída de Windows?


Estuve leyendo un post bastante interesante ahora en la mañana La evolución tecnológica marcaría el final de Windows

Según el artículo, Microsoft no está haciendo nada nuevo, solamente "mejorando" lo que ya tiene...

Veamos...Yo he utilizando una gran variedad de Sistemas Operativos a lo largo de mi vida y mi carrera...

* Windows (3.1,95,98,ME,NT,2003 Server,XP,Vista)
* Novell Netware
* Mac OS (Varias versiones incluida OS X)
* Linux (RedHat, Suse, Knoppix, Slax)

Algunos han sido buenos, otros no tanto, otros eran casi copias de los anteriores y otros simplemente distribuciones.

En el caso específico de Windows, antes del XP, windows era malo, muy malo...Con XP para mi todo cambió puesto que me encanta...Con Vista...Tuvieron un retroceso...

Cual es el problema? Muy simple...Una cosa es tomar un sistema operativo sólido como XP y mejorarlo...Pero otra cosa muy distinta es tomar XP y utilizar su código fuente para crear algo totalmente nuevo...

Yo no digo que Microsoft debería haber escrito Vista de cero...No es necesario reinventar la rueda...Pero repitiendo lo que ya dije, tomar el código existente para crear algo nuevo, simplemente no funciona...

Los que hayan utilizado Vista, saben que muchos de los programa que usamos actualmente no son compatibles, pero aún cuando hablamos de los Drivers...En muchos casos no basta con formatear el disco para instalar otro SO, puesto que Vista es un sistema que no se deja matar facilmente...Lo que queda es crear una partición o utilizar el WMWare o el Virtual PC para instalar un XP dentro de Vista...

Lo mismo pasó como Windows ME...Windows 98 logró ser bueno luego de miles de Service Packs...Pero el ME fué totalmente una desgracias y verguenza para todos...

Se habrán dado cuenta también de que muchas empresas están apostando seriamente por la web...Versiones on-line de Photoshop, Google Docs, Zoho y demás ofrecen suites de ofimatica totalmente gratuitas y vía web...No más instalaciones ni espacio en disco duro...Pero que hace Microsoft? Me parece que hay un Office On-Line...Pero quien lo usa? Está hecho con ASP y Ajax? O están aprovechando Silverlight así como Adobe hace con Flex y AIR?

El problema con Microsoft es que practimante nos obliga a comprar Vista, puesto la mayoría de Laptops viene con Vista instalado por defecto...Gracias a dios mi LG T1 vino con XP...De otra manera, no la habría comprado -;)

Saludos,

Blag.

Cuanto meses de vida tienes?


Alguien en los foros de Scripting Languages del SCN preguntó como podía hacer en PHP para determinar la edad en meses de una persona...Esto es bastante sencillo de hacer, pero como es obvio...Todos hemos sido principiantes alguna vez -:)

Ahí les va el código por si a alguien le sirve...


<?php
if(isset($_POST['Birthday']))
{
$Birthday = $_POST['Birthday'];
list( $day, $month, $year ) = split('[.]',$Birthday);
$year = (date("Y") - $year) * 12;
$month += $year;
echo "You are $month months old";
}
else
{
echo "Please enter your birthday in dd.mm.yyyy format!";
}
?>

<html>
<head></head>
<body>
<form action="<?php print $PHP_SELF?>" method="post">
Birthday: <input type="text" name="Birthday"><br>
<input type="submit" value="Submit">
</form>
</form>
</body>
</html>


Saludos,

Blag.

Renombrar archivos en Ruby - Parte 2


Si han leído mis post anteriores:

Renombrar archivos en Ruby y Array.sort en Ruby

Sabrán que hice un programa para renombrar archivos en Ruby...Y además que el Array.sort no funciona bien con valores alfanuméricos...

Esto significa que la primera versión de mi programa no funciona -:( Es decir, funciona la primera vez, pero la segunda por el error en el Array.sort comienza a eliminar archivos...Algo que nadie quiere que pase...A mi me pasó -:(

En fín...Luego de algunos cambios y varias pruebas, tengo la versión final del programa que ahora si funciona sin ningún problema -;)

$Folder = Array.new
$Files = Array.new
$counter = 0
$count = 0

print("Ingrese la carpeta: ")
$Dir_Text = gets.chop!
print("Ingrese la extension: ")
$Ext_Text = gets.chop!
$Dir_Text.sub!("\\","\\ \\").delete!(" ")

Dir.foreach($Dir_Text) {|x| $Folder.push(x)}

for file in $Folder
  $long = file.length - 3
  if(file[$long,3] == $Ext_Text)
  $Full_File = $Dir_Text + "\\\\" + file
  $Files.push($Full_File)
  end
end

for file in $Files
  $count = 0
  for do_file in $Files
    $len_count = $Files[$count].length
    $len_counter = $Files[$counter].length
    $last_count = $Files[$count].rindex("\\") + 1
    $len_count -= $last_count
    $len_counter -= $last_count
    if $Files[$count].slice($last_count,$len_count).to_i > 
       $Files[$counter].slice($last_count,$len_counter).to_i
      $aux = $Files[$count]
      $Files[$count] = $Files[$counter]
      $Files[$counter] = $aux
    end
  $count += 1 
  end  
  $counter += 1
end

$counter = 0
for file in $Files
  $counter += 1
  $New_File = $Dir_Text + "\\\\" + $counter.to_s + "." + $Ext_Text
  File.rename(file,$New_File)
end

puts "#{$counter} archivos convertidos"

Ruby es un lenguaje excelente, pero como siempre tiene sus pequeños detalles, que debemos investigar y probar -:)

Saludos,

Blag.

Como dañar aún más tu reputación en el SCN


Nuevamente Marilyn Pratt evangelista del BPX ha escrito un blog dedicado a la falta de respeto que tienen algunas personas por la comunidad.

How to Further Damage Your SAP Community Reputation


Cuando uno plagea el contenido de un blog, oculta su identidad o postea comentarios por el simple hecho de quedar bien...No solo daña su reputación sino que también daña la reputación de la empresa para la cual trabaja.

Lastimosamente, en el SCN se han visto muchos casos como estos en los últimos días...Si bien siempre han estado allí, la comunidad está comenzando a darse cuenta de que esto no puede permitirse bajo ninguna circunstacia.

Una regla de oro que me dijo Marilyn mientras conversamos sobre un tema parecido fué...

Uno tiene que ser on-line como es off-line

Es decir, si uno es bueno, amistoso, generoso mientras se encuentra on-line, uno debe ser exactamente igual en persona...Puesto que esto es una muestra de honestidad e integridad.

Saludos,

Blag.

Friday, April 11, 2008

Array.sort en Ruby


La propiedad SORT para los Arrays en Ruby, funciona muy bien, pero solo cuando se trata de valores numéricos...Pero que pasa con los alfanuméricos? Pues falla miserablemente...

Lo que debemos hacer, es nuestro propio algoritmo de burbuja y convertir los valores a enteros antes del ordenamiento.

Vean el código fuente y la imagen del resultado...


$Files = Array.new

$Files = ["1.txt","10.txt","2.txt","3.txt","4.txt","11.txt",
"12.txt","5.txt","6.txt","7.txt","8.txt","9.txt"]

$count = 0
$counter = 0

$Files.sort!

for file in $Files
puts file
end

puts "--------------------------"

for file in $Files
$count = 0
for do_file in $Files
if $Files[$count].to_i > $Files[$counter].to_i
$aux = $Files[$count]
$Files[$count] = $Files[$counter]
$Files[$counter] = $aux
end
$count += 1
end
$counter += 1
end

for file in $Files
puts file
end



Como pueden ver, el primero es el SORT de Ruby y el segundo es mi algoritmo -;)

Saludos,

Blag.

Wednesday, April 09, 2008

The Grid - La nueva era de Internet?


Recuerdo que cuando era chico...No existía Internet...Obvio no? -:P Bueno...la primera vez que ví Internet fué cuando tenía unos 15 o 16 años, en la facultad de ingeniería de la UNAM en México, DF.

La verdad es que aunque tenía mi Mac (Creo que era una SE)...No tenía idea de lo que era Internet...Un amigo me dijo
Voy a conectarme a una universidad en Estados Unidos para descargar una animación
En ese momento pensé...
Deben tener una conexión LAN bastante grande...

Al cabo de una hora, nos fuimos porque la conexión era realmente bastante pobre -:(

Ahora por supuesto la conexión a Internet es bastante veloz, llegando a niveles muy altos especialmente en conexiones inalámbricas (En Las Vegas la conexión del hotel era una verdadera bala).

En fín...Nos estamos aquí para recordar sino para innovar...En estos días se ha estado comentando acerda de The Grid que promete ser una nueva Internet, 1000 veces más veloz...En serio...Eso dicen -:)

La verdad es que hace un buen tiempo hablaron del Internet 2 que hasta ahora no existe...El Internet planetario que tampoco existe y el Internet utilizando el cableado eléctrico que parece ser la consigna de The Grid...Por lo menos de ahi tomaron su nombre...

Yo prefiero mantenerme esceptico hasta ver algún avance tangible...

Saludos,

Blag.

Renombrar archivos en Ruby


Lo bueno de ser programador, es que cuando necesitas algo, no tienes que buscarlo, comprarlo o descargarlo...Puedes programarlo -;)

Eso justamente lo que hice ayer -:P Quería tener un renombrador de archivos en batch...Por lo tanto decidí que lo mejor era hacerlo yo mismo...Tenía por supuesto muchos lenguajes de programación entre los cuales escoger...Pero últimamente mi amor por Ruby ha regresado, así que esto es lo que hice -:)

$Folder = Array.new
$Files = Array.new
$counter = 0

print("Ingrese la carpeta: ")
$Dir_Text = gets.chop!
print("Ingrese la extension: ")
$Ext_Text = gets.chop!
$Dir_Text.sub!("\\","\\ \\").delete!(" ")

Dir.foreach($Dir_Text) {|x| $Folder.push(x)}

for file in $Folder
$long = file.length - 3
if(file[$long,3] == $Ext_Text)
$Full_File = $Dir_Text + "\\\\" + file
$Files.push($Full_File)
end
end

for file in $Files
$counter += 1
$New_File = $Dir_Text + "\\\\" + $counter.to_s +
"." + $Ext_Text
File.rename(file,$New_File)
end

puts "#{$counter} archivos convertidos"

Lo que hace, es simplemente es leer una carpeta, tomar los archivos con la extensión que queremos y renombrarlos numericamente.

Les dejo algunas imagenes para que lo vean en funcionamiento -;)





Bueno...las imagenes no se ven muy bien... -:(

Saludos,

Blag.

SAP Facts...Sigue activo y mejorando -:)


Hace algún tiempo hablé sobre SAP Facts un sitio donde se envían cosas que no sabíamos sobre SAP.

Gracias a un post de Dagfinn Parnas en Twitter me di cuenta de que el sitio sigue funcionando y nuevas cosas que no sabíamos sobre SAP están siendo agregadas..

Aquí le dejo algunas de las nuevas que más me han gustado...

* The Da Vinci Code can only be deciphered using ABAP

* Do you know why Satan became evil? His SAP system went down...

* Its believed that at the time of enlightenment, Buddha was reading SAP Facts.

* When they say "Nothing is perfect", they are not talking about SAP.

Saludos,

Blag.

Tuesday, April 08, 2008

Mi Ranking en el SDN


Cada cierto tiempo reviso mi ranking en el SDN para ver como va mi rendimiento. Al parecer voy bastante bien -;)

Top Contributors --> Puesto 37 (Considerando que somos más de 1'000,000 de miembros en todo el mundo) con actualmente 9,661 puntos.

Scripting Languages --> Puesto 1.

ABAP --> Puesto 37.

Gracias a esto, lidero la tabla de miembros en America Latina -;)

Saludos,

Blag.

Siganme en Twitter


Si tienen una cuenta en Twitter pueden seguirme a mi o recibir las actualizaciones del blog.


Y si no tienen una cuenta en Twitter...Que están esperando para crearla?

Saludos,

Blag.

Monday, April 07, 2008

SearchMe...Redifiniendo las búsquedas web...


SearchMe es el nombre de un nuevo servicio de búsqueda web basado en Flex...Pero no crean que es como lo demás...SearchMe es completamente innovador, sino, miren las imagenes...




No solo nos muestra las imagenes de las páginas encontradas en la búsqueda, sino que también nos permite hacer un filtro más específico buscando solamente en Blogs, o en sitios financieros, de negocios, etc.

El servicio está actualmente en Open Beta, es decir, todos pueden crearse una cuenta, probar el servicio y escribirles para hacer comentarios o recomendaciones. Yo les escribí y me contestaron bastante rápido y sobre todo fueron muy atentos y agradecidos por mi mail -:)

Así que no esperen más y prueben SearchMe!

Saludos,

Blag.

Plagio en el SCN...


Si bien no es algo que se ve muy seguido...Los actos de plagio en el SCN son conocidos...Bloggers novatos copian y pegan el contenido de la ayuda de SAP, de otros blogs o inclusive de mensajes del foro...Por supuesto, afirman que ellos son los autores de dicho contenido...

El plagio es una forma de robo, puesto que se roba una idea. Y eso es bastante malo, puesto que no solo pone en riesgo "la fama" del blogger sino también de la compañía a la que representa.

Marilyn Pratt ha escrito un excelente blog haciendo un llamado a la comunidad para que este tipo de acciones terminen definitivamente How to Lower Your Status in The SAP Community.

Espero que luego de leer esto, las personas estén más atentas sobre el contenido de los blogs y lo más importante...Si van a copiar algo, incluyan el enlace al documento original, mencionen el nombre del autor o simplemente digan que ustedes no son los autores verdaderos.

Saludos,

Blag.

¿Una nueva esparanza para el conector PHP-SAP?


Al parecer Cal Evans de Zend Developer Zone está interesado en tomar la posta y actualizar el conector de PHP-SAP.
Pueden leer más sobre esto en el blog de Nigel James PHP Connector? A New Hope

Saludos,

Blag.

Blag's Flex 3 Compiler!!!


Luego de algunos cuantos ajustes...Mi compilador de Flex 3 está terminado...No como ejecutable -:( Pero de todos modos funciona bien -:D
Veamos el código fuente...

require 'rubygems'
require 'wx'

Btn_ChooseFolder = 1000
Btn_CompileSWF = 1001
Btn_TestAIR = 1002
Btn_CompileAIR = 1003
$config_file = File.dirname(__FILE__) << "\\Flex_Dir.txt"
$config = IO.readlines($config_file)
SWF = $config[0] + "amxmlc.bat"
AIRTest = $config[0] + "adl.exe"
AIR = $config[0] + "adt.bat"

$Files = Array.new
$Flex_Files = Array.new
$App_Files = Array.new
$XML_File = Array.new
$exits_xml = false

class Blag_Flex < Wx::Frame
def initialize(title)
super(nil, :title => title, :size => [ 400, 300 ])

panel = Wx::Panel.new(self)
m_Folder = Wx::StaticText.new(panel, -1, "Project Folder",Wx::Point.new(10, 12),Wx::Size.new(80, 20))
@mFolder = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 10),Wx::Size.new(170, 20))
#----------------------------------------------------------------------------------------------------------
m_Id = Wx::StaticText.new(panel, -1, "Id",Wx::Point.new(20, 32),Wx::Size.new(80, 20))
@mId = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 30),Wx::Size.new(170, 20))
m_Version = Wx::StaticText.new(panel, -1, "Version",Wx::Point.new(20, 52),Wx::Size.new(80, 20))
@mVersion = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 50),Wx::Size.new(170, 20))
m_Filename = Wx::StaticText.new(panel, -1, "FileName",Wx::Point.new(20, 72),Wx::Size.new(80, 20))
@mFilename = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 70),Wx::Size.new(170, 20))
m_Content = Wx::StaticText.new(panel, -1, "Content",Wx::Point.new(20, 92),Wx::Size.new(80, 20))
@mContent = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 90),Wx::Size.new(170, 20))
m_Visible = Wx::StaticText.new(panel, -1, "Visible",Wx::Point.new(20, 112),Wx::Size.new(80, 20))
@mVisible = Wx::TextCtrl.new(panel, -1, "true",Wx::Point.new(100, 110),Wx::Size.new(170, 20))
m_SystemChrome = Wx::StaticText.new(panel, -1, "SystemChrome",Wx::Point.new(20, 132),Wx::Size.new(80, 20))
@mSystemChrome = Wx::TextCtrl.new(panel, -1, "none",Wx::Point.new(100, 130),Wx::Size.new(170, 20))
m_Transparent = Wx::StaticText.new(panel, -1, "Transparent",Wx::Point.new(20, 152),Wx::Size.new(80, 20))
@mTransparent = Wx::TextCtrl.new(panel, -1, "true",Wx::Point.new(100, 150),Wx::Size.new(170, 20))
m_Width = Wx::StaticText.new(panel, -1, "Width",Wx::Point.new(20, 172),Wx::Size.new(80, 20))
@mWidth = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 170),Wx::Size.new(170, 20))
m_Height = Wx::StaticText.new(panel, -1, "height",Wx::Point.new(20, 192),Wx::Size.new(80, 20))
@mHeight = Wx::TextCtrl.new(panel, -1, "",Wx::Point.new(100, 190),Wx::Size.new(170, 20))
#----------------------------------------------------------------------------------------------------------
btnChooseFolder = Wx::Button.new(panel, Btn_ChooseFolder, "Choose", Wx::Point.new(280, 10),Wx::Size.new(80, 20))
btnCompileSWF = Wx::Button.new(panel, Btn_CompileSWF, "Compile SWF", Wx::Point.new(10, 220),Wx::Size.new(80, 20))
btnTestAIR = Wx::Button.new(panel, Btn_TestAIR, "Test AIR", Wx::Point.new(100, 220),Wx::Size.new(80, 20))
btnCompileAIR = Wx::Button.new(panel, Btn_CompileAIR, "Compile AIR", Wx::Point.new(190, 220),Wx::Size.new(80, 20))

evt_button(Btn_ChooseFolder) {|event| onChooseFolder(event,panel) }
evt_button(Btn_CompileSWF) {|event| onCompileSWF(event) }
evt_button(Btn_TestAIR) {|event| onTestAIR(event) }
evt_button(Btn_CompileAIR) {|event| onCompileAIR(event) }
end
end

def GenerateXML()
$XML_File.push("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
$XML_File.push("<application xmlns=\"http://ns.adobe.com/air/application/1.0\">")
$XML_File.push("<id>" + @mId.get_value + "</id>")
$XML_File.push("<version>" + @mVersion.get_value + "</version>")
$XML_File.push("<filename>" + @mFilename.get_value + "</filename>")
$XML_File.push("<initialWindow>")
$XML_File.push("<content>" + @mContent.get_value + ".swf</content>")
$XML_File.push("<visible>" + @mVisible.get_value + "</visible>")
$XML_File.push("<systemChrome>" + @mSystemChrome.get_value + "</systemChrome>")
$XML_File.push("<transparent>" + @mTransparent.get_value + "</transparent>")
$XML_File.push("<width>" + @mWidth.get_value + "</width>")
$XML_File.push("<height>" + @mHeight.get_value + "</height>")
$XML_File.push("</initialWindow>")
$XML_File.push("</application>")

$Dir_Text = @mFolder.get_value
$Dir_Text = $Dir_Text << "\\" << @mFilename.get_value << "-app.xml"

$output = File.new($Dir_Text,"w")

$XML_File.each {|line| $output.write("#{line}\n")}
$output.close
end

def onChooseFolder(event,panel)
dir_home = Wx::get_home_dir()

dialog = Wx::DirDialog.new(panel, "Choose a folder", dir_home)

if dialog.show_modal() == Wx::ID_OK
@mFolder.set_value(dialog.get_path())
end
end

def onCompileSWF(event)
$Dir_Text = @mFolder.get_value
Dir.foreach($Dir_Text) {|x| $Files.push(x)}

for $file in $Files
$long = $file.length - 4
$long_xml = $file.length - 8
if($file[$long,4] == 'mxml')
$file = $Dir_Text << "\\" << $file
$Dir_Text = @mFolder.get_value
$Flex_Files.push($file)
end
if($file[$long_xml,8] == '-app.xml')
$Dir_Text = @mFolder.get_value
$file = $Dir_Text << "\\" << $file
$Dir_Text = @mFolder.get_value
$App_Files.push($file)
$exits_xml = true
end
end

$Cert = @mFolder.get_value
$Cert = $Cert << "\\sampleCert.pfx"
system(AIR,"-certificate","-cn","SelfSigned","1024-RSA",$Cert,"samplePassword")

for $flex_file in $Flex_Files
system(SWF,"-use-network=false",$flex_file)
end

if($exits_xml == false)
GenerateXML()
end
end

def onTestAIR(event)
if($App_Files.empty? != true)
for $app_file in $App_Files
system(AIRTest,$app_file)
end
else
$Dir_Text = @mFolder.get_value
Dir.foreach($Dir_Text) {|x| $Files.push(x)}

for $file in $Files
$long_xml = $file.length - 8
if($file[$long_xml,8] == '-app.xml')
$App_Name = $file[$long_xml,8]
$Dir_Text = @mFolder.get_value
$file = $Dir_Text << "\\" << $file
$Dir_Text = @mFolder.get_value
$App_Files.push($file)
end
end
for $app_file in $App_Files
system(AIRTest,$app_file)
end
end
end

def onCompileAIR(event)
if(@mFilename.empty? == true)
$Dir_Text = @mFolder.get_value
Dir.foreach($Dir_Text) {|x| $Files.push(x)}

for $file in $Files
$long_xml = $file.length - 8
if($file[$long_xml,8] == '-app.xml')
$App_Name = $file[$long_xml,8]
$Dir_Text = @mFolder.get_value
$file = $Dir_Text << "\\" << $file
$Dir_Text = @mFolder.get_value
$App_Files.push($file)
end
end
for $app_file in $App_Files
$file = IO.readlines($app_file)
$pos = $file[4].rindex("<") - 1
$str_file = $file[4]
$str_file = $str_file[10..$pos]
$FileName = $str_file

$App_Name_AIR = $FileName + ".air"
$Dir_Text = $FileName + "-app.xml"
$App_Name_SWF = $FileName + ".swf"

$Cert = @mFolder.get_value
$Cert = $Cert << "\\sampleCert.pfx"
Dir.chdir(@mFolder.get_value)
system(AIR,"-package","-storetype","pkcs12","-storepass","samplePassword","-keystore",$Cert,$App_Name_AIR,
$Dir_Text,$App_Name_SWF)
end
else
$App_Name_AIR = @mFilename.get_value + ".air"
$Dir_Text = @mFilename.get_value + "-app.xml"
$App_Name_SWF = @mFilename.get_value + ".swf"
$Cert = @mFolder.get_value
$Cert = $Cert << "\\sampleCert.pfx"
Dir.chdir(@mFolder.get_value)
system(AIR,"-package","-storetype","pkcs12","-storepass","samplePassword","-keystore",$Cert,$App_Name_AIR,
$Dir_Text,$App_Name_SWF)
end
end

Wx::App.run do
frame = Blag_Flex.new("Blag's Flex 3 Compiler")
frame.show
end


El programa necesita de una archivo llamado Flex_Dir que contenga la ruta de instalación del Flex 3 SDK


C:\\Programacion\\flex_sdk_3\\bin\\


Ahora, las imágenes -:)







Saludos,

Blag.

Friday, April 04, 2008

Spock...Buscando personas


Con la gran cantidad de contenido que nos ofrece Internet, no es novedad que surgan nuevos servicios de búsqueda, aunque Spock es un poco fuera de los común. Spock permite buscar personas...Sus páginas web, fotos, etc.

Aunque no es nuevo, este servicio aún está en Beta, aunque funciona bastante bien.




Saludos,

Blag.

Twingly...Buscando en blogs...


Twingly es un servicio de búsqueda que a diferencia de otros, busca solamente en blogs. Lo que es bastante interesante, aunque ya Technorati ofrece algo similar.

Que hace interesante a Twingly? Bueno, dicen que es un buscador sin SPAM (Lo cual ya es bastante bueno), además de que ofrece bastantes filtros para optimizar la búsqueda.

El servicio aún está en Beta, pero pueden solicitar una invitación (En la página) para que lo prueben ustedes mismos.



Saludos,

Blag.

Wednesday, April 02, 2008

Blag's Flex 3 Compiler...La idea


Como algunos de ustedes saben, tengo el Flex Builder 2 original gracias a Thomas Jung.

Por lo tanto, lo obvio es que me actualice a Flex 3 pero resulta que como Adobe no tiene ni tienda ni oficina en Perú...Entonces no se puede -:(

Felizmente, podemos descargar el Flex 3 SDK de manera gratuita...Contamos con todas la herramientas para generar aplicaciones AIR...Pero necesitamos utilizar la línea de comandos...Y si tenemos varios proyectos, se vuelve un poco tedioso tener que estar llamando al CMD cada vez que queremos deployar nuestra aplicación...

Es por eso que utilizando Ruby y WxRuby contruí un pequeño GUI para automatizar el proceso.

Simplemente debemos escoger la carpeta donde están nuestros archivos, llenar los datos para el archivo *-app.xml y presionar en orden los 3 botones con los que cuenta el programa.

* Compile SWF
* Test AIR
* Compile AIR

El programa está listo y funcionando, pero aún tengo que incluir el icono y generarlo como ejecutable para empezar a distribuirlo. Que será seguramente mañana o pasado...Así que estén atentos -;)

Saludos,

Blag.

Tuesday, April 01, 2008

La película del SDN!


Aunque no lo crean...El SDN va a hacer una película! De acuerdo con el blog de Moya Watson Announcing "Community: THE MOVIE!" esta sería la lista de los papeles principales...

* Craig Cmehil -- interpretado por John Travolta
* Marilyn Pratt -- interpretada por Tilda Swinton
* Mark Finnern -- interpretado por Sting
* Blag -- interpretado por Benicio Del Toro

Leyeron bien? Sip...Dice Blag -:D Así que eso significa no solo que Benicio Del Toro va a tener que captar toda mi escencia Geek, sino que también, soy uno de los personajes principales del SDN -:'( Me emociono -:P

...Claro...Como comprenderán, todo esta es una broma que nos ha jugado Moya -:D Puesto que hoy día es el April's Fool Day. Si esto fuera verdad, el actor que tendría que dar vida a mi persona, no podría ser otro más que Nicholas Cage...No creen? -;)

Saludos,

Blag.