Python によるミッションクリティカルなソフトウェアの開発: サクセス ストーリー

クライアントのエキスパートや業界のパートナーからの入力により、Integrated Informatics Inc. は Geodetics Toolkit という商用製品を開発しました。このツールキットを使用することにより、ユーザは地震や油井の調査報告の読み込み、解析、マッピング、および生成を行えます。ツールボックスに含まれているツールは、カスタム標準と業界標準 (UKOOA、SEG-Y、SEGP1 など) の両方に従って書式化されたテキスト データとバイナリ データを受け入れ、それをフィーチャクラスとフィーチャ テーブルのスキーマに読み込みます。

以下で、Integrated Informatics Inc. は自社の商用製品を開発して提供するための言語として Python を選ぶ理由を挙げています。同社はソフトウェア開発環境で Python を使用することの利点を挙げ、例を使用して、Python が単なるスクリプト言語よりも優れたものであることを紹介しています。最後に、同社の製品のオープン ソース ライブラリの使用についても触れています。

膨大な量の調査データへの対応

地震や油井の調査データは、石油・ガス会社のデータベースの不可欠な部分であり、視覚化、資源発見、目録作成など、いろいろな形で使用されています。石油・ガス業界には、コンピュータの利用とデジタル データ ストレージに関して長い歴史があります。その間、調査ストレージのための多様な標準が現れ、それぞれの会社が自社に最適な標準を選んだり、独自に開発したりしてきました。その結果、同じように見えても微妙に異なる調査ファイルが急増しました。

調査情報は長期にわたって存在してきたので、データの処理に使用できるツールが数多く存在しても不思議はありません。問題は、そうしたツールがより大きなソフトウェア ソリューションの一部でないことが多いという点です。そうしたツールは、何かの処理を実行したり表示したりするように作られているのですが、エンタープライズ データベースの他の部分とうまく連携しないことが多いのです。これは実際的ではありません。なぜなら、調査データを十分に活用できるのは、それらのデータを重ね合わせたり、統合したり、解析したりするときだからです。たいていの石油・ガス会社が自社のメイン GIS ソフトウェアとして Esri スタックを利用しているとすれば、さまざまな形式の地震や油井のデータを ArcGIS に直接読み込む機能をぜひとも導入したくなるでしょう。

企業環境での開発 - なぜ Python なのか

Geodetics Tools の開発では、ArcObjects ベースのアプローチを使用することもできたのですが、Python を選んだ主な理由は 2 つあります。1 つは開発のスピードで、もう 1 つは展開の容易さです。

開発のスピード

Python とジオプロセシング フレームワークはしっかりと統合されており、スクリプト ツールを実装するための推奨言語は Python です。Python を選択すれば、開発者の時間を、ユーザ インタフェースのコーディングではなく、機能のコーディングに割くことができます。結果、プロジェクトのコア部分 (ユーザ インタフェース) はすでに準備ができているため、製品をより速やかにクライアントに提供できることになります。たとえば、ジオプロセシング フレームワークによってツールを作成すると、出来上がるツールの外見と動作は、ArcGIS と共に提供されるコア ツールと同じようなものになります。つまり、デフォルトの整合チェック、ユーザ インタフェースのコントロール、およびモデル ビルダーのようにカスタム ツールでアプリケーションの他の部分とシームレスに調和させることのできるドキュメント スタイルが得られます。

Python 自体の特質によって新進プログラマの開発時間も短縮されます。Python の作成者である Guido van Rossum は、この言語を普通の英語のように直感的で簡単なオープン ソース言語として作成し、日々の仕事に適したものにしました。つまり、GIS アナリストが開発者または日曜開発者になれるほど、Python は学習しやすく、読みやすい言語です。学習に使う時間が少なくて済むので、ソリューション作成とワークフローの改善により多くの時間を充てることができます。

現在、Geodetics Toolbox には 40 個以上のツールが含まれています。ツールごとに UI をプログラミングする必要がなかったので、大幅な時間の節約になりました。節約された時間を使って、ツールのテスト、テスト ハーネスの作成、パフォーマンスの改善、および新機軸と新機能の導入に力を注ぐことができました。

展開の容易さ

Python ソリューションの優れた点の 1 つが展開の容易さです。dll を登録する必要もありませんし、面倒なインストールを実行する必要もありません。また、COM の依存関係を気にする必要もありません。Geodetics Toolbox を使用することにより、オフィス内でソリューションを zip し、クライアントのネットワーク上のアクセス可能な場所でそれを unzip することができます。コードが整えば、クライアントはツールボックスを ArcGIS Desktop に追加するだけで、その機能にアクセスできるようになります。

多くの大企業では、ソフトウェアのインストールは IT 部門の領分です。ソフトウェアが従業員に行き渡るようにするのは彼らの仕事であり、しばしば頭痛のタネになります。ソリューション プロバイダがインストールを容易なものにすれば、それだけ IT 部門に歓迎されることになりますし、クライアントも新機能にすぐにアクセスできるようになります。Integrated Informatics では、Python の使用によって、インストール プロセスを可能な限り容易にすると共に、クライアントに対する要求応答時間を可能な限り短縮することになり、クライアントを満足させる結果につながります。

企業環境での開発 - 自動化されたテスト

Geodetics Toolbox 用の Python コードには、5000 行をはるかに超えるコードが含まれています (これにはオープン ソース パッケージは含まれません)。他のすべての商用製品と同様、私たちの顧客も機能強化のリクエストを定期的に送ってきます。私たちは顧客からのリクエストに可能な限り迅速に応えることに努めています。そうした顧客からのリクエストは、新しいパラメータから新しいツールセットにまで及びます。そのため、変更によって既存の機能に影響を与えるかどうか、そして変更によってツールが正常に動作しなくなっているかどうかを把握することが重要になります。40 個以上のツールがあり、各ツールにパラメータがいくつもあって、多いものは数十個にもなります。したがって、各ツールを手動でテストするのは現実的ではありません。期待される品質レベルで目標の要求応答時間を達成するには、自動化されたテストが不可欠です。

よく言われるように、Python は「バッテリー搭載 (batteries included)」なので、テストでは、少なくともソリューションの一部については Python そのものを調べるだけで済みました。Python には、unittest という優れた標準モジュールが用意されていて、Python コア インストールの一部になっています。ツールごとに別々のテスト スクリプトを使用し、パラメータとデータ入力の組み合わせをいろいろと変えてテストします。ツールごとに別々のテスト スイートを使用することで、テスト対象を非常に明確に把握でき、営業時間中に効率よく処理できます。

ツールごとのテスト スイートというのは好ましいアプローチですが、これらのテスト スクリプトを、気が付いたときだけでなく、自動化されたやり方で定期的に実行することが非常に重要です。「継続的インテグレーション」が最近の流行ですが、この考え方は、各変更がコード ベースにチェックインされた後にトリガによってテスト スイートのすべてのテストが開始されるというものです。これは、ある種のコード ベースとある種のテストについては優れたやり方かもしれませんが、頻度の高いテストなど、処理の負荷が大きいツールについては必ずしも実践的とは言えません。さらに重要なことは、テストを定期的にトリガするという考え方です。これは夜間に行うこともできますし、週に 1 回または月に 1 回行うこともできます。どのくらいの間隔で行うかは、コード ベースが更新される頻度によります。テスト スイートを自動的に実行すれば、コードの現状を常に正確に把握できるので、コード ベースにバグが入り込んでも、問題があることをすばやく確認し、それを訂正することができます。

コードの再利用: Python のクラス

コードの重複を避けることは、プログラミングにおける基本的な考え方の 1 つです。コードの重複を避けて、コード ベースの能率を高める方法は 2 通りあります。まず、何度も繰り返し使用するコードを関数に入れることができます。関数では多くのことができるので、コードの重複を減らす方法の第一歩となります。コード ベースが大きければ、関数でできることは限定されるので (とはいえ、関数にもそれなりの役割があることに変わりはありませんが)、多くの場合はクラスを作成するのが妥当です。

Python は Esri のソフトウェアのコンテキストではスクリプト言語だと考えられていますが (たとえば、「arcgisscripting」での「scripting」の使用に注目してください)、実際には完全にオブジェクト指向 (OO) のプログラミング言語です。そのため、プログラマは継承を使ってクラスと完全なクラス階層を作成できます。大きなコード ベースでは、OO スタイルのコードをうまく書くことによって、複雑なアイデアを概念的に抽象化し、コードの重複を減らし、コードを小さくて簡潔な塊に分離することができます (それによって変更と管理とテストが容易になります)。

下に示す非常に単純な例は、Python のクラスと小規模なクラス階層への手引きとして掲載したものです。

from os.path import basename

class AbstractReport(object):
    """
    Base parsing class
    """
    _table_fields = None

    def __init__(self, file_path, records):
        """
        initializes the class
        """
        self._file_path = file_path
        self._records = records

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        raise NotImplementedError

    def write_table(self):
        """
        parses the records in the file
        """

        coords = self.calc_coords()
        print ('writes a table using fields %s '
               '\nand calculated coords %s to file %s' %
               (self._table_fields, coords, basename(self._file_path)))


class OrthoCheckReport(AbstractReport):
    """
    Orthongonal Check Report Class
    """
    _table_fields = ['FLD_A', 'FLD_B', 'FLD_C']

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        print ('special Orthogonal Check report calculations using records %s' %
               self._records)
        return ['ortho', 'check', 'results']


class QAQCReport(AbstractReport):
    """
    QAQC Report class
    """
    _table_fields = ['FLD_X', 'FLD_Y', 'FLD_Z']

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        print ('special QAQC report calculations using records %s' %
               self._records)
        return ['qaqc', 'report', 'results']


if __name__ == '__main__':
    input_file = r'c:\test\seismic_file.txt'
    records = ['reca', 'recb', 'recc']

    ocr = OrthoCheckReport(input_file, records)
    qqr = QAQCReport(input_file, records)

    ocr.write_table()
    qqr.write_table()

このコードを実行すると、次の内容が出力されます。

special Orthogonal Check report calculations using records ['reca', 'recb', 'recc']
writes a table using fields ['FLD_A', 'FLD_B', 'FLD_C']
and calculated coords ['ortho', 'check', 'results'] to file seismic_file.txt

special QAQC report calculations using records ['reca', 'recb', 'recc']
writes a table using fields ['FLD_X', 'FLD_Y', 'FLD_Z']
and calculated coords ['qaqc', 'report', 'results'] to file seismic_file.txt

上記の階層では、write_table メソッドのコードは、クラスの 1 つ (AbstractReport クラス) にしか存在しませんが、他のクラス ( OrthoCheckReport または QAQCReport) のインスタンスでもそのメソッドを呼び出せます。これは、 OrthoCheckReportQAQCReport も、AbtractReport 基本クラスの「サブクラス」であり、「継承」を行うためです。基本クラスから継承するサブクラスは、基本クラスのすべてのメソッドとプロパティにアクセスできます。つまり、上でどんなクラスが作成されるにせよ、write_report の呼び出しは同じメソッドを通ることになります。

calc_coords メソッドは、サブクラス内のコードを基本クラスと違ったものにする必要がある場合にどうなるかを例示したものです。各サブクラスは、テーブルの座標を計算する方法がそれぞれ異なっており、そのために独自のコードを持っています。これを保証するため、サブクラスは基本クラスから calc_coords メソッドを「オーバーロード」します。上に示したように、Python での「オーバーロード」は単にサブクラスに同じ名前のメソッドを追加するのと同じくらい簡単です。つまり、write_table メソッドのコードがすべてのクラスでまったく同じであっても、calc_coords を呼び出せば、サブクラスで一意のパスをたどることになります。こうすることで、コードから不要なロジック (余分な if ステートメントなど) が除去され、コードがはるかに簡単で読みやすいものとなります。

クラスを別のクラスから継承するには、次のように単に目的の基本クラスの名前をクラス宣言に含めます。

class OrthoCheckReport(AbstractReport):

これを行うときは、サブクラスの初期化 (__init__) が基本クラスの初期化と同じであることを確認します。これが異なる場合は、サブクラスについても __init__ を書くことが必要になります。例については、ドキュメントとヘルプを確認してください。

オープン ソース パッケージの使用と再配布

なぜオープン ソースなのか

Python は最も人気のあるオープン ソース プログラミング言語の 1 つになりました。そのため、Python のユーザたちが文字どおり何千というオープン ソース パッケージを作成しており、そのうちの多くはあなたが自分のアプリケーションでやろうと思っているような処理に直接適用できます。Geodetics Toolbox では、私たちの目的を達成するために数多くのオープン ソース パッケージを使用しています。

たとえば、クライアントからよく寄せられるリクエストとして、ArcGIS で行われた解析から pdf 形式のレポートを作成するというものがあります。これは結果的に、pdf ドキュメントの作成機能を備えた ReportLab Toolkit という使いやすいクロス プラットフォームのオープン ソース パッケージがあることがわかります。このパッケージには、わかりやすいドキュメントとチュートリアルはもちろん、包括的で堅牢な pdf 操作機能も含まれています。このパッケージを使用することで、私たちは比較的簡単に、しかも非常に短い開発時間で、レポートとデータを pdf ドキュメントに書き込むことができました。次回あなたが何かのリクエストを受けたら、すぐに開発に取り掛からずに、「他のユーザがすでに作成しているかもしれない」と思って、インターネットを検索してみてください。

非常に重要なライセンス

必要とする処理に完全に合致するパッケージが見つかったら、まずライセンスを読んでください。オープン ソース ライセンスにはさまざまな形式があり、その多くはソフトウェアを「クローズド ソース」にすることを禁じています。ライセンスをよく読み、そのパッケージを正しく使用することが非常に重要です。ReportLab Toolkit のライセンスは、Berkeley Software Distribution ライセンスです (一般に「BSD」ライセンスと呼ばれています)。このライセンスは非常に寛容であり、若干の条件は付きますが、他のプロプリエタリ ソフトウェアでの使用と配布を許可しています。その他のライセンスは寛容とはほど遠く、ソフトウェアで他のオープン ソース ソフトウェアを使用する場合は、そのソフトウェアもオープン ソースにするように作られています (たとえば、GPL)。ある程度時間をかけて、最もよく使われているライセンスをよく読み、オープン ソース パッケージで何をどのように使用できるのか知ることが大切です。

さまざまなライセンスを比較した表が http://en.wikipedia.org/wiki/Comparison_of_free_software_licenses にあります。また、www.opensource.org は非常に役に立つサイトで、すべてのオープン ソース ライセンスの情報が記載されています。

オープン ソース パッケージの再配布

Geodetics Toolbox では、ReportLab Toolkit をサブパッケージとして私たちのパッケージに組み込みました。つまり、ReportLab Toolkit のコードを私たちのコードと一緒に配布したということです。オープン ソース パッケージを自分のコードの中で参照する方が簡単に見えるかもしれませんが、実際にパッケージを組み込むことが重要です。そうすれば、使用するパッケージのバージョンを管理でき、そのパッケージをクライアントのコンピュータ上で確実に利用できるようになります。パッケージをクライアント自身でインストールするように要請するのは、クライアントの負担になるので、避けるべきです。繰り返しになりますが、自分のコードと一緒にオープン ソース パッケージを配布するときは、ライセンスを読み、そのライセンスで規定されている条件を満たすことが非常に重要です。

まとめ

私たちは、Geodetics Toolbox の機能を提供するために、開発言語として Python を選びました。Python とジオプロセシング フレームワークを使用することで、Geodetics Toolbox の機能を迅速に提供することができ、また ArcGIS 製品の他の部分と変わらない見た目と操作感を実現することができました。Python インストールの一部となっているモジュールを使って unittest スイートを作成し、多くのコード配布と新しい機能の要求を通じて製品の品質を確保しました。オブジェクト指向プログラミング言語としての Python の機能を活用して、コード ベース内のコードの重複を減らすことでコードを保守しやすくしました。Python には大きなオープン ソース コミュニティがあるので、自らの開発時間を短縮すると共にクライアントのニーズを満たすことのできるオープン ソース パッケージを見つけることができました。

Integrated Informatics について

Integrated Informatics Inc. は、地理情報システム (GIS) の実装と開発に関する主要なコンサルタント会社です。2002 年に設立され、空間データ管理ソリューションと自動マッピング ソリューションを北米全域のクライアントに提供しています。オフィスは、カルガリー、アルバータ、セントジョーンズ、ニューファンドランド、およびテキサス州ヒューストンにあります。

Integrated は、クライアントとの長期にわたる関係を築いています。そうしたクライアントの中には、大手および超大手のエネルギー会社、州政府、およびエンジニアリング/環境コンサルタント会社が含まれています。私たちには、ビジネス目標をサポートして企業価値を生み出すような戦略、システム、およびテクノロジの開発と実装に関して折り紙付きの実績があります。

私たちの強みは人材にあります。私たちのチームは、地理情報システム、空間データ管理、プロジェクト データ管理、アプリケーション開発、およびその他の専門分野における経験豊富なプロフェッショナルで構成されています。パイプライン エンジニアリング、環境、および地学の解析に関する専門家をスタッフとしてかかえています。専門家による開発、継続的なトレーニング、業界への関与、および内部的に資金供給している研究開発を通じて、アイデアや新機軸の創出と実装を促進しています。

Integrated は Silver Tier International Esri ビジネス パートナーを持っており、Esri のベータ プログラムの全体的なテストに積極的に参加しています。また、Southern Alberta Institute of Technology (SAIT) が設けている GIS Program の顧問会議の一員になっています。ユニークなソリューションの詳細については、www.integrated-informatics.com をご覧いただくか、gis@integrated-informatics.com にご連絡ください。