اذهب إلى المحتوى

لوحة المتصدرين

  1. Hanan Fahad2

    Hanan Fahad2

    الأعضاء


    • نقاط

      2

    • المساهمات

      493


  2. Sam Ahw

    Sam Ahw

    الأعضاء


    • نقاط

      2

    • المساهمات

      1388


  3. أحمد حبنكة

    أحمد حبنكة

    الأعضاء


    • نقاط

      1

    • المساهمات

      338


  4. Mohamed Mousa3

    Mohamed Mousa3

    الأعضاء


    • نقاط

      1

    • المساهمات

      16


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 01/21/21 في كل الموقع

  1. هذا هو الدرس الأول من درسين يشرحان لك كيف تطوِّر مواقع الويب ذات الاتجاه من اليمين إلى اليسار (RTL)، وهذا يعني جعل موقع الويب متوافقًا مع اللغات التي تُكتَب من اليمين إلى اليسار مثل العربية والفارسية والأردو. ماذا يعني اتجاه الكتابة من اليمين إلى اليسار؟ لتوضيح الأمور، هنالك فرقٌ بين اللغة (التي هي الشكل المحكي) والمخطوطة (script، أي طريقة الكتابة). أي تقنيًا، الاتجاه من اليمين إلى اليسار يكون للمخطوطات التي تُكتَب بها اللغات، وذلك مقارنةً مع الاتجاه من اليسار إلى اليمين في لغاتٍ مثل الإنكليزية أو الفرنسية. مصطلح «اليمين-إلى-اليسار» (Right-to-Left) أو RTL اختصارًا، يُشير إلى أكثر من مجرد المخطوطة المستعملة للكتابة؛ حيث يُشير إلى جميع الأمور المتعلقة بتطوير مواقع وتطبيقات الويب لكي تظهر بشكل سليم عند استخدام اللغة العربية أو غيرها من اللغات التي تُكتَب من اليمين إلى اليسار. قبل المتابعة، لنوضِّح بعض الالتباسات حول RTL. أولًا، RTL لا تعني ترجمة النص إلى العربية: فالأمر أكثر من مجرد ترجمة واجهة موقعك إلى العربية، وإنما جعل كل جزء من الواجهة الرسومية ملائمًا لاتجاه RTL؛ وأنصحك أن تفعل ذلك بشكلٍ صحيح، فعدم إكمالك لدعم اتجاه RTL سيفقدك زوارك ومصداقيتك. ثانيًا، اتجاه RTL لا يعني «قلب كل شيء»: لستُ متأكدًا إن أُصلِحتَ هذه العلة أم لا، لكن ضبط «المحلية» (locale) إلى العربية في واجهة Gnome سيؤدي إلى إظهار الوقت بالشكل «PM 33:12» بدلًا من «‏12:33‎ PM‏‏». هذا ليس صحيحًا، نحن لا نذكر الوقت بالمقلوب بالعربية. أي أنَّ هنالك استثناءات وأشياء يجب الانتباه إليها مثل الأرقام، وسنشرح ذلك لاحقًا. لماذا عليك أن تهتم بدعم موقعك لاتجاه RTL؟ ربما تطور مواقع عالمية بلغاتٍ مثل الإنكليزية أو الفرنسية، وأنت متخوفٌ من RTL وتحسبها صعبةً ومرعبةً وستُضيف كمًا كبيرًا من العمل على مشروعك. حسنًا، الأمر ليس كما تظن، فبعد أن تستوعب المبادئ الأساسية، فلن تحتاج إلا لبذل جهدٍ قليلٍ. من البدهي أن تهتم –كمطور ويب عربي– بدعم الموقع التي تطوره للغة العربية (أو لبقية اللغات التي تُكتَب من اليمين إلى اليسار)؛ فلا حاجة لتذكيرك أنَّ هنالك أكثر من 410 مليون شخص حول العالم يتحدث لغةً تُكتَب من اليمين إلى اليسار (وهذا عددٌ ضخمٌ جدًا. لاحظ أنَّ الرقم التقديري السابق مبنيٌ على قائمة اللغات في ويكيبيديا). أصبحت أغلبية الشركات تُضيف دعمًا للغات المكتوب من اليمين إلى اليسار في برمجياتها (مثل ويندوز، و iOS، وأندرويد) وكذلك الأمر للعديد من المواقع العالمية؛ لذا سيتوقع زوار موقعك مِمَن يتحدثون العربية (وغيرها من اللغات المكتوبة من اليمين إلى اليسار) أن يحقق موقعك هذه التوقعات بما يخص دعم RTL. فبدون هذا الدعم قد لا يتحول زوار موقعك إلى زوارٍ دائمين. دورة تطوير واجهات المستخدم ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة اشترك الآن نصائح عامة لدعم اتجاه RTL هذه بعض القواعد العامة التي أحببت أن أذكرك بها والتي عليك أن تبقيها ببالك عند تطوير تطبيقات ومواقع ويب تدعم RTL: ابدأ من اليمين: تُفتح الكتب من الطرف الأيمن في البلدان التي تتحدث بلغاتٍ مكتوبةٍ من اليمين إلى اليسار، ولهذا يجب أن تُقلَب أغلبية عناصر الواجهة المتعلقة بمقروئية النص. الأزرار العتادية لها نفس الترتيب في البلدان المتحدثة بالعربية: أماكن أزرار التحكم بالأجهزة الصوتية هو نفسه في البلدان التي تتحدث لغاتٍ تكُتَب من اليمين إلى اليسار. لذا لن تتغير أماكن أزرار «التشغيل» و«التمرير» و«الإيقاف المؤقت» و«الإيقاف». ولهذا فلا يُنصَح أن يُقلَب اتجاه أيٌ من تلك الأزرار. مثالٌ آخر هو أزرار الهواتف، فقبل ظهور الهواتف الذكية كانت هنالك الهواتف الأرضية التي ما تزال شائعةً جدًا في البلدان العربية. ولهذا السبب يكون من المستحسن ألّا نعكس مفاتيح الأرقام. لا تظن أنَّ مستخدمي RTL هم أشخاصٌ يستعملون أياديهم اليسرى. فأغلبية مَن يتحدث بالعربية يكتبها بيده اليمنى، كما هو الحال في بقية أنحاء العالم. لذا لا تقلب أيّ شيءٍ ليس متعلقًا بكيفية قراءة المستخدم لمحتوى الصفحة. مثالٌ على هذا هو شريط التمرير «أ-ي A-Z» (الموجود على يمين الصورة السابقة) في تطبيق «جهات الاتصال» في أغلبية الهواتف الذكية. هذا الشريط موضوعٌ على الجهة اليمنى لأنه من الأسهل استخدامه باليد اليمنى، لذا لا حاجة إلى قلب اتجاهه وجعله في الجزء الأيسر في نمط RTL. كيفية جعل المحتوى RTL أول خطوة نحو جعل اتجاه صفحة الويب من اليمين إلى اليسار هي إضافة dir="rtl"‎ إلى وسم <html>: <html dir="rtl"> الخاصية dir هي اختصارٌ لكلمة «direction»، وضبط قيمتها إلى rtl تجعل نقطة البداية الأفقية لعناصر صفحة الويب من اليمين بدلًا من اليسار. لكي تضع نمط CSS لعنصرٍ معيّن إذا كانت الصفحة RTL فقط: أنشِئ نسخةً من أيّة أنماط CSS اعتيادية التي ستُطبَّق على العنصر الهدف. أضف المُحدِّد html[dir="rtl"] قبل سلسلة المُحدِدات (selector chain). كلما وجدت خاصيةً أو قيمة تُمثِّل التموضع الأفقي للعنصر، فاستعمل القاعدة المُعاكسة لها. على سبيل المثال، إذا وجدتَ float: left فبدِّلها إلى float: right. كمثالٍ عمليٍ على كلامنا السابق، إذا كان أحد أنماط CSS كالآتي: .someClass { text-align: left; padding: 0 10px 0 0; text-decoration: underline; } فسنأخذ نسخةً منه ونحدِّثها كالآتي: html[dir="rtl"] .someClass { text-align: right; padding: 0 0 0 10px; } لاحظ أننا حذفنا القاعدة text-decoration: underline;‎، فلسنا بحاجة إلى إعادة تعريف هذه القيمة لنسخة RTL لأنها لا تؤثر على اتجاه أي عنصر. وبالتالي ستُطبَّق القاعدة الأصلية. هذا مثالٌ أكثر تفصيلًا. يمكنك أن تجربه مباشرةً على متصفحك. شيفرة HTML: <html dir="ltr"> <body> <input type="button" id="directionSwitch" value="Switch LTR/RTL"/> <hr/> <div class="boxOne"></div> <div class="boxTwo"></div> </body> </html> شيفرة CSS: .boxOne { width: 170px; height: 170px; background-color: #0072C6; margin: 0 0 0 20px; } .boxTwo { width: 120px; height: 120px; background-color: #C3191E; margin: 0 0 0 70px; } html[dir="rtl"] .boxOne { margin: 0 20px 0 0; } html[dir="rtl"] .boxTwo { margin: 0 70px 0 0; } شيفرة JavaScript: document.getElementById('directionSwitch').addEventListener('click', function() { var docDirection = document.documentElement.dir; var isRTL = (docDirection === 'rtl'); document.documentElement.dir = isRTL ? 'ltr' : 'rtl'; }); لن تكون الحالات العملية بهذه البساطة؛ فهنالك تطبيقاتٌ فيها عددٌ كبيرٌ جدًا من قواعد CSS ومن المحددات، ولديك عدِّة استراتيجيات يمكنك اتباعها. وهذه إحداها: انسخ القواعد واحذف ما ليس لازمًا: أولًا، انسخ محتوى صفحة الأنماط إلى ملفٍ آخر، وأضف html[dir="rtl"] إلى جميع القواعد، ثم احذف أيّة خاصيات لا تتعلق بالاتجاه الأفقي للعناصر. وسينتهي بك المطاف بملفٍ صغيرٍ هدفه هو التعامل مع اتجاه RTL فقط. اقلب الاتجاهات: عدِّل كل الخاصية التي تُشير إلى اليسار (left) في الملف الجديد إلى معاكسها: أي padding-left ستصبح padding-right، و float: right ستصبح float: left …إلخ. لاحظ أنَّه إذا كان عندك خاصية padding-left في الملف الأصلي ثم عدَّلتها إلى padding-right فستبقى الخاصية الأصلية padding-left مطبقةً. لذا عليك إضافة الخاصية padding-left: unset بالإضافة إلى خاصية padding-right، وإلا فسيُطبِّق المتصفح كلا القاعدتين: خاصية padding-left من ملف CSS الأصلي وخاصية padding-right من الملف المعدَّل لاتجاه RTL. والأمر مشابهٌ لبقية الخاصيات مثل margin-left|right و border-left|right … أعد لصق المحتويات في الملف الأصلي: بعد أن تنتهي من إكمال الخطوتين السابقتين، فالصق القواعد الجديدة في الملف الملف الأصلي بعد القواعد الأصلية. أفضِّل شخصيًا أن أضيف تعليقًا صغيرًا مثل /* **** RTL Content **** */ لكي أستطيع التفريق بسهولة بين الأنماط الأصلية والأنماط المُعدَّلة لاتجاه RTL. طريقة أفضل: فصل أنماط RTL و LTR عن بعضهما قد تواجه في بعض الأحيان حالاتٍ غريبة التي يحدث فيها تضاربٌ بين الأنماط. وهذا يتضمن وراثة قيم بعض الخاصيات من خاصياتٍ أخرى، مما يعني أنَّك في بعض الأحيان لا تعرف تمامًا ما هي القاعدة التي عليك تجاوزها. وربما أضفتَ margin-right إلى قواعد RTL لكنك لستَ متأكدًا ما هي القيمة التي عليك ضبطها إلى خاصية margin-left الأصلية. أرى أنَّه من المستحسن أن تتبع منهجية أخرى، والتي هي أفضل في الحالات العملية لكنها أطول بعض الشّيء. سنفصل الخاصيات التابعة لكل اتجاه (RTL و LTR) عن بعضها بعضًا تمامًا. هذا مثالٌ عنها: لنقل أنَّنا لدينا قاعدة تتضمن ‎.wrapper .boxContainer .fancyBox كالآتية: .wrapper .boxContainer .fancyBox { text-align: left; padding-left: 10px; text-decoration: underline; color: #4A8CF7; } بدلًا من إضافة خاصيات أخرى لاتجاه RTL فيها padding-left و padding-right، فيمكنك أن تكتب: .wrapper .boxContainer .fancyBox { text-decoration: underline; color: #4A8CF7; } html[dir="ltr"] .wrapper .boxContainer .fancyBox { text-align: left; padding-left: 10px; } html[dir="rtl"] .wrapper .boxContainer .fancyBox { text-align: right; padding-right: 10px; } هذا الحل يتضمن ثلاثة أجزاء: القاعدة (أو المُحدِّد) الأصلية وفيها خاصياتٌ ليست متعلقة بالاتجاه، لأنها مشتركة بين الاتجاهين RTL و LTR. محدد يُعالج الاتجاه من اليسار إلى اليمين –html[dir="ltr"]– لا يوجد فيه سوى خاصيات لها علاقة بالاتجاه والتي تتوافق قيمها مع التخطيط (layout) الذي لديك لاتجاه LTR. مُحدِّد يعالج الاتجاه من اليمين إلى اليسار –html[dir="rtl"]– بنفس خاصيات حالة LTR، لكن قيمها مضبوطة لكي تتوافق مع التخطيط الذي لديك لاتجاه RTL. لاحظ كيف أنَّ القاعدة الثانية تملك خاصية padding-left فقط، بينما القاعدة الثالثة تملك خاصية padding-right فقط. وهذا لأنَّ كل واحد منها خاصة بالاتجاه المُحدَّد في خاصية dir. هذه الطريقة جيدة وجميلة ويسهل التعامل معها، ولا تحتاج فيها إلى حذف قيم بعض الخاصيات (لاحظ أنَّ الكلمة المحجوزة unset غير مدعومة في جميع المتصفحات. لأكبر قدر من التوافقية، عليك أن تُعيد تعريف القيمة التي ترغب بها لأي خاصية تريد حذف قيمتها). كيفية ضبط اتجاه الصفحة باستخدام JavaScript؟ هذا سهلٌ جدًا، ويتطلب سطرًا وحيدًا فقط: document.documentElement.dir يمكنك طباعة هذه القيمة إلى console كما يلي: var direction = document.documentElement.dir; console.log(direction); أو تستطيع تجربة المثال الحي. استعمل السطر الآتي لضبط اتجاه الصفحة: document.documentElement.dir = "rtl" هذا مثالٌ متكاملٌ حول الحصول على قيمة اتجاه الصفحة وضبطها: شيفرة HTML: <html dir="ltr"> <body> <input type="button" value="Set document direction to RTL" id="setDirection"/> <div id="directionStatus"></div> </body> </html> شيفرة JavaScript: function getDirection() { var direction = document.documentElement.dir; document.getElementById('directionStatus').textContent = 'This document\'s direction is: ' + direction; } var dirButton = document.getElementById('setDirection'); dirButton.addEventListener('click', function(evt) { var isRTL = (document.documentElement.dir === 'rtl'); document.documentElement.dir = isRTL ? 'ltr' : 'rtl'; dirButton.value = isRTL ? 'Set document direction to RTL' : 'Set document direction to LTR'; getDirection(); }); حلول مؤتمتة تحدثنا بما فيه الكفاية عن الطرق اليدوية لقلب الاتجاه إلى RTL. لننظر الآن إلى بعض الحلول المؤتمتة. css-flip طوَّرت تويتر حلًا لأتمتة كامل العملية وجعل قلب الاتجاه إلى RTL أسهل للمشاريع الكبيرة. هذا المشروع مفتوح المصدر ويمكنك أن تجده على Github. إضافة NPM هذه تغطي جميع الحالات التي قد تواجهها عندما تعمل على قلب الاتجاه إلى RTL، بما في ذلك الحالات الغريبة. بعض ميزاتها: no-flip: لإخبار مُحرِّك القلب أنَّك لا تريد أن تُقلَب هذه الخاصية وذلك بإضافة /* @noflip*/ في بداية الخاصية. على سبيل المثال، إذا كتبتَ ‎/* @noflip*/ float: left فستبقى الخاصية float: left عند تشغيل css-flip. replace: عندما تكون لديك صور خلفية تختلف بين RTL و LTR، فيمكنك أن تُحدِّد صورةً بديلةً بتضمين ‎/*@replace: url(my/image/path) */‎ قبل الخاصية الأصلية. فلنقل أنَّ لديك الخاصية background-image: url(arrow-left.png) وإذا حدثت السطر إلى ‎/*@replace: url(arrow-rightish.png) */ background-image: url(arrow-left.png);‎ فستصبح الخاصية النهائية في اتجاه RTL كالآتية: background-image: url(arrow-rightish.png);‎. يمكنك استعمال css-flip عبر سطر الأوامر بتنفيذ css-flip path/to/file.css > path/to/file.rtl.css أو عبر تضمين css-flip في صفحتك. للمزيد من المعلومات راجع مستودع github. يجدر بالذكر أنَّ css-flip يُستعمَل في برمجيات تويتر. rtlcss أداةٌ أخرى لأتمتة العملية برمجها «محمد يونس» تدعى rtlcss التي تتوفر على github وتوفر ميزاتٍ رائعة. يمكنك باستخدام هذه الأداة أن: تعيد تسمية القواعد (مثلًا، إعادة تسمية ‎#boxLeft إلى ‎#boxRightSide). تتجاهل بعض القواعد من عملية القلب. تتجاهل خاصياتٍ معينة. تضيف قيمًا جديدة. تضيف قيم خاصيات جديدة بين قيم الخاصيات الأخرى. يمكنك استخدام هذه الأداة عبر سطر الأوامر؛ ويمكنك إنشاء ملف أنماط RTL بتنفيذ الأمر الآتي في نفس المجلد الذي يتوفر فيه ملف CSS الأصلي: rtlcss input.css output.rtl.css أو يمكنك أن تضمنه في صفحتك. للمزيد من المعلومات راجع صفحة المشروع على github. هذا المشروع مشهور جدًا ويستعمل من عدِّة مشاريع بما فيها ووردبريس. خاتمة ما يزال هنالك الكثير لنغطيه، لكن هذه المقالة أمدتك بالمعلومات اللازمة لبدء مشوارك مع RTL. سنشرح في المقالة القادمة مواضيع متقدمة عن RTL. إذا كانت لديك أيّة أسئلة حول RTL، فاطرحها في التعليقات. ترجمة -وبتصرّف- للمقال Building RTL-Aware Web Apps & Websites: Part 1 لصاحبه أحمد نفزاوي
    1 نقطة
  2. حذفتٌ ملفات تهمني عن طريق الخطأ من هاتفي الذكي، والآن أرغب باستعادتها فهل هناك طريقة تمكنني من ذلك، علمًا أن نظام تشغيل الموبايل أندرويد؟ شكرًا
    1 نقطة
  3. سيشرح هذا الفصل بعض الاستخدامات الأساسية للتشفير وكيف يمكنه المساهمة بحماية بياناتك التي تريد نقلها عبر الشبكة إلى أماكن أخرى. هناك مواضيع متفرقة عن التشفير في مختلف أجزاء هذه السلسلة لطبيعة كون التشفير تقنيةً مستخدمة في الكثير من تقنيات علوم الحاسوب، لكننا سنشرح هنا بعض الأساليب التي تعتمد على التشفير بصورة أساسية. مفاتيح التشفير هناك الكثير من العلوم الفرعية المنضوية تحت مبدأ التشفير، لكننا نريد الحديث الآن عمّا يعرف بالمفاتيح (Keys). هناك حاجة ملحّة للكثير من الناس لتشفير الرسائل والملفّات المتبادلة بينهم مثلًا، لكنهم بحاجة إلى طريقةً تسمح للمُرسِل أن يُرسل البيانات المشفّرة إلى المتلقّي ويتمكّن المتلقّي وحده فقط من إلغاء تشفيرها للوصول إلى البيانات الحقيقية. وهذه مشكلة على الإنترنت لأنّ البيانات تمرّ عبر مزوّد خدمة الإنترنت (ISP) وقد ترفعها مثلًا على خدمات شركات مثل جوجل وواتساب وفيس بوك وغيرها، وبالتالي قد تطّلع عليها أكثر من جهة، ولهذا لا نريد مثلًا إرسال كلمة مرور كلّ مرّة مع الملفّ المشفّر للمتلقّي لأنّ هذا يعني أنّ كل الأطراف المتمكنة من الشبكة سيكون لها وصولٌ كذلك إلى محتويات الملفّ (فهي لديها وصول إلى كلمة المرور كذلك). نشأت بسبب هذه الحاجة ما تعرف بمفاتيح التشفير الشخصية، وهما زوجان من المفاتيح المرتبطة ببعضها، واحدٌ منهما يسمّى المفتاح العام (Public Key) والثاني هو المفتاح الخاصّ (Private Key) وهما مرتبطان ببعضهما البعض دونًا عن غيرهما من المفاتيح. يمكن للمرء أن يمتلك العديد من المفاتيح إن أراد. بفضل علم التعمية (Cryptography) ومبادئ التشفير القائمة على رياضياتٍ دقيقة فإنّه يمكن لأيّ شخص أن يقوم بتشفير رسالة إلكترونية مثلًا وفق المفتاح العام لشخصٍ معيّن، لكن لا يمكن سوى للشخص الذي يمتلك المفتاح الخاصّ المرتبط بذاك المفتاح العام أن يقوم بإلغاء تشفير تلك الرسالة. وبالتالي إذا أراد أحدهم مراسلتك مثلًا برسالة بريدية مشفّرة، فكل ما عليه فعله هو البحث عن مفتاحك العام على الشبكة (حيث أنّه منشور للكل على عكس المفتاح الخاصّ) واستخدامه لتشفير الرسالة ثمّ إرسالها إليك، ببساطة. وستتمكن أنت فقط من إلغاء تشفير الرسالة عبر مفتاحك الخاصّ الشخصي بك والمرتبط بالمفتاح العام الذي شُفّرت الرسالة به. وللمزيد من الحماية، فإنّ مفتاحك الخاصّ محمي بكلمة مرور تحددها أنت وبالتالي لا يمكن حتّى مع امتلاك المفتاح الخاصّ من طرف الآخرين أن يستخدموه ضدّك ليكسروا تشفير ملفّاتك ورسائلك (ولكن بالطبع هذا لا يعني أنّه يمكنك مشاركة المفتاح الخاصّ مع الناس لأنّه هناك طرق لكسر كلمات المرور مثل القوّة الغاشمة Bruteforce التي شرحناها مسبقًا وغيرها). ومن المهم أن تحتفظ بكلمة المرور هذه وتتذكّرها طوال الوقت، كما من المهم أن تكون كلمة مرورٍ قوية كما سنشرح في فصل "كلمات المرور" في هذه السلسلة. وهذا لأنّك ستحتاج كلمة المرور في كلّ مرّة تريد فيها استخدام المفاتيح. إن فقدت كلمة المرور فحينها ستفقد كلّ بياناتك المشفّرة ولن تتمكن من استرجاعها. والآن لن تتمكن أيّ جهة بما فيها مزوّد خدمة الإنترنت أو الشركة الموفّرة للمنصّة الإلكترونية ولا أي طرف آخر سواك أنت (والمُرسِل بالطبع) من معرفة محتوى الرسائل والملفّات عبر هذه الطريقة، لأنّك أنت فقط من يمتلك المفتاح الخاصّ (تذكّر أنّ المفتاح الخاصّ لا يُشارك مع أي شخصٍ آخر بتاتًا ولا حتّى المُرسِل). تُستخدم مفاتيح التشفير في الكثير من الأنظمة المختلفة في علوم الحاسوب وهي من أبرز الطُرق لحماية البيانات، وتستخدمها الكثير من البرامج لتشفير الملفّات أو الرسائل الإلكترونية أو البيانات الأخرى بصورة عامّة. وتُستخدم هذه المفاتيح الشخصية لأكثر من التشفير، فيُمكن استخدامها من أجل ما يسمّى بالتوقيع الرقمي (Digital Signature)، وهو كما التوقيع الحقيقي للإنسان، ضمانٌ أنّ الملفّ أو الرسالة الإلكترونية هي من طرف ذاك الشخص بالفعل لكن دون تشفير الملفّ أو الرسالة. وهذا مهم لأنّه في الكثير من الأحيان قد يحتاج الناس لطريقةٍ لضمان موثوقية هذه الملفّات لكن لا يريدون تشفيرها. فيمكن أن تحاول بعض الجهات انتحال شخصية مستخدمٍ ما مثلًا ولن يكون لديك ضمانٌ من أنّ الملفّ الذي حمّلته هو من ذاك الشخص بالفعل وليس من طرفٍ مشبوه ينتحل شخصيته (مثل تحميل أحد توزيعات لينكس، قد يقوم أحد المخترقين باختراق موقع التوزيعة ووضع رابط تحميل لملفّ خبيث بدلًا من التوزيعة الأصلية ولن تتمكن من معرفة ذلك دون أن تتحقق من التوقيع الرقمي للملفّ، ومعظم المستخدمين لا يقومون بذلك للأسف). هناك بالطبع معايير مختلفة (Standards) لطريقة بناء هذه المفاتيح وتشفيرها ومشاركتها وتخزينها، أبرزها هو المبدأ المفتوح OpenPGP. وهنالك العديد من المكتبات البرمجية (Software Libraries) التي توفّر أدوات التشفير الحقيقية لتشفير البيانات والملفّات وفق تلك المعايير، أبرزها GnuPG وهي مكتبة حرّة ومجانية ومفتوحة المصدر ومن أكثر المكتبات استخدامًا على الإطلاق في مجال الأمان الرقمي. يُمكنك إنشاء مفاتيح التشفير الخاصّة بك (المفتاح العام والخاصّ) من داخل نظام التشغيل الحالي الذي تستعمله، ولهذا تختلف الطريقة بناءً على ذلك النظام. يمكنك إنشاء زوجيّ المفاتيح على نظام لينكس وmacOS عبر الأمر التالي: gpg --full-generate-key سيسألك برنامج gpg بضعة أسئلة مثل: نوع خوارزمية التشفير المُرادة، مثل RSA أو DSA وغيرها. الخيار الافتراضي هو "RSA and RSA" وكلّ ما عليك فعله هو الضغط على Enter للمتابعة. طول مفتاح التشفير المُراد. لا حاجة للتفكير الطويل هنا بل فقط اختر الإعدادات الافتراضية حاليًا (3072) واضغط Enter. مدّة صلاحية المفتاح. هل تريد أن تنفذ صلاحية هذا المفتاح بعد وقتٍ معيّن، وبالتالي كلّ شيءٍ شُفّر أو وُقّع عبره لن يكون قابلًا للتأكّد من صحّته أو إلغاء تشفيره بعد انتهاء الوقت المعيّن؟ إن كان الجواب لا، فحينها اضغط Enter (الخيار الافتراضي) لجعل المفتاح غير محدود الصلاحية. قد يطلب منك gpg تأكيدًا للخطوة السابقة. اكتب y (اختصارًا لـyes). سيسألك gpg كذلك عن اسمك وبريدك وتعليقٍ قصير حول المفتاح. سيعرض لك gpg معلومات المفتاح بصورتها النهائية. إن لم يكن لديك تغيير تريد إجراءه فحينها اكتب O (اختصارًا لـOkay). أخيرًا، سيُطلب منك إدخال كلمة مرورٍ لحماية مفاتيح التشفير. ستجد المفتاح العام والمفتاح الخاصّ في ملفّين منفصلين في المسار .gnupg داخل مجلّد المنزل الخاصّ بك. تذكّر أنّه يجب ألّا تشارك المفتاح الخاصّ مع أي شخصٍ بتاتًا، كما تذكّر أنّه عليك حفظه في مكانٍ آمن لا يصل إليه أحدٌ سواك، هو وكلمة المرور (يمكنك مثلًا وضعهم داخل فلاشة USB ورميها في مكانٍ آمن في منزلك). نستحسن ألّا تحاول العبث بالملفّات داخل مجلّد .gnupg بنفسك، لكن يمكنك تصدير المفاتيح وإدارتها واستيرادها عبر الأمر gpg نفسه من سطر الأوامر. ويمكنك البحث عنه على الإنترنت للمزيد من المعلومات أو رؤية التوثيق الكامل له عبر: gpg --help أمّا بالنسبة لأنظمة ويندوز، فالعملية سهلة بفضل برنامج Gpg4Win، وهو برنامجٌ مفتوح المصدر ومجاني. كلّ ما عليك فعله هو تحميل البرنامج وتثبيته. تأكّد من تفعيلك للخيارات التالية أثناء تثبيته: ستجد برنامجًا اسمه Kelopatra على نظامك بعد التثبيت، وهو الواجهة الرسومية لمكتبة GnuPG على أنظمة ويندوز. اضغط على "New Key Pair" كما في الصورة لإنشاء زوجيّ مفاتيح جديدة: ثمّ أدخل اسمك وبريدك الإلكتروني: واضغط كذلك على "Advanced Settings". ستصل بعدها إلى النافذة التالية، أزل علامة الصحّ من جانب "Valid until" لكي تجعل المفتاح بلا تاريخ صلاحية محدد (لا ينتهي): وأخيرًا، أدخل كلمة المرور التي تريدها: وهذه هي العملية ببساطة! يمكنك الآن تصدير المفاتيح أو حفظها أو عمل ما تشاء بها. يُمكنك استخدام المفتاحين لاستقبال وإرسال البيانات المشفّرة بمجرّد أن تنشئهما مع مختلف البرامج والأدوات. يمكنك إنشاء عدة مفاتيح كذلك بناءً على كلّ نوع من الاستخدامات التي تريدها (مثلًا واحد للرسائل الإلكترونية والآخر للملفّات المشفّرة… إلخ). تبادل رسائل البريد الإلكتروني المشفرة والموقعة تدعم معظم خدمات البريد الإلكتروني تشفير الرسائل البريدية بين المستخدمين. لكن لتبادل الرسائل الإلكترونية بينك وبين مستخدمٍ آخر فعليكما أنتما الاثنان أن تمتلكا المفاتيح العامّة (Public Keys) الخاصّة بالآخر، وهذا لتشفير الرسائل بصيغةٍ تمكّن الطرف الآخر وحده من فكّ تشفيرها. يمكنكما تبادل المفاتيح العامّة عبر أي وسيلة اتصال أو حتّى نشرها على الإنترنت بأريحية. تختلف طريقة إعدادها بناءً على الخدمة التي تستعملها، لكن بصورة عامّة، عليك تثبيت ما يُعرف ببرنامج بريد الإلكتروني المحلّي (Email Client) على جهازك، ثمّ ربطه بخدمة البريد الإلكتروني التي تستعملها، ثمّ تفعيل ميّزة تشفير الرسائل وإضافة مفاتيحك العامّة والخاصّة إلى البرنامج ليستخدمها. وبما أنّه هناك العشرات من خدمات البريد الإلكتروني المختلفة بالإضافة إلى العشرات من البرامج المحلّية لإدارة البريد الإلكتروني وعلى مختلف أنظمة التشغيل، فإننا لن نشرح العملية بالتفصيل في هذه السلسلة ونترك المُستخدم ليختار خدمته وبرنامجه اللذين يناسبانه. لكننا نُشير إلى بضعة أمور: حتّى مع استخدام التشفير فإنّه ما يزال بإمكان مزوّد خدمة البريد الإلكتروني، و(ربّما) مزوّد خدمة الإنترنت بالإضافة إلى أطرافٍ ثالثة (3rd-party) أن تعرف عنوان الرسائل الإلكترونية، بالإضافة إلى العنوان المُرسِل والعنوان المُستقبِل. أي أنّ التشفير لا يشمل هذه الحقول الثلاثة، ولذلك لا تضع شيئًا مهمًا فيها واعلم أنّ الغير قد يطّلعون عليها. لا تستخدم معظم - إن لم يكن كلّ - برامج إدارة البريد الإلكتروني المحلّية التشفير بصورة افتراضية؛ أيّ أنّ إضافة المفاتيح واستيرادها إلى البرنامج لا يكفي. عليك التأكّد بالضبط أنّ الرسالة الحالية التي تريد إرسالها ستكون مشفّرة. قد يكون في بعض البرامج خياراتٌ لتشفير كلّ الرسائل افتراضيًا، لكن عليك التحقق من ذلك بنفسك. وبالطبع، عليك إضافة المفاتيح العامّة للشخص الذي تُريد مُراسلته قبل التمكّن من إرسال رسالة بريدية مشفّرة إليه (سيقوم هو بتصديرها لك ثمّ تقوم أنت باستيرادها من داخل البرنامج أو النظام، وكذا بالنسبة لك). يُمكنك توقيع الرسالة رقميًا (Digital Signing) بنفسك وعبر مفتاحك الخاصّ دون الحاجة لشيءٍ من أحد، لكن من أجل التشفير فعليك امتلاك المفتاح العامّ للطرف الآخر وعليه أن يمتلك هو كذلك مفتاحك العام. هل يجب عليك تشفير كلّ الرسائل أم فقط الحساسة والمهمّة منها؟ يعتمد هذا على مدى درجة عامل الخطورة (Threat Factor) الذي أنت محاطٌ به، وإلى أيّ مدىٍ تريد تأمين نفسك وضدّ من. بخصوص رسائل البريد الإلكتروني الموقّعة فالمفترض أنّ البرنامج الذي تستعمله سيعرض لك في "ترويسة الرسالة" (Message Headers) ما إذا كانت موقّعة بصورة صحيحة وموثوقة من الطرف الآخر الذي استقبلتَ الرسالة منه أم لا. تبادل الملفّات المشفّرة يُمكنك تشفير الملفّات وتبادلها مع الآخرين باستخدام المفاتيح العامّة والخاصّة تمامًا كما الرسائل البريدية الإلكترونية. إن كنت تخطط لمشاركة الملفّ مع شخصٍ معيّن فقط فحينها ستحتاج كذلك إلى مفتاحه العام، وستستخدم مفتاحه العام لتشفير الملفّ ثمّ يمكنك إرساله إليه عبر أي وسيط، وسيقوم هو باستخدام مفتاحه الخاصّ لإلغاء تشفير الملفّ. وهو سيكرر نفس العملية بالنسبة إليك؛ سيأخذ مفتاحك العام ويستخدمه لتشفير الملفّ، ثمّ يُرسله لك عبر أي وسيط. وستستخدم أنت مفتاحك الخاصّ لإلغاء تشفير الملفّ وقراءة محتوياته. يمكنك القيام بالعملية السابقة على أنظمة لينكس وmacOS عبر الأمر gpg. طبّق الأمر التالي أوّلًا لتصدير مفتاحك العامّ (ولا تنس استبدال بريدك الإلكتروني): gpg --armor --export your@email.com > mypublickey.asc ويمكنك الآن إرسال ملفّ mypublickey.asc إلى الشخص الآخر عبر أيّ وسيط ليستعمله هو في تشفير الملفّات والرسائل التي يريد إرسالها إليك. إذا كنتَ تريد أنت أن تُرسل إليه ملفًّا مشفّرًا فعليك حينها استيراد مفتاحه العام عبر الأمر التالي (بعد أن تحصل على الملفّ منه): gpg --import otherpublickey.asc وبعدها، طبّق الأمر التالي لتشفير الملف المطلوب وفق المفتاح العام لذاك الشخص (لا تنسى استبدال البريد الإلكتروني هذه المرّة ببريده الإلكتروني هو): gpg --recipient otherparty@email.com --encrypt requested_filename.txt وهكذا صار الملفّ مشفّرًا ويُمكنك إرساله إليه (ستجده باسم requested_filename.txt.gpg في نفس المسار). ويمكنه هو إلغاء تشفير الملفّات عبر الأمر التالي ثمّ كتابة كلمة المرور الخاصّة بالمفتاح الخاصّ: gpg --decrypt requested_filename.txt.gpg > unencrypted.txt وستجد أنّ الملفّ قد فُكَّ تشفيره في نفس المسار وصار قابلًا للقراءة (لا تنسى استبدال لاحقة الملفّات باللاحقة المناسبة مثل .mp4 أو .png بناءً على نوع المحتوى، استخدمنا .txt كمجرّد مثال). يمكنك استخدام برنامج Gpg4Win السابق على أنظمة ويندوز للقيام بنفس العملية. فقط استورد المفتاح العام للشخص المُراد التعامل معه ثمّ اضغط على "Sign/Encrypt" وحدد الملفّ المطلوب تشفيره: ثمّ اختر اسم الشخص الذي تريد تشفير الملفّ وفق مفتاحه العام. يمكنك كذلك توقيع الملفّ رقميًا أو حمايته بكلمة مرور إضافية أن أردت ذلك: بعدها يمكنك إرسال الملفّ ومشاركته كيفما تشاء. تشفير خدمات التخزين السحابية إنّك غالبًا ما تستخدم خدمات المزامنة السحابية مثل Google Drive وDropbox وغيرها، لكن هل تعلم أنّه يمكنك كذلك تشفير كلّ ملفّاتك عليها؟ في النهاية هي مجرّد ملفّات، ويمكنك تطبيق نفس العملية السابقة عليها جميعها وبالتالي حمايتها من الآخرين حتّى لو وصلوا إليها بطريقةٍ ما. إننا نستحسن استخدام برنامج Cryptomator لهذه العملية. وهو برنامجٌ مجاني ومفتوح المصدر، ويدعم تشفير كامل الملفّات وحمايتها بكلمات المرور. إننا ندعم استخدام هذا البرنامج لأنّه قد تُحقِّقَ منه ومن أمانه عبر باحثين أمنيين مستقلين (Independent 3rd-party Security Audit) ويستخدم تشفير AES بمفاتيح بطول 256-بت بصورة افتراضية، وبالتالي هو آمن للاستخدام، هذا فوق كونه مجانيًا ومفتوح المصدر ويعمل على كلّ أنظمة تشغيل الحواسيب والهواتف الشهيرة (ويندوز وماك ولينكس وأندرويد وiOS)، كما أنّه يدعم معظم - إن لم يكن كلّ - خدمات التخزين السحابية. يقوم البرنامج بإنشاء "خزنة آمنة (Vault)" داخل مساحتك على خدمة المزامنة السحابية، وهذه الخزنة مشفّرة ومحمية بكلمة مرور (بما في ذلك اسمها!)، وكلّ ما عليك فعله هو تثبيت البرنامج ثمّ وضع ملفّاتك التي تريد حمايتها داخل تلك الخزنة، ببساطة. ختاما التشفير تقنية قوية جدًا لحماية البيانات والملفّات والرسائل، ومن المنصوح جدًا استخدامها في تبادل البيانات الحساسة بين مختلف الأطراف. لكن لا تنسى أنّه حتّى أقوى التقنيات مثل التشفير قد تكون قابلةً للكسر إمّا بسبب كلمات المرور الضعيفة أو بسبب البرمجيات المُستعملة في التشفير، وليس بالضرورة أن تكون خوارزمية أو تقنية التشفير نفسها بها خلل أو ثغرة أمنية. والتشفير واحدٌ من التقنيات التي تنتهي فاعليتها تمامًا عند وجود هكذا ثغرات في البرمجيات التي تولّده أو تستعمله، ولهذا إن كنت تستخدم التشفير في مكانٍ ما على جهازك فحينها عليك التأكّد من أنّ كل برمجياتك وأدواتك محدثّة إلى آخر إصدار، وأنّها لا تحوي أي ثغراتٍ أو مشاكل أمنية معروفة (يمكنك التحقق من ذلك من مواقع أخبار الأمان الرقمي، سنشير إليها في نهاية هذه السلسلة)، وإلّا فأنت تخاطر بكامل ملفّاتك وبياناتك ورسائلك جملةً واحدة. اقرأ أيضًا المقال التالي: كلمات المرور: كيفية حفظها واستعمالها في العالم الرقمي المقال السابق: النسخ الاحتياطي وحفظ البيانات في العالم الرقمي النسخة الكاملة من كتاب دليل الأمان الرقمي
    1 نقطة
  4. التصريح عن فضاء اسم يُصرَّح عن فضاء الاسم كالتالي: للتصريح عن فضاء الاسم MyProject نكتب الشيفرة التالية: namespace MyProject; للتصريح عن فضاء اسم متداخل نكتب: namespace MyProject\Security\Cryptography; للتصريح عن فضاء اسم مع أقواس مغلقة نكتب: namespace MyProject { ... } من الأفضل أن تصرّح عن فضاء اسم واحد في الملف بالرغم من أنّه يمكنك التصريح عن العدد الذي تريده من فضاءات الأسماء في ملف واحد: namespace First { // First في فضاء الاسم A تعريف الصنف class A { ... }; } namespace Second { // Second في فضاء الاسم B تعريف الصنف class B { ... }; } namespace { // في فضاء الاسم الجذر C تعريف الصنف class C { ... }; } عندما تصرّح عن فضاء اسم فإنّ كل الأصناف التي تعرّفها بعده تنتمي إليه: namespace MyProject\Shapes; class Rectangle { ... } class Square { ... } class Circle { ... } يمكن أن يستخدم التصريح عن فضاء اسم عدة مرات في ملفات مختلفة، يعرّف المثال السابق ثلاثة أصناف في فضاء الاسم MyProject\Shapes في ملف واحد لكن يُفضَّل أن يُقسم إلى ثلاث ملفات يبدأ كل منها بشيفرة فضاء الاسم MyProject\Shapes. الإشارة إلى صنف أو دالة في فضاء الاسم يمكننا التعريف عن صنف في فضاء الاسم كما وضحنا في الفقرة السابقة بالشكل التالي: namespace MyProject\Shapes; class Rectangle { ... } نحتاج للحصول على المسار الكامل (المتضمن فضاء الاسم) للإشارة إلى هذا الصنف: $rectangle = new MyProject\Shapes\Rectangle(); يمكن أن نختصر الشيفرة السابقة باستيراد الصنف باستخدام التعليمة use: // MyProject\Shapes\Rectangle كنية Rectangle تصبح use MyProject\Shapes\Rectangle; $rectangle = new Rectangle(); يمكنك بدءًا من الإصدار PHP 7.0 تجميع تعليمات use مختلفة في تعليمة واحدة مستخدمًا الأقواس: use MyProject\Shapes\{ // `use MyProject\Shapes\Rectangle` نفس تعليمة Rectangle, // `use MyProject\Shapes\Circle` نفس تعليمة Circle, // `use MyProject\Shapes\Triangle` نفس تعليمة Triangle, // التجميعية use يمكنك أيضًا استيراد فضاءات الأسماء الفرعية في تعليمة Polygon\FiveSides, Polygon\SixSides }; $rectangle = new Rectangle(); قد يكون لديك صنفين بنفس الاسم وهذه ليست مشكلة إذا كان كل منهما في فضاء اسم مختلف، لكن هذا قد يسبب مشكلة عند محاولة استيرادهما باستخدام تعليمة use: use MyProject\Shapes\Oval; use MyProject\Languages\Oval; // Error! يمكنك حل هذه المشكلة بتعريف كنية باستخدام الكلمة المفتاحية as بالشكل التالي: use MyProject\Shapes\Oval as OvalShape; use MyProject\Languages\Oval as OvalLanguage; يجب الهروب بالمحرف \ للإشارة إلى صنف خارج فضاء الاسم الحالي وإلا سيُفترَض فضاء الاسم النسبي من فضاء الاسم الحالي: namespace MyProject\Shapes; // (1) $a = new Rectangle(); // (2) $a = new \MyProject\Shapes\Rectangle(); // (3) $a = new MyProject\Shapes\Rectangle(); // (4) $a = new \StdClass(); // (5) $a = new StdClass(); في الموضع (1) أُشير إلى MyProject\Shapes\Rectangle بشكلٍ صحيح. في الموضع (2) أُشير إلى MyProject\Shapes\Rectangle بشكلٍ صحيح لكن لا يوجد ضرورة لذكر المسار الكامل. في الموضع (3) أُشير إلى MyProject\Shapes\MyProject\Shapes\Rectangle بشكلٍ خاطئ. في الموضع (4) تتطلب الإشارة إلى الصنف StdClass من ضمن فضاء الاسم استخدام البادئة \ لأنّ هذا الصنف غير معرّف في فضاء اسم أي أنّه عام وهذه الطريقة الصحيحة للإشارة إليه. في الموضع (5) أُشير إلى MyProject\Shapes\StdClass بشكلٍ خاطئ. التصريح عن فضاء اسم فرعي يمكننا التصريح عن فضاء اسم ضمن هرمية بالشكل التالي: namespace MyProject\Sub\Level; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } يُنشئ المثال السابق ما يلي: constant MyProject\Sub\Level\CONNECT_OK class MyProject\Sub\Level\Connection and function MyProject\Sub\Level\connect ما هي فضاءات الأسماء؟ يوجد في مجتمع PHP الكثير من المطورين يكتبون الكثير من الشيفرات فمن الممكن أن يوجد نفس اسم الصنف في مكتبتين مختلفتين وقد يسبب هذا مشكلة عند استخدامهما في فضاء اسم واحد، لذا فإن فضاءات الأسماء تحلّ هذه المشكلة. كما هو موضح في دليل PHP المرجعي يمكن موازنة فضاءات الأسماء بمجلدات نظام التشغيل، فإذا كان لدينا ملفين بنفس الاسم موجودين في مجلدين مختلفين يشبه ذلك صنفي PHP لهما نفس الاسم وموجودين في فضاءي اسمين مختلفين. من الضروري بالنسبة لك أن يُستخدم فضاء اسم شيفرتك من قِبل المطورين الآخرين دون الخوف من التصادم مع مكتبات أخرى. ترجمة -وبتصرف- للفصل [Namespaces] من كتاب PHP Notes for Professionals book اقرأ أيضًا المقال التالي: التخزين المؤقت للخرج في PHP المقال السابق: الجلسات وملفات تعريف الارتباط ومكتبة cURL في PHP
    1 نقطة
  5. هل استطيع ان اصمم موقع متجر لزبون و اضع ميزة عرض الطلبات في الموقع؟ و من اين اتعلم وضع هذه الميزة؟
    1 نقطة
  6. مرحباً عبد الواحد، هذه القيم تدعى بأنماط البيانات أو Data Types ومن الأنواع الأساسية لها: البيانات الرقمية (العددية) - Numeric Data Types: وهي تمثل الأعداد (الأرقام)، وكما تعلم فإن الأرقام نوعان إما رقم صحيح وإما رقم عشري (كسور)، ويتم تسمية البيانات كالتالي الأرقام الصحيحة: Integer - Long - Short - int الأرقام العشرية: Double - float - Single - Decimal البيانات الحرفية (النصية) - Character Data Type وهي عبارة عن الحروف (عربية أو إنجليزية أو غير ذلك من الحروف)، الأرقام (في حالة إستخدامها للكتابة وليس لإجراء عمليات حسابية)، الرموز (مثال: #$%&). ويطلق على أي مما سبق كلمة (رمز)، ويتم التعامل مع هذه البيانات بطريقتين حروف: وتمثل رمز واحد سواء كان ذلك الرمز يعبر عن حرف أو رقم أو أي رمز آخر، ولكن رمز واحد فقط ويسمى في هذه الحالة Character - char نصوص: وتمثل سلسلة من الرموز، أي مجموعة من الحروف أو الأرقام أو حروف وأرقام معا وهي مكونات الكلمة أو الجملة، وتسمى String البيانات الأخرى (المتنوعة) - Other Data Types ويطلق عليها أحيانا Miscellaneous Data Types، وتمثل أي بيانات لا تعتبر حرفية أو رقمية، فمثلا من أهم أنواع البيانات في البرمجة هي البيانات المنطقية والتي تعبر عن صحيح True أو خطأ False ويسمى هذا النوع من البيانات Boolean Data Type، ويمكن أيضا دمج مجموعة من البيانات معا لتكوين نوع بيانات جديد ويسمى ذلك النوع بـ غرض أو Object، حيث قد تختلف رموزها من لغة لأخرى ولكنها ستعبر عن نفس القيم. وبالإضافة لما سبق، يوجد في لغات البرمجة عالية المستوى High Level Languages وهي التي ستتعامل معها غالباً أنواع بيانات للتاريخ Date، وللوقت Time.وغيرها..
    1 نقطة
  7. اشكرك اخي الكريم لتوضيع شكرا لك لم يتعرف على db لم يتعرف على الاتصال في الملف الاول كيف اخلي الاتصال عام
    1 نقطة
  8. تمام هذا مااحتاجه لاكن في حال رغبت بفصل الطلبات في ملف router.post('/new', function(req, res) كيف يتعرف على الاتصال هل اضع الاتصال في كل الصفحات او ماهو السبيل لذلك
    1 نقطة
  9. سلام عليكم انا جديد في البرمجه ولقد سجلت جديد تحديدا في علوم الحاسوب ولا اعرف من اين ابدا
    1 نقطة
  10. مرحباً طاهر، في حال كنت تقصد: (الحساب 4 * 3 * 2 * 1) بدلاً من (الحساب 4 * 3 * 2 * 7)، أي لضرب العدد بجميع الأعداد السابقة له دون الصفر، فيمكن تنفيذ ذلك عن طريق وضع حلقة تكرارية كالتالي: n = int(input('Enter a number: ')) result = 1 for i in range(1, n): result *= i print(result)
    1 نقطة
  11. نفترض لدينا backend API فيه endpoints معينة GET,POST,PUT,DELETE وإلخ. اﻵن مطورو تطبيق الجوال الذين سيستخدمون هذا API طلبوا منك أنت مبرمج backend توثيق documentation بطريقة جذابة أي يريدون واجهة وب تظهر لهم كل API Endpoints ، ماذا تفعل كل Endpoint ، ما هي معاملاتها وما هو شكل الـresponse وإلخ وليس ذلك فقط. يريدون أيضاً من هذه الواجهة تجريب API واللعب به، كيف تقوم أنت بكل هذا ؟ من خلال كتابة ملف يسمى OpenAPI Specification يوصف API الخاص بك بطريقة معينة ومن ثم يمكنك توليد واجهة documentation من هذا الملف، هذا هو عمل swagger API ، إنه طريقة لبناء واجهة documentation جذابة. إن swagger API هي تقنية backend أما طريقة كتابة الملف فيمكنك التعرف عليها من الرابط التالي: https://swagger.io/docs/specification/about/ بعض backend frameworks تدعم swagger API بإحدى طريقتين: إما توليد routes من ملف openapi أو توليد ملف openapi من routes المعرفة والتي يضاف عليها annotation معينة. أنا أنصح ﻷي backend API أن يكون موثقاً بالـOpenAPI لما فيه من مرونة ولجمال واجهة documentation التي يولدها.
    1 نقطة
  12. السلام عليكم نعم ادعم استخدام اطار العمل vue وهو من اكثر اطر العمل تقدما و شهد اقبالاً كبيراً في الفترة الاخيرة خطوطا بعد صدور vue 3 يكمن في سهولتها الملحوظة مقارنة بالمنافسين ك Angular , React وغيرهم , اضافة الى ذلك اعتماد اطار عمل لارافل لها كاطار عمل مضمن اساساً ضمن أي مشروع لارافل جديد , وتتضح سهولتها عند التجربة , فان كنت تتقن HTML , CSS , Javscript فأنت قد أتقنت Vue.js تقريباً! كما أن الدعم المتوفر لها عبر الانترنت شاسع وكافي لحل اي مشكلة تواجهك , فأي مشكلة قد تواجهك من المؤكد أنها قد حلت على Github , Stackoverflow او نقرة من قبل. وأيضاً , يقول معظم محبي Vue.js ان الاضافات الموجودة فيها بشكل اساسي (تحصل عليها عند تفعيلها على موقعك) أفضل بكثير من غيرها , فبمجرد تضمين اطار العمل في مشروعك ستحصل على Vue-Router , Vuex مضمنين تلقائياً في نواة اطار العمل . غير مناسب في seo و ذلك عند استخدامه single-page application (SPA) و الحل لهذه المشكلة بسيط و هو استخدام Server-Side Rendering
    1 نقطة
  13. مرحبا، المتغيرات, المتغير، تستخدم لغات البرمجة اسم مستعار لمكان في الذاكرة ليسهل الوصول له و تخزين القيم و قراءتها. من الاسم نستنتج أنه خلال عمل البرنامج يقبل المتغير أن تتغير قيمته. مثلا: var a; a = 5; a = 10; a = a * 2 + 1; // a => 21 a = 1; a = 1 - a; // a => 0 المثال يتضمن تعريف متغير، ثم إسناد له عدة قيم، كل مرة شيئ مختلف. ونلاحظ بأن البرنامج يعمل بطريقة تسلسلة من الأعلى للأسفل و يقوم بتنفيذ العمليات الواحدة تلو الأخرى.. - في جزء التعبيرات الحسابية، يقوم الحاسوب بحساب الجزء الأيمن أولاً ثم يقوم بإسناد القيمة للجزء الأيسر (على طرفي إشارة المساواة =). - في جافا سكربت يمكن تعريف متحول بدون الكلمة المفتاحية var لكن استخدامها أوضح بالنسبة للبشر في فهم الكود (أي أن البرنامج السابق يعمل بدون أول سطر). الآن سنتكلم عن الدوال - function: هي جزء من الشيفرة البرمجية نريد تنفيذها عدة مرات في البرنامج، وهذا في طبيعة الحال سيجبرنا بنسخ الشيفرة البرمجية عدة مرات وهذا أسلوب غير عملي .. فقام مطورو لغات البرمجة بإيجاد طريقة لعزل و استخلاص الأجزاء المتكررة من البرنامج ووضعها في فيما يسمى دالة - والدلة هي مكون برمجي مثل المتغير - له اسم مميز ويمكننا تشبيهه بالعامل الذي نطلب منه تنفيذ مهمة محددة في كل مرة. يمكننا إعطاء هذا العامل تعليمات مختلفة في كل مرة يقوم بتنفيذ هذا العمل و سيعود لنا بالنتائج إن سارت الأمور على مايرام (لم يحدث خطأ في تنفيذ البرنامج) يتم تمرير التعليمات للدوال عن طريق مايسمى البارامترات - parameter أو الوسطاء. وهي عبارة عن متغيرات مؤقتة تقوم الدالة بتعريفها و استخدامهم حتى تنتهي من عملها ثم تتخلص منهم من الذاكرة. - هي نفس طريقة تعامل البرنامج الرئيسي مع باقِ المتحولات - حيث يتم تفريغ الذاكرة بعد انتهاء البرنامج بعد كل تنفيذ. مثال بسيط لتابع يقوم بالجميع - حيث يكفي ذكر اسمه مع الوسطاء ضمن البرنامج الرئيسي ليتم عملية حساب المجموع. // تابع يعيد ناتج مجموع متغيرين function add(p1, p2) { return p1 + p2; } var x = add(1,1); // x => 2 x = add(2,2); // x => 4 x = add(2,3); // x => 5 x = add(4,7); // x => 11 لاحظ أننا قمنا بتعريف الfunction لمرة واحدة ثم قمنا باستدعائه عدة مرات .. بدون تكرار جزء عملية الجمع. - لاحظ لا نقوم بتكرار عملية تعريف المتغير X و أنه في كل مرة يحمل قيمة مختلفة. - p1 تعبر عن الوسيط الأول الممرر للدالة و p2 الوسيط الثاني. مثال لعملية الطرح: // تابع يعيد ناتج طرح متغيرين function minus(p1, p2) { return p1 - p2; } var x = minus(1,1); // x => 0 x = minus(2,1); // x => 1 x = minus(2,3); // x => -1 x = minus(4,7); // x => -3 يمكننا عمل برامج تحوي function يقوم بعمليات طويلة و ضخمة بنفيس الفكرة و سترى أمثلة خلال دراستك. في حال وجود أي أسئلة تفضل بطرحها، كل التوفيق لك مراجع وشروحات : رابط1 المتغيرات - أكاديمية حسوب - رابط2 الدوال - أكاديمية حسوب - رابط3 - المتغيرات - موسوعة حسوب - رابط4 - الدوال - موسوعة حسوب - رابط5 - جافاسكربت - موسوعة حسوب
    1 نقطة
  14. مرحباً صديقي، إن المتغيرات بكل بساطة هي عبارة عن مكان لتخزين البيانات في ذاكرة الحاسوب أثناء القيام ببرمجة برنامج معين بغض النظر عن اللغة المستخدمة في البرمجة (نحن نتكلم هنا عن مفهوم البرمجة بشكل عام) أما التوابع فهي عمليات أو أفعال نقوم بها و نستخدمها في البرنامج لتحقيق غاية معينة، لنعيد ما سبق بلغة أبسط: أنت لديك حقيبة مدرسية لتخزين الكتب، يمكنك تشبيه الحقيبة بالمتغيرات، إذ يمكنك وضع البيانات المناسبة للمتغير ضمن هذا المتغير، فتقوم مثلاً بوضع الكتب في الحقيبة المدرسية (تقوم بتخزين الكتب في الحقيبة). ولكن لا يمكنك على سبيل المثال وضع أواني المطبخ في الحقيبة المدرسية، لأنها بكل بساطة ليست مخصصة لذلك، بل تقوم بوضع الاواني في مكانها المخصص ضمن المطبخ. نفس الوضع ينطبق على المتغيرات البرمجية في بعض اللغات. مثلاً (متغيرات خاصة لتخزين السلاسل المحرفية و النصوص و أخرى مخصصة لتخزين الارقام و أخرى لتخزين الكائنات). ربما يجب أن لا تقلق من هذا الأمر فهو ليس ضروريا جداً في لغة JavaScript . الأهم هو أن المتغيرات هي أماكن لتخزين المعلومات. نأتي للتوابع، التوابع قلنا هي الأفعال التي نقوم بالقيام بها سواءً كانت افعال بسيطة أم مركبة، فبالعودة للمثال السابق: وضع الكتب داخل الحقيبة هو فعل ( يمكن التعبير عنه بتابع) و إغلاقك للسحاب هو فعل أيضاً و حملك للحقيبة هو فعل و إفراغك لمحتويات الحقيبة هو فعل كذلك، و يمكن التعبير عن جميع الافعال السابقة بتوابع. سنقوم بتطبيق مثال برمجي: سنعرف متحولين لتخزين الرقمين 1 و 2، و سنسمي هذين المتحولين x و y كالتالي: var x = 1; var y = 2; لاحظ اننا قمنا الآن بتعريف المتغيرات، الآن سننتقل للتوابع، التوابع قلنا أنها أفعال، سنقوم بتعريف تابع لجمع أي رقمين و سنسميه sum: function sum(a,b){ return a+b; } يقوم التابع السابق بارجاع مجموع الرقمين الذين سيمرران اليه، الان سنقوم بتنفيذه على المتغيرين x و y : sum(x,y); الان سيقوم التابع sum باخذ قيم الارقام المخزنة ضمن المتحولين x و y واللذان هما 1 و 2 و جمعهما و ارجاع الناتج و هو 3. تحياتي،
    1 نقطة
  15. لو سمحت ماذا افعل اذا كنت اريد حفظ الملف في مسار معين؟
    1 نقطة
  16. هل عناصر الوهمية تعمل مع كافة العناصر... لان عمل احاول اعملها للinput ماعم يشتغل: طبعا position relative مع ال input .container .content form input::before { display: inline-block; content: ""; position: absolute; top: 0; left: 0; width: 50px; height: 50px; background-color: blue; }
    1 نقطة
  17. سلام عليكم انا مسجل الاصول الثابته على اكسيل وفيه قيمة الشراء والاهلاك والمجمع بس ازاى ادخل معاه اكسيس ويكون التسجيل على اكسيس و جتا بيز بتاعته هى اكسيل اللى عاملوه
    1 نقطة
  18. السلام عليكم ورحمة الله وبركاته انا عاوزه داله لحساب مجموعه من الخلايا ذات تسلسل معين مثلا a1 ;a7 ;a14;a21 ; a28 وذلك لنطاق وليكن 100 خليه مثلا
    1 نقطة
  19. السلام عليكم ورحمة الله وبركاته اذا ممكن هل يوجد دالة يمكن استخدامها في الاكسيل لمعرفة عدد الخلايا المكتوب فيها والظاهرة فقط أي بعد تصفية الورقة باستخدام subtotal ولكم جزيل الشكر
    1 نقطة
  20. شكرا لكم على هذه المعلومات المثيرة والنافعة وجازاكم الله عنا كل خير
    1 نقطة
×
×
  • أضف...