Home تقنية في إيماكس، كل شيء يبدو وكأنه خدمة | itg-ar.com

في إيماكس، كل شيء يبدو وكأنه خدمة | itg-ar.com

2
0
في إيماكس، كل شيء يبدو وكأنه خدمة
| itg-ar.com

في إيماكس، كل شيء يبدو وكأنه خدمة

من الشائع أن Emacs هو نظام تشغيل (OS). هذا ليس صحيحًا، ولكن ما يدعو للمقارنة بنظام التشغيل هو قدرته على تنسيق التطبيقات والأدوات المساعدة أعلى من مستوى نواة نظام التشغيل. يقترح الرسم البياني أدناه صورة أكثر صدقًا لكيفية ارتباط Emacs بنظام التشغيل وإمكانياته. إن وصول Emacs المدمج إلى خدمات نظام التشغيل (نظام الملفات، والشبكة، وما إلى ذلك) إلى جانب القدرة على تشغيل برامج أخرى يجعل من الروتين تحسين سلوك العميل داخله. ولهذا السبب، يتمكن مستخدمو Emacs من إنجاز العديد من احتياجاتهم الحاسوبية من خلال أوضاع العميل المختلفة التي تم إنشاؤها من أجله. وهذا يعطي مصداقية لفكرة “العيش في إيماكس فقط”. في هذا المنشور، سنفحص بعض الطرق التي يتيح لك بها Emacs إنشاء عميل. بحلول نهاية هذا المنشور، نأمل أن تكون مقتنعًا بأن كل شيء داخل Emacs يبدو وكأنه خدمة. دعونا أولا تقديم بعض التعريفات. نموذج العميل-الخادم هو نمط شائع لتفاعل الكمبيوتر حيث يتم تقسيم المهمة بين موفر المورد (الخدمة) وطالب ذلك المورد (العميل). يصدر العميل طلبًا إلى الخادم، ويقوم الخادم بدوره بإرجاع الاستجابة كما هو موضح في الرسم البياني أدناه. اعتمادًا على التنفيذ، يمكن أن تحدث المعاملة (الطلب + الاستجابة) عبر الشبكة أو تكون محلية للنظام. لقد تم تفصيل نماذج خادم العميل التي تستخدم الشبكة بشكل أكبر باستخدام بنيات البرامج على طراز REST. يظهر في الرسم البياني التسلسلي أدناه نمط تنفيذ شائع لبنية خادم العميل بنمط REST. من الرسم البياني أعلاه، هناك ثلاثة اهتمامات عادةً ما يكون العميل مسؤولاً عنها: واجهة المستخدم: واجهة المستخدم (إن وجدت). Client Edge: النظام الفرعي المعني بالاتصال بالخدمة. بالنسبة للعملاء المتصلين بالشبكة، هذا هو النظام الفرعي للشبكة. قاعدة البيانات المحلية: تمثيل البيانات التي يتم تبادلها أو مزامنتها مع الخادم. إن كيفية إدارة هذه البيانات متروكة لمتطلبات التنفيذ. بالنسبة للمخاوف المذكورة أعلاه، توفر Emacs العديد من المكتبات المضمنة وتلك التابعة لجهات خارجية والتي يمكنها تنفيذ العميل. فيما يلي بعض المكتبات المضمنة مع الروابط الخاصة بها لمزيد من القراءة: تحدد متطلبات قاعدة البيانات المحلية لـ UI Client Edge مقدار التعقيد المطلوب لتنفيذ عميل Emacs. إذا كانت هناك أداة مساعدة موجودة لسطر الأوامر يمكنها القيام “بالعمل الثقيل”، فيمكن إعادة صياغة الأداة المساعدة المذكورة على أنها “خدمة” يمكن الوصول إليها عبر استدعاء shell. يتم الوصول إلى جميع المكتبات المذكورة أعلاه من خلال لغة البرمجة Emacs Lisp (Elisp). Elisp هي لغة برمجة ديناميكية تسمح بدرجة عالية من الارتجال أثناء وقت التشغيل. تسمح هذه الإمكانية بالتنسيق المعقد لأي سلوك متاح لـ Emacs، بدءًا من وظائف Elisp وحتى أوامر shell. wttr.in هي خدمة ويب للتنبؤ بالطقس موجهة نحو وحدة التحكم. وهو يدعم إخراج JSON حتى نتمكن من إنشاء أمر Emacs wttr الذي سيطالبك بتحديد موقع وإجراء طلب HTTP ومعالجة استجابة JSON وعرض النتيجة في المخزن المؤقت المصغر. يظهر أمر المستوى الأعلى wttr أدناه. 1 2 3 4 5 6 7 8 9 10 11 12 13 14(defun wttr (location) “عرض أحوال الطقس للموقع من `https://wttr.in’ في المخزن المؤقت الصغير. يتم تخزين النتيجة أيضًا في `kill-ring’.” (تفاعلية “sWhere (افتراضي: محلي): “) (condition-case err (let* ((url (wttr–request-url location)) (jsondb (fetch-json-as-hash-table url)) (msg (wttr–report-message jsondb))) (kill-new msg) (message “%s” msg)) (خطأ (رسالة “ERROR: %s” (cdr err)))))) يتم إنشاء عنوان URL الخاص بـ wttr.in بواسطة الوظيفة wttr–request-url الموضح أدناه. (defun wttr–request-url (location) “إنشاء عنوان URL لـ wttr.in باستخدام LOCATION.” (let* ((base-url (url-generic-parse-url “https://wttr.in”)) (موقع مشفر (سلسلة – استبدال موقع ” ” “+”)) (الاستعلام (تنسيق “/%s?0&format=j1” موقع مشفر)) (_dummy (setf (url-filename base-url) query))) (url-recreate-url base-url))) يمكننا بعد ذلك تمرير عنوان URL هذا إلى fetch-json-as-hash-table الذي يقوم بالمهمة الثقيلة المتمثلة في استرداد عنوان URL وتحليل استجابة JSON في جدول تجزئة Elisp. 1 2 3 4 5 6 7 8 9 10 11 12 13(defun fetch-json-as-hash-table (url) “جلب عنوان URL مع استجابة JSON المتوقعة وإرجاع `جدول التجزئة’.” (let ((مخزن البيانات المؤقت (url-retrieve-synchronously url)))) (إذا (ليس مخزنًا مؤقتًا للبيانات) (الخطأ “فشل جلب البيانات من %s” url) (unwind-protect (with-current-buffer data-buffer؛؛ انقل النقطة إلى ما بعد رؤوس بيانات تعريف HTTP (goto-char url-http-end-of-headers)؛؛ قم بتحليل المخزن المؤقت JSON المتبقي في جدول تجزئة (json-parse-buffer :object-type ‘hash-table))؛؛ اقتل دائمًا المخزن المؤقت للشبكة الذي تم تنزيله لمنع تسرب الذاكرة (kill-buffer data-buffer)))))) أخيرًا يمكننا استخراج المطلوب القيم من استجابة JSON (jsondb) لملء الرسالة التي سيتم إرسالها إلى المخزن المؤقت المصغر. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30(defun wttr–report-message (jsondb) “إنشاء رسالة تقرير عن الطقس من JSONDB.” (اسمحوا* ((منطقة-buflist ()) (أقرب منطقة (wttr–get-first jsondb “nearest_area”)) (اسم المنطقة (map-elt (wttr–get-first أقرب منطقة “areaName”) “value”)) (منطقة (map-elt (wttr–get-first أقرب منطقة “منطقة”) “value”)) (البلد (map-elt (wttr–get-first) أقرب منطقة “country”) “value”)) (الحالة الحالية (wttr–get-first jsondb “current_condition”)) (temp_c (map-elt الحالة الحالية “temp_C”)) (temp_f (map-elt الحالة الحالية “temp_F”)) (وصف الطقس (map-elt (wttr–get-first الحالة الحالية “weatherDesc”) “value”))) (mapc (lambda (x) (if (و x (ليس (سلسلة تساوي x “”))) (ادفع x منطقة-buflist))) (قائمة اسم المنطقة وبلد المنطقة)) (التنسيق “%s: %s°C, %s°F %s” (سلسلة-ربط (منطقة عكسية-buflist) “, “) temp_c temp_f Weather-description))) مصدر wttr.el في هذه المرحلة، نأمل أن تكون مقتنعًا بتأكيد العنوان أنه من Emacs، كل شيء يبدو وكأنه خدمة. علاوة على ذلك، فإن العديد من واجهات برمجة التطبيقات التي تقدمها Emacs تعمل على مستوى عالٍ من التجريد. ضع في اعتبارك أن سطور التعليمات البرمجية لـ wttr.el يبلغ وزنها 67. (النتيجة باستخدام الأداة المساعدة cloc.) إذا كان هذا كثيرًا، فتخيل تنفيذًا بديلاً حيث يتم طلب الشبكة الفعلي ومعالجة JSON في برنامج نصي Python يسمى الطقس. ثم أمر Elisp لاستدعائه هو مجرد الكود الموضح أدناه. (إلغاء الطقس (الموقع) “استدعاء برنامج الطقس مع LOCATION وإظهار النتيجة في المخزن المؤقت الصغير.” (التفاعلية “sWhere (افتراضي: محلي): “) (let* ((weather-cmd “weather”) (cmd (if location (تنسيق “%s %s” موقع Weather-cmd) Weather-cmd)) (النتيجة (أمر الصدفة إلى سلسلة cmd))) (نتيجة قتل جديدة) (نتيجة الرسالة))) مع التنفيذ أعلاه، الصدفة يصبح الأمر فعليًا “الخدمة” لتقديم طلب إليها. نظرًا لأن Elisp هي لغة برمجة ديناميكية، فإنها يمكن أن تسمح بدمج مكتبات Elisp مع أدوات سطر الأوامر المساعدة بطريقة مرتجلة. تعتبر هذه القدرة مقنعة للمستخدمين الذين يدركون الفرص التي يمكن أن تقدمها. emacs


تم النشر: 2026-07-10 09:21:00

مصدر: yummymelon.com