ما هي الطريقة الجيدة لكتابة واجهة Cocoa الأمامية لتطبيق Erlang؟

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

سؤال

أنا أستكشف إمكانية كتابة تطبيق بلغة Erlang، لكنه سيحتاج إلى جزء مكتوب بلغة Cocoa (من المفترض أن يكون Objective-C).أود أن تكون الواجهة الأمامية والخلفية قادرة على التواصل بسهولة.كيف يمكن القيام بذلك على أفضل وجه؟

يمكنني التفكير في استخدام منافذ C والعمليات المتصلة، ولكن أعتقد أنني أرغب في وضع عكسي (بدء الواجهة الأمامية والاتصال بالواجهة الخلفية).هناك أنابيب مسماة (FIFOs)، أو يمكنني استخدام اتصالات الشبكة عبر منفذ TCP أو مقبس BSD مسمى.هل لدى أي شخص خبرة في هذا المجال؟

هل كانت مفيدة؟

المحلول

تتمثل إحدى الطرق في جعل جوهر Erlang للتطبيق عبارة عن برنامج خفي تتواصل معه الواجهة الأمامية لـ Cocoa عبر مقبس مجال Unix باستخدام بعض البروتوكولات البسيطة التي تبتكرها.

إن استخدام مقبس مجال Unix يعني أنه يمكن تشغيل البرنامج الخفي Erlang عند الطلب بواسطة launchd ويمكن للواجهة الأمامية لـ Cocoa العثور على المسار إلى المقبس لاستخدامه عبر متغير البيئة.وهذا يجعل الالتقاء بين التطبيق والبرنامج الخفي أمرًا تافهًا، ويجعل من السهل أيضًا تطوير واجهات أمامية متعددة (أو ربما إطار عمل يغطي الاتصال مع البرنامج الخفي).

نظام التشغيل Mac OS X launchd النظام رائع حقًا بهذه الطريقة.إذا حددت أنه يجب إطلاق المهمة عند الطلب عبر مقبس مجال Unix آمن، launchd في الواقع، سيقوم بإنشاء المقبس نفسه بالأذونات المناسبة، ويعلن عن موقعه عبر متغير البيئة المسمى في قائمة خصائص الوظيفة.المهمة، عند البدء، سيتم تمرير واصف ملف إلى المقبس من خلالها launchd عندما يقوم بتسجيل وصول بسيط.

في النهاية، هذا يعني أن العملية برمتها المتمثلة في فتح الواجهة الأمامية للمقبس للتواصل مع البرنامج الخفي، launchd تشغيل البرنامج الخفي، ويمكن أن يكون البرنامج الخفي الذي يستجيب للاتصالات آمنًا، حتى لو كانت الواجهة الأمامية والبرنامج الخفي يعملان بمستويات امتياز مختلفة.

نصائح أخرى

إحدى الطرق هي طريقة ثيو مع NTask وNSPipe وNSFileHandle.يمكنك البدء بالنظر إلى الكود الخاص بـ CouchDBX http://couchprojects.googlecode.com/svn/trunk/unofficial-binary-releases/CouchDBX/

المنافذ ممكنة ولكنها ليست لطيفة على الإطلاق.

هل هناك سبب لعدم إمكانية التعامل مع هذا الاتصال ببساطة من خلال اتصال mochiweb وjson؟

عادةً عند إنشاء تطبيقات Cocoa التي تواجه أوامر UNIX أو البرامج الأخرى بدون رأس، فإنك تستخدم ملف NSTask:

باستخدام فئة NTask، يمكن لبرنامجك تشغيل برنامج آخر كعملية فرعية ويمكنه مراقبة تنفيذ هذا البرنامج.يقوم كائن NTask بإنشاء كيان منفصل قابل للتنفيذ؛إنه يختلف عن NSThread لأنه لا يشارك مساحة الذاكرة مع العملية التي تقوم بإنشائها.

تعمل المهمة ضمن بيئة تحددها القيم الحالية لعدة عناصر:الدليل الحالي، والإدخال القياسي، والإخراج القياسي، والخطأ القياسي، وقيم أي متغيرات البيئة.افتراضيًا، يرث كائن NTask بيئته من العملية التي تقوم بتشغيله.إذا كانت هناك أية قيم يجب أن تكون مختلفة للمهمة، على سبيل المثال، إذا كان الدليل الحالي يجب أن يتغير، فيجب عليك تغيير القيمة قبل بدء المهمة.لا يمكن تغيير بيئة المهمة أثناء تشغيلها.

يمكنك التواصل مع عملية الواجهة الخلفية عن طريق stdin/stdout/stderr.بشكل أساسي NSTask هو مجمع رفيع المستوى حولها exec (أو fork أو system, ، أنا دائما أنسى الفرق).

كما أفهم، فأنت لا تريد أن يكون برنامج Erland برنامجًا خفيًا في الخلفية يعمل بشكل مستمر، ولكن إذا كنت تريد ذلك، فاتبع @ كريس اقتراح.

يعد كل من نهجي NTask وUnix domain مأخذ التوصيل من الاقتراحات الرائعة.الشيء الذي يجب مراقبته هو تطبيق Erlang FFI قيد التنفيذ:

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

يجب أن يكون erl_call قابلاً للاستخدام من NTask.أستخدمه من أمر Textmate وهو سريع جدًا.إن الجمع بين erl_call و OTP gen_server سيسمح لك بالحفاظ على حالة الواجهة الخلفية المستمرة بسهولة نسبية.راجع مشاركتي على erl_call في مدونتي لمزيد من التفاصيل.

باستخدام NTask قد تفكر أيضًا في استخدامه PseudoTTY.app (مما يسمح بالتواصل التفاعلي)!

يمكن أن يكون BigSQL نموذجًا آخر مثيرًا للاهتمام، وهو عميل PostgreSQL يمكّن المستخدم من إرسال SQL إلى خادم وعرض النتيجة.

open -a Safari http://web.archive.org/web/20080324145441/http://www.bignerdranch.com/applications.shtml
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top