هل تريد فهمًا أفضل لـ Buffer في Node.js؟ تحقق من هذا.

هل أنت دهشت دائما، مثلي، كلما واجهتم كلمات مثل العازلة، تدفق، و البيانات الثنائية فيNode.js؟ هل هذا الشعور يجعلك تتجنب فهمها ، معتقدة أنها ليست مخصصة لك ولكن فقط لمعلمي Node.js ومطوري الحزم لفهمها؟

في الواقع ، قد تكون هذه الكلمات مخيفة للغاية ، خاصة عندما تدخل في تطوير الويب باستخدام Node.js بدون أي درجات علوم كمبيوتر.

للأسف ، ستنتقل العديد من البرامج التعليمية والكتب مباشرة إلى تعليم كيفية تطوير تطبيقات الويب باستخدام حزم Node.js دون السماح لك بفهم الميزات الأساسية لـ Node.js وسبب وجودها. وسيخبرك البعض بوقاحة أنك لست بحاجة إلى فهمهم لأنك أنتقد لا تعمل معهم بشكل مباشر.

حسنًا ، صحيح ، قد لا تعمل معهم مباشرة إذا اخترت أن تظل مطور Node.js متوسط.

ومع ذلك ، إذا كانت الألغاز تثير فضولك حقًا ، ولن تتوقف عند أي شيء لإرضاء فضولك ، وإذا كنت تريد نقل فهمك لـ Node.js إلى المستوى التالي ، فأنت تريد حقًا التعمق في فهم الميزات الأساسية العديدة من Node.js ، مثل Buffer ، على سبيل المثال. ولهذا السبب بالتحديد أكتب هذه المقالة - لمساعدتنا في إزالة الغموض عن بعض هذه الميزات ونقل تعلم Node.js إلى المستوى التالي.

عند تقديم Buffer ، تنص مستندات Node.js الرسمية جزئيًا ...

... آلية لقراءة أو معالجة تدفقات البيانات الثنائية. و Bufferقدم الطبقة كجزء من API نود.جي إس لتجعل من الممكن للتفاعل مع تيارات الثماني في سياق أشياء مثل الجداول TCP وعمليات نظام الملفات.

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

و Bufferقدم الطبقة كجزء من API نود.جي إس لتجعل من الممكن للتلاعب أو التفاعل مع تيارات من البيانات الثنائية.

الآن هذا أبسط ، أليس كذلك؟ لكن ... المخزن المؤقت ، التدفقات ، البيانات الثنائية ... لا يزال هناك العديد من الكلمات الكبيرة. حسنًا ، دعنا نحاول معالجة هذه الكلمات الكبيرة من الأخير إلى الأول.

البيانات الثنائية ، ما هذا؟

ربما تعلم بالفعل أن أجهزة الكمبيوتر تخزن البيانات وتمثلها في ثنائيات. الثنائي هو ببساطة مجموعة أو مجموعة من 1 و 0. على سبيل المثال ، فيما يلي خمس ثنائيات مختلفة ، وخمس مجموعات مختلفة من 1 و 0:

10، 01، 001، 1110،00101011

يُطلق على كل رقم في ثنائي ، في كل مجموعة 1وفي كل 0مجموعة ، اسم بت ، وهو شكل قصير من رقم ثنائي.

لتخزين أو تمثيل جزء من البيانات ، يحتاج الكمبيوتر إلى تحويل تلك البيانات إلى تمثيلها الثنائي. على سبيل المثال ، لتخزين الرقم 12 ، يحتاج الكمبيوتر إلى تحويل 12 إلى تمثيله الثنائي وهو 1100.

كيف يعرف الكمبيوتر كيفية إجراء هذا التحويل؟ حسنًا ، إنها الرياضيات البحتة. إنه نظام الأرقام الثنائية البسيط الذي تعلمناه في الرياضيات الأساسية - معبرًا عن رقم في نظام العد الأساسي 2. أجهزة الكمبيوتر تفهم هذه الرياضيات.

لكن الأرقام ليست نوع البيانات الوحيد الذي نعمل معه. لدينا أيضًا سلاسل وصور وحتى مقاطع فيديو. تعرف أجهزة الكمبيوتر كيفية تمثيل جميع أنواع البيانات في الثنائيات. لنأخذ السلاسل ، على سبيل المثال. كيف سيمثل الكمبيوتر السلسلة "L" في الثنائيات؟ لتخزين أي حرف في ثنائيات ، ستقوم أجهزة الكمبيوتر أولاً بتحويل هذا الحرف إلى رقم ، ثم تحويل هذا الرقم إلى تمثيله الثنائي. لذلك بالنسبة للسلسلة "L" ،وأجهزة الكمبيوتر أولا تحويل L إلى الرقم الذي يمثل L . دعونا نرى كيف.

