لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 03/18/21 في كل الموقع
-
إن تنفيذ ذلك بشكل أمثلي وفق التوثيق الرسمي للارافيل يتم عن طريق أحداث Eloquent Events، فيمكنك استخدام الحدث deleting وتنفيذ أي كود مرافق لعملية الحذف كالتالي: class User extends Eloquent { public function photos() { return $this->has_many('Photo'); } public static function boot() { parent::boot(); static::deleting(function($user) { $user->photos()->delete(); // تنفيذ العمليات هنا }); } } بحيث يتم استدعاء التابع قبل عملية الحذف ويتم حذف جميع البيانات المرتبطة بهذا المستخدم. من الأفضل أيضاً استخدام التناقلات transactions ووضع كامل العملية بداخلها لضمان حماية العملية وارتباط عمليات الحذف مع بعضها في حال حدوث أي خطأ. وبهذه الحالة تستطيع أيضاً في المستقبل إجراء أي تعديل على آلية الحذف دون أن يؤثر ذلك على بنية قاعدة البيانات أو الجداول والبيانات الموجودة فيها.2 نقاط
-
أحاول إنشاء صفحة تقرير تعرض تقارير من تاريخ محدد إلى تاريخ محدد. هذا هو الكود الحالي الخاص بي: $now = date('Y-m-d'); $reservations = Reservation::where('reservation_from', $now)->get(); ما يفعله هذا في لغة SQL العادية: select * from table where reservation_from = $now لكن ما أريده هو: SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to كيف يُمكنني عمل ذلك في لارافيل؟2 نقاط
-
يُمكنك إستخدام التالي للتحقق من أن المجموعة ليست فارغة: if ($result->isNotEmpty()) { // التحقق من أن المجموعة ليست فارغة // } // أو if (!$result->isEmpty()) { // التحقق من أن المجموعة ليست فارغة // } او التالي لحساب أو إرجاعة عناصر المجموعة: $result->count(); أما إن كنت تستخدم الترقيم و إرجاع النتائج على شكل صفحات: $result->total();2 نقاط
-
"أريد تعلم البرمجة لكنني لا أعرف من أين أبدأ!" هذه هي أكثر عبارة تتردد على سمعي من حديثي العهد بالبرمجة، إذ يأتيني هذا السؤال مرارًا وتكرارًا؛ وفي كل مرة أحاول أن أجيب عنه في سياقه، أجد أنني أضيف معلومات جديدة على إجاباتي السابقة، لذا قررت كتابة هذا المقال بعنوان "تعلم البرمجة" لعله يفيد الراغبين في تعلم تطوير التطبيقات في بدء رحلتهم مع تعلم البرمجة من الصفر. جدول المحتويات حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة، سنذكر هنا جدول المحتويات باختصار: ما هي البرمجة؟ لماذا تتعلم البرمجة؟ ما عليك معرفته لتصبح مبرمجًا الأدوات اللازمة للبدء في تعلم البرمجة لماذا هناك العديد من لغات البرمجة؟ مفاهيم البرمجة مصادر تعلم البرمجة تطوير واجهات المستخدم تطوير الواجهات الخلفية تعلم تطوير تطبيقات الجوال تطوير الألعاب تطوير الأنظمة المدمجة تطوير تطبيقات سطح المكتب كيفية اختيار لغة البرمجة التي تناسبك نصائح لتعلم البرمجة ما هي البرمجة؟ البرمجة هي عملية تقسيم مهمة معينة يراد تنفيذها عبر الحاسوب إلى أجزاء صغيرة ومترابطة وقابلة للتنفيذ بأوامر بسيطة. بعد ذلك، تجري كتابة هذه الأوامر والتعليمات بإحدى لغات البرمجة، والتي هي وسيلة للتخاطب مع الحاسوب. إليك المثال العملي التالي الذي يشرح ماهية البرمجة: إن كنت تتوقع زيارة صديق لك اليوم، واتصل بك ليقول لك: "أنا واقف بجانب الحديقة ولا أعرف كيف أصل إلى منزلك". أنت عادةً تمر كل يوم من جانب الحديقة وتعرف الطريق بينها وبين منزلك شبرًا بشبر. برأيك هل ينفع إن قلت له: "منزلي معروف وقريب من الحديقة وأنا كل يوم أمر من جانبها"؟ لا، بالتأكيد. تحتاج إلى أن تقسِّم المشكلة إلى أجزاء تمثل خطوات بسيطة يستطيع صديقك فهمها وتنفيذها. مثلًا، أخبره أن ينفذ الأوامر التالية: "سر إلى الأمام عشرة أمتار" ثم "اتجه إلى اليمين" ثم "سر إلى نهاية الشارع" ثم "اتجه إلى اليسار". أخبره بعد ذلك: "عُدَّ الأبنية الموجودة على اليسار حتى تصل إلى البناء الرابع" ثم "اصعد إلى الطابق الثاني" ثم "اطرق على الباب الذي سيظهر أمامك". مبارك! بهذه الطريقة، تستطيع أن تدل صديقك على منزلك بدقة. البرمجة هي الشيء نفسه تمامًا. فهل ترى التعابير المكتوبة بين علامتي الاقتباس؟ إنها التعابير التي تكتب بإحدى لغات البرمجة والتي تخاطب الحاسوب بدلًا من صديقك السابق. لغات البرمجة هي مجموعة من المفردات والقواعد اللغوية التي تشكل لغةً وسيطةً للتخاطب مع الحاسوب وأمره بتنفيذ تعليمات وأشياء محدَّدة. فلا الحاسوب يفهم لغة البشر ولا البشر يفهمون لغة الحاسوب، لذا كان هنالك حاجة ملحة لوجود لغة وسيطة يفهمها كلاهما؛ نتيجةً لذلك، انبثق مفهوم لغة البرمجة. بعبارة أخرى، لو أردنا أن نقول للحاسوب "افعل كذا"، فسنحتاج إلى لغةٍ مشتركةٍ بيننا وبينه ليفهم ما نبتغيه، وهنا يأتي دور لغات البرمجة، إذ يمكنك أن تعدّ لغات البرمجة على أنها وسيط بين المبرمج والحاسوب. يهتم المبرمج بالتفكير في تسلسل الخطوات التي على الحاسوب القيام بها لإتمام العمل المطلوب منه (مثل حساب العمر اعتمادًا على تاريخ الولادة)، ثم كتابة هذه الخطوات بترتيب منطقي بإحدى لغات البرمجة. ربما لاحظتَ في الجملة السابقة أن جزءًا من مهمة المبرمج هو التفكير المنطقي، وهذا يجعلنا ننتقل إلى السؤال الشائع "هل أستطيع تعلم البرمجة وأصبح مبرمجًا؟" أو "هل أنا مؤهل لأصبح مبرمجًا؟". لماذا تتعلم البرمجة؟ يبدو أن تعلم البرمجة من الصفر ليس بالصعوبة التي توقعتها، لكنك تريد حافزًا يجعلك تتعلم البرمجة. تسمع كثيرًا أن البرمجة هي مجال المستقبل، وأن وظائف المبرمجين ستكتسح مجال التوظيف في السنوات القادمة؟ أستطيع أن أؤكد لك ذلك، كما أنَّ وظائف البرمجة هي من أعلى الوظائف دخلًا. فلو كنت تريد بدء مشوارك الاحترافي وتريد عملًا مستقرًا وذا دخلٍ ممتاز، فإن تعلم البرمجة والعمل بها هو أفضل خيارٍ أمامك. وظائف البرمجة مريحة عمومًا، فالعمل كله مكتبي أمام حاسوب في بيئة مريحة ومناسبة، وأغلبية الشركات تتبع نظام العمل 40 ساعة في الأسبوع (أي 5 أيام لمدة 8 ساعات يوميًا)، ولا تغفل عن قدرتك على العمل عن بعد من خلال الانترنت أو كمستقل في أوقات فراغك. تعلم البرمجة سيوسع أفق تفكيرك كثيرًا، خصوصًا أن تعاملك مع الحاسوب يتبع إلى التفكير المنطقي، وستجد أن البرمجة ستسهل لك القيام بأمور أخرى في الحاسوب. ما عليك معرفته لتصبح مبرمجًا يتردد الكثيرون في تعلم البرمجة متذرعين بأن مستواهم في الرياضيات ليس ممتازًا، وهذا ليس صحيحًا، فصحيحٌ أنَّ هنالك أمور تعترضك أثناء أداء عملك كمبرمج تتطلب خبرة في الرياضيات، إلا أنَّه قد تمر عليك فترات طويلة لا تحتاج فيها إلى مسائل رياضية. كل ما يلزمك للبدء في تعلم البرمجة هو الأساسيات التي يعرفها الجميع. إلى حين اعتراضك أية مسألة أو مشكلة تتطلب مهارة في الرياضيات، هنالك الكثير من المصادر والمراجع التي تستطيع الرجوع إليها آنذاك. بعبارة أخرى، أجِّل هذا الأمر قليلًا ولا تخف. الأهم من ذلك هو أن تكون قادرًا على التفكير بشكل منطقي. التفكير المنطقي التفكير المنطقي هو المهارة التي تجمع كافة المبرمجين تحت مظلة واحدة، وهي أساس كتابة الخوارزميات، إذ يجب أن تكون قادرًا على اكتساب هذه المهارة وتطويرها. الخوارزميات كلمة "الخوارزميات" هي الكلمة المرعبة التي ينفر منها البعض، فكل ما يتخيلونه عند ذكرها هو الرياضيات المعقدة والمعادلات الطويلة والرموز العجيبة، لكن الأمر بسيط جدًا؛ فالخوازرميات هي تطبيقٌ للتفكير المنطقي في خطوات متسلسلة واضحة تمامًا لحل مشكلة ما. لكي أوضِّح لك أن الخوارزميات ليست أمرًا معقدًا، سأخبرك بكيفية كتابة برنامج يسأل المستخدم عن سنة ميلاده، ثم يعيد عمره الحالي بالسنوات. الخطوة الأولى: إظهار رسالة نصية نطلب فيها من المستخدم إدخال تاريخ ميلاده. الخطوة الثانية: تخزين سنة الميلاد التي أدخلها المستخدم. الخطوة الثالثة: الحصول على السنة الحالية. الخطوة الرابعة: طرح مدخلات المستخدم من السنة الحالية. الخطوة الخامسة والأخيرة: إظهار الناتج. ما سبق هو خوارزمية بسيطة تتألف من خطوات متسلسلة، لكن إذا أمعنّا النظر فيها سنجد خللًا في حال أدخل المستخدم تاريخًا أكبر من التاريخ الحالي، أي لو أدخل 2050 مثلًا بدلًا من 1995. عندها سيصبح العمر المعاد من الخوارزمية سالبًا، ويمكننا أن نحل هذه الإشكالية منطقيًا بوضع شرط يمنع المستخدم من إدخال تاريخ أكبر من التاريخ الحالي. إطارات العمل كلمة أخرى شائعة جدًا في عالم البرمجة هي "إطارات العمل" frameworks، إطارات العمل هي مجموعة من الشيفرات البرمجية التي تسهل على المبرمج إنشاء التطبيقات، بتوفير وحدات جاهزة تقدم خدمات متنوعة مثل تسجيل المستخدمين، وإرسال البريد الإلكتروني، والتعامل مع قواعد البيانات. أي يمكنك أن تعدّها أدوات برمجية تساعدك في برمجة تطبيقك وتسهِّل لك فعل ذلك. الأدوات اللازمة للبدء في تعلم البرمجة تحتاج إلى حاسوبٍ بمواصفات جيدة (ليس من الضروري أن يكون من أفضل الحواسيب، وإنما أن يمتلك مقدارًا جيدًا من الذاكرة العشوائية). لا ننصح بمواصفات معينة أو نظام تشغيل معين، استعمل ما يحلو لك وما ترى نفسك معتادًا عليه (سواءً كان ويندوز أو لينكس أو ماك). ستحتاج أيضًا إلى اتصالٍ جيد بالإنترنت للوصول إلى المواد التعليمية، ولتنزيل البرمجيات والمكتبات اللازمة للتطوير. أما بخصوص أدوات التطوير، فستحتاج إلى برمجية لكتابة الشيفرات، وهنالك نوعان رئيسيان لها: المحررات النصية: مثل Visual Studio Code أو Atom أو Sublime Text أو Bracktes أو Notepad++. وهذه المحررات النصية تكون بسيطة في أغلبها، وتوفر ميزات أساسية مثل تلوين الشيفرات، وبعض ميزات الإكمال التلقائي، وتدعم أغلبيتها إضافات لزيادة وظائفها. وظيفة هذه المحررات النصية عمومًا هي تعديل الشيفرات بسهولة وسرعة. ننصحك بتجربة Visual Studio Code لشهرته حاليًا وكثرة إضافاته ودعمه الممتاز من شركة Microsoft. بيئات التطوير المدمجة: مثل Visual Studio و Eclipse و Android Studio و NetBeans و Apple Xcode وغيرها. وهذه البيئات توفر ميزات أكثر بكثير من المحررات النصية، مثل تشغيل الشيفرات وتنقيحها (debugging) وميزات التحكم بالإصدارات (version control) والاتصال بقواعد البيانات وخلاف ذلك. لماذا هناك العديد من لغات البرمجة؟ قد تتساءل، لماذا هناك العديد من لغات البرمجة؟ أليست هذه اللغات كلها تنفذ الهدف ذاته؟ لماذا لا يكون هنالك لغة موحدة بين المبرمجين والحاسوب؟ الحقيقة أنّه توجد لغة برمجة واحدة ولكن ليست إحدى اللغات التي تراها أمامك في الصورة. اللغة التي نشير إليها هي لغة الآلة التي يستطيع معالج الحاسوب قراءتها وفهمها. أتتساءل ما هي لغة الآلة وكيف تبدو؟ إليك مقطعًا منها: معلومٌ أنّ معالج الحاسوب لا يفهم شيئًا سوى الأصفار والواحدات، وهذه اللغة -أي لغة الآلة- هي تمثيل للأصفار والواحدات بطريقة تخبر الحاسوب بما يجب عليه فعله. الجدير بالذكر أن هذه اللغة عصية الفهم على البشر، وحتى إن استطعت كتابة شيفرة مثل الشيفرة الموضحة بالصورة (كما في السنوات الأولى من بداية اختراع الحاسوب)، لن يفهمها الآخرون ولن يستطيع أحد التعديل على الشيفرة وتطويرها لاحقًا باستثنائك. سعيًا لإيجاد لغة قريبة من لغة البشر، انقسمت لغات البرمجية إلى قسمين: لغات البرمجة منخفضة المستوى، ولغات البرمجة عالية المستوى وذلك تبعًا لمدى قربها من لغة الآلة أو لغة البشر على التوالي. أي أنّ لغات البرمجة منخفضة المستوى هي اللغات الأقرب للغة الآلة آنفة الذكر مثل لغة التجميع Assembly language، ولغات البرمجة عالية المستوى هي اللغات الأقرب للغة البشر مثل لغة بايثون وجافا. تنفيذ البرامج المكتوبة بلغات برمجة عالية المستوى يقودنا الحديث عن اللغات عالية المستوى واللغات منخفضة المستوى إلى الحديث عن كيفية تنفيذ المعالج للشيفرة المكتوبة بلغة عالية المستوى لا يفهمها المعالج (أليس هذا ما تفكر به الآن؟). عرفنا أن المعالج يفهم الأوامر والتعليمات المكتوبة بلغة منخفضة المستوى (لغة الآلة)، فمَثَلُ هذه العملية كمَثَلِ شخصٍ أجنبي تعلم اللغة العربية وبدأ التحدث مع ناطقٍ باللغة العربية، إذ يمكن لهما التواصل مباشرةً - ليخبر كل منها ما يريد من الآخر فعله - دون وسيط. أمَّا مَثَلُ كتابة برنامج بلغة عالية المستوى أقرب إلى لغة البشر والطلب من الحاسوب تنفيذه كمثل ناطق باللغة الهندية يريد التخاطب مع ناطق باللغة العربية دون أن يفقه أحدهما لغة الآخر. في هذه الحالة، لن يستطيع أحدهما فهم ما يتكلم به الآخر وستفشل عملية التواصل. قد تقول: لماذا لا يحضران مترجمًا يترجم ما يقوله كل منها للآخر؟ حسنًا، هذا ما يحصل تمامًا عندما يراد تنفيذ برنامج بلغة لا يفهمها معالج الحاسوب. في اللغات البشرية، هنالك نوع واحد من المترجمين يعرفه الجميع للترجمة من لغة إلى آخرى؛ أما في لغات البرمجة، هنالك نوعان من المترجمين بين اللغات هما: المفسر interpreter، والمترجم compiler. بناءً على ذلك، تنقسم لغات البرمجة إلى لغات مفسرة ولغات مترجمة. (من الآن وصاعدًا، كلما ذكرنا لغات البرمجة، فنحن نشير إلى لغات البرمجة عالية المستوى.) -المفسر (interpreter): وهو برنامج خاصٌ يفسِّر الشيفرة المصدرية لبرنامج مكتوب بلغة عالية المستوى سطرًا بسطر ويحولها إلى لغة منخفضة المستوى لينفذها الحاسوب مباشرةً. -المترجم (compiler): وهو برنامج خاصٌ يحوِّل الملفات المصدرية لبرنامج مكتوب بلغة عالية المستوى إلى ملف تنفيذي مكتوب بلغة الآلة دفعةً واحدةً، ثم يمكن تشغيل الملف التنفيذي على الحاسوب للقيام بالمهمة المطلوبة. لماذا يوجد الكثير من لغات البرمجة عالية المستوى؟ الآن وبعد أن عرفت الفرق بين لغة الآلة ولغة البشر، لربّما ما زلت تتساءل عن كثرة اللغات البرمجية عالية المستوى المتوافرة وعدم وجود لغة واحدة. نستطيع القول أنك خطوت خطوةً جيدةً للأمام إذ أصبحت الآن أكثر دقة. جواب سؤلك هو أنّ كل لغات البرمجة تُستخدم لتحويل فكرة منطقية إلى سلسلة أوامر يمكن للحاسوب أن ينفذها. فعلى سبيل المثال لا الحصر يمكنك استخدام أي من Ruby أو Java أو Python أو C# أو Go أو JavaScript لبناء موقع ويب. لكن يمكنك أن تعدّ لغات البرمجة على أنها أدوات، وكل أداة تسهّل مهمة دونًا عن أخرى. فعلى سبيل المثال، السيارة والحافلة والدراجة والمحراث الزراعي كلها وسائط نقل، لكنها مختلفة الاستخدام؛ فلا يمكنك أن تذهب وعائلتك لقضاء إجازة صيفية مستخدمين المحراث الزراعي، كما لا يمكنك استخدام سيارة سباق في مدينة مكتظة ذات شوارع ضيقة للذهاب بها إلى العمل. مع أن آلية عمل هذه المركبات متشابهة. والأمر سيانٌ بالنسبة إلى البرمجة. خلاصة القول أنّ هنالك لغات برمجة متخصصة بإنشاء تطبيقات سطح المكتب، وأخرى متخصصة بإنشاء تطبيقات الجوال، وأخرى تستعمل خصيصًا لمواقع الويب، وأخرى لبرمجة العتاد، وهذا ما يحيلنا إلى الحديث عن مجالات البرمجة واللغات الأنسب لكلٍ منها. مفاهيم البرمجة "حسنًا، اقتنعتُ أن البرمجة مناسبة لي وليست صعبة كما كنتُ أتخيل، من أين أبدأ طريقي في تعلم البرمجة إذًا؟" قبل الإجابة عن السؤال السابق، سآخذ وقتي لأشرح لك بعض المفاهيم الخاصة بالبرمجة، ثم سنتحدث عن مجالات العمل فيها وما المسار الأفضل لتعلمك كلًا منها. أنت تعلم أن البرنامج هو سلسلة أوامر ينفذها الحاسوب لحل مشكلة ما، والبرنامج نفسه مكتوب بلغة يفهمها الحاسوب تسمى لغة الآلة. من الأمور الملحوظة التركيز كثيرًا على لغة البرمجة ذاتها أثناء بداية تعلم البرمجة. سأخبرك حقيقةً صادمةً: "لغة البرمجة التي تستعملها ليست بتلك الأهمية التي تتوقعها"، أنا لا أقول لك أن جميع لغات البرمجة متماثلة أو تُستعمل لنفس الاستعمالات، لكن لا تركِّز كثيرًا على تعلم كيفية الكتابة في لغة برمجة ما وتهمل المفاهيم البرمجية التي تقف وراءها. المتغيرات والثوابت عليك أن تتعرف على مفهوم المتغيرات variables المستعمل في جميع لغات البرمجة، والذي يعني إسناد قيمة ما إلى رمز أو كلمة وتخزين هذه القيمة في الذاكرة. فلو أردنا أن نخزن العبارة "Hello World" في متغير ما فنكتب شيئًا شبيهًا بما يلي: var variable_name = "Hello World"; أي أننا نسند الجزء الموجود على يمين إشارة المساواة إلى المتغير المذكور على يسار إشارة المساواة. يمكننا أن نستنتج من اسم "المتغيرات" أن قيمتها قابلة للتغيير خلال تنفيذ البرنامج، فيمكننا في مكانٍ ما من الملف المصدري أن نعيد تعريف المتغير السابق بكتابة: var variable_name = "New value"; أما الثوابت فهي تتشابه مع المتغيرات في كثيرٍ من النواحي، إلا أنك لا تستطيع إعادة تعريف قيمتها بعد تعريفها أول مرة. قد تستفيد من الثوابت عندما تكون متأكدًا تمامًا من عدم تغيير القيمة خلال فترة تنفيذ البرنامج. فلو أردنا تعريف ثابت اسمه pi يحتوي على القيمة 3.14 (والتي سنعرف أنها لن تتغير مطلقًا)، فيمكننا أن نكتب: const pi = 3.14; وإذا حاولتَ تغيير قيمة الثابت بعد تعريفه فستحصل على رسالة خطأ. الشروط تدعم جميع لغات البرمجة تعريف شروط تُنفَّذ في حالات معينة. ففي الخوازرمية السابقة التي شرحنا فيها حساب العمر، يمكننا أن نكتب الشرط بالعربية كما يلي: إذا كان (تاريخ الميلاد أكبر من التاريخ الحالي): نقول للمستخدم أن هنالك خطأ وإلا: سنحسب العمر بطرح تاريخ الميلاد من التاريخ الحالي وإذا أردنا كتابتها بإحدى لغات البرمجة فستبدو شبيهةً بما يلي: if ( user_birth > current_year ) { // ERROR! } else { age = current_year - user_birth; } لا تلقِ للأقواس بالًا، فهي جزء من لغة البرمجة، وقد تختلف من لغة لأخرى، وليست موضع اهتمامنا حاليًا. حلقات التكرار ماذا لو كانت لدينا قاعدة بيانات فيها أكثر من مستخدم ولكل مستخدم تاريخ ميلاد. لا تقل لي سنأخذ التواريخ يدويًا وندخلها إلى البرنامج! هذا مضيعةٌ للوقت، والصواب هو إنشاء حلقة تكرار تأخذ قيمة تاريخ الميلاد الخاص بكل مستخدم ثم تحسب عمره كما أسلفنا في القسم السابق. دعنا نعدل الخوارزمية البسيطة لنضيف تكرارًا فيها: ما أجمل البرمجة! تخيل لو كان عندك ألف مستخدم، وكان عليك حساب أعمارهم، يمكنك بضغطة زر أن تحسبها كلها. الدوال الدالة function هي مجموعة من التعليمات البرمجية التي تقبل مدخلات وتعيد القيمة المطلوبة. تكون الدوال عادةً قصيرةً وتقوم بمهمة وحيدة فقط. فمثلًا لو أردنا تعريف دالة باسم divide تقبل عددين، وتعيد ناتج قسمة العدد الكبير على الصغير، فيمكننا أن نكتب الخورزمية الآتية: مصادر تعلم البرمجة للمبتدئين أول ما سيتبادر إلى ذهنك بعد قرارك تعلم البرمجة هو من أين سأتعلم؟ هنا يأتي دور القسم التعليمي المتكامل في حسوب ليقدم للمبتدئ (والمحترف على حدٍ سواء) محتوى علمي مميز ومبسط. تزخر أكاديمية حسوب بالمحتوى المفيد عن تعلم البرمجة للمبتدئين وحتى الخبراء أي على كافة المستويات، ستجد فيها أقسامًا تشرح لغات البرمجة وتقنياتها كلها. ولدينا قسم للأسئلة البرمجية التي يمكنك أن تطرح فيه سؤالك وسيجيب عليه أحد أفراد مجتمع أكاديمية حسوب. أضف إلى ذلك أن الأكاديمية توفر قسمًا للدورات المتخصصة التي تبدأ معك من الصفر وحتى احتراف لغة البرمجة التي تريد تعلمها مع كادر من المدربين المختصين الذي يقدمون لك المساعدة ويجيبون عن جميع استفساراتك. وهنالك قناة للأكاديمية على يوتيوب ننشر فيها دوريًا دروسًا قصيرةً عن تساؤلات محددة ومفاهيم البرمجة وخلافه. لا تنسَ الاشتراك في قناة الأكاديمية لتصلك الفيديوهات الجديدة. ماذا لو أردتَ التعمق أكثر في لغة معيّنة؟ تأتي هنا موسوعة حسوب التي توفِّر توثيقًا عربيًا كاملًا وعالي الجودة، مدعّمًا بالأمثلة لمختلف لغات البرمجة وتقنيات تطوير الويب والجوال. ستكون الموسوعة مرجعًا تعود إليه في مسيرتك البرمجية، وتستعين بها لمعرفة التفاصيل الدقيقة عن لغات البرمجة. فأنت لست مضطرًا لحفظ كل شيء في لغة البرمجة، إذ حتى المبرمجون المختصون ذوو الخبرة يعودون إلى التوثيقات بين الفينة والأخرى أثناء عملهم. لننطلق الآن للتحدث عن مجالات البرمجة الأساسية وما اللغات والتقنيات المستعملة فيها. تطوير واجهات المستخدم يبدأ أغلبية المطورين مشوارهم من خلال تعلم تطوير واجهات المستخدم عند اتخاذ قرارهم لدخول مجال تطوير وبرمجة مواقع الويب، وذلك لسهولة اللغات المستعملة في هذا المجال. هدف هذا المجال هو تطوير صفحات الويب التي تعرض محتوى مختلف مواقع الويب، وهي الصفحات التي تراها عند زيارتك لموقع أكاديمية حسوب أو موسوعة حسوب أو مستقل أو أي موقع آخر. تتألف صفحة الويب من مجموعة من المكونات، وتُكتَب هذه المكونات باستخدام لغة HTML، وبعد كتابة البنية الهيكلية للصفحة سنأتي على تنسيقها باستخدام لغة CSS، وهي اللغة المستعملة لإضفاء شكل وهيئة على عناصر HTML. أي أن عناصر HTML تصف محتوى الصفحة (مثل الترويسات والقوائم والمحتوى الرئيسي والفقرات والروابط والصور والفيدوهات)، وقواعد CSS تُعرِّف كيف يجب أن تبدو هذه العناصر (سواءً من ناحية الألوان أو المساحات أو الخلفيات أو الخطوط أو خلاف ذلك). تأتي لغة JavaScript مكملةً لهما وتستعمل لإعطاء بعض عناصر الصفحة صفاتٍ تفاعلية، مثل شريط متحرك من الصور أو قوائم تظهر عند وقوع حدث معيّن …إلخ. هنالك تقنيات كثيرة تستعمل في تسهيل إنشاء الواجهات الأمامية وسنذكر بعضها: إطار Bootstrap لتسهيل تنسيق عناصر الصفحة. مكتبة jQuery لتسهيل التعامل مع عناصر الصفحة باستخدام JavaScript. مكتبة React JS: لتسهيل تطوير واجهات المستخدم بالاعتماد على مكونات قابلة لإعادة الاستخدام. لغة Sass لإنشاء ملفات CSS بسرعة وسلاسة. أدوات بناء مثل Webpack الذي يسهِّل تحويل الملفات المصدرية للتطبيق إلى النسخة النهائية التي ستعرَض للمستخدم. لتعلم تطوير واجهات المستخدم، ننصحك بالتسجيل في دورة تطوير واجهات المستخدم المقدمة من أكاديمية حسوب، والتي تحتوي على أكثر من 72 ساعة فيديو تتوزع على ثمانية مسارات تعليمية تشرح أمثلة عملية تطبيقية شرحًا مفصلًا. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب لتتعرف على توثيق لغات البرمجة المذكورة، وذلك للاطلاع على تفاصيل وأمثلة أكثر عن كل جزئية من الجزئيات المشروحة في دورة تطوير واجهات المستخدم. اللغات والتقنيات المستخدمة في تطوير واجهات المستخدم: HTML و CSS و JavaScript و Bootstrap و Sass و jQuery و Webpack. تطوير الواجهات الخلفية قد تتساءل: ماذا يعني تطوير الواجهات الخلفية (backend)؟ وما الفرق بينه وبين تطوير واجهات المستخدم (frontend)؟ الفرق بينهما هو أن الواجهات الخلفية هي البرمجيات التي تُنفَّذ على الخوادم وتجري عمليات عليها مثل التعامل مع قواعد البيانات والملفات والخدمات الخارجية، أما واجهات المستخدم فهي الصفحات التي تظهر على شاشة الزائر في متصفحه. سأطرح عليك الخيارات المتاحة أمامك للبدء في مجال تطوير الواجهات الخلفية، وجميع اللغات المذكورة هنا هي لغات ناجحة وقوية ولا يهم أي لغة تختار منها، المهم أن تتطلع على شيفرات بسيطة من كل لغة وتتخذ قرار تعلمها، واحذر من تضييع وقتك في التنقل بين لغات البرمجة والبحث عن أفضلها، فكلُ لغةٍ ممتازةٌ في مجالها. تعلم البرمجة باستخدام لغة PHP بعد تبيان الفرق بين واجهات المستخدم والواجهات الخلفية، يمكن القول بأن أشهر لغة لتطوير الواجهات الخلفية هي لغة PHP، وتتفوق على اللغات المنافسة لها أضعافًا مضاعفة. تعلم البرمجة بلغة PHP أمر سلس، فهي لغة سهلة التعلم وبسيطة الشكل، والمجتمع حولها كبير وتطويرها مستمر. هذه اللغة هي خيار استراتيجي لمن يريد الدخول إلى مجال تطوير الواجهات الخلفية. هنالك عدد من البرمجيات المكتوبة بلغة PHP مثل ووردبريس WordPress ودروبال Drupal وميدياويكي MediaWiki (التي تشغِّل ويكيبيديا وموسوعة حسوب) وغيرها الكثير؛ إضافةً إلى عددٍ كبير من إطارات العمل مثل Laravel و CodeIgniter و Symfony و CakePHP و Yii وغيرها، وهذا ما يدل على إمكانيات اللغة الكبيرة والمجتمع الكبير الذي يحيط بها. لتعلم تطوير الواجهات الخلفية باستخدام PHP، ننصحك بالتسجيل في دورة تطوير تطبيقات الويب باستخدام PHP المقدمة من أكاديمية حسوب، والتي تحتوي على 75 ساعة فيديو تتوزع على اثني عشر مسارًا تعليميًا تبدأ بأساسيات لغة البرمجة PHP للمبتدئين، مرورًا بشرح أمثلة عملية تطبيقية بالتفصيل، ووصولًا لتطوير التطبيقات باستخدام إطار العمل Laravel، وشرح تطوير ووردبريس. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة PHP وإطار العمل Laravel. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام PHP هي: PHP و Laravel وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم البرمجة باستخدام لغة روبي - Ruby إذا كنتَ تبحث عن لغةٍ أنيقة وسهلة الاستعمال فستجد ضالتك في لغة روبي Ruby فهي من أجمل اللغات وأسلسها كتابةً، وهي لغة برمجة عامة يمكن استخدامها لتطوير مختلف أنواع التطبيقات ومن ضمنها تطوير تطبيقات الويب. ذاع صيت روبي في تطوير الويب بعد نشر إطار العمل Ruby on Rails (يشار إليه اختصارًا "ريلز"). هنالك إطارات عمل أخرى مثل سيناترا Sinatra لكن يبقى ريلز أشهرها. لتعلم تطوير الواجهات الخلفية باستخدام روبي، ننصحك بالتسجيل في دورة تطوير تطبيقات الويب باستخدام روبي المقدمة من أكاديمية حسوب، والتي تحتوي على 20 ساعة فيديو تتوزع على أربعة مسارات تعليمية تشرح أمثلة عملية تطبيقية شرحًا مفصلًا، وتشرح تطوير التطبيقات باستخدام إطار العمل ريلز. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة روبي وإطار العمل ريلز. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام روبي: روبي و ريلز وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم البرمجة باستخدام لغة جافا سكربت - JavaScript نعم! تستعمل JavaScript في تطوير الواجهات الخلفية أيضًا. الفضل يعود لبيئة Node.js التي تسمح للمطورين باستخدام JavaScript لكتابة برمجيات تعمل من جهة الخادم وذلك لتوليد صفحات ويب ديناميكية قبل إرسالها إلى المتصفح، وتستطيع Node.js التعامل مع الملفات وقواعد البيانات ومختلف أنظمة الشبكات وخدمات أنظمة التشغيل. هل يوجد أجمل من استخدام نفس اللغة لبرمجة الواجهات الأمامية لمواقع الويب والواجهات الخلفية؟ وكل ذلك باستخدام لغة سهلة التعلم والاستعمال ومدعومة دعمًا ممتازًا من المجتمع. تعلم لغة JavaScript لتطوير الواجهات الخلفية من خلال التسجيل في دورة تطوير التطبيقات باستخدام JavaScript المقدمة من أكاديمية حسوب، والتي تحتوي على 69ساعة فيديو تتوزع على أحد عشرمسارًا تعليميًّا تشرح أمثلة عملية تطبيقية شرحًا مفصلًا، وتشرح تطوير الواجهة الخلفية باستخدام Node.js. أثناء مشاهدتك للدورة، يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة JavaScript وبيئة العمل Node.js. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام JavaScript: لغة JavaScript وبيئة Node.js وإطار العمل Express.js وقواعد البيانات (مثل MongoDB و MySQL و PostgreSQL وGraphQL وغيرها). تعلم البرمجة باستخدام لغة بايثون - Python لغة بايثون متعددة الاستعمالات، ويمكن عدّها على أنها أسهل لغة برمجة على الإطلاق، إذ تبدو شيفرتها البرمجية كأنها مقالة مكتوبة باللغة الإنكليزية. إذا أردتَ لغةً سهلةً ومدعومةً دعمًا ممتازًا ولها أطر عمل كثيرة فأنت تبحث عن لغة بايثون. الخيارات المتاحة أمامك هي إطار العمل جانغو (Django) وفلاسك (Flask) وغيرها، يمكنك تعلم لغة البرمجة بايثون لتطوير الواجهات الخلفية من خلال قراءة سلاسل المقالات عن تعلم بايثون في قسم البرمجة في أكاديمية حسوب، ثم الانتقال إلى تعلم إطار العمل جانغو أو فلاسك. يمكنك أن تعود إلى موسوعة حسوب للاطلاع على توثيق لغة بايثون. تعلم لغة بايثون لتطوير الواجهات الخلفية من خلال التسجيل في دورة تطوير التطبيقات باستخدام Python المقدمة من أكاديمية حسوب، والتي تحتوي على 69 ساعة فيديو تتوزع على عشرةمسارات تعليمية تشرح أساسيات لغة بايثون للمبتدئين، ثم تطبق عمليًا بأمثلة واقعية، وتشرح إطار العمل جانغو Django وفلاسك Flask. اللغات والتقنيات المستخدمة في تطوير تطبيقات الويب باستخدام بايثون: لغة بايثون وإطارات العمل المبنية عليها (مثل جانغو وفلاسك) وقواعد البيانات (مثل MySQL و PostgreSQL وغيرها). تعلم تطوير تطبيقات الجوال ازداد عدد تطبيقات الجوال لأنظمة أندرويد و iOS ازديادًا كبيرًا في الفترة الماضية، وأصبح لكل شركة أو خدمة تطبيق خاص بها يسهِّل على مستخدميها الوصول إلى الخدمات التي توفرها. النظامان الرئيسيان المسيطران على سوق الجوال حاليًا هما أندرويد ثم iOS. يمكن برمجة تطبيقات أندرويد بلغة Java أو Kotlin (أو غيرهما) وبرمجة تطبيقات iOS باستخدام Swift (وغيرها). ستكتشف أنَّ عليك تطوير تطبيقين منفصلين تمامًا، واحد لهواتف أندرويد وآخر لهواتف iOS، وذلك يسبب زيادةً في حجم العمل المطلوب وصعوبةً في إدارة التغييرات. بسبب ذلك، ظهر مفهوم "التطبيقات متعددة المنصات"، وهي تطبيقات تعمل على نظام أندرويد و iOS دون أي تعديلات، وذلك باستخدام تقنيات مشتركة وهي في الغالب تقنيات الويب. أي أصبح بإمكان مطوري الويب الاستفادة من معلوماتهم في تطوير تطبيقات الجوال باستخدام منصات مثل آيونيك Ionic. تسمح آيونيك Ionic للمبرمجين بالتعامل مع مختلف وظائف الجهاز باستخدام لغة JavaScript، مثل الوصول إلى الموقع الجغرافي، والتقاط صور بالكاميرا، والتعامل مع الملفات وخلاف ذلك. طوِّرت في الفترة الماضية تقنيات أخرى مبنية على JavaScript مثل React Native المبنية على مكتبة React.js والتي تسمح للمطورين بكتابة تطبيقات أصيلة باستخدام تقنيات الويب. تستطيع تعلم تطوير تطبيقات الجوال عبر Ionic وعبر React Native من خلال التسجيل في دورة تطوير التطبيقات باستخدام لغة JavaScript المقدمة من أكاديمية حسوب، والتي تحتوي على 69 ساعة فيديو تشرح أمثلة عملية تطبيقية شرحًا مفصلًا. وكالعادة يمكنك أثناء مشاهدتك للدورة أن تعود إلى موسوعة حسوب للاطلاع على التوثيقات اللازمة. اللغات والتقنيات المستخدمة في تطوير تطبيقات الجوال: Java و Swift و Kotlin و Ionic و React Native وغيرها. تطوير الألعاب تطوير الألعاب هو المجال الذي يحلم جميع مستخدمي الحاسوب بالدخول إليه. فالأغلبية تعرفوا على الحاسوب من خلال ألعاب الفيديو ومن ثم بدؤوا برحلة الاستكشاف عن البرمجة والتطوير. أغلب من يجيب عن تطوير الألعاب يقول "عليك بتعلم لغة C++" لكن دعني أفصِّل لك الأمر قليلًا. برمجة الألعاب تتطلب عملًا كثيرًا من فريق عمل كبير، مدعوم من شركة تجارية. من الصعب على مطوِّر وحيد أن ينشئ لعبة كاملة من الصفر دون فريق. تُطور أغلبية الألعاب باستخدام محرِّك ألعاب Game Engine والذي يسهِّل الأمر على المطورين ويتيح بيئة تطوير مناسبة للألعاب، ويتيح الميزات الأساسية لجميع الألعاب مثل التحكم بالكاميرا ونمذجة الشخصيات ثلاثية الأبعاد وتحريكها والأمور الفيزيائية الأخرى. هنالك عدد كبير من محركات تطوير الألعاب، ومن المرجح أنك شاهدت شعارها في الألعاب التي لعبتها من قبل، ومن أشهرها: Unreal Engine و Unity و Godot. يمكن التعامل مع هذه المحركات باستخدام عدِّة لغات، مثل C++ (وهي أشهرها)، وجافا (خصوصًا للألعاب على هواتف أندرويد) وحتى يمكن استخدام JavaScript في التعامل مع بعضها. تذكر أنّ الألعاب غير محدودة بتطبيقات سطح المكتب أو الهواتف، فهنالك ألعاب كثيرة تعمل على المتصفحات باستخدام تقنيات HTML5 و JavaScript. اللغات والتقنيات المستخدمة في تطوير الألعاب: C++ و Java و JavaScript ومحركات Unity و Unreal Engine و Godot. برمجة الذكاء الاصطناعي يُعد الذكاء الاصطناعي (AI) من المجالات الرائدة والمطلوبة بكثرة في سوق العمل اليوم، لاسيما بعد أن أصبحت تطبيقاته في متناول الجميع وبات يستخدم في العديد من المجالات فتعلمك لهذا المجال الرائد يعزز قدراتك كمبرمج ويساعد على تعزيز تطبيقاتك بقدرات الذكاء الاصطناعي القوية. يتفرع الذكاء الاصطناعي لعدة مجالات من أبرزها تعلم الآلة والتعلم العميق التي تُمكّن الحواسيب من التعلم من البيانات وتحسين أدائها بمرور الوقت دون الحاجة لبرمجة تقليدية. كي تتعلم برمجة الذكاء الاصطناعي تحتاج لامتلاك فهم جيد للبرمجة وتحليل البيانات ويمكنك استخدام لغات برمجة متعددة في هذا المجال أشهرها لغة البرمجة بايثون التي توفر الكثير من المكتبات والأطر المساعدة مثل تنسرفلو TensorFlow وكيراس Keras وبايتورش PyTorch وباندا Pandas. إذا كنت مهتمًا بتعلم هذا الاختصاص القوي فستوفر لك دورة الذكاء الاصطناعي من أكاديمية حسوب التي تحتوي على 58 ساعدة تدريبية ممتدة على ثمانية مسارات تدريبية شاملة كل ما تحتاج إليه للبدء بتطوير تطبيقات ذكاء اصطناعي قوية واكتساب مهارة في تحليل البيانات من الصفر ودون الحاجة لامتلاك معرفة مسبقة. اللغات والتقنيات المستخدمة في برمجة الذكاء الاصطناعي هي Python و MongoDB وPymongo و TensorFlow و Keras و Pandas والنماذج اللغوية الكبيرة LLMs المختلفة. تطوير الأنظمة المدمجة الأنظمة المدمجة هي أنظمة حاسوبية شبيهة بالحاسوب ولكنها لا تملك كل ميزات الحاسوب الذي تراه أمامك الآن. بعبارة أخرى، النظام المدمج هو حاسوب صغير مبرمج لأداء مهام محددة فقط ومدمج ضمن الجهاز أو البيئة المراد استخدامه فيها. أنت الآن محاط بالكثير من الأنظمة المدمجة الآن مثل جهاز مقياس مستوى المياه وجهاز التحكم بالتلفاز وجهاز إنذار الحريق وأجهزة المراقبة …إلخ. حتى إشارات المرور وتنظيم السير وألعاب الأطفال الآلية تصنَّف على أنها أنظمة مدمجة. هل سمعت أيضًا بمصطلح "إنترنت الأشياء"؟ إنترنت الأشياء هو نظام مدمج متصل بالإنترنت. نعم، بهذه البساطة! لابد الآن أن يتبادر إلى ذهنك الساعات والثلاجات والغسالات الذكية وطائرات الدرون وأنظمة المراقبة عن بعد وأنظمة البيوت الذكية، إذ كلها أمثلة على إنترنت الأشياء. كيفية برمجة الأنظمة المدمجة أشهر وأكثر لغة برمجة تستعمَل في برمجة الأنظمة المدمجة وإنترنت الأشياء هي لغة C (أي لغة سي) وكل اللغات المشتقة منها (مثل لغة أردوينو C). تُستعمَل لغة C++ كثيرًا في هذا المجال، إذ تعدُّ لغة ذات مستوى أعلى من لغة C لدعمها للبرمجة كائنية التوجه. أضف إلى ذلك أنه بدأ حديثًا استعمال لغة بايثون في برمجة تطبيقات الأنظمة المدمجة مع أنها لم ترتبط تقليديًّا بهذا المجال سابقًا. صحيح أنَّ لغة بايثون ليست بقوة لغة C و C++ في هذا المجال إلا أنها تستمد ميزاتها وفعاليتها من المكتبات الهائلة المتوافرة فيها. بعيدًا عن C وبايثون، تستعمل في مجال الأنظمة المدمجة أيضًا لغات أخرى تنضوي ضمن "لغات توصيف العتاد" (Hardware Description Languages)؛ لغتي VHDL و Verilog هما من أشهر لغات توصيف العتاد المستعملة في هذا المجال. تُستعمَل مثل هذه اللغات في برمجة "مصفوفة البوابات المنطقية القابلة للبرمجة" (FPGA أي Field Programmable Gate Array). أخيرًا، قد تجد بعض المراجع تشرح برمجة الأنظمة المدمجة بلغة أخرى تدعى "لغة التجميع" (Assembly Language) التي تصنف من اللغات منخفضة المستوى. يتطلب تعلم البرمجة باستخدام هذه اللغة فهمًا واسعًا بمعمارية وحدة التحكم المركزية والمعالج بالمجمل لأنها أقرب لغة يفهمها الحاسوب. الانتقال إلى هذه اللغة قد يكون في مستويات متقدمة من تعلمك لبرمجة الأنظمة المدمجة وتطبيقات إنترنت الأشياء. من ميزات البرمجة بهذه اللغة هي التحكم الواسع بالعتاد والمعالج الذي لا توفره لغات أخرى. يقال أن هذه اللغة صعبة بعض الشيء ومعقدة، ولكن لا أرى ذلك! قد يكون سبب قول ذلك هو أن لغة التجميع هي لغة منخفضة المستوى وأقرب شيء إلى لغة الآلة ولا يستطيع من يلقي نظرة على شيفرة مكتوبة فيها فهمها مطلقًا إن لم يعرفها. تطوير تطبيقات سطح المكتب مجال تطوير تطبيقات سطح المكتب كالمحيط الواسع؛ إن لم تملك بوصلة وتعرف إلى أين تريد الاتجاه، ستضيع فيه حتمًا. هنالك الكثير من أنظمة التشغيل أشهرها - وأكثرها سيطرةً على السوق حاليًا - هي: نظام التشغيل ويندوز، ولينكس، وماك (macOS)، ويملك كل نظام تشغيل تطبيقات مكتبية خاصة به. لذلك، يجب عليك أولًا -قبل الدخول إلى سوق برمجة تطبيقات سطح المكتب- تحديد نظام التشغيل المستهدف. أي يجب الإجابة على السؤال التالي: هل يستهدف تطبيقك نظام تشغيل محدد، أم تريد لتطبيقك أن يعمل على عدة أنظمة تشغيل في آن واحد؟! بعد تحديد نظام التشغيل المستهدف، اطلع على اللغات المفضل استعمالها في ذلك النظام لبرمجة تطبيقاته؛ فعلى سبيل المثال، اللغات C و C++ و C# و VB.NET هي الأكثر استعمالًا في برمجة تطبيقات نظام التشغيل ويندوز، واللغات C و C++ و Bash هي الأكثر استعمالًا في برمجة تطبيقات توزيعات نظام التشغيل لينكس. أمَّا نظام الشغيل ماك، فينفرد باستعمال لغة Objective-C. حسنًا، دعني أخبرك الحقيقة، كل لغة برمجة عامية الغرض يمكن استعمالها في برمجة التطبيقات، إذ أشهر اللغات التي تُدرَّس أكاديميًّا في هذا المجال هي لغة جافا (Java). لا يخفى على القارئ دخول لغة بايثون بقوة على هذا المجال نظرًا لامتلاكها الكثير من المكتبات الرائعة وسهولة صياغتها. دخلت مؤخرًا لغة جافاسكريبت على سوق برمجة تطبيقات سطح المكتب عبر إطار العمل Electron (إلكترون)، إذ توظف في هذا المجال تقنيات تطوير الويب (HTML و CSS و JavaScript …إلخ.). بدأ هذا الإطار ينتشر كالنار في الهشيم مما دفع شركات كبيرة لتطوير تطبيقات سطح المكتب الخاصة بها باستعمال هذا الإطار ومنها شركة Slack التي استعملت هذا الإطار لتطوير تطبيقها المكتبي. أعلم أنك الآن تشعر بالضياع من كثرة لغات البرمجة والتقنيات المستعملة في هذا المجال؛ معك حق، فقد أخبرتك بذلك منذ قليل. دخول هذا السوق يحتاج منك تحديد هدفك منه بالضبط. هل لديك فكرة تطبيق وتريد إنشاءه والربح منه؟ هل تريد العمل لدى شركة محددة؟ ما هي مواصفات التطبيق الذي تريد إنشاءه أو تريد العمل على تطويره؟ كل ذلك يلعب دورًا في تحديد لغة البرمجة الأنسب لك لتعلمها. في النهاية، إن تعلمت أساسيات البرمجة وأتقنت العمل على لغة برمجية محددة، سيسهل عليك الانتقال إلى لغة برمجة أخرى، إذ أغلب لغات البرمجة تشبه بعضها بعضًا من ناحية المفهوم والمضمون وتختلف بعض الشيء من ناحية الصياغة والشكل. لذلك، اطمئن من هذه الناحية. كيفية اختيار لغة البرمجة التي تناسبك يمكنك اختيار لغة البرمجة اعتمادًا على المجال الذي تحب العمل فيه، سألخص لك مسار التعلم لمختلف مجالات العمل: العمل كمطور ويب full-stack: يعني ذلك تعلم تطوير واجهات المستخدم أو الواجهات الأمامية، وتطوير الواجهات الخلفية. يمكن التخصص بمجال واحد من هذين المجالين فقط، إذ يُطلَب كثيرًا في سوق العمل مبرمجين متخصصين في واجهات المستخدم أو الواجهات الخلفية. العمل كمطور تطبيقات للهواتف المحمولة: يمكنك تعلم برمجة تطبيقات أندرويد أو iOS كلًا على حدة، أو استعمال تقنيات مثل كوردوفا لتطوير لكلا النظامين معًا. العمل كمطور تطبيقات سطح المكتب: يمكنك البدء بالتخصص في تطوير تطبيقات مكتبية لنظام تشغيل محدَّد (مثل نظام التشغيل ويندوز أو لينكس) عبر تعلم لغة البرمجة المستعملة في ذاك المجال (كما أشرنا إلى ذلك في قسم تطوير تطبيقات سطح المكتب)؛ خيار آخر هو تعلم اللغات والتقنيات التي تمكنك من تطوير تطبيقات عابرة للمنصات (تعمل على عدة أنظمة تشغيل) مثل استعمال إطار العمل Electron. العمل كمطور للأنظمة المدمجة والأنظمة الذكية: لغة C هي أساس هذا المجال، سواءً كنتَ تتعامل مع المتحكمات مباشرةً، أو تتعامل مع شريحة مثل أردوينو (والتي تمتلك لغةً مشتقةً من C). يساعدك هذا الفيديو على معرفة المعايير التي من خلالها ستتمكن من اختيار لغة البرمجة التي تتناسب مع تطلعاتك وأهدافك المستقبلية. نصائح لتعلم البرمجة مشوار تعلم البرمجة من الصفر طويل وشائق، ولكنه جميل ومسلٍ بذات الوقت، قد تصاب بالإحباط في بداية طريقك لكثرة الأمور التي عليك الإلمام بها، لذا جهزت إليك النصائح الآتية من تجربتي في البرمجة: حدد هدفك من تعلم لغة البرمجة وسوق العمل الذي تريد دخوله واجعله واقعيًا. بدون هدف، أبشرك بأنك ستتخلى عن فكرة تعلم البرمجة بعد حين. انتبه إلى أن يكون هدفك واقعيًا وقابلًا للقياس والتجزيء على مراحل. بدون ذلك، ستفشل من أول عقبة وتترك تعلم البرمجة. أعرف نفسك جيدًا ونقاط قوتك وضعفك. كلنا لديه نقاط قوة وضعف، ولكن المفلح من عمل على ترميم وتحسين نقاط ضعفه في المجال الذي يرغب بتعلمه. رشح دورة واحدة وكتابًا واحدًا وابدأ بقراءة الكتاب ومتابعة الدورة تدريجيًّا ثم انتقل بعد الانتهاء إلى دورة أخرى وكتاب آخر، إذ سيجنبك ذلك التشتت بين الدورات الكثيرة والكتب العديدة. الشيء الذي أفعله قبل بداية تعلم شيء جديد هو ترشيح قائمة من عدة كتب ودورات ثم ترتيب هذه الكتب والدورات بحسب جودتها ومدى بساطتها وتعقيدها. أرقم الكتب والدورات وأبدأ بالخيار الأول منها. أحدد الوقت التقريبي الذي يأخذه كل خيار لدراسته وأجدول الخيارات البقية على رزنامتي الخاصة. لا تأخذ العلم إلا ممن تثق بعلمه، فالكثير من المبتدئين يحاولون مساعدة غيرهم وقد يضعون معلومات مغلوطة دون قصد. طبق ما تعلمته مباشرة، وأنشئ أي شيء من كل أمر جديد تتعلمه حتى لو كان رسمة بسيطة أو شيفرة من عدة أسطر فقط. فرحة إنجاز شيء مما تعلمته تدفعك لتعلم المزيد والاستمرار في طلب العلم. نظم وقتك بورقة وقلم، حدد بداية كل أسبوع خطةً لسائره والتزم بتنفيذها. أخبر أصدقائك أن لديك التزامات وأمور مهمة عليك إنجازها. خصص وقتًا للاستراحة بالطبع ولا تنسَ نصيبك منها. في نهاية كل أسبوع، وازن مدى الإنجاز الذي حققته ومدى تطبيق الخطة التي وضعها وحاول أن تصل النسبة إلى 100%. أنصحك بقراءة ومتابعة استراتيجيات تنظيم الوقت ورفع الإنتاجية. تمرس على حل المشكلات وتحدى نفسك باستمرار وتابع المسابقات البرمجية واشترك بها إن استطعت، أنصحك بقراءة مقالة حل المشكلات وأهميتها في احتراف البرمجة بعد هذه المقالة. لا تنسَ أن تكافئ نفسك في كل مرة تنهي فيها كتابًا أو تكمل العمل على مشروع. لا تنسَ حظك من الاستراحة، لأن طريق البرمجة قد يكون له بداية ولكن النهاية بعيدة ومتعبة -مثله مثل أي مجال آخر-. في النهاية أرجو لك كل التوفيق في مشوارك البرمجي. وأرجو منك أن تشاركنا تجربتك في تعلم البرمجة، لعل غيرك يستفيد منها. اقرأ أيضًا كيف تتعلم البرمجة المدخل الشامل إلى تعلم علوم الحاسوب المرجع الشامل إلى تعلم لغة بايثون تعرف على أعلى تخصصات البرمجة أجرا تعلم لغة HTML قواعد البرمجة ما هي فوائد تعلم البرمجة؟ أسهل لغات البرمجة أهمية البرمجة1 نقطة
-
تطبيقي هو في الأساس قائمة بفلاتر filters وزر لتغيير التخطيط. في الوقت الحالي ، أستخدم ثلاثة مكونات: <list /> و <Filters /> و <TopBar /> ، عندما أقوم بتغيير الإعدادات في <Filters /> أريد تشغيل بعض الدوال الموجودة في <list /> لتحديث الواجهة، كيف يمكنني عمل ذلك؟ كيف يمكنني جعل هذه المكونات الثلاثة تتفاعل مع بعضها البعض، أو هل أحتاج إلى نوع من إدارة الحالة state management في المكون الأب لهذه المكونات الثلاثة؟1 نقطة
-
لدي بعض المكونات داخل بعضها البعض بالإضافة إلى مكون آخر منفصل عنهم، بنيه المكونات كما بالشكل التالي: - Component 1 -|- Component 2 ----|- Component 3 -------|- Component 4 - Component 5 كما تلاحظ المكون الأول يحتوي مكون بداخله وهذا الأخير يحتوي على مكون آخر Compnent 3 وهكذا ، الآن أريد أن يعرض المكون 5 بعض البيانات اعتمادًا على حالة state الخاصة بالمكون 4. نظرًا لأن الخاصيات props غير قابلة للتغيير immutable، لا يمكنني ببساطة حفظ حالتها في المكون 1 وإعادة توجيهها للمكون 5.1 نقطة
-
السلام عليكم أريد ان اعرف ما الخطأ بهذا الكود .. رسالة الخطأ كالاتى scrollToIndex out of range: request index1 but maximum is -1 مع ان هذا الخطأ لايظهر لى اذا قمت بعمل داتا عبارة عن array of objects وقمت بوضعها داخل ال FlatList فان كل شئ يعمل بطريقة صحيحة .. اما عندما اقوم بعمل fetch ل api فانه يظهر لى هذا الخطأ .. مالحل ؟؟ import React, { useState, useRef, useEffect } from "react"; import { StyleSheet, View, FlatList, Dimensions, Text, TouchableOpacity, } from "react-native"; import { AntDesign } from "@expo/vector-icons"; import axios from "axios"; const phoneWidth = Dimensions.get("screen").width; const phoneHeight = Dimensions.get("screen").height; function ScrollScreen() { const [index, setIndex] = useState(0); const [border, setBorder] = useState(0); const refContainer = useRef(); const refBox = useRef(); const [data, setData] = useState([]); useEffect(() => { photos(); }, []); function photos() { axios .get("https://jsonplaceholder.typicode.com/photos") .then(async function (response) { setData(response.data); }) .catch((err) => console.error(err)); } useEffect(() => { refContainer.current.scrollToIndex({ animated: true, index }); // تغيير على حسب قيمة ستايت }, [index]); useEffect(() => { refBox.current.scrollToIndex({ animated: true, index }); // تغيير على حسب قيمة ستايت }, [index]); const theNext = () => { if (index < photos.length - 1) { setIndex(index + 1); setBorder(index + 1); } }; const thePrevious = () => { if (index > 0) { setIndex(index - 1); setBorder(index - 1); } }; return ( <View style={styles.con}> <AntDesign style={[styles.iconConPosition, { left: phoneWidth * 0.05 }]} onPress={thePrevious} size={55} color="#0dddcb" name="caretleft" /> <AntDesign style={[styles.iconConPosition, { right: phoneWidth * 0.05 }]} onPress={theNext} size={55} color="#0dddcb" name="caretright" /> <FlatList scrollEnabled={false} ref={refContainer} data={data} // data={photos} keyExtractor={(item, index) => item.id.toString()} style={styles.flatList} renderItem={({ item, index }) => ( <View style={{ height: 150, width: phoneWidth * 0.7, margin: 50, backgroundColor: "red", alignSelf: "center", justifyContent: "center", alignItems: "center", }} > <Text>{item.id}</Text> <Text>{item.title}</Text> </View> )} horizontal pagingEnabled //تفعيل خاصية التمرير showsHorizontalScrollIndicator={false} // محدد التمرير /> <FlatList ref={refBox} data={data} // data={photos} keyExtractor={(item, index) => item.id.toString()} style={styles.flatList} renderItem={({ item, index }) => ( <TouchableOpacity onPress={() => { setIndex(index); setBorder(index); }} style={ border === index ? { height: 100, width: phoneWidth * 0.4, margin: 7, backgroundColor: "gray", alignSelf: "center", justifyContent: "center", alignItems: "center", borderWidth: 2, borderColor: "blue", } : { height: 100, width: phoneWidth * 0.4, margin: 7, backgroundColor: "gray", alignSelf: "center", justifyContent: "center", alignItems: "center", } } > <Text>{item.id}</Text> <Text>{item.title}</Text> </TouchableOpacity> )} horizontal /> <Text>{index}</Text> </View> ); } const styles = StyleSheet.create({ con: { flex: 1, alignItems: "center", backgroundColor: "#fae7ec", paddingBottom: 100, }, flatList: { flex: 1, marginVertical: phoneHeight * 0.05, }, iconConPosition: { position: "absolute", top: phoneHeight * 0.24, zIndex: 1, }, }); export default ScrollScreen;1 نقطة
-
مرحباً أحمد: الخطأ يحدث حينما تكلم ال api فقبل أن تحصل على النتيجة تكون ال data فارغة وأنت في نفس الوقت تحاول تحريك ال slider لقيمة معينة وهي index وقيمتها الإبتدائية 0 ولكن عندما يحاول البرنامج تنفيذ ال scroll للعنصر 0 أي العنصر الأول لل data فلن يجده لأن النتيجة لم ترجع بعد ولذلك يفشل البرنامج الحل : هو آن تقوم بالتحريك عندما تكون هناك data موجودة useEffect(() => { if(index >= 0 && data.length) { // الشرط هنا refContainer.current.scrollToIndex({ animated: true, index }); // تغيير على حسب قيمة ستايت } }, [index, data]); // تقوم بتنفيذ الدالة عند تغيير الداتا useEffect(() => { if(index >= 0 && data.length) { refBox.current.scrollToIndex({ animated: true, index }); // تغيير على حسب قيمة ستايت } }, [index, data]);1 نقطة
-
أحاول حذف بعض البيانات من القاعدة عن طريق استخدام Ajax: @foreach($a as $lis) //some code <a href="#" class="delete" id="{{$lis['id']}}">Delete</a> //عند الضغط على هذا الزر ستجري عملية الحذف @endforeach والكود الخاص بالعملية: $('body').on('click', '.delete', function (e) { e.preventDefault(); if (confirm('Are you sure you want to Delete?')) { var id = $(this).attr('id'); $.ajax({ method: "POST", url: "{{url()}}/delete", }).done(function( msg ) { if(msg.error == 0){ //$('.sucess-status-update').html(msg.message); alert(msg.message); }else{ alert(msg.message); //$('.error-favourite-message').html(msg.message); } }); } else { return false; } }); وضمن المتحكم الخاص بالعملية قمت بكتابة: Test::with('hitsCount')->where('userid', $id)->get()->toArray(); ولكن يظهر لدي الخطأ: Laravel csrf token mismatch، كيف يمكنني حل المشكلة؟1 نقطة
-
يمكنك إضافة CSRF ضمن الفورم نفسه، وبعدها الحصول على قيمته حسب ال id: <input type="hidden" name="_token" id="token" value="{{ csrf_token() }}"> ثم في الجافاسكريبت: var data = { "_token": $('#token').val() }; وبذلك، لا داعي لأن يتواجد كود الجافاسكريبت ضمن ملف blade ويمكنك فصلهم. وأيضاً في حال وجود عدة عمليات ajax في صفحات متفرقة من ملفات المشروع، يمكنك إضافة التالي في ترويسة الصفحة الرئيسية للمشروع: <meta name="csrf-token" content="{{ csrf_token() }}" /> ثم الكود التالي: <script type="text/javascript"> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); </script> وبعدها يمكنك إجراء AJAX بشكل عادي في باقي المكونات والصفحات، فسيتم دوماً إضافة ال CSRF لجميع العمليات بدلاً من إعادة كتابتها في كل عملية.1 نقطة
-
1 نقطة
-
يمكنك إضافة تابع closure ضمن الاستعلام بالشكل التالي: Post::query() ->with(array('user' => function($query) { $query->select('id','username'); })) ->get(); بحيث يتم استعادة القيم المررة ضمن select بدلاً من كامل الجدول. ووفقاً للتوثيق الرسمي يجب دوماً إضافة الحقل id وأي مفتاح ثانوي آخر موجود ضمن الجدول في هذا الإجراء لضمان الحصول على البيانات المطلوبة. وبدءً من نسخة laravel 5.5 أصبح يمكننا استخدام التالي للحصول على النتيجة نفسها: Post::with('user:id,username')->get(); أو public function user() { return $this->belongsTo('User')->select(array('id', 'username')); } وبشكل مختصر في النسخ الحديثة يمكنك استخدام التوابع السهمية: PHP 7 Post::with(['user' => fn ($query) => $query->select('id','username')])->get();1 نقطة
-
أي لغة من لغات تطوير الويب المعروفة ستفي بالغرض، يمكنك أن تستعمل PHP أو Python أو Ruby أو JavaScript كما تشاء ولكل منها مميزات وعيوب، لكن في النهاية سيمكنك أن تقوم بعمل منصة كشوبيفاي بالضبط بإستخدام أي من هذه اللغات ولست مضطرًا إلى إستخدام لغة معينة. لاحظ أن كل لغة من اللغات السابقة تم إستخدامها في إنشاء مواقع ضخمة للغاية، مثلًا PHP صنع بها Facebook, Wikipedia, WordPress إلخ، و Python تم إستخدامها في Instagram و Spotifyو Netflixو Pinterest، وRuby في Shopify و GitHubو Twitchو Dribbble، ولكي تتعرف أي لغة مناسبة لك أنت، عليك أن تجربهم ليس إلا، حينها سيمكنك أن تعرف أي لغة أفضل لك.1 نقطة
-
أحاول إعادة التوجيه إلى الصفحة السابقة برسالة عندما يتحقق شرط: App::fatal(function($exception) { return Redirect::back()->with('msg', 'The Message'); } و في صفحة العرض أحاول الوصول إلى الرسالة باستخدام: Session::get('msg') ولكن لا يتم عرض أي شيء ، هل أفعل شيئًا خاطئًا هنا؟1 نقطة
-
يُمكنك ببساطة إستخدام التابع updateOrCreate في هذه الحالة: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $model->option() ->updateOrCreate( ['repair_item_id' => $model->id], ['option' => $temp] ); } كما يُمكنك ذلك بهذا الشكل: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $option = $model->option; if(empty($option)){ $option = $model->option()->create(); } $option->someAttribute = temp; $option->save(); };1 نقطة
-
يُمكنك إستخدام التالي : في المتحكم: return redirect()->back()->with('msg', 'your message here'); // او في الإصدارات الحديثة return back()->with('msg', 'your message here'); في صفحة العرض تقوم بالتالي: @if (\Session::has('msg')) <div class="alert alert-success"> <p>{!! \Session::get('msg') !!}</p> </div> @endif أو: @if (session()->has('msg')) <div class="alert alert-success"> <p>{{ session('msg') }}</p> </div> @endif1 نقطة
-
في php 7.2, لا يمكنك استخدام count على relation object, لذلك لا توجد طريقة واحدة تناسب الجميع لجميع العلاقات. $model->relation()->exists() حل عام يعمل على جميع أنواع العلاقات (php 7.2): if (count($model->relation)) { // exists } سيعمل هذا مع كل علاقة لأن الخصائص الديناميكية ترجع النموذج أو المجموعة. كلاهما يقوم بتطبيق ArrayAccess. single relations: hasOne / belongsTo / morphTo / morphOne $model->relation; count($model->relation); $model->relation; count($model->relation); to-many relations: hasMany / belongsToMany / morphMany / morphToMany / morphedByMany $model->relation; count($model->relation); $model->relation; count($model->relation);1 نقطة
-
يُمكنك إضافة قيد على مُستوى قاعدة البيانات في جدول photos: في الإصدارات القديمة: $table->unsignedInteger('user_id'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade');; في الإصدارات الحديثة تم إختصار العملية بهذا الشكل: $table->foreignId('user_id') ->constrained() ->onDelete('cascade'); // أو $table->foreignId('user_id') ->constrained() ->cascadeOnDelete(); // او $table->foreignId('user_id') ->constrained('users') // تضع إسم الجدول إن لم تقم بإحترام القاعدة في تسمية الجداول و المفاتيح ->cascadeOnDelete();1 نقطة
-
إن كان الهدف هو إرجاع سجل واحد فالأفضل إستخدام التابع find او first او findOrFail او firstOrFail لأن get تُعيد مجموعة سجلات حتى و لو كانت النتيجة هي سجل واحد فستُعيد السجل بداخل مصفوفة: $about = Page::where('page', 'about-me')->first(); $about = Page::where('page', 'about-me')->firstOrFail(); // إرجاع الصفحة 404 في حالة عدم وجود أي سجل $about = Page::find(3); // إبحث عن السجل ذو المعرف 3 $about = Page::findOrFail(3); // إرجاع الصفحة 404 في حالة عدم وجود أي سجل1 نقطة
-
المشكلة بسبب get فهي تعيد مجموعة من السجلات بدل من سجل واجد، ويمكنك إجراء حلقة للمرور على هذه السجلات كما تم الشرح في التعليقات. ولكن في حال كانت البيانات المراد تمريرها هي لسجل واحد (أي لا وجود لعدة سجلات) لا داعي لاستخدام الحلقات. يمكنك تغيير الاستعلام وإضافة first وعندها سيتم استعادة أول سجل ويتم قصره ليصبح سجل واحد بدلاً من مجموعة بالشكل التالي: $about = Page::where('page', 'about-me')->first();1 نقطة
-
عندما تستخدم get () تحصل على مجموعة. في هذه الحالة تحتاج إلى تكرارها للحصول على الخصائص: @foreach ($about as $a) {{ $a->title }} @endforeach أو يمكنك فقط الحصول على أحد العناصر من خلال فهرسها: {{ $about[0]->title }}1 نقطة
-
اكتب طريقة / وظيفة DISPLAYWORDS0 في python لقراءة الأسطر من ملف نصي STORY.TXT ، وعرض تلك الكلمات التي تقل عن 4 أحرف.1 نقطة
-
نحتاج لقراءة البيانات من ملف التجريب وليكن اسمه myfile.txt حيث نفتح الملف في وضع القراءة open('myfile.txt', 'r') أما لقراءة الأسطر نستخدم الدالة ()file1.readlines لكل سطر يجب تقسيمه لكلمات لكل فراغ مثلا ثم اختبار شرط طول الكلمة / عدد الحروف لكل كلمة # Using readlines() file1 = open('story.txt', 'r') Lines = file1.readlines() # Strips the newline character for line in Lines: words = line.split() for word in words: if len(word) < 4: print(word)1 نقطة
-
تتحقق دالة whereBetween من أن قيمة العمود تقع بين قيمتين. $from = date('2021-01-01'); $to = date('2021-03-02'); Reservation::whereBetween('reservation_from', [$from, $to])->get(); أو في بعض الحالات , تحتاج إلى إضافة نطاق زمني ديناميكيًا فيمكنك استخدام Carbon. Reservation::all()->filter(function($item) { if (Carbon::now->between($item->from, $item->to) { return $item; } });1 نقطة
-
1 نقطة
-
يُمكنك الحصول على تلك النتيجة بإستخدام الكود التالي: $from = $to = Reservation::whereBetween('reservation_from', [$from, $to])->get(); أو: $from = $to = $reservations = Reservation::whereRaw( "(reservation_from >= ? AND reservation_from <= ?)", [$from, $to] )->get();1 نقطة
-
1 نقطة
-
نلاحظ أننا نقوم باستدعاء الدالة my_func بوسيط وحيد وهو النص hello world مكان X أما الوسيط الثاني لا يتم تمريره مكان y فتحتفظ y بقيمتعا الافتراصية 1 حيث نلاحظ عند تعريف الدالة أن x وسيط يجب تمرير قيمته، أما y وسيط اختياري و في حال للم نمرر قيمته ستكون 1. النتيجة: سوف تتكرر الحلقة بعدد 1 لتطبع النص hello world مرة فقط.1 نقطة
-
1 نقطة
-
في ملف index.php قم بتبديل التالي SELECT * FROM messages WHERE recipient_id = ? Order By id desc إلى التالي SELECT *, u.id,u.username FROM messages m INNER JOIN users u ON m.recipient_id = u.id Order By id desc1 نقطة
-
لدي جدول يحتوي من بين أعمدة أخرى ، على عمود لإصدارات المتصفح. وأريد ببساطة أن أعرف من مجموعة السجلات ، كم عدد كل نوع من أنواع المتصفحات. لذلك ، أحتاج إلى الحصول على شيء مثل هذا: إجمالي السجلات: 10 ؛ إنترنت إكسبلورر 8: 2 ؛ كروم 25: 4 ؛ Firefox 20: 4. هذا ما قمت به لكنه حاياً يُرجع فقط المتصفحات: $user_info = Usermeta::groupBy('browser')->get(); أريد إرجاع عدد كل متصفح مع كل مجموعة جزئية.1 نقطة
-
المشكلة في السطر السابق حيث لم يتم قراءة الملف بشكل صحيح أرجو تعديلها للشكل التالي: open('ne.txt', 'r') ^^^^^^^^ ^^^ لاحظ أن اسم الملف يوضع ضمن اقتباس لوحده ثم نمط القراءة1 نقطة
-
1 نقطة
-
نحتاج لقراءة البيانات من ملف التجريب وليكن اسمه myfile.txt حيث نفتح الملف في وضع القراءة open('myfile.txt', 'r') أما لقراءة الأسطر نستخدم الدالة ()file1.readlines ثم نعرف العداد و نزيد قيمته لكل حرق A يقع في أول السلسلة النصية التي تعبر عن سطر. أرجو تجريب الشرح أولا و محاولة كتابة البرنامج # Using readlines() file1 = open('myfile.txt', 'r') Lines = file1.readlines() count = 0 # Strips the newline character for line in Lines: if line[0] == 'A': count += 1 print("Number Of Lines = {}".format(count))1 نقطة
-
في حال كنا نريد التحقق من وجود علاقة للنموذج المطلوب أي ELOQUENT RELATIONSHIP بشكل مباشر قبل تنفيذ الاستعلام يمكن استخدام إحدى الطرق التالية: is_null exists() has('relation') if (is_null($user->mediaProfile)) { ... } //or $model->relation->count(); //or $model->relation()->exists() //or Model::has('relation')->get() //or if(!is_null($model->relation)) { .... }1 نقطة
-
إذا لديك حاسوب قوي يمكنك تستخدم macOS بشكل وهمي ولكن ستواجه بعض المشاكل و هي انه يجب التطبيق على موبايل حقيقي. إذا كان لديك أنترنت سريع استخدام RDP MACOS أفضل. هناك شركة macincloud يمكنك زيارة رابط موقعها على الأنترنت من هنا وتقدم هذه الشركة عدة حزم مثل: Pay-As-You-Go حيث معناها تدفع مقابل ما تستخدمه 1$. Managed Server: تدفع شهرياً 25$ مقابل RDP. Dedicated Server: تدفع شهرياً 49$ مقابل RDP. هناك مميزات لكل حزمة تستخدمها ويوجد مقارنة بين الحزم بشكل كامل, يمكنك أختيار ما يناسبك و الأشتراك بأحدى هذه الحزم. يمكن تحميل VMware Workstation على حاسوبك من هنا أو من هنا, ومن ثم تحميل نسخة macOS High Sierra تجد روابطها من هنا أوهنا, ويمكنك استخدام تحميل xcode بشكل يدوي وتثبيته على النسخة بعد تثبيتها, وايضا تحتاج إلى Patch Tool من هنا بعد تحميل vmware وتثبيته على جهازك , و ايضا تحميل نسخة macOS High Sierra. قم بالخطوات التالية: استخراج صورة macOS High Sierra, عن طريق فك ضغط الملف بعد تحميله. قم باستخراج الملف Patch Tool من تنسيق Zip. افتح Patch Tool - Unlocker Master ثم انقر بزر الماوس الأيمن على win-install.cmd وحدد تشغيل كمسؤول. سيقوم بتثبيت ملف التصحيح في برنامج VMware لنظام التشغيل macOS High Sierra والإصدارات الأقدم من أجل فتح برنامج VMware والسماح لك بتثبيت macOS عليه. افتح الآن برنامج VMware, انقر على Create a New Virtual Machine, ثم حدد Recommended ثم Next. حدد I will install the operating system later ثم Next. اختر الآن "Apple Mac OS X" من قائمة أنظمة التشغيل ثم حدد مكان macOS High Sierra وانقر فوق التالي. لا تحدد مساحة القرص, فقط حدد Store virtual disk as a single file وانقر على التالي. تم إنشاء ملفات VM الأساسية لنظام التشغيل macOS High Sierra, فانتقل وانقر فوق Finish. افتح نافذة macOS High Sierra VM على محطة عمل VMware أو المشغل, ثم انقر فوق Edit virtual machine settings. قم بزيادة الذاكرة من 2 جيجا بايت إلى 4 جيجا بايت أو أعلى من ذاكرة الوصول العشوائي لأداء أفضل. قم بزيادة نواة وحدة المعالجة المركزية من مركزين إلى 4 أنوية أو أعلى للحصول على أداء أفضل. أخيرًا, انقر فوق موافق لحفظ جميع التغييرات التي أجريتها على إعدادات virtual machine. افتح نافذة macOS High Sierra VM ثم انقر فوق power في virtual machine. اختر الدولة وانقر على متابعة. اختر تخطيط لوحة المفاتيح وانقر على متابعة. اختر الآن طريقتك لنقل المعلومات إلى جهاز Mac هذا وانقر don’t want to transfer any information ثم انقر فوق متابعة. يمكنك تسجيل الدخول باستخدام معرف Apple الخاص بك. وافق على الشروط والأحكام. املأ الاسم الكامل واسم الحساب وكلمة المرور وحدد مربع تعيين المنطقة الزمنية بناءً على الموقع الحالي. ثم انقر أخيرًا على متابعة لإنشاء حساب المستخدم الخاص بك لنظام التشغيل macOS High Sierra, والذي سيتم تثبيته. في صفحة الإعداد السريع, لا تريد القيام بشيء ما فقط انقر فوق متابعة. انتظر قليلاً لإعداد جهاز Mac الخاص بك. ثم سيتم تشغيله على سطح مكتب macOS High Sierra.1 نقطة
-
مرحباً بك: لقد قمت بتصحيح الإجابة قم بفهم المبدأ وطبق بطريقتك الخاصة ليس عليك أن تستخدم نفس الطريقة المهم هو الفهم1 نقطة
-
إن الأرقام الموضحة بالصور تعود للنظام العد الثنائي حيث كلخانة تدل على مضاف للعدد 2 (1,2,4,8) .. بالترتيب عند وجود القيمة 1 في التمثيل يتم أخذ قيمة الخانة المقابلة ويتم جمعها مع النتيجة أما في حال كانت 0 تترك ولا تؤخذ. 1 1 1 1 8 4 2 1 => 15 ______________________ 000 => 0 + 0 + 0 = 0 001 => 0 + 0 + 1 = 1 010 => 0 + 2 + 0 = 2 011 => 0 + 2 + 2 = 3 100 => 4 + 0 + 0 = 4 .. 111 => 4 + 2 + 1 = 7 رياضيا نقرأ خانات العدد من اليمين لليسار و نقوم بعملية ضرب لقيمة الخانة بالقيمة 2 أس (قوة) موقعها - 1 (1 | 0) * 2 ^ (موقع القيمة - 1) 1011101010101 ________^ موقع الخانة هو 5 => 1 * 2^(5-1) = 2^4 = 16 الجواب هو الخيار الثاني 1101 نقطة
-
إن المشكلة هنا في إعدادات خادم الويب، فلا يجب أن تكون الملفات خارج مجلّد public مرئية أو قابلة للوصول من قبل المستخدم. في حال كان خادم الويب من نوع Apache يجب إجراء التعديلات التالية: DocumentRoot "/path_to_laravel_project/public" <Directory "/path_to_laravel_project/public"> بحيث تكون DocumentRoot و Directory موجّهة إلى مجلّد public داخل المشروع، أما في الخوادم من نوع nginx: root /path_to_laravel_project/public; وبعد هذه التعديلات جميع ملفات لارافيل خارج مجلّد public لن تكون مرئية عن طريق متصفح الويب أبداً.1 نقطة
-
لحل هذا الإشكال سيتعين عليك إضافة هذا الكود إلى ملف htaccess: # Disable Directory listing Options -Indexes # block files which needs to be hidden, specify .example extension of the file <Files ~ "\.(env|json|config.js|md|gitignore|gitattributes|lock)$"> Order allow,deny Deny from all </Files> # in here specify full file name sperator '|' <Files ~ "(artisan)$"> Order allow,deny Deny from all </Files>1 نقطة
-
مراجعتي مجروحة... كمؤلف الكتاب... وليست هذه مراجعة حتّى لكنني أريد أن أتقدم هنا بالشكر الجزيل إلى فريق أكاديمية حسوب على إخراج وتنسيق الكتاب ورعايته. كان جهدًا طويلًا على مدار عدة أشهر لتنسيق الكتاب وإخراجه بشكل الحالي، خصوصًا أنه يحتوي الكثير من الصور والأوامر وغير ذلك من عناصر التنسيق المختلفة. أريد أن أنوه كذلك إلى أن هذا الكتاب يغطي معظم الأساسيات وأهم المواضيع، لكنه لا يغطي كل شيء في مجال الأمان الرقمي، ومايزال هناك الكثير من الأشياء الأخرى للحديث عنها. ويمكن للقارئ الكريم أن يتبحر على الشبكة بالبحث عن المزيد من المصادر حول المواضيع التي ذكرناها إن كان يريد المزيد، وهناك قائمة سريعة ببعض المواقع المفيدة في مجال الأمان الرقمي على الشبكة. أتوجه بالشكر هنا كذلك إلى كل القرّاء الذين حملوا الكتاب وساهموا بنشره للآخرين، ورغم أنه كتاب مجاني إلا أن أملي أن يستفيد منه أقصى عدد ممكن من الناس، ليحموا أنفسهم من مخاطر الخصوصية والأمان في هذا الوقت المتقلب. أنا جاهز لأي أسئلة أو استفسارات تحت هذا التعليق كذلك.1 نقطة
-
مشكلة مثل هذه قد يتسبب بها عدد من الأمور: قد تكون هذه مشكلة في ملفات cache الخاصة بالمتصفح، لذلك حاول أن تجرب الموقع في متصفح مختلف تماماً أو قم بحذف الملفات المؤقتة وملفات الارتباط cookies من المتصفح. وقد تكون المشكلة تنبع من كود جافا سكريبت يقوم بتغير عرض العنصر، فقم بإيقاف الجافا سكريبت من المتصفح وجرب مرة ثانية. بما أن قوالب بلوجر تكون بالكامل في ملف واحد، فربما تقوم بتغير العرض لعنصر مختلف تماماً، وليس العنصر الذي تقصده، لذلك تأكد من أنك تقوم بتعديل العنصر الصحيح.1 نقطة
-
يمكنك تحسين جودة الصوت الصوت في أغلب الملفات الصوتية من خلال إستخدام برامج مثل audacity و adobe audition فهذه البرامج مختصة في تعديل وتنقية وإصلاح ملفات الصوت بعشرات الطرق. لاحظ أن هذه البرامج تحتاج خبرة ومعرفة مسبقة لتستطيع التعامل معها، وسيكون من الأسهل والأسرع تعيين مختص في إزالة التشويش وتعديل ملفات الصوت من على أي منصة للعمل الحر مثل مستقل. لاحظ أيضًا أن هناك بعض الملفات لا يمكن تحسين جودة الصوت الخاص بها بدرجة عالية نظرًا لبنية الملف الداخلية (الأمر يختلف من صيغة لأخرى). يمكن أيضًا أضافة تأثيرات معينة على الصوت مثل صدى صوت بسيط أو تفخيم الصوت وغيرها من محسنات الصوت.1 نقطة
-
uml هو اختصار لUnified Modeling Language او ببساطة لغة النمذجة الموحدة تُستخدم في نمذجة التطبيقات و الأنظمة التي تعتمد على البرمجة الكائنية OOP و تُستخدم لعمل نموذج مبدئي للتطبيق أو النظام سهل الفهم و مقروء من قبل المطورين أو المُبرمجين لذلك سُميت لغة النمذجة المُوحدة هناك عدة أنواع من المخططات التي تعتمد عليها Uml يُمكن حصرها في نوعين: Structural Diagrams Behavioral Diagrams و تحت كل نوع يندرج عدة أنواع من المُخططات: يُمكنك قراءة هذا المقال من: هنا الذي يتحدث عن الموضوع بالتفصيل. كما يُمكنك مشاهدة هذا المقطع لأخذ فكرة: إضغط هنا بالتوفيق.1 نقطة
-
ببساطة استمر بمتابعة أشخاص لديهم خبرة كبيرة في المجال فهذا يزيد من دخولك في أجواء البرمجة , وايضا نوّع في وسائل التعلم , أي لا تكتفي بمشاهدة بعض المرئيات على youtube أو udemy أو غيرها , ولكن تعلم قليلا من الكتب , اقرأ مقالات , ولا تنسى documentation لكل موضوع تريد تعلمه ففيه معلومات لا يسدها الا هو . ثم اذا شعرت بملل بين حين وآخر فأعطي لنفسك قسط من الراحة والتسلي عنه حتى يعود اليك ذلك الحماس الذي يجعلك تريد فقط أن تنجز.1 نقطة
-
إذا كنت تجني المال من وراء هويتك الشخصية، فلتعلم أنه يجب عليك أن تعتني بمكانتك الرقمية جيدًا على الإنترنت، فتحتاج ابتداءً أن تمتلك فضاءك التدويني والاجتماعي الخاص بك، بما أنه المكان الذي يجتمع فيه أغلب المؤثرين أيضًا (أعني الإنترنت والشبكات الاجتماعية). فيجب أن يكون لديك حساب في فيس بوك، تويتر، لينكدإن، إلخ، ويجب أيضًا أن يكون لديك مكان لكل محتواك المميز ( مدونة). واعلم أن فشلك في التميز في تلك المنصات سيتسبب في إعاقة نمو علامتك الطبيعي، إضافة إلى أن الأخطاء التالية التي سأذكرها لك في باب الشبكات الاجتماعية ستجعلك تتقدم خطوة وترجع القهقرى ثلاث خطوات أخرى، فما الفائدة إذًا من أن يكون لديك هوية شخصية إذا لم تكن تستغل الفرص المتاحة أمامك للتواصل؟ تفقد معي هذه الأخطاء الستة واحرص أن تبذل جهدك في تجنبها. 1. نبذتك التعريفية ليست مُميّزة أبق النبذة الشخصية قصيرة وممتعة، كن مثيرًا للاهتمام دون أن تحكي قصة حياتك. تذكر أن القاموس صديق لك، فلتضف بعض الإسهاب غير المتوقع إلى نبذتك الشخصية أو زودها بمفردات يندر استخدامها. فيمكنك مثلًا أن تجرب استخدام كلمات مثل "marketing groupie" بدلًا من أن تطلق على نفسك "marketing specialist"، هكذا يجب أن تكون هويتك مميزة، وإﻻ فتأكد أنك ستتوه بسهولة وسط الزحام إذا كانت نبذتك مجرد ثرثرة مكررة وحشو ﻷلقاب مثل "خبير تسويق، مستشار، محترف، .. إلخ"، فمثل تلك الألقاب صارت مستهلكة ومكررة، ومملة أيضًا. 2. صورتك الشخصية ليست معبِّرة توقف عن محاولة تقمص شخصية غيرك، أجب على هذا السؤال حين تلتقط صورة شخصية لنفسك لتستخدمها في الإنترنت: هل سيتعرف علي أصدقائي وعائلتي إن رأوني في تلك الصورة؟ أقصد تلك اللحظة التي ترى والدتك فيها صورتك وهي تتصفح فيس بوك، هل ستتعرف عليك فورًا قائلة "أوه، هذا ولدي!/هذه فتاتي!"؟ إذا لم تتعرف عليك أمك، فمن سيفعل؟ حتى في موقع مثل لينكدإن، ﻻ يجب أن تحتوي الصورة الشخصية على الكثير من العناصر -إﻻ إن كانت هويتك تعتمد على تلك العناصر، فلا بأس إذًا-. احرص أيضًا على أن تبتسم، وأظهر شخصيتك الطبيعية، وتأكد أن تتعرف أمك عليك إن رأت صورتك، وﻻ تشوش هويتك بالتعديلات المبالغ فيها. 3. لم تحسن اختيار علاقاتك إن تصفحتَ حسابي على فيس بوك ووجدتَ أحد أكثر المطلوبين للشرطة في قائمة أصدقائي، فسيؤثر ذلك حتمًا على حكمك علي، بل إنك قد تمتنع عن العمل معي أو حتى طلب صداقتي. فإن أغلب الناس يتجنبون الدخول في علاقات مشبوهة مثل تلك، وإن لم يفعلوا فعلى الأقل سيعيدون التفكير فيها مرة أخرى. لكن من الناحية الأخرى، إن كان سيث جودين -ليس الممثل، بل أحد المؤثرين في مجال التسويق الرقمي- يعيد تغريد ما تكتبه، فأنت على الطريق الصحيح!، إن الأمر يتطلب بالطبع أكثر من خطوة واحدة على الشبكات الاجتماعية، لكن كبداية سيُنظر إليك على أنك خبير بالمجال لمجرد ارتباطك بأشخاص مؤثرين وبارزين في مجالك.، أضف إلى هذا أن ارتباطك مع بعض القادة المفكرين في الفضاء الرقمي سيعزز من صدى هويتك. 4. ليس لديك بيانات عمن يتابعك هل تقضي أغلب وقتك على تويتر بينما يقدم فيس بوك لك تفاعلًا أفضل؟ دعنا نتحدث بصراحة، إنك لن تستطيع أن تخصص ثمان ساعات كل يوم لكل شبكة، بل إن حتى ساعتين فقط قد تبدو بالشيء الكثير لكل شبكة في اليوم، لهذا السبب وحده يجب عليك أن تفكر جيدًا في كيفية تقسيم ساعات يومك، وتعرف أين يوجد جمهورك. أضف لهذا أنك يجب أن تعرف أي منصة تعطيك أفضل نتائج، إن كان الآلاف من متابعيك ينتقلون إلى إنستجرام، لكن ﻻ توجد طريقة فعلية لتحديد كم الزيارات أو الدخل المادي من هذا المصدر، فابحث عن بديل له. إنني أنصح دومًا بالحفاظ على حضور أساسي في شبكة من الشبكات المشهورة، وجمع شبكة أو شبكتين أخرتين إليها. 5. لا تهتم بنوع المحتوى الذي تنشره هل تنشر بشكل منتظم تدوينات ومقالات كتبها أشخاص غيرك؟ هل تكثر من مشاركة منشورات رفعها أشخاص غيرك على إنستجرام؟ هل تعلم أنك ﻻ تزال في حاجة إلى إنشاء محتوى مميز خاص بك أنت!، رغم أنه ﻻ بأس أحيانًا من إظهار بعض الحب والتقدير ﻷصحاب تلك المنشورات، فالعالم الرقمي في حاجة إلى صوتك أنت. حاول أن تنشر محتوىً خاصًا بك بشكل أسبوعي على الأقل، حافظ على جهودك التسويقية مواكبة لما يجري حولك، استخدم شبكاتك الاجتماعية لبناء شبكة تسويقية من الاتصالات، روِّج لقائمتك البريدية التسويقية في حسابك على تويتر، وأطلق كذلك إعلانًا على فيس بوك، لدعم قائمتك التسويقية النصية (Text Marketing List). إن سار كل شيء كما يجب فسترى عوائد جهودك لتنمية جمهورك الرقمي تزدهر بشكل خيالي. 6. أنت ﻻ تتبع سِمَتيْن أو ثلاث سِمات ثابتة لعلامتك إن كنت تكتب منشورات عن السياسة بشكل منتظم في حين أن الناس تعرفك كمدرب شخصي، فاعلم أن تلك الطريقة قد ﻻ تكون أفضل شيء تحافظ به على منحنى سمعتك الطيبة. إني أعرف أن لكل شخص آراؤه الخاصة، لكن إن أردت بناء علامة تجارية قوية، فاختر سمات محددة للمحتوى الذي تنشره، فليس هناك أحد خبير في 300 موضوع!، ولن تساعدك محاولتك لفعل ذلك في ترسيخ علامتك كمرجع لدى العملاء. وإن أفضل طريقة لتحديد تلك السمات التي عليك اتباعها هو أن تسأل نفسك "أين يمكن أن أقدم أفضل ما لدي؟"، ثم اختر موضوعين أو ثلاثة تظهر فيهم موهبتك وخبرتك هناك. وبصفة عامة، تأكد أن تلك الموضوعات تتفق فيما بينها بشكل ما، فيمكنني أنا مثلًا أن أختار لنفسي موضوعات مثل العلامة التجارية، التسويق بالمحتوى، وريادة الأعمال. ﻻحظ أن كل موضوع من الثلاثة يرتبط بالموضوعين الآخريْن، فنصيحتي لك أن تتجنب الجمع بين موضوعات مثل تزيين الكعك، تصليح السّيارات، وغناء الأوبرا، ﻷنك ستجد صعوبة كبيرة في إنجاح علامتك التجارية بين كل هؤلاء. واﻵن، إليك السؤال الذي يطرح نفسه، لمَ الشبكات الاجتماعية بالذات؟ كيف ستستفيد علامتي التجارية من تلك المنصات الرقمية؟ يمكنك التفاعل بشكل مباشر ولحظي، فإن بعض القنوات تتيح لك إمكانية البث بشكل مباشر، وهذا أفضل حتى من أجل العلامة التجارية. إن حساباتك الاجتماعية أشبه بمتحف عنك أنت فقط، حيث يستطيع المعجبون أن يتعرفوا عليك كيف شاؤوا، من خلال ما تقدمه أنت من معلومات عنك. تستطيع معرفة الكثير عن متابعيك بسبب تطور التحليلات التي تقدمها تلك المواقع، ففي فيس بوك مثلًا تستطيع رؤية أين يعيش أكثر متابعيك، كم أعمارهم، وما أنواع المحتوى الذي يهتمون به. يمكنك أن تضيف المحتوى أو تحذفه كيف تشاء، حين تشعر مثلًا أن منشورًا لم يعد يمثلك أو يمثل علامتك التجارية بعد الآن. تذكر أن الاستفادة من اﻹنترنت ليس صعبًا، لكن إن لم تبذل جهدًا حقيقيًا في الشبكات الاجتماعية، فلن تستطيع بناء قاعدة متابعين مخلصين ومتفاعلين، وستلحظ انخفاضًا في الاهتمام بعلامتك التجارية، ولن يهتم الناس بما ستقوله، ولن تكون رسالتك متناسقة وﻻ متينة. واعلم أن شبكتك الاجتماعية تعول على مزيد من الجهد الذي تبذله أنت، فلا تخيب رجاءهم واتبع تلك النصائح الست التي أوردتها لك كي تقفز بمهارتك في التعامل مع الشبكات الاجتماعية إلى مستوى جديد. ترجمة -بتصرف- للمقال Six Social Boo Boos That Limit Your Personal Brand لصاحبته kristen Vanstrom حقوق الصورة البارزة محفوظة لـ Freepik1 نقطة
-
كعامل مُستقل كيف تُشعِر عملاءَك بأنك لن تخذلهم وبأنه بإمكانهم الاعتماد عليك؟ برأيك، ما هو أوّل اعتراضٍ يذكره أصحاب المشاريع بشأن توظيف المستقلّين؟ جواب هذا السؤال واضحٌ من عنوان المقال، أليس كذلك؟ حيث يعتقد الكثيرون بأنه لا يُمكن الاعتماد على المستقلّين بكل بساطة. قلّة الموثوقيّة (lack of reliability) تحتلّ مكانًا متقدّمًا في قائمة أسباب قلق معظم أصحاب المشاريع من توظيف المستقلّين. وإذا أردت برهانًا على ذلك، إليك بضعة شكاوى يُكرّرها بعض أصحاب المشاريع حول تعاملهم مع المستقلّين (وسنذكر المزيد منها في المقال): هذه الآراء كانت مُفاجئةً بعض الشيء بالنسبة لي. لم أكن أعتقد أن سمعتنا –نحن المستقلّون- مشكوكٌ فيها بهذا القدر. وأسوأ ما في الأمر أن هذا بالتأكيد له تأثيرٌ على نجاح عملنا كمستقلّين. لا يصدّق بعض أصحاب المشاريع أن المستقلّ العاديّ يمكن أن يكون موضع ثقةٍ لتوكيله بالعمل على مشروعٍ ما، وهذا الرأي لم يأتِ من فراغ. أصحاب المشاريع الذين يفكّرون بهذه الطريقة سبق وأن خيّب أحد المستقلّين ظنّهم - أو سمعوا قصصًا سيئة من شخصٍ آخر خذله المستقل الذي كان يتعامل معه- والآن يخشى أولئك من الثقة في أيّ مستقلٍّ آخر. أنا متأكّدةٌ أنّك تريد أن تكون أفضل عاملٍ مستقلٍ تستطيع أن تكونه، وآخرُ صفةٍ تريدها أن تُطلق عليك هي عدم الموثوقيّة. لكنّ رغبتك بهذا وحدها لا تكفي. بغضّ النظر عن كونك تقوم بالعمل على أكمل وجهٍ وبأعلى جودةٍ واحترافيّة، سيكون عليك دائمًا أن تسعى للتغلّب على الصورة النمطية المأخوذة عن المستقلّين -والتي أشاعها بعض المستقلين غير الجديرين بالثقة عن العمل الحرّ – متمثّلةً في افتقار جميع المستقلّين للموثوقيّة. أفكّر كثيرًا في هذا الموضوع مؤخّرًا، وقد اطّلعت على قائمةٍ كاملةٍ عن مخاوف أصحاب المشاريع فيما يتعلّق بتوظيف المستقلّين وحاولت أن أجد بعض الحلول البسيطة للتغلب على تلك المخاوف. وبعد الاستقصاء والبحث، أتيتُ لكم بثمانية ممارسات يمكن أن يبدأها أي مستقلّ اليوم ليبرهن للعملاء المحتملين على أنّه ليس من أولئك المستقلّين عديمي الموثوقيّة. 1. اعرض وقتا محددا لتسليم المشروع كما ترى، ميل المستقلّين لأداء العديد من الوظائف في الوقت نفسه -مما يجعلهم غير قادرين على تقديم خدمات عالية الجودة- من الأمور التي تُقلق العملاء. علاج هذه المشكلة لا يتمثّل في التعامل مع عميلٍ واحد على وجه الحصر (لأن ذلك سينافي الغرض من العمل الحر)، لكن بأن تحدّد للعميل عدد الساعات التي ستخصّصها للعمل على مشروعه. هذا أمرٌ لا مفرّ منه في بعض الحالات خاصّةً إن كنت تُحدّد أجرًا مقابل الساعة. لكن أيضًا إذا اتفقت مع العميل على أسلوبٍ آخر لتحديد الأجر، فمن الأفضل أن تخصّص عدد ساعاتٍ محدّدة للعمل على المشروع. زوّد العميل بجدولٍ زمنيّ للعمل على المشروع وتقديرٍ منطقيٍّ للزمن يُظهر عدد الساعات الكافية لإتمام المشروع من الألف للياء. ويمكن أن تقوم بذلك في الاتّفاق (contract) أو في العرض الذي تقدمه على المشروع (proposal). 2. قدم نفسك كشركة (أو كطرف له تمثيل قانوني) يخشى بعض أصحاب المشاريع من توظيف المستقلّين لأنهم يعتقدون أن توظيف مستقلٍّ يعمل بشكلٍ فرديّ قد يكون له أثرٌ سلبيٌّ على المشروع، فكلمة "مستقل" لا تعبّر عن الاستقرار في العمل. كما يعتقد العملاء أيضًا أنّ المستقلين ليست لديهم سمعةٌ يخافون عليها كما لدى الشركات. أفضل الطرق للتعامل مع هذه المشكلة هو أن تقدّم نفسك كشركة (legitimate business). ولتفعل ذلك يحب أن يكون لديك هيكل أعمال (Business structure). أعلم أن هذا قد يبدوا منطقيًّا للبعض، لكنّ هناك العديد من الدول التي تسمح بالعمل الحر من دون امتلاك هيكل أعمال. أما أنا فأشجّعك على أن تنشئ هيكل أعمال خاص بك (يعني أن يكون لشركتك تمثيل قانوني) على كل حال فهذا سيزيد من مصداقيّتك وموثوقيّتك، شريطة أن تكون أرباحك مرتفعةً بشكلٍ كافٍ لتغطية نفقاته. راجع اللوائح والإرشادات التنظيمية المحليّة لدولتك للعثور على أفضل كيان تجاري يناسبك. وبعد إتمام ذلك، اعرِض دائمًا خدماتك كمستقل باستعمال الاسم المهني. وهذا هامٌّ خاصة فيما يتعلق بإنشاء عرض جيّد. باختصار، عرضٌ مقدّم من (Smith Writing LLC (LLC اختصار لـ"شركة ذات مسؤولية محدودة" أفضل من من عرضٍ مقدم من "John Smith" مثلًا. 3. اعرض تقديم دعم مستمر مفهوم تقديم الدعم المستمر يتعلّق على وجه الخصوص بالوظائف التقنيَّة كتصميم البرمجيات على سبيل المثال. كما أنّ هذا المفهوم ليس شائعا في مجال العمل كمدوّنٍ/كاتبٍ حر لأن التدوينات لا تتعطّل بسبب أخطاء برمجيّة مثلًا. على كل حال، قد يفضّل بعض العملاء أن تتم مراجعة التدوينات القديمة لتحديثها ومراجعة صحّة الحقائق المذكورة فيها، أو يمكن أن تعرض دعمًا مستمرًّا في مجال التدوين يتمثّل في مشاركة التدوينات باستمرار على شبكات التواصل الاجتماعي. تقديم الدعم كجزء من القيام بالوظيفة يجعلك تقطع شوطًا طويلًا في عدّة أمورٍ منها: أن تكون جاهزًا لإصلاح الخلل إذا لم يرضَ العميل عن الوظيفة التي سلّمتها، وهذا هو تقديم خدمةٍ جيدة.إذا ضمّنت الدعم بوضوح في عرضك (والأفضل ألا تتقاضى ثمنًا إضافيًّا لأدائه) فإنك بذلك ترسل رسالةً واضحة مفادها أنك تهتم بعميلك واحتياجاته حتّى بعد التسليم الأوّلي للمشروع.من المهم ألا ننسى أنه من أكثر مصادر القلق المفهومة والطبيعية لدى العملاء هي احتماليّة أن يتخلّى عنهم المستقل في اللحظة التي يرسلون له فيها أجره، وهذا صحيحٌ بشكلٍ خاص عندما تكون تلك المرة الأولى التي يتعاملون فيها مع ذلك المستقل. عرض الدعم فرصةُ عظيمة لمعالجة مصدر القلق هذا. اذكر خدمة الدعم الخاصة بك على موقعك الشخصي وعند تقديم عروضك. يكفي أن تذكر جملة بسيطة مثل " تقديم الدّعم مجّانًا لستة أشهر بعد اكتمال المشروع ". ثم إضافة بعض البنود في الاتّفاق لتحديد ماهيّة الدعم الذي ستقدّمه. عرض الدعم وتقديم ضمان (guarantee) للعميل نفس الشّيء. قدّم ضمانًا فقط إذا كان المشروع الذي تؤديه يتطلّب ذلك. 4. لا تطلب مصادر إضافية طلب مصادر إضافيّة من الأمور الشائعة بالنسبة للمستقلين عندما يعملون على مشروعٍ ما. على سبيل المثال، يطلب المدوّنون أحيانًا من العملاء منحهم حسابًا لمكتبة الصور البارزة أو تغطية نفقات شراء الصور التي يحتاجها المقال. وكما نعلم فإنّ الصور تلعب دورًا هامًّا في خلق تدوينةٍ جيّدة المظهر. هذا الأمر يمكن أن يكون منطقيًّا من وجهة نظر المستقل. فقد يتساءل لماذا يجب أن يدفع من ماله الخاص لتوفير أدواتٍ إضافية يحتاجها المشروع. لكنّ العميل لا يرى الأمر من نفس المنظور. شركات التّعهيد الخارجي (outsourcing firms) التي تقدّم خدمات المحتوى لا تطلب المال لتوفير أدواتٍ إضافية بعد توقيع العقد. هذا بسبب أنهم يمتلكون بالفعل كل الأدوات التي يحتاجونها لإتمام المشروع، أو بسبب كونهم قد ضمّنوا سعر هذه الأدوات بالفعل في العرض الذي قُدّم على المشروع. والتعامل مع هذه الشركات أفضل كثيرًا من وجهة نظر العميل، لأنّه سيكون على علمٍ من البداية بتكلفة المشروع، ولن يُفاجأ بأي نفقاتٍ إضافيّة. 5. قدم عرضا مناسبا ذكرتُ تقديم العروض أكثر من مرّة في هذا المقال، وحان الوقت لمناقشة العروض ذاتها. عرضُك هو أوّل تواصلٍ بينك وبين العميل وأكثر وثيقة حاسمة ومصيرية تقدّمها كعاملٍ مستقل، يستطيع العميل أن يحكم على احترافيّتك ومهنيّتك من خلال العرض الذي تقدّمه على المشروع، وفي العرض أيضًا تخبر العميل أنّك تعتبر الدّعم المستمرّ جزءًا من الاتفاق، وفيه يُحدّد موعد التسليم والأطر الزمنيّة، وهلمّ جرَّا. تقديم عرضٍ جيّد يجعلك مميّزًا في نظر العميل ويُظهِرُك في موضع المحترف الجاد. وفيما يتعلق ببناء العرض الجيّد، إن كان لديك الوقت الكافي، تستطيع أن تفعل ذلك بكتابته في تطبيق وورد ثم تحويله إلى صيغة PDF وإرساله عبر البريد الإلكترونيّ (وهكذا تجري الأمور معي منذ سنوات). يمكنك أيضًا أن تستخدم أداةً مخصّصةً لكتابة العروض مثل Bidsketch. وهي برمجيّة متخصّصة تساعدك في إنشاء عرضٍ مناسبٍ وجيّد. وأيضًا يرسل لك العروض ويخبرك عن كيفية تفاعُل العميل معها (أعلم هذا لأنني من ضمن فريق عمل Bidsketch). يمكنك أن تختار بين الطريقتين، لكن برأيي، إنشاء عرض احترافيّ يستغرق وقتًا وجهدًا أقل عند استخدام أداة مخصصة لهذا الغرض. 6. حدد مواعيد تسليم واضحة وأطرا زمنية عامة فوجئتُ كثيرًا عندما علمتُ أنّ عدم إتمام المستقل للمشروع من الأمور المسبّبة لقلق العملاء. في البداية لم أفهم لماذا يمكن ألا يريد المستقل أن يَتِم المشروع ويُنجَز. لكنني أدركت فيما بعد أنّ المشكلة تتمثّل في المثالية الزائدة. من الشّائع اعتبار المثالية الزائدة ميزةً أكثر من كونها عيبًا. لكن في الواقع، قد يقود الإفراط في المثاليّة إلى تأخير موعد التسليم بسبب السّعي لجعل المشروع مثاليًا. وهذا سبب قلق العملاء من كون المستقلين لا يستطيعون الالتزام بتسليم المشاريع المستعجلة في الموعد المناسب. على كلّ حال، تسير الأمور في عالم العمل الحرّ بشكلٍ مختلفٍ قليلًا. في معظم الحالات، تسليم المشروع في الموعد المحدد أهم من أن تجعله مثاليًّا. ويمكنك التعامل مع مصدر القلق هذا باتّباع الآتي: ضع موعدًا للتسليم وإطارًا عامًّا للتواريخ لمتابعة سير المشروع ثمّ حدّدها بوضوح في عرضك؛ بهذه الطريقة سيعرف العميل ما الذي يجب أن يتوقّعه حيال سير المشروع. وسيكون العميل أكثر ثقةً أنك تأخذ مشروعه بعين الاعتبار عندما تضع المزيد من الأطر العامة (المدروسة) للمواعيد.التزم بموعد التسليم الذي حدّدته، حتى إن كان ما تقدّمه ليس مثاليّا. أعني هذا؛ القدرة على التسليم في الموعد المحدّد أهم من تقديم نتائج مثاليّة في معظم الأحوال.7. تواصل مع العميل بشكل مستمر وقدم له تقارير عن سير المشروع تضمين تقديم تقارير دوريّة عن سير المشروع في عرضك (تُعَدُّ اعتمادًا على حجم المشروع) فكرةٌ جيّدةٌ على الدّوام. أعترفُ أن إعداد التقارير مَهمّةٌ مملة، ولكنها تحقّق شيئًا مهمًا: بناء الثقة بينك وبين العميل. بكلِّ بساطة، طالما بإمكان العميل أن يرى أن المشروع يحرز تقدّمًا وأنّ أداءَك يتماشى مع المعالم العامة التي وضعتَها في العرض، فإنّه لن يقلقَ حيال موعد التسليم. هذه الثقة في مهنيّتك ستدفعهم للتعامل معك مرّاتٍ أخرى. وأيضًا، إذا منحت العميل تقاريرَ منتظمة حول سير المشروع، سترتاح من تلقي رسائل تسأل عن سير المشروع باستمرار. 8. سلط الضوء على توصيات العملاء testimonials ودراسات الحالة case studies في موقعك الشخصيهذه طريقةٌ تسويقيّة في الأساس، لكن لها دورٌ عظيم في عرض خبرتك وجدارتك. كلُّ عميلٍ محتَملٍ سيشعر ببعض القلق من قدرتك على التسليم، وأفضل طريقة لمعالجةِ هذا الأمر هي طمأنتهم استخدام أصوات أشخاصٍ آخرين في توصيات العملاء ودراسات الحالة . يمكنك الحصول على التوصيات/شهادات العملاء بسهولة بأن تطلب من العميل أن يُعطيك رأيه في خدماتك في جملتين مثلًا. أما دراسات الحالة فيجب أن تكتبها بنفسك، ويمكنك فيها مشاركة تفاصيل المشروع ونجاحه. دراسات الحالة بذاتها قد تكون طريقةً عظيمة لزيادة الإقبال على موقعك وجذب عملاء جُدد. هل بالإمكان الاعتماد عليك؟هناك الكثير من السَّلبيّة في الاقتباسات التي ذكرتها في المقال، أليس كذلك؟ أعترفُ أنّني أهملتُ بعض التعليقات التي بصالح المستقلين. لكن الأمور التي ذكرتُها تسبب بالفعل قلقًا للعملاء لذلك يجب أن نتعامل معها ونحاول أن نتخطّاها بشكلٍ مستمر. أؤمنُ أن هذه الممارسات الثمانية التي ذُكرت في المقال ستساعدك أن تُبرهِن على موثوقيّتك لعملائك. بالطبع، هناك ممارسةٌ أساسيّة أخرى غير التي ذَكَرت، وهي أن تفي بالوعود التي قطَعتها! برأيك هل تسبُّب هذه الأمور بالفعل قلقًا لأصحاب المشاريع؟ وكيف يمكنك أن تقنع عميلًا محتملًا بالعمل معك بعد أن خُذِل من قبل عاملٍ مستقلٍّ آخر؟ ترجمة -وبتصرف- للمقال Freelancers Are Unreliable! How to Show Your Clients You Won’t Let Them Down لصاحبه Karol K.1 نقطة