Was ist eine gute Möglichkeit, ein Cocoa-Frontend für eine Erlang-Anwendung zu schreiben?

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

Frage

Ich untersuche die Möglichkeit, eine Bewerbung in Erlang zu schreiben, aber ein Teil davon müsste in Cocoa (vermutlich Objective-C) geschrieben sein.Ich möchte, dass Front-End und Backend problemlos kommunizieren können.Wie geht das am besten?

Ich kann mir vorstellen, C-Ports und verbundene Prozesse zu verwenden, aber ich denke, ich hätte gerne eine umgekehrte Situation (das Front-End startet und stellt eine Verbindung zum Back-End her).Es gibt benannte Pipes (FIFOs), oder ich könnte die Netzwerkkommunikation über einen TCP-Port oder einen benannten BSD-Socket nutzen.Hat jemand Erfahrung in diesem Bereich?

War es hilfreich?

Lösung

Eine Möglichkeit wäre, dass der Erlang-Kern der Anwendung ein Daemon ist, mit dem das Cocoa-Frontend über einen Unix-Domänen-Socket kommuniziert und dabei ein einfaches, von Ihnen entwickeltes Protokoll verwendet.

Die Verwendung eines Unix-Domänen-Sockets bedeutet, dass der Erlang-Daemon bei Bedarf gestartet werden kann launchd und das Cocoa-Frontend könnte den Pfad zum zu verwendenden Socket über eine Umgebungsvariable finden.Das macht das Rendezvous zwischen der App und dem Daemon trivial und erleichtert auch die Entwicklung mehrerer Frontends (oder möglicherweise eines Frameworks, das die Kommunikation mit dem Daemon umschließt).

Das Mac OS X launchd Das System ist auf diese Weise wirklich cool.Wenn Sie angeben, dass ein Job bei Bedarf über einen sicheren Unix-Domänen-Socket gestartet werden soll, launchd erstellt tatsächlich den Socket selbst mit den entsprechenden Berechtigungen und gibt seinen Speicherort über die in der Eigenschaftenliste des Jobs genannte Umgebungsvariable bekannt.Wenn der Job gestartet wird, wird tatsächlich ein Dateideskriptor an den Socket übergeben launchd wenn es einen einfachen Check-in durchführt.

Letztendlich bedeutet dies, dass der gesamte Prozess des Öffnens des Sockets durch das Front-End zur Kommunikation mit dem Daemon, launchd Das Starten des Daemons und die Reaktion des Daemons auf die Kommunikation können sicher sein, selbst wenn das Front-End und der Daemon mit unterschiedlichen Berechtigungsstufen ausgeführt werden.

Andere Tipps

Ein Weg ist Theos Weg mit NSTask, NSPipe und NSFileHandle.Sie können beginnen, indem Sie sich den Code für CouchDBX ansehen http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

Häfen sind möglich, aber überhaupt nicht schön.

Gibt es einen Grund, warum diese Kommunikation nicht einfach mit Mochiweb- und JSON-Kommunikation abgewickelt werden kann?

Normalerweise verwenden Sie beim Erstellen von Cocoa-Anwendungen, die UNIX-Befehle oder andere Headless-Programme vorantreiben, eine NSTask:

Mithilfe der NSTask-Klasse kann Ihr Programm ein anderes Programm als Unterprozess ausführen und die Ausführung dieses Programms überwachen.Ein NSTask-Objekt erstellt eine separate ausführbare Einheit.Es unterscheidet sich von NSThread darin, dass es keinen Speicherplatz mit dem Prozess teilt, der es erstellt.

Eine Aufgabe wird in einer Umgebung ausgeführt, die durch die aktuellen Werte für mehrere Elemente definiert ist:das aktuelle Verzeichnis, Standardeingabe, Standardausgabe, Standardfehler und die Werte aller Umgebungsvariablen.Standardmäßig erbt ein NSTask-Objekt seine Umgebung von dem Prozess, der es startet.Wenn es Werte gibt, die für die Aufgabe unterschiedlich sein sollten, beispielsweise wenn sich das aktuelle Verzeichnis ändern soll, müssen Sie den Wert ändern, bevor Sie die Aufgabe starten.Die Umgebung einer Aufgabe kann während der Ausführung nicht geändert werden.

Sie können über mit dem Backend-Prozess kommunizieren stdin/stdout/stderr.Grundsätzlich NSTask ist ein High-Level-Wrapper exec (oder fork oder system, ich vergesse immer den Unterschied).

Soweit ich weiß, möchten Sie nicht, dass das Erland-Programm ein Hintergrund-Daemon ist, der kontinuierlich läuft, aber wenn ja, machen Sie weiter @Chris's Anregung.

Die NSTask- und Unix-Domain-Socket-Ansätze sind beide großartige Vorschläge.Etwas, das Sie im Auge behalten sollten, ist eine Erlang-FFI-Implementierung, die in Arbeit ist:

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

erl_call sollte von einer NSTask aus verwendbar sein.Ich verwende es über einen Textmate-Befehl und es ist sehr schnell.Durch die Kombination von erl_call mit einem OTP gen_server können Sie relativ einfach einen dauerhaften Backend-Status beibehalten.Weitere Informationen finden Sie in meinem Beitrag auf erl_call in meinem Blog.

Sie können auch die Verwendung von NSTask in Betracht ziehen PseudoTTY.app (was interaktive Kommunikation ermöglicht)!

Ein weiterer interessanter Beispielcode könnte BigSQL sein, ein PostgreSQL-Client, der es dem Benutzer ermöglicht, SQL an einen Server zu senden und das Ergebnis anzuzeigen.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top