فتح وحدة التحكم المتصفح الخاص بك ولصق التعليمات البرمجية المتكررة التالية ثم ضرب أدخل: "L".charCodeAt(0). ماذا رأيت؟ الرقم 76؟ وهذا هو عدد التمثيل أو الأحرف كود أو رمز نقطة للحرف L . ولكن كيف يعرف الكمبيوتر العدد الدقيق الذي سيمثل كل حرف؟ كيف تعرف استخدام الرقم 76 لتمثيل L ؟

مجموعات الأحرف

مجموعات الأحرف هي بالفعل قواعد محددة للرقم الدقيق الذي يمثل كل حرف. لدينا تعريفات مختلفة لهذه القواعد ، وتشمل التعريفات الشائعة جدًا Unicode و ASCII . تعمل JavaScript جيدًا مع مجموعات أحرف Unicode. في الواقع، هو Unicode في متصفحك بأن الدول التي يجب أن تمثل 76 L .

لذلك رأينا كيف تمثل أجهزة الكمبيوتر الشخصيات بالأرقام. الآن ، سيمثل الكمبيوتر بدوره الرقم 76 لتمثيله الثنائي. قد تعتقد ، حسنًا ، ما عليك سوى تحويل 76 إلى نظام العد الأساسي 2. ليس بهذه السرعة!

ترميز الأحرف

مثلما توجد قواعد تحدد الرقم الذي يجب أن يمثل حرفًا ، هناك أيضًا قواعد تحدد كيفية تمثيل هذا الرقم في ثنائيات. على وجه التحديد ، كم عدد البتات التي يجب استخدامها لتمثيل الرقم. وهذا ما يسمى ترميز الأحرف .

يعد UTF-8 أحد تعريفات "ترميز الأحرف " . ينص UTF-8 على أنه يجب تشفير الأحرف بالبايت. البايت هو مجموعة من ثماني بتات - ثمانية آحاد وأصفار. لذا يجب استخدام ثمانية قيم من 1 و 0 لتمثيل نقطة الرمز لأي حرف في النظام الثنائي.

لفهم هذا ، كما ذكرنا سابقًا ، يكون التمثيل الثنائي للرقم 12 هو 1100. لذلك عندما يشير UTF-8 إلى أن 12 يجب أن تكون في ثماني بتات ، فإن UTF-8 يقول أن الكمبيوتر يحتاج إلى إضافة المزيد من البتات إلى الجانب الأيسر من التمثيل الفعلي للقاعدة 2 للرقم 12 لجعله بايتًا. لذلك يجب تخزين 12 كملف 00001100. من المنطقي؟

لذلك ، يجب تخزين 76 كملف 01001100.

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

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

الآن نحن نفهم ما هي البيانات الثنائية ، ولكن ما هي تدفقات البيانات الثنائيةمن مقدمتنا إلى المخزن المؤقت؟

مجرى

يعني التدفق في Node.js ببساطة نقل سلسلة من البيانات من نقطة إلى أخرى بمرور الوقت. المفهوم بأكمله هو أن لديك كمية هائلة من البيانات التي يجب معالجتها ، لكنك لست بحاجة إلى الانتظار حتى تتوفر جميع البيانات قبل البدء في معالجتها.

في الأساس ، يتم تقسيم هذه البيانات الضخمة وإرسالها في أجزاء. لذا من التعريف الأصلي للمخزن المؤقت ("تدفقات البيانات الثنائية ... في سياق ... نظام الملفات") هذا يعني ببساطة نقل البيانات الثنائية في نظام الملفات. على سبيل المثال ، نقل النصوص المخزنة في file1.txt إلى file2.txt.

ولكن كيف بالضبط يساعدنا المخزن المؤقت في التفاعل مع البيانات الثنائية أو معالجتها أثناء البث؟ ما هو بالضبط هذا المخزن المؤقت؟

متعادل

لقد رأينا أن تدفق البيانات هو حركة البيانات من نقطة إلى أخرى ، ولكن كيف يتم نقلها بالضبط ؟

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

من ناحية أخرى ، إذا كانت العملية تستهلك البيانات بشكل أسرع من وصولها ، فإن البيانات القليلة التي تصل في وقت مبكر تحتاج إلى انتظار وصول كمية معينة من البيانات قبل إرسالها للمعالجة.

"منطقة الانتظار " هي العازلة! إنه موقع مادي صغير في جهاز الكمبيوتر الخاص بك ، عادةً في ذاكرة الوصول العشوائي ، حيث يتم جمع البيانات مؤقتًا والانتظار وإرسالها في النهاية للمعالجة أثناء البث.

