لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 03/17/24 في كل الموقع
-
2 نقاط
-
اختبرت دورة تطوير واجهات المستخدم وحصلت على الشهادة ماذا ادرس بعد الدورة2 نقاط
-
احتاج لمخططات uml لتطبيق التوصيل (التطبيق يوفر عملية التوصيل فقط اي لا يتم عرض السلع ...)1 نقطة
-
السلام عليكم هو اي كورس CS50T واي الفرق بينو وبين كورس CS501 نقطة
-
1 نقطة
-
كما تعلم أن الدورة CS50 هي مدخل لعلوم الحاسوب ولكن تتوقع منك بعض المعرفة بالتكنولوجيا أو عالم الحاسوب ولكن بالنسبة للدورة CS50T موجهة للطلاب الذين يعتبرون أنفسهم لا يعرفون شيئاً حول مجال الحاسوب. فهي مصممة خصيصًا للأشخاص الذين يتعاملون مع التكنولوجيا يوميًا، ولكنهم لا يفهمون بالضرورة كيفية عمل كل شيء . لذلك المحاضرات حول مواضيع مثل الهاردوير، والإنترنت، والوسائط المتعددة، والأمان، والبرمجة، وتطوير الويب، تعد هذه الدورة الطلاب لاستخدام التكنولوجيا في حياتهم اليومية وتجهيزهم للتكنولوجيا المستقبلية أيضًا. لذلك بالنسبة للشخص المهتم بعلم الحاسوب ولديه معرفة بسيطة فقط فربما لا يحتاج لهذه الدورة يمكنك الإطلاع على المزيد من التفاصيل من خلال الصفحة الخاصة بالكورس من هذا الرابط1 نقطة
-
1 نقطة
-
السطر الاول مو مايسمى بالنظام الثنائي السطر الثاني هو ما يمثل عدد البايت لاحظ اننا بدأنا بالرقم 1 ثم قمنا بضربه باثنان ف اعطانا الرقم 2 اخذنا الرقم 2 وضربناه ب اثنان ف اعطانا الرقم 4 اخذنا ال4 وضربناها ب اثنان ف اعطانا الرقم 8 اي نستنج انه عبارة عن ضعف الرقم الذي وصلنا اليه وهكذا نقوم بتعبئة هذا الجدول الان ان اردت معرفة عدد البايت لهذا الرقم 10110110 ف ما سنفعله هو وضع الرقم تحت عدد البايت كالتالي والان لنحسب عدد البايت ل هذا الرقم نقوم بجمع الارقام التي تحتها العدد 1 فقط وهم كالتالي 2 + 4 + 16 + 32 + 128 = 182 لاحظ ان ال 1 و 8 و 64 لم نأخذهم لان تحتهم الرقم 0 والان اذا اردنا التحويل بمعلية عكسية اي من عدد البايت الى نظام ال 01 تكون الطريقة كالتالي فلنفرض اننها نريد تحويل الرقم 185 الخطوة الاولى نكتب المضاعفات التالية التي تعلمنا كتابتها وكيفة الحصول عليها قبل قليل الان نبحث عن الرقم الاصغر الاقرب الى 185 والذي هو هنا الرقم 128 ونضع تحته الرقم 1 ثم نقوم بانقاصه من الرقم الاساسي الذي معنا 185 185 - 128 = 57 الان نعيد نفس الطريقة نأخد 57 ونبحث عن اقرب اصغر رقم له والذي هو 32 ونضع تحته 1 وننقصهم من بعضهم 57 - 32 = 25 والان اصبح الرقم صغير لدينا وبأمكاننا التحكم به ال 25 هي عبارة عن مجموع الارقام التالية 16+8+1 = 25 وبالتالي نضع الرقم 1 تحت كل من هذه الارقام والارقام التي لم نستخدمها نضع اسفلها الرقم 0 وبالتالي ف ان النتيجة اصبحت كالتالي : 185 = 1 0 0 1 1 1 0 1 وللتأكد من اجابتك تجمع الارقام التي تحتها 1 مثل المثال السابق 1 + 8 + 16 + 32 + 128 = 185 والان اخر شيء والذي هو التحويل من الى عدد البايت وهذه اسهل شيء فقط نكتب المضاعفات ونأخذ الرقم الذي اسفلها كالتالي هنا 512 هي اسفل وبالتالي = 512 بت وبالتوفيق لك ..1 نقطة
-
CS50 هو كورس لتعلم علوم الكومبيوتر مقدم من جامعة هارفارد ويعني Introduction to Computer Science اي انه مقدمة لعلوم الكومبيوتر ويتم اعطاءه داخل جامعة هارفارد حضوريا CS50T في البداية هو نفس كورس CS50 ولكن نلاحظ ان هناك حرف T زائد وذلك يعني ان هذا الكورس يتم تقديمه عبر الانترنت بواسطة المدرسة التابعة لهارفارد للتكنلوجيا Harvard Extension School ولا حاجة لك للحضور الجامعي اي في النهاية ان كنت تسكن بالقرب من جامعة هارفارد او بأمكانك الوصول اليها فأن ال CS50 هو الخيار الافضل ام ان كنت تريد التعلم اون لاين ف عليك ب CS50T والاثنان لهما نفس القيمة واعتمادية الشهادة تقريبا وبالتوفيق لك ..1 نقطة
-
هناك شيء أعتبره شخصيّا أساسيا ولا أستطيع الجلوس إلى الحاسوب بدونه ويوفقني فيه كثير من المبرمجين: تفعيل الوضع الداكن (Dark Mode) في كل مكان ممكن! سابقا كان دعم الوضع الداكن محدودا للغاية وكنت أعاني بسبب هذا، إذ أنه لم يكن متوفّرا سوى في برامج كتابة الأكواد وبعض البرامج المتفرّقة (مثل Discord). دعم هذا الوضع في أنظمة Windows كان فاشلا للغاية مما دفعني إلى استخدام أنظمة Linux التي تملك بيئة سطح مكتب KDE، حيث أن هذه البيئة كانت تدعم الوضع الداكن بشكل جيّد منذ زمن طويل. وما يزيد الطين بلّة، موقع GitHub نفسه الذي هو أكبر معقل للمبرمجين في العالم لم يكن يدعم الوضع الداكن! لذلك، بالإضافة إلى انتقالي إلى استخدام بيئة سطح المكتب KDE، كنت أبحث عن أي شيء يمكنه أن يجعل المواقع بشكل قاتم (ملاحظة: جعلها قاتمة لا يعني عكس الألوان بسذاجة، الأمر أعقد من ذلك بكثير)، وانتهيت أخيرا إلى الوصول إلى الإضافة التي كانت (ومازالت) سر هنائي: Night Eye. هذه الإضافة تحوّل أي موقع إلى الوضع الداكن. في بعض المواقع قد يكون تحويلها سيئا قليلا، لذلك فهي تملك خيارات أخرى مثل تخفيض الإضاءة وما شابه، لكن يمكن اعتبار أنّها إضافة ناجحة وتعمل بشكل صحيح بالإعدادات الافتراضية مع أكثر من 90% من المواقع. وأنا حاليا أثناء كتابة هذه السطور أقوم باستخدامها لتحويل موقع أكاديمية حسوب إلى الوضع الداكن! (أرفق لك لقطة من الشاشة لترى ذلك). يمكنك تجريب هذه الإضافة على أيّة متصفّح أو إضافة أخرى مشابهة إذا أردت (هذه الإضافة لها نسخة تجريبية تعمل لمدّة 3 أشهر، ثمّ بعد ذلك تحتاج إلى دفع أو اشتراك. أنا دفعت 40 دولار مرة واحدة وأستخدمها مدى الحياة). حاليا دعم الوضع الداكن قد تحسّن كثيرا، وصار مدعوما على أغلب الأنظمة وكثير من البرامج بشكل افتراضي، بما في ذلك نظام Windows وبرامجه. لذلك حتى إن كنت تعمل على 10 Windows فقم بتغيير الألوان والوضع لجعلها مظلما. هذا مقال يشرح كيفية القيام بذلك: https://uk.pcmag.com/migrated-3765-windows-10/122487/how-to-enable-dark-mode-in-windows-10 وبالطبع دائما استخدم الوضع الداكن في محررات الشيفرات وبيئات التطوير المتكاملة مثل Intellij IDEA و VS Code (هي تأتي بالوضع الداكن افتراضيا، فلا تغيّره).1 نقطة
-
أبسط وأسهل شيء يمكنك فعله هو تقليل الضوء الأزرق في أوقات الليل بدءًا من الساعة 7 مساءًا وحتى الساعة 7 صباحًا. ويوجد في الويندوز تلك الميزة ستجدها باسم night light هنا: ومن المفترض أيضًا إراحة العينين كل ساعة بالإبتعاد عن الحاسوب والتمشية قليلاً في أرجاء الغرفة مثلاً لخمس دقائق والنظر لأبعد نقط في أرجاء الغرفة لإراحة عضلة العين. لكن لنتحدث بواقعة الأمر صعب على الكثير، لذا أقل الإيمان وضع تنبيه على هاتفك أو الحاسوب بالنظر بعيدًا عن الشاشة لمدة بسيطة كما ذكرت. أيضًا الجفاف أمر شائع وخطير، من الأفضل وضع قطرة للعينين لترطيب العينين إن كنت تجلس أكثر من 8 ساعات يوميًا. والأهم من ذلك كله، هو طريقة جلوسك على الكرسي، فصحة عمودك الفقري ورقبتك أمر لا يجب التهاون به، فنتيجة التهاون صعبة جدًا ومكلفة صحيًا. وفي رأي لا غنى عن ممارسة الرياضة لأي شخص يجلس على الكمبيوتر لأداء عمله، لكن أقل الإيمان يمكن التمشية يوميًا لمدة ربع ساعة مثلاً.1 نقطة
-
بالإضافة للنصائح القيمة في التعليق السابق فإنه للحفاظ على العين بسبب الجلوس لفترات كبيرة يجب بشكل أساسي الراحة كل فترة نص ساعة مثلاً بالنظر بعيداً عن الشاشة لعدة دقائق و إليك بعض النصائح الأخرى المهمة إذا كان هناك مقدرة لشراء شاشة أفضل حيث هناك بعض الشاشات التي تحتوي على خصائص لتقليل الضرر على العين ويمكن تعويض ذلك من خلال بعض الرابمج التي تعمل على ضبط السطوع و هناك برامج متوفرة تقوم بتصحيح درجة اللون على الشاشة لجعلها أكثر راحة للعينين، مثل f.lux أو Night Shift. حاول أيضاً استخدام النظارات الخاصة بالإشعاع الأزرق تقليل التعب والتوهج الذي يسببه الكمبيوتر، وهي مفيدة خاصة إذا كنت تعمل لفترات طويلة أمام الشاشة. ومن أهم النصائح أيضاً استخدم قطرات مرطبة للعين حيث أن الجلوس لفترات كبيرة يسبب جفاف العين أثناء العمل على الكمبيوتر.1 نقطة
-
وعليكم السلام ورحمة الله وبركاته، بالتأكيد السلامة المهنية من أهم النقاط التي يجب أن يحرص عليها كل إنسان مهما كانت مهنته، وبالنسبة لمستخدمي الحاسب الآلي يقضون أوقاتًا طويلةً جدًا أمام الجهاز مما يتسبب في العديد من المشاكل الصحية إن لم نتبع الأساليب الصحية. وإليك بعض النصائح للحفاظ على الصحة العامة وليس العينين فقط، لأن الضرر قد يلحق بفقرات العنق، وبالمفاصل وبالدورة الدموية. ضبط وضعية الشاشة: يجب التأكد من أن شاشة الكمبيوتر أو اللاب توب تكون على مسافة ذراع من عينيك (حوالي 60 سم). يفضل أن تكون الحافة العلوية للشاشة على مستوى عينيك أو أسفلها قليلاً، بحيث تكون الرقبة على مستوى مضبوط ليست مائلة للأسفل أو للأعلى ضبط وضعية الكرسي: اختر كرسيًا يكون مريحًا ويدعم منطقة الظهر، وتأكد من أن الكرسي يكون قابلًا للتعديل لتناسب ارتفاع مكتب العمل. يجب أن يكون ظهرك مستقيمًا، والركبتان بزاوية قريبة من 90 درجة تنويع وضعية الكرسي حتى لا يتم إجهاد عضلات معينة وكسل عضلات أخرى الرمش بانتظام: قم بالرمش بانتظام لزيادة ترطيب العين، حيث أن الرمش يعمل كاستراحة للعين ويساعد في تجنب الجفاف. استراحة كل ساعة: كلما مرت ساعة من العمل أمام الشاشة، خذ استراحة لمدة 5 دقائق على الأقل. نظر إلى مسافة بعيدة أو قم بتحريك العينين لتجنب التركيز المستمر. تحكم في سطوع الشاشة: ضبط سطوع الشاشة ليكون مريحًا لعينيك، ومتناسبًا مع الإضاءة المحيطية، وتجنب الإضاءة الزائدة والانعكاسات على الشاشة. تناول الأطعمة الصحية: تناول الخضروات والفواكه التي تحتوي على فيتامينات مفيدة لصحة العينين مثل فيتامين أ الموجود في الألبان والجبن الطبيعية والجزر والخضروات. الرياضة وزيارة الأطباء في حالة حدوث بوادر شكوى: رياضة المشي من أهم الرياضات ويكفي ممارستها لمدة 20 دقيقة (يمكن النزول قبل مكان العمل بحوالي 700 مترًا) زيارة طبيب الرمد أو العظام أو القلب في حالة ظهور أي أعراض غير طبيعية.1 نقطة
-
من الناحية البرمجية بالطبع يمكنك استخدام خصائص Django و Laravel معا في موقع واحد أو تطبيق واحد، ولكن يجب أن تكون هناك بعض الاعتبارات التي يجب مراعاتها، حيث يجب أن يكون لديك خادم واحد يتعامل مع كلا التقنيتين، و يكون التواصل عن طريف أن تستخدم Django لإنشاء API و Laravel لاستهلاك هذه الAPI، أو العكس. لكن يجب أن تعرف أنهما مبنيان باستخدام لغات برمجة مختلفة، فكل إطار عمل له هيكله وتقاليده وطريقته الخاصة في القيام بالأمور، خلط هذين الإطارين سيؤدي إلى قاعدة بيانات معقدة للغاية وصعبة الصيانة. إذا أحترت بين إختيار أحدهما يمكنك أن تطلع على هذه المقالات لتأخذ فكرة أفضل على كليهما:1 نقطة
-
وعليكم السلام, أجمعين ان شاء الله تسعير العمل في مجال البرمجة وتطوير الويب يمكن أن يكون تحديًا، خصوصاً عندما تواجه تحديات مثل عدم تقدير العملاء لقيمة الخدمة التي تقدمها. بإمكانك في البداية تحليل السوق , أي قم ببحث عن الأسعار المعتادة لخدمات البرمجة في سوقك المحلي أو العالمي. هل تجد أن أسعارك متوافقة مع المتوسط أم أنها أعلى أو أقل؟ ثم قم بوضع السعر المناسب لهذا المشروع . في البداية ربما تجد صعوبة في إقناع العملاء بقيمة الخدمة , بالنسبة لي عندما أواجه مثل هذه الأمور فغالباً أوضح الخبرات اللازمة لتنفيذ المشروع ومدى خبرتي في هذه الأمور , إضافة للوقت والجهد المطلوب . لأن كثير من العملاء لا تعلم كم يحتاج للخبرة والوقت. أو بعض الأحيان أتجاهل العروض البسيطة , مثل متجر إلكتروني متكامل ب50 دولار. يمكنك أيضاً إتباع نظام الساعات , لكن بعض الأحيان لا تكون مجدية , بسبب رؤية العميل لتكلفة ساعة لخبير أكثر بكثير من مبرمج متوسط الخبرة. بالنسبة لي , أقوم بحساب المدى الزمنية , ومن ثم الخبرة المطلوبة لان بالطبع اذا كنت قادر على تنفيذ شيء من الصعب إيجاد شخص أخر يمكنه تنفيذه فهذه ميزة تستحق الدفع من أجلها أيضاً .1 نقطة
-
بالتأكيد أصعب ما يواجه المستقل في بداية رحلة في العمل الحر هو التسعير ليس بسبب صعوبة التسعير فقط إنما للخوف من ضياع المشروع بسبب تسعير الخدمة بشكل مبالغ وثمن باهظ بالفعل أو بسبب التسعير بشكل زهيد ولكن للملاحظة أنه لا تقوم بالتسعير بناءاً على رأي العميل حيث أنه لا يمكن للعميل تقدير المجهود الذي تبذله فبالطبع تقوم بالتسعير الذي تجده مناسب لمجهودك ولكن في بداية الأمر ربما تقوم بتقليل الثمن الخدمة للحصول على العمل ولكن لاحقاً لا يصبح الأمر كذلك تماماً وبالنسبة للتسعير فيوجد عدة طرق منها التسعير بعدد الساعات : في هذا النوع تحسب سعر المشروع وفقًا لعدد الساعات التي تحتاجها لتنفيذ ولكن هذه الطريقة تحتاج لبعض الخبرة لمعرفة الوقت المستغرق لتنفيذ الخدمة التسعير بالوحدات : في هذا النوع تحدد السعر لكل وحدة عمل. وهذا النوع هو الأشهر في تحديد الأسعار في السوق1 نقطة
-
التسعير صعب في البداية بالفعل على الجميع، وهناك آراء كثيرة مختلفة حوله ولكل شخص ظروفه والمستويات مختلفة، والموضوع يتوقف على معرض الأعمال لديك ومستوى جودته والخبرة التي تمتلكها وهل ستقوم أنت بالتصميم والبرمجة أم البرمجة فقط، أيضًا بلد العميل وقوة العملة لديه. بشكل بسيط، في المتوسط يمكنك تحديد سعر تطوير صفحة واحدة بالموقع بسعر 50 دولار لكن في حال كانت صفحة كانت ليست معقدة وبها الكثير من المكونات فالسعر يرتفع بالطبع إن كانت كذلك. وهناك طريقة أفضل وهي تحديد سعر ساعة العمل الخاصة بك، ثم ضرب عدد ساعات العمل المتوقعة للمشروع في سعر الخاصة بك ولتكن مثلاً 10 دولار كمثال ليس أكثر فساعات العمل تتراوح ما بين 10 إلى 50 دولار حسب الخبرة ومستوى الجودة. لكن مشكلة سعر الساعة هو أنه في البداية لن يكون لديك دراية بالمدة المناسبة للمشروع حيث ستتمكن من معرفة ذلك لاحقًا بعد تنفيذ مشاريع واكتساب خبرة، لذا تفقد الأسعار للمبرمجين الذي يعملون بنفس التقنيات الخاصة بك على مواقع العمل الحر من حيث سعر الساعة، ثم ضع احسب متوسط السعر وضع سعر ساعة منخفض قليلاً عن المتوسط في البداية وقدم جودة عمل جيدة أعلى من المطلوب في حال كان ذلك أول مشروع لك. وستجد تفصيل أكثر بخصوص التسعير هنا طرحته من قبل: https://io.hsoub.com/programming/103606-أيها-المبرمج-كيف-تسعر-أعمالك1 نقطة
-
إحدى أولى المفاهيم التي يتعلمها مبرمج أنظمة يونكس هي أنّ عمل كل برنامج يبدأ بثلاث ملفات تكون مفتوحةً مسبقًا: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الاسم الوصفي الاسم المختصر رقم الملف الشرح مجرى الدخل القياسي stdin 0 الدخل من لوحة المفاتيح مجرى الخرج القياسي stdout 1 الخرج الظاهر على الطرفية مجرى الخطأ القياسي stderr 2 خرج رسائل الخطأ على الطرفية (ملفات يونيكس الافتراضية) يستحضر هذا إلى أذهاننا السؤال عمّا يمثله الملف المفتوح وكيفية فتحه، إذ تسمى القيمة التي يعيدها استدعاء open لفتح الملف اصطلاحًا بواصف الملف file descriptor، وهي أساسًا فهرس لمصفوفة من الملفات المفتوحة المخزَّنة في النواة. (فائدة واصفات الملفات في عملية التجريد) تُعَدّ واصفات الملفات فهرسًا لجدول واصفات الملفات تخزنه النواة، بحيث تنشئ النواة واصف ملف استجابةً لاستدعاء open وتربطه ببعض التجريد لكائن يشبه الملف سواءً كان جهازًا فعليًا أو نظام ملفات أو شيء بعيد عن هذا كل البعد، وبالتالي توجه النواة استدعاءات عمليات القراءة read والكتابة write التي تشير إلى واصف الملف ذاك إلى الموضع الصحيح لتنفذ مهمة مفيدة في النهاية. تعرض الصورة نظرةً عامةً على تجريد العتاد، وباختصار يُعَدّ واصف الملف البوابة إلى تجريدات النواة للعتاد والأجهزة الأساسية. لنبدأ من المستوى الأدنى، إذ يتطلب نظام التشغيل وجود مبرمج ينشئ تعريفًا للجهاز device driver أو برنامج تعريف حتى يتمكن من التواصل مع أحد أجهزة العتاد، ويُكتَب تعريف الجهاز هذا إلى واجهة API التي توفرها النواة بالطريقة نفسها والتي وردت في مثال المقال السابق، إذ سيوفر تعريف الجهاز مجموعة دوال تستدعيها النواة استجابةً للمتطلبات المختلفة، ويمكننا في المثال المبسَّط في الصورة السابقة رؤية أن تعريف الجهاز يوفِّر دالة القراءة read والكتابة write اللتين ستُستدعيان استجابةً للعمليات المماثلة التي تنفذ على واصف الملف، كما يعلم تعريف الجهاز كيف يحوِّل هذه الطلبات العامة إلى طلبات أو أوامر محددة لجهاز محدد. تقدم النواة واجهة-ملف file-interface لتوفير التجريد لمساحة المستخدِم عبر ما يسمى بطبقة الجهاز device layer عمومًا، إذ تمثَّل الأجهزة المادية على المضيف بملف له نظام ملفات خاص مثل dev/، ففي أنظمة يونكس وما يشابهها تحتوي عقد الجهاز device-nodes على ما اصطلح تسميته بالعدد الرئيسي major number والعدد الثانوي minor number، مما يتيح للنواة ربط عقد محددة بما يقابلها ببرنامج التعريف الموفر، كما يمكنك الاطلاع عليها من خلال الأمر ls كما هو موضح في المثال التالي: $ ls -l /dev/null /dev/zero /dev/tty crw-rw-rw- 1 root root 1, 3 Aug 26 13:12 /dev/null crw-rw-rw- 1 root root 5, 0 Sep 2 15:06 /dev/tty crw-rw-rw- 1 root root 1, 5 Aug 26 13:12 /dev/zero ينقلنا هذا إلى واصف الملف، وهو الأداة التي تستخدِمها مساحة المستخدِم للتواصل مع الجهاز الأساسي، وبصورة عامة ما يحدث عند فتح الملف هو أنّ النواة تستخدِم معلومات المسار لربط map واصف الملف بشيء يوفِّر واجهتّي API قراءة وكتابة وغيرهما مناسبة، فعندما تكون عملية فتح الملف open للجهاز مثل /dev/sr0 في مثالنا السابق، فسيوفر العدد الرئيسي والثانوي لعقدة الجهاز المفتوح المعلومات التي تحتاجها النواة للعثور على تعريف الجهاز الصحيح وإتمام عملية الربط mapping، كما ستعلم النواة بعد ذلك كيف توجه الاستدعاءات اللاحقة مثل القراءة read إلى الدوال الأساسية التي يوفرها تعريف الجهاز. يعمل الملف غير المرتبط بجهاز non-device file بآلية مشابهة، على الرغم من وجود طبقات أكثر خلال العملية، فالتجريد هنا هو نقطة الوصل أو الربط mount point، وكما تملك عملية توصيل نظام الملفات file system mounting غايةً مزدوجةً تتمثل في إعداد عملية الربط mapping، بحيث يتعرف نظام الملفات على الجهاز الأساسي الذي يوفِّر التخزين وتعلم النواة أنّ الملفات المفتوحة في نقطة التوصيل تلك يجب أن توجَّه إلى تعريف نظام الملفات، كما تُكتَب أنظمة الملفات على واجهة API محددة لنظام الملفات العام التي توفرها النواة على غرار تعريفات الأجهزة. بالطبع الصورة الكاملة معقدة أكثر في الواقع، إذ تضم عدة طبقات أخرى، فتبذل النواة على سبيل المثال جهدًا كبيرًا لتخزين cache أكبر قدر ممكن من البيانات الواردة من الأقراص في الذاكرة الخالية، ويقدِّم هذا العديد من الميزات التي تحسِّن السرعة، كما تحاول النواة تنظيم الوصول إلى الجهاز بأكثر طريقة فعالة وممكنة مثل محاولة طلب الوصول إلى القرص للتأكد من أن البيانات المخزَّنة فيزيائيًا بالقرب من بعضها ستستعاد معًا حتى لو لم ترد الطلبات بترتيب تسلسلي، بالإضافة إلى انتماء العديد من الأجهزة إلى فئة أعم مثل أجهزة USB أو SCSI التي توفِّر طبقات التجريد الخاصة بها للكتابة عليها، وبالتالي ستمر أنظمة الملفات في هذه الطبقات المتعددة بدلًا من الكتابة مباشرةً على الأجهزة، أي يكون فهم النواة هو فهم كيفية ترابط واجهات API المتعددة تلك وتواجدها مع بعضها. الصدفة Shell تُعَدّ الصدفة بوابة التفاعل مع نظام التشغيل سواءً كانت باش bash أو zsh أو csh أو أيّ نوع من أنواع الأصداف الأخرى العديدة، إذ تشترك جميعها أساسًا في مهمة رئيسية واحدة فقط، وهي أنها تتيح لك تنفيذ البرامج، كما ستبدأ بفهم آلية تنفيذ الصدفة لهذه المهمة فعليًا عندما سنتحدث لاحقًا عن بعض العناصر الداخلية لنظام التشغيل. لكن الأصداف قادرة على تنفيذ مهام أكبر بكثير من مجرد إتاحة تنفيذ برنامج، إذ تتميز بقدرات قوية لإعادة توجيه الملفات، وتتيح لك تنفيذ عدة برامج في الوقت نفسه وكتابة نصوص برمجية تبني برامج متكاملة، وهذا كله يعيدنا إلى مقولة كل شيء هو عبارة عن ملف. إعادة التوجيه Redirection لا نريد في معظم الأحيان أن تشير واصفات الملفات القياسية التي تحدثنا عنها في بداية المقال إلى مواضع محددة افتراضيًا، فقد ترغب مثلًا في تسجيل كامل خرج البرنامج على ملف تحدده على القرص أو في جعله يتلقى أوامره من ملف أعددته مسبقًا، وقد ترغب في تمرير خرج برنامج ليكون دخل برنامج آخر، إذ تيسّر الصدفة ذلك وأكثر بالعمل مع نظام التشغيل. الاسم الأمر الوصف مثال إعادة التوجيه إلى ملف filename < أخذ كامل الخرج الناتج عن Standard Out وتسجيله في الملف filename (استبدل filename باسم الملف). ملاحظة: استخدم << لتُلحق الخرج بنهاية محتوى الملف بدلًا من استبدال محتواه ls > filename القراءة من ملف filename > نسخ كافة البيانات من الملف إلى دخل البرنامج القياسي standard input echo < filename التمرير Pipe program1 | program2 أخذ كامل خرج standard out البرنامج الأول program1 وتمريره إلى دخل standard input البرنامج الثاني program2 ls | more تنفيذ عملية التمرير pipe يُعَدّ تنفيذ الأمر ls | more مثالًا آخرَ على قدرة التجريد، فما يحدث هنا بصورة أساسية هو أنه بدلًا من ربط واصف الملف لمجرى الخرج القياسي بإحدى الأجهزة الأساسية مثل الطرفية لعرض الخرج عليها، يوجَّه الواصف إلى مخزن مؤقت buffer في الذاكرة توفِّره النواة ويطلق عليه عادةً الأنبوب pipe، والمميز هنا هو إمكانية عملية أخرى أن تربط دخلها القياسي standard input بالجانب الآخر من المخزن المؤقت ذاته buffer وتستحوذ على خرج العملية الأخرى بفعالية كما هو موضَّح في الصورة التالية: (الأنبوب) الأنبوب هو مخزن مؤقت في الذاكرة يربط عمليتين معًا، وتشير واصفات الملف إلى كائن الأنبوب الذي يخزن البيانات المرسلة إليه من خلال عملية الكتابة ليصرِّفها من خلال عملية القراءة. تخزِّن النواة عمليات الكتابة في الأنبوب حتى تصرّف عملية قراءة مقابلة من الجانب الآخر للمخزن المؤقت، وهذا مفهوم قوي جدًا وهو أحد الأشكال الأساسية للتواصل بين العمليات inter-process communication -أو IPC اختصارًا- في أنظمة يونكس وما يشابهها، كما لا تقتصر عملية التمرير على نقل البيانات، إذ يمكن أن تؤدي دور قناة إشارات signaling channel، فإذا قرأت إحدى العمليات أنبوبًا فارغًا، فستعطله أو تجمده block افتراضيًا أو تضعه في حالة سبات hibernation إلى حين توفر بعض البيانات، وسنتعمق في هذا أكثر في مقال لاحق من هذه السلسلة، وبالتالي قد تستخدِم عمليتان أنبوبًا للإبلاغ عن اتخاذ إجراء ما عن طريق كتابة بايت واحد من البيانات، فبدلًا من أن تكون البيانات الفعلية مهمةً، فإن مجرد وجود أية بيانات في الأنبوب يمكن أن تشير إلى رسالة، فلنفترض مثلًا أنّ إحدى العمليات تطلب طباعة عملية أخرى لملف وهو أمر سيستغرق بعض الوقت، لذا قد تُعِدّ العمليتان أنبوبًا بينهما بحيث تقرأ العملية التي أرسلت الطلب الأنبوب الفارغ، وبما أنه فارغ، فسيعطّل هذا الاستدعاء وتبطِل العملية، لكن بمجرد الانتهاء من الطباعة، ستكتب العملية الأخرى رسالةً في الأنبوب ويؤدي ذلك إلى إيقاظ العملية التي أرسلت الطلب بصورة فعالة وإرسال إشارة تدل على انتهاء العمل. ينبثق عن السماح للعمليات بتمرير البيانات بين بعضها بهذه الطريقة مصطلح شائع آخر في يونكس للأدوات الصغيرة التي تنفذ أمرًا معينًا، ويضفي تسلسل هذه الأدوات الصغيرة مرونةً لا تستطيع أداة موحَّدة إضفاءها في معظم الأحيان. ترجمة -وبتصرُّف- لقسم من الفصل Chapter 1. General Unix and Advanced C من كتاب Computer Science from the Bottom Up. اقرأ أيضًا المقال التالي: تعرف على نظام العد الثنائي Binary أساس الحوسبة المقال السابق: مفهوم التجريد abstraction في أنظمة التشغيل وأهميته للمبرمجين التجريد (Abstraction) والواجهات (Interfaces) والسمات (Traits) في PHP النسخة العربية الكاملة لكتاب: أنظمة التشغيل للمبرمجين1 نقطة
-
مفهوم الملف هو تجريد abstraction مناسب إما كحوض للبيانات أو مصدر لها، وبالتالي هو تجريد ممتاز لجميع الأجهزة التي قد يوصلها المرء بالحاسوب. هذا الإدراك هو سر القوة العظيمة لنظام التشغيل يونيكس ويتجلى في مجمَل تصميم كامل المنصة. ويُعَدّ توفير تجريد الأجهزة هذا للمبرمج من الأدوار الرئيسية لنظام التشغيل. كل شيء عبارة عن ملف تُعَدّ مقولة كل شيء عبارة عن ملف مبدأً يُستمَد غالبًا من أنظمة يونكس Unix وما يشابهها مثل لينكس linux وبي إس دي BSD. لنتخيل ملفًا في إطار مألوف مثل معالج النصوص، إذ تكون العمليتان الأساسيتان اللتان نستطيع تنفيذهما على ملف في معالج النصوص التخيلي هذا كما يلي: قراءته، أي قراءة معالج النصوص البيانات الحالية المحفوظة. الكتابة ضمنه، أي كتابة المستخدِم بيانات جديدةً. لنستعرض بعض الطرفيات الشائعة الموصولة بالحاسوب، وما هو ارتباطها بالعمليات الأساسية على الملفات: الشاشة. لوحة المفاتيح. الطابعة. القرص المدمَج CD-ROM. تشبه كل من الشاشة والطابعة ملفًا للكتابة فقط، إذ تُعرَض المعلومات نقاطًا على الشاشة أو خطوطًا على الصفحة بدلًا من تخزينه على هيئة بِتّات على القرص؛ أما لوحة المفاتيح، فتُعَدّ مثل ملف للقراءة فقط، إذ ترد البيانات من ضغطات المستخدِم على المفاتيح، وكذلك الأمر بالنسبة للقرص المضغوط CD-ROM مثلًا، لكن تخزَّن البيانات مباشرةً على القرص بدلًا من أن يدخلها المستخدِم عشوائيًا. وبالتالي فإن مفهوم الملف هو تجريد abstraction مناسب إما لحوض البيانات أو مصدرها، لذا فهو تجريد ممتاز لجميع الأجهزة التي قد يوصلها المرء بالحاسوب، ويُعَدّ هذا الإدراك هو سر القوة العظيمة لنظام التشغيل يونيكس ويتجلى في مجمَل تصميم كامل المنصة، كما يُعَدّ توفير تجريد الأجهزة هذا للمبرمج من الأدوار الرئيسية لنظام التشغيل. ربما لا نبالغ عندما نقول أنّ التجريد هو المفهوم الأساسي الذي يدعم جميع أشكال الحوسبة الحديثة، إذ لا يمكن لشخص واحد فهم كل الأمور من تصميم واجهة مستخدِم حديثةً إلى العمليات الداخلية لوحدة المعالجة المركزية CPU الحديثة، ناهيك عن بنائها بكاملها بأنفسهم؛ أما بالنسبة للمبرمجين، فالتجريد هو اللغة المشتركة التي تتيح لنا التعاون والابتكار. يمنحنا تعلّم التنقل بين التجريدات رؤيةً أعمق لطريقة استخدام التجريدات بأفضل الأساليب وأكثرها ابتكارًا، وسندرس في هذه السلسلة التجريدات في الطبقات الدنيا وبين التطبيقات ونظام التشغيل وبين نظام التشغيل والعتاد الصلب، كما توجد العديد من الطبقات الأعلى منها وكل منها تستحق التفرُّد بسلسلة خاصة بها، ونأمل منك اكتساب بعض الرؤى عن التجريدات التي يقدِّمها نظام التشغيل الحديث مع دراسة كل مقال من مقالات هذه السلسلة. (صورة توضح مفهوم التجريد) تطبيق التجريد يُطبَّق التجريد عمومًا بما يسمى واجهة برمجة التطبيق API، ويُعَدّ API مصطلحًا مبهمًا نوعًا ما، إذ يشير إلى أمور مختلفة حسب سياقات الأعمال البرمجية المتنوعة،يصمم المبرمج في الأساس مجموعة دوال functions، ويُوثِّق واجهتها ووظيفتها حسب مبدأ أن التنفيذ الفعلي الذي يزوده بواجهة API يكون مخفيًا. تقدِّم العديد من تطبيقات الويب على سبيل المثال واجهة API يمكن الوصول إليها عن طريق بروتوكول HTTP، ويطلق الوصول إلى البيانات بهذه الطريقة عدة سلاسل معقدة من استدعاءات الإجراءات البعيدة remote procedure calls واستعلامات قاعدة البيانات database queries وعمليات نقل البيانات data transfers، وتكون جميعها غير مرئية بالنسبة للمستخدِم النهائي الذي يتلقى البيانات المقتضبة ببساطة. سيألف الذين هم على دراية باللغات البرمجية كائنية التوجه object-oriented مثل جافا Java أو بايثون Python أو ++C مفهوم التجريد في الأصناف classes، إذ تزِّود التوابع methods الصنف بالواجهة لكنها تجرِّد التنفيذ. تطبيق التجريد بلغة البرمجة C تُعَدّ مؤشرات الدالة function pointers منهجيةً شائعةً تُستخدَم في نواة نظام تشغيل لينكس وغيرها من الشيفرات البرمجية الأساسية المكتوبة بلغة C والتي لا يكون مفهوم كائنية التوجه مدمجًا فيها، كما يُعَدّ فهم هذا المصطلح أمرًا رئيسيًا لقراءة معظم الشيفرات البرمجية الأساسية المكتوبة بلغة C، إذ يمكّنك فهم طريقة قراءة التجريدات الموجودة ضمن الشيفرة البرمجية من تكوين فكرة عن تصاميم واجهات API الداخلية. #include <stdio.h> /* الواجهة البرمجية التي سننفذها */ struct greet_api { int (*say_hello)(char *name); int (*say_goodbye)(void); }; /* تطبيق دالة hello */ int say_hello_fn(char *name) { printf("Hello %s\n", name); return 0; } /* تطبيق دالة goodbye */ int say_goodbye_fn(void) { printf("Goodbye\n"); return 0; } /* بنية لتنفيذ الواجهة البرمجية*/ struct greet_api greet_api = { .say_hello = say_hello_fn, .say_goodbye = say_goodbye_fn }; /* لا تحتاج الدالة main() معرفة أيّ شيء عن آلية عمل * say_hello/goodbye، فهي لا تعلم إلا أنها تعمل*/ int main(int argc, char *argv[]) { greet_api.say_hello(argv[1]); greet_api.say_goodbye(); printf("%p, %p, %p\n", greet_api.say_hello, say_hello_fn, &say_hello_fn); exit(0); } تُعَدّ هذه الشيفرة البرمجية بأنها أبسط نموذج عن البنى التي يتكرر استخدامها في جميع أجزاء نواة لينكس والبرامج الأخرى المبنية على اللغة C، ولنلقِ نظرةً على بعض العناصر المحددة. نبدأ بالبنية التي تحدِّد الواجهة البرمجية struct greet_api، فالدوال التي أحيطت أسمائها بأقواس مع محدد المؤشر pointer marker تصف مؤشر الدالة، إذ يصف مؤشر الدالة النموذج الأولي للدالة التي يجب أن يشير إليها، كما سيؤدي توجيهه إلى دالة دون إضافة النوع المُعاد return type الصحيح أو المعاملات الصحيحة على الأقل إلى توليد تحذير من المصرِّف، وإذا تركته في الشيفرة البرمجية، فيحتمل أن يؤدي إلى تنفيذ عملية خاطئة أو أعطال، لذلك إذ ستجد غالبًا أنّ أسماء المعامِلات parameters قد حُذفت ولم يُحدَّد إلا نوع المعامِل، ويتيح هذا للمنفذ تحديد أسماء المعامِلات لتجنب ورود تحذيرات من المصرِّف. سنتناول الآن تنفيذ الواجهة البرمجية، إذ ستجد عادةً في الدوال الأعقد مصطلحًا يدل على أنّ دوال تنفيذ الواجهة البرمجية هي عبارة عن غلاف حول الدوال الأخرى التي تكون عادةً مسبوقةً بشرطة سفلية أو اثنتين، إذ ستستدعي الدالة ()say_hello_fn دالةً أخرى ()say_hello_function_ على سبيل المثال، ولهذه عدة استخدامات، إذ نستخدمها عمومًا لنحظى بأجزاء أبسط وأصغر من الواجهة API -في تنظيم الوسائط arguments أو التحقق منها مثلًا- منفصلةً عن عملية التنفيذ الأعقد، ويسهّل هذا غالبًا المسار إلى تحقيق تغييرات ملموسة في العمليات الداخلية مع ضمان بقاء الواجهة ثابتة، إلا أنّ عملية التنفيذ هنا بسيطة جدًا ولا تحتاج حتى إلى دوال داعمة خاصة بها، كما يختلف مدلول بادئات الدالة التي تكون شرطة سفلية واحدة _ أو مزدوجة __ أو حتى ثلاثية ___ باختلاف المشاريع، لكنها عمومًا تُعَدّ تحذيرًا مرئيًا بأنه لا يُفترَض استدعاء الدالة مباشرةً من خارج الواجهة. ملاحظة: قد يُشار إلى دالة الشرطة السفلية المزدوجة __foo في المحادثات بالتابع السحري dunder foo وتكون فو foo مثل س أو ص في الجبر. نملأ مؤشرات الدالة في المرحلة ما قبل الأخيرة في struct greet_api greet_api، إذ يُعَدّ اسم الدالة مؤشرًا، لذا لا حاجة لأخذ عنوان الدالة مثل say_hello_fn&، وأخيرًا يمكننا استدعاء دوال واجهة API ضمن بنية main. ستلاحظ هذا المصطلح باستمرار عند تصفحك الشيفرة المصدرية source code،ـ ويمكن أن نوضح ذلك في هذا المثال البسيط الذي اجتزأناه من الملف include/linux/virtio.h في الشيفرة المصدرية لنواة نظام لينكس: /** * virtio_driver - operations for a virtio I/O driver * @driver: underlying device driver (populate name and owner). * @id_table: the ids serviced by this driver. * @feature_table: an array of feature numbers supported by this driver. * @feature_table_size: number of entries in the feature table array. * @probe: the function to call when a device is found. Returns 0 or -errno. * @remove: the function to call when a device is removed. * @config_changed: optional function to call when the device configuration * changes; may be called in interrupt context. */ struct virtio_driver { struct device_driver driver; const struct virtio_device_id *id_table; const unsigned int *feature_table; unsigned int feature_table_size; int (*probe)(struct virtio_device *dev); void (*scan)(struct virtio_device *dev); void (*remove)(struct virtio_device *dev); void (*config_changed)(struct virtio_device *dev); #ifdef CONFIG_PM int (*freeze)(struct virtio_device *dev); int (*restore)(struct virtio_device *dev); #endif }; كل المطلوب هو أن نفهم فهمًا سطحيًا أنّ هذه البنية هي وصف لجهاز الإدخال والإخراج I/O الافتراضي، ونلاحظ أن المتوقَّع من مستخدِم واجهة API هذه -أي كاتب تعريف الجهاز device driver- هو تقديم عدد من الدوال التي ستُستدعَى في شروط مختلفة أثناء تشغيل النظام، أي عند تقصّي عتاد جديد hardware أو عند إزالة عتاد ما، …إلخ على سبيل المثال، كما يحتوي على مجموعة بيانات، وهي البُنى التي يجب تعبئتها بالبيانات المرتبطة بها، كما يُعَدّ البدء بعناصر توصيف مثل هذه أسهل طريقة لبدء فهم الطبقات المختلفة لشيفرة النواة البرمجية. المكتبات تؤدي المكتبات دورَين يوضحان التجريد، هما: تتيح للمبرمجين إعادة استخدام الشيفرة البرمجية المتاح الوصول إليها عمومًا. تؤدي دور الصندوق الأسود في تنفيذ الخصائص الوظيفية عن المبرمج. تختص المكتبة التي تنفذ الوصول إلى البيانات غير المعالَجة في الملفات على سبيل المثال بلاحقة JPEG بميزة تتيح للعديد من البرامج التي ترغب في الوصول إلى ملفات الصور استخدام المكتبة نفسها، كما لا يضطر المبرمجون الذين يبرمجون هذه البرامج إلى الانشغال بالتفاصيل الدقيقة لصيغة الملف JPEG، وإنما يركزون جهودهم على دور الصورة أو موضعها في البرنامج. يشار إلى المكتبة القياسية في منصة يونكس باسم libc عمومًا، ومهمتها توفير الواجهة الأساسية للنظام، والاستدعاءات الأساسية مثل ()read و ()write و ()printf، كما توصَف واجهة API هذه بمجملها بتوصيف يسمى بوزيكس POSIX، وهي متاحة مجانًا على الإنترنت وتصف العديد من الاستدعاءات التي تؤلف واجهة API القياسية في نظام يونكس. تتبع معظم منصات يونكس عمومًا معايير بوزيكس، مع وجود بعض الفروقات الطفيفة التي تكون مهمةً أحيانًا (وهذا ما يفسر تعقيد أنظمة بناء غنو Gnu autotools المختلفة، التي تحاول دومًا إخفاء هذه الفروقات عنك). يحتوي نظام لينوكس على العديد من الواجهات التي لا تتبع معايير بوزيكس، لذا فإن بناء تطبيقات تستخدم هذه الواجهات دون غيرها لن يجعل تطبيقك محمولًا portable بما يكفي. تُعّدّ المكتبات تجريدًا أساسيًا يضم الكثير من التفاصيل، وسنتناول في فصول لاحقة آلية عمل المكتبات بالتفصيل. ترجمة -وبتصرّف- للقسم Everything is a file! والقسم Implementing abstraction من الفصل Chapter 1. General Unix and Advanced C من كتاب Computer Science from the Bottom Up. اقرأ أيضًا المقال التالي: مفهوم واصفات الملفات File Descriptors وارتباطها بعملية التجريد في أنظمة التشغيل التجريد (Abstraction) والواجهات (Interfaces) والسمات (Traits) في PHP نمط التصميم معمل التجريد Abstract Factory النسخة العربية الكاملة لكتاب: أنظمة التشغيل للمبرمجين1 نقطة
-
الأعداد العادية يمكنها تمثيل الأعداد الصحيحة فقط مثل 1 أو 5 أو 7، بينما الأعداد Double Precision هي التي يمكنها تمثيل الأعداد الكسرية عن طريق الأجزاء العشرية بعد الفاصلة، في جافاسكريبت الأعداد كلها هي من النوع Number وهو من نوع Double Precision أي يمكنك وضع فواصل عشرية بدقة تصل إلى 64 بت فيها مثال : const x = 1.2; const x = 1.65656; const x = 1.1222; const x = 1.00000001; يجب الانتباه إلى عد م الاعتماد على هذه الميزة في حال كان التطبيق مطلوب منه حسابات دقيقة فالدقة العشرية في جافا سكريبت ليست دقيقة مثال: console.log(1.1 + 0.1) // 1.20000000000000021 نقطة