I love blogging about new technology appropriate for the enterprise. I want to change the face of innovation to embrace change, agility and promote an innovation culture.
Wednesday, 13 February 2019
IoT in action
Wednesday, 6 February 2019
Fraud detection in JDE using AI and orchestration
- Custom AI algorithm to recognize particular objects that you have trained the algorithm with
- Character recognition algorithm that can turn something like this:
700N $99 TCOME E $45 $66 EACH 57 20% 20 PARTICIPATING BEER, PRE-MIX AND CIDER OFF 1 LITRE Vad Cruiser Captain Morgan Spiced Gold Rum, Smirnoff Red Vodka OR Canadian Club 700mi Whole team over? Covered. Baron Samedi Spiced Rum OR Jack Daniel's Old No 7 700ml HAHN Bombay Sapphire Gin 1 Litre 2 FOR BUY 2 OR MORE CASES OR 10 $28 CASE CASES OR 10 PACKS $41 CASE SA $10 EACH Coron "Extra SEST SERVED OVER VI Dew MAVE UP TO CASE DE PORTO ΚXXX XX GOLD GOLD CERVER MA BOURBON HAHN Heineken WHISKEY MIXED WITH PREMIUM CIDE MERCURY 4 LITRES PERON STRO AZZU Aceand hotely CERVECERIA MODELO, S.A MEXICO, D.F. PREMIUM Cola KOPPARBERI 'BUILT TO LAST 22. SIZ ITU TELS ASTUNDA perDry EST RUM 18 PREMIUM Scotch 700m De Bortoll Premium 4 Litre Casks Excludes fortified Apple IRON JACK 6.3% LARD CIDEI ORIGINAL XXXX Gold Bottles or Cans 24x375ml 24 PACK 6.9% ALC/VOL & COLA 190 mL 45% ALCNVOL HISP AUSTRALIAN LAGER EST 1911 HODART, TAS Heineken Premium Lager Bottles 24x330ml OR Coopers Premium Lager Bottles 24x355ml SUPER Peroni Nastro Azzurro Bottles 24x330ml 10 CANS 24 PACK SUPER SAVER S SUPER SAVER 10 CANS CANS SUPER SAVER SUPER SAVER EACH EACH SA EACH EACH EACH S BREW OOPERS HRB WERY TOOHEYS VODKA COOPERS PURE CI SAD BLONDE Um Low Carb Logo LOW CARU DRY VELVE ARK AL WOODSTOCK CRUISER BOURBON ORCHARD AND COLA THIEVES RASPBERRY Special - FACE GAMUN BOKLESS CARBOHYDRATES Houghton Classic Shingleback Red Knot AUS Twelve New Zealand Pinot Noir CLEAN CRISP TASTE APPLE CIDER Hardys HRB 2750 46% ALCANO Mumm Cordon Rouge Champagne NV 24 6.0 PACK 30 CANS IN-STORE @ your local BWS PICK UP Shop online. Collect instore. WITH YOUR GROCERIES @ woolworths.com.au/bws SIMPLY SHOP, SCAN AND SAVE with Woolworths Rewards at BWS rewards 17" We support the responsible service of alcohol. Available in SA from Wednesday 11 April until Tuesday 17 April 2018 unless sold out prior Savings are based on offers apply to the quantity advertised only. Limit rights reserved. Specials may not be available in all stores including Alice Springs. "Standard local call charges y by store. Wine is 750ml unless otherwise stated. At this great price no further discounts apply Casks not available in Adelaide City or Rundle Mall. See www.woolworthsrewards.com.au for terms and conditions Selected cases may not be available in all stores. WC110418/SA Page 35
- Standard object detection
- Landmark detection
In action:
- I create my custom table (F55DUPINV) and view combo in my “database of choice” that is going to hold the text retrieved out of any attachment. Note that there is going to be smarts here, because the text will be long.
- I create an orchestration that takes a parameter of MO data structure name and calls my API (webhook) via a connection. This retrieves the text and then inserts this into a JDE form (or via a database connector if too big)
- This orchestration will also hash the text to a unique value for quick uniqueness checks.
- I can then have another scheduled orchestration that looks for new duplicates (or fuzzy logic like) and sends an email to the fraud officer of the instance, with a link to the actual transactions.
Monday, 4 February 2019
Orchestration enhancements - SFTP
"Connectors" : [ {
"reportName" : "R0004C",
"reportVersion" : "XJDE0001",
"jobNumber" : 24,
"executionServer" : "F5ENT",
"jobStatus" : "D",
"objectType" : "UBE",
"user" : "SM00001",
"environment" : "JPLAY920",
"submitDate" : "20181030",
"lastDate" : "20181030",
"submitTime" : "174358",
"lastTime" : "174400",
"oid" : "R0004C_XJDE0001",
"queueName" : "QBATCH",
"fileName" : "/upload/R0004C_XJDE0001_24_PDF.pdf"
} ]
}
Friday, 18 January 2019
Using AI and image recognition with JD Edwards
Introduction
This blog post is hopefully going to demonstrate how Fusion5 (quite specifically William in my team) have been able to exploit some really cool AI cloud constructs and link them in with JD Edwards. We’ve been looking around for a while for use cases for proper AI and JD Edwards, and we think that we have something pretty cool.I want to also point out that a lot of people are claiming AI, when what they are doing is not AI. I think that true AI is able to do evaluations (calculations) based upon a set of parameters that it has not necessarily seen before. It's not comparing the current images to 1000000's of other images, it has been trained on MANY other images and in it's internals it has the ability to apply that reference logic. That model that has been built from all of it's training can be run offline, it's essentially autonomous - this is a critical element in the understanding of AI.
We are using JD Edwards orchestration to call out to an external web service that we’ve written (web hook). This web hook has been programmed to call a number of different AI models to interpret images that have been attached to JD Edwards data. So, if you use generic media object attachments – this mechanism can be used to interpret what is actually in those images. This can greatly increase the ability for a JD Edwards customer to react to situations that need it.
For example if you used JD Edwards for health and safety incidents and you wanted some additional help in making sure that the images being attached did not contain certain critical objects – and perhaps if they do, you’d raise the severity or send a message based upon the results… You could also analyse frames of video with the same logic and detect certain objects.
We’ve decided to test the cloud and are using different models for our object detection. we are using google, Microsoft and AWS to see if they are better or worse at object detection.
Object detection vs. Object Recognition
Note that there is a large difference between object detection and object recognition. – stolen from https://dsp.stackexchange.com/questions/12940/object-detection-versus-object-recognitionObject Recognition: which object is depicted in the image?
- input: an image containing unknown object(s)
Possibly, the position of the object can be marked in the input, or the input might be only a clear image of (not-occluded) object. - output: position(s) and label(s) (names) of the objects in the image
The positions of objects are either acquired form the input, or determined based on the input image.
When labelling objects, there is usually a set of categories/labels which the system "knows" and between which the system can differentiate (e.g. object is either dog, car, horse, cow or bird).
- input: a clear image of an object, or some kind of model of an object (e.g. duck) and an image (possibly) containing the object of interest
- output: position, or a bounding box of the input object if it exists in the image (e.g. the duck is in the upper left corner of the image
| My PowerPoint skills are really being shown off in the above diagram of what has been done. |
We’ve created an orchestration and a connector that are able to interrogate JDE and send the various attachments to the AI models and have some verification of what is actually in the images. Note that this could easily be put into a schedule or a notification to ensure that this was being run for any new images that are uploaded to our system.
Testing
Let’s scroll deep into google images for train graffiti. The reason I scroll deep is that these algorithms were trained on 70 pics of trains and 70 pics of graffiti and also 40 pics of syringes. I want to ensure that I'm showing the algorithm something that it has never seen before.And attach this to an address book entry in JD Edwards as a URL type attachment.
In this instance we are using the above parameters. 300 as the AN8 for ABGT and only want type 5’s.
William has written an orchestration which can run through the media objects (F00165) for ANY attachments. We're currently processing image attachments, but really - this could be anything.
To call our custom orchestration, our input JSON looks like this:
{The provider in this instance is a model that we have trained in customVision in Azure. We've trained this model with the same images as Google, and also our completely custom model.
"inputs" : [ {
"name" : "Object Name 1",
"value" : "ABGT"
}, {
"name" : "Generic Text Key 1",
"value" : "300"
}, {
"name" : "MO Type 1",
"value" : "5"
}, {
"name" : "Provider",
"value" : "customVision"
}, {
"name" : "ModelName",
"value" : ""
} ]
}
{Not too bad, it’s 91% sure that there is graffiti, 60% sure that there is a train and pretty sure that there are no syringes. Not too bad, let’s try google now
"Data Requests" : [ {
"Data Browser - F00165 [Media Objects storage]" : [ {
"Media Object Sequence Number" : "1",
"GT File Name" : "https://c1.staticflickr.com/6/5206/5350489683_e7cdca43ba_b.jpg"
} ]
} ],
"Connectors" : [ {
"graffiti" : 0.9162581,
"train" : 0.599198341,
"syringe" : 0.00253078272
} ]
}
A simple change to the provider parameter allows us to use google next. Note I did have some issues with my screen shots, so that might reference some different pictures, but revealed these results.
{Results
"inputs" : [ {
"name" : "Object Name 1",
"value" : "ABGT"
}, {
"name" : "Generic Text Key 1",
"value" : "300"
}, {
"name" : "MO Type 1",
"value" : "5"
}, {
"name" : "Provider",
"value" : "autoML"
}, {
"name" : "ModelName",
"value" : ""
} ]
}
{Similar, it thinks that there is 99.99% chance of graffiti and 82% chance of a train – more certain than Microsoft.
"Data Requests" : [ {
"Data Browser - F00165 [Media Objects storage]" : [ {
"Media Object Sequence Number" : "1",
"GT File Name" : "https://c1.staticflickr.com/6/5206/5350489683_e7cdca43ba_b.jpg"
} ]
} ],
"Connectors" : [ {
"graffiti" : 0.9999526739120483,
"train" : 0.8213397860527039
} ]
}
Finally, let’s try a hosted model that we are running on google cloud:
We drive that with the following parameters
{And the output is:
"inputs" : [ {
"name" : "Object Name 1",
"value" : "ABGT"
}, {
"name" : "Generic Text Key 1",
"value" : "300"
}, {
"name" : "MO Type 1",
"value" : "5"
}, {
"name" : "Provider",
"value" : "customModel"
}, {
"name" : "ModelName",
"value" : "multi_label_train_syringe_graffiti"
} ]
}
{
"Data Requests" : [ {
"Data Browser - F00165 [Media Objects storage]" : [ {
"Media Object Sequence Number" : "1",
"GT File Name" : "https://c1.staticflickr.com/6/5206/5350489683_e7cdca43ba_b.jpg"
} ]
} ],
"Connectors" : [ {
"graffiti" : 0.9984090924263,
"syringe" : 7.345536141656339E-4,
"train" : 0.9948076605796814
} ]
}
So it’s very certain there is a train and graffiti, but very certain there is no syringe.
What does this mean?
We are able to do some advanced image recognition over native JD Edwards attachments using some pretty cool cloud constructs. We’ve trained these models with limited data, and have some great results. Although we should really try some images without trains or graffiti (trust me, this does also work). We are paying a fraction of a cent for some massive compute to be able to load our models and process our specific AI needs.You could be on premise or in the cloud and STILL use all of these techniques to understand your non structured data better. This is all done with a single orchestration.
Fusion5 have the ability to create custom models for you and find actionable insights that you are interested in and ensure that this information is ALERTING users to ACT.
What does out AI algorithm think of me?

Let’s process this for a joke: "https://fusion5.com.au/media/1303/shannonmoir-300.jpg"
{Above is an example of processing a picture of “yours truly”, to see what Azure thinks…
"Data Requests" : [ {
"Data Browser - F00165 [Media Objects storage]" : [ {
"Media Object Sequence Number" : "1",
"GT File Name" : "https://c1.staticflickr.com/6/5206/5350489683_e7cdca43ba_b.jpg"
}, {
"Media Object Sequence Number" : "2",
"GT File Name" : "https://fusion5.com.au/media/1303/shannonmoir-300.jpg"
} ]
} ],
"Connectors" : [ {
"graffiti" : 0.9162581,
"train" : 0.599198341,
"syringe" : 0.00253078272
}, { "graffiti" : 0.100777447,
"syringe" : 0.006329027,
"train" : 0.00221525226
} ]
}
10% chance graffiti and no syringe or train… not bad…
Great, so if this was attached to an incident in JDE, you might want to still raise the priority of the case, but not becasue there is graffiti or a train!
What’s next
We (Innovation team at Fusion5) are going to integrate this into JD Edwards and increase the priority of incidents based upon what is seen in the images.These algorithms can be trained to look for anything we want in images and we can automatically react to situations without human intervention.
Another very simple extension of what you see here is using AI to rip all of the text out of an image, OCR if you like. It’d be super simple to look through ALL images and convert them to text attachments or searchable text.
Imagine that you wanted to verify a label or an ID stamp on an object, this could all be done through AI very simply!
Friday, 21 December 2018
Technical Debt - again
At Fusion5 we are doing lots of upgrades all of the time, so we need to understand our clients technical debt. We strive to make every upgrade more cost efficient and easier. This is easier said than done, but let me mention a couple of ways which we do this:
Intelligent and consistent use of category codes for objects. One of the code is specifically about retrofit and needs to be completed when the object is created. This is "retrofit needed" - sounds simple I know. But, if you create something bespoke - that never needs to be retrofitted - the best thing you can do it mark it like that. Therefore lots of time will be saved looking at this object in the future (again and again).
Replace modifications with configuration. UDO's have made this better and easier and continue to do so. If you are retrofitting and you think - hey - I could do this with a UDO - please do yourself a favour and configure a UDO and don't touch the code! Security is also an important concept for developers to understand completely. Because - guess what? You can use security to force people to enter something into the QBE line - you don't need to use code. (Application Query Security)
- Everyone needs to understand UDO's well. We all have a role in simplification.
![]() |
| If you don't know what EVERY one of these are - you need to know! |
OCM's can be used for force keyed queries. Wow!!! Did you know that you can create a specific OCM that forces people to only use keyed fields for QBE - awesome. So simple. I know that there is code out there that enforces this. This is like the above tip for security.
Wednesday, 19 December 2018
To keep a modification or not–that be the question
The cost of a modification grows and grows. If you look at your modifications, especially if you are modifying core objects – retrofit is going to continue to cost you money going forward.
How can you work out how often your modified code (or custom code) for that matter is being used?
One method is to use object identification, but this is only part of the story.
You’ll see below that ERP analytics is able to provide you things like number of session, number of unique users, Average time on page and total time on page for each of your JD Edwards applications. This can be based on application, form or version – which can assist you find out more.
With this information, you can see how often your modifications are used, and for how long and make a call on whether they are worth their metal.
Our reporting suite allows you to choose date ranges and also system codes to further refine the analysis.
You are then able to slice and dice your mods (note that we can determine modified objects too, but this is using data blending with data studio) to give you a complete picture:
Of course, we can augment this list with batch and then calculate secondary objects from cross reference to begin to build the complete picture. You want to narrow down both retrofit and testing if you can.
See below for how we look at queue concurrency and wait times to work out job scheduling opportunities and efficiencies.
Thursday, 13 December 2018
JDE scheduler problems
where SJSCHJBTYP = '1'
and SJSCHSTTIME > (select
((extract(day from (current_timestamp-timestamp '1970-01-01 00:00:00 +00:00'))*86400+
extract(hour from (current_timestamp-timestamp '1970-01-01 00:00:00 +00:00'))*3600+
extract(minute from (current_timestamp-timestamp '1970-01-01 00:00:00 +00:00'))*60+
extract(second from (current_timestamp-timestamp '1970-01-01 00:00:00 +00:00')))/60)-60 current_utime_minus_1hour
from dual);
-
Why am I still doing this. Fixing fat clients is not a lot of fun. Here is a couple of tips for connecting to the database using NTS and...
-
Ever wanted to know what that pesky OMW transfer error message code meant, here is the list of errors and what they mean in some meaningful...
-
CK : User Preference Cookies (what is saved in user preferences – Enable Hover Forms etc) GF : Grid Format (added when user adds a fri...



