يمكننا التفكير في عملية التدفق والمخزن بالكامل كمحطة للحافلات. في بعض محطات الحافلات ، لا يُسمح للحافلة بالمغادرة حتى وصول عدد معين من الركاب أو حتى موعد مغادرة محدد. أيضًا ، قد يصل الركاب في أوقات مختلفة وبسرعات مختلفة. لا يتحكم الركاب ولا محطة الحافلات في وصول الركاب إلى المحطة.

على أي حال ، سيحتاج الركاب الذين وصلوا في وقت مبكر إلى الانتظار حتى تقرر محطة الحافلات إرسال الحافلة في طريقها. أثناء وصول الركاب عند تحميل الحافلة بالفعل أو عند مغادرة الحافلة بالفعل ، يتعين عليهم انتظار الحافلة التالية.

مهما كانت الحالة ، هناك دائمًا مكان انتظار. هذا هو المخزن المؤقت لـ Node.js! لا يمكن لـ Node.js التحكم في سرعة أو وقت وصول البيانات ، أو سرعة الدفق. يمكنه فقط أن يقرر متى حان وقت إرسال البيانات. إذا لم يحن الوقت بعد ، فسوف يضعهم Node.js في المخزن المؤقت - "منطقة الانتظار" - وهو موقع صغير في ذاكرة الوصول العشوائي ، حتى يحين وقت إرسالها للمعالجة.

مثال نموذجي حيث يمكنك رؤية المخزن المؤقت أثناء العمل هو عندما تقوم ببث مقطع فيديو عبر الإنترنت. إذا كان اتصالك بالإنترنت سريعًا بدرجة كافية ، فستكون سرعة البث سريعة بما يكفي لملء المخزن المؤقت على الفور وإرساله للمعالجة ، ثم ملء واحد آخر وإرساله ، ثم آخر ، وآخر ... حتى التدفق انتهى.

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

إذا انتهى المشغل من معالجة البيانات السابقة أو تشغيلها ، ولم يتم ملء المخزن المؤقت بعد ، فسيتم عرض النص "التخزين المؤقت" مرة أخرى ، في انتظار جمع المزيد من البيانات للمعالجة.

هذا هو العازلة!

من التعريف الأصلي للمخزن المؤقت ، يوضح أنه أثناء وجوده في المخزن المؤقت ، يمكننا معالجة البيانات الثنائية التي يتم دفقها أو التفاعل معها. ما نوع التفاعل الذي يمكن أن نحصل عليه مع هذه البيانات الثنائية الخام؟ يوفر لنا تطبيق Buffer في Node.js قائمة كاملة بما يمكن القيام به. دعونا نرى البعض منهم.

التعامل مع المخزن المؤقت

من الممكن أيضًا إنشاء المخزن المؤقت الخاص بك! بصرف النظر عن Node.js الذي سيتم إنشاؤه تلقائيًا أثناء البث ، فمن الممكن إنشاء ومعالجة المخزن المؤقت الخاص بك. ممتع أليس كذلك؟ دعونا ننشئ واحدة!

اعتمادًا على ما تريد تحقيقه ، توجد طرق مختلفة لإنشاء مخزن مؤقت. دعونا نرى بعض.

// Create an empty buffer of size 10. // A buffer that only can accommodate 10 bytes.
const buf1 = Buffer.alloc(10);
// Create a buffer with content
const buf2 = Buffer.from("hello buffer");

بمجرد إنشاء المخزن المؤقت الخاص بك ، يمكنك البدء في التفاعل معه

// Examine the structure of a buffer
buf1.toJSON()// { type: 'Buffer', data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }// an empty buffer
buf2.toJSON()// { type: 'Buffer', data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() method presents the data as the Unicode Code Points of the characters
// Examine the size of a buffer
buf1.length // 10
buf2.length // 12. Auto-assigned based on the initial content when created.
// Write to a bufferbuf1.write("Buffer really rocks!") 
// Decode a buffer
buf1.toString() // 'Buffer rea'
//oops, because buf1 is created to contain only 10 bytes, it couldn't accommodate the rest of the characters
// Compare two buffers

هناك الكثير من التفاعلات التي يمكن أن نجريها مع المخزن المؤقت. توجه إلى المستندات الرسمية للعب أكثر بهذه الأساليب.

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

آمل أن تساعدك هذه المقدمة في الحصول على فهم أفضل لـ Node.js Buffer.

إذا كنت تشعر بأنني قمت بعمل جيد ، وأن الآخرين يستحقون فرصة لرؤية هذا ، فيرجى التصفيق للمقال للمساعدة في نشر فهم أفضل لـ Buffer في مجتمع Node.js الخاص بنا.

إذا كان لديك سؤال لم تتم الإجابة عليه أو كان لديك فهم مختلف لبعض النقاط هنا ، فلا تتردد في إرسال التعليقات هنا أو عبر Twitter.