Los complementos de JMP son excelentes adiciones a las capacidades principales de JMP y, a veces, es posible que necesite automatizar la creación de complementos con JSL. Trabajé con la creación automatizada de complementos al compilar mi complemento JMP, el Generador de complementos personalizados de JMP a R . Aquí hay un ingenioso truco de JSL para la creación automática de complementos.
El código de este tutorial está adaptado de un maravilloso guión escrito por @Justin_Chilton , quien construyó el Generador de complementos personalizados .
Un complemento JMP (.jmpaddin) es un archivo Zip (.zip). Los tres componentes mínimos de un complemento JMP son los archivos addin.def y addin.jmpcust, así como el script JSL que se ejecutará cuando el complemento esté en uso. Puede agregar archivos adicionales como desee, por ejemplo, otras secuencias de comandos JSL, tablas JMP, documentos PDF o Word (comúnmente utilizados para documentación) e imágenes (a menudo utilizadas para la miniatura del complemento).
En los siguientes extractos de secuencias de comandos, todo lo que se pueda personalizar está en letras mayúsculas (p. ej., YOUR_ADDIN_NAME).
Primero, cree la cadena que se usa en el archivo addin.def. Necesitará el nombre y el ID de su complemento. El nombre es lo que se mostrará en el menú del complemento, y el ID es un identificador único para el complemento, comúnmente visto en el formato com.companyname.username.addinname.
//create string for addin.def file
addinDefString = "id=com.YOUR_COMPANY.YOUR_ID.YOUR_ADDIN_NAME
name=YOUR ADDIN NAME
supportJmpSE=0";
Si sabe que su complemento solo es compatible con Windows o Mac, respectivamente, debe agregar una línea al final de esta cadena con:
"host=Win"
O
“host=Mac”
A continuación, cree la cadena para su archivo addin.jmpcust:
addinjmpcustString = "\[<!-- JMP Add-In Builder created --><MENU_AND_TOOLBAR_CUSTOMIZATIONS jm="http://www.jmp.com/ns/menu" version="3">
<INSERT_IN_MAIN_MENU>
<INSERT_IN_MENU>
<NAME>Add-Ins</NAME>
<INSERT_AFTER>
<NAME></NAME>
<COMMAND>
<NAME>YOUR ADDIN NAME</NAME>
Your Addin Name
<ACTION type="path">$ADDIN_HOME(com.YOUR_COMPANY.YOUR_ID.YOUR_ADDIN_NAME)\YOUR_SCRIPT.jsl</ACTION>
<ICON type="none"></ICON>
</COMMAND>
</INSERT_AFTER>
</INSERT_IN_MENU>
</INSERT_IN_MAIN_MENU>
</MENU_AND_TOOLBAR_CUSTOMIZATIONS>]\";
Luego, para empaquetar su script JSL como un archivo, primero cárguelo como un archivo de texto:
addinScript = Load Text File("$SOME_PATH\YOUR_ADDIN_NAME.jsl");
Luego, escribe todos tus archivos en un archivo zip:
//create a ZipArchive to write files to
za = Open("$DOCUMENTS\YOUR_ADDIN_NAME.jmpaddin", zip);
//write all necessary files to ZipArchive (which can also be binary blobs)
za << write("addin.def", addinDefString);
za << write("addin.jmpcust", addinjmpcustString);
za << write("YOUR_ADDIN_NAME.jsl", addinScript);
Finalmente, puede navegar a la carpeta en la que guardó sus archivos y ver su complemento, que se puede instalar con un doble clic.
También creé una versión más "completa en blanco" del script, en caso de que quisiera automatizar la creación de su complemento (si necesita crear múltiples y tener nombres de variables para su complemento, archivos, directorio, etc.), que se encuentra debajo.
Los dos nombres de variables utilizados en el script son addinName y dir, que se definen de la siguiente manera:
complementoNombre : el nombre de su complemento como una cadena, con espacios y mayúsculas como le gustaría que apareciera en el menú del complemento (p. ej., "JMP to R Add-In Builder")
directorio : el directorio en el que le gustaría guardar su complemento
addinDefStr = "id=com.YOUR_COMPANY.YOUR_ID" || addinName || "\!n name=" || addinName || "\!n supportJmpSE=0";
addinjmpcustStr = "\[<!-- JMP Add-In Builder created --><MENU_AND_TOOLBAR_CUSTOMIZATIONS jm="http://www.jmp.com/ns/menu" version="3">
<INSERT_IN_MAIN_MENU>
<INSERT_IN_MENU>
<NAME>Add-Ins</NAME>
<INSERT_AFTER>
<NAME></NAME>
<COMMAND>
<NAME>]\" || uppercase(addinName) || "\[</NAME>
]\" || addinName || "\[
<ACTION type="path">$ADDIN_HOME(com.jmp.]\" || lowercase(regex(addinName, "\s", "", globalreplace)) || "\[)\]\" || addinName || "\[.jsl</ACTION>
<ICON type="none"></ICON>
</COMMAND>
</INSERT_AFTER>
</INSERT_IN_MENU>
</INSERT_IN_MAIN_MENU>
</MENU_AND_TOOLBAR_CUSTOMIZATIONS>]\";
addinScript = Load Text File("$SOME_PATH\YOUR_ADDIN_NAME.jsl");
//create a ZipArchive to write files to
za = Open(dir || "/" || addinName || ".jmpaddin", zip);
//write all necessary files to ZipArchive (which can also be binary blobs)
za << write("addin.def", addinDefStr);
za << write("addin.jmpcust", addinjmpcustStr);
za << write(addinName || ".jsl", addinScript);
¡Espero que estos scripts puedan ayudarlo a que sus proyectos de creación de complementos sean más fluidos!
Puede intentar editar-> cifrar en su(s) secuencia(s) de comandos. Realice algunas pruebas y prepárese para volver a trabajar con JSL. Si solo tiene un pequeño fragmento de código secreto, considere moverlo a su propio archivo de inclusión y encriptar solo eso. El resto del código se ejecutará normalmente.
Un script encriptado tiene dificultades para mirarse a sí mismo; si usa manipulación de expresiones o convierte expresiones en cadenas, espere algo de reescritura. Usar mostrar globales(); después de que se ejecute su secuencia de comandos para tener una idea de lo que podría filtrarse.
¡Mantenga su versión de texto sin formato en un lugar seguro!
Un complemento JMP (.jmpaddin) es un archivo Zip (.zip). Los tres componentes mínimos de un complemento JMP son los archivos addin.def y addin.jmpcust, así como el script JSL que se ejecutará cuando el complemento esté en uso.
Nos gustaría proporcionar un complemento a un proveedor, pero nos gustaría que el código asociado se mantuviera en secreto. La declaración anterior sugiere que el código sería visible. ¿Hay alguna forma de hacer un complemento en forma binaria para que no se pueda (fácilmente) aplicar ingeniería inversa?
@vince_faller , el "SE" en "supportJmpSE" significa "Student Edition", por lo que solo necesita configurarlo en 1 si necesita que el complemento funcione con JMP Student Edition.
¡Gracias por organizar esto, Julia!
Solo quería agregar algunas opciones más que puede agregar al archivo addin.def.
- addinVersion: el número de versión que aparece en el cuadro de diálogo Ver > Complementos....
- minJmpVersion: la versión mínima de JMP que se puede instalar el complemento.
- maxJmpVersion - la versión máxima de JMP se puede instalar el complemento.
addinVersion=1.3
minJmpVersion=12
maxJmpVersion=13
Y si está interesado en usar uno de los íconos integrados de JMP para un elemento de menú en su complemento, consulte mi Iconos JMP incorporados add-in para los nombres de los íconos y use el formato a continuación en el archivo addin.jmpcust.
<jm:icon type="builtin">JMPProSmall</jm:icon>