Erlang 애플리케이션에 Cocoa 프런트엔드를 작성하는 좋은 방법은 무엇입니까?

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

문제

나는 Erlang으로 애플리케이션을 작성할 가능성을 모색 중이지만 Cocoa(아마도 Objective-C)로 작성된 부분이 필요할 것입니다.프론트엔드와 백엔드가 쉽게 소통할 수 있었으면 좋겠습니다.어떻게 하면 이를 가장 잘 수행할 수 있습니까?

C 포트와 연결된 프로세스를 사용하는 것을 생각할 수 있지만 반대의 상황(프런트엔드가 시작되어 백엔드로 연결되는)이 더 좋을 것 같습니다.명명된 파이프(FIFO)가 있거나 TCP 포트나 명명된 BSD 소켓을 통해 네트워크 통신을 사용할 수 있습니다.이 분야에 경험이 있는 사람이 있나요?

도움이 되었습니까?

해결책

한 가지 방법은 응용 프로그램의 Erlang 코어를 사용자가 고안한 몇 가지 간단한 프로토콜을 사용하여 Cocoa 프런트 엔드가 Unix 도메인 소켓을 통해 통신하는 데몬으로 만드는 것입니다.

Unix 도메인 소켓을 사용한다는 것은 Erlang 데몬이 필요에 따라 실행될 수 있음을 의미합니다. launchd Cocoa 프런트 엔드는 환경 변수를 통해 사용할 소켓 경로를 찾을 수 있습니다.이는 앱과 데몬 간의 랑데뷰를 간단하게 만들고 여러 프런트 엔드(또는 데몬과의 통신을 래핑하는 프레임워크)를 개발하는 것을 간단하게 만듭니다.

맥 OS X launchd 이런 시스템은 정말 멋지다.보안 Unix 도메인 소켓을 통해 요청 시 작업을 시작하도록 지정하는 경우, launchd 실제로 적절한 권한을 사용하여 소켓 자체를 생성하고 작업 속성 목록에 명명된 환경 변수를 통해 해당 위치를 광고합니다.작업이 시작되면 실제로 파일 설명자가 소켓에 전달됩니다. launchd 간단한 체크인을 할 때.

결국 이는 프런트엔드가 데몬과 통신하기 위해 소켓을 여는 전체 과정을 의미하며, launchd 프런트 엔드와 데몬이 서로 다른 권한 수준에서 실행되더라도 데몬을 시작하고 통신에 응답하는 데몬은 안전할 수 있습니다.

다른 팁

한 가지 방법은 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 (대화형 통신이 가능함)!

관심 있는 또 다른 샘플 코드는 사용자가 SQL을 서버에 보내고 결과를 표시할 수 있게 해주는 PostgreSQL 클라이언트인 BigSQL입니다.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top