OpenOcean/OpenDolphin をカスタマイズするために知っておいた方がよいこと【改訂】

以前に OpenOcean というブログで

OpenOcean/OpenDolphin をカスタマイズするために知っておいた方がよいこと

OpenOcean/OpenDolphin をカスタマイズするために知っておいた方がよいこと 2

という記事を書いて、おかげさまでけっこう読まれた。

が、時間の関係で2回に分けてしまって(今となっては)ボリューム的にどうかってのと、とにかく急いで書く必要が(当時は)あり、いささか雑な部分も見え隠れするので、以前の内容に若干の加筆を加えて再構成。


オープンソース(Open Source Software : しばしば OSS などと略される)の電子カルテ OpenOcean/OpenDolphin は、ビルド・デプロイするだけでも出てくる役者が多いので、整理しておきましょう。

 

Java…Win, Mac, Unix などに仮想的なマシンを設定し、それを動かすための言語。したがって、Java で開発されたソフトは原理的には Win/Mac/Unix で動く。実際には windows と MacOS ではメニューの表示構成などが OS レベルで違うため、この部分は機種依存になります。他には内部の特殊文字が違う(例えばエスケープシーケンスやファイルセパレーターなど)ため、ここら辺はプログラムを組む際に工夫する必要があります。
仮想的なマシンで Java プログラムを動かすためには、当然、実行環境を提供するプログラム群が必要になってくる。Java 11 より前では、JRE という実行環境が用意されていた。Java 11 以降は、この方式は廃止され、各アプリ毎に実行環境を組み込む方式が推奨されるようになった。
Java プログラムを開発するためには JDK が必要。

 

Java EE…Java Enterprise Edition の略。とりあえずは、通常の Java アプリをクライアント-サーバシステムとして開発できるように拡張したもの、というような理解でいいと思います。
ただし、動的なサイトが作成可能な tomcat は、Java EE とは考えられていません(なお tomcat に Java EE の仕様のいくつかを実装した TomEE というプロジェクトがあります。日本語記事は少ないんですが『tomacat 魔改造 vs TomEE』あたりをご参照ください)。逆にウェブフレームワークとして認知されている Spring には Java EE の仕様の一つである JPA が標準で使えたりします。
これは、Java EE の機能が多彩で、単体でウェブアプリを問題なく動作させることができるアプリケーションサーバを構成するのが難しいためと思われます。
私も Java EE の仕様の全貌はまったくつかめてません。
現状だと「Java EE に対応したアプリケーションサーバは、WildFly・GlassFish・Payara・WebLogic 」と思っていいのではないでしょうか。
Java 自体 Oracle との絡み先行きは不安のようです。→ その後の経緯で Jave EE は Jakarta EE に引き継がれて開発も継続されていますが、どうも Spring 系の方が勢いがあるような。。

 

Jakarta EE…Jakarta Enterprise Edition の略。実質的に Java EE の後継。
Java EE で使われていたパッケージ群で javax という名称が(商標諸々の問題で)使えなくなったため、これを jakarta と改名し移行作業がなされました。
実務コーディング的には今まで

import javax.servlet.*;

などと書いていたところを

import jakarta.servlet.*;

とする必要があるわけです。
仕様の全体名も Jakarta EE となりました。

 

PostgreSQL…ご存知定番のデータベースソフト。いろんなところでお世話になってます。

 

NetBeans…Java でよく使われるIDE(統合開発環境)。Java 版 VisualStudio といった方がわかりやすいか。Java の IDE は、eclipse が有名ですが、ドルフィンプロジェクトではこちらを使っていたため、私もこちらの方に慣れちゃいました。ただ先行きは不安しかない。
最近では Visual Studio Code にプラグインを組み込んでコーディングする人も増えているようです。

 

Maven…「メイヴェン」と読むのが正しいようです。「マーベン」でも通じると思うけど(内輪だけ?)。Java 用プロジェクト管理ツール、と紹介されることが多い。実用的なソフトを構築する場合、自力で書いたソースの他にライブラリが必要になってくる。OpenDolphin/OpenOcean の pom.xml に

<dependency>
 <groupId>postgresql</groupId>
 <artifactId>postgresql</artifactId>
 <version>8.4-702.jdbc4</version>
</dependency>

などと書かれてあるのは、その指定のためです(この場合は、「postgresql を使いたいので jdbc ドライバをリポジトリから取ってきてね」という意味です。ver が 8.4 と最新ではないのは古い ORCA の postgres に対応するためだと思われます)。
他にもビルドの際の細かいルールを指定できる。例えば、ウェブアプリを作成する際、最終産物を jar や war (いずれも後述)の形式にしたいときがほとんどですが、設定で対応できます。

 

WildFly…Jakarta EE(Java EE) に準拠したアプリケーションサーバ。Jakarta EE(Java EE) は仕様しか決められていないため、Java で書かれた Web アプリ実運用のためにはサーバ実体が必要。このサーバ実体の一つがWildFly。 Redhat が開発し配布している。なお、この商用版が JBoss。
Jakarta EE(Java EE) 同様、機能が多彩すぎて、全体がつかみにくい。実稼働時には(アプリ名).war (後述)をWildFly 内に配置(デプロイ)する。
なお、現時点(2022/5)での WlidFly と対応する Jakarta(Java) EE の関係は以下の通りです。

公式サイトより

Jakarta EE 9, 10 あたりの実装が遅れているようです。

 

jar と war … 通常のソースコード ***.java を javac コマンドでコンパイルするとできるのは ***.class です。実行するには、「java 環境でクラスを呼び出す」必要があるので、コマンドは

java ***

となります。「コンパイル済みのクラスを呼び出す」これが Java アプリ実行の原則です。

ところが、Ocean/Dolphin プロジェクトでは、クライアントは OpenOcean.jar 、サーバーは OpenOcean.war などという名称です。

これは、ある程度まとまった機能を提供するためには、クラスだけでは足りず、設定ファイルや画像などのリソースファイルが必要なため、それらをまとめたファイル形式が必要とされたからです。jar は、その一つで Java ARchive からきています。読み方は「ジャー」でいいと思います。

Java EE を用いる Web アプリの場合には Web application ARchive 通称 war (ウォー :戦争 war と同発音)となります。

 

 

git と github … github は先日マイクロソフトに買収され、それを日経新聞が「設計図共有サイト、8200 億で買収」と報じたため、そのネーミングセンスが話題になりました。

オープンソースのソースをインターネット上で公開しておくには、何らかの場所(リポジトリ)が必要で、その一つが、GitHub (ギットハブ。ネイティブっぽく発音するならギッ ハブでしょうか)です。他には sourceforge や GitLab などもありますが、ドルフィン一族は、その多くが GitHub でソースを公開しています。

公開されたソース(リモート)を自分のマシン(ローカル)にクローンすることもできます(というかしないと自分のマシンではビルドできない)。

ローカルやリモートのリポジトリの橋渡しをしたり、改変を記録しておくためのシステムが Git (ギット)です。
雰囲気掴みたい人は『お手軽にWin機で Git や GitHub を使う』など参照。

歴史的に見るとまず Linux カーネル構築のためのバージョン管理システムとして Git がリーナス・トーバルズの手によってつくられ、そのホスティングサービスとして GitHub ができたわけですが、実用的には上のような理解でいいと思います。

 

windows にはデフォルトで git コマンドが入っていないため、自前で git が使える環境を構築する必要があります。私は随分前に構築したっきりなのですが、それなりに面倒だった記憶があります。たぶん、ここらへんで多くの人が嫌気をさすのではないかと思います。

ただ、ここらへんくらいまでの知識があれば、ビルド・デプロイはなんとかできるでしょうか。

Open Dolphin 2.7.0b を Win10 にインストールしてみた

OpenDolphin 2.7(m) を Mac OSX にインストールする

OpenDolphin-2.7m を M1 Mac にインストールする

あたりの記事をどうぞ。
ソースコードは

github https://github.com/Hiroaki-Inomata/OpenDolphin-2.7m

に置いてあります。

 

デザインパターン…迂闊なことをいうと本職の方々に怒られそうなので wiki から引用しておくと

 

ソフトウェア開発におけるデザインパターン(型紙(かたがみ)または設計パターン、英: design pattern)とは、過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものである。

 

だそうです。ソースと最終産物との間にある中間的な機能を設計する上での定型的なパターン、とでもいったらいいんでしょうか。
apple 系のOS のフレームワーク( cocoa と cocoa touch )で頻出の「xxxxdelegate」も典型的なデザインパターンの一つです。
ですが、プログラミングの初心者コースではまずは教えないと思うので、それなりに経験積んだ人でも知らない人は知らないんではないでしょうか。
また、デザインパターンを「アンチパターン」として嫌う人もいます。
OpenOcean/OpenDolphin ではシングルトンやメニューファクトリーといったパターンが使われています。
これがある程度頭に入ってないと、ソースを追っていっても何やってるかわからなくなると思います。逆に C++ あたりで過去に一回でも経験しているとその類推で何とかなることも多いと思います。

 

 

実際に改変を試みようとするとここら辺から、難しくなってくるのかなと思います。

後は、主要なライブラリなどでしょうか。私もいまだに使い方がわかっていないライブラリは山ほどあります。

Java のライブラリとしては、ORM の Hibernate が有名ですね。ORM や Hibernate に関しては、他サイトですが

ORM に関して書くよ

をご参照ください。雰囲気掴めるかと思います。

? 参考
より詳細なソースコードレベルでの解説は
OpenDolphin ソースコード解説
を参考にしてください。

OpenOcean / HorliX 開発チーム

 

プログラミング系 YouTuber に未来はあるか?

M1 Mac に tomcat 環境を構築するときにネット上で資料を漁っていたのだが、たまたまだが「M1 Mac に M1 対応の JDK をインストールする」みたいな動画を YouTube で見つけた。

これ自体、各種ブログ記事はまあまああるので動画にするほどのことかという気もするのだが(私も記事書いている)、気になったのは up 主のコメントへの返信。

わからないことはわからないというのは大事だが、さすがにこれはちょっと・・・。

M1 Mac で tomcat を使うことはできるし、Java アプリを開発したこともないってのはどうなの?

アップ主さんには特に悪意はないので(というか喋りは達者だし動画編集も丁寧。むしろ好感抱いたくらい)どの動画だとかいうつもりはないが、プログラミング系 YouTuber というんだろうか、この分野は(日本では)まだまだ手薄かもしれないと思った次第だ。

 

猪股弘明

 

bootstrap のお作法

 

? bootstrap とは?

よく「ウェブフレームワーク」などと紹介されていたりするが、直感的にいえば「ウェブのフロントエンド(ウェブページそのもの)を作成する際に、便利な CSS や JavaScript の集まり」と言った方がいいだろう。
実際、その実体(bootstrap.bundle.min.js だとか)は一般の html のページを作成する際にも使える。
データベースやサーバーまで扱えるようなウェブフレームワークとは、ちょっと違う。

? bootstrap 使い方のお作法

bootstrap を導入する際には使い方のお作法(リンクのさせ方など)を知っておかなければならないが、ネット上では古い情報が散見されるので、公式サイトで確認した方がいい。

現在の最新バージョンは bootstrap5 だが、該当ページは

https://getbootstrap.jp/docs/5.0/getting-started/introduction/ 。

以下にあるように bootstrap4 までは必須とされた jQuery と popper の取り扱いが大きく変わっている。

最低限、必要なものは CSS と JS だが、

CSS: bootstrap.min.css を <head></head> 内でリンクさせる

JS: bootstrap.bundle.min.js を </body>タグの直前で <script>タグを使って使用を宣言する

ということらしい。

気になるのは popper や jQuery との関係だが、これも公式サイトに説明がなされていた。
https://getbootstrap.jp/docs/5.0/getting-started/javascript/

ドロップダウンはメニューなどで必要だろうから popper は、(個人的には)組み込んでおく方針。
jQuery は不要になったということだが、実際の挙動がどうなるかは試していないのでよくわからない。

【裏技?的な popper の入手】
現在(2022/5)最新バージョンは 2.11.5 なので、適当なブラウザで
https://unpkg.com/@popperjs/core@2.11.5/dist/umd/popper.min.js
に飛んで、ブラウザ画面上にソースを表示させファイルにしておく。

【jQuery の入手】
公式サイトのダウンロードページから入手。

 

air-h-128k-il

 

【Mac】ハロワールドっぽいページを複数作って遷移の確認【Servlet】

tomcat 環境ができたので、簡単な動作確認用のコードを書いてみた。
使用したコードは GitHub で公開してますので、ポイントだけ解説していきます。

 

新しい環境になれる際にやることは、大抵、ハローワールドだと思う。
が、Web アプリの場合、実務的に重要なのはデプロイ時の
・コンテキストルートの癖
・url mapping の設定
あたりになってくると思うので、この点を意識して(いきなりだが)サーブレットファイルを3つ用意してみた。
ファイル1つだけだと遷移できるかどうか確認できないので。
だから、3ファイルには相互にリンクを張って狙った通りに遷移できるか試そうという意図です。

このうちの1つのファイルがこれ(Page1.java)。
シンプルな .html になるが、他の2つのページへのリンク入れてますね。

package info.phazor.link;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Page1 extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>link test"</title>);
    out.println("</head>");
    out.println("<body>");

    out.println("<p>テストページ1</p>");

    out.println("<p><a href=\"/link-1.0/page2\">テストページ2へ</a></p>");
    out.println("<p><a href=\"/link-1.0/page3\">テストページ3へ</a></p>");

     out.println("</body>");
     out.println("</html>");
   }
}

リンクの張り方を適当に変えて Page2.javaPage3.java も作成。
Mac なのでエスケープ文字は \ を使ってますが、windows の場合は ¥(半角)使えばコンパイル通ると思います。

これらのサーブレットから生成されるページが、リンク先に指定した URL に正しくマッピングされていないとブラウザ上でリンクをクリックしてもリンク先のページが表示されないことになる。

で、そのマッピングの設定は web.xml が担当している。

今回の場合は、以下(関係箇所を抜粋)のようになる。


    <servlet>
        <servlet-name>Page1</servlet-name>
        <servlet-class>info.phazor.link.Page1</servlet-class>
     </servlet>
    <servlet>
        <servlet-name>Page2</servlet-name>
        <servlet-class>info.phazor.link.Page2</servlet-class>
     </servlet>    
    <servlet>
        <servlet-name>Page3</servlet-name>
        <servlet-class>info.phazor.link.Page3</servlet-class>
     </servlet>
 
    <servlet-mapping>
        <servlet-name>Page1</servlet-name>
        <url-pattern>/Page1</url-pattern>
     </servlet-mapping>
     <servlet-mapping>
        <servlet-name>Page2</servlet-name>
        <url-pattern>/Page2</url-pattern>
     </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Page3</servlet-name>
        <url-pattern>/Page3</url-pattern>
     </servlet-mapping>

要するに
・上の3段でサーブレットの名前とクラスを対応づけ
・下の3段でサーブレットと URL を対応づけ
ているわけですね。

これで、生成したページとURLをマッピングさせているわけですね。

tomcat 上で動作させましたが、割とさくさく遷移してくれました。

あとは静的なファイルを用意して、これらの集積でサイトが構築できる、という理屈のようです。

Java のこういったクセのないアプローチはさすが Java って感じですね。
まあ、たぶん、アノテーションなどを使った「モダン」な書き方もあるんでしょうが(苦笑)。

なお、GitHub リポジトリにある link2 は、上のコードにユーザー認証(session を使ったパスワード認証)を付け加えたものです。

 

猪股弘明