物理量の単位は、科学者やエンジニアにとって非常に重要です。彼らは頻繁にコミュニケーションを取りますが、残念ながら、大きなミスやコストのかかるミスにつながる可能性があります。JMP内で単位を管理し、こうしたミスを軽減するためのアドインが開発されました。このアドインは、JMP 18の新機能であるPython統合を利用して、JMP 17では実現が困難だった作業を容易に実現します。このプレゼンテーションでは、このアドインの機能と、Pythonの使用、ソース管理、テスト、ドキュメント作成、ビルドシステムなど、開発方法をご紹介します。
こんにちは、エヴァン・マコークルです。JMPの開発担当者です。今日は、JMP 18の新しいPython統合機能を使って開発したアドインについてお話したいと思います。このアドインは物理単位の変換を行うもので、このアドインを開発した理由、開発方法、開発に使用したテクニック、そしてJMP 18のPython統合機能の詳細についてご説明します。
私の研修と初期のキャリアはエンジニアでした。その研修と初期のキャリアでは、様々な単位系や単位の種類、主に米国慣用単位とメートル法を扱わなければなりませんでした。皆さんの多くも同様の経験をされていると思いますし、単位変換の問題が原因で、多くの注目を集め、大きな損失をもたらしたミスがあったことをご存知の方も多いでしょう。そのため、私は常に単位変換を確認するためのツールを使うようにしていました。
よくPintというPythonライブラリを使っています。JMP 18の新しいPython統合機能を見ていて、JMPの既存の列に単位を注釈として追加できるかどうか試してみたかったんです。列に単位を付けて、単位変換や単位の検証などに使えるでしょうか?
それがこのアドイン開発のきっかけでした。このアドインの機能では、表を読み込むと、列の括弧内の単位を検出し、単位プロパティを自動割り当てして検証します。表全体と単位を一目で確認したり、単位を一括変更したり、使用されている単位と略語をシステムが認識していることを確認したり、単純な数式列の単位を判別したりすることができます。
このアドインの最大の強みは、列の単位変換です。例えば、インチからミリメートルへの変換などです。この変換は、既存の列内で行うことも、新しい列として行うこともできます。データを変換すると、参照線、アクセス設定、仕様制限などの列のプロパティも変換されます。
これらの機能に加えて、サポートされているすべての単位とその構成方法を参照できるデータベースと、JSL APIも用意されています。ご興味のある方は、画面上のQRコードをご覧ください。または、コミュニティにアクセスして単位変換アドインを探してください。
アドインの機能については以上です。次に、アドインの開発方法についてお話しします。アドインのソース管理には、Gitと社内GitLabインスタンスを使用しました。アドインのビルドと展開には、ビルドアドインJSLファイルとマニフェストJSLファイルというカスタムソリューションを使用しました。これについては後ほど詳しく説明します。テストにはJSL Hamcrestフレームワークを使用しています。GitHubで公開しています。私はこのフレームワークの共同開発者です。JMP内部では、JMP自体のテストにこのフレームワークを使用しており、このアドインのテストにも使用しています。
ドキュメントは主にMarkdownファイルで、Pandocを使ってHTMLに変換し、アドインに挿入してJMPの組み込みウェブブラウザで表示しています。すべてJSLとPythonで実装されており、Pythonのpintライブラリを使用しています。また、JMP、VS Code、Git、Pandoc、Google Material Iconsなどのツールも使用しています。
アドインのトップレベルの構造は次のようになります。buildフォルダ、docs、source、tests、そしてread meマークダウンファイルがあります。つまり、テストはそれぞれ独立して独立しています。buildフォルダには、buildアドインとマニフェストファイル、そしてアーティファクトのサブフォルダがあります。このサブフォルダにはHTMLが配置され、JMPアドイン自体がビルド時に配置されます。docsは主にスクリーンショットなどです。sourceフォルダには、アイコンやメニューなどのサブフォルダがいくつかあります。menuフォルダには、非常にシンプルなアクションJSLファイルが含まれています。これらは、JMPcustファイルと、コードの大部分を占めるsourceファイルによって、出発点として使用されます。そして、def JMPcustとadding load JSLファイルがあります。
マニフェストファイルは、基本的に左側にある構造内のすべてのファイルのリストです。これらは最終的にJMPアドインアーカイブに格納され、インストールされます。ビルドアドインのJSLスクリプトは、基本的にPandocステップを実行してMarkdownをHTMLに変換し、マニフェストを読み取り、JSL ZipアーカイブAPIを使用してすべてのファイルを収集し、ビルドアーティファクトディレクトリ内のJMPアドインファイルに配置します。
新しい機能を追加したい時はいつでも、ソースアイコンにアイコンを配置します。ソースメニューに短いスタブコードを用意し、コードの大部分はソースに配置できます。これら3つのファイルすべてをマニフェストに追加し、JMPアドインのカスタムファイルを編集して、ソースメニューの小さなスタブを参照するようにします。その後、アドインをビルドしてその機能の開発を開始し、テストファイルでスイートにテストを追加します。
ソースメニューのサブルーチンは、現在のデータテーブルを検索するなど、基本的な検証を行うだけです。その後、メインのソースファイルをインクルードし、GUIを起動します。このように分離した理由は、このメインソースファイルをテストに簡単にインクルードし、GUIを起動せずにその機能をテストできるようにするためです。これは、メニューをクリックしたときに対話的に呼び出されるソースメニューとテストファイルの間の適切な分離であり、どちらもsource-sourceを介して実行されます。
さて、最後に、このアドインの大部分は新しいJMP 18 Python統合を使用しているので、その仕組みについて詳しく説明したいと思います。これは基本的に3つの部分で構成されています。まず、アドインのロードファイルです。アドインがロードされるたびに、Pythonパッケージのインストールを試みます。pintもその1つです。これをインストールし、インストールされていることを確認してください。次に、アドインと一緒にインストールされるcom_jmp_unitconversion.pyファイルがあります。これを完全修飾名でインポートします。
基本的に、この Python ファイルにあるものはすべて一連の関数定義であり、それらはすべて pint ライブラリを使用しています。ただし、実際の作業はありません。関数定義があるだけです。次に、コア JSL コードで、完全修飾名を使用してこれらの Python 呼び出しをラップし、JSL 関数内の Python 統合を使用します。そうすると、アドインの残りの部分では、右側にある JSL 関数を使用できます。単位は変換可能ですか? フィートからキロメートルへ? はい。フィートからミリリットルへ? いいえ。これは通常の JSL 関数を使用しているだけですが、内部的には Python 統合を使用して Python コードに組み込まれます。すべてはアドインのロード時にセットアップされ、すべての Python コードがこの 1 つのパッケージ内に適切に含まれており、Python 名前空間全体を汚染することはありません。
JMP 18の新機能であるPython統合を使って、この物理単位変換アドインを開発しました。ありがとうございます。