The Terminator question: Scientists downplay the risks of superintelligent computers

Superintelligent computers could outsmart humans, but scientists largely dismiss any parallels to Terminator and a dystopian “rise of the machines” (much like the hapless scientists in the movies, it must be noted). The struggle between the thirst for research and the anxiety over the consequences was clear from “Are Super Intelligent Computers Really A Threat to Humanity?” a panel discussion held at the Information Technology and Innovation Foundation Tuesday morning.

The risks of rogue machinery are not far off from the cautionary tales played out in movies including Metropolis, 2001: A Space Odyssey, Terminator of course, and most recently, Ex Machina. According to Stuart Russell of U.C. Berkeley, “if the system is better than you at taking into account more information and looking further ahead into the future, and it doesn’t have the exactly the same goals as you…then you have a problem.” A superintelligent computer could avoid being shut down by its creators, and that’s when people might lose control of the machine, Russell warned.

Robert Atkinson, president of the Information Technology and Innovation Foundation, noted how computers were already captivating humans through interactions with personal digital assistants, such as Apple’s Siri. “I looked at how my daughter interacts with Siri. She’s 9 years old. She really thinks Siri is real,” Atkinson said—and Siri is still a very limited technology.

By the time computers can outsmart people, it’ll likely be too late to do anything about it. “Breakthroughs could be happening at any time,” warned Russell.

Here’s the paradox: Even the most pessimistic scientists on the panel did not want to stop research on superintelligent computers, even if it could mean trouble for human beings. Russell wanted research to continue, but with the possibility of halting before things got out of hand. “It seems to me that we need to look at where this road is going. Where does it end? And if it ends somewhere we don’t like, then we need steer it to a different direction,” he said. Atkinson agreed, saying that if the risk is too high, the benefit, no matter how important, should be turned back.

Other scientists on the panel took a less alarmist view. Ronald Arkin, an associate dean in the College of Computing at Georgia Tech, wanted scientists to push forward. “If we don’t fund the basic research, there’s no basic sense of being worried about safety issues at this point of time,” he argued.

Manuela Veloso, a professor at Carnegie Mellon University, said moving into the world of artificial intelligence is no different than other advances in computing. “We just have to sample the world,” she said, “we have to build trust, we have to use, and eventually things become familiar to us.”

“It will be a shame for humans who are so intelligent to not make good use of this technology,” Veloso said.

Are you worried that superintelligent computers will take over the world? Or do you think they could do a better job than humans? Let us know in the comments.

Source: PCWorld

Reconstruyendo una Leyenda

Existe la posibilidad de reconstruir el “Monitor Huáscar”?, con los planos originales, los materiales y las mismas técnicas de construcción de la época. Que significa esto? pues nada más y nada menos que recuperar el símbolo que representa los más altos valores que fortalecen la integridad de una nación.

sh32012-07-0900-04-32-67a

En vista que no existe la remota intención de los gobernantes de turno del país que se apoderó del navío, de realizar un acto de reconciliación que significa el devolver lo que consideran un trofeo a quienes que por lo contrario creen que es un legado valioso de sus antepasados que prácticamente se convirtió en una “Leyenda”.

A partir de ello tendremos por un lado el “Monitor Huáscar” navegando por el “Mar de Grau” como siempre debió haberlo hecho y por el otro un país que perdió la oportunidad de mejorar su imagen con un gesto de desprendimiento tan mínimo.

Está asegurado el auto financiamiento del proyecto con el calendario anual de visitas a todos los puertos de la costa Peruana.

Vacas más productivas gracias a Tv LED?

Un agricultor decidió equipar su granero con televisores LED. Esta convencido que las vacas se vuelven más felices y productivas si ven películas con campos verdes jugosos. Así que puso un bucle sin fin de campos verdes alpinos suizos reconocidos del mundo, además tiene el LED más delgado del mercado. Ahora entran en las estadísticas para medir los resultados y se comparan entre dos grupos de vacas.

Cows TV

Windows 10 será libre para los piratas?

Uno de los ejecutivos de Microsoft dijo que la compañía no ofrecerá Windows 10 de forma gratuita a los que no tienen licencias legítimas de software de Microsoft, ya que la empresa había parecido decir otra cosa.

squeleton

Terry Myerson, vicepresidente ejecutivo de sistemas operativos de Microsoft, escribió que la compañía ofrecerá una alternativa “muy atractiva” a aquellos que deseen actualizar desde lo que llamó un sistema operativo Windows en un “estado no original” a Windows 10. Pero, dijo, no va a ser libre.

“Si bien nuestra oferta gratuita para actualizar a Windows 10 no se aplicará a los dispositivos Windows no original, y, como siempre lo hemos hecho, vamos a seguir para ofrecer a los clientes de Windows 10 que ejecuta dispositivos en un estado no original”, “Además, en colaboración con algunos de nuestros socios OEM valorados, estamos planeando una oferta muy atractiva de actualización a Windows 10  a sus clientes que ejecutan uno de sus dispositivos más antiguos en un estado no original.”

Si Windows piensa que el software no es original, se creará una “marca de agua” en la máquina, notificar a los clientes que están en ejecución una copia ilegítima de software.Si eso ocurre, un cliente ya sea que tenga que actualizar o devolver la máquina, suponiendo que sólo la compraron a el propio fabricante.

“Non-Genuine Windows tiene un alto riesgo de malware, el fraude, la exposición pública de su información personal, y un mayor riesgo de bajo rendimiento o característica mal funcionamiento”, agregó Myserson. “Non-Genuine Windows no es compatible con Microsoft o un socio de confianza.”

Lo que esto significa: Aparentemente es el acto final de un pequeño drama que comenzó en marzo, cuando Microsoft apareció para decirle a Reuters que ofrecería gratis actualizaciones de Windows 10  hasta incluso aquellos que habían pirateado el software. Dos días más tarde, sin embargo, comenzó a mencionar de nuevo en esa declaración, afirmando que las copias piratas serían aún ilegítimas. Ahora parece que tenemos la respuesta final. “Si pirateas Windows, tendrás que pagar finalmente”.

Activar conexión remota MySQL

Este es un tema muy amplio y con múltiples soluciones debido a la gran variedad de distribuciones de MySQL, proveedores de hosting, configuraciones exclusivas, etc.

En esta oportunidad describiré como habilité la conexión en una red local que tiene un servidor MySQL incluido en la distribución XAMPP, básicamente ingresé a localhost/phpMyAdmin y configuré un nuevo usuario con los privilegios necesarios para acceder a la base de datos.

2015-05-11_112047
2015-05-11_112159
El Nuevo usuario exoasesor del PC con IP 192.168.20.2  tiene amplios privilegios y puede acceder a la base de datos del servidor MySQL con IP 192.168.20.1

2015-05-11_111308
Realice pruebas desde una red externa y también se logra conectar con éxito.

Para conectar de forma remota a una base de datos MySQL en un servidor de hosting lo hice como indico a continuación:

Ingresé al cPanel ejemplo: www.miweb.com/cpanel

2015-05-11_102717
Nos dirigimos a la sección Base de datos

2015-05-11_101831

En MySQL Remoto (Si el servicio contratado permite esta opción, de lo contrario no es posible por el momento)

2015-05-11_102552Podemos utilizar % para que cualquier IP tenga acceso remoto, pero lo recomendable por razones de seguridad es incluir la IP de los equipos que consideremos habilitados para acceder a la base de datos.

Es Importante crear los usuarios y sus privilegios en la opción MySQL Bases de Datos:

2015-05-11_101831
2015-05-11_102307
Asignamos el usuario a la base de datos, con estos pasos estamos listos para conectar en forma remota.

Comandos HDroidGUI

INIT WINDOW

Implementa una ventana de la interfaz (Android Activity), asegúrese de usar ACTIVATE WINDOW para completar el ciclo lógico.

   INIT WINDOW <oWnd> TITLE <cTitle>;

             [ON INIT <binit>];

             [ON EXIT <bExit>]

ownd – un objeto de clase HDActivity.

cTitle – El título de la ventana.

bInit – bloque de código ejecutado inmediatamente después de crear la ventana.

bExit – bloque de código que se ejecuta antes de cerrar la ventana.

 

 

ACTIVATE WINDOW

Completa la descripción de la ventana de la interfaz y la envía al sistema para su creación.

   ACTIVATE WINDOW <oWnd>

oWnd – Objeto ventana creado con  INIT WINDOW .

 

 

INIT DIALOG

Descripción de un diálogo. Tenga en cuenta que el diálogo aquí es principalmente para implementar funciones como hd_MsgInfo(), hd_MsgYesNo(), etc. Tiene una estructura diferente de una ventana normal (Activity). Úselo sólo si tiene una buena idea de lo que está haciendo.

 

   INIT DIALOG <oDlg> [TITLE <cTitle>];

[ON INIT <binit>];

[ON EXIT <bExit>]

oDlg – un objeto de clase HDDialog.

cTitle – Título  de cuadro de diálogo.

bInit -. Codeblock ejecutado inmediatamente después de la apertura de un diálogo

bExit – bloque de código que se ejecuta antes de cerrar el diálogo.

 

 

ACTIVATE DIALOG

Completa la descripción de la interfaz de diálogo y lo envía al sistema para crear.

   ACTIVATE DIALOG <oDlg>

oDlg – objeto diálogo creado con INIT DIALOG .

 

 

BEGIN LAYOUT

Este widget – es un contenedor de otros componentes, para su anuncio debe seguir las instrucciones de los componentes se colocarán consecutivamente en el mismo (botones, texto, etc.). Para concluir debe estar END LAYOUT. El contenedor puede ser horizontal – en este caso los sub-componentes dispuestos de izquierda a derecha, o verticalmente – entonces, respectivamente, de arriba a abajo.

   BEGIN LAYOUT <Olay>;

[<lHorz: HORIZONTAL>];

[SIZE <width>, <height>];

[BACKCOLOR <bcolor>];

[Font <oFont>];

oLay -. un objeto de clase HDLayout

HORIZONTAL – si hay una palabra, el contenedor se define como horizontal (por defecto – vertical).
width, height – anchura y altura. Tamaño en DP (Density-independent Pixels). También puede utilizar las constantes MATCH_PARENT (anchura máxima posible o altura dentro de la matriz) o WRAP_CONTET (anchura o altura está determinada por el contenido del elemento).

bcolor – color de fondo se puede especificar en número hexadecimal o una representación de cadena (#FFFFFF).

oFont – un objeto de clase HDFont .

 

 

END LAYOUT

Completa la descripción del contenedor.

   END LAYOUT <Olay>

oLay – Objeto contenedor creado por BEGIN LAYOUT .

 

 

TEXTVIEW

Este comando crea un TextView – componente GUI Android que muestra texto estático.

   TEXTVIEW <oText>;

[TEXT <cText>];

[SIZE <width>, <height>];

[TEXTCOLOR <tColor>];

[BACKCOLOR <bcolor>];

[FONT <oFont>];

[<lVScroll: VSCROLL>]

oText -. un objeto de clase HDTextView

Ctext – el texto que aparece en el TextView .

width, height – anchura y altura.

tColor, bcolor – texto y color de fondo, respectivamente. Puede ser especificado en número hexadecimal o una representación de cadena (#FFFFFF).

oFont – un objeto de clase HDFont.

VSCROLL -. Establece el desplazamiento vertical

 

 

BUTTON

Creación de un botón.

   BUTTON <oBtn>;

[TEXT <cText>];

[SIZE <width>, <height>];

[TEXTCOLOR <TColor>];

[BACKCOLOR <bcolor>];

[FONT <oFont>];

[ON CLICK <bClick>]

oBtn – un objeto de clase HDButton.

cText – el texto que aparece en el botón.

width,height – anchura y altura.

tColor, bcolor – texto y color de fondo, respectivamente. Puede ser especificado en número hexadecimal o una representación de cadena (#FFFFFF).

oFont – un objeto de clase HDFont.

bClick -. Codeblock ejecutado al presionar el botón

 

 

EDITBOX

Creación de un componente para la introducción de texto

   EDITBOX <oEdit>;

[TEXT <cText>];

[HINT <Chint>];

[PASSWORD];

[SIZE <width>, <height>];

[TEXTCOLOR <tColor>];

[BACKCOLOR <bcolor>];

[FONT <oFont>];

[ON KEYDOWN <bKeyDown>]

oEdit -. un objeto de clase HDEdit

cText -. texto

Chint – pista – el texto que aparece en el cuadro de edición cuando este componente está vacía.

width, height – anchura y altura.

tColor, bcolor – texto y color de fondo, respectivamente. Puede ser especificado en número hexadecimal o una representación de cadena (#FFFFFF).

oFont – un objeto de clase HDFont.

bKeyDown -. Codeblock ejecutados al ingresar el siguiente carácter

 

 

CHECKBOX

   CHEKBOX <oChe>;

[TEXT <cText>];

[SIZE <width>, <height>];

[TEXTCOLOR <TColor>];

[BACKCOLOR <bcolor>];

[FONT <oFont>]

oChe – un objeto de clase HDCheckBox.

cText -. texto

width, height – anchura y altura.

TColor, bcolor – texto y color de fondo, respectivamente. Puede ser especificado en número hexadecimal o una representación de cadena (#FFFFFF).

oFont -. un objeto de clase HDFont

 

 

BROWSE ARRAY

   BROWSE <oBrw> ARRAY <aArr>;

[SIZE <width>, <height>];

[<lHScroll: HSCROLL>];

[ON CLICK <bClick>];

oBrw – un objeto de clase HDBrwArray.

width, height – anchura y altura.

HSCROLL – establece el desplazamiento horizontal.

 

 

BROWSE DBF

   BROWSE <oBrw> DBF <cAlias>;

[FILTER <xFilter>];

[SIZE <width>, <height>];

[<LHScroll: HSCROLL>];

[ON CLICK <bClick>];

oBrw – un objeto de clase HDBrwDbf.

width, height – anchura y altura.

HSCROLL – establece el desplazamiento horizontal.

bClick – bloque de código ejecuta cuando se selecciona una fila.

 

 

PREPARE FONT

Crear un nuevo tipo de letra

   PREPARE FONT <oFont>;

[FACE <face>];

[STYLE <style>];

[HEIGHT <height>];

oFont . – un objeto de clase HDFont

face – ¿Puede ser uno de los valores: FONT_NORMAL, FONT_SANS, FONT_SERIF, FONT_MONOSPACE .

style – puede ser uno de los valores: FONT_BOLD, FONT_ITALIC, FONT_BOLD_ITALIC .

height – el tamaño de la fuente en dp .

 

 

MENU

Anuncios menú para la WINDOW actual (Activity). Después de este comando debe ir seguido de uno o más MENUITEM y, finalmente, MENUITEM .

    MENU [ID <nId>] [TITLE <cTitle>]

nId – todavía no se utiliza.

cTitle – aún no se utilizan.

 

 

ENDMENU

Menú anuncios de terminación.

    ENDMENU

 

 

MENUITEM

Elemento de menú.

    MENUITEM <cTitle> [ID <nId>];

ACTION <bAction>

cTitle -. el nombre del elemento de menú

nId – identificador numérico. Si no se especifica, se genera automáticamente.

bAction – bloque de código ejecuta cuando se selecciona esta opción ..

 

 

SET TIMER

Ajuste el temporizador.

   SET TIMER <oTimer>;

VALUE <value> ACTION <bAction>

oTimer -. un objeto de clase HDTimer

value – la frecuencia del temporizador de activación en milisegundos.

bAction – bloque de código que se llama cuando el temporizador.

 

 

INIT NOTIFICATION

Preparación aviso. Notificación preparado se puede enviar por oNotify:Run().

   INIT NOTIFICATION <oNotify> TITLE <cTitle>;

[TEXT <cText>];

[SUBTEXT <cSubText>];

[<Llight: LIGHT>];

[<LSound: SOUND>];

[<LVibr: VIBRATION>]

oNotify – un objeto de clase HDNotify.

cTitle – cabecera de la notificación.

cText – texto de la notificación.

cSubText -. texto adicional, más detallada LIGHT, SOUND, VIBRATION -. al especificar estas palabras, la notificación deberá ir acompañada, respectivamente, mediante el parpadeo de los LED, sonido o vibración

 

 

SET MARGINS

   SET <oWidget> MARGINS [LEFT <ml>] [TOP <mt>] [RIGHT <mr>] [BOTTOM <mb>]

oWidget – widget de objeto para la cual se definen los parámetros. ml, mt, sr, mb –

 

 

SET PADDING

   SET <oWidget> PADDING [LEFT <pl>] [TOP <pt>] [RIGHT <pr>] [BOTTOM <pb>]

oWidget – widget de objeto que se define con los parámetros. pl, pt, pt, pb –

Ver contenido de las variables (Display Memory)

2015-04-04_122820

 

#include "oohg.ch"

Function DispMem()

    Save to MigMem All
    ReadMem( "MigMem.mem" )
    cArquivo := "MigMemory.txt"
    Editor   := "Notepad"

    EXECUTE FILE Editor PARAMETERS cArquivo

Return Nil

Procedure READMEM( cFileName )
    local x
    local aMemVars  := {}
    local nLine     := 0

    SET PRINTER TO MigMemory.txt
    SET DEVICE TO PRINTER

    @  1, 1 say PADC( "Display Memory", 79 )

    Do while .T.
        aMemVars := GETVARFROM( cFileName )
        @  3,  5 say "Name"
        @  3, 18 say "Type"
        @  3, 23 say "Value"
        @  3, 60 say "File: MigMemory.txt"
        nLine := 4
        For x := 1 to len( aMemVars )
            ++ nLine
            @ nLine,  5 say aMemVars[ x, 1 ]
            @ nLine, 18 say aMemVars[ x, 2 ]
            @ nLine, 23 say aMemVars[ x, 3 ]
        Next
        Exit
    Enddo

    SET PRINTER TO
    SET DEVICE TO SCREEN

Return


Function GETVARFROM( cMemFile )

    local xVarValue    := NIL
    local nHandle
    local nFilePoint
    local cMemBuff
    local cVarName
    local cID
    local nSize
    local nLen
    local cBuffer
    local cData
    local nHi
    local nLo
    local lFlag
    local nB1
    local nB2
    local nB3
    local nB4
    local nTotal
    local nOutput
    local nValue
    local aMemVar
    local aMemVarArray := {}

    if valtype( cMemFile ) = "C" .and. file( cMemFile )
        nHandle    := fopen( cMemFile )
        nFilePoint := fseek( nHandle, 0, 2 )
        fseek( nHandle, 0 )
        if nFilePoint > 1
            xVarValue := ""
            do while fseek( nHandle, 0, 1 ) + 1 < nFilePoint .and. !FEOF( nHandle )
                cMemBuff := space( 18 )
                fread( nHandle, @cMemBuff, 18 )
                cVarName := left( cMemBuff, at( chr( 0 ), cMemBuff ) - 1 )
                cID      := substr( cMemBuff, 12, 1 )
                nSize    := bin2w( right( cMemBuff, 2 ) )
                nLen     := if( cID $ "ÃÌ", 14 + nSize, 22 )
                cBuffer  := space( nLen )
                fread( nHandle, @cBuffer, nLen )
                cData := substr( cBuffer, 15 )
                if cID == chr( 195 )                // character
                    aMemVar   := { cVarName, "C", cData }
                    xVarValue := cData
                elseif cID == chr( 204 )            // logic
                    aMemVar   := { cVarName, "L", asc( cData ) == 1 }
                    xVarValue := asc( cData ) == 1
                elseif cID == chr( 206 )            // Numeric
                    cBuffer   := substr( cBuffer, 15 )
                    nHi       := MODULUS( asc( substr( cBuffer, 8, 1 ) ), 128 ) * 16
                    nLo       := int( asc( substr( cBuffer, 7, 1 ) ) / 16 )
                    nValue    := nHi + nLo - 1023
                    lFlag     := int( asc( substr( cBuffer, 8, 1 ) ) / 16 ) >= 8
                    nB1       := MODULUS( asc( substr( cBuffer, 7, 1 ) ), 16 ) / 16
                    nB2       := bin2w( substr( cBuffer, 5, 2 ) ) / ( 65536 * 16 )
                    nB3       := bin2w( substr( cBuffer, 3, 2 ) ) / ( 65536 * 65536 * 16 )
                    nB4       := bin2w( substr( cBuffer, 1, 2 ) ) / ;
                                   ( 65536 * 65536 * 65536 * 16 )
                    nTotal    := nB1 + nB2 + nB3 + nB4
                    nOutput   := if( lFlag, - ( 1 + nTotal ) * 2 ^ nValue, ;
                                   ( 1 + nTotal ) * 2 ^ nValue )
                    xVarValue := val( transform( nOutput, "@B" ) )
                    aMemVar := { cVarName, "N", xVarValue }
                elseif cID == chr( 196 )            // Date
                    cBuffer   := substr( cBuffer, 15 )
                    nHi       := MODULUS( asc( substr( cBuffer, 8, 1 ) ), 128 ) * 16
                    nLo       := int( asc( substr( cBuffer, 7, 1 ) ) / 16 )
                    nValue    := nHi + nLo - 1023
                    lFlag     := int( asc( substr( cBuffer, 8, 1 ) ) / 16 ) >= 8
                    nB1       := MODULUS( asc( substr( cBuffer, 7, 1 ) ), 16 ) / 16
                    nB2       := bin2w( substr( cBuffer, 5, 2 ) ) / ( 65536 * 16 )
                    nB3       := bin2w( substr( cBuffer, 3, 2 ) ) / ( 65536 * 65536 * 16 )
                    nB4       := bin2w( substr( cBuffer, 1, 2 ) ) / ;
                                   ( 65536 * 65536 * 65536 * 16 )
                    nTotal    := nB1 + nB2 + nB3 + nB4
                    nOutput   := if( lFlag, - ( 1 + nTotal ) * 2 ^ nValue, ;
                                   ( 1 + nTotal ) * 2 ^ nValue )
                    xVarValue := dtoc( ctod( "01/01/0100" ) + nOutput - 1757585 )
                    aMemVar := { cVarName, "D", xVarValue }
                endif
                aadd( aMemVarArray, aMemVar )
            enddo
        endif
        fclose( nHandle )
    endif

Return aMemVarArray


Function FEOF( nHandle )

    local nCurrPos
    local nFileSize

    nCurrPos  := fseek( nHandle, 0, 1 )
    nFileSize := fseek( nHandle, 0, 2 )
    fseek( nHandle, nCurrPos, 0 )

Return nFileSize < nCurrPos


Function MODULUS( nParm1, nParm2 )

    local x
    local nRetVal := 0

    if valtype( nParm1 ) = "N" .and. valtype( nParm2 ) = "N"
        if nParm2 = 0
            nRetVal := nParm1
        else
            x       := nParm1 % nParm2
            nRetVal := if( x * nParm2 < 0, x + nParm2, x )
        endif
    endif

Return nRetVal

Harbour y OCX

/*
    Demo uso de OCX SkinCrafter
    NOTA: Boton derecho en ejecutable, compatibilidad, 
    ejecutar el programa como administrador.
*/

#include "oohg.ch"

FUNCTION Main()

  Local aSkins := Directory( ".\Skins\*.Skf" )
  Local aItems := {}
  Local nCont

  Public oSkin

    If Empty( aSkins )
        Aadd( aItems, {""} )
    EndIf

    For nCont := 1 To Len( aSkins )
        Aadd( aItems, { aSkins[nCont][1] } )
    Next

    InitOcx()
    CreateObjSkin()

    aLic := { "SKINCRAFTER", ;
              "SKINCRAFTER.COM", ;
              "[email protected]", ;
              "DEMOSKINCRAFTERLICENCE" }

    oSkin:InitLicenKeys(aLic[1],aLic[2],aLic[3],aLic[4])
    oSkin:DefineLanguage(0)
    oSkin:InitDecoration(1)

    InitSkin( aItems[1][1] )

    Define Window Win_0 At 0, 0 ;
           Width 640 Height 480 ;
           Title 'ooHG with SkinCrafter by MigSoft' ;
           Icon "Skin" Main Nomaximize ;
           On Release ExitOcx()

        @ 160,   4 Frame frame_1 Caption '' ;
                   Width 330 Height 280

        @ 180,  13 Grid grid_1 Width 310 ;
                   Height 250 Headers {'Skin'} ;
                   Widths {285} Items aItems Value 1 ;
                   On DblClick Aplica()

        @ 20,  360 Label lbl_1 Value 'Etiqueta' AutoSize

        @ 15,  417 TextBox cTexto  Value "TextBox"   ;
                   Width 200 Height 022
        @ 60,  360 CheckBox lCheck Caption 'Checkbox';
                   Width 100 Height 20
        @ 60,  530 DatePicker date_1                 ;
                   Width 90  Height 20
        @ 100, 360 ProgressBar progress_1 Value 33   ;
                   Width 260 Height 20
        @ 150, 380 MonthCalendar month_1

        @ 400, 360 Button btn_2 Caption '&Aplicar' ;
                   Action Aplica() ;
                   Width 70 Height 20
        @ 400, 450 Button btn_1 Caption '&Salir'   ;
                   Action Win_0.Release() ;
                   Width 70 Height 20
        @ 400, 540 Button btn_3 Caption '&Mensaje' ;
                   Action MsgInfo( "Saludos cordiales" ) ;
                   Width 70 Height 20

        @ 7,9 FRAME frame_2 CAPTION "" ;
              WIDTH 190 HEIGHT 95 ;

        Win_0.frame_1.fontcolor := {0,0,0}
        Win_0.frame_1.fontname  := 'MS Sans Serif'
        Win_0.frame_1.fontsize  := 10

        @ 15,  208 LISTBOX list_1 WIDTH  98 HEIGHT 110 ;
                   FONT 'MS Sans Serif' ;
                   ITEMS { 'Harbour','xHarbour' } SIZE 10 ;

        Win_0.list_1.fontcolor  := {0,0,0}
        Win_0.list_1.backcolor  := {255,255,255}

        @ 135,  16 BUTTON button_1 CAPTION 'Normal' ;
                   ACTION msginfo('Button pressed') ;
                   WIDTH 70 HEIGHT 20 ;
                   FONT 'MS Sans Serif' SIZE 10 ;

        Win_0.button_1.fontcolor:={0,0,0}

        @ 135, 126 BUTTON button_2 ;
            CAPTION 'Focused' ;
            ACTION msginfo('Button pressed') ;
            WIDTH 70 ;
            HEIGHT 20 ;
            FONT 'MS Sans Serif' ;
            SIZE 10 ;

        Win_0.button_2.fontcolor:={0,0,0}

        @ 135, 236 BUTTON button_3 ;
            CAPTION 'HightLight' ;
            ACTION msginfo('Button pressed') ;
            WIDTH 70 ;
            HEIGHT 20 ;
            FONT 'MS Sans Serif' ;
            SIZE 10 ;

        Win_0.button_3.fontcolor:={0,0,0}

        @ 25,  15 TEXTBOX text_1 ;
            HEIGHT 24 ;
            WIDTH 90 ;
            Font 'MS Sans Serif' ;
            size 10 ;
            VALUE "TextBox";
            MAXLENGTH 20 ;

        Win_0.text_1.fontcolor:={0,0,0}
        Win_0.text_1.backcolor:={255,255,255}

        @ 60,  15 COMBOBOX combo_1 ;
            WIDTH  90 ;
            FONT 'MS Sans Serif' ;
            ITEMS {"GUI 1","GUI 2","GUI 3"} ;
            VALUE 2 ;
            SIZE 10 ;

        Win_0.combo_1.fontcolor:={0,0,0}
        Win_0.combo_1.backcolor:={255,255,255}

        @ 18, 110 CHECKBOX checkbox_1 ;
            CAPTION 'Check' ;
            WIDTH 80 ;
            HEIGHT 28;
            VALUE .F. ;
            FONT 'MS Sans Serif' ;
            SIZE 10 ;

        Win_0.checkbox_1.fontcolor:={0,0,0}

        @ 46, 110 RADIOGROUP radiogroup_1 ;
            OPTIONS  {'option 1','option 2'}  ;
            VALUE 1 ;
            WIDTH  80 ;
            SPACING  25 ;
            FONT 'MS Sans Serif' ;
            SIZE 10 ;

        Win_0.radiogroup_1.fontcolor:={0,0,0}

        @ 110, 13 PROGRESSBAR progressbar_1 ;
            RANGE 1,100 ;
            VALUE 35;
            WIDTH 186 ;
            HEIGHT 18 ;

        Win_0.progressbar_1.fontcolor:={0,0,0}
        Win_0.progressbar_1.backcolor:={255,255,255}

    End Window

    Center   Window Win_0
    Activate Window Win_0

RETURN .T.


Static Function Aplica()

Local aRenglon:=Win_0.grid_1.Item( Win_0.grid_1.Value )

    InitSkin( aRenglon[1] )

Return .T.

Function InitSkin( cSkin )

    oSkin:LoadSkinFromFile( ".\Skins\" + cSkin )
    oSkin:ApplySkin()

Return .T.

Function InitOcx()

    Execute File ;
    "regsvr32 /s .\SkinCrafter3_vs2012.Dll" ;
    Wait Minimize

Return .T.

Function ExitOcx()

    Execute File ;
    "regsvr32 /s /u .\SkinCrafter3_vs2012.Dll" ;
    Wait Minimize

Return .T.

Function CreateObjSkin()

    Local cOcxFileName := "SkinCrafter.SCSkin3"

    OCX_bSaveHandler := errorblock( { |x| break(x) } )
    BEGIN SEQUENCE
          oSkin := GetActiveObject( cOcxFileName )
    RECOVER USING oError
          OCX_Error = oError:genCode
    END
    errorblock( OCX_bSaveHandler )

    if OCX_Error != 0
       OCX_bSaveHandler := errorblock( { |x| break(x) } )
       BEGIN SEQUENCE
             oSkin := CreateObject( cOcxFileName )
       RECOVER USING oError
             MsgStop( 'SkinCrafter DLL not available or '+ ;
             'insufficient permissions !!!', 'Warning...' )
             ExitOcx()
             RETURN .F.
       END
       errorblock( OCX_bSaveHandler )
     endif

Return .T.