例えば、ファイルコンバージョンサーバーとして。それは、とても簡単ですが、いくつか秘訣があります。
話題
About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: C++
この記事の目次
- 開始コンテキスト
- ターゲットコンテキスト
- オリエンテーション
- 本体
- 1: オフィスデーモンがするべきこと
- 2: サンプルオフィスデーモンを取得してビルドする
- 3: 本デーモンを登録する
- 4: コードの若干の説明
- 5: 結びとその先
開始コンテキスト
- 読者は、C++プログラミングの基本的知識を持っている。
- 読者は、ミニマルsystemdデーモンを作成する方法の知識を持っている。
- 読者は、UNOとは何か、UNOはLibreOfficeまたはApache OpenOfficeとどう関係しているかの知識を持っている。
- 読者は、LibreOfficeまたはApache OpenOfficeのインスタンスをUNOサーバーにする方法の知識を持っている。
- 読者は、C++コンソールUNOクライアントを作成する方法の知識を持っている。
ターゲットコンテキスト
- 読者は、C++によるLibreOfficeまたはApache OpenOfficeのデーモンを入手し、そうしたデーモンを作成する方法を知る。
Hypothesizer 7、Objector 25A、Objector 25Bがコンピューターの前にいる。
オリエンテーション
Hypothesizer 7
本記事では、C++によるLibreOfficeまたはApache OpenOfficeのデーモンのサンプルを入手し、そうしたデーモンを作成する方法を知ります。
Objector 25A
そのサンプルはそのままでちゃんと動くんだろうな?
Hypothesizer 7
私のLubuntuコンピューターでは問題なく動作するようです。あなたのコンピューターに関して確実なことは申せません、サー。
Objector 25A
俺のコンピューターでは動かないだろうという理由が何かあるのか?
Hypothesizer 7
そのような理由は全く知りません。もし、適切な開発環境(Linux用の記事およびWindows用の記事があります)を構築されて、サンプルプロジェクトをビルドする手順を正確にたどられたのであれば、サンプルプログラムは多分あなたのコンピューターで問題なく動作するだろうと私は想定しております。
Objector 25A
...あのなあ、分かんだろ、あんたのそれらの記事は、読むのが面倒なんだよ。
Hypothesizer 7
えーと、特に存じませんし、必要な事は面倒であろうがなかろうが必要です。お分かりでしょうが、面倒だから必要な事をしないというのは、いくつか穴が空いているという理由でソックスを履かないというようなものです。
Objector 25A
はあ?全然分からんね。
Hypothesizer 7
私が言っているのは、それらの穴をふさぐのは面倒だということです。
Objector 25A
いまどき誰がソックスをつくろうんだ?新しいやつを買え!
Hypothesizer 7
私のお気に入りのものでして。
Objector 25A
知るか!
Objector 25B
Javaのオフィスデーモンは作れないの?
Hypothesizer 7
マダム、正直なところ、正式なJavaデーモンを作成しようとしたことは私はありません。
Objector 25B
「正式な」?
Hypothesizer 7
'systemdデーモン'について申し上げると,その要点は、いくつかのシグナル('SIGTERM'および'SIGHUP')をキャッチし、'D-Bus'を使用し、'sd_notify'を呼び出すことです。'SIGTERM'はシャットダウンフックでキャッチでできるようです。'SIGHUP'については知りません。'sd_notify'を呼び出すには工夫が必要かもしれません。systemdデーモンは必ずしも'SIGHUP'をキャッチしたり、'D-Bus'を使用したり、'sd_notify'を呼び出したりする必要はないというのはその通りであって(実際、私のオフィスデーモンは'SIGHUP'をキャッチしも、'D-Bus'を使用しもしません、'sd_notify'を呼び出しはしますが)、もしも、あなたのオフィスデーモンがそうした事をしないのであれば、Javaオフィスデーモンは可能でしょう。
Objector 25B
...それで、あなたは自分でJavaオフィスデーモンを作りはしないわけ?
Hypothesizer 7
はい...、少なくとも今のところは。そうした制約のないC++デーモンのほうが良いと、私はただそう考えております。
本体
1: オフィスデーモンがするべきこと
Hypothesizer 7
オフィスデーモンが何をすべきかは、以前の記事のあるセクションで既に説明しておりますので、そちらをご参照ください。
Objector 25A
ふーむ...、ただ、オフィスインスタンスを'fork'および'exec'してプロセスを殺すだけではいけないと?
Hypothesizer 7
一部のユースケース(少なくとも、そのオフィスインスタンスに対して'soffice --convert-to'は使用できません)では、いけるかもしれません、実質的な損害なしに。
しかしながら、一般的には、先程紹介した以前の記事のセクションに記述された措置を実装するべきです。
私のデーモンはsystemdデーモンであることにご注意ください。SysVデーモンをご所望であれば、それは、おまかせいたします。UNO的には何の違いもございません。
2: サンプルオフィスデーモンを取得してビルドする
Hypothesizer 7
ここにサンプルオフィスデーモンがあります。
'officeDaemon'が、サンプルプログラムのプロジェクトディレクトリです。他の2つのディレクトリはプロジェクト群で共用されるプロジェクトのものです('coreUtilitiesToBeDisclosed'には、あらゆる種類のプロジェクトで共用されるように想定されているユーティリティコードが含まれています。'unoUtilitiesToBeDisclosed'には、UNOプログラムのプロジェクト群で共用されるように想定されているユーティリティコードが含まれています)。
本systemdデーモンをビルドするために必要な準備は、ある記事に記述されています。
その後、本シリーズの任意のサンプルプロジェクトをビルドする方法は、ある以前の記事に記述されています。
3: 本デーモンを登録する
Hypothesizer 7
本デーモンを登録するために、'.service'ファイルを作成します。
以下が、私の'.service'ファイルです、ここで、複数ある'%~%'は、実際の値で置換する必要があります。
'/etc/systemd/system/officeDaemon.service'
@systemd .service ソースコード
[Unit]
Description=The office daemon service
After=network.target
StartLimitBurst=5
StartLimitIntervalSec=10
[Service]
Type=simple
Restart=always
RestartSec=1
User=%the operating system user name%
Environment="LD_LIBRARY_PATH=%the office directory path%/sdk/lib:%the office directory path%/program:%the development directory path%/coreUtilitiesToBeDisclosed/target:%the development directory path%/unoUtilitiesToBeDisclosed/target"
Environment="URE_BOOTSTRAP=file://%the office directory path%/program/fundamentalrc"
ExecStart=%the development directory path%/officeDaemon/target/theBiasPlanet.officeDaemon.exe "%the office directory path%/program" "socket,host=localhost,port=%the port number%,tcpNoDelay=1;urp;StarOffice.ComponentContext"
KillMode=process
[Install]
WantedBy=multi-user.target
指定されたポートは、以前の記事に記述されたようにオープンしておく必要があります、勿論。
デーモンを有効化しコントロールする方法は、ある記事に記述されています。
4: コードの若干の説明
Hypothesizer 7
コードの入念な説明は必要ないと思いますが、コードを読むための若干のガイダンスを提示しましょう。
'::theBiasPlanet::coreUtilities::processesHandling::ProcessHandler::execute (string const & a_workingDirectoryPath, list <string> const & a_commandAndArguments, bool const & a_waitsUntilFinish)'というメソッド('theBiasPlanet/officeDaemon/programs/OfficeDaemon.cpp'で呼ばれている)は、私のユーティリティメソッドであり、外部プロセスを同期または非同期に起動します(最後尾引数が'false'の場合に非同期)。
オフィスインスタンスへの接続は、以前の記事にしたがって行なわれます。
オフィスインスタンスの制御は、'unoUtilitiesToBeDisclosed'プロジェクト内にある'::theBiasPlanet::unoUtilities::officeInstancesHandling::OfficeInstance'クラスによって行なわれます。
Objector 25A
そう...
Hypothesizer 7
実のところ、その'::theBiasPlanet::unoUtilities::officeInstancesHandling::OfficeInstance'クラスが本記事の主眼ですが、ソースコードがそれ自体で十分な説明となっていると思います。
5: 結びとその先
Hypothesizer 7
これで、C++によるLibreOfficeまたはApache OpenOfficeデーモンを取得し、そうしたデーモンを作成する方法を知りました。
実のところ、そのデーモンは、これまでに獲得してきたいくらかの知識(オフィスインスタンスをUNOサーバーにする方法、コンソールC++ UNOクライアントを作成する方法、systemdデーモンを作成する方法)に、オフィスインスタンスをある程度コントロールするというほんの少しの事を加えた成果です。
そのオフィスデーモンは、LibreOfficeまたはApache OpenOfficeのある種の使用法のためのとても有用なツールです、ファイルコンバータとして使用するといったような使用法の。
しかし、サーバーのオペレーティングシステムがWindowsだったらどうしましょうか?以降の記事でオフィスWindowsサービスを取得しましょう。