20
@UnitAPI #JSR363 The First IoT JSR: Units of Measurement JSR-363 Werner Keil | Otávio Santana @wernerkeil | @otaviojava @UnitAPI https://www.jcp.org/en/jsr/detail?id=363 http://unitsofmeasurement.github.io

The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

Embed Size (px)

Citation preview

Page 1: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

The First IoT JSR: Units of Measurement

JSR-363Werner Keil | Otávio Santana@wernerkeil | @otaviojava@UnitAPIhttps://www.jcp.org/en/jsr/detail?id=363http://unitsofmeasurement.github.io

Page 2: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

What is JSR-363?

6,370.98 milesA Quantity

A Unit

Page 3: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Why do we need JSR-363?There are no specifications or standards for handling units in Java.

The current solution is to use primitives, that don’t provide any Type Safety.

The errors are difficult to find using unit testing: Interface and Internationalization (e.g. radian/degree,

meters/feet);Arithmetic operations (e.g. overflow);Conversion between units (e.g. from same domain);

Page 4: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

What is JSR-363?

Interfaces and abstract classes supporting unit operations including:Checking of unit compatibility;Expression of measurement in various units; andArithmetic operations on units.

Concrete classes implementing standard unit types (base, derived), unit conversion and representation.

A framework supporting robust representation and correct handling of quantities.JSR 363 establishes safe and useful methods for modeling physical quantities.

Page 5: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

System of UnitsSystem International d’Unites (SI)

The accepted basis for most scientific and engineering activities.

Standard units for key physical quantities (length, time, power etc.)

Standard prefixes (kilo/micro etc.)

Standard dimensions…

Système

International d'Unités

Page 6: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

DimensionAllows analysis of a quantity by the rational powers of the 7

fundamental dimensions (quantities are compatible when they have the same dimensions):

length (L), mass (M), time (T), electric charge (I), absolute temperature (Θ), amount of substance (N) and luminous intensity (J)

Examples:Speed = length/time - it’s dimensions are L=1,T=-1 (rest 0) (e.g. metre/second - ms-

1)

Acceleration is speed/time (m/s/s or ms-2) L=1, T=-2

Force is mass x acceleration M x ((length/time)/time) or M=1, L=1, T=-2

Molar Entropy: M=1 L=2 T=−2 Θ=−1 N=−1 (trust me!)

Page 7: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

QuantityA physical attribute of a thing. Something that can be measured and

has units. Compatible quantities have the same dimension…

Examples:• Time• Length• Speed• Amount of Substance• Luminous Intensity• Volume• Mass• Force• Power• Electrical Current

• Magnetic Flux Density• Volumetric Flow Rate

• Fuel Economy*• Percentage

• Eggs per carton• Sheep per hour• Bits and bytes …

… ∞

Page 8: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Unit ConversionThe process of conversion depends on the specific situation and the

intended purpose. This may be governed by regulation, contract, technical specifications or other published standards.

Wikipedia

Page 9: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

1983: The Gimli “Glider”

Photo: Wayne Glowacki

Maintenance workers performed a test that estimated that 7,682 litres of fuel were in the tank. They knew they needed 22,300 kilograms of fuel for the remaining flight, so the question was, How much fuel, in litres, should be pumped from the fuel truck into the aircraft? They were forced to resort to a manual calculation:

They multiplied 7,682 L by 1.77, the density of the fuel provided by the refuelling company on their documentation: The aircraft, according to their calculations, currently had 13,597 kg of fuel.

Subtracting from 22,300 kg, they decided they needed to add 8,703 kg of fuel.

Dividing by 1.77 — the same density used in the previous calculation — yields 4,916 L, which was pumped into the aircraft.

However, 1.77 was the density of the fuel in pounds per litre (lb/L), not kilograms per litre (kg/L); the correct figure for kg/L would have been 0.80. As a result, they ended up with less than half of the required amount of fuel on board. (The fuel's density depends on characteristics of the fuel, so it's not a constant, and the value must be taken from documentation accompanying the fuel.)

Page 10: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Some real-life mishaps…[Cost $125M]

“Preliminary findings indicate that one team used US/English units (e.g. inches, feet and pounds) while the other used metric units for a key spacecraft operation.”

NASA Mars Climate Orbiter, 1999

Page 11: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Conversion problemsThese are examples of confusion on the units in application.

But there is also ambiguity on the unit itself:10 Gallons … Gallon Dry / Gallon Liquid - Gallon US / Gallon UK28 Days … Day Sidereal / Day Calendar38 Degrees … Degree Celsius / Degree Fahrenheit / Degree

Angle

And the wrong conversion factors:static final double PIXEL_TO_INCH = 1 / 72;double pixels = inches * PIXEL_TO_INCH;

Page 12: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

What is the problem, in code?

float distance = 6370.98; //in milesfloat speed = airplane.getSpeed(); //in km/hSystem.out.println(“TTD: “ + (distance/speed) + “ h”);

6,370.98 milesA Quantity

A Unit

Page 13: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

What is JSR-363, in code?

Quantity<Length> distance = Quantities.getQuantity(6370.98, USCustomary.MILE);Quantity<Speed> airplaneSpeed = getAirplaneSpeed();Quantity<Time> timeToDest = (Quantity<Time>)distance.divide(airplaneSpeed);System.out.println(“TTD: “ + timeToDest.to(Units.HOUR));

TTD: 10.84983093613525 h

Page 14: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Who is going to use JSR-363?Java developers who work with physical quantities need to handle measurements in their programs.

Inadequate models of physical measurements can lead to significant programmatic errors.

Platform providers and developers can provide and use a more well-defined API.

Embedded developers can have less error-prone, more self-documented code.

Page 15: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

JSR-363: Internal StructureJSR-363 is broken down into the following packages:

Package Descriptionjavax.measure Core API interfaces (e.g. Dimension, Quantity, Unit)javax.measure.format [optional] Interfaces for quantity/unit formatting and parsingjavax.measure.quantity

[optional] Interfaces for quantity types (e.g. Mass, Length)

javax.measure.spi [optional] Service Provider Interface (implementation discovery)

Reason: We target very small devices running Java ME (CLDC 8) for IoT applications (e.g. sensors, wearables, gateways etc.)

Page 16: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

JSR-363: Systems and ExtensionsOn top of JSR-363 we offer support

for various unit systems:• Reusable Quantities• SI System• Common Systems (US, Imperial)• ISO 80000• UCUM

Reason: By providing small, modularlibraries, we live and sometimes forestallthe ideas behind Java ME 8 or Jigsaw andoffer great flexibility to IoT solutions

Page 17: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

JSR-363 timelineMarch 11, 2014: SubmittedApril 7, 2014: Creation approvedDec 2014 – January 2015: Early Draft (done)Q3/2015 – Q4/2015: Public Review (approved)Q2/2016 : Final DraftQ3/2016 : Final Release

Page 18: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@YourTwitterHandle#DVXFR14{session hashtag} @UnitAPI#JSR363

Action

!

Images: Showtime / Fox 21

Page 19: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@UnitAPI#JSR363

Links to JSR-363Public mailing list(s) and/or forum(s)

Units-Dev on Google GroupsUnits-Users on Google GroupsEG only mailing list on java.net, archive fully visible (while

java.net exists)JSR detail page on JCP.org: https://www.jcp.org/en/jsr/detail?id=363

Project website on GitHub: unitsofmeasurement.github.io

Page 20: The First IoT JSR: Units of Measurement - JUG Berlin-Brandenburg

@YourTwitterHandle#DVXFR14{session hashtag} @UnitAPI#JSR363

Q & A