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

Adnane Kadri

الأعضاء
  • المساهمات

    5196
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    52

كل منشورات العضو Adnane Kadri

  1. دورة تطوير التطبيقات باستخدام لغة جافاسكربت في اكاديمية حسوب هي تشكيلة ذات 55 ساعة من أساسيات اللغة، تطبيقاتها العملية وتفرعاتها المختلفة في مختلف بيئات العمل. حيث تحتوي كلا من المسارات التالية: أساسيات لغة جافاسكربت أساسيات ReactJS أساسيات NodeJS تطوير تطبيق جوال بإستخدام React Native تطوير تطبيق دردشة يشبه WhatsApp تطوير تطبيق سطح مكتب باستخدام ElectronJS تطوير تطبيق جوال للتواصل الاجتماعي باستخدام Ionic تطبيق حجز مناسبات باستخدام GraphQL وبالتالي فإنك ستصبح قادرا على التعامل مع جافاسكربت في كل بيئة، انطلاقا من جهة الخادم بـ Node و Express و العميل بـ ReactJS و Vanilla Javascript والهاتف النقال عن طريق ReactNative و Ionic و سطح المكتب عن طريق ElectronJS بجانب التعامل مع قواعد البيانات عن طريق كل من GraphQL و MongoDB و NoSql. ولو تلاحظ فإن الدورة مشبعة بمسارات العمل التطبيقية، وهو شيء يميز الدورة أكثر. بعد اتمامك للدورة ستتخرج كمطور جافاسكربت. يمكنك التعرف أكثر عن الدورة هنا.
  2. بالطبع فإنه يوجد فرق، عملية الـنمذجة ترجمة عن prototyping في هي نمط تصميم يخص إنشاء الكائنات Objects يندرج تحت الفئة creational design patterns أو انماط التصميم الإنشائية. وفي جافاسكربت وهو ببساطة أشبه بالاشارة الى النموذج الأولي للكائن وهو ما كالتالي: function User () { }; User.prototype.save = function () { //do something }; فهاهنا نحن نقوم بتهيئة طريقة او تابع او وظيفة للصنف User يستعمله هو نفسه كامل الكائنات المنشئة عن طريق User وليكن الكائنين Ali و Ossama. وذلك لأن كل كائن مرتبط بكائن النموذج الأولي (لنتخيله كالقالب الأولي). في حين ان استعمال this سيشير الى الكائن المنشَئ وليس للصنف، بمعنى انه سيشير الى Ali وحده والى Ossama وحده. فكل كائن منهما سيمتلك نسخته الخاصة من save. تعتبر الطريقة الأولى أو النمذجة أسرع نسبيا وأقل استعمالا للذاكرة (لأن التابع سيكون متوفرا عند كل النسخ عن الصنف عند استعمال this في حين انه سيكون متوفرا في النموذج الاولي فقط في حالة استعمال prototype) أما الطريقة الثانية فهي تخدم مفهوم التغليف Encapsulation أكثر فالتوابع المعرفة داخل الكائن بالاشارة بـ this يمكنها التعامل مع متغيرات الكائن الداخلية الخاصة. في الحقيقة لا يوجد هذان النمطين فقط في جافاسكربت فيما يخص الكائنات، يوجد أنماط عديدة أخرى يتعلق بعضها بتهئية الكائنات وإنشاءها، بأشكالها وكيفية عملها، بسلوكها وكيفية تواصلها وغيرها.
  3. لما قد تستخدمين التعابير النمطية لذلك؟ يمكن عن طريق عبارة شرطية بسيطة التحقق من ذلك. لاحظي: <?php $num = 18; $isGreaterThan18 = $num >= 18 ? true : false; echo $isGreaterThan18; لاحظي استعمال المعامل الثلاثي Ternary operator. ان كان لا بد من استخدام التعابير النمطية يمكنك الاستفادة من هذا التعبير: ^0?1[89]|0?[2-9][0-9]$ الذي يشمل الاعداد من 18 الى 99. شرح التعبير: ^ بداية التعبير 0؟ قبول ان تكون بداية السلسلة النصية 0 على نحو 068 او 018 1[89] تقبل ان يكون المحرف الاول 1 والثاني 8 او 9 اي قبول 18 و 19 و أيضا 018 و 019 | أو [2-9][0-9] ان يكون المحرف الاول ما بين 2 و 9 والثاني ما بين 0 و 9 على نحو 24 و 20 و 45 وغيرها $ نهاية التعبير فيما يلي استعماله بشكل عملي: $regex = "~^(^0?1[89]|0?[2-9][0-9]$)$~"; echo preg_match($regex ,80); // true echo preg_match($regex ,16); // false
  4. يمكنك استعمال الحدث submit عن طريق الموجه wire:submit لخدمة هذا الغرض، لنقم أولا بإنشاء مكون livewire يمثل النموذج الخاص بنا عن طريق: php artisan make:livewire mySimpleForm وليحمل ملف العرض المرافق لهذا المكون الهيكلة التالية: <div> <h2> {{ $num }} </h2> <from wire:submit.prevent="handleData"> <input type="number" name="number1" wire:model="number1"/> <input type="number" name="number2" wire:model="number2"/> <button type="submit"> حفظ </button> </form> </div> لاحظ استقبال المتغير num الذي سيتم تكوينه عن طريق صنف المكون MySimpleForm.php لاحظ ايضا استعمال الحدث submit.prevent لمنع تقديم النموذج بشكل افتراضي (لمنع تحديث الصفحة عند تقديمه) لاحظ أيضا استعمال الحدث model للاستماع لكل من قيم number1 و number2 لاحظ استعمال التابع handleData الذي يمثل تابع صنف المكون MySimpleForm الذي سيقوم بالتعامل مع البيانات التي نرسلها. يكون ملف صنف المكون MySimpleForm كالتالي: <?php namespace App\Http\Livewire; use Livewire\Component; class MySimpleForm extends Component{ public $number1; public $number2; public $num = 0; public funciotn handleData() { $this->num = $this->number1 + $this->number2; } public function render() { return view('livewire.my-simple-form'); } } الذي سيحصل هنا هو: عندما نملئ النموذج ونقدمه سيتم استهداف التابع handleData للصنف MySimpleForm عن طريق livewire ويتم تبديل قيمة num. (ستلاحظ تبديل قيمة num في ملف العرض كإثبات على تقديم النموذج وذلك دون الحاجة الى اعادة تحديث الصفحة). بالطبع فإنه يمكنك التعامل مع هاته البيانات وفق أي طريقة تريدها، أو تضمين هذا المكون بأي مكان أو صفحة أخرى.
  5. لا أظن أنه يوجد ميزات مبنية في جافاسكربت تدعم تطبيق الواجهات وتعريفها، ولكن يمكن تطبيق مفهوم قريب منه عن طريق تعريف توابع الواجهة اللازمة محقون فيها رسائل او تنبيهات خطأ في حالة استدعاءها دون اعادة الكتابة عليها. يفرض هذا وراثة الأصناف extending وليس تطبيق الواجهات implementing مثلما هو شائع مع الواجهات. لاحظ المثال: class MyInterface { // تابع اجباري example(a, b) { this._WARNING('sum(a, b)'); // يتم رمي هذا الخطأ في حالة عدم اعادة تعريفه } // مولد خطأ مخصص _WARNING(fName='unknown method') { console.warn( 'WARNING! Function "' +fName+ '" is not overridden in '+ this.constructor.name); } } class MyCorrectUsedClass extends MyInterface { /** اعادة تعريف التابع */ example(a, b) { return a+b; } } class MyIncorrectUsedClass extends MyInterface { // عدم اعادة التعريف } let correct = new MyCorrectUsedClass(); let incorrect = new MyIncorrectUsedClass(); console.log('correct.sum(1, 2) =', correct.example(1, 2)); console.log('incorrect.sum(1, 2) =', incorrect.example(1, 2)); سيعطي هذا رسالة خطأ مخصصة تخبرنا أننا يجب ان نعيد تعريف التابع example قبل استعماله، وهو بشكل ما أشبه بتطبيق واجهات. مثال عن خرج النتيجتين: "correct.sum(1, 2) =", 3 "WARNING! Function \&quot;sum(a, b)\&quot; is not overridden in MyIncorrectUsedClass" "incorrect.sum(1, 2) =", undefined
  6. كشخص من خلفية غير تقنية مبتدئ تماما في المجال أنصح بدورة علوم الحاسوب، فهي ما سيمهد لأي مبتدئ من أي خلفية الطريق لدخول هذا العالم من بابه الواسع، وذلك إبتداءا من أبسط المفاهيم البرمجية إلى المفاهيم المتقدمة. الدورة هي عبارة عن مساق تدريبي كامل يبدأ من الصفر تمامًا إلى مرحلة متقدمة من التعامل مع مختلف التقنيات. للدورة ثمان مسارات مختلفة: مدخل إلى علوم الحاسوب أساسيات البرمجة أنظمة التشغيل ولينكس قواعد البيانات إلى عالم الويب البرمجة الكائنية الخوارزميات وبنى المعطيات أنماط التصميم سيساعدك هذا في اختيار مسارك التعلمي وحسمك لموضوع التخصص مستقبلا، سواءا ان كنت ستختار تطوير واجهات المستخدم، تطبيقات الهاتف النقال أو تطبيقات الويب أو سطح المكتب. أما ان كنت تأتي من خلفية تقنية، وتعي كامل أساسيات البرمجة وعلوم الحاسب فيفترض أنك تعرف مجالات التخصص وبالتالي فلك أن تختار احد الدورات: دورة تطوير واجهات المستخدم. دورة دورة تطوير التطبيقات باستخدام بايثون دورة تطوير التطبيقات باستخدام جافاسكربت دورة تطوير التطبيقات باستخدام PHP دورة تطوير التطبيقات باستخدام Ruby
  7. متى ما رغبت في جعل كل عملية داخل الوظيفة وظيفة جزئية مستقلة ذات نطاق خاص. بحيث تكون قابلة للتطوير، التعديل أو التوسع بشكل مستقل عن أي وظيفة جزئية أخرى داخل نفس المهمة. لاحظ المثال المرفق آخر الإجابة:
  8. تقنية currying في جافاسكربت هي أحد تقنيات البرمجة الوظيفية المتقدمة، والتي تجعل الدوال من على الشكل: function(a , b , c) قابلة للإستدعاء كـ: function(a)(b)(c) ويقتضي هذا اعادة دالة من داخل دالة للحصول على هذا النوع من التسلسل. فالدالة الأولى تقوم بإستقبال المعامل a وتعالجه ثم تعيد الوظيفة التي تأخذ المعامل الثاني b وهكذا. أي أنه يعني ببساطة تحويل الوظائف والدوال ذات الوسيطات (المعاملات) المتعددة وتحليلها في سلسلة من الوظائف ذات معامل واحد. لاحظ المثال: الدالة التالية تقوم بحساب مساحة مكعب نعطي أبعاده. function calculateVolume(length, breadth, height) { return length * breadth * height; } console.log(calculateVolume(4, 5, 6)); يمكن كتابة هاته الدالة بتقنية currying كـ: function calculateVolume(length) { return function (breadth) { return function (height) { return length * breadth * height; } } } console.log(calculateVolume(4)(5)(6)); أو: function calculateVolume(length) { return (breadth) => { return (height) => { return length * breadth * height; } } } console.log(calculateVolume(4)(5)(6)); السبب في خلق النوع من التسلسل هو الحاجة الى الحصول على دوال جزئية بسهولة. فأنت لست مرغما على تمرير كامل المعاملات مرة واحدة بل سيكفي تمرير كل معامل عند توفره. مثال: نمرر المعامل length في مكان ونحفظ خرج الوظيفة ثم بعد توفر المعامل breadth نمرره ونحفظ الخرج ثم ان توفر المعامل height نمرره ثم نطبع الخرج. أي انه هاته الوظيفة ستعيد: اما دالة جزئية جديدة في حالة لم يكن عدد الوسطاء (المعاملات) كافيا أو تعيد النتيجة النهائية ان كان عدد الوسطاء كافيا. أظن الذي يجعل هاته التقنية مثيرة للإهتمام هو في أنها تساعد في جعل كل وظيفة جزئية ذات نطاق خاص scope يمكنك من فعل ما تريد دون القلق بشأن المتغيرات الخارجية. وهو ما يساهم حتما في فصل المهام. مثال واقعي: // دالة حساب السعر النهائي انطلاقا من سعر المنتج مضافا اليه العمولة ومطبقا عليه الخصم function getFinalPrice(actualPrice, charges, discountRate) { var finalPrice; finalPrice = actualPrice + charges - (actualPrice * discountRate/100); return finalPrice; } function getFinalPrice(actualPrice) { return (charges) => { return (discountRate) => { return actualPrice + charges - (actualPrice * discountRate/100); } } } console.log(getFinalPrice(100)(25)(12)) فان استوفت الوظيفة كامل معاملاتها، ستعيد لك خرجا يعبر عن السعر النهائي. وإن لم تستوف فإنها ستعيد دالة جزئية قابلة للإستدعاء مجددا callable. ولن يهم الخرج النهائي ولا المتغيرات الخارجية ان كنت ستقوم مستقبلا بتقليل كامل نسب الخصومات بغض النظر عنها بـ 1% أو ان كنت ستضيف 10$ على كل عملية شراء مهما كانت عمولتها الأصلية أو أي كان. فيما يلي مقالة مفصلة حول الموضوع: تقنية Currying في جافاسكربت
  9. بجانب الطريقة التي اقترحها المدرب حيدر يمكنك التحقق من ما ان كان احد المحارف على الاقل مكتوبا كـ capital، وفي ذلك نحتاج التحقق من كل عنصر من المصفوفة المشكلة من محارف السلسلة النصية المستهدفة. نستعمل في هذا الدالة ctype_upper التي تتأكد من ما ان كانت السلسة الممررة اليها مكتوبة بشكل capital او لا <?php $str = 'thats a string, and here is a capital letter : H'; function containsCapital($str) { // انشاء مصفوفة من محارف السلسلة النصية // والتكرار حول عناصر هاته المصفوفة foreach(str_split($str) as $item){ // للتحقق من ما ان كان هذا المحرف كبيرا ctype_upper استعمال الدالة if(ctype_upper($item)){ return true; } } // عدى ذلك، نعيد قيمة بوليانية خاطئة return false; } echo containsCapital($str); // true توثيق الدالة str_split
  10. أظنك تقصدين ان يكون المدخل سلسلة نصية string، يمكنك لهذا كتابة قاعدة مخصصة كـ: <?php $name_input = $_POST['name']; if (! is_string($name_input)) { exit('Invalid name'); } ونفس الأمر بالنسبة لشرط العمر: <?php $age_input = $_POST['age']; if (! is_numeric($age_input) && $age_input >= 0) { exit('Invalid age'); } توثيق الدالة is_string توثيق الدالة is_numeric
  11. هل حاولت تجربة خدمات مكافئة لـ twilio؟ نذكر من بينها: خدمة Vonage. خدمة messagebird. خدمة plivo واجهة infobip يحتوي أغلبها على خطط استعمال مجانية، يمكنك الاستفادة منها. لا تحتوي PHP في حد ذاتها على وظائف SMS ولا تسمح لك بإرسال رسائل SMS مباشرة. فهاته الأخيرة تستعمل بروتوكولا غير الذي تتعامل معه PHP، هو بروتوكول GSM. ولذلك فإنك ستحتاج في الغالب إلى ما يعرف بمزود GSM الذي سيوفر استعمال هاته الخدمة. غير ذلك ستحتاج أحد أطر العمل التي توفر امكانية بناء تطبيقات متعددة البروتوكلات multi-protocol مثل asterisk.
  12. يمكنك استعمال الوضعية المطلقة position absolute لتوسط العنصر الابن scroll ضمن العنصر الاب scroll_container ويمكنك التحكم في وضعيته بضبط قيم top و left بالنسبة لهذا العنصر. في هذا ستحتاج أولا اعطاء العنصر scroll_container الوضعية النسبية position relative: .container_scroll{ .. position: relative; } ثم اعطاء العنصر scroll الوضعية المطلقة وضبط تموضعه: .scroll{ position: absolute; top: 50%; left: 50%; } يمكنك التعرف أكثر عن أساسيات التموضع في css.
  13. ان كنت تقصد بصحة كلمة المرور موافاتها لشروط معينة فنعم، يمكنك التحقق منها على مستوى العميل قبل ارسال اي بيانات الى الخادم، ولكن هذا لا يكفيك من التحقق من هاته الشروط الخاصة بكلمة المرور على مستوى الخادم أيضا. الشروط المقصودة هي من مثل: تكونها من عدد معين من المحارف، احتواءها لرقم على الأقل، لرمز على الأكثر .. الخ مثال: myForm.addEventListener('submit' ,function(e){ e.preventDefault(); var data = new FormData(this); // التحقق من احتواءها على 6 محارف على الاقل if(data['password'].length < 6) {alert('error'); return;} // شيفرة ارسال الطلب تاليا }) اما ان كنت تقصد بصحة كلمة المرور مطابقتها لكلمة مرور مستخدم ما مسجل لديك، فلا لن يمكنك ذلك. لأن هاته العملية ستتطلب الاتصال بالخادم اولا واستلام الرد عن التحقق منه، وهو ما لا يمكن عمله على واجهة العميل مباشرة.
  14. مرحبا محمد، هل قمت بمراسلة فريق الدعم؟
  15. أظن أن موازنة هاته العناصر بغرض التخلص من هاته الفراغات السلبية لن يكفيه ضبط عرض العناصر والمدخلات لملائمتها وفقط، فقد لا يلائم عرض ما شاشة عرض أخرى. ولتجاوز هاته المشكلة أقترح استعمال نظام تقطيع شبكي grid system أو الصندوق المرن flex box.كما أنك تقوم في كثير من الحالات بتحديد عرض للعناصر والمدخلات بدل جعلها نسبية أو ضبطها وفق حاوياتها. مثال: .price input { width: 23%; } بدل هذا، يمكنك وضع كل اربع عناصر مثلا ضمن حاوية مرنة والتأكد من اعطاءها الفراغات اللازمة gap.
  16. يستعمل البعض مكتبة simple_html_dom لتجريف صفحات الويب وتحليل بياناتها. في ما يلي مثال عملي عن الاستعمال: $html = file_get_html('https://www.some_website.com/'); $imgs = $html->find('img'); $hrefs = $html->find('a'); توفر هاته المكتبة الوظيفة file_get_html. التي يمكن عن طريقها استعمال محددات الـ css العادية لجلب أي عنصر أو مجموعة عناصر ضمن الصفحة. يرجى الاشارة ايضا الى ان هاته المكتبة قد لا تعمل بشكل صحيح ان كان المحتوى يتم عرضه بعد تحميل موارد الصفحة بما في ذلك ملفات جافاسكربت (مثل حالات تطبيقات الصفحة الواحدة SPA أو أي تطبيق يتم تصيير الصفحة فيه على مستوى العميل client side rendering). لا أظن أن هنالك برمجية مبنية على الـ PHP تخدم هذا الاحتمال -على أن مثل هاته التطبيقات قليلة مقارنة بالعادية- ، على عكس مكتبات من مثل scrapy أو selenium موجودة في بايثون. أظن أن بايثون أفضل في هذا الجانب. (يرجى الانتباه جيدا الى الجانب القانوني في الموضوع، قد يؤدي استعمالها الى حظرك من بعض المواقع أو حتى الى اجراءات أخرى في بعض الاحيان). فيما يلي توثيق المكتبة المشار اليها simplehtmldom.
  17. يمكنك أيضا توظيف الحدثين onmouseover و onmouseout لخدمة نفس الغرض: <h1 onmouseover="document.body.style.backgroundColor = 'red';" onmouseout="document.body.style.backgroundColor = '';">اضغط</h1> مثال تجريبي. يمكنك الاطلاع على فهم الأحداث المتعلقة بتحريك الفأرة والتعامل معها في جافاسكربت
  18. يظهر الخطأ لأن هنالك مشكلة بإنشاء واستدعاء كائن JSON. فقبل اسناد قيمة الكائن ستحتاج أولا تحويله الى سلسلة نصية اولا كـ: window.localStorage.user = JSON.stringify({ // لاحظ name : 'mohammed', age : 14 }); ثم سيمكنك استدعاءه او طباعته بشكل عادي: console.log(typeof JSON.parse(localStorage.user)); الناتج: object كيف تستخدم JSON في JavaScript.
  19. مرحبا محمد، هل يمكنك اضافة تفاصيل اكثر عن المشكلة التي تواجهها؟ ان كنت تواجه مشكلة بمسار ما ضمن احد دورات حسوب، يفضل ارفاق المشكلة أسفل الدرس بقسم تعليقات الطلبة وسنعمل على مساعدتك في اقرب وقت.
  20. أظن أن فريق الدعم يحاول إخبارك أن المنفذ المشار اليه لن يتم حجزه عن طريق أي خدمة أخرى، يمكنك الآن تشغيل الامر بشكل عادي (تذكر اضافة السابقة nohup). في حالة مواجهتك لمشكلة ما، يمكنك مراسلة الدعم والتساؤل حول ما ان كان استعمال متغيرات تقييد الوصول POSIX من مثل nohup متاحا أو لا. جرب بعد تشغيل الامر واغلاق الطرفية واختبر الامر.
  21. في الحقيقة وفي مثالك، لا أظن أنه يوجد أي فرق جدير بالذكر بين الطريقتين فأنت في المرة الأولى تستقبل المعامل name عن طريق الباني وتسنده الى خاصية تخص الكائن User وطباعتها في آخر الأمر. ثم في المرة الثانية باستقبال المعامل name عن طريق الباني ثم طباعته مباشرة. ففي المرة الاولى، name معامل وخاصية للكائن. وفي المرة الثانية، معامل وفقط. كنت لأختار الطريقة الأولى، وذلك لأنك تقوم بتهيئة كائنات جديدة عن الصنف User عن طريق الكلمة المفتاحية new التي تقوم بإنشاء كائن فيفترض ان كل منها يميز عن الآخر. كما ان الطريقة الأولى تخدم مبدأ التوسع scalability فالخاصية name ستكون متاحة أيضا للاستعمال او اعادة التعيين من قبل اي تابع للكائن يتوقع انشاءه مستقبلا قبل طباعة خرجه.
  22. supervisor هو أحد برامج مراقبة الاجراءات أو الـ proccess monitors. وهي برامج تتيح لمستخدميها مراقبة عدد من العمليات والتحكم فيها على أنظمة تشغيل شبيهة بـ UNIX أو Unix like OS. يقترن هذا المفهوم احيانا بلارافيل عندما نحاول تشغيل طوابير الانتظار Queues أو الـويب سوكيتس او حتى عند العمل على جدولة المهام Task Sheduling أحيانا ويكون هذا في بيئة انتاجية. أي لن يتاح لنا تشغيل أوامر اعتيادية من مثل queue:work أو shedule:run أو websocket:serve عن طريق الطرفية بشكل دائم. فبمجرد اغلاقك للطرفية Terminal سيتوقف الاجراء الذي تقوم به. وهو بالطبع ما لا تريده. supervisor هو ما يجنبنا هذا الشيء. ولتثبيت supervisor كمراقب اجراءي proccess monitor في استضافتك ستحتاج بداية وصولا كـ root وهو الامر الذي لا يكون متاحا في استضافات الويب المشتركة، وانما في استضافات VPS فقط. عدى ذلك، تثبيته واعداده يعدان أمرين سهلين. إذ ان تثبيته يكون عن طريق أوامر من مثل: sudo apt-get install supervisor ثم ان ملفات اعداه لن تكون الا كـ: [program:websocket-start] process_name=%(program_name)s_%(process_num)02d command=php /var/www/laravel-example/artisan websockets:serve --port=6006 autostart=true autorestart=true user=forge numprocs=2 redirect_stderr=true stdout_logfile=/var/www/laravel-example//storage/logs/supervisord.log يمكن الوصول الى هذا الملف عن طريق المسار ( /etc/supervisor/conf.d) في انظمة لينكس. رغم هذا إلا ان هذا يتعذر في حالة استضافات الويب المشتركة، ولذلك فإننا نلجئ أحيانا إلى افكار أخرى قد توفي أو تخدمنا في حاجات معينة. عن نفسي، استعمل وانصح باستعمال أحد هاته الطرق حسب الحاجة، تشغيل الأمر يدويا عن طريق الواجهة Artisan في مسار ما من مثل: Artisan::call('queue:work --once') ولكن هذا لا يعد عمليا كثيرا، لأن تشغيل الأمر لن يكون متاحا لأي كان، وإنما لمشرفي الموقع او بعض من يمتلكون صلاحية الوصول الى المتحكم الذي يشغل هذا الامر. تعد هاته الطريقة عملية في حالة عدم الحاجة الى تشغيل الامر بشكل دائم أين يكون مقيدا بعملية ما. على سبيل المثال: بعد أن ينتهي مشرف الموقع من القيام بتعديلات على المكتب الخلفي يصل بطريقة ما الى المسار الذي يمكنه من تشغيل يتم فيه ارسال رسائل تنبيهات الى المستهدفين من محررين او موظفين آخرين بالموقع. تشغيل الأمر دوريا عن طريق جدولته كـ Cron job: وهو الأمر الآخر الذي يمكننا من تشغيل الأمر بشكل دوري دون الحاجة الى ان يكون الامر مقيدا بعملية ما، على سبيل المثال: يتم تجميع جديد مقالات الموقع كل نهاية اسبوع وارسالها الى المشتركين بالقائمة البريدية. هاته الفكرة أيضا قد لا تكون متاحة في أغلب خطط الاستضافة المشتركة إلا أن بعضها يتوفر على عدد لا بأس به من المهمات التي يمكن جدولتها (هوستنجر مثلا يتيح امكانية جدولة 100 مهمة). وهو الأمر الآخر السهل التعامل معه (نرفق فقط الامر الذي نريد جدولته بجانب المدة في استمارات تقدمها خطة الاستضافة). تشغيل الأمر من على الطرفية عن طريق ما يعرف بمتغيرات تقييد الوصول POSIX أين يمكنك اضافة السابقة nohup الى الامر الذي تود تشغيله من على الطرفية Terminal، ويشير هذا الى عدم ايقاف تشغيل البرنامج حتى بعد اغلاق الطرفية (بالطبع فإن هذا لا يشمل اعادة تشغيل الامر حتى بعد تعطله مثل ما تتيحه برامج مراقبة الاجراءات مثل supervisor ولذلك فإنك ستكون مسؤولا عن اعادة تشغيل الامر في حالة تعطله). فبدل طباعة الأمر: php artisan websockets:serve --port=6006 ستحتاج فقط اضافة السابقة nohup: nohup php artisan websockets:serve --port=6006 وسيمكنك اغلاق الطرفية بشكل عادي. (جرب تشغيل الامر واختبر ما ان كان استعمالها متاحا). يمكنك للاستزادة بالتعمق في هاته المفاهيم من خلال الاطلاع على فصول كتاب أنظمة التشغيل للمبرمجين ترجمة عن Think OS المنشورة ككتاب وكسلسلة مقالات في أكاديمية حسوب. وهو كتاب غني عن التعريف في المجال يتناول مثل هاته المفاهيم على مستوى عميق.
  23. في الحقيقة، توجد طريقتان لتخزين هاته البيانات واعادة التقاطها لاحقا وعرضها في الصفحة كل مرة يتم تحديث هاته الصفحة: الطبيعي والأصل هو: قواعد البيانات. وفي هذا ستحتاج معرفة بتطوير الواجهة الخلفية. الطريقة الأخرى هي في استعمال التخزين المحلي للمتصفح، وهاته الطريقة غالبا لا تستعمل لمثل هاته التطبيقات التي تحوي بيانات كبيرة لأنها محدودة وتضع حدا لحجم البيانات التي يمكن تخزينه عليها. عموما سيمكنك تخزين البيانات كالتالي: localeStorage.setItem('data' ,your_data); على أن data هو مفتاح يتم به التعرف على هاته البيانات، وyour_data هو مرجع المتغير الذي يحمل البيانات المراد الحفاظ عليها. ثم سيمكنك جلبها كـ: localeStorage.getItem('data'); وذلك عن طريق المفتاح الذي تستعمله. للاستزادة يمكنك التعرف على تخزين البيانات محليا في متصفح الويب عبر جافاسكربت
  24. يحدث التجاوز على المحور الأفقي بسبب أن الصورة التي تستعملها (الحواسيب والأجهزة في البانر) تمتلك عرضا تلقائيا، ولهذا ستحتاج اعطاءها عرضا ثابتا او نسبيا لكي تتجنب هاته المشكلة. <img class="w-100" src="images/hero.svg" alt=""> ان كانت الصورة تبدو كبيرة في الشاشات الكبيرة والمتوسطة يمكنك ضبط العرض عن طريق وضع الصورة ضمن حاو نحدد عرضه عن طريق قواعد نظام الشبكة في إطار العمل Bootstrap: <div class="row"> <div class="col-12 text-center"> <div class="text-box"> <h1>Designer, Front-end Developer & Mentor</h1> <p>I design and code beautifully simple things, and I love what I do.</p> <img src="images/mf-avatar.svg" alt=""> </div> </div> <div class="col-lg-6 col-sm-12 m-auto"> <img class="w-100 m-auto" src="images/hero.svg" alt=""> </div> </div> فيما يلي توثيق نظام الشبكة في إطار العمل Bootstrap.
  25. هل يمكنك ارفاق ملفات المشروع بشكل مضغوط؟ لا يبدوا ان التنسيقات المرفقة تعمل بشكل صحيح لدي.
×
×
  • أضف...