How I Used JMP on a Server with Add-ins to Save My World
We have several JMP add-ins that are used by 100+ users. The add-ins require JMP, an Oracle ODBC client, and custom menus. Initially, we deployed the add-ins to individuals' PCs, which required installing JMP and Oracle, as well as configuring ODBC drivers and add-in menus on each PC. It was a maintenance nightmare, because every week, someone's hard disk failed or their PC was reimaged.
To reduce this burden, we opted to use Citrix servers to run JMP and the add-ins. We are in the process of switching from Citrix to Microsoft Remote Desktop Protocol (RDP). The benefits include:
- Only needing to set up things once.
- Excellent performance for our overseas users.
- Additional level of security.
This talk provides details on server setup, security, configuring Oracle, configuring JMP add-ins, code maintenance, and how users save files from Citrix or RDP.
Name is Peter Mroz. I'm with Johnson & Johnson. Today, I'm going to give a talk about server JMP and how it saved my world. Share my screen.
Again, my name is Peter Mroz. I'm with Johnson & Johnson Innovative Medicine. Today, I'm going to talk about how I used server JMP with Add-Ins to Save My World. Standard disclaimer, this presentation represents my views. It does not imply any formal endorsements of any product by Johnson & Johnson.
Who are we? We are Johnson & Johnson Innovative Medicine. Our charter is to discover and develop innovative medicines and solutions that transform individuals' lives and solve the most important unmet medical needs of our time. My department is called Global Medical Safety. We are tasked with protecting patients by driving robust medical safety excellence and benefit risk assessments.
My group is called Methods and Analysis, and our goal is to develop and implement analytic tools to increase efficiency and analytical capability to detect and evaluate safety signals. In a nutshell, we collect process, report and analyze safety data for most of the drugs for Johnson & Johnson. The rest of my team is over here on the right. You can see me here. These are my 4 grandkids, including a brand-new granddaughter down here.
What's on our agenda today? I'm going to talk about the problem, talk about the solution, and then go into some details about the server environment, talk about security, how to configure Oracle, how to configure JMP Add-Ins and some code maintenance tips and then how users save files from Citrix or RDS. So the problem we faced was we have several JMP Add-Ins that are used by 100 plus users, and they require JMP, they require a connection to Oracle, they require custom menus. Initially, we deployed them as Add-Ins to individual PCs. So each PC required JMP, Oracle, configuring ODBC drivers, and the added menus themselves. This worked, but it was a maintenance nightmare because every week, somebody's hard disk failed, their PC was reimaged, or they got a new computer without anything on it. It was just a lot of work.
We switched to using Citrix servers to run JMP and the Add-Ins. We're right in the middle of switching from Citrix to Microsoft remote desktop services or RDS, but they're basically the same thing. The benefits include, you only need to set up things once. The performance for our overseas users is excellent because you're just sending screens back and forth. You're not sending data unless you save something.
There's additional levels of security. When you make changes, they're deployed once per server, not once per user. The reason we're switching to RDS, it's less expensive than Citrix, it's a component of Windows, it uses something called remote desktop protocol, and you need a Microsoft computer access license for that.
This is our environment. We have, an Oracle database, and we have right now, there's three Citrix servers, but they're going be converted soon to running RDS, and they're running JMP. Then our users are out here, and they connect via a web link to the servers, which then runs JMP and sends the output back to their screens.
Citrix is an American Multinational Cloud Computing and Virtualization Technology company that provides server application to desktop virtualization, networking, software as a service and Cloud Computing Technologies. Then, Microsoft remote desktop services or RDS provides application virtualization. You can map drives, printers. It's a proprietary protocol developed by Microsoft, and provides users with a graphical interface to connect to another computer over a network connection. The user employs RDS built in client software, and the host computer must enable RDS service software.
We have multiple servers. There's load balancing involved. A little bit about the RDS configuration, and this is about as technical as I'm going to get about RDS. There's a connection portal that picks which server to use for load balancing. There's a web front end, for RDS on a separate server. It's a component piece on top of RDS. It shows a list of applications. Here's a couple of applications that are available to users, and it's using Microsoft IIS for a web page. So that's about as deeply technical as I'm going to get on this. If you want to set up RDS or Citrix for your company, you'll need to talk to your IT department.
For security, we use something called Identity Management System, and you put in a request, and you are assigned to groups for development, QA, or production. You can only run JMP if you have access to this specific group for development QA or production. In addition, we have Oracle Tables that list, the Add-Ins, the users, the roles, and then there's connectors for different levels of security for each user in which in each Add-In. Then, we use an admin account for maintenance, to remote log in to a server. Let's talk about the Oracle configuration.
On the server, you need to install an Oracle client, and you need two environment variables. Oracle Home, which is the location of your Oracle client, and TNS_ADMIN, which is where your TNSNAMES.ORA, SQLNET.ORA files are. So TNSNAMES.ORA has all the aliases for your databases, and then it tells Oracle where to look for these databases. You need to determine the name of the Oracle driver for the ODBC connection. To do this, easiest way, is to hit the Windows key, ODBC, and then select ODBC data sources 64 bit, click on the driver's tab, and that shows the Oracle driver name, Oracle in OraClient19Home1.
How do you use this Oracle driver name to make a connection? Here is a simple, JSL script. I have a something called tns_alias. It's my database. That's how it's listed in the TNSNAMES.ORA.
Then a connector text, DBQ is my TNS alias. Here's my username and password. Then the driver text is driver, and then here's my Oracle in OraClient19Home1. This can be difficult to find. It's a good tip for how to find it.
Then we combine those two into a DSN string and create a database connection using that and assign it to this variable 1 DBC. The connector string looks like this when it's all done. Then to run SQL using this, you would call execute_sql with a connector and a simple SQL statement like that, and then close the database connection. How do you configure JMP Add-Ins? You would install jump on the server, and then you need to create Add-In folders in this directory.
C: \ProgramData\SAS\JMP\addIns. The case is important. So capital P, capital D, all caps, capital I. It took several iterations with the JMP support desk to figure out that this is a capital I, and these are capital P, capital D. Once we got that straight, it works fine.
We use, the Add-In "id" for the folder name. Here you can see an example of, 5 Add-Ins that are sitting on this remote server. Each folder contains one file. Just addin.def. So here's an example of addin.def file.
The ID identifies the alias for the Add-In, com.jnj.gms.pv-analyze-prism. There's a name, there's a home, and there's a minimum jump version. What does this home thing mean? Home is where the heart is. Home is where all the JSL scripts for the Add-In are stored.
Here's this folder right here, and then here's all my JSL scripts. The file addin.jmpcust stores the menu for the Add-In. All of our Add-Ins are custom menus. But let's talk about menus. The way we set it up, we don't want anybody running menu options if they don't have proper security.
Each menu item declares a global variable pointing to a program and that includes a launch program to check security. To see this, you can and jump click on view, customize menus and toolbars, and then in the upper right click change, select JMP Add-In and then select the desired Add-In here and then click okay. Now you'll see the menu for this particular Add-In is lit up. You can change things. Here's a typical menu entry. I have a global variable pointing to the program to run, open datatable.jsl.
This data Add-In home with the ID inside, that means you don't have to tell JMP. You don't have to specify the actual hard disk location. It just looks here and decodes it from your addin.dev file. The second line says include this launch_pva_menu.jsl script. That's what's stuffed into this, actions part of the menu. Just run this jsl. You also have to check, use this Add-In home folder, com.jnj.gms.pv-analyze-prism. Here's the launch program. We're including a couple functions, database access script. Then I'm calling valid PPA user.
It looks up the user in Oracle security tables. If they're not in the tables properly, you get an error message, and you're thrown out. There's some JMP version dependencies. I think this was written before we had the version minimum JMP version in the addin.dev file, or maybe I just didn't know about it.
But, anyway, once we could pass that, we'd look to see if something's in that program name. If it contains a JMP app extension, that's application builder, we open the program. Otherwise, it's a JSL script and we include it. For code maintenance, we've got, three environments. We've got development, QA, and production, and 1 server for development, 1 for QA, 3 for production.
After successful validation, updated files are copied to relevant servers. I use a program called Total Commander to sync these folders up, and we'll see that in a minute. Citrix and RDS are a little bit different. Actually accessing files on your... At least we use something called OneDrive. It's different.
If you save to the desktop or documents of the server and JMP, that's going to save on the server itself, which is not allowed. To help this along, we click on file preferences file locations. Then for both data files directory and save as directory, we specify in this case, our OneDrive location. It's a little different between Citrix and RDS. Citrix is Client\C$. This is tsclient\C.
But the rest is users, your username, OneDrive, JNJ. That's our customized OneDrive location. From then on, anytime you open a file or save a file, it will by default go to your OneDrive and not try to save on the server.
Let's do a quick demo. Go to here. This is my login screen for RDS. I'm going to go ahead and log in. It's going to generate an RDP file and then run it. If you right-click here you want this to be checked. Always open files of this type. It's just connecting me here. Here's, Server JMP running on our development instance, and I can open something up… My data, and let's run, distribution.
Then we'll save it. It's going to save to my OneDrive. I'm going to put it in a folder called temp. Okay. Now I've saved it to my hard drive. It's still saving, it looks like. Now I do have JMP running locally on my computer, and let's see what happens if I click and drag this in here. There it is. I generated it on a server and, it's just there's a way to prove that it actually works.
Okay. The other thing I wanted to show you was server itself. Here I am logged on to the actual RDS server. We've got JMP 16 and JMP 18 installed on here, and this is my utility that I use called Total Commander.
Just wanted to show you an example of when I have stuff waiting to be copied to the server. This is on a file share. This D location is the location of the Add-In for this particular application. I'm going to synchronize directories with this button here, and I'll compare, and I'll sort it by date. It looks like we have a couple files here that can be updated.
I only want to do one though. One of my favorite features is I can right-click here and say compare left and right. This was a simple change. There was a comment in the wrong place, and I put it down here in the right place. If I want to synchronize it, I'll click synchronize. Copy things. Done. That's all I wanted to demo for server JMP. Let's go back to our presentation. In conclusion, running JMP on a server is great for Add-Ins. You only need to set things up once.
The performance for our overseas users is excellent. There are additional levels of security and changes are deployed once per server, not once per user. Basically, server JMP plus Add-Ins has saved by world. That's it. Thank you very much.