lunes, 10 de diciembre de 2018

AEM hablemos del arquetipo 11

Cuando creamos un proyecto con AEM. Siempre es importante saber que arquetipo estamos usando. Pues esto me determinara que source, herramientas y auto-configuraciones se esta utilizando.


Para declarar un servlet;

 Arquetipo 10:


@SlingServlet(paths="/bin/mySearchServlet", methods = "POST", metatype=true)
public class HandleClaim extends org.apache.sling.api.servlets.SlingAllMethodsServlet {
    private static final long serialVersionUID = 2598426539166789515L;
}


Arquetipo 11:

@Component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_POST,
"sling.servlet.paths="+ "/bin/myDataSourcePoolServlet"
})
}



Para usar @reference;

 Arquetipo 10:

import org.apache.felix.scr.annotations.Reference;

@Reference
private DataSourcePool dataPool;


Arquetipo 11:

import org.osgi.service.component.annotations.Reference;

@Reference
private DataSourcePool dataPool;


Usando DataPools:


Arquetipo 10:
Se configura como; Apache Sling Connection Pooled DataSource
http://localhost:4502/system/console/configMgr


Arquetipo 11:

Se configura como; Day Commons JDBC Connections Pool
http://localhost:4502/system/console/configMgr

miércoles, 5 de diciembre de 2018

Adobe AEM Form + AEM Data Model + MySql Example

Prerequisitos:

  1. AEM 6.3
  2. AEM-6.3.3.0-6.3.3.zip
  3. AEM-CFP-6.3.3.1-1.0.zip
  4. AEM-FORMS-6.3.3.1-LX-4.1.90.zip
  5. Mysql 

Pasos:

Necesitamos crear un ambiente con todos los prerequisitos anteriormente listados. 



Seguidamente necesitamos crear una base de datos.

Script:

CREATE DATABASE Registro_de_mascotas;
USE Registro_de_mascotas;

CREATE TABLE Mascotas (Nombre VARCHAR(20), Raza VARCHAR(30), Sexo CHAR(1), Fecha_de_nacimiento DATE);


Debemos crear la conexión a la base de datos. Y lo para esto, necesitamos;

Instalar los drivers en AEM:
Lo hacemos atravez de este tool:

http://localhost:4502/system/console/bundles

Dentro instalamos los bundles que necesitemos. Para este caso en especifico instalamos el de Mysql.


Este lo podes descargar aqui





Configurar Mysql como Datasource de AEM

Esto lo hacemos en el siguente tool:
http://localhost:4502/system/console/configMgr

Dentro buscamos: Apache Sling Connection Pooled DataSource

Y pulsamos en mas (+)

En el formulario, ponemos los datos de la base de datos:

Detalles:
Notas: Los datos que no se encuentra debajo dejarlos default


Datasource name: MascotasDataSource
DataSource service property name:
datasource.name
JDBC driver class:
com.mysql.jdbc.Driver
JDBC connection URI:
jdbc:mysql://localhost:3306/Registro_de_mascotas?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
Username:
root
Password:
<VACIO>
Test on Borrow:
True
Test on Return:
True
Validation Query:
-1
Transaction Isolation:
READ_COMMITTED

Después de pulsar Save. Se creara por debajo un nuevo data source:



Nuestro siguiente paso es crear un nuevo data model.
http://localhost:4502/aem/forms.html/content/dam/formsanddocuments-fdm




Agregamos un nombre y pulsamos siguiente;



Seleccionamos el Datasource







Y pulsamos el botón de crear
Tenemos que editar el DataModel Recién creado.




Dentro en el Panel de edición, simplemente podemos desplegar el árbol y tendremos acceso a la base de datos.

Debemos agregar la tabla y los inputs.  Dentro del modelo:


Pulsamos el botón "Add Selected". Se agregara una tabla al panel de edición:

 Tenemos que editar la tabla y escogerles los modos y servicios (Mas adelante se explica esto en detalle)



Debemos escoger el;
Read Service: get.
Bidding To: Request Atribute
Biding Value: Nombre. (Nombre de la tabla)
Es importante destacar que he tenido problemas configurando el Bidding Value. Si se presenta ese problema utilizar la nomenclatura <Nombre Tabla>.<Nombre campo> eg; Mascotas.Nombre

Debemos escoger el;
Write Service: insert






Pulsamos Done.
Ahora nos toca configurar los servicios.

Editamos el servicio Get:




 Escogemos el método;
Output Model Object: Mascotas.
Return array?: True (Por que la tabla de prueba no tiene llave primaria)

Editamos el servicio Insert:

Escojemos:
Output Type: Boolean (Defecto)
Arguments: Mascotas







Nuestra siguiente tarea seria probar que el DataModel este funcionando correctamente.

Entramos al utilitario de Test Model Object


Dentro escogemos el
Select Model/Service: Write model Object

Y debemos escribir los datos a insertar:

{
  "Mascotas": {
    "Nombre": "Pepe",
    "Raza": "Indefinida",
    "Sexo": "M",
    "Fecha_de_nacimiento": "2015-12-17"
  }  
}


Y pulsamos el botón Test:

Mi experiencia me dice que este tool tiene mucho problemas, pues me a tocado pulsar repetidamente Test, hasta 5 veces para la respuesta del insert sea True.

Ahora nos toca pulsar la búsqueda.

En este caso escogemos:
Select Model/Service: Read model object

Pulsamos Mascotas. Y nos generara un template solicitando el Nombre.
Seria poner "Gabo" para hacer referencia al que acabamos de insertar.


{
    "request": {
        "attribute": {
            "Nombre": "Gabo"
        }
    }
}


De igual manera que en el insert, Me toco pulsar varias veces el botón de Test. Porque las primeras veces me muestra errores de conexión, como el 4 o 5 intento funciona correctamente.

Crear el formulario:

El paso final es crear el formulario basado en el Data Model anterior, en el siguiente tool:


http://localhost:4502/aem/forms.html/content/dam/formsanddocuments


Creamos un Adaptive Form



Creamos un Template en blanco
Nombramos el Formulario como: MascotasForm





Escogemos el datasource


Y pulsamos el botón Create.

Seguidamente tenemos que editar el formulario:
Nos vamos al tab de Data Model Objects y arrastramos toda la tabla:


Luego agregamos el botón de submit:







Y editamos el container del formulario:
En la sección de  Submission:
Submit Action: Submit using Form Data model
Data Model to submit: Escojemos el del mascotas.

Y por ultimo guardamos los cambios.

Ahora solo resta pulsar el botón de preview.
De igual manera que los tool de testing, cuando doy submit la primera vez me genera un error. Es hasta el segundo submit cuando efectivamente se insertan los valores en la base de datos.

martes, 20 de noviembre de 2018

Clonando y cambiando partición root en Linux

Contexto:
Sucede que mis particiones de root siempre las hago alrededor de los 20GB. Usualmente esto me da espacio suficiente para soportar mucho tiempo antes de la próxima reinstalación.
 Pero esta vez no, cuando trate de dimensionar root, me dio errores. Entonces tome la decisión de clonar root y cambiarlo.

Nota:
De momento ha funcionado bien y sin problemas.

Pasos:
  1. Utilizando un Live CD en mi caso use Kubuntu 14.02 (Viejo). Entro en en modo "Probar sin instalar".
  2.  Dentro entro al gestor de particiones de KDE. Comando:
    partitionmanager




  • Dentro encontré: 

    • /dev/sda7 como root (20GB), 
    • /dev/sda5 como home(350GB). 
    • Simplemente lo que hice fue hacer algo de espacio para la nueva partición que superara su tamaño original. Esta fue asignada con 90GB y quedo como /dev/sda8




  • Lo siguiente que debemos hacer es clonar sda7 (Viejo root) en /dev/sda8 (Nuevo root). Usando el comando: 
    dd if=/dev/sda7 of=/dev/sdb8 bs=64K conv=noerror,sync
  •  El siguiente paso fue montar /dev/sda7 y el /dev/sda8 para poder editar el fstab. Usando Dolphin es solo cuestión de darle un par de clicks.
  •  Debemos editar el /etc/fstab de ambas particiones. Quedaría algo como esto: Nota: Soy de vieja escuela y siempre me ha parecido mejor usar particiones que UUID. Sin embargo en el final de este post encontraras como cambiar los UUID de la vieja partición.
  • Como se logra ver en la imagen anterior, antes se usaba la UUID del /dev/sda7. Pero ahora directamente lo cambie para /dev/sda8. Y esto para no tener que lidear con NADA mas. Sino tendriamos que actualizar un monton de cosas entre ellas grub.(Recortar cambiar el FSTAB DE AMBAS PARTICIONES)
  • Para este punto ya podemos reiniciar (Dejar de usar el LiveCD
  • Con la nueva partición corriendo, si ejecutamos el
    df -h
    se puede notar  que la partición aun tiene 20Gb de espacio. Esto es porque se clono de forma que la tabla de particiones se duplico. Lo que debemos hacer es ejecutar este comando:
    sudo resize2fs /dev/sda8 
    de esta forma se actualiza y ahora si me marca los 90GB de espacio. 

  • Epilogo
    Como editar el UUID de un disco duro con comandos?

    Contexto:
    Como se duplico la vieja root, también duplico el UUID y esto no es recomendable.

    Es tan sencillo como generar un nuevo UUID y actualizarlo:

    uuidgen
    #bbef6868-6903-456e-ad5e-2784154dfb9a
    tune2fs /dev/sda7 -U bbef6868-6903-456e-ad5e-2784154dfb9a
    

    domingo, 11 de marzo de 2018

    Jugando con las macros del Razer BlackWidow Ultimate 2012 para Linux(Parte 1)

    Nota: Ya existen proyectos super eficientes como OpenRazer.

    Sin embargo el presente articulo fue creado con el fin de experimentar un poco con libusb, udev.

    Para quien es este articulo?
    Esta pensando para programadores, y curiosos. No se explica como funciona Libusb, pero se da un ejemplo de vida real.

    Contexto:
    El teclado viene con 5 Macro Keys. Que necesitan ser inicial izadas en orden de que Linux detecte sus entradas. Desgraciadamente para ello se necesita, hacer un poco de ingeniería inversa de las entradas. El objetivo de  articulo no es para aprender a hacer ingeniería inversa del tema. Pero pueden ver un vídeo muy ilustrativo aqui.

    En resumen; Lo que necesitamos hacer es mandar unos bits mágicos a través de LibUSB al teclado para que empiece a usar los Macros.
    La forma mas sencilla de probar todo es con evtest.

    sudo evtest
    No device specified, trying to scan all of /dev/input/event*
    Available devices:
    #Blablabla en mi compu el input esta en el 4
    /dev/input/event4:      Razer Razer BlackWidow Ultimate
    /dev/input/event5:      Razer Razer BlackWidow Ultimate
    /dev/input/event6:      Razer Razer BlackWidow Ultimate
    #Blablabla
    Select the device event number [0-20]: 4
    Input driver version is 1.0.1
    Input device ID: bus 0x3 vendor 0x1532 product 0x10d version 0x111
    Input device name: "Razer Razer BlackWidow Ultimate"
    Supported events:
      Event type 0 (EV_SYN)
        #Bla bla bla Y esta es la parte interesante... Note que el Key configura teclas F13 en adelante. Esas son las macros.
        Event code 183 (KEY_F13)
        Event code 184 (KEY_F14)
        Event code 185 (KEY_F15)
        Event code 186 (KEY_F16)
        Event code 187 (KEY_F17)
        Event code 188 (KEY_F18)
        Event code 189 (KEY_F19)
        Event code 190 (KEY_F20)
        Event code 191 (KEY_F21)
        Event code 192 (KEY_F22)
        Event code 193 (KEY_F23)
        Event code 194 (KEY_F24)
        Event code 240 (KEY_UNKNOWN)
      Event type 4 (EV_MSC)
        Event code 4 (MSC_SCAN)
      Event type 17 (EV_LED)
        Event code 0 (LED_NUML)
        Event code 1 (LED_CAPSL)
        Event code 2 (LED_SCROLLL)
    Key repeat handling:
      Repeat type 20 (EV_REP)
        Repeat code 0 (REP_DELAY)
          Value    250
        Repeat code 1 (REP_PERIOD)
          Value     33
    Properties:
    Testing ... (interrupt to exit)
    Event: time 1520787420.323002, type 17 (EV_LED), code 0 (LED_NUML), value 0
    Event: time 1520787420.323002, -------------- EV_SYN ------------
    Event: time 1520787420.376467, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70028
    Event: time 1520787420.376467, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0
    Event: time 1520787420.376467, -------------- EV_SYN ------------
    Event: time 1520787422.226497, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
    Event: time 1520787422.226497, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
    Event: time 1520787422.226497, -------------- EV_SYN ------------
    Event: time 1520787422.476487, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70006
    Event: time 1520787422.476487, type 1 (EV_KEY), code 46 (KEY_C), value 1
    Event: time 1520787422.476487, -------------- EV_SYN ------------


    Cada vez que toquen una tecla convencional, verán el input de la tecla. Pero si se presiona alguna de las macros no pasa nada. Para solucionar cree un pequeño programa en C el cual le pasa los bits mágicos al teclado.

    #include 
    #include 
    #include 
     
    using namespace std;
     
    #define VENDOR_ID 0x1532
    #define PRODUCT_ID 0x10D
    #define USB_REQUEST_TYPE  0x21
    #define USB_VALUE  0x300
    #define USB_REQUEST  9
    #define USB_INDEX  0
    #define USB_INTERFACE  0 //La interfaz de configuracion esta en el 0
     
    unsigned char buffer[90] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00}; //Magic bits
     
    int main(int argc, char** argv) {
        libusb_context *ctx = NULL; //a libusb session
        libusb_device_handle *dev_handle; //a device handle
        int result; //Result form the writting
        result = libusb_init(&ctx); //initialize a library session
        if (result < 0) {
            cout << "libusb_init init error " << result << endl; //there was an error
            return false;
        }
        dev_handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID); //these are vendorID and productID I found for my usb device
        if (dev_handle == NULL) {
            cout << "libusb_open_device_with_vid_pid cannot open Blackwidow keyboard" << endl;
            return false;
        }
        if (libusb_kernel_driver_active(dev_handle, USB_INTERFACE) == 1) {
            if (libusb_detach_kernel_driver(dev_handle, USB_INTERFACE) != 0) {
                cout << "libusb_detach_kernel_driver error" << endl;
                return false;
            }
        }
        result = libusb_claim_interface(dev_handle, USB_INTERFACE); //claim interface 0 (the first) of device (mine had jsut 1)
        if (result < 0) {
            cout << "Cannot Claim Interface" << endl;
            return false;
        }
        result = libusb_control_transfer(dev_handle, USB_REQUEST_TYPE, USB_REQUEST, USB_VALUE, USB_INDEX, buffer, 90, 0);
        if (result != 90) {
            return false;
        }
        result = libusb_release_interface(dev_handle, USB_INTERFACE); //release the claimed interface
        if (result != 0) {
            cout << "Cannot Release Interface" << endl;
            return false;
        }
        //Attached and reclain the driver
        libusb_attach_kernel_driver(dev_handle, USB_INTERFACE);
        libusb_close(dev_handle); //close the device we opened
        libusb_exit(ctx); //needs to be called to end the
        return 0;
    }
    


    Ahora bien debemos compilar el programa con libusb y ejecutar este programa con sudo

    # Instalar la libreria necesaria
    sudo apt-get install libusb-1.0-0-dev
    # Instalar GCC
    sudo apt-get install build-essential
    # Compilar
    g++ blackwidowkeyboardinit.cpp `pkg-config libusb-1.0 --libs --cflags` -o blackwidowkeyboardinit
    
    # Ejecutar el programa
    sudo ./blackwidowkeyboardinit 
    
    #Ahora bien debemos moverlo a una ubicacion final
    sudo mv blackwidowkeyboardinit /usr/bin/blackwidowkeyboardinit
    

    Y por ultimo volvemos a probar con evtest.

    Ahora si veremos las entradas del teclado cuando presionemos algún MacroKey...

    Lo que queda es que el programa se ejecute con permisos de super usuario, cuando se inserta el teclado. Para eso recurrimos al udev.
    #Dentro de la carpeta /etc/udev/rules.d
    #Creamos un archivo 
    sudo touch 40-razer_blackwidow_keyboard.rules
    
    #Con el contenido
    #ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010d", RUN+="/bin/sh -c 'echo == >> /home/koza/udev-env.txt; env >> /home/koza/udev-env.txt'"
    #ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010d", RUN+="/usr/bin/blackwidowkeyboardinit"
    
    #Refrescamos las reglas con udev
    sudo udevadm control --reload-rules
    
    #Reiniciasmos udev
    sudo service udev restart
    

    Tomar en cuenta que la primera linea del archivo se puede eliminar, Pero por testing la dejo allí.
    Simplemente cuando insertar el teclado en un USB en home crear un archivo con los datos del ambiente.

    Si quieres experimentar con las reglas debes simplemente ejecutar el comando siguiente después de cada cambio.

    udevadm control --reload-rules && udevadm trigger
    


    Nota: Probado en Debian 8 (Jessie)

    AEM hablemos del arquetipo 11

    Cuando creamos un proyecto con AEM. Siempre es importante saber que arquetipo estamos usando. Pues esto me determinara que source, herramien...