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

سامح أشرف

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

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

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

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

    56

إجابات الأسئلة

  1. إجابة سامح أشرف سؤال في كيفية عمل تابع ساكن Static Method في JavaScript؟ كانت الإجابة المقبولة   
    يمكن عمل توابع ساكنة في لغة JavaScript بأكثر من طريقة:
    إنشاء التوابع الساكنة Static Methods في الأصناف Classes
    يمكن إستخدام الكلمة المفتاحية static لعمل تابع ساكن Static Method بالشكل التالي:
    class User { static hello() { console.log("Hello"); } } User.hello(); // Hello كما يمكن إسناد قيمة جديدة للصنف نفسه بشكل مباشرة على النحو التالي:
    class User { } User.hello = function() { console.log("Hello"); }; User.hello(); // Hello يمكن الإطلاع على المقالة التالية التي تحتوي على شرح مفصل لهذا الأمر وكيف يتم إنشاء التوابع بإستخدام prototype خلف الكواليس:
    إنشاء التوابع الساكنة Static Methods في الدوال البانية Constructor Function
    يمكن عمل توابع ساكنة Static Methods بإستخدام prototype بالشكل التالي:
    function Foo() { // يمكن إضافة التوابع العادية هنا عبر الكلمة المفتاحية this } Foo.prototype = { staticMethod: function () { return 2 + 3; } }; ويتم إستخدام التابع كما يلي:
    var sum = Foo.prototype.staticMethod(); console.log(sum); لاحظ أنه يمكن إستخدام نفس الطريقة لعمل توابع عادية instance methods بدون مشكلة:
    function User() { this.age = 23; } User.prototype = { instanceMethod: function () { // instance method return this.age * 365; }, staticMethod: function () { // static method return 2 + 3; } }; ويتم إستخدامهم بالشكل التالي:
    var sum = User.prototype.staticMethod(); // 5 var ageInDays = User.prototype.instanceMethod(); // NaN (undefined * 365) var user = new User(); var ageInDays2 = user.instanceMethod(); // 8395 var sum2 = user.staticMethod(); // 5 يمكن عمل دالة لتبسيط هذه العملية وإضافة توابع بشكل مباشر:
    (function (fn) { fn.bar = function () { return 123; } ; fn.baz = function () { return 456; } ; })( Foo.prototype ); Foo.prototype.bar(); // 123  
  2. إجابة سامح أشرف سؤال في ما هي التوابع الساكنة Static Methods في البرمجة الكائنية OOP في PHP؟ كانت الإجابة المقبولة   
    الفرق بين التوابع الساكنة Static Methods والتوابع العادية
    التوابع العادية لا يمكن إستخدامها إلا من خلال إنشاء كائن Object (أو instance) من الصنف Class بالشكل التالي:
    <?php class User { public function SayHi() { echo "Hello World!"; } } $user = new User(); // يجب إنشاء كائن من الصنف $user->SayHi(); بينما التوابع الساكنة Static Methods يمكن إستدعائها مباشرة بدون الحاجة إلى إنشاء كائن جديد:
    <?php class User { static public function SayHi() { echo "Hello World!"; } } // لا يجب إنشاء نسخة كائن جديد من الصنف User User::SayHi(); // Hello World! لاحظ في الأمثلة السابقة يجب كتابة الكلمة المفتاحية static قبل تعريف التابع لعمل تابع ساكن Static Method، ولا يوجد مشكلة في كتابة كلمة static قبل أو بعد الكلمة المفتاحية public (الكلمة المفتاحية  public في حد ذاتها إختيارية) لكن يجب كتابتها قبل الكلمة المفتاحية function، وبالتالي لا يوجد فرق بين أي من التوابع التالية:
    <?php class User { static public function SayHi() { echo "Hello World!"; } public static function SayHi2() { echo "Hello World!"; } static function SayHi3() { echo "Hello World!"; } } // لا يجب إنشاء نسخة كائن جديد من الصنف User User::SayHi(); // Hello World! User::SayHi2(); // Hello World! User::SayHi3(); // Hello World! أيضًا لاحظ أن التوابع الساكنة Static Methods يتم إستدعائها من خلال العلامة :: بينما التوابع العادية تستخدم <- على النحو التالي:
    <?php $user->sayHi(); User::sayHi(); ملاحظة: لا يمكن استخدام المتغير الزائف ‎$this داخل التوابع الساكنة وذلك لأنّ هذه التوابع قابلة للاستدعاء دون الحاجة إلى إنشاء نسخة من الكائن.
    إستعمال أكثر من نوع من التوابع معًا
    يمكن أن يحتوي الصنف الواحد على توابع عادية وتوابع ساكنة معًا بدون مشكلة:
    <?php class greeting { public static function welcome() { echo "Hello World!"; } public function __construct() { self::welcome(); } } new greeting(); // "Hello World!" أيضًا لاحظ أنه يمكن إستدعاء التوابع الساكنة Static Methods من داخل نفس الصنف (في توابع أخرى) من خلال الكلمة المفتاحية self كما في المثال السابق.
    أيضًا يمكن إستدعاء تابع ساكن Static Method موجود في صنف أب من داخل صنف ابن على النحو التالي:
    <?php class User { protected static function sayHi() { return "Hello, World!"; } } class Admin extends User { public $hello; public function __construct() { $this->hello = parent::sayHi(); } } $admin = new Admin(); echo $admin -> hello; في المثال السابق يوجد تابع ساكن موجود في الصنف User (الصنف الأب) بينما الصنف الابن Admin يستدعي التابع sayHi الموجود في الصنف الأب مباشرة عبر الكلمة المفتاحية parent.
    متى يتم إستعمال التوابع الساكنة Static Methods
    يتم إستعمال التوابع الساكنة في حالات قليلة، منها:
    يمكن عمل صنف واحد يحتوي فقط على توابع ساكنة تقوم بأداة مهام متشابهة (أو تختص بأمر معين مثل إدارة الملفات على سبيل المثال). وفي هذه الحالة يمكن إعتبار التوابع الساكنة مجرد دوال عادية لكن موجودة في Namespace معين (وهو الصنف Class). يمكن إستخدامها في عمل Service وهي طريقة لترشيد التعليمات البرمجية الخاصة بك. يسمى هذا النوع من الهندسة المعمارية SOA (بنية موجهة للخدمة). فتخيل أن لديك متجر إلكتروني ويجب عمل صنف SaleHandler والذي يحتوي على كل الدوال التي يجب إستخدامها في التلاعب ببيانات مبيعة معينة (في قاعدة البيانات مثلًا)، في هذه الحالة سيكون من الأفضل أن يحتوي الصنف SaleHandler على توابع ساكنة Static Methods إن كنت تستعمل إطار عمل Framework مثل لارافيل Laravel فستجد أنه يتم إستعمال التوابع الساكنة في أكثر من مكان مثل عمل المسارات Routes أو توابع التعامل مع النصوص String. يمكنك معرفة المزيد عن التوابع الساكنة Static Methods وفائدتها من خلال موسوعة حسوب من هنا.
  3. إجابة سامح أشرف سؤال في كيف ممكن احول ملف excel الى pdf؟ كانت الإجابة المقبولة   
    يمكن القيام بتحويل ملف excel إلى PDF بعدة طرق
    Microsoft Office
    إن كنت تستخدم Microsoft Office فعليك الضغط على قائمة FIle، ثم Print وإختيار Microsoft Print to PDF كما في الصورة:

    بعد ذلك أضغط على زر Print (رقم 3 في الصورة السابقة) وأختر مكان واسم لحفظ الملف فيه.
    Google Sheets
    إن لم يكن لديك Microsoft Office أو تريد طريقة أخرة لتحويل الملف إلى PDF (حتى على الهاتف) فيمكنك أن تستخدم Google Sheets، كل ما عليك هو رفع الملف وفتحه ومن قائمة File أختر Download ثم PDF:

    وسيتم تحميل ملف بصيغة PDF
  4. إجابة سامح أشرف سؤال في بدي اسجل بدوره تطوير الواجهات الاماميه للمواقع كانت الإجابة المقبولة   
    دورة تطوير واجهات المستخدم تبدأ معك من الصفر وستحصل على شرح لكل أساسيات HTML و CSS و JavaScript و jQuery وغيرها الكثير من التقنيات مثل Git و GitHub و webpack .. إلخ.
    كما ستقوم بعمل العديد من المشاريع خلال الدورة مثل تطوير خمس صفحات هبوط Landing pages وواجهة متجر إلكتروني كامل متعدد الصفحات، ولوحة تحكم Dashboard كاملة وواجهة تشبه موقع اليوتوب.
    الشرح عبارة عن فيديوهات عملية مسجلة مسبقًا تحتوي على شرح وافي لموضوع كل درس، وان واجهتك مشكلة في الكود أو لم تفهم جزئية معينة بشكل كامل، فتستطيع ترك تعليق أسفل الدرس يحتوي على تفاصيل المشكلة وسيقوم أحد المدربين المتاحين على مدار الساعة بمساعدتك على الفور.
    ليس من الضروري أن يكون حاسوبك بمواصفات عالية يكفي أن يكون حاسوبك بمواصفات متوسطة، ويكون قادر على تشغيل متصفح ويب مع محرر نصوص مثل VS Code على سبيل المثال.
  5. إجابة سامح أشرف سؤال في هل مشاريع الدورات تشبه المشاريع المطلوبة في سوق العمل الحر؟ كانت الإجابة المقبولة   
    بالتأكيد، كل المشاريع الموجودة في كل دورات أكاديمية حسوب هي مشاريع عملية ويتم طلبها في سوق العمل، لكن بالرغم من ذلك ليس هدف دورات أكاديمية حسوب شرح كيفية عمل مشاريع محددة فقط بل تعلم كيف تقوم ببناء أي مشروع مهما كان وكيف تبحث بنفسك عن حلول للمشاكل التي تواجهها وبالتالي سوف يكون بمقدورك في النهاية إنشاء أي مشروع مهما كان.
    تهدف دورات الأكاديمية أيضًا إلى تعليمك كل الأساسيات والعديد من الأمور المتقدمة، لكي تتمكن من تعمل أي تقنية جديدة بنفسك لكي تجاري أي تغيرات في مجال البرمجة بشكل عام أو في مجال تطوير الويب بشكل خاص.
    حاول كذلك تصفح مواقع العمل الحر مثل مستقل وخمسات لكي تطلع على المشاريع التي يتم طلبها وحاول أن تقوم بتنفيذ بعضها بنفسك كنوع من التدريب المهني، سوف تحصل في النهاية على خبرة كبيرة تُمكنك من المنافسة في سوق العمل.
  6. إجابة سامح أشرف سؤال في هل سيتم شرح عملية تسجيل الدخول في دورة تطوير واجهات المستخدم؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمه الله وبركاته
    تطوير المواقع بشكل عام ينقسم إلى جزئين، الجزء الاول هو تطوير واجهة الموقع Frontend (كل ما يظهر في الموقع من نصوص وصور وأزرار والوان .. إلخ)، والجزء الثاني هو تطوير الواجهة الخلفية backend ويختص هذا الجزء بالتعامل مع قواعد البيانات وحسابات المستخدمين والصلاحيات .. إلخ.
    دورة تطوير واجهات المستخدم خاصة بعمل الجزء الأمامي من المواقع Frontend، ويتم فيها إنشاء واجهات المواقع فقط (الازرار والألوان وكل ما يظهر في الموقع)، ولكن التحكم في حسابات المستخدمين والتعامل مع قواعد البيانات وغيرها من هذه الأمور يسمى backend ويطلب تقنيات مختلفة عن HTML و CSS ولا يتم شرحه في هذه الدورة.
    أكاديمية حسوب تحتوي على أكثر من دورة تحتوي على شرح لتطوير الواجهات الخلفية backend:
    دورة تطوير تطبيقات الويب باستخدام لغة PHP دورة تطوير تطبيقات الويب باستخدام لغة Ruby دورة تطوير التطبيقات باستخدام لغة JavaScript دورة تطوير التطبيقات باستخدام لغة Python
  7. إجابة سامح أشرف سؤال في ماهو الفرق بين bind Param/Value/Column in PHP كانت الإجابة المقبولة   
    التابع bindValue في PDO
    bindValue يستخدم لربط قيمة ما بما يقابلها في جملة SQL، فعلى سبيل المثال:
    <?php $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', 150, PDO::PARAM_INT); $sth->bindValue(':colour', 'red', PDO::PARAM_STR); $sth->execute(); كما تلاحظ في المثال السابق فإن bindValue تستقبل ثلاث مدخلات، وهي اسم المعامل parameter المستخدم في جملة SQL (مثل calories: و colour:)، أما المدخل الثاني هو قيمة المعامل (مثل 150 و "red")، حيث سيتم تعويض هذه المعاملات بالقيم الخاصة بهم، بينما المدخل الثالث هو نوع نوع القيمة integer ، strgin ، boolean .. إلخ.
    ملاحظة: إضافة النقتين في بداية اسم المعامل (مثل calories: و colour:) أمر إختياري ويمكن عدم كتابته:
    $sth->bindValue('calories', 150, PDO::PARAM_INT); $sth->bindValue('colour', 'red', PDO::PARAM_STR); سوف يتم إستبدال أسماء المعاملات الموجودة في جملة SQL بقيمتها الممررة في bindValue ليصبح شكل جملة SQL كالتالي:
    SELECT name, colour, calories FROM fruit WHERE calories < 150 AND colour = "red"; كما يمكن إستخدام علامات إستفهام بدلًا من أسماء المعاملات بالشكل التالي:
    <?php /* يمكن تمرير أسماء متغيرات بلًا من القيم مباشرة*/ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?'); $sth->bindValue(1, $calories, PDO::PARAM_INT); /* علامة الإستفهم الأولى */ $sth->bindValue(2, $colour, PDO::PARAM_STR); /* علامة الإستفهم الثانية */ $sth->execute(); التابع bindParam في PDO
    التابع bindParam مشابه تمامًا للتابع bindValue، ويعمل بشكل مشابه، ولكن لا يمكن تمرير إليه قيمة مباشرة ويجب تمرير متغير، بالشكل التالي:
    <?php /* يجب أن يتم تمرير متغيرات وليس قيم مباشرة */ $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindParam(':calories', $calories, PDO::PARAM_INT); $sth->bindParam(':colour', $colour, PDO::PARAM_STR); $sth->execute(); إذا لماذا أحتاج إلى إستعمال bindParam بدلًا من bindValue؟ السبب في ذلك هو كالتالي: تخيل أنك تريد تنفيذ جملة SQL معينة أكثر من مرة بقيم مختلفة، في حالة إستعمال bindValue ستحتاج إلى ربط القيم في كل مرة تتغير فيها القيم بشكل يدوي، بينما في حالة إستخدام bindParam يجب فقط تغير قيمة المتغيرات، مثال:
    إستخدام bindParam:
    <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindParam(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foobarbaz'; إستخدام bindValue:
    <?php $value = 'foo'; $s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz'); $s->bindValue(':baz', $value); $value = 'foobarbaz'; $s->execute(); // جملة SQL التي سيتم تنفيذها // SELECT name FROM bar WHERE baz = 'foo'; لاحظ أنه عند تغير قيمة المتغير value$ في bindParam تم تغير شكل جملة SQL كذلك، بينما في bindValue لم يحدث ذلك.
    التابع bindColumn في PDO
    التابع bindColumn له إستخدام مختلف تمامًا عن bindValue و bindParam، فهو يستخدم بعد تنفيذ جملة SQL ، حيث يقوم بتخزين القيمة الموجودة في عمود معين في متغير جديد:
    <?php $stmt = $dbh->prepare('SELECT name, colour, calories FROM fruit'); $stmt->execute(); $stmt->bindColumn('name', $name); $stmt->bindColumn('colour', $colour); $stmt->bindColumn('calories', $calories); while ($stmt->fetch(PDO::FETCH_BOUND)) { print $name . "\t" . $colour . "\t" . $calories . "\n"; } عند عمل fetch سيتم جلب صف من قاعدة البيانات، وهذا الصف يحتوي على قيمة العمود name و colour و calories، ولكي تستطيع إستخدام هذه القيم بشكل سهل، يمكنك أن تجعل التابع bindColumn يقوم بتخزينهم في متغيرات بأسماء محددة، في المثال السابق نقوم بتخزين قيمة العمود name في متغير name$، بينما يخزن قيمة العمود colour في متغير بالاسم colour$ .. إلخ، وهذا الأمر يجعل إستخدام البيانات ضمن المشروع أسهل وأكثر وضوحًا.
  8. إجابة سامح أشرف سؤال في هل دورة علوم حاسب مناسبة للعمل علي مواقع العمل الحر؟ كانت الإجابة المقبولة   
    يمكنك إستعمال أي بطاقة ائتمانية بدون مشكلة، وتستطيع الحصول على مساعدة أكبر في هذا الأمر من خلال مركز المساعدة الخاص بالأكاديمة من هنا
    بالنسبة لدورة علوم الحاسوب، فهي دورة عامة تؤهلك لتعلم تقنيات أخرى، أي أنها مدخل لعلوم الحاسوب بشكل عام وبجميع تخصصاته، لكنك ستحتاج إلى التخصص في مجال معين مثل تطوير واجهات المواقع Frontend، تطوير تطبيقات الجوال، تطوير الواجهات الخلفية Backend وذلك من خلال باقي دورات أكاديمية حسوب. على سبيل المثال إن أردت أن تتخصص في تطوير واجهات المواقع Frontend ولم يكن لديك أي معرفة تقنية أو برمجية سابقة، فعليك أن تشترك في دورة علوم الحاسوب أولًا وبعد ذلك يمكنك إتمام دورة تطوير واجهات المواقع Frontend، أما إن كنت على دراية بالمجال التقني أو كان لديك خبرة برمجية سابقة، فيمكنك الإلتحاق مباشرة بدورة تطوير واجهات المواقع Frontend.
    سؤال مشابهة:
     
  9. إجابة سامح أشرف سؤال في كيف أحصل على أفكار لمشاريع للتطبيق عليها؟ كانت الإجابة المقبولة   
    يمكنك الحصول على أفكار للتطبيق عليها من خلال العديد من الطرق، منها:
    قم بعمل أدوات تساعدك في حياتك اليومية وتوفر عليك الوقت، مثل برنامج لحساب المصروفات اليومية أو برنامج لتسجيل الملاحظات Notes أو برنامج لإدارة كلمات المرور Passwords. حاول إستخراج أفكار من المشاريع المطلوبة في مواقع العمل الحر مثل مستقل وخمسات، حيث ستعمل على مشاريع مطلوبة في سوق العمل وكذلك يمكنك عرضها بسهولة في معرض الأعمال، أعتبره تدريب عملي على مشاريع حقيقية. قم بتصفح المشاريع الأكثر شهرة على مواقع مثل GitHub و GitLab، حيث يظهر كل يوم عدد من المشاريع الإبداعية. هناك مواقع تحتوي على آخر المنتجات والمشاريع البرمجية (مجانية ومدفوعة) مثل موقع product hunt، تصفح هذه المشاريع يمكن أن يلهمك أفكار جيدة للغاية. أبحث عن مشاكل تواجه فئة من الناس وقم بمحاولة حل هذه المشاكل من خلال عملها في شكل برنامج أو موقع. قم بتقليد منتجات حقيقية وأضف لها مميزات جديدة وحاول حل عيوبها. كل الأمثلة السابقة يمكن عملها في شكل برنامج، تطبيق جوال أو موقع ويب، فبعض النظر عن التقنيات ولغات البرمجة التي تستعملها يمكنك تطبيق أي حل من الحلول السابقة والمناسبة لك.
  10. إجابة سامح أشرف سؤال في مؤشر الاستقرار في توثيق nodejs على ويكي حسوب كانت الإجابة المقبولة   
    في توثيق node.js، تختص كل صفحة بشرح كائن معين أو وحدة معينة، وفي بداية كل صفحة من هذه الصفحات يوجد رقم باسم "مؤشر الاستقرار Stability Index"، ويكون له رقم 0 أو 1 أو 2، وكل رقم من هذه الأرقام يُشير إلى حالة هذا الكائن أو الوحدة (المشروحة في الصفحة):
    صفر 0 : تعني أن هذا الكائن أو الوحدة تم التخلي عنها Deprecated ولا يجب إستعمالها بعد الآن. واحد 1 : تعني أن هذا الكائن أو الوحدة مازال في حالة الإختبار Experimental، ومازل يتم العمل عليها من فرق Node.js وهي قابلة للتغير في المستقبل، لذلك لا يجب الإعتماد عليها في مشاريع حقيقية في الوقت الحالي (إلى أن يتم الإنتهاء من تطويرها). اثنان 2 : تعني أن هذا الكائن أو الوحدة في حالة مستقرة Stable ومتوافقة مع كل أكواد Node.js، ويمكنك الإعتماد عليها في مشاريع حقيقية بدون مشكلة على الإطلاق. يجدر بالذكر أن هذه الأرقام يتم تغيرها حسب حالة الكائن أو الوحدة من حين إلى آخر، وفي الغالب ستريد أن تستعمل الكائنات والوحدات التي لديها مؤشر إستقرار 2 فقط.
  11. إجابة سامح أشرف سؤال في العنصر frameset لا يعمل في VS Code كانت الإجابة المقبولة   
    العنصر farmeset والعنصر frame هما من عناصر لغة HTML الإصدار 4، ولكن هذه العناصر تم إزالتها في الإصدار 5 ، ولا يجب إستعمالها بعد الآن، والبديل هو إستعمال العنصر iframe مباشرة:
    <iframe src="https://..."></iframe> ويمكنك التحكم في حجمه من خلال الخصائص width و height:
    <iframe src="https://..." width="200" height="200"></iframe>  
  12. إجابة سامح أشرف سؤال في كيف يمكنني تفعيل مستودع Universe Repository في لينكس؟ كانت الإجابة المقبولة   
    في لينكس يوجد آلاف البرامج المجانية ومفتوحة المصدر وغيرها برامج تكون مدفوعة ولها حقوق إستخدام، ولتسهيل التعامل مع هذه البرامج وتثبيتها بسهولة وآمان، يتم تقسيم هذه البرامج في Ubuntu في أربع مستودعات مختلفة:
    مستودع Main: يحتوي على برامج مجانية ومفتوحة المصدر بدعم من Canonical (المؤسسة الأم لنظام Ubuntu) مستودع Universe: يحتوي على برامج مجانية ومفتوحة المصدر، والتي يتم صيانتها وتطويرها من قِبل المجتمع community  مستودع Restricted: يحتوي على البرمجيات والتعريفات drivers التي تسنح بتشغيل Ubuntu وبرامجه على العتاد Hardware المتعارف عليه  مستودع Multiverse: يحتوي على البرامج المقيدة بحقوق النشر والتوزيع في الإصدارات الأخيرة من Ubuntu يمكنك أن تقوم بتفعيل أي مستودع من خلال برنامج Software Sources، حيث يمكنك تحديد ما تريد تفعليه كما في الصورة التالية:

    بعد ذلك أضغط على Close، ستظهر لك نافذة قمت بالضغط على زر reload، وبهذا سيكون قد تم تفعيل المستودع لديك.
    أيضًا يمكنك أن تقوم بتفيله من خلال الأمر التالي:
    sudo add-apt-repository repo_name قم بإستبدال repo_name باسم المستودع الذي تريد تفعيله ، مثل:
    sudo add-apt-repository universe بعد تفعيل المستودع لا تنسى أن تقوم بالتحديث من خلال الأمر التالي:
    sudo apt-get update في حالة كنت تستعمل إصدار قديم من Ubuntu فيمكنك أن تستخدم الأمر التالي لتفعيل أي مستودع من الأربع مستودعات:
     
    sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) repo_name" قم بإستبدال repo_name باسم المستودع الذي تريده، مثل:
    sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe"  
  13. إجابة سامح أشرف سؤال في كيفية دمج مصفوفتين معًا بدون تغير أسماء المفاتيح keys في كل مصفوفة في PHP؟ كانت الإجابة المقبولة   
    يمكنك أن تستخدم المعامل + لدمج المصفوفتين معًا، على النحو التالي:
    <?php $arr1 = array( "name" => "emad", "email" => "emad@gmail.com" ); $arr2 = [ 123=> 'emad_saif', 456=> '18' ]; print_r($arr1 + $arr2); وستحصل على النتيجة المطلوبة:
    Array ( [name] => emad [email] => emad@gmail.com [123] => emad_saif [456] => 18 ) أيضًا يمكنك أن تستخدم الدالة array_replace:
    $result = array_replace($arr1, $arr2); print_r($result); لكن عليك الحذر عند إستعمال أيًا من الطرق السابقة، ففي حالة كانت المصفوفتين يحتويان على نفس العنصر:
    <?php $arr1 = array( "name" => "first name", "email" => "emad@gmail.com" ); $arr2 = [ "name" => 'another name', 456=> '18' ]; $result = array_replace($arr1, $arr2); print_r($result); print_r($arr1 + $arr2); في الحالة السابقة، كلا المصفوفتين يحتويان على العنصر name، وعند إستعمال الدالة array_replace سوف يتم إستبدال العنصر name من المصفوفة arr1 بالعنصر name من المصفوفة arr2، وستكون النتيجة بالشكل التالي:
    Array ( [name] => another name [email] => emad@gmail.com [456] => 18 ) بينما عند إستعمال المعامل + فسوف يتم إستبدال العنصر name من المصفوفة arr2 بالعنصر name من المصفوفة arr1، وستكون النتيجة بالشكل التالي:
    Array ( [name] => first name [email] => emad@gmail.com [456] => 18 ) كما يمكنك جعل المعامل + يتصرف مثل الدالة array_replace من خلال تغير ترتيب المصفوفتين، بالشكل التالي:
    print_r($arr2 + $arr1); // يتم إستبدال المصفوفتين هنا بهذا الشكل سوف تحصل على نفس النتيجة مثل نتيجة إستعمال الدالة array_replace تمامًا.
  14. إجابة سامح أشرف سؤال في كيف المرور على القيم الفردية والزوجية على حدى في حلقة for في قوالب جانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أن تستخدم forlopp.counter مع المرشح divisibleby على النحو التالي:
    {% for count in my_list %} {% if forloop.counter|divisibleby:2 %} <p>do something</p> {% else %} <p>do something else</p> {% endif %} {% endfor %} شرح المرشح divisibleby:
    أيضًا تستطيع أن تستعمل cycle:
    {% for count in my_list %} {% cycle 'odd' 'even' %} {% if cycle == 'odd' %} <p>do something</p> {% else %} <p>do something else</p> {% endif %} {% endfor %}  
  15. إجابة سامح أشرف سؤال في كيفية تغير حالة الرد response status في PHP؟ كانت الإجابة المقبولة   
    تستطيع تغير حالة الرد response status من خلال الدالة http_response_code فقط، على النحو التالي:
    <?php http_response_code(404); // Not Found يمكنك إستخدام هذه الدالة لمعرفة حالة الطلب الحالية:
    <?php // Get the new response code var_dump(http_response_code()); // int(404) في الإصدارات القديمة من PHP كان يتم إستعمال الدالة header:
    header("HTTP/1.1 200 OK"); header("HTTP/1.1 404 Not Found"); يُفضل أن تستعمل الدالة http_response_code إن كان إصدار PHP لديك 5.4 أو أعلى.
    ملاحظة: طبقًا لمعاير W3 يجب أن تكون رسالة الحالة (مثل OK و Not Found) مطابقة للمعاير، يمكنك الإطلاع عليها من خلال هذه الصفحة، أو من خلال القائمة التالية:
    <?php $http_status_codes = array( 100 => "Continue", 101 => "Switching Protocols", 102 => "Processing", 200 => "OK", 201 => "Created", 202 => "Accepted", 203 => "Non-Authoritative Information", 204 => "No Content", 205 => "Reset Content", 206 => "Partial Content", 207 => "Multi-Status", 300 => "Multiple Choices", 301 => "Moved Permanently", 302 => "Found", 303 => "See Other", 304 => "Not Modified", 305 => "Use Proxy", 306 => "(Unused)", 307 => "Temporary Redirect", 308 => "Permanent Redirect", 400 => "Bad Request", 401 => "Unauthorized", 402 => "Payment Required", 403 => "Forbidden", 404 => "Not Found", 405 => "Method Not Allowed", 406 => "Not Acceptable", 407 => "Proxy Authentication Required", 408 => "Request Timeout", 409 => "Conflict", 410 => "Gone", 411 => "Length Required", 412 => "Precondition Failed", 413 => "Request Entity Too Large", 414 => "Request-URI Too Long", 415 => "Unsupported Media Type", 416 => "Requested Range Not Satisfiable", 417 => "Expectation Failed", 418 => "I'm a teapot", 419 => "Authentication Timeout", 420 => "Enhance Your Calm", 422 => "Unprocessable Entity", 423 => "Locked", 424 => "Failed Dependency", 424 => "Method Failure", 425 => "Unordered Collection", 426 => "Upgrade Required", 428 => "Precondition Required", 429 => "Too Many Requests", 431 => "Request Header Fields Too Large", 444 => "No Response", 449 => "Retry With", 450 => "Blocked by Windows Parental Controls", 451 => "Unavailable For Legal Reasons", 494 => "Request Header Too Large", 495 => "Cert Error", 496 => "No Cert", 497 => "HTTP to HTTPS", 499 => "Client Closed Request", 500 => "Internal Server Error", 501 => "Not Implemented", 502 => "Bad Gateway", 503 => "Service Unavailable", 504 => "Gateway Timeout", 505 => "HTTP Version Not Supported", 506 => "Variant Also Negotiates", 507 => "Insufficient Storage", 508 => "Loop Detected", 509 => "Bandwidth Limit Exceeded", 510 => "Not Extended", 511 => "Network Authentication Required", 598 => "Network read timeout error", 599 => "Network connect timeout error" ); وتستطيع إستخدامها بالشكل التالي:
    <?php header("HTTP/1.1 404 " . $http_status_codes[404]);  
  16. إجابة سامح أشرف سؤال في كيفية إيقاف التحذيرات warnings في PHP؟ كانت الإجابة المقبولة   
    إذا كان لديك دالة تُظهر بعض التحذيرات أثناء إستدعائها فيمكنك أن تقوم بإضافة علامة @ قبل إستعائها على النحو التالي:
    @my_function(); يُسمى هذا الرمز بمعامل التحكم بالخطأ Error Control Operators، يمكنك إستخدام هذا المعامل أيضًا عند البحث في مصفوفة ما أو إستعمال متغير غير مُعرف:
     
    @$not_exists_var['some_value']; //PHP Notice: Undefined variable: test سوف يُعيد هذا المعامل NULL في هذه الحالة
    يمكنك الإطلاع على توثيق هذا المعامل في موسوعة حسوب من هنا
    أيضًا يمكنك أن تستخدم الدالة error_reporting لكي تخفي كل التحذيرات وتظهر كل أنواع الخطأ الأخرى بالشكل التالي:
    error_reporting(E_ALL ^ E_WARNING); في حالة أردت إخفاء مل رسائل الخطأ والتحذيرات، فيمكنك أن تستعمل الكود التالي:
    error_reporting(0); تمرير القيمة 0 إلى الدالة error_reporting سوف يقوم بإيقاف كل رسائل الخطأ والتحذيرات بكل أنواعها.
    لمزيد من المعلومات عن التعامل مع الأخطاء يمكنك أن تقوم بزيارة صفحة "الأخطاء في PHP في موسوعة حسوب" 
    طريقة أخرى لإيقاف ظهور رسائل الخطأ هي من خلال الملف htaccess.
    php_flag display_errors off أضافة الكود السابق إلى الملف htaccess. سوف تقوم بإيقاف كل رسائل الخطأ في المشروع الخاص بك.
    تستطيع كذلك التعديل في ملف php.ini وإضافة هذا السطر:
    display_errors = Off سوف يقوم هذا الأمر بإيقاف كل الأخطاء في PHP وفي اي مشروع آخر تعمل عليه، لا يُفضل أن تستعمل هذه الطريقة لأنها يمكن أن تسبب لك مشاكل في حل الأخطاء في المستقبل في مشاريع أخرى.
  17. إجابة سامح أشرف سؤال في هل من الآمن تمرير Base64 عبر معاملات GET في PHP؟ كانت الإجابة المقبولة   
    الرموز المستخدمة في base64 هي:
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= كل هذه الرموز يمكن إستخدامها في عناوين URL بدون مشكلة ماعدا آخر ثلاثة رموز (+/=) حيث أن لكل واحدٍ منهم له معنى مختلف في عناوين URL، لذلك عليك أن تستبدلهم بعد عملية التشفير برموز أخرى مثل (._-) على سبيل المثال، ويمكنك أن تستخدم base64 في عناوين URL بدون مشكلة من خلال إستخدام الدالة urlencode مع base64_encode على النحو التالي:
    <?php $str = 'Hello, world'; $encoded = urlencode( base64_encode( $str ) ); echo $encoded; // SGVsbG8sIHdvcmxk ولفك تشفير النص تستطيع إستخدام الدالة base64_decode مع urldecode على النحو التالي:
    <?php $encoded_str = 'SGVsbG8sIHdvcmxk'; $decoded = base64_decode( urldecode( $encoded_str ) ); echo $decoded; // Hello, world  
  18. إجابة سامح أشرف سؤال في كيفية إضافة نص إلى موضع مُحدد في نص آخر في PHP؟ كانت الإجابة المقبولة   
    يمكنك كذلك أن تستعمل الدالة substr على النحو التالي:
    <?php // النص الأصلي $oldstr = "Hello, World!"; // نُحدد المكان الذي نريد أن نضيف فيه النص الجديد $pos = strpos($oldstr,"World"); // النص الجديد الذي نريد إضافته $str_to_insert = "My "; // نستعمل الدالة substr لتقسيم النص ونقوم بتجميلع بالشكل الذي نريده $str = substr($oldstr, 0, $pos) . $str_to_insert . substr($oldstr, $pos); echo $str; // Hello, My World! بهذا الشكل سوف تحصل على النتيجة المطلوبة، الآن يمكن تحويل الكود السابق إلى دالة ليسهل إستخدامها:
    <?php function insert_str($original_str, $position, $str_to_insert){ return substr($original_str, 0, $position) . $str_to_insert . substr($original_str, $position); } echo insert_str("Hello, World!", 7, "My "); // Hello, My World! توثيق الدالة substr()‎ في موسوعة حسوب
    أيضًا يمكنك إستعمال الدالة substr_replace للقيام بهذا الأمر بشكل بسيط على النحو التالي:
    <?php // النص الأصلي $oldstr = "Hello, World!"; // نُحدد المكان الذي نريد أن نضيف فيه النص الجديد $pos = strpos($oldstr,"World"); // النص الجديد الذي نريد إضافته $str_to_insert = "My "; echo substr_replace($oldstr, $str_to_insert, $pos, 0); // Hello, My World!  
  19. إجابة سامح أشرف سؤال في ما هي فائدة المعامل :? في PHP؟ كانت الإجابة المقبولة   
    يسمى هذا المعامل بمعامل إلڤيس Elvis Operator ويستعمل مثل المعامل الثلاثي Ternary Operator في حالة واحدة إذا كان الشرط هو ما يجب إستناده إلى المتغير، فعلى سبيل المثال إذا أردنا التأكد من أن قيمة معينة لا تساوي صفر وإسنادها في هذه الحالة إلى متغير ما، أو إسناد قيمة مختلفة إذا كانت تساوي صفر:
    <?php $value = 5; $var = $value ?: 6; echo $var; // 5 بينما إذا كانت قيمة المتغير $value من نوع falsy (صفر على سبيل المثال) فسوف يتم إسناد القيمة الأخرى (القيمة الإفتراضية):
    <?php $value = 0; $var = $value ?: 6; echo $var; // 6 يمكن إعتبار معامل إلڤيس Elvis Operator كإختصار لجملة if else الشرطية كذلك:
    <?php $value = 5; if($value) { $var = $value; } else { $var = 6; } echo $var; // 5 تم شرح كلًا من المعامل الثلاثي Ternary Operator ومعامل إلفيس Elvis Operator في هذه المقالة هنا:
    إذا أردت إستخدام معامل إلفيس Elvis Operator في التأكد من أن قيمة متغير ما لا تساوي null فيمكنك إستخدام معامل التجميع Null Coalesce Operator بداية من PHP 7 ، حيث يقوم هذا المعامل بالتأكد من أن قيمة معينة لا تساوي null:
    <?php $value = null; $var = $value ?? 6; echo $var; // 6  
  20. إجابة سامح أشرف سؤال في كيفية تحويل نص متعدد الأسطر إلى سطر واحد فقط في PHP؟ كانت الإجابة المقبولة   
    يمكنك أن تستخدم الدالة preg_replace لتقوم بإستعمال regex في البحث عن المسافات الأضافية وإستبدالها بمسافة:
    $bio = preg_replace('/\s+/', ' ', $bio); وتستطيع كذلك إستخدام الدالة trim مع المثال السابق لإزالة أي مسافات في بداية أو نهاية النص:
    $bio = trim(preg_replace('/\s+/', ' ', $bio)); وستحصل على النتيجة المطلوبة في النهاية:
    echo $bio; // "string multiline string with empty lines and extra spaces"  
  21. إجابة سامح أشرف سؤال في كيفية تحديث بيانات المستخدم وإضافته إن لم يكن موجودًا في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يوفر لارافيل Laravel التابع updateOrCreate  والذي يقوم بإستقبال بيانات المستخدم الذي تبحث عنه، وكذلك البيانات التي تريد تحديثها:
    $user = User::updateOrCreate( ['id' => 5], ['name' => "new full name", 'email' => "mail@gmail.com"] ); بهذا الشكل سوف يتم البحث عن المستخدم الذي يحمل المعرف 5 وفي حالة تم العثور عليه، سوف يتم تغير اسمه وبريده الإلكتروني، وإذا لم يكن موجودًا من الأساس، سوف يتم إنشائه من جديد.
    ملاحظة: يقوم التابع updateOrCreate بحفظ السجل مباشرةً في قاعدة البيانات، لذلك ليس عليك إستخدام التابع save لحفظ التغيرات.
    توثيق التابع updateOrCreate في موسوعة حسوب
  22. إجابة سامح أشرف سؤال في كيفية عمل مسار مخصص يعمل بدل صفحة 404 في لارافيل Laravel؟ كانت الإجابة المقبولة   
    يوفر لارافيل Laravel هذه الميزة من خلال التابع Route::fallback مباشرة، والذي يستقبل دالة تحتوي على عدد من المسارات بالشكل التالي:
    Route::fallback(function () { // }); بهذا الشكل سوف تعمل المسارات المحددة في هذا التابع فقط في حالة لم يعمل أي مسار آخر خارجه في الملف routes/web.php
    ملاحظة: يجب أن يتم كتابة التابع Route::fallback في نهاية الملف routes/web.php، حيث أن كل المسارات التي تليه لن تعمل.
    توثيق التابع Route::fallback في موسوعة حسوب.
    تستطيع كذلك إستعمال التابع where لكي يتم تنفيذ المسار بشكل دائم في حالة لم يعمل أي مسار يسبقه:
    Route::get('{any?}', function ($any = null) { // ... })->where('any', '.*'); كذلك إن كان لديك دالة واحدة تريدها أن تعمل بغض النظر عن نوع الطلب request method يمكنك إستخدام التابع Route::any وإضافة دالة واحدة إليه على النحو التالي:
    // Laravel 6 & 7 Route::any('/{any}', 'MyController@myMethod')->where('any', '.*'); // Laravel 8 & 9 Route::any('/{any}', [MyController::class, 'myMethod'])->where('any', '.*');  
  23. إجابة سامح أشرف سؤال في مشكلة ظهور خطأ عند إستعمال الدالة file_get_content في PHP كانت الإجابة المقبولة   
    الدالة file_get_contents تقوم بإرجاع false إذا لم تتمكن من الحصول على أي محتوى من الرابط.
    ويمكنك إستخدام معامل التحكم بالخطأ @ مع جملة if بالشكل التالي:
    <?php $page = @file_get_contents('http://www.not-exists-on-web.com'); if ($page !== False) { // تم تحميل الصفحة بشكل سليم echo $page; } else { // فشلت عملية تحميل الصفحة echo "NOT loaded"; } لمزيد من المعلومات عن هذه الدالة، يمكنك زيارة موسوعة حسوب (الدالة file_get_contents()‎ في PHP).
  24. إجابة سامح أشرف سؤال في كيفية إستعمال "AND" في مرشح filter في جانغو Django؟ كانت الإجابة المقبولة   
    يمكنك أيضًا إستعمال الكائن Q للقيام بالإستعلامات المتعددة الشروط على النحو التالي:
    from django.db.models import Q first_condition = Q(title__contains="automation") second_condition = Q(title__contains="python") posts = Post.objects.filter(first_condition & second_condition) بهذا الشكل يمكنك عمل أي عدد من الشروط وربطها معًا من خلال المعامل & في التابع filter
    أيضًا يمكنك إستخدام المعامل OR في لغة SQL بنفس الطريقة من خلال إستبدال المعامل & في المثال السابق بالمعامل | كالتالي:
    from django.db.models import Q first_condition = Q(title__contains="automation") second_condition = Q(title__contains="python") posts = Post.objects.filter(first_condition | second_condition) # first_condition OR second_condition  
  25. إجابة سامح أشرف سؤال في خطأ Invalid cross-device link عند نقل قاعدة بيانات مشروع جانغو Django؟ كانت الإجابة المقبولة   
    بالطبع يمكن إستخدام التابع os.rename لنقل ملف ما، ولكن لكي يعمل هذا التابع يجب أن يكون الملف الأصلي والمسار الذي سيتم نقله إليه في نفس نظام الملفات File System (على نفس القرص Partition)
    الخطأ Invalid cross-device link ليس مشكلة في جانغو Django بل ناجم عن نقل ملف من نظام ملفات مختلف File System، حيث أن التابع os.rename يعمل فقط في حالة كان الملف موجود في نظام ملفات معين وتريد نقله إلى مكان آخر ضمن نفس نظام الملفات، بينما في حالتك فإن نقل ملف من نظام ملفات إلى نظام ملفات مختلف (من قرص Partition إلى قرص آخر USB) لا يمكن أن يتم بإستخدام التابع os.rename.
    >>> import os >>> os.getcwd() # المسار الحالي، في القرص D: '/mnt/d/temp' >>> os.rename('test.txt', '/mnt/e/test.txt') # لا يمكن نقل الملف إلى القرص E: Traceback (most recent call last): File "<stdin>", line 1, in <module> OSError: [Errno 18] Invalid cross-device link: 'test.txt' -> '/mnt/e/test.txt' >>> os.rename('test.txt', '/mnt/d/test.txt') # بينما سيعمل الكود إذا نقلنا الملف إلى مكان آخر ضمن نفس نظام الملفات >>> يمكنك أن تستعمل التابع shutil.move لهذه العملية، على النحو التالي:
    >>> import os, shutil >>> os.getcwd() '/mnt/d/temp' >>> shutil.move('test.txt', '/mnt/e/test.txt') '/mnt/e/test.txt' >>> ملاحظة: التابع shutil.move سوف يُظهر نفس الخطأ كذلك إن كنت تستعمل Python 2، بينما إذا كنت تستعمل Python 3 فسوف يعمل كل شيء على ما يرام، ولحل المشكلة بالنسبة لـ Python 2 فيمكنك نسخ الملف عبر التابع shutil.copy ثم حذف الملف الأصلي عبر التابع os.remove
×
×
  • أضف...