Erlang アプリケーションに Cocoa フロントエンドを記述する良い方法は何でしょうか?

StackOverflow https://stackoverflow.com/questions/37381

質問

Erlang でアプリケーションを作成する可能性を検討していますが、一部を Cocoa (おそらく Objective-C) で作成する必要があります。フロントエンドとバックエンドが簡単に通信できるようにしたいと考えています。これを最善に行うにはどうすればよいでしょうか?

C ポートと接続されたプロセスを使用することも考えられますが、逆の状況 (フロントエンドが起動してバックエンドに接続する) が望ましいと思います。名前付きパイプ (FIFO) があり、TCP ポートまたは名前付き BSD ソケットを介したネットワーク通信を使用することもできます。この分野で経験のある人はいますか?

役に立ちましたか?

解決

1 つの方法は、アプリケーションの Erlang コアをデーモンにし、Cocoa フロントエンドが独自に考案した単純なプロトコルを使用して Unix ドメイン ソケット経由で通信することです。

Unix ドメイン ソケットの使用は、Erlang デーモンをオンデマンドで起動できることを意味します。 launchd Cocoa フロントエンドは、環境変数を介して使用するソケットへのパスを見つけることができます。これにより、アプリとデーモンの間のランデブーが簡単になり、複数のフロントエンド (または場合によってはデーモンとの通信をラップするフレームワーク) の開発も簡単になります。

Mac OS X launchd このシステムは本当に素晴らしいです。安全な Unix ドメイン ソケット経由でジョブをオンデマンドで起動するように指定した場合、 launchd 実際には、適切な権限を持つソケット自体を作成し、ジョブのプロパティ リストで指定された環境変数を介してその場所を通知します。ジョブは開始されると、実際には次のようにファイル記述子をソケットに渡します。 launchd 簡単なチェックインを行うとき。

最終的にこれは、フロントエンドがデーモンと通信するためにソケットを開くプロセス全体が、 launchd フロントエンドとデーモンが異なる特権レベルで実行されている場合でも、デーモンの起動と通信に応答するデーモンを安全に保つことができます。

他のヒント

1 つの方法は、NSTask、NSPipe、NSFileHandle を使用した Theo の方法です。まず、CouchDBX のコードを見てみましょう。 http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

ポートは可能ですが、まったく良くありません。

この通信をmochiwebとjson通信で単純に処理できないのは何か理由があるのでしょうか?

通常、UNIX コマンドやその他のヘッドレス プログラムを前面に置く Cocoa アプリケーションを作成する場合は、 NSTask:

NSTask クラスを使用すると、プログラムは別のプログラムをサブプロセスとして実行し、そのプログラムの実行を監視できます。NSTask オブジェクトは、別の実行可能エンティティを作成します。NSThread とは、それを作成するプロセスとメモリ空間を共有しないという点で異なります。

タスクは、いくつかの項目の現在の値によって定義された環境内で動作します。現在のディレクトリ、標準入力、標準出力、標準エラー、および環境変数の値。デフォルトでは、NSTask オブジェクトは、それを起動するプロセスからその環境を継承します。タスクに異なる値がある場合 (たとえば、現在のディレクトリを変更する必要がある場合)、タスクを起動する前に値を変更する必要があります。タスクの実行中にタスクの環境を変更することはできません。

以下の方法でバックエンド プロセスと通信できます。 stdin/stdout/stderr. 。基本的に NSTask 高レベルのラッパーです exec (または fork または system, 、いつも違いを忘れてしまいます)。

私が理解しているところによると、Erland プログラムを継続的に実行されるバックグラウンド デーモンにすることは望ましくありませんが、そうする場合は次のようにしてください。 @クリスさん 提案。

NSTask と Unix ドメイン ソケットのアプローチはどちらも素晴らしい提案です。注目すべきは、現在開発中の Erlang FFI 実装です。

http://muvara.org/crs4/erlang/ffi

erl_call は NSTask から使用できる必要があります。Textmate コマンドから使用していますが、非常に高速です。erl_call と OTP gen_server を組み合わせると、比較的簡単に永続的なバックエンド状態を維持できるようになります。詳細については、私のブログの erl_call に関する投稿を参照してください。

NSTask の使用を検討することもできます 疑似TTY.app (インタラクティブなコミュニケーションが可能になります)!

興味深いもう 1 つのサンプル コードは、ユーザーが SQL をサーバーに送信して結果を表示できるようにする PostgreSQL クライアントである BigSQL です。

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top