لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 02/24/21 في كل الموقع
-
أتعلم أستخدام React وفي الفيديو التعليمي إستخدم المدرب العنصر <> </> في الكود التالي: class Component extends Component { render() { return <> <Post/> <Post/> </> } } ولا أعرف ما غائدة هذا العنصر، وعندما أقوم بإزالته يظهر لي هذا الخطأ multiple components must wrapt with end2 نقاط
-
هذا كود مختصر للعنصر Fragment return <React.Fragment> <Post/> <Post/> </React.Fragment> // هذا كود مختصر للسطر السابق return <> <Post/> <Post/> </> يعتمد React على بناء هيكل الصفحة يشبه الشجرة ويستخدم العنصر Fragment عند إرجاع مكونات متعددة، فإن افتراض أن هذه الشجرة من العناصر سيكون لها عنصر جذر واحد (عنصر رئيسي) فإنه سيكون من الصعب معالجة هذه الشجرة من المكونات. لذلك يجب أن يتم إرجاع عنصر واحد فقط ولحل هذه المشكلة يتم إستخدام العنصر React.Fragment لإحتواء كل العناصر الأخرى المرجعة، وهكذا يتم إرجاع عنصر واحد فقط. لاحظ أنه من الإصدار 16.2 في React يمكن إرجاع مصفوفة Array من العناصر بدلًا من إستخدام العنصر React.Fragment بهذا الشكل: return[ <div> Div 1</div>, <div> Div 2</div>, <div> Div 3</div>, <div> Div 4</div> ];2 نقاط
-
صحيح أنه يمكنك وضع الدوال المساعدة في أي مكان تريده ولكن المتعارف عليه أن يكون بداخل مجلد App مباشرة أو في المسار App/Http أو هنالك من ينشئ مجلداً خاصة في المجلد App ويعيطه الاسم Helpers ثم بداخله يضع الملف الذي سيحتوي على الدوال المساعدة ويمكنك بهذه الحالة تنظيم الدوال المساعدة حسب كل فئة لتنظيم الكود أكثر. كذلك التسمية المعروفة لهذا الملف هي helpers ولكن بالطبع يمكنك تسميته بأي اسم تريده. هذه بعض الأمور المتعارف عليها حيث في حال قام أي شخص آخر برؤية الكود سيعرف أن هذا هو الملف للدوال المساعدة, لكن بالطبع يمكنك التعديل عليه كما تريد في حال تم التوضيح على ان هذا الملف هو للدوال المساعدة. باقي الأمور من تعريف المشروع على ملف الدوال تم ذكره في الرد السابق.2 نقاط
-
يُمكنك ذلك من خلال إنشاء ملف php عادي في أي مسار تريده مثلاً في: tests |_ Utilities |_|___ functions.php و تضع الدوال التي تحتاجها فيه مثلاً: <?php function create($class, $attributes = []) { return $class::factory()->create($attributes); } function make($class, $attributes = []) { return $class::factory()->make($attributes); } الآن ستقوم بإضافة عملية التحميل التلقائي للملف من خلال composer و لعمل ذلك تحتاج التعديل على ملف composer.json: إن كنت تحتاج أن تتم عملية التحميل التلقائي للملف فقط في مرحلة التطوير ستُضيف مسار الملف داخل مصفوفة files ضمن الخاصية autoload-dev: "autoload-dev": { "psr-4": { "Tests\\": "tests/" }, "files": ["tests/Utilities/functions.php"] }, أما إن أردت أن تشمل العملية مرحلة الإنتاج فستضع مسار الملف داخل مصفوفة files في الخاصية autoload: "autoload": { "psr-4": { "App\\": "app/", "Database\\Factories\\": "database/factories/", "Database\\Seeders\\": "database/seeders/" }, "files": ["tests/Utilities/functions.php"] }, بعد ذلك قم بتنفيذ أمر: composer dump-autoload ثم ستتمكن من إستخدام الدوال التي أنشأتها في أي مكان تريد، في المثال أرفقت دالتين إحداهما لإنشاء سجل جديد من نموذج معين و الثانية تُنشئ السجل و تقوم بتخزينه في قاعدة البيانات، و هاتين الدالتين تحتاج لهما كثيرا في الإختبارات: و هذا مثال عن إستخدامها: <?php /** @test */ function an_authenticated_user_may_participate_in_forum_threads() { $this->signIn(); $reply = make(Reply::class); $this->post($this->thread->path . "/replies", $reply->toArray()); $this->get($this->thread->path) ->assertSee($reply->body); }2 نقاط
-
تحدث هذه المُشكلة لك بسبب أنك حددت إسم المُجلد في المُعامل الأول للدالة put، مثلاً إن كنت تريد وضع الملفات داخل مُجلد images يُمكنك ذلك من خلال: public function test(Request $request) { $fileInForm = 'file'; if ($request->hasFile($fileInForm)) { $file = $request->file($fileInForm); if ($file->isValid()) { // Filename is hashed filename + part of timestamp $hashedName = hash_file('md5', $file->path()); $timestamp = microtime(); $newFilename = $hashedName . $timestamp . '.' . $file->getClientOriginalExtension(); Storage::disk('local')->putFile('images', $file); } } } في هذه الحالة سيتم حفظ الملفات داخل مُجلد images و ستُعطي لارافيل إسم مُختلف للملف المرفوع في كل مرة تلقائياً، و ستُرجع الدالة putFile المسار الذي تم حفظ الملف فيه يُمكنك حفظه إن احتجت له. إن كنت ترغب في وضع الإسم الذي يُحفظ به الملف بنفسك يُمكنك إستخدام الدالة putFileAs بنفس الطريقة و تُمرر الإسم الذي ترغب فيه كمعامل ثالث: public function test(Request $request) { $fileInForm = 'file'; if ($request->hasFile($fileInForm)) { $file = $request->file($fileInForm); if ($file->isValid()) { // Filename is hashed filename + part of timestamp $hashedName = hash_file('md5', $file->path()); $timestamp = microtime(); $newFilename = $hashedName . $timestamp . '.' . $file->getClientOriginalExtension(); Storage::disk('local')->putFileAs('images', $file, $newFilename); } } } تُرجع الدالة أيضاً مسار الملف. تُتيح لارافيل أيضاً دالتي store و storeAs لكن هاتين الدالتين لا تُستخدمان بإستعمال الfacade بل مُباشرة على الملف بهذا الشكل مثلاً: $path = $request->file('file')->store('images'); $path = $request->file('file')->storeAs( 'images', $newName );2 نقاط
-
إن أعظم منتج في التاريخ ليس له قيمة بدون سوق يباع فيها، أو قائمين على تسويقه للفئة التي تحتاجه، فالتجارة يلزمها تسويق كي تنجح وتستمر في السوق، وإن عصب تجارتك في العمل الحر هو أعمالك السابقة، وأخلاقك مع العملاء، إضافة إلى سلوكك العام سواء على الويب أو خارجه. البصمة الرقمية ولا شك أن سمعة التاجر في السوق هي رأس ماله الأكبر، وبما أن سوقك سيكون الإنترنت من الآن فلا شك أن عليك الانتباه إلى سمعتك فيه، فلا تظن أن حساباتك الاجتماعية وتعليقاتك الساخرة أو صورك مع عائلتك التي تنشرها فيها بمعزل عن عملائك. وقد ترى أن هذه حياتك التي تخصك وحدك، لكن اعلم أن الإنترنت ليس فيه حدود جغرافية ولا سياسية تمنع أحدًا من المرور من مكان لآخر، وعليه فلا يصح قياس حدود العالم الحقيقي به، فإن بيتك في العالم الحقيقي له حرمته وحدوده وآدابه التي يلتزمها من يدخله، بل لا يكاد يدخله أحد إلا بإذنك، وكذلك جلساتك مع أصدقائك ومعارفك ونزهاتك في الحدائق، فلا يُتصور أن يقتحم هذه المواطن غريب عليك وإلا عده الناس من التجسس والتطفل. لكن الإنترنت يختلف في هذا، إذ يستطيع أي شخص أن يستطلع بصمتك التي تتركها على الإنترنت بضغطة زر، فيعرف الأماكن التي زرتها والأشخاص الذين تعرفهم وتقابلهم، والأحداث التي تتابعها والصور التي تنشرها، إذ أن أغلب الناس -بكل أسف- لا يتحرجون من نشر هذه البيانات على الملأ في حساباتهم الاجتماعية هذه الأيام. وبغض النظر عن خطر ذلك بشكل عام على من يفعل هذا إلا أننا لن نذكر هنا إلا أثر هذه البصمة الرقمية لك في الإنترنت على عملك الذي تريد البدء فيه، فإن هذه البصمات لا تكاد تُمحى من ذاكرة الإنترنت. وذلك أن العميل قد لا يعرفك أنت في البداية، بل يبحث عن "تصميم ديكور داخلي مثلًا" فتظهر له أنت من بين نتائج البحث، ويبدأ في تصفح المعلومات المتوفرة عنك بما فيها معرض أعمالك وتقييمات العملاء الذين تعاملوا معك، وسيصل في الغالب إلى حساباتك الاجتماعية إن كنت تستخدم نفس الاسم فيها. فإن رأى العميل أن عملك ممتاز لا غبار عليه لكنه كذلك وجد شكاوى من عملائك السابقين عن سوء تعاملك معهم، ووجد ألفاظك وسلوكك العام على الشبكات الاجتماعية غير سوي فإنه قد يحجم عن التعامل معك! ونعود لحجة أن هذه حساباتك الاجتماعية وليظن من شاء ما شاء، ونعود لتذكيرك مرة أخرى أن الإنترنت يختلف عن العالم الحقيقي، لكنه يتشابه معه في أن العميل يسأل محركات البحث أولًا ويجمع البيانات الكافية عن المستقل قبل التعامل معه. ونصيحتنا لك في هذا الشأن أن تكون واعيًا بما تنشره في الإنترنت بشكل عام، لا من أجل عملائك فقط، بل من أجل نفسك وأهلك من بعدك، فإن محو البصمات الرقمية صار في غاية الصعوبة هذه الأيام، وإن عملك الحر سيضطرك إلى استخدام اسمك الحقيقي وبعض بياناتك الحقيقية، فلا تسمح لنفسك بأمور صبيانية قد تندم عليها لاحقًا. وإن هذا الباب واسع ويطول التفصيل فيه مما قد ينقل المرء من درجة الوعي بما ينشر إلى الحذر مما ينشر، لكننا رأينا أن نقصر الحديث عما يخص سمعتك مع عملائك فقط، وننصحك في هذا الشأن بقراءة مقالة تأثير شخصيتك في وسائل التواصل على عملك المنشورة في أكاديمية حسوب. عناصر التسويق الناجح للمستقلين يندفع الكثير عند التسويق لأنفسهم أو لشركاتهم إلى البدء مباشرة في هذه القناة أو تلك دون أن يكونوا على علم بفحوى الرسالة التسويقية التي يريدون إيصالها، تلك الرسالة التي ستخبر العميل المحتمل بأنك هنا وأنك خبير في مجالك ويستطيع الاعتماد عليك عندما يحتاجك في عمل ما. ولا شك أننا نرغب كلنا بأن نكون "خبراء في تصميم الغرافيك" مثلًا أو "الأفضل على مستوى العالم العربي" أو "الأول في كذا وكذا"، أو غير ذلك من تلك الكلمات التي قد تكون مبالغة في الوصف، والتي لا يفضّل العميل سماعها أبدًا، فالأسلوب الأمثل للتسويق لا يعتمد على مثل هذه المبالغات. وفيما يلي بعض العناصر الأساسية للرسالة التسويقية الفعالة التي يجدر الاهتمام بها: تحديد الهدف من الرسالة التي تريد أن تصل إلى العميل. التركيز في تلك الرسالة على الفوائد التي ستقدمها للعميل. الإجابة عن الأسئلة التي لدى العميل تجاه خدمتك. ذكر كيفية خدمتك لعملائك بالشكل الأمثل لهم. لذا قبل أن تبدأ بالتسويق لنفسك بطريقة تبعث الملل في نفس العميل حاول أن تتأكد من أنك تعرف ما يلي: نقاط قوتك. رسالتك التسويقية. عملاؤك، وأين هم، وكيف يمكن أن تصل إليهم؟ الأسئلة التي لديهم والمشاكل التي ستحلها لهم (إن كنت تقدم خدمة محددة واحدة)؟ كيف ستستخدم خبرتك في حل مشاكل العميل؟ ثم ننظر بعدها في بعض عناصر التسويق وقنواته التي يجب أن تجهزها على أكمل وجه، والتي نوردها فيما يلي. الملف الشخصي لعلك سجلت على إحدى منصات العمل الحر، مثل مستقل أو خمسات، لكنك لم تحصل على أي فرصة للعمل حتى الآن، وربما حاولت مرارًا وقدمت عروضًا هنا وهناك لعدد من العملاء، لكن عرضك يُقابل بالرفض رغم شعورك بأنك الشخص الأنسب لتنفيذ المشروع! قد يكون السبب هو المنافسة الشديدة، هذا وارد في أي سوق، لكن قد يكون السبب الجوهري في أغلب الأحيان هو عدم وجود معرض أعمال في حسابك أو حتى ملف شخصي يجذب العملاء إليك ويقنعهم أنك مناسب للعمل. والملف الشخصي هو سيرتك الذاتية المختصرة التي تضعها في صورة موقعك الشخصي أو على منصات العمل الحر لتعكس هويتك المهنية أي خبراتك ومهاراتك وأعمالك وحياتك المهنية والعلمية وغير ذلك، ومن المهم في الملف الشخصي أن تركّز على مهاراتك من ناحية، وعلى ما تقدمه للعميل من ناحية أخرى. فلا تكتب فيه مثلًا كل ما تعلمته وعملته وأقمته وأقعدته فقط كي تقول للعميل أنك المستقل الخارق الذي سيفعل كيت وكيت، بل اذكر فيه ما يجعل العميل يقول أنك الشخص المناسب لمشروعه. حدث مرة أني طلبت من يوغرطة بن علي -المدير الأسبق لأكاديمية حسوب- أن يراجع سيرتي الذاتية، فأرسل لي أن سيرتي لا تصلح لعرضها على شركة أو حتى عميل عادي، ذلك أني كتبت فيها سيرتي كلها مفصلة، ما تعلمته وعملت فيه ودرسته، ظنًا مني أني أبهر من يقرؤها. ثم أخبرني مستطردًا أن أذكر في سيرتي الذاتية ما يجعله يوافق على توظيفي لوظيفة س أو ص، فإن كنت درست الهندسة الميكانيكية وأنا أتقدم إلى وظيفة مترجم مثلًا فإن هذه الدراسة لن تؤثر في قرار توظيفي بالقدر الذي يحدثه ذكر أني عملت في مجلة كذا وكذا من قبل، أو ترجمت كتاب كذا وكذا في نفس المجال الذي أتقدم إلى الترجمة فيه. وهكذا نريدك أن تجعل صفحة ملفك الشخصي محددة للغاية وذات هدف واضح ورسالة بارزة، وقد جمعنا لك بعض النقاط التي يجب أن تنظر فيها عند صياغة ملفك الشخصي: 1- الوصف الواضح لعملك كأن تكتب: مطوّر تطبيقات ويب، مسؤول تسويق إلكتروني، وغير ذلك. واحرص على ما يلي: الكلمات المفتاحية التي تعبّر عن عملك. استخدام كلمات بسيطة وموجزة تصف مهاراتك بدقة. استخدام وصف مخصص ودقيق، فتجنب الوصف الفضفاض لعملك. كتابة عدد سنوات خبرتك إن كان لديك خبرة زمنية. واعلم أن المنافسة بين المستقلين كبيرة للغاية، وأن اﻷخذ بالنقاط السابقة يظهر عملك وهويتك ويميزك عن المنافسة. 2- صورتك الشخصية لقد صارت جودة الصور التي تخرجها كاميرات الهواتف الآن جيدة جدًا موازنة بما مضى، وإنا لنعلم أن هذا يدفع الكثيرين إلى الاكتفاء بالصورة التي التقطوها من كاميرا الهاتف لاستخدامها كصورة في الملف الشخصي لهم، فقد كان أغلبنا من هؤلاء ذات يوم. وإن هذا لا بأس به إن كانت لديك خبرة بالتصوير والإضاءة ونظريات الألوان، لكننا نرى أن الاستثمار في استئجار مصور محترف لاختيار صورة مناسبة بكاميرا عالية الدقة سيكون مثمرًا على المدى القريب والعاجل، ذلك أن كاميرا الهاتف وإن كانت جيدة فإنها تقصر عن تسجيل التفاصيل الدقيقة التي توصل الانطباع الأولي الممتاز الذي ترغب به. وذلك شيء ليس بوسعك التحكم به، إذ أن حساس الكاميرا ضئيل جدًا موازنة بالموجود في الكاميرات الاحترافية، والحساس الأكبر يعني ضوءًا أكثر ومساحة أكبر لالتقاط ذلك الضوء، بل مساحة أكثر لكل بكسل في هذا الحساس. ومن ثم فإن الصورة الملتقطة بكاميرا SLR ومن مصور محترف ستحمل الكثير من التفاصيل لوجهك وملابسك وملامح نظرتك، وكل ذلك يوصل الانطباع الأولي للعميل، موازنة بصورة الهاتف الفاقدة لكل هذه التفاصيل. ولك أن تتخيل أن الصور الملتقطة بالكاميرات عالية الدقة تحتاج إلى معالجة بالفوتوشوب لتصحيح "عيوب العدسة" المستخدمة في التقاط الصورة، فما بالك بكاميرا الهاتف؟ واعلم أن الصورة الاحترافية لا يعني أنها ستكون مليئة بالتعديلات التي تخفي العيوب والجوانب التي لا تعجبك في الصورة، ولا يعني أنك يجب أن تكون مرتديًا زيًا رسميًا حتى، بل يكفي أن تكون لطيفة وملائمة كصورة عمل. كذلك، احرص ألا تكون صورة حسابك الشخصي للعمل بها حيوانك الأليف أو أحد أبنائك مثلًا، أو صورتك على شاطئ البحر أو في نزهة مع أهلك، أو حتى صورة ممثل أو لاعب كرة مشهور! بل هي الصورة التي يراها العملاء فيعرفوا أنك أهل للثقة، فلا تبالغ في تعابير وجهك لا بالضحك ولا بالحزم، بل تعبير هادئ وبسيط ويوحي بالثقة من النفس في غير غرور ولا كِبر. طيب، لنقل أنك ترفض وضع صورتك الشخصية لسبب ما، فما العمل حينها؟ تستطيع رفع صورة بها اسمك -لا تكتبه بيدك- على خلفية بسيطة أو أحادية اللون، وإن كنت تمثل شركة أو لديك شركة فيمكنك وضع شعار الشركة، وهكذا، لكن لا تنحرف إلى ما نهينا عنه قبل قليل من استخدام صور الأبناء أو الحيوانات أو الورود والممثلين والسيارات وغير ذلك. أو تستطيع استخدام صور الوجوه المرسومة بشكل ثنائي الأبعاد كصور الأفاتار الافتراضية في المواقع أو المولدة عبر تطبيقات مخصصة، وذلك بديل وخيار مناسب أيضًا. 3- الإشارة إلى أعمالك في الملف الشخصي إن كنت مبرمجًا فإن هذا يعني حسابك في GitHub مثلًا، وإن كنت مصممًا فموقع Behance، وهكذا، إذ يريد العميل أن يطلع على خلفيتك ليتأكد من صدق دعواك في العرض الذي وضعته. لكن، ليس لدي أعمال سابقة! ماذا أفعل؟ ننصحك هنا بالبدء بالعمل التطوعي لبناء نماذج لأعمالك، أو تنفيذ أعمال خاصة بك في مجالك ثم عرضها في المعرض، فلا بأس بإنشاء بعض التصميمات أو عرض بعض البرامج أو عينات الترجمة أو غيرها وفق مجالك الذي تعمل فيه، ليرى العميل نموذجًا عن جودة عملك. ذلك أن أول مشروع ينفذه المستقل يمثل هاجسًا لدى الكثير منهم، فيشعرون أنهم بحاجة لمشروع مكتمل صدّق عليه عميل من قبل، كي يعرضوه للعملاء المحتملين كنموذج عن العمل، وهذا الإشكال يمكن حله بعمل خدمات تطوعية بما أنها متاحة أكثر من الخدمة المدفوعة أو أن تحاول تقديم نموذج مجاني يعبّر عن عملك كما ذكرنا. فمثلًا إن كنت تعمل في مجال التحرير أو الترجمة، ابدأ فورًا بترجمة مقالات أو مواضيع يسمح أصحابها بترجمتها بشكل تطوعي وانشرها على مدونتك الخاصة أو على أحد المواقع المناسبة للنشر أو حتى حساباتك الاجتماعية إن لم يكن لديك شيء تنشر عليه، كما يمكنك مثلًا التطوع لترجمة مقطع فيديو في TED وبالتالي تستطيع إضافة هذا العمل لمعرض أعمالك. أو إن كنت مصممًا، فابدأ الآن كذلك بعمل تصاميم دون طلب من عميل معين، وابنِ معرضًا لأعمالك على موقع بيهانس Behance مثلًا بشكل يعكس اهتمامك واحترافيتك في العمل. 4- أضف لمحة عنك أجب عن هذه الأسئلة التي تمثل بعض التساؤلات الشائعة عند العملاء، ومن ثم لخصها في عدة مقاطع بسيطة، لتستطيع كتابة لمحة مختصرة ووافية عنك: ما هو مجال عملك أو اختصاصك؟ ما هي عدد سنوات خبرتك؟ ما هو مدى كفاءتك في استخدام البرامج والتقنيات اللازمة ضمن مجال عملك؟ ما هي أبرز إنجازاتك؟ ما هي المهارات التي تمتلكها؟ وهنا يجب الحديث عن نوعي المهارات التقنية والفنية (مثل اللغة التي تتقنها) والشخصية مثل (إدارة فريق عمل)، ويجب أن يقدم هذا الملخص للعميل أهم ما يرغب بمعرفتك عنك، فحاول أن يكون متوسط الطول، واذكر فيه من مهاراتك وخبراتك ما يمكن أن تقدمه لعميلك، وما الذي يميزك عن بقية المنافسين. وابدأ بأهم المعلومات التي تحب أن يقرأها العميل، لأن نسبة كبيرة منهم لن يقرؤوا كامل الملخص الذي ستكتبه، وإنما ستتصفحه أعينهم بشكل حرف F، بمعنى أنهم سيقرؤون أول سطرين مثلًا ثم يتجاوزون المكتوب إلى أسفل قليلًا ثم يقرؤون سطرًا أخر ثم يمرون لأسفل مجددًا، وهكذا. لذا، يجب أن يكون المستقل واضحًا فيما يكتب وقادرًا على إعطاء العميل انطباعًا أوليًا جيدًا وبسرعة بحيث يستطيع جذب اهتمام العميل خلال الثواني المعدودة التي سيقرأ فيها صفحة المستقل الشخصية. نصائح إضافية إن كنت تستطيع تقديم ملخص مرئي عنك فهذه إضافة محمودة، ولا يُعد الفيديو أمرًا ضروريًا أو أساسيًا لكنه يعزز ثقة العميل بك ويعبّر عن مدى احترافيتك في العمل، واستخدم فيه لغة سليمة وخالية من الأخطاء اللغوية، واستعن بمتخصص لغوي إن لم تكن واثقًا من عدم وجود أخطاء. وإن هذا من الأهمية بمكان، إذ لا يُتصور مثلًا قبولك في مشروع للتدقيق اللغوي أو الترجمة والكتابة وأنت تخطئ في هجاء الكلمات وتصريفها في نص عرضك على المشروع! فترفع المنصوب وتجر المرفوع، وتضع ألفًا مكان الفتحة، ولا تعرف الفرق بين النهي والنفي وأيهما مجزوم بالحذف مثلًا. وبشكل عام، انتبه لما يلي عند صياغة ملفك الشخصي: توضيح صياغتك وتسهيل قراءتها، كأن تقسم الفقرات وتستخدم التعداد الرقمي والنقطي. وضع وسيلة تواصل أو أكثر تناسب أغلب أو كافة العملاء. تحديث ملفك الشخصي بشكل دائم، فهو سيرتك الذاتية. تدريب: استخدم النصائح التي تعلمتها قبل قليل لتعدّل حسابك الشخصي الذي أنشأته في المنصات التي اخترتها، سواءً مستقل أو خمسات. مثال على الملف الشخصي لسارة شهيد في موقع مستقل: معرض الأعمال (Portfolio)؟ معرض أعمالك هو المكان الذي تعرض فيه سوابق أعمالك التي تقول للعميل أنك تفهم مجالك جيدًا، وهذا المكان إما موقعك الشخصي أو منصة عمل حر على الويب، إذ توفر بعض المنصات مثل موقع مستقل إمكانية إضافة معرض أعمال شخصي داخل حساب كل مستقل ويجب أن يحتوي المعرض على أهم الأمثلة ونماذج الأعمال والمشاريع التي نفذتها سابقًا بحيث يمكن للعميل الاطلاع عليها واستشفاف خبرتك وجودة عملك منها. ويُعد معرض الأعمال من المتطلبات الأساسية لأي مستقل سواء كان مطورًا أو مصممًا أو معدّ محتوى أو غير ذلك، وقد تكتفي بمعرض الأعمال الموجود داخل منصة التوظيف أو العمل الحر التي تستخدمها أو قررت استخدامها إن لم تكن قد عملت من قبل على إحدى تلك المنصات، لكن بشكل عام فإنك بحاجة لمعرض أعمال خاص بك إذا قررت التعامل مع العملاء خارج منصات التوظيف تلك. وكما قلنا، لا تضع كافة أعمالك ضمن معرض الأعمال بل تكفي الأعمال المميزة فقط، وإن كان هناك أي عمل لست راضيًا عنه فلا تضفه، لكن المهم أن يضم كافة مهاراتك وخبراتك مهما كانت متنوعة، كما يجب أن يتم تحديثه بشكل دائم. وتذكر أن الملف الشخصي ومعرض الأعمال الاحترافيين هما العاملان الرئيسيان عند اختيار أي شخص لتوظيفه في عمل ما، ولو أحسنت تقديمهما مع كتابة عرض مناسب على المشاريع المختلفة فإنك تزيد بذلك حصولك على فرصة العمل التي تتقدم إليها. أين هو معرض أعمالي؟ قلنا أن بإمكانك إنشاء معرض أعمال في منصة العمل الحر التي تعمل بها، وأن الأفضل هو إنشاء موقع شخصي لك يكون بمثابة محطة للعملاء الذين يقصدونك أو الذين يبحثون عن مثل خدمتك، فيروا عليه أعمالك السابقة و"سيرتك العملية" إن شئت أن تسميها كذلك. فإما أن يكون لك موقع شخصي، أو تكون منصة العمل التي اخترتها -سواء مستقل أو خمسات أو غيرهما- بها إمكانية إضافة أعمالك السابقة. فمثلًا، توفر منصة مستقل قسمًا لتضيف فيه معرض أعمالك ليطلع عليه العملاء، فانظر مثلًا صفحة، معرض الأعمال. هناك خيار ثالث وهو أن تكون أعمالك في موقع يختص بمجال بعينه مثل التصميم أو البرمجة، إذ من المشهور أن مصممي الجرافيك بشكل عام يرفعون أعمالهم إلى مواقع مثل behance، وكذلك يرفع المبرمجون برامجهم ومساهماتهم في البرامج إلى مواقع مثل GitHub وإن كان يُستخدم كأداة لمتابعة العمل على المشاريع وتطويرها إلا أن برامجك ستكون معروضة فيه، ذلك إلى جانب المواقع التي تتيح إنشاء معارض أعمال في هيئة مواقع كاملة تصلح لأغلب الأغراض العامة سواء كانت هندسية أو إبداعية أو قانونية أو غير ذلك من الأنشطة التجارية، مثل squarespace. الهوية التجارية ستدرك بالتدريج أثناء عملك على الإنترنت كمستقل أنك بحاجة إلى هوية شخصية لك، وسترى أن هذه الهوية تختلف من مستقل إلى آخر وفق مجاله وشريحة العملاء التي يستهدفها، فالمبرمج مثلًا لا يهمه تصميم شعار منمق ذي ألوان زاهية مثلًا مراعيًا فيها النسبة الذهبية في عناصره، ذلك أن العملاء يحتاجون من يبني لهم تطبيقًا أو موقعًا يعمل بكفاءة وسرعة ودون أخطاء، فهوية المبرمج هنا يجب أن تقول هذا للعملاء، ومهما كان الشعار جميلًا فإن العملاء لا يلتفتون إليه. وكذا قل في مجالات مثل الترجمة والتدقيق اللغوي وإدخال البيانات وإنشاء دراسات الجدوى والمساعدة الافتراضية وغيرها، إذ أن فلسفة الشعار تعبر عن مضمون الخدمة التي يقدمها صاحبه، ففي بعض الحالات قد تكفي صورتك الشخصية فقط وكل ما زاد على ذلك يعد بهرجة لا فائدة منها وقد توحي للعميل أنك تبالغ في تجميل نفسك لتغطي على فقر جودة عملك. ولا نقول أن الحالات أعلاه لا تحتاج إلى شعار بالضرورة، وإنما يُنظر في الفئة التي يستهدفها المستقل، فإن كان يستهدف شركات وأعمال مثلًا فإن الشعار هنا قد يكون ضرورة، مما رأيناه من خبراتنا في التعامل مع الشركات أو العمل فيها، أن الهوية التي تقدم بها الأطراف نفسها تلعب دورًا مهمًا للغاية في قرار إبرام الصفقة. بل إن الأمر يتعدى مجرد اختيار شعار إلى تصميم قوالب بريدية متسقة مع الهوية التي اختارها المستقل، واختيار برامج محددة للتواصل وأخرى بديلة لها إن حدثت طوارئ، وصياغة عقود واضحة البنود ومراجعةٌ من قانونيين وفق البلاد التي يتعامل المستقل مع شركاتها، وتحديد شروط العمل بدقة من البداية وأيام الإجازات ومواعيد الردود على الرسائل وغير ذلك. ذلك أن المستقل لا يتعامل مع شخص طبيعي هنا فيتفاوض معه بسهولة ومرونة على أي طارئ يحدث أثناء العمل، ولا يدقق العميل كثيرًا إن اجتمع المستقل معه من غرفة نومه أو من مكتبه أو من حديقة منزله -رغم أننا ننصح بتطبيق هذه القواعد في سائر عملك ومع جميع عملائك، إلا أننا نبين أهمية بنود معينة لبعض العملاء-، وذلك على خلاف التعامل مع شركات، إذ يتعامل المستقل مع موظف داخل الشركة يكون مسؤولًا عن إنجاز مهمة ما عن طريق تفويض طرف خارجي -هو أنت في هذه الحالة-، أو قد يضيق به الوقت عن إنجازها فيتجه إلى توظيف أطراف خارجية، أو قد يكون بين يديه مشروع فيه قسم خارج نطاق خبرته فيحتاج استشارة من متخصص غير موجود بالشركة، فكل هذا يصب في جيب المستقلين في النهاية. وبالعودة إلى أهمية الشعار المرئي المناسب، فهو ضرورة في مجالات مثل التصميم ثلاثي الأبعاد وثنائي الأبعاد وتصميم تجربة الاستخدام وغيرها من الأمور الفنية، إذ يجب أن يعرف العميل من مجرد النظر إلى شعارك أنك الشخص المناسب لإنجاز عمله، ويجب هنا أن تدرس بعناية نظريات الألوان والنسب الذهبية في شعارك، إذ هذا هو شعار عملك، حرفيًا. فاختر النمط المناسب لك مما سبق ليعبر عن عملك ويعكس الفكرة والرسالة التي تريد إيصالها إلى العملاء. ويمكن تلخيص عناصر بناء الهوية التي يجب عليك مراعاتها عند التخطيط لعلامتك التجارية فيما يلي: 1- اتساق الهوية ووحدتها تظهر وحدة هويتك في تناسق وثبات أنواع خطوطك، وألوانك التي تستخدمها في النصوص والإطارات والرموز وغير ذلك، بين مستنداتك إلى ملفات تسليم أعمالك إلى موقعك، … إلخ. وتجنب التغيير العشوائي في هذه الهوية، فكلما استقرت وتعامل معها العملاء زاد احتمال حفظهم لها وتعرفهم عليها بمجرد رؤيتها. وبحكم عملي في تصميم تجربة الاستخدام والتصميم المرئي من قبل فإني أقول لك بكل ثقة أن ثبات الهوية ذاك أمر مهم جدًا جدًا، فقد لا يحفظ العميل سوى هويتك تلك وينسى اسمك أو وسائل التواصل الأخرى معك، ويظل يبحث عن شعارك أو شكل مستنداتك أو موقع يحمل هويتك دون جدوى، وقد يكون مر عليك وتركك لأنه رأى هويتك اختلفت فلم يميزك. لهذا مثلًا فإن شركة باناسونيك (Panasonic) ظلت تبيع منتجات تحت اسم ناشيونال (National) لأكثر من ثمانين عامًا، ولما قررت أن توحد تسمية منتجات الشركة تحت مظلة باناسونيك بعد أن كانت تبيع تحت أسماء ناشيونال (National) وسانيو (SANYO) وغيرها، نفذت ذلك على مراحل استمرت أكثر من خمس عشرة سنة! فإني أذكر أن غلاف التلفاز لدينا كان مكتوبًا عليه أن "تلفاز ناشيونال صار الآن تلفاز باناسونيك"، لكن التلفاز نفسه حمل شعار ناشيونال، وكنا نظن وقتها أن باناسونيك اشترت ناشيونال، وأن منتجات ناشيونال أجود من باناسونيك! ولو أن الشركة غيرت اسمها فجأة لفقدت قطاعات كبيرة جدًا من أسواقها التي كانت تشتري منتجاتها دون أن تعلم أنها تابعة لها. 2- التميز لعلك قد علمت إلى الآن أنك ستدخل سوقًا كبيرة وفيها منافسة قد تأتيك من أي بقعة على المعمورة، فأنت الآن بين أمرين إذا قدمت خدمة تتشابه كثيرًا مع الموجود في المحيط أو المجال أو المنصة التي ستعمل عليها، إما ستضطر إلى المنافسة على السعر، أو ستقرر التميز عن هذه المنافسة بأمر أو أكثر لا ينافسك فيه أحد أو تكون المنافسة قليلة موازنة بالنمط المنتشر لأسلوب تقديم خدمتك. فمثلًا، قد تتيح للعميل عدد مرات مراجعة أكثر من غيرك، أو تنجز له العمل في وقت أقل، أو تقلل سعر خدمتك إذا زاد التعامل بينك وبين العميل عن قيمة معينة، فتخصم له من تكلفة العمل أو غير ذلك. وقد جربت مثل ذلك سواء في عملي على الإنترنت أو تجارتي على الأرض، فقد عرف عملاء التصميم أني أبني جمال المظهر على كفاءة العمل، وليس العكس، فكان يأتيني من يعرف أني قد أحذف له نصف بنود قوائم تطبيقه واستماراته، وأصبغ له موقعه بلون أساسي ثم أبني عليه، مع تقليل الألوان المستخدمة قدر الإمكان، وإعطاء أهمية كبرى للمساحات البيضاء في التصميمات، وتناسق مظهرها الهندسي وترتيب ظهور بنودها، هذا بعد اجتماعات ونقاشات حول خلفية مشروعه ومجال عمله، من أجل اختيار التصميم المناسب سواء في تجربة الاستخدام أو التصميم المرئي. وقد عرفت أن هذا قد لا يفعله عديد من المصممين، لكني استغللت خلفية فنية وعملية من مجالات مختلفة في إتقان هذا الجانب، وعليه فلم أكن أقلق كثيرًا من المنافسة. كذلك فإني مضطر لطبيعة عملي إلى تغيير جدول أعمالي بمرونة وفق الظروف التي قد تطرأ عليه، وقد كان يتسبب هذا في تأخير تسليم أعمال إلى عملائي، فماذا أفعل؟ كنت أقدم اعتذاري للعميل وأرفق ما يثبت مبرر تأخري إن دعت الحاجة، وأخصم له من قيمة العمل ما يقابل تأخري عليه، أو أخصم له من قيمة المشاريع التالية بيني وبينه. فهذا تميز كذلك ورفع لما تقدمه إلى مرتبة يقل منافسوك فيها، ويطلبك عملاؤك الذين يبحثون عما عندك ولا يجدونه عند غيرك. وقد يظهر التميز في القيمة المضافة التي يقدمها المستقل، مثل جودة الخدمة وطريقة تقديمها، والخدمات المكملة لها مثل خدمة ما بعد البيع، فمثلًا، لي تجارة على الأرض في إصلاح الهواتف، ويريد العاملون معنا أن يتميزوا عن السوق المحيط بهم، فماذا اختاروا أن يفعلوا؟ لقد درسوا السوق جيدًا ورأوا أن مشاكل العملاء محصورة في سوء المعاملة وخوفهم من سرقة بياناتهم أو أجزاء من هواتفهم، وكذلك رداءة القطع المستخدمة في الإصلاح. فقرروا أن يحسنوا معاملة العملاء بتقديم الهدايا لهم فوق عملية الإصلاح نفسها، وإحسان مخاطبتهم وتنسيق بياناتهم، ومراجعة حالة الهاتف على فترات متعاقبة بعد تسليم الهاتف. وكذلك رفضوا التعامل مع أي شيء يمس بيانات العميل من بطاقات ذكية ونسخ بيانات أو غير ذلك، كي يطمئن العميل أن بياناته في أيد أمينة، ولا تُطلب كلمات المرور إلا عند الحاجة الملحة، وتكون أمام العميل. كذلك فإن عملية الإصلاح نفسها يستطيع العميل أن يطلع عليها إن أراد أن يستوثق من أمانة العمل، وقد قرروا كذلك رفض أي عملية إصلاح يطلب العميل فيها تركيب قطعة أردأ أو أقل ثمنًا، بل يرشدونه بلطف حينها إلى من يقدم هذه الخدمة. فكان نتيجة هذا "التخصص" أن امتازوا عن غيرهم من السوق، وصار لهم شريحة محددة من العملاء الذين رأوا أنهم أفضل من يلبي طلباتهم بالشكل الذي يريدونه. وهذا يجعل العملاء يذكرونك تلقائيًا عند احتياجهم لإحدى خدماتك، ذلك أن تخصصك وتميزك عن السوق في أمر بعينه شكل العلاج المناسب للمشكلة التي يعاني منها العملاء. التقييمات وتوصيات العملاء تُعد آراء العملاء وتقييماتهم إحدى أهم العوامل التي تؤثر على سمعتك أو علامتك التجارية كمستقل، فالتسويق باستخدام الكلمة الطيبة (Word of Mouth Marketing) هو أقوى طريقة للتسويق عند المستقلين أو غيرهم. فإن عميلًا واحدًا راضيًا يساوي عددًا أكبر من العملاء المحتملين الذين سيخبرهم عن جودة عملك وضرورة التعامل معك عند الحاجة. في حين أن عميلًا واحدًا غير راضٍ يعني أنك أمام خسارة عدد لا بأس به من العملاء المحتملين الذين اقتنعوا بأن جودة خدماتك غير مناسبة وعليهم إيجاد مستقل آخر للتعاون معه. وقد تعتقد بأن خسارة عميل واحد ليست أمرًا ذا شأن، لكن عليك التفكير بالأمر مرة ثانية. سواء كنت تستخدم منصات العمل الحر أو تتعامل مع العملاء عبر منصات وقنوات تواصل أخرى، ذلك أن تقييمات العملاء وتوصياتهم ستلعب دورًا مهمًا في حصولك على المزيد من العملاء لاحقًا، وأن هذه التقييمات لا تُمحى بسهولة كما ذكرنا أول كلامنا. وفي حال عدم حصولك على تقييم من العميل مباشرةً، يمكنك طلب التقييمات والتوصيات من العملاء بأي وقت لعرضها على موقعك أو حتى عبر صفحتك في مواقع التواصل الاجتماعي. سيكون لها تأثير جيد على أي عميل محتمل يقوم بتصفح موقعك للاطلاع أكثر على خدماتك وطبيعة عملك. لكن، وفي الوقت نفسه، فإن حصولك على تقييمات سلبية لا يعني أنك فشلت في مهنتك وعليك إيجاد مهمة أخرى. فحتى لو أمضيت ساعات من العمل الجاد، سيكون من الطبيعي أن ينتقد أحد العملاء عملك أو إبداء عدم إعجابه به. فاعلم أن آراء أو ردود الفعل التي يقوم بها العملاء هي آراء غير شخصية وغير موجهة لشخصك أنت كمستقل. وقد يكون تلقي الانتقادات أمرًا صعبًا للغاية، لكن عقولنا تولي أحيانًا الكثير من الأهمية للمواقف أكثر مما تستحق في الواقع. وفي معظم الحالات يُنقد العمل فقط، ولا تُنتقد أنت شخصيًا. بل، في الواقع، قد يكون الشخص الذي تتعامل معه يحترمك بشدة ولا يرغب بإيذائك بأي شكل من الأشكال، لكنه في الوقت ذاته صادق بآرائه - سواء اتفقت معها أم لا، وكلما تعاملت أكثر مع مواقف كهذه يصبح من الأسهل بالنسبة إليك التعامل مع النقد الموجه للعمل بشكل أفضل. فمثلًا، إن وظفت شخصًا لتصميم موقعك فإنك سترغب في التعبير عن رأيك بشأن رؤيتك للموقع حسب الصورة التي رسمتها أنت له، فقد يكون هناك بعض الجوانب التي تريد تغييرها أثناء ذلك العمل، وعليه فإن ردود فعلك هي تأثير طبيعي لما تراه في العمل. وسائل التواصل الاجتماعي قد يبدو خيار التسويق عبر الشبكات الاجتماعية هو الإجابة البديهية للتسويق لنفسك، ولعلك محق في الغالب، فقد صار من المعتاد أن تلجأ إلى هذه الشبكات حين تبحث عن مصور لزفافك أو مطعم أثناء نزهتك أو حتى عن نجار يصلح لك باب بيتك، فإنها قد استحوذت على نصيب وافر من التسويق حقًا، لكننا نريدك أن تعيد النظر فيها قبل اتخاذ قرار اعتمادها كوسيلة من وسائل التسويق والتعامل مع العملاء. فيجب أن تنظر أولًا إلى مناسبتها لشريحة العملاء الذين تستهدفهم، فإن موقع فيس بوك وإنستجرام مثلًا يصلحان للأعمال العامة مثل البيع والشراء والخدمات المحلية ونحو ذلك، ومن ناحية أخرى فإن موقعًا مثل لينكدإن يصلح للأعمال الإدارية والخدمات التقنية، أما يوتيوب فهو يتسع ليشمل كل ما سبق، وإن كان يبرز في المجالات التي تحتاج إلى عرض بصري، مثل الخدمات الفنية واليدوية، إضافة إلى التسويق الشخصي حين تدعو الحاجة إلى ربط العمل أو الخدمة بمن يقدمها في ذهن العميل. وهكذا فمن المهم دراسة مدى مناسبة الشبكة الاجتماعية التي تريد التسويق فيها لمجالك قبل البدء في التسويق هنا وهناك وإضاعة الوقت في تخطيط المحتوى والتسويق والتدوين والتسجيل المرئي والصوتي وغير ذلك ثم لا تجد مردودًا من حيث عدد العملاء القادمين إليك من تلك الشبكات. واحرص على اتباع إرشادات الهوية التي عرضناها فيما سبق، فإن الحسابات الاجتماعية امتداد لهويتك الشخصية والتجارية، خاصة إن كنت تستخدم نفس الاسم فيها. العلاقات العامة والتشبيك لا يخفى على كل ذي عقل متابع للسوق أن شبكة العلاقات التي يبنيها تلعب دورًا لا يقل أهمية عن كفاءته وشهاداته التي حصل عليها، بل قل إن شئت أنها أهم من شهاداتك وخبراتك! وقد كُتب في أهمية التعامل مع الناس في السوق بالحسنى وبناء الروابط والعلاقات الصادقة معهم ما لا يمكن حصره. فأصحاب الأعمال يختارون العمل مع شخص يرتاحون بالتعامل معه وبينهم وبينه معرفة سابقة ما استطاعوا، فلن تجد شخصًا يغامر بماله ووقته مع غريب لا يعرفه، بل سيفضل العمل مع شخص يعرفه من قبل أو يعرف شخصًا رشحه له. وهكذا تتضح لك أهمية العلاقات العامة بينك وبين عملائك وزملائك في السوق، والتي يحلو للبعض في السوق الرقمي تسميتها بالتشبيك، حصرًا لها في تشبيك أطراف العمل ببعضهم وتعريفهم ببعضهم بعضًا. لكن التشبيك أو العلاقات العامة لا تقف عند من يوصلك بصاحب عمل أو يعرفك عليه، بل هذه العلاقات مفيدة لأنها تنشئ شبكة واسعة من المعارف، وأعني هنا بالمعارف العلوم التي يمكن اكتسابها بالتواجد مع هذه الشبكة، فقد تتعرف على زميل لك في منصة العمل الحر التي تعمل عليها أو في مجتمع أو منتدى أو شبكة اجتماعية، يكون عنده من العلم ما ليس عندك في مجال ما، فتسأله وتستشيره لتستفيد من خبرته وتطور من أسلوب عملك وسوق عملائك. وكما ستنشئ شبكة من الزملاء فإنك لا محالة ستتعرف على عدد غير قليل من العملاء المحتملين سواء أشخاصًا أو شركات، وليس شرطًا أن تتعرف عليهم بنية العمل معهم لاحقًا، لكننا نقول هذا لعلمنا أن فئة غير قليلة من العاملين على الإنترنت هي من الشخصيات التي لا تفضل التعامل مع الناس وجهًا لوجه، فنوضح هذا لهم كي يدركوا أهمية التواجد في مجتمع عوضًا عن الانعزال وحدهم، فإنه وإن كان ما يفضلونه لحياتهم الشخصية إلا أن ذلك يضر عملهم ولا يفيده. ذلك أننا لا نريد أن يُفهم كلامنا على أننا نشجع على بناء علاقات من أجل العمل فقط، بل العكس تمامًا، فإن العلاقات من أجل العمل تكون أحيانًا ضيقة الأفق وقصيرة الردود، وهذا من تجربتي الشخصية مع المحيطين بي من العملاء سواء في تجارتي على الأرض أو في عملي على الويب، وإنما أدعوك إلى محاولة بناء رابطة حقيقية مع العميل أو الزميل الذي تتعامل معه في حدود المسموح عُرفًا ودينًا واللائق أخلاقًا وأدبًا. كيف يمكن للتشبيك أن يساعدك؟ في بداية عملك ستحتاج للبحث عن فرص العمل، إلا أن بناء شبكة من العلاقات يعني أن فرص العمل قد تبحث عنك أيضًا. سيعرف الأشخاص من حولك الخدمات التي تستطيع تقديمها، ومن ثم سيعملون معك أو يزكونك عندما يسمعون بأن شخصًا يحتاج إلى الخدمات التي تقدمها. 1- الحصول على الخدمة الأولى إننا نؤكد مرة أخرى على أننا لا نقصد بالتشبيك هنا بناء علاقات تدفعها المادة والمصلحة فقط، لكن ما يحدث في السوق هو المنطق الطبيعي للتوظيف، فإن كنتَ في دائرة معارفي وأعرف أنك مصمم أو كاتب أو مبرمج جيد، فإني سأرشحك أنت حين أُسأل عن شخص في مجال خبرتك وعملك، لأني ببساطة أعرفك وأطمئن إليك وأثق بك. وهذا ما حدث معي شخصيًا في أغلب الأعمال التي عملت بها في العقد الماضي، وأنا الذي حذفت موقعي الشخصي وحذفت حساباتي الاجتماعية لخمس سنوات كاملة! فهذا يعني أنني قللت وجودي على الويب بشكل كبير، لكن رغم ذلك فإن الأشخاص القلائل الذين تعرفت عليهم وبنيت معهم رابطة قوية قبل تلك المرحلة كلفوا أنفسهم عناء البحث عن وسيلة للتواصل معي للسؤال حينًا ولعروض أعمال أحيانًا أخرى معهم أو مع غيرهم، كأن يخبروني أن جهة ما سألتهم عن كذا وكذا فرشحوني أنا للعمل ويستأذنونني في إرسال بريدي إلى تلك الجهة. فما بالك إن كان لك حضور قوي على الويب سواء بموقع شخصي أو بحسابات نشطة على لينكدإن وغيره؟ 2- بناء العلاقات كما ذكرنا قبل قليل، فإن بعض الدراسات تشير إلى أن أصحاب العمل يميلون لتوظيف الأشخاص الذين يميلون إليهم بشكل متكرر وليس بالضرورة الأشخاص الأكثر تأهيلًا. إذا كنت تعرف عميلًا بشكل شخصي، فمن المرجح أن يمنح العمل إليك بدلًا من منحه لشخص لا تربطه به أية علاقة. 3- التعاون عند بناء شبكة واسعة من المستقلين الآخرين، قد تتم دعوتك للمشاركة في مشاريع معينة بالتعاون مع أحد المستقلين. في الوقت نفسه، يمكنك أيضًا المحاولة للحصول على فرص عمل أكبر لأنك على تواصل مع أشخاص يمكنك مشاركة العمل معهم. نصائح لتساعدك في التشبيك وبناء العلاقات إن العثور على أشخاص آخرين في مجال العمل نفسه طريقة جيدة لتوسيع شبكة علاقاتك، إذ يجب ألا ترى المستقلين الآخرين كمنافسين، واعلم أن أغلبهم سيكونون سعداء بتبادل المعرفة والنصائح والأدوات بالإضافة إلى تقديم التوصيات أو العمل معك في مشاريع أكبر. وفيما يلي بعض النصائح لإنشاء شبكة علاقات جيدة مع غيرك من المستقلين: 1- استخدم التشبيك كأسلوب دائم تتوفر فرص التواصل وبناء العلاقات في كل مكان: الحفلات، اجتماعات الأصدقاء، المناسبات الاجتماعية وحتى المؤتمرات والندوات وغير ذلك. طالما هناك مجموعة من الأشخاص، هناك فرص لتوسيع شبكتك. هذا لا يعني توزيع بطاقة العمل على جميع الأشخاص، بل يعني الاستماع إلى أولئك الأشخاص وبناء روابط حقيقية مع المناسب منهم كما ذكرنا مما لا ينافي العرف والدين والصالح من التقاليد السائدة، فحينها قد يخبرك أحدهم بوجود مشكلة ما في عمله، أو أنه يحتاج إلى المساعدة في مشروع معين، فتستطيع التواصل معه وتقديم المشورة إليه. عمومًا، من أفضل الطرق للحصول على عمل جديد هي أن تكون كريمًا بتقديم المساعدة، فدعم الآخرين هو أسلوب مناسب لجذب انتباه العميل المحتمل لمهاراتك وقدراتك. كمان أن مساعدة الآخرين بالاعتماد على خبرتك يجعلك مصدرًا مهمًا للمعلومات القيمة بالنسبة لهم كما يتيح لهم معرفة مهاراتك وطلبها كخدمة لاحقًا. والأهم من ذلك، أنها تجعلهم ممتنين وسعداء بتزكيتك لأصدقائهم ومعارفهم لاحقًا. 2- تكوين صداقات مع مستقلين آخرين سيكون من الممتع أن تتحدث مع أشخاص مهتمين بنفس الأمور والمواضيع التي تهمك. لذلك، يعد التواصل مع المستقلين الآخرين فرصة لبناء كل من شبكة علاقاتك الشخصية والمهنية. لدى سارة شبكة كبيرة من المستقلين الآخرين الذين تتشارك معهم بعض المشاكل وكيفية حلها مثل تحويل الأرباح، كما يناقشون العديد من المشاريع الكبيرة ويتشاركونها من أجل لتقديم جودة أفضل، وخاصةً إن كان لكل منهم اختصاص دقيق يبرع به. 3- حضور الفعاليات من المهم أن تلتقي بأشخاص آخرين بهدف التواصل وتطوير عملك. ولعل إحدى أسهل الطرق للقيام بذلك هي حضور الفعاليات المرتبطة بالعمل المستقل أو المرتبطة بعالم الأعمال بشكل عام والتي يمكن أن تضم بعض العملاء المحتملين. 4- استخدم مواقع التواصل الاجتماعي والشبكات المهنية على الإنترنت تعتبر المواقع الاجتماعية والمهنية مكانًا رائعًا للعثور على العملاء المحتملين. كما أنها تسمح لك بإظهار معرفتك في مجال عملك وجذب العملاء وبناء العلاقات. عليك أن تبدأ بتحسين ملفك الشخصي بجميع تفاصيله لتبدو محترفًا ولا تنسَ إضافة عبارة تحث العميل على اتخاذ إجراء معين أي التواصل معك على سبيل المثال. خلاصة المقال وهكذا نأمل أن تكون بعد قراءة هذا المقال قد عرفت عناصر التسويق الناجح للمستقلين، وأهمية التقييمات وتوصيات العملاء والعلاقات العامة لك في عملك كمستقل. وفي المقال التالي سننظر في الإدارة الفنية للمشروع. كتبت سارة شهيد المسودة الأولية لهذه المقالة. اقرأ أيضًا المقال التالي: الإدارة الفنية للمشروع للعامل المستقل المقال السابق: الدخول إلى سوق العمل الحر على الإنترنت كيف تكتب النبذة التعريفية بك لعملك المستقل. طرائق لبناء معرض أعمال لعملك المستقل بأرخص ما يمكن تأثير شخصيّتك في وسائل التواصل على عملك النسخة الكاملة من كتاب دليل المستقل والعامل عن بعد1 نقطة
-
السلام عليكم تلاوة قديمة جداً للقرآن واريد تحسين جودة الصوت وازالة التشويش منها .. ما هي الطريقة الافضل لذلك وأي البرامج المتخصصة يمكن استعمالها ؟1 نقطة
-
اريد ان اغير ايقونه البرجر التي تظهر عند عرض 768px الى ايقونه اغلاق عند الضغط عليها لكن لم تعمل معي هل يمكنك مساعدتي ؟ Restaurant_website_1.zip1 نقطة
-
تحليل رابط نستخدم الدالة parse_url() لتقسيم رابط (url) إلى مكوناته الفردية: $url = 'http://www.example.com/page?foo=1&bar=baz#anchor'; $parts = parse_url($url); تصبح محتويات المتغير $parts بعد تنفيذ الشيفرة السابقة: Array ( [scheme] => http [host] => www.example.com [path] => /page [query] => foo=1&bar=baz [fragment] => anchor ) يمكنك أن ترجع أيضًا مكون واحد من الرابط بشكلٍ انتقائي، فمثلًا لترجع سلسلة الاستعلام (query string) فقط: $url = 'http://www.example.com/page?foo=1&bar=baz#anchor'; $queryString = parse_url($url, PHP_URL_QUERY); يعدّ أيّ من الثوابت التالية مقبولًا: PHP_URL_SCHEME PHP_URL_HOST PHP_URL_PORT PHP_URL_USER PHP_URL_PASS PHP_URL_PATH PHP_URL_QUERY PHP_URL_FRAGMENT يمكنك استخدام الدالة parse_str() لتحليل سلسلة الاستعلام إلى أزواج مفتاح/قيمة: $params = []; parse_str($queryString, $params); تصبح محتويات المتغير $params بعد تنفيذ الشيفرة السابقة: Array ( [foo] => 1 [bar] => baz ) بناء سلسلة استعلام للرابط من مصفوفة تنشأ الدالة http_build_query() سلسلة استعلام من مصفوفة أو كائن، يمكن أن تُضاف هذه السلسلة إلى رابط ما لإنشاء طلب من النوع GET أو تُستخدم في طلب POST مع مكتبة cURL مثلًا: $parameters = array( 'parameter1' => 'foo', 'parameter2' => 'bar', ); $queryString = http_build_query($parameters); تصبح محتويات المتغير $queryString بعد تنفيذ الشيفرة السابقة: parameter1=foo¶meter2=bar تعمل الدالة http_build_query() مع المصفوفات متعددة الأبعاد أيضًا: $parameters = array( "parameter3" => array( "sub1" => "foo", "sub2" => "bar", ), "parameter4" => "baz", ); $queryString = http_build_query($parameters); تصبح محتويات المتغير $queryString بعد تنفيذ الشيفرة السابقة: parameter3%5Bsub1%5D=foo¶meter3%5Bsub2%5D=bar¶meter4=baz والذي هو النسخة المرمزة للرابط: parameter3[sub1]=foo¶meter3[sub2]=bar¶meter4=baz إعادة التوجيه إلى رابط آخر يمكنك استخدام الدالة header() لتوجيه المتصفح ليعيد التوجيه إلى رابط مختلف: $url = 'https://example.org/foo/bar'; // فحص الترويسات - لايمكنك إرسال ترويسات إذا أُرسلت بالفعل if (!headers_sent()) { header('Location: ' . $url); // الحماية من تنفيذ الشيفرة بعد إعادة توجيه الطلب exit; } else { throw new Exception('Cannot redirect, headers already sent'); } يمكنك أيضًا إعادة التوجيه إلى رابط نسبي (هذا ليس جزء من توصيف HTTP الرسمي، لكنه يعمل مع جميع المتصفحات): $url = 'foo/bar'; if (!headers_sent()) { header('Location: ' . $url); exit; } else { throw new Exception('Cannot redirect, headers already sent'); } إذا كانت الترويسات قد أُرسلت، يمكنك إرسال وسم HTML meta refresh. يعتمد وسم meta refresh على معالجة HTML بشكلٍ صحيح عند العميل لكن قد لايتم ذلك وفقًا للمطلوب، بشكلٍ عام يعمل بشكل صحيح فقط مع متصفحات الويب، ويجب أن تنتبه أيضًا أنه إذا كانت الترويسات قد أُرسلت بالفعل فقد تحصل على خطأ وهذا يشغّل استثناءً. يمكنك أيضًا أن تطبع رابطًا يضغط عليه المستخدم للعملاء الذين يتجاهلون وسم meta refresh: $url = 'https://example.org/foo/bar'; if (!headers_sent()) { header('Location: ' . $url); } else { // الحماية من رؤية المتصفح للرابط على أنّه HTML $saveUrl = htmlspecialchars($url); // إخبار المتصفح أن يعيد توجيه الصفحة إلى $saveUrl بعد 0 ثانية print '<meta http-equiv="refresh" content="0; url=' . $saveUrl . '">'; // إظهار الرابط للمستخدم print '<p>Please continue to <a href="' . $saveUrl . '">' . $saveUrl . '</a></p>'; } exit; كيفية تحليل رابط عند كتابتك شيفرة بلغة PHP قد تحتاج إلى تقسيم رابط إلى عدة أجزاء، ويوجد عدة طرق لذلك وفقًا لاحتياجاتك، سنشرح هذه الطرق في الفقرة التالية لتختار منها ما يناسبك. استخدام parse_url() تحلل الدالة parse_url() رابطًا وتعيد مصفوفة ترابطية (associative array) تتضمن مكونات الرابط المختلفة. $url = parse_url('http://example.com/project/controller/action/param1/param2'); /* Array ( [scheme] => http [host] => example.com [path] => /project/controller/action/param1/param2 ) */ يمكنك استخدام الدالة explode إذا كنت تحتاج أن يكون path مقسّمًا: $url = parse_url('http://example.com/project/controller/action/param1/param2'); $url['sections'] = explode('/', $url['path']); /* Array ( [scheme] => http [host] => example.com [path] => /project/controller/action/param1/param2 [sections] => Array ( [0] => [1] => project [2] => controller [3] => action [4] => param1 [5] => param2 ) ) */ يمكنك استخدام الدالة end() إذا كنت تحتاج الجزء الأخير من sections: $last = end($url['sections']); إذا كان الرابط يحتوي على متغيرات GET يمكنك استعادتها أيضًا: $url = parse_url('http://example.com?var1=value1&var2=value2'); /* Array ( [scheme] => http [host] => example.com [query] => var1=value1&var2=value2 ) */ إذا أردت تقسيم متغيرات الاستعلام يمكنك استخدام parse_str() كما يلي: $url = parse_url('http://example.com?var1=value1&var2=value2'); parse_str($url['query'], $parts); /* Array ( [var1] => value1 [var2] => value2 ) */ استخدام explode() تعيد الدالة explode مصفوفة من السلاسل النصية، كل منها سلسلة جزئية من سلسلة نصية مُشكَّلة من تقسيمها على الحدود التي يشكّلها حد السلسلة النصية. $url = "http://example.com/project/controller/action/param1/param2"; $parts = explode('/', $url); /* Array ( [0] => http: [1] => [2] => example.com [3] => project [4] => controller [5] => action [6] => param1 [7] => param2 ) */ يمكنك استعادة الجزء الأخير من الرابط كالتالي: $last = end($parts); // param2 يمكنك أيضًا التنقل في المصفوفة باستخدام sizeof() مع عامل رياضي كما في الشيفرة التالية: echo $parts[sizeof($parts)-2]; // param1 استخدام basename() تُعطى الدالة basename() سلسلة نصية تتضمن مسارًا إلى ملف أو مجلد وترجع مكوّن الاسم الزائد أي ترجع الجزء الأخير من الرابط فقط. $url = "http://example.com/project/controller/action/param1/param2"; $parts = basename($url); // param2 إذا كان الرابط يحتوي على المزيد من الأشياء وكل ما تحتاجه هو اسم المجلد الذي يتضمن الملف الذي تستخدمه عندها يمكنك استخدام dirname(): $url = "http://example.com/project/controller/action/param1/param2/index.php"; $parts = basename(dirname($url)); // param2 ترجمة -وبتصرف- للفصول [URLs - How to break down an URL] من كتاب PHP Notes for Professionals book اقرأ أيضًا المقال التالي: معالجة بيانات طلبيات HTTP والتعامل مع أخطاء رفع الملفات في PHP المقال السابق: شرح المولدات وتوضيح مفهوم المغلف (closure) في PHP1 نقطة
-
السلام عليكم .. أريد ان اكتب هذا الاكشن ولكن باستخدام Axios وليس باستخدام ال Fetch .. ما هى التغييرات التى يجب ان أجريها هنا ؟؟ export const fetchProducts = () => { return async (dispatch) => { try { const response = await fetch( "https://rn-shopping-app-69186.firebaseio.com/products.json" ); if (!response.ok) { throw new Error("Error - something went wrong"); } const resData = await response.json(); const loadedProducts = []; for (const key in resData) { loadedProducts.push( new Product( key, resData[key].title, resData[key].imageUrl, resData[key].description, resData[key].price ) ); } dispatch({ type: SET_PRODUCTS, products: loadedProducts, }); } catch (error) { throw error; } }; };1 نقطة
-
بما أنك تقوم باستعادة البيانات للمستخدم من قاعدة البيانات بعد تسجيل دخوله وتحفظها في الجلسة، تستطيع أيضاً تحديد الحقول الفارغة في سجله، وبعدها بنفس الطريقة التي ترسل فيها البيانات من الخادم إلى المستخدم تستطيع إرسال رسائل مخصصة تفيد بأن بعض الحقول فارغة ويجب تعديلها. في حال لم تتمكن من حل المشكلة يمكنك مشاركة جزء من الكود الذي ترغب بالمساعدة به لنستطيع مساعدتك بشكل أفضل.1 نقطة
-
إن التحقق من صحة المدخلات أو البيانات يمكن أن يتم في منطقتين: إما عند المستخدم أي متصفح الويب وبذلك يتم التأكد من المدخلات قبل إرسالها إلى خادم الويب. وأيضاً عند خادم الويب نفسه، بحيث عند وصول البيانات إليه يقوم بالتحقق من صحتها قبل البدء بعملية معالجتها أو تخزينها في قاعدة البيانات. للتحقق من البيانات عند طرف المستخدم (أي متصفح الويب) يتم استخدام javascript في ال forms المستخدمة والتي يتم إدخال البيانات فيها، مثال ليكن لدينا حقل البريد الالكتروني التالي: <form name="myForm" action="/action_page.php" onsubmit="return validateForm()" method="post"> Name: <input type="text" name="email"> <input type="submit" value="Submit"> </form> وعندها يمكن عند الضغط على زر submit التحقق من حقل البريد الالكتروني قبل إرسال الطلب إلى خادم الويب كالتالي: function validateForm() { var x = document.forms["myForm"]["email"].value; if (x == "") { alert("يرجى تعبئة حقل البريد الالكتروني"); return false; } وبالتالي سيظهر رسالة خطأ في حال كانت خانة البريد الالكتروني فارغة. وبنفس الطريقة يمكنك وضع الشروط الأخرى حسب الطلب مثل أن يكون البريد الالكتروني صحيح أو كلمة المرور أكبر من عدد محدد من المحارف،...إلخ. أما من جهة خادم الويب، فإن ذلك يعتمد على حسب لغة البرمجة التي تقوم باستخدامها من طرف الخادم، ولكن عموماً المبدأ هو نفسه فعند استقبال البيانات يتم أيضاً التحقق من صحتها عن طريق وضع شروط if else وفي حال لم تكن البيانات موافقة للشروط المذكورة يتم إرسال رسالة خطأ من الخادم إلى المستخدم. بعد التعديل على سؤالك: يمكنك عند القيام بجلب بيانات المستخدم من القاعدة وتخزينها في الجلسة التأكد من الحقول الفارغة في سجله في قاعدة البيانات وإرسال الرسالة المطلوبة إلى المستخدم.1 نقطة
-
لدي API مبنية بواسطة لارافيل وتتصل مع تطبيق Angular موجود على اسم نطاق وخادم ويب مختلف. أحاول استخدام Sanctum للتحقق من الطلبات المستقبلة من Angular ولكنها لا تحوي CSRF Token ولذلك احصل على الخطأ: CSRF token mismatch error حاولت إرسال طلب التحقق من المستخدم للخادم كالتالي: this.http.get('sanctum/csrf-cookie') .pipe( switchMap(result => this.http.post('auth/login', {'email': email, 'password': password})) ); ولكن لم تعالج المشكلة1 نقطة
-
المشكلة تحدث هنا لأن متصفح الويب أو تطبيق Angular سيقوم فقط بإرفاق الـ cookie للطلبات التي تنتمي لنفس اسم النطاق التي يتم عبره استقبال الطلبات. لحل هذه المشكلة أولاً تأكد من أنك تقوم باستخدام relative routes فمثلاً بدلاً من: /api/sanctum/crsf نقوم بكتابة: http://example.com/sanctum/crsf ثم يجب عليك إعداد خصائص البروكسي ضمن ملف proxy.conf.json ونضعه في المجلّد الجذر للمشروع: { "/api/*": { "target": "http://example.ocm", "secure": false, "changeOrigin": true, "logLevel": "debug", "pathRewrite": { "^/api": "" } } } ثم نقوم بتعديل الملف angular.json: "architect": { ... "serve": { ... "options": { .... "proxyConfig": "proxy.conf.json" } } } ثم أخيراً في ملف .env نقوم بالتعديلات التالية للتأكد من أن sanctum يقوم بالتعرف على الطلبات وإرفاق cookies معها: SANCTUM_STATEFUL_DOMAINS=localhost,.example.com SESSION_DRIVER=cookie SESSION_DOMAIN=localhost1 نقطة
-
أحاول تطوير نسخة مشروع مبني باستخدام Laravel و Vue JS إلى لارافيل 8، ولكن عند تنفيذ: npm run dev يظهر لدي هذا الخطأ: app.js:44258 Uncaught ReferenceError: route is not defined حاولت تتبع الخطأ فلاحظت وجود خط أحمر على السطر التالي: Vue.mixin({ methods: { route } }); ولكن لم استطع تحديد المشكلة أو كيفية حلها1 نقطة
-
قد يحدث تضارب عند تحديث النسخة إلى 8 مع blade في استخدام routes خاصةً في حال تم اختيار Jetstream لحل هذه المشكلة أولاً يمكن إنشاء مجلد resources كالتالي: composer require tightenco/ziggy npm install ziggy-js php artisan ziggy:generate "resources/js/ziggy.js" ثم يجب تعديل ملف webpack.mix.js: mix.js('resources/js/app.js', 'public/js') .webpackConfig(require('./webpack.config')); وأيضاً الملف ./webpack.config: لكي يتم التعرف على المسارات routes: const path = require('path'); module.exports = { resolve: { alias: { '@': path.resolve('resources/js'), ziggy: path.resolve('vendor/tightenco/ziggy/src/js/route.js'), }, }, }; وأخيراً ضمن الملف app.js: import route from 'ziggy'; import { Ziggy } from './ziggy'; ... Vue.mixin({ methods: { route: (name, params, absolute) => route(name, params, absolute, Ziggy), }, }); ... new Vue({ el: "#app", render: (h) => h(InertiaApp, { props: { initialPage: JSON.parse(app.dataset.page), resolveComponent: (name) => require(`./Pages/${name}`).default, }, }), }); وبذلك يتم الاستغناء عن vue-router ويتم أخذ jetstreams ليصبح توجيه المسارات من قبل Laravel1 نقطة
-
أهلا عبد الواحد، أعتقد أن حل المشكلة كما تفضل الزملاء، لم يتم التعرف على توابع وورد بريس، في حال لم تنفع الحلول أرجو إعادة التعليق. شكرا لك1 نقطة
-
يستخدم الوسم الفارغ <> </> إختصاراً ل fragment الخاصية التي تمكنك من إضافة أكثر من عنصر بدون الحاجة لوضعهم بداخل عنصر واحد كالتالي render() { return ( <React.Fragment> <header /> <main /> <footer /> </React.Fragment> ); } //إختصاراً سنقوم بكتابة التالي render() { return ( <> <header /> <main /> <footer /> </> ); } بينما إذا أردت تطبيق الكود بالأعلى بدون <> </> سيظهر لك خطأ وستضطر لوضع ال header وال main و ال footer بداخل عنصر واحد كالتالي render() { return ( <div> <header /> <main /> <footer /> </div> ); }1 نقطة
-
يتم جمع الاختبار الأول مع الثاني مع النهائي وطباعة تقدير الطالب على النحو التالي : أقل من 60 يطبع راسب من 60 - 69 يطبع مقبول من 70- 79 يطبع جيد من 80 -89 يطبع جيد جداً من 90 -100 يطبع ممتاز مع ملاحظة أنه في حالة درجة الطالب في الاختبار الأول أو الثاني أقل من 5 درجات يعتبر راسب وأن لا تقل درجة الاختبار النهائي عن 20 درجة يعتبر أيضاً راسب .1 نقطة
-
في الكود المنشور في منشور حزمة firebase_admob يوجد السطر البرمجي التالي: const String testDevice = 'YOUR_DEVICE_ID'; لما اعمل تشغيل للكود او المثال المنشور في الاضافة احصل على السطر البرمجي التالي: Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("****************") to get test ads on this device. طبعا هو يعطيني رقم جهازي بدل النجوم وفي حالة قمت بوضعه في السطر المكتوب بـ testDevice بين الاقواس كود الاعلانات شغال لدي 100%100 ولكن لو لم اضعه احصل على الخطاء البرمجي التالي: I/Ads (29451): Use RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("*************") to get test ads on this device. W/flutter (29451): onAdFailedToLoad: 3 I/Ads (29451): Ad failed to load : 3 I/flutter (29451): BannerAd event MobileAdEvent.failedToLoad وهذا الكود البرمجي كامل: // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // ignore_for_file: public_member_api_docs import 'dart:io'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_admob/firebase_admob.dart'; // You can also test with your own ad unit IDs by registering your device as a // test device. Check the logs for your device's ID value. const String testDevice = 'YOUR_DEVICE_ID'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo( testDevices: testDevice != null ? <String>[testDevice] : null, keywords: <String>['foo', 'bar'], contentUrl: 'http://foo.com/bar.html', childDirected: true, nonPersonalizedAds: true, ); BannerAd _bannerAd; NativeAd _nativeAd; InterstitialAd _interstitialAd; int _coins = 0; BannerAd createBannerAd() { return BannerAd( adUnitId: BannerAd.testAdUnitId, size: AdSize.banner, targetingInfo: targetingInfo, listener: (MobileAdEvent event) { print("BannerAd event $event"); }, ); } InterstitialAd createInterstitialAd() { return InterstitialAd( adUnitId: InterstitialAd.testAdUnitId, targetingInfo: targetingInfo, listener: (MobileAdEvent event) { print("InterstitialAd event $event"); }, ); } NativeAd createNativeAd() { return NativeAd( adUnitId: NativeAd.testAdUnitId, factoryId: 'adFactoryExample', targetingInfo: targetingInfo, listener: (MobileAdEvent event) { print("$NativeAd event $event"); }, ); } @override void initState() { super.initState(); FirebaseAdMob.instance.initialize(appId: FirebaseAdMob.testAppId); _bannerAd = createBannerAd()..load(); RewardedVideoAd.instance.listener = (RewardedVideoAdEvent event, {String rewardType, int rewardAmount}) { print("RewardedVideoAd event $event"); if (event == RewardedVideoAdEvent.rewarded) { setState(() { _coins += rewardAmount; }); } }; } @override void dispose() { _bannerAd?.dispose(); _nativeAd?.dispose(); _interstitialAd?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('AdMob Plugin example app'), ), body: SingleChildScrollView( child: Center( child: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: <Widget>[ RaisedButton( child: const Text('SHOW BANNER'), onPressed: () { _bannerAd ??= createBannerAd(); _bannerAd ..load() ..show(); }), RaisedButton( child: const Text('SHOW BANNER WITH OFFSET'), onPressed: () { _bannerAd ??= createBannerAd(); _bannerAd ..load() ..show(horizontalCenterOffset: -50, anchorOffset: 100); }), RaisedButton( child: const Text('REMOVE BANNER'), onPressed: () { _bannerAd?.dispose(); _bannerAd = null; }), RaisedButton( child: const Text('LOAD INTERSTITIAL'), onPressed: () { _interstitialAd?.dispose(); _interstitialAd = createInterstitialAd()..load(); }, ), RaisedButton( child: const Text('SHOW INTERSTITIAL'), onPressed: () { _interstitialAd?.show(); }, ), RaisedButton( child: const Text('SHOW NATIVE'), onPressed: () { _nativeAd ??= createNativeAd(); _nativeAd ..load() ..show( anchorType: Platform.isAndroid ? AnchorType.bottom : AnchorType.top, ); }, ), RaisedButton( child: const Text('REMOVE NATIVE'), onPressed: () { _nativeAd?.dispose(); _nativeAd = null; }, ), RaisedButton( child: const Text('LOAD REWARDED VIDEO'), onPressed: () { RewardedVideoAd.instance.load( adUnitId: RewardedVideoAd.testAdUnitId, targetingInfo: targetingInfo); }, ), RaisedButton( child: const Text('SHOW REWARDED VIDEO'), onPressed: () { RewardedVideoAd.instance.show(); }, ), Text("You have $_coins coins."), ].map((Widget button) { return Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: button, ); }).toList(), ), ), ), ), ); } } كيف ممكن حل هذا المشكلة لو تكرمتو؟ مع العلم اني اختبر المشروع ب جهازي الحقيقي وليس محاكي الاندرويد1 نقطة
-
ممكن ترفق ملفات المشروع كاملاً؟ وتأكد من <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="[ADMOB_APP_ID]"/> داخل ملف AndroidManifest.xml بحيث أنه [ADMOB_APP_ID] هو معرف التطبيق على أدموب. لتجريب المشروع والتأكد من أنك قمت بالخطوات كاملاً يرجى إرفاق ملفات المشروع للمساعدة في حل المشكلة.1 نقطة
-
كيف يُمكن إضافة ملف لدوال مساعدة في laravel و إستخدام هذه الدول في أي مكان أريد سواء في المتحكمات او ملفات العرض او في كلاسات أخرى.1 نقطة
-
يمكنك في المسار التالي maiproject\app صنع مجلد جديد وليكن باسم Helpers ثم في داخل المجلد هذا نضع ملف اسمه helpers.php. ومن ثم فليكن الملف بداخله هكذا <?php if (! function_exists('create_option')) { function create_option($table = '',$value = '',$show = '',$selected = '', $where = null) { if($where != null){ $results = DB::table($table)->where($where)->orderBy('id','DESC')->get(); }else{ $results = DB::table($table)->orderBy('id','DESC')->get(); } $option = ''; foreach ($results as $data) { if($data->$value == $selected){ $option .= '<option value="' . $data->$value . '" selected>' . (isset(unserialize($data->$show)[get_option('language')]) ? unserialize($data->$show)[get_option('language')] : '') . '</option>'; }else{ $option .= '<option value="' . $data->$value . '">' . (isset(unserialize($data->$show)[get_option('language')]) ? unserialize($data->$show)[get_option('language')] : '') . '</option>'; } } echo $option; } } if ( ! function_exists('get_row')){ function get_row($table, $where = null , $order = 'ASC') { if($where != null){ $row = DB::table($table)->where($where)->orderBy('id', $order)->first(); }else{ $row = DB::table($table)->orderBy('id', $order)->first(); } return $row; } } if ( ! function_exists('get_table')){ function get_table($table, $where = null , $order = 'DESC') { if($where != null){ $results = DB::table($table)->where($where)->orderBy('id', $order)->get(); }else{ $results = DB::table($table)->orderBy('id', $order)->get(); } return $results; } } if ( ! function_exists('get_logo')){ function get_logo() { $logo = get_option("logo"); if($logo == ''){ return asset("public/uploads/images/default-logo.png"); } return asset("public/uploads/images/$logo"); } } if ( ! function_exists('get_icon')){ function get_icon($name) { return asset("public/images/icons/".$name); } } if ( ! function_exists('month_number_to_name')){ function month_number_to_name($month_number) { $month_name = date("F", mktime(0, 0, 0, $month_number, 10)); return $month_name; } } if ( ! function_exists('sql_escape')){ function sql_escape($unsafe_str) { if (get_magic_quotes_gpc()) { $unsafe_str = stripslashes($unsafe_str); } return $escaped_str = str_replace("'", "", $unsafe_str); } } if ( ! function_exists('get_option')){ function get_option($name, $optional = '') { $setting = DB::table('settings')->where('meta_key', $name)->get(); if ( ! $setting->isEmpty() ) { return $setting[0]->meta_value; } return $optional; } } if ( ! function_exists('timezone_list')) { function timezone_list() { $zones_array = array(); $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $zones_array[$key]['ZONE'] = $zone; $zones_array[$key]['GMT'] = 'UTC/GMT ' . date('P', $timestamp); } return $zones_array; } } if ( ! function_exists('create_timezone_option')) { function create_timezone_option($old="") { $option = ""; $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $selected = $old == $zone ? "selected" : ""; $option .= '<option value="'. $zone .'"'.$selected.'>'. 'GMT ' . date('P', $timestamp) .' '.$zone.'</option>'; } echo $option; } } if ( ! function_exists( 'get_country_list' )) { function get_country_list($selected = '') { if( $selected == "" ){ echo file_get_contents( app_path().'/Helpers/country.txt' ); }else{ $pattern = '<option value="'.$selected.'">'; $replace = '<option value="'.$selected.'" selected="selected">'; $country_list = file_get_contents( app_path().'/Helpers/country.txt' ); $country_list = str_replace($pattern, $replace, $country_list); echo $country_list; } } } if( !function_exists('load_language') ){ function load_language($active=''){ $path = resource_path() . "/_lang"; $files = scandir($path); $options = ""; foreach($files as $file){ $name = pathinfo($file, PATHINFO_FILENAME); if($name == "." || $name == "" || $name == "language"){ continue; } $selected = ""; if($active == $name){ $selected = "selected"; }else{ $selected = ""; } $options .= "<option value='$name' $selected>".ucwords($name)."</option>"; } echo $options; } } if( !function_exists('get_language_list') ){ function get_language_list(){ $path = resource_path() . "/_lang"; $files = scandir($path); $array = array(); $default = get_option('language'); $array[] = $default; foreach($files as $file){ $name = pathinfo($file, PATHINFO_FILENAME); if($name == "." || $name == "" || $name == "language" || $name == $default){ continue; } $array[] = $name; } return $array; } } if ( ! function_exists('counter')){ function counter($table, $where = null) { if($where != null){ $results = DB::table($table)->where($where)->count(); }else{ $results = DB::table($table)->count(); } return $results; } } if ( ! function_exists('count_inbox')){ function count_inbox() { $inbox = App\ContactMessage::where('status', 0)->count(); return $inbox; } } if (! function_exists('is_site_installed')) { function is_site_installed() { return is_file(public_path('install.txt')); } } ملاحظة هذا الكود مجرد مثال. ثم في ملف composer.json نضع بداخل السطر التالي "autoload": { "psr-4": { "App\\": "app/" }, "classmap": [ "database/seeds", "database/factories" ] }, فيكون "autoload": { "psr-4": { "App\\": "app/" }, "files": [ "app/Helpers/helpers.php" ], "classmap": [ "database/seeds", "database/factories" ] }, ثم نقوم بتنفيذ هذا الامر داخل terminal composer dump-autoload وهكذا نكون قد أضفنا هذا الملف للمشروع بكل سهولة.1 نقطة
-
دالتا VLOOKUP و HLOOKUP هي إحدى دوال البحث والإشارة Lookup and Reference وهي تُستخدم للبحث عن قيمة محددة في صف أو عمود، ومن ثم إرجاع قيمة معيّنة في الموضع نفسه من الصف أو العمود الثاني. سنتعرّف في هذا الدرس على هاتين الدالتين وكيفية استخدامهما. VLOOKUP اسم هذه الدالة هو اختصار لـ "Vertical Lookup" (البحث العمودي) وهي تُستخدم للبحث في عمود محدد عن قيمة محددة حسب الصفوف، وعند العثور على تلك القيمة تقوم بإرجاع ما يقابلها في العمود الثاني (الذي نقوم بتحديده في الصيغة أيضًا). يمكنك تشبيه عمل هذه الدالة بدليل الهاتف، حيث تقوم بالبحث عن رقم شخص محدد بالبحث عن اسمه أولا في عمود الأسماء، وعندما تجد الاسم المطلوب تعثر على الرقم الذي يقابله في العمود الثاني (عمود الأرقام). البناء العام لصيغة الدالة VLOOKUP (lookup_value; table_array; col_index_num; [range_lookup]) lookup_value: القيمة التي تريد البحث عنها. يجب أن تكون هذه القيمة موجودة في العمود الأول لنطاق الخلايا الذي نحدده في table_array. هذا المُعطى argument وجوده ضروري في الصيغة. table_array: ويمثل نطاق الخلايا الذي يحتوي البيانات التي تبحث فيها الدالة. وهذا المعطى وجوده ضروري أيضًا. col_index_num: رقم العمود في نطاق الخلايا table_array الذي يحتوي على القيمة التي سيتم إرجاعها. وجوده مطلوب في الدالة. range_lookup: هذا المعطى هو عبارة عن قيمة منطقية logical تحدد من خلالها فيما إذا كنت تريد من دالة VLOOKUP البحث عن تطابق تام (بإدخال القيمة FALSE) أو تطابق تقريبي (بإدخال القيمة TRUE) مع قيمة lookup_value، ووجوده اختياري في الصيغة. ملاحظة: عند استخدام القيمة المنطقية TRUE يجب أن يكون العمود الأول في نطاق الخلايا table_array مرتبا تصاعديا لكي يتم إرجاع قيمة صحيحة. هل ترغب في الحصول على مستندات إكسل احترافية؟ وظّف محلل بيانات خبير لتحرير مستنداتك وتنسيقها من مستقل أضف مشروعك الآن مثال 1 الجدول أدناه يحتوي على بيانات الموظفين لشركة ما. عدد صفوف الجدول هو 100 صف تقريبا. في مثل هذه الجداول الكبيرة (وما يفوقها) قد يكون من المضيعة للوقت البحث في كل صف من صفوف الجدول إذا رغبنا في العثور على معلومة معينة. وسيكون الأمر أسهل وأسرع بكثير باستخدام دالة VLOOKUP. المطلوب هنا هو العثور على قسم ومقدار راتب الموظف صاحب البطاقة رقم 100، والموظف صاحب البطاقة رقم 65. نضع المؤشر في الخلية التي نريد إرجاع القيمة الأولى فيها، وهي الخلية H2 في هذا المثال، ثم نذهب إلى تبويب: صيغ Formulas > بحث وإشارة Lookup & Reference > VLOOKUP في مربع الحوار Function Arguments نقوم بتحديد معطيات الدالة: في الحقل الأول، lookup_value، نحدد القيمة التي نريد البحث عنها، وهي رقم البطاقة "100" في هذا المثال، لذلك سنحدد الخلية G2 التي تحتوي هذه القيمة. في الحقل الثاني، table_array، نحدد نطاق الخلايا الذي يحتوي بياناتنا. في هذا المثال سنحدد الجدول بأكمله (A1:D100). في الحقل الثالث، col_index_num، ندخل رقم العمود الذي يحتوي على القيمة التي سيتم إرجاعها، وبما إننا نريد العثور على "قسم" الموظف، فسنقوم بإدخال الرقم "3"، وهو تسلسل عمود "القسم" في الجدول من اليمين إلى اليسار (أي أنّ تسلسل عمود "رقم بطاقة الموظف هو"1"، عمود "تاريخ التوظيف" هو "2"، وهكذا). إذا كان اتجاه الورقة من اليسار إلى اليمين نقوم بحساب رقم العمود من اليسار إلى اليمين. في الحقل الرابع، range_lookup، نقوم بإدخال الرقم صفر (والذي يعني القيمة المنطقية FALSE) لأننا نبحث عن تطابق تام مع الرقم "100"، وليس تطابق تقريبي، بسبب وجود أرقام قريبة من رقم "100" في عمود "رقم بطاقة الموظف". ننقر على OK، وسيتم العثور على قسم صاحب البطاقة رقم 100 فورا، وهو قسم "الخدمات": تفسير عمل الصيغة تقوم الصيغة أولا بالبحث في صفوف عمود "رقم بطاقة الموظف" واحدا تلو الآخر، وعندما تعثر على الرقم "100" تقوم بإيجاد القيمة التي تقابلها في عمود "القسم" ثم ترجع هذه القيمة في الخلية H2. نكرر نفس الخطوات للعثور على مقدار راتب الموظف صاحب البطاقة رقم "100"، وستكون المعطيات كما موضّح في الصورة التالية: قمنا بإدخال الرقم "4" في الحقل الثالث لأنّ تسلسل عمود "الراتب" في الجدول هو الرابع. وكما في الخطوة السابقة، يتم إيجاد النتيجة في الخلية G2: الخطوات نفسها تنطبق على رقم البطاقة "65". مثال 2 الجدول أدناه يحتوي على درجات اختبارين لمجموعة من الطلاب، مع متوسط الدرجات. المطلوب هو إيجاد تقدير كل طالب باستخدام دالة VLOOKUP: بالتأكيد يمكننا إدخال التقديرات يدويا لكل طالب اعتمادًا على قيمة المتوسط، لكن كما ذكرنا، تسّهل دالة VLOOKUP العمل وتختصر الكثير من الوقت. ملاحظة: قمنا بترتيب القيم في عمود "الدرجة" (وهو العمود الأول من نطاق الخلايا table_array) تصاعديا لأننا سنستخدم القيمة المنطقية TRUE في حقل range_lookup. نحدد الخلية التي نريد إرجاع النتيجة فيها، وهي الخلية E2 في هذا المثال، ثم نذهب إلى تبويب: صيغ Formulas > بحث وإشارة Lookup & Reference < VLOOKUP في الحقل الأول نحدد القيمة التي نريد البحث عن التقدير الذي يقابلها، وهي قيمة المتوسط للطالب الأول، 82، في هذا المثال (أي الخلية D2). في الحقل الثاني نحدد نطاق الخلايا الذي سيتم البحث عن التقدير المناسب فيه، وهو النطاق H1:I7. في الحقل الثالث نحدد رقم العمود الذي يحتوي على القيمة التي سيتم إرجاعها. وبما أنّ تسلسل عمود "التقدير" هو الثاني في نطاق الخلايا، سندخل الرقم "2". في الحقل الرابع ندخل الرقم 1 (والذي يعني القيمة المنطقية TRUE) أو نتركه فارغًا، وفي الحالتين سيتم إرجاع نفس النتيجة. السبب في أنّنا اخترنا القيمة TRUE هو أننا نبحث عن تطابق تقريبي مع القيم في عمود "الدرجة" وليس تطابق تام. ننقر على OK وسيتم إرجاع التقدير الذي يقابل قيم المتوسط: تفسير عمل الصيغة ستقوم الصيغة بالبحث عن القيمة "82" أو أقرب أقل قيمة إليها، وعند إيجادها، تقوم بإيجاد ما يقابلها في عمود "التقدير"، ومن ثم إرجاع النتيجة في الخلية E2. نستخدم التعبئة التلقائية لنسخ الصيغة إلى بقية خلايا عمود "التقدير": بعد نسخ الصيغة، نلاحظ حدوث خطأ في إيجاد القيم للخلايا من E7 إلى E23، والسبب هو أنّ البرنامج استخدم نطاق الخلايا H1:I7 كمرجع نسبي relative reference. لذلك سنعيد إدراج الصيغة ونستخدم نطاق الخلايا المذكور كمرجع مطلق absolute reference بوضع مؤشر الكتابة فوق اسم الخلية والنقر على مفتاح F4 (أو بكتابة علامة الدولار قبل وبعد حرف العمود يدويا من لوحة المفاتيح) هذه المرة سيتم إيجاد قيم صحيحة في عمود "التقدير" بأكمله عند استخدام التعبئة التلقائية: أو بدلا من استخدام نطاق الخلايا (H1:I7) كمرجع مطلق وتحديده يدويا كلما أردنا استخدام الدالة، نقوم بتسميته باسم مخصص. وبذلك نستطيع استخدام اسم النطاق في الصيغة. نحدد نطاق الخلايا، ندخل الاسم المرغوب في حقل الاسم (قمنا بتسميته بـ "التقدير")، ثم نضغط Enter: في المرة المقبلة، عندما نقوم بإدراج دالة VLOOKUP (أو أيّة دالة أخرى يُستخدم فيها ذلك النطاق)، نقوم بإدخال اسمه بدلًا من تحديده على الورقة: هذه الطريقة هي أفضل وأكثر كفاءة، وتجعلنا نتلافى الأخطاء التي قد تحدث عند استخدام نوع المرجع غير المناسب. أدخل بياناتك وعالجها بصور وأساليب متعددة بالإكسل استعن بأفضل مقدمي خدمات الإكسل على خمسات اطلب خدمتك الآن HLOOKUP تعمل دالة HLOOKUP (اختصارا لـ Horizontal Lookup) بالضبط كما تعمل دالة VLOOKUP فيما عدا أنّها تقوم بالبحث عن القيم أفقيا وليس عموديا (أي تبحث عن قيمة محددة في صف محدد حسب أعمدة ذلك الصف). البناء العام لصيغة الدالة HLOOKUP(lookup_value; table_array; row_index_num; [range_lookup]) lookup_value: هي القيمة التي تريد البحث عنها. يجب أن تكون هذه القيمة موجودة في الصف الأول لنطاق الخلايا الذي سنحدده في حقل table_array. وهذا المعطى مطلوب في الصيغة. table_array: وهو نطاق الخلايا الذي يحتوي البيانات التي تبحث فيها الدالة. وهذا المعطى مطلوب في الصيغة أيضًا. row_index_num: رقم الصف في نطاق الخلايا table_array الذي يحتوي على القيمة التي سيتم إرجاعها. وجوده مطلوب في الصيغة. range_lookup: هذا المعطى هو عبارة عن قيمة منطقية logical تحدد فيما إذا كنت تريد من دالة HLOOKUP البحث عن تطابق تام (بإدخال القيمة FALSE) أو تطابق تقريبي (بإدخال القيمة TRUE) مع قيمة lookup_value، ووجوده اختياري في الصيغة. ملاحظة: عند استخدام القيمة المنطقية TRUE يجب أن يكون الصف الأول في نطاق الخلايا table_array مرتبا تصاعديا لكي يتم إرجاع قيمة صحيحة. مثال الجدول التالي يحتوي على تواريخ بدء وانتهاء مجموعة من المشاريع. المطلوب هو إيجاد تاريخ انتهاء المشروع رقم 5. بالطبع يمكننا العثور عليه بسهولة في مثل هذا الجدول الصغير، لكن سيصبح الأمر أكثر صعوبة في الجداول الكبير. على كل حال، سنستخدم دالة HLOOKUP للعثور على القيمة المطلوبة. أولا، نحدد الخلية التي نريد إرجاع النتيجة فيها، وهي الخلية B9 في هذا المثال، ثم نذهب إلى تبويب: صيغ Formulas > بحث وإشارة Lookup & Reference < HLOOKUP في مربع الحوار Function Arguments نقوم بتحديد المعطيات: في الحقل الأول، lookup_value، نحدد القيم التي نريد البحث عنها، وهو رقم المشروع "5" في هذا المثال. لذلك سنحدد الخلية B8 التي قمنا بإدخال هذا الرقم فيها مسبقا. في الحقل الثاني، table_array، نحدد نطاق الخلايا الذي سيتم البحث فيه، وهو A1:I13 في هذا المثال. في الحقل الثالث، row_index_num نقوم بإدخال رقم تسلسل الصف الذي يحتوي على النتيجة التي سيتم إرجاعها. وفي هذا المثال هو صف "تاريخ الانتهاء"، تسلسله الثالث (3). في الحقل الرابع، lookup_range نقوم بإدخال الرقم صفر (أي القيمة المنطقية FALSE) لأننا نريد البحث عن قيمة مطابقة تماما للقيمة في حقل lookup_value: ننقر على OK وسيتم إرجاع تاريخ الانتهاء للمشروع رقم 5: تفسير عمل الصيغة ستقوم الصيغة بالبحث في صف "المشروع" عن الرقم 5، وعند العثور عليه ستقوم بإيجاد القيمة المقابلة لهذا الرقم في الصف المحدد في حقل row_index_num، وهو الصف الثالث في مثالنا، ومن ثم إرجاع النتيجة في الخلية B9. يجب أن تأخذ في الاعتبار أنّه إذا كانت قيمة lookup_range تساوي TRUE، ولم تتمكن الدالة من العثور على قيمة lookup_value فستقوم بإرجاع أقرب أقل قيمة من قيمة lookup_value. مثال 2 إذا كنا نريد معرفة تاريخ البداية للمشروع رقم "9" (والذي هو في الحقيقة غير موجود في الجدول) ستكون الصيغة كالتالي: وستكون النتيجة كالتالي: تفسير عمل الصيغة قامت الصيغة بالبحث عن الرقم "9" في صف "المشروع"، وقد تعذّر عليها إيجاده، لذلك قامت بإرجاع "تاريخ البدء" للمشروع رقم "8" وهو أقرب أقل قيمة من الرقم "9". وهذا بسبب أننا قمنا بإدخال القيمة المنطقية TRUE (أي البحث عن تطابق تقريبي). أما إذا قمنا بتحديد القيمة المنطقية FALSE، فستكون النتيجة خطأ #N/A، لأنّ الدالة في هذه الحالة ستبحث عن تطابق تام:1 نقطة
-
لماذا احصل على هذا التحذير من react ./src/components/Posts.js Line 23: React Hook useEffect has a missing dependency: 'getPosts'. Either include it or remove the dependency array react-hooks/exhaustive-deps وهذا هو الكود import React from 'react'; import axios from 'axios'; export default function Users() { const getPosts = () => { axios .get('http://localhost:4000/posts') .then((res) => { console.log(res); }) .catch((err) => { console.log(err); }); }; useEffect(() => { getPosts(); }, []); return <div>posts</div>; }1 نقطة
-
مشكور يغالي ماقصرت بس ابي الكود في elseif ويكون مربوط بالصفحه الاولى الي عندي وذا كود الصفحه الاولى <!DOCTYPE html> <html lang="en"> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> </head> <body> <div class="container"> <h2>درجات الطالب</h2> <form action="AAA.php"> <div class="form-group"> <label for="num">درجة اختبار شهر الأول:</label> <input type="text" class="form-control" id="email" name="num"> </div> <div class="form-group"> <label for="pwd">درجة اختبار شهر الثاني:</label> <input type="text" class="form-control" id="num" name="num"> </div> <div class="form-group form-check"> <label class="form-check-label"> </label> <button type="submit" class="btn btn-primary">انهاء</button> <form method="get" action="AAA.php"> </div> </body> </html> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>1 نقطة
-
أستخدم لارافيل و أحاول رفع ملف و حفظه: public function test(Request $request) { $fileInForm = 'file'; if ($request->hasFile($fileInForm)) { $file = $request->file($fileInForm); if ($file->isValid()) { $hashedName = hash_file('md5', $file->path()); $timestamp = microtime(); $newFilename = $hashedName . $timestamp . '.' . $file->getClientOriginalExtension(); Storage::disk('local')->put($newFilename, $file); } } } لكن المُشكلة أن الملف يتم حفظه في مُجلد باسم مُختلف في كل مرة و إسم المُجلد يكون نفس الإسم الذي أضعه. هل يُمكن حفظ الملف في مجلد واحد و ليس كل ملف في مجلد لوحده.1 نقطة
-
طالما ذكرتِ "لأصبح شخص مختص بتصميم الواجهات" فهنا علينا تعلم جميع التقنيات و المهارات اللازمة لعمل التصميم، بشكل عام يمكننا التفريق بين: التصميم بنفسه: أي عمل الواجهة وما تحويه من عناصر و تحديد الألوان و أشكال الأزرار .. (لا تحتاج لبرمجة) برمجة الواجهات والتي تكون في مواقع الويب أو تطبيقات الهاتف المحمول. (تحتاج لتعلم التقنية الموافقة لبيئة العمل المستهدفة) إن استخدام البرامج الجاهزة التي تقدم Blocks جاهزة ليس طريقة عملية بشكل كبير (أحيانا تكون صعبة التعديل)، بل يجب أيضا تعلم أساسيات مناسبة لطبيعة الملفات التي تنتجها هذه البرامج، كما قُلت في حال كان خرج البرنامج ملفات CSS واحتاجت لتعديل، فيجب عندها معرفة CSS. يوجد برامج خاصة بالتصميم مثل adobeXD وغيره تعطي دعم كبير للمصمم وتجعله يتحكم بالتفاصيل. أما في حال كنت تريدين العمل بطريقة أسهل في البرمجة (تصميم المواقع) يمكن تعلم إضافة لأساسيات CSS إطار عمل Bootstrap والذي يحوي تنسيقات مبرمجة مسبقا تسهل و توحد طريقة بناء الواجهات.1 نقطة
-
إذا كنت تقصدين تصميم الواجهات فقط بدون تكويد التصميم و تحويله التصميم إلى صفحات ويب أي وظيفة ال ( ui/ux ) إذا لا تحتاجين إلى تعلم ال css أما إذا كنت تقصدين مطور الواجهات الأمامية وهو الشخص الذي يقوم بتحويل التصميم إلى صفحات ويب بالطبع يجب تعلم ال css ولا يكفي إستخدام خدمات تقدم تصاميم جاهزة إذا كنت تريدين التخصص في تطوير الواجهات الأمامية ولتعلم اتطوير الواجهات الأمامية يجب تعلم المهارات الأساسية: الأساسيات: HTML ،CSS ،JavaScript HTML و CSS هما لغات ترميزية يستخدمها المصممون لإنشاء أجزاء من صفحة الويب وأنماطهم البصرية. إنها الأساسيات وراء كل موقع ويب – تستخدم متصفحات الويب كود HTML و CSS لتحديد ما يراه المستخدمون عند تصفحهم لموقع الويب. أخيراً، لدينا JavaScript – لغة برمجة تستخدم للتحكم ديناميكياً في المحتوى على صفحة الويب. يتيح لك JavaScript جعل المواقع تفاعلية – يتم تشغيل جميع تطبيقات الويب والخرائط التفاعلية وصور التمرير والفيديو الديناميكياً بواسطة JavaScript. جافا سكريبت هي لغة برمجة ضخمة مع إمكانيات شبه محدودة، ولكن يجب على المطورين المبتدئين التركيز على تعلم الأساسيات – أشياء مثل بناء الكود، وكيفية عمل المتغيرات، والبيانات الشرطية، والوظائف.1 نقطة
-
على حسب المشروع، قد يكون المشروع عبارة عن تحويل ملف فوتوشوب إلى HTML & CSS، حينها يتم تسليم ملفات HTML و CSS والصور والخطوط المستخدمه في الموقع، أو قد يكون المشروع عبارة عن عمل لوحة تحكم لموقع موجود مسبقًا، حينها يعطيك العميل ملفات HTML و CSS وتصميم لوحة التحكم التي يريدها، فتقوم بعمل لوحة التحكم حسب المطلوب، وترسل ملفات لوحة التحكم بكل محتوياتها. وربما يريد العميل إصلاح مشكلات تواجهة في موقعه (مثلاً، القائمة الجانبية لا تعمل على الهواتف بسبب مشكلة CSS)، فيعطيك العميل ملفات الصفحة التي بها المشكلة لتقوم بإصلاحها وتعيد إرسال هذه الملفات إليه. وليس دائماً يعرف العميل كيف يتعامل مع ملفات المشروع النهائية، فعليك دائماً أن تتفق معه على صيغة الملفات النهائية، وما إن كان سيتطيع التعامل معها بنفسه أم أن لديه شخص آخر ذو خبرة سيقوم بتركيب هذه الملفات في الموقع (مدير خوادم على سبيل المثال).1 نقطة
-
لا توجد طريقة لتمرير props من مكون فرعي إلى مكون رئيسي. ومع ذلك ، يمكننا دائمًا نقل functions من العنصر الأصل إلى المكون الفرعي. يمكن للمكون الفرعي بعد ذلك الاستفادة من هذه functions. يمكن function بعد ذلك تحديث state في المكون الرئيسي . وهذا مثال حول ذلك import React from 'react'; function Increment({ count, onClickIncrement }) { return ( <div> {count} <button onClick={onClickIncrement}>increment</button> </div> ); } export default function Main() { const [count, setCount] = useState(1); const onClickIncrement = () => { setCount(count++); }; return ( <div> <Increment count={count} onClickIncrement={onClickIncrement}></Increment> </div> ); }1 نقطة
-
هل يمكنك إخبارنا لماذا تريد تمرير props إلى اﻷب؟ إذا كنت تريد تغيير شيء في اﻷب مثلاً تريد تغيير state معينة فسأشرح لك كيفية عمل ذلك بمثال، ليكن الكود التالي: const Parent = () => { const [tasks,setTasks] = useState([]); return ( <ul> {tasks.map(v => ( <Child task={v}/> ))} </ul> ); } const Child = (props) => { const {task} = props; return ( <div> <button type="button">Delete</button> {task.name} </div> ); } في الكود السابق نريد عند الضغط على الزر داخل Child component نريد حذف task ضمن اﻷب فكيف نفعل ذلك ونحن لا نستطيع تمرير props إلى اﻷب؟!!! ببساطة يمرر اﻷب تابع إلى اﻻبن بالشكل التالي: const Parent = () => { const [tasks,setTasks] = useState([]); const onDelete = (task) => { const tasksAfterDelete = ... // implement delete functionality however you like setTasks(tasksAfterDelete); } return ( <ul> {tasks.map(v => ( <Child task={v} onDelete={onDelete}/> ))} </ul> ); } const Child = (props) => { const {task,onDelete} = props; return ( <div> <button type="button" onClick={() => onDelete(task)}>Delete</button> {task.name} </div> ); } لاحظ أننا مررنا تابع onDelete من اﻷب إلى اﻻبن واستدعيناه في اﻻبن، هذا الكود هو pattern شائع جداً في React حيث يستقبل اﻻب تابعاً ينفذه عند وقوع حدثٍ ما واﻷب هو من يقرر ماذا سيحصل عند وقوع هذا الحدث. اﻻبن لا يهمه ماذا يفعل اﻷب عند وقوع هذا الحدث، قد يقوم اﻷب مثلاً بطلب Ajax ثم يحدّث state بالـresponse لهذا الطلب مثلاً.1 نقطة
-
هل يمكنك وضع صورة توضيحية للمشكلة من فضلك؟1 نقطة
-
أرى أن العزلة هي المشكلة الأكبر في العمل عن بعد وذلك لما تسببه من مشكلات نفسية واكتئاب وغيرها..1 نقطة
-
يمكنك تحسين جودة الصوت الصوت في أغلب الملفات الصوتية من خلال إستخدام برامج مثل audacity و adobe audition فهذه البرامج مختصة في تعديل وتنقية وإصلاح ملفات الصوت بعشرات الطرق. لاحظ أن هذه البرامج تحتاج خبرة ومعرفة مسبقة لتستطيع التعامل معها، وسيكون من الأسهل والأسرع تعيين مختص في إزالة التشويش وتعديل ملفات الصوت من على أي منصة للعمل الحر مثل مستقل. لاحظ أيضًا أن هناك بعض الملفات لا يمكن تحسين جودة الصوت الخاص بها بدرجة عالية نظرًا لبنية الملف الداخلية (الأمر يختلف من صيغة لأخرى). يمكن أيضًا أضافة تأثيرات معينة على الصوت مثل صدى صوت بسيط أو تفخيم الصوت وغيرها من محسنات الصوت.1 نقطة
-
1 نقطة
-
وعليكم السلام ورحمة الله، أهلًا محمد أجل لا مشكلة، وذلك بما يتوافق مع رخصة المقال. شكرًا لك،1 نقطة
-
يا مرحب الاختلافات بين Adobe Animate و After Effects؟ Adobe Animate يتم استخدامة لتصميم الرسومات المتجهة (vector graphics) و الرسوم المتحركة ( Animation ) و للبرامج التلفزيونية والفيديوهات ومواقع الويب وتطبيقات الويب أو الإنترنت و ألعاب الفيديو. Adobe After Effects هو تطبيق مؤثرات بصرية رقمية ، ورسومات متحركة ، و تطبيق تركيب و يستخدم في عملية ما بعد الإنتاج لصناعة الأفلام وألعاب الفيديو والإنتاج التلفزيوني. و يمكن استخدام After Effects في المفاتيح أو الفريمات و التتبع والتركيب وله إستخدمات أخري فيمعل مثلاً كمحرر صوت و محول وسائط.1 نقطة
-
يستعرض هذا المقال الأمور الرئيسية التي كنتُ بحاجة إلى توضيحات بشأنها حتى أتمكَّن من العمل كمطور ووردبريس حر. أخبرني العديد من الأشخاص بأنَّهم يريدون البدء في مجال تطوير الووردبريس –وأغلبهم يرغبون في العمل لحسابهم الخاص كمطوِّري ووردبريس مستقلين-، ولكنَّهم لا يعلمون كيف يبدؤون. كلَّما فكَّرتُ في هذا الأمر، رأيته منطقيًا، إذ أنَّ تطوير الووردبريس مجال واسع وحدوده تتخطَّى تقنية الووردبريس (المربِكة جدًا) نفسها. في هذا المقال، سأسرد وأستعرض الأمور الجوهرية التي كنتُ بحاجة إلى اكتشافها ومعرفتها بنفسي لكي أتمكَّن من العمل كمطور ووردبريس حر ناجح، وتنقسم هذه الأمور إلى ثلاث فئات: الأمور الاستراتيجية: ما ينبغي عليك معرفته عن هذا المجال وعن الحياة نفسها لكي تنجح في العمل كمطور ووردبريس حر. الأمور العملية: التفاصيل المتعلقة بالمُعدّات والخدمات التي تحتاجها لكي تبدأ العمل بالفعل. الأمور التقنية: المواضيع التكنولوجيّة التي ينبغي عليك فهمها لكي تكون قادرًا على تقديم عمل جيِّد للعملاء الذين يستخدمون الووردبريس. ذكرتُ فيما يلي كل ما استطعت أن أذكره لمساعدتك في البدء بكل فئة من هذه الفئات، إذ تحدَّثتُ عن المسائل التي أنت حقًا بحاجة إلى أن يكون لديك حلول لها -أو على الأقل أن تكون قد فكرَّت فيها بعمق- حتى تستطيع النجاح في عملك كمطور ووردبريس حر. إحدى الأشياء التي يجدُر توضيحها هي أنَّ قسم «الأمور الاستراتيجية» قد كتبته وأنا أضع مطوِّري الووردبريس المستقلين نصب عينيّ: أي المطوِّرين أمثالي الذين يركِّزون على العمل مع عملاء، والذين يعملون لحسابهم الخاص أو يعملون كجزء من وكالات صغيرة جدًا، وهؤلاء هم الفئة الكبرى من مطوِّري الووردبريس المحترفين. هناك بالتأكيد وظائف أخرى في مجال تطوير الووردبريس إلى جانب العمل الحر! يمكنك أن تعمل لصالح وكالة كبيرة، ويمكنك أن تبيع الإضافات المدفوعة، ويمكنك أن تعمل في الدعم الفني لشركة استضافة، وغير ذلك. إذا كان لديك معرفة بسيطة جدًا بهذه الوظائف، فبرأيي أنَّه من المؤكد أنَّ قسم «الأمور التقنية» في هذا المقال سيكون ملائمًا لك مهما كانت الوظيفة التي اخترتَها في مجال تطوير الووردبريس، كما أنَّ قسم «الأمور العملية» سيكون ملائمًا إلى حدٍ ما، ولكنَّ درجة ملائمة قسم «الأمور الاستراتيجية» غير محددة. كن مطور ووردبريس حر: الأمور الاستراتيجية الأساسية التي ينبغي مراعاتها وضع دوافع وتوقعات واضحة إنَّ العمل في مجال تطوير الووردبريس -مثله مثل أي شيءٍ آخر- له إيجابيات وسلبيات، وله محاسن ومساوئ. يجب أن تكون دوافعك وتوقعاتك المتعلقة بعملك كمطور ووردبريس حر واضحة للغاية وواقعية. سأبدأ حديثي بإخبارك عن تجربتي في العمل. الأمور التي أحبُّها بشأن العمل في مجال تطوير الووردبريس باحترافية المرونة: يمكنني وضع كل ما يتعلق بعملي في حقيبة ظهر، وسيبقى هناك متسعًا كبيرًا للملابس. وبفضل هذا الأمر، تمكَّنتُ من الانتقال مع زوجتي إلى نيو أورلينزعندما أرادت ذلك، كما أنَّني أستطيع زيارة والديّ في هاواي لفترات طويلة أربع أو خمس مرَّات في السنة دون أن يؤثِّر ذلك على عملي. ولأنَّني مدير نفسي، أستطيع أخذ إجازات وقضاء أوقات في السفر بقدر ما يسمح به دخلي الخاص. شعور الإتقان: أصبحت محترفًا في تطوير الووردبريس منذ عام 2012، وأشعر الآن بأنَّني جيدٌ جدًا جدًا في عملي؛ فعندما يحتاج الناس إلى مساعدة في الجوانب التقنية المتعلقة بالووردبريس، عادةً ما أكون قادرًا على إنجازها بسرعة أكبر مما يتوقعون أو إسداء نصائح رائعة لهم تساعدهم على التقدُّم. هذا الأمر مدعاة للسرور، خصوصًا عندما تكون في صدد إصلاح مشروع ووكومرس تكلفته مائة ألف دولار قد أخفق المطوِّر السابق غير الكفء تمامًا في إنجازه، أو عندما تساهم بشكل كبير في تحديث وتحسين وجود مؤسسة -تهتم حقًا بها- على شبكة الإنترنت. إنَّ تطوير الووردبريس مهنة حقيقية، وإتقانك لها يمنحك شعورًا رائعًا. يُمكن أن يكون ممتعًا: يتضمن العمل الحر في مجال تطوير الووردبريس الكثير من التعاملات مع الناس، والكثير من عمليات حل المشكلات البسيطة أو المتوسطة، والكثير من البحث عبر الإنترنت، والكثير من الأمور التي تتطلَّب منك الإبداع. بمجرد أن تصبح خبيرًا في المجال، ستصبح عملية التطوير (وتقابلها عملية إدارة العلاقات مع العملاء) كأنَّك تقضي يومك في حل السودوكو وبناء مجسَّمات الطائرات. إنَّه ليس عملًا سيئًا. الفائدة العامة: الجميع تقريبًا يمتلكون أو يحتاجون أو يريدون موقعًا لغرضٍ أو لآخر، وغالبًا ما يكون الووردبريس هو الخيار الأمثل. لهذا، تتلاءم إمكانياتك في مجال تطوير الووردبريس بطريقة رائعة مع أي مشروع قد يقع بين يديك. الأمور التي لا أحبُّها بشأن العمل في مجال تطوير الووردبريس باحترافية قد لا تحصل على ما تسدّ به جوعك: الأجر الذي أقبضه في نهاية الشهر يكون لقاء العمل الذي أنجزتُه لأشخاص محدَّدين (الأشخاص الذين حوَّلتُهم إلى زبائن) خلال ذلك الشهر. إذا استنفدتَ كل طرق جذب العملاء المحتملين، أو إذا مررتَ بشهرٍ سيء على نحوٍ غير متوقع، فمن المحتمل جدًا ألّا تجني مالًا. بعبارة أخرى: أنت لا تملك أمانًا وظيفيًا، وكل ما تملكه هو ما توفِّره وما تعيل به نفسك. أنت عُرضَة للطلب: لا أحبِّذ -بصراحة- الأوقات التي يرن فيها الهاتف أو تصلني فيها رسالة بريد إلكتروني لأنَّه في كثير من الأحيان يتعلق الأمر بعميل لديه مشكلة مريعة (أو تبدو مريعة) يريد مني أن أحلّها، إذ يعتمد الأشخاص عليّ في ذلك. هناك طرق لإدارة التوقعات والتعامل معها بطريقة مناسبة، ولكن هذا لا يزيل التوتر الكامن في كونك مسؤولًا عن المساعدة في إيجاد الحلول لأي مشكلة قد تنشأ عن عشرات المواقع. لحسن حظي أنّني جيّد في عملي؛ فمن واقع خبرتي، يمكن أن يكون وجود أشخاص يعتمدون عليك بهذه الطريقة مزعجًا جدًا إذا لم تكن ذا معرفة بما تقوم به. من الصعب التفاوض مع العملاء حول الميزانية: بعض المطوِّرين قد لا تواجههم هذه المشكلة، ولكن طريقتي الخاصة في العمل بسيطة وغير رسمية إلى حدٍ ما -وهي تختلف كثيرًا عن طريقة الوكالات الكبيرة التي تتولّى العمل على مشاريع تبلغ تكلفتها مئات الآلاف من الدولارت ويستغرق إنجازها عدة سنوات-، إذ أميل إلى جذب أصحاب الأعمال التجارية الصغيرة الذين أُفضِّل العمل معهم على أي حال. في هذا السياق، تكون الميزانيات محدودة، وهناك حاجة دائمة إلى الشفافية. من المرهق جدًا حل المشكلات التقنية المرتبطة بالمشاريع التي تواجه مشكلات استراتيجية لا يمكنني مساعدة مالكي المواقع على التعامل معها (من الواضح أنَّهم عادةً ما يكونون مصدر هذه المشكلات)، إذ أشعر بأنَّني أساعد الناس على إنفاق أموالهم بطريقة غير عقلانية في هذه الحالة. الشعور بالصدمة: معظم عملائي لا يكونون على معرفة بي في بداية رحلتهم عبر الويب؛ بل يجدونني في منتصفها، وهم يشعرون بخيبة أمل بسبب العديد من المطوِّرين نصف المؤهلين الذين لم يكونوا على دراية بكيفية التواصل. المواقع الخاصَّة بهؤلاء العملاء تنمُّ عن الاختيارات التقنية غير الصائبة، ومن واقع ما رأيت فإنَّ معظم مواقع الووردبريس عبارة عن تجربة سيئة بالنسبة لمستخدميها النهائيين، وذلك بسبب قلة عدد "مطوِّري" الووردبريس المؤهَّلين بالفعل ولأنَّ أسوأ الأجزاء في نظام الووردبريس هي التي يتم تسويقها على النحو الأفضل، والتفكير يوميًا في هذا الأمر يبعث على الإحباط حتى لو كنت جزءًا من الحل. هذه مجرد وجهة نظري، والمغزى هو أنَّ عليك فهم ما أنت مُقبِلٌ عليه وسبب إقبالك عليه. تحدَّث إلى الأشخاص الآخرين الذين يقومون بما ترغب في القيام به، واحرص على أنَّ يكون هناك انسجام بينك وبينهم. في هذه الحالة، يمكنك العثور على الكثير من هؤلاء الأشخاص في اللقاءات التي تُعقد للحديث عن الووردبريس في مجتمعك المحلي. اعرض عليهم أن تشتري لهم وجبة غداء، وسيقبل معظمهم عرضك، كما قد يكون بعضهم -في الحقيقة- بحاجة إلى وجبة الغداء. أنصحكم أيضًا بشدة بقراءة هذا المقال الذي كتبَتْه كاري ديلز (Carrie Dils) وقد تحدَّثَتْ فيه عن مميزات أن تكون مطور ووردبريس حر، إلى جانب التحديات المصاحبة لذلك. الأمور التي قد تجعل العمل الحر في مجال تطوير الووردبريس غير مناسب لك نقطة أخيرة متعلقة بهذا الموضوع: لا أنصح أي أحد بالخوض في العمل الحر في مجال تطوير الووردبريس إذا انطبقت عليه إحدى العبارتين التاليتين أو كلتيهما: أنت لا تملك مهارات عامة قوية في الجوانب التقنية وفي حل المشكلات، وهذا يعني أنَّك لا تستطيع عمومًا التعامل مع المشاريع التقنية المعقدة (مثل مشروع jailbreak my phone) والتغلُّب على تحدياتها من خلال البحث عبر الإنترنت ومحاولة إدخال التعديلات والتحسينات عليها. تنزعج كثيرًا من خدمة العملاء، وهذا يعني أنَّك لا ترغب في التعامل مع الناس، ولا تفهم ما يريدونه، وتكره مضايقاتهم، وتكره تقديم التفسيرات، وتخوض في الجدالات بسهولة، وهكذا. إذا كنت تعاني من نقطتي الضعف السابقتين ولديك شريك يمكنه التغلُّب عليهما، فلا بأس في هذا. لكن إذا كنت تعمل لوحدك وتحاول أن تبني عملك الحر على هذا الأساس، فسوف تواجه عقبات في طريقك. المخطط الزمني والالتزام بالوقت ما هي ظروف حياتك الحالية –من حيث أوقات الفراغ ووضعك المالي- وكيف يتلاءم العمل الحر في مجال تطوير الووردبريس معها؟ هل تريد أن تتخذ من تطوير الووردبريس عملًا بدوام كامل؟ إذا كنت ستفعل ذلك، ما هو مخططك الزمني لتحقيق ذلك؟ وكيف ستشدُّ من أزر نفسك خلال عملية التحوُّل؟ تختلف الظروف من شخصٍ لآخر، لذلك لن أحاول إسداء النصائح لحالات معينة؛ بل سأذكر بعض المعلومات والحلول لتأخذها في الاعتبار مهما كانت ظروفك الحالية: ستقضي وقتًا صعبًا في سبيل الحصول على ما يكفي من الساعات مدفوعة الأجر إلى أن تؤتي الطرق التي تنتهجها لإيجاد العملاء أُكُلها، وتبدأ قائمة عملائك تمتلئ بعملاء رائعين. إذا كنت تريد أن تصبح مطور ووردبريس حر بدوام كامل، فمن المرجَّح أن يكون العائد الذي ستجنيه خلال الثلاثة أشهر الأولى على الأقل -وربما الستة أشهر- ضئيلًا، وأن تمضي سنة كاملة أو أكثر دون أن تكون واثقًا ممّا إذا كنت ستجني شهريًا ما يعادل راتب الطبقة المتوسطة. لا تستغرق الأعمال التي تقوم بها للحصول على عملاء –مثل الذهاب إلى فعاليات التشبيك، وإنشاء موقع إلكتروني لعرض نماذج أعمالك، والاستفادة من شبكة علاقاتك الحالية- 40 ساعة أسبوعيًا، إذ ينتهي بك المطاف إلى قضاء الوقت في انتظار أن يتواصل معك أحد العملاء المحتملين، أو في انتظار أن يحين موعد فعالية التشبيك الأسبوعية التالية، وما إلى ذلك. بعبارة أخرى: من الصعب جعل «عملية الحصول على عملاء» عملًا بدوام كامل إلا إذا لم تكن تمانع التسويق باستخدام أسلوب الاتصال البارد (cold calling)، أو توزيع النشرات الإعلانية الخاصة بالأعمال التجارية المحلية، وغيرها. لن تكون لك قدم ثابتة في الجوانب التقنية لمدة عام على الأقل، وهذا يعني أنَّه ستواجهك باستمرار مشكلات لا تعرف كيفية حلّها. هذه النقطة هي مجرد تنبيه لك حتى تستعد لخوض فترة صعبة وبعض اللحظات المروِّعة. (ألق نظرة على بند «من الذي سيكون طوق نجاتك» المذكور لاحقًا للتعرُّف على المزيد من الاقتراحات المتعلِّقة بهذا الأمر.) لا أعلم ما إذا كان من الأفضل مواجهة هذ الفترة من خلال العمل كمطور ووردبريس بدوام كامل أم بدوام جزئي، ولكن ربما يكون العمل بدوام كامل هو الأفضل لأنَّه لن يكون لديك خيار سوى التصدِّي للعقبات عندما تعترض طريقك. ذكرتُ هذه النقطة هنا لأنَّه ينبغي عليك أن تنظِّم أمورك المالية لفترة طويلة نسبيًا بينما تحاول التسويق لنفسك بصفتك مطور ووردبريس يتقاضى أجرًا، دون أن تكون متأكدًا ما إذا كنت ستحصل حقًا على المال. غالبًا ما يبدأ العمل الحر في مجال تطوير الووردبريس بالنمو ببطء، كغيره من الأمور الأخرى. لذا، أنصحك بأن يكون لديك قدرًا لا بأس به من الادخار الشخصي، أو أن تحافظ على التزاماتك الحالية إلى أن تصبح متأكدًا من أنَّ عملك في مجال الووردبريس سيكفيك مؤنتك. في الحقيقة، لم أفعل ذلك وقد انتهى الأمر على ما يرام، إذ أنَّ الطريقة الصعبة التي انتهجتُها كانت مفيدة جدًا، ولكنَّها لم تكن ممتعة. كيف تحدِّد تسعيرة عملك؟ أنا أُفضِّل أن يكون تسعير الأعمال في مجال تطوير الووردبريس على أساس الساعة، ما لم يكن لديك سبب قوي لاختيار أسلوب آخر. الكثير من الأشخاص لا يعجبهم التسعير على أساس الساعة، ويفضِّلون التسعير على أساس المشروع أو التسعير على أساس القيمة (value pricing)، ولكنّني شخصيًا وجدتُ أنَّ جميع الأساليب عدا التسعير على أساس الساعة من الصعب جدًا على المستقل أن يطبِّقها مع معظم العملاء. يؤدِّي التسعير على أساس المشروع إلى الخوض في عمليات طويلة لتقدير قيمة المشروع والتفاوض مع الزبائن، أما التسعير على أساس القيمة يوقعك في حبال العمل التجاري الخاص بالزبون على نطاق أوسع. لا بأس بهذه الأساليب إذا كنت ستساهم على نحو كبير لمدة سنوات في توجيه دفة العديد من الجوانب الاستراتيجية الواسعة للعمل التجاري الخاص بالعميل، ولكن إذا كانت وظيفتك مقتصرة على تقديم الحلول التقنية لجزء واحد من أجزاء العمل التجاري (هذا هو حال أغلب مشاريع العمل الحر)، فستصبح وكأنَّك سبَّاكًا يتقاضى أجره من خلال الحصول على حقوق ملكية عقارية! إرشادات عامة بشأن التسعير فيما يلي بعض الإرشادات العامة بشأن تسعير الأعمال في مجال تطوير الووردبريس على أساس الساعة (حسب ما هو متعارف عليه في الولايات المتحدة لمطوري الووردبريس المستقلين): ينبغي عليك ألا تطلب سعرًا أقل من 50$ في الساعة مقابل خدماتك. يُعَدُّ 50$ أو 60$ سعرًا متواضعًا ومناسبًا في بدايات عملك، ولكن ينبغي عليك أن تتطلَّع إلى أن يصل السعر إلى ما لا يقل عن 75$ في غضون سنة، وإلى ما لا يقل عن 100$ في غضون سنتين. ملاحظة: تختلف الأسعار من بلدٍ لآخر، وغالبًا ما تكون الأسعار في البلاد العربية أقل بكثير من الأسعار التي سبق ذكرها. ما يهم حقًا هو مدى براعتك في الأمور التي تتقاضى أجرًا على أساس الساعة للقيام بها. بالنسبة لي، أطلب إما 100$ أو 125$ مقابل الساعة. خبرتي أكبر من خبرة المطورين المبتدئين وتكلفة توظيفي أرخص بكثير من تكلفة توظيف مطور مبتدئ يطلب 50$ مقابل الساعة، إذ أنَّ هؤلاء المطورين سيكلِّفونك آلاف الدولارات بسبب حلولهم السيئة، وسيبقون عالقين في مسألة لساعات، وبعدها سيضعون الحل الخطأ. لقد تطلَّبت مني حوالي 80% من مشاريع العمل الحر التي عملتُ على إنجازها قضاء الساعات لتعديل العمل الذي قام به المطور السابق الذي لم يكون كفئًا، ومن الأمثلة على تلك المشاريع: بناء برمجي متهالك وغير متوافق مكوَّن من 50 إضافة، أو التعامل مع تركيب تكنولوجي سيء (HostGator، وقالب Divi، ومئات الإعدادات للحقول المخصصة المتطورة [AFC]، و Visual Composer)، أو أخطاء تعرقل عمل الموقع، أو مشكلات في SEO، وما إلى ذلك. ملاحظة مهمة: هذه الأسعار من وجهة نظر الكاتب وموقعه وقد لا تنطبق على العالم العربي وتكون أقل من ذلك بكثير، فأرجو أخذ ذلك بالحسبان. ارفع أسعارك دائمًا عندما ترتقي في سلَّم الثقة والكفاءة، ينبغي عليك أن ترتفع أسعارك وفقًا لذلك. لا أستطيع أن أرسم لك منحى محدَّد يوضح كيف ومتى تغيِّر أسعارك، ولكنَّني سأقول: ارفع أسعارك فحسب؛ فالعملاء لا يبالون بالقدر الذي تظنه، كما أنَّ المال الإضافي الذي ستكسبه واقعي جدًا. فيما يلي بعض المصادر الجيِّدة التي يمكن أن تساعدك في البدء في فهم الأمور الماليّة كمطور ووردبريس حر، وفي معرفة كيفية تحديد أسعارك الخاصة على أساس الساعة: حاسبة تكلفة العمل الحر على أساس الساعة تكاليف تطوير مواقع الووردبريس المخصصة مقدار الوقت الذي يستغرقه إنجاز مشاريع الووردبريس تكلفة إنشاء إضافة ووردبريس (التعامل مع أسئلة العملاء ذات النهايات المفتوحة بخصوص التكلفة) دليل جيِّد يتحدَّث عن استراتيجيات التسعير التي لا تبيع بأسعار أقل من المنافسين (على اعتبار أنَّك متعاقد) دورة تدريبية مجانية عبر البريد الإلكتروني حول التسعير للمستقلين كيفية العثور على عملاء بالنسبة لمطوِّري الووردبريس المستقلين، فإنَّ الإجابة عن سؤال «كيف أحصل على عملاء؟» هي التي تحدد ما إذا كانوا سيكسبون مالًا أم لا. لو كان لهذا السؤال إجابة سهلة، لكنتَ تعرفها بالفعل، ولكن هناك إرشادات جيِّدة تساعدك على البدء. أقترح عليك الاطلاع على هذين المقالين -هنا وهنا-، إذ يلقيان نظرة عميقة على هذا الموضوع. أضع أمامك أيضًا القواعد الرئيسية التي أظنُّها فعّالة في بداية انطلاقتك: حضور فعاليات التشبيك بين الأشخاص. استغلال شبكة علاقاتك الشخصية الحالية. التخصُّص وإقامة العلاقات مع من يعملون في مجالك. استحضار قائمة الأشخاص المرجعيين من عملائك الأوائل القلائل، وحتى من الأشخاص الذين عرفتهم من خلال وظائفك السابقة أو التدريبات أو المشاريع التطوعية، وغيرها. ملخَّص العناصر الأربعة السابقة هو: تحدَّث شخصيًا إلى أي شخص يمكنك الحديث معه داخل شبكة علاقاتك الحالية أو خارجها. قد تكون الاستراتيجيات طويلة المدى –مثل التسويق بالمحتوى والتسويق عبر وسائل التواصل الاجتماعي- ممتازة، ولكنَّها من غير المحتمل أن تكون مصدرًا للحصول على العملاء المحتملين في المدى القريب. من الذي سيكون طوق نجاتك في المواقف الصعبة دائمًا ما كان شريكي ديفيد هو سلاحي السري في مجال تطوير الووردبريس؛ فهو مطوِّر أمهر مني باستمرار ويسبقني في المجال التفني بمقدار 12 إلى 24 شهرًا. لقد تعاملتُ مع الكثير من استراتيجيات العمل وعلاقات العملاء، وأعلم -حتى هذا اليوم- أنَّ ديفيد سيكون موجودًا لينتشلني إذا ما تعرَّضت إلى مسألة تقنية صعبة (مثل أوامر Git المعقدة). بالنسبة للذين ليس لديهم شريك موهوب يعمل كمهندس برمجيات، أدرك أهمية امتلاكهم طريقة لـِ "السباحة" عوضًا عن "الغرق" عندما يواجهون موضوع تقني لا يفهمونه أثناء عملهم على مشروع لأحد العملاء. ما الذي أنصح به؟ بصراحة، لا يوجد حاليًا شيء متين وراسخ يمكن اعتباره طوق النجاة لمطور الووردبريس الحر، ولكن هذه أفضل ثلاثة اقتراحات يمكنك تطبيقها في وقتنا الحالي: اذهب إلى اللقاءات التي تُعقد للحديث عن الووردبريس في مجتمعك المحلي؛ فهذه اللقاءات تكون ممتلئة بالمطوِّرين الذين ستكون سعيدًا بمساعدتهم لك في تعلُّم أشياء لا تعرفها؛ بل حتى في تعلُّم أشياء لا تعرف أنَّك لا تعرفها. انضم إلى مجموعة IWP ومجموعة AWP على فيسبوك واستغلّهما بأريحية. حاول أن تقيم علاقة مع مطوِّر متمكِّن في مجالك، واعرض عليه أن تعطيه أجرًا على أساس الساعة مقابل أن يساعدك في استكشاف الأخطاء التقنية وإصلاحها عند الحاجة. في ماذا تتخصَّص؟ ليس من السهل أن تكون «مجرَّد مطور ووردبريس»؛ فما يقع تحت هذا المُسَّمى ضيِّق إلى حدٍ ما، كما أنَّك قد تسمع الأسئلة الآتية من العملاء: من الرائع أنَّك قمت بتثبيت الإضافة المناسبة، ولكنَّها تبدو الآن سيئة للغاية، هل يمكنك أن تجعلها أكثر أناقة وعصرية ومتناغمة مع هوية علامتنا التجارية؟ يخبروننا أنَّنا من المفترض أن يكون لدينا قسم المدونة، ولكن لا أملك أدنى فكرة عمّا أكتب فيه. أريد أن يكون موقعي الإلكتروني متوافقًا مع محركات البحث، هل تستطيع تحقيق ذلك؟ هل ينبغي علينا إنشاء نشرة بريدية؟ هل نحن بحاجة إلى أن يكون لدينا حساب إنستجرام وماذا ننشر عليه؟ متى سيبدأ الموقع الإلكتروني في تحقيق المبيعات؟ تشير كل هذه الأسئلة إلى مجموعة من المهارات التي تقع خارج حدود المهارات الأساسية الخاصة بتطوير الووردبريس، ومن المؤكَّد أنَّك ستجذب لنفسك المزيد من الانتباه في سوق العمل إذا كنت قادرًا على تقديم المساعدة في مجالات متعددة. على حد علمي، فإنَّ أفضل تخصُّص من التخصصات الواقعة ضمن الحدود التقنية لتطوير الووردبريس هو التجارة الإلكترونية، خاصةً الووكومرس. إنَّه في الوقع عالم قائم بذاته، وهناك الكثير من الأموال التي يمكن جنيها من خلاله لأنَّ العملاء أنفسهم في هذا المجال يجنون الأموال. اقتراحي الوحيد هو أن تبدأ التعامل مع العملاء الذين يستخدمون الووكومرس بتواضع؛ فالووكومرس يتطلَّب بضعة مئات من الساعات حتى تتمكَّن من فهمه جيدًا لأنَّ الزبائن سيأتونك بمختلف الحالات الفريدة، وإذا كنت تتقدَّم بغرور، فمن الممكن أن تتسبَّب في انهيار أعمال ومشاريع حقيقية، وليس مدونات مختصَّة بالسفر. المهارات التكميلية لتطوير الووردبريس أفضل ما يمكن القيام به -من وجهة نظري- هو أن تبني مجموعة مهارات خارج إطار تطوير الووردبريس، وأن تبيع خدماتك كحزمة واحدة. تشمل المسمَّيات الوظيفية الرئيسية الأخرى -غير «مطور ووردبريس»- التي يحتاجها معظم العملاء ما يلي: خبير SEO. مصمِّم ويب وجرافيك. مسوِّق إلكتروني: التسويق عبر وسائل التواصل الاجتماعي والتسويق بالمحتوى. كاتب محتوى (يتطلَّب فهمًا عميقًا لتحسين محركات البحث والتسويق بالمحتوى). إذا كنت تمتلك ذوقًا بصريًا، فمن الرائع أن تكون مصمِّمًا/مطوِّرًا. إذا كنت تجيد المهارات العامة لحل المشكلات، فمن المرجَّح أن يكون تعلُّم واحتراف SEO أقل تعقيدًا من تعلُّم تطوير الووردبريس بالنسبة لك، كما أنَّهما يشكِّلان معًا مزيجًا رائعًا. إذا كنت شخصًا اجتماعيًا، فإنَّ الكثير من العملاء لا يملكون أدنى فكرة عن كيفية التسويق لأنفسهم وهم بحاجة ماسَّة تمامًا إلى توضيحات بشأن هذا الأمر. إذا كنت تستطيع الكتابة، فهذا رائع، ولكنَّك أيضًا ستحتاج معظم الأمور المذكورة أعلاه. تحديد الأشياء غير الملموسة التي تجعلك متفرِّدًا لقد خاض العديد من الأشخاص الكثير من التجارب السيئة مع مطوِّري الووردبريس. كيف تميِّز نفسك عنهم بناءً على هذه المعلومة؟ هل أنت ودود على نحو استثنائي؟ متجاوب على نحو استثنائي؟ هل أنت شريك في الاستراتيجية الخاصَّة بالعميل (على العكس من شخص ينجز ما يطلبه الناس منه فحسب)؟ هل لديك أسلوب تسعير استثنائي يتَّسم بالوضوح والشفافية؟ أو قدرة استثنائية على التغيير والتحسين بسرعة وفاعلية؟ أو قدرة استثنائية على التكيُّف مع ميزانية ضئيلة؟ تكون الإجابات في الوضع المثالي «نعم»، ولكن ما يهم هو قضاء بعض الوقت في معرفة الأسباب التي ستجعل العملاء سعداء بتوظيفك أنت بدلًا من توظيف شخص آخر بنفس السعر لإنجاز نفس العمل. ما هي الأشياء غير الملموسة المرتبطة بطريقتك في إنجاز الأعمال بصفتك مطور ووردبريس حر والتي تجعل العمل معك هو الخيار الأمثل لعملائك المحتملين؟ عندما تكون مدركًا لهذه الأشياء غير الملموسة، وعندما تدعمها بطريقة تعاملك على الهاتف، وطريقة عرضك لإنجازاتك وشهاداتك وما إلى ذلك، سيبدأ الناس حينها في إيلاء الاهتمام لك. التعاقد مع محترفين في المجالات الأخرى في الحقيقة، لا يستطيع شخص واحد فقط أو حتى شخصان امتلاك جميع المهارات التي يحتاجها العملاء العاديون لجعل مشاريعهم ناجحة في سوق العمل، ولذلك ستحتاج إلى تكوين علاقات مع أشخاص محترفين يمتلكون المهارات التي لا تمتلكها، وستُحيل إليهم عددًا من الأعمال، والأمر الرائع أنَّهم سيُحيلون إليك أعمالًا أيضًا! خلاصة الموضوع هي أنَّ الأعمال التي قد تحتاج إلى أن تسندها للغير تتضمن الآتي: خبير SEO. مصمِّم ويب وجرافيك. مسوِّق إلكتروني: التسويق عبر وسائل التواصل الاجتماعي والتسويق بالمحتوى. كاتب محتوى (يتطلَّب فهمًا عميقًا لتحسين محركات البحث والتسويق بالمحتوى). إذا كنت لا تعلم أين تبدأ في العثور على هؤلاء الأشخاص، فاذهب إلى اللقاءات المحلية التي تُنظَّم للحديث عن المهارة التي تبحث عنها. كن مطور ووردبريس حر: الأمور العملية الأساسية التي ينبغي مراعاتها هذا القسم هو الأقل أهمية من بين الأقسام الثلاثة، وهو يتحدَّث عن الأشياء الملموسة التي ينبغي أن تقوم بها لكي تصبح جاهزًا للانطلاق في رحاب العمل الحر في مجال تطوير الووردبريس. إجمالًا، ينبغي أن يكون توجُّهك مبنيًا على السرعة والبساطة؛ افعل أبسط وأرخص الأشياء بقدر ما تستطيع لأنَّ الأمر برُمَّته مرتبط بأن تعثر على العملاء المناسبين (جانب استراتيجي) وأن تعرض عليهم القيمة أو الخدمة المناسبة (جانب استراتيجي وتقني) حتى ينجح عملك ويستمر. سنتحدَّث الآن عن التفاصيل. تسجيل عملك ليصبح رسميًا يمكنك تأجيل هذا الأمر حتى تجد نفسك جادًّا بشأنه، ولكن هناك مزايا من حيث الضرائب والالتزامات لكونك مسجَّلًا رسميًا عندما تبدأ في الحصول على عوائد حقيقية. لقد سجَّلنا أنفسنا كشركة تجارية صغيرة (مدرجة تحت تصنيف S Corp في الولايات المتحدة) من خلال شركة Rocket Lawyer (شركة LegalZoom تقدِّم خدمات مماثة)، وكانت تكلفة ذلك رخيصة نسبيًا ولم تتجاوز 500$. عمومًا، كلَّما استطعت أن تولي اهتمامًا أقل لهيكل الشركة، كان ذلك أفضل من واقع تجربتنا. بناء موقع إلكتروني لعرض نماذج أعمالك بصفتك مطور ووردبريس حر قد بدأ رحلته للتو، فسوف تحتاج إلى مراعاة المعايير الثلاثة التالية عندما تبني موقعًا إلكترونيًا تعرض فيه نماذج أعمالك: أن يبدو احترافيًا. أن يبيِّن مكانتك التي ترغب في إظهارها. أن يكون رخيص الثمن ويُبنى بسرعة. لا ينبغي عليك الاهتمام كثيرًا بتفاصيل الموقع الذي ستعرض فيه أعمالك وكأنَّه جزء مهم جدًا من عملك؛ بل يكفي أن تجعل هدفك هو أن يبدو الموقع احترافيًا وأن يعرض علامتك التجارية بطريقة مناسبة، ولا يجب أن يكون مبتكَرًا للغاية أو مبنيًا من نقطة الصفر (ربما تودُّ القيام بهذا لكي تثبت أنَّك قادرٌ على بنائه؟!) أو ما شابه ذلك. إذا كنت لا تعلم من أين تبدأ، فأقترح عليك إلقاء نظرة على متاجر القوالب المذكورة فيما بعد. لا بأس في أن تدفع بضعة مئات من الدولارات لمصمِّم جيِّد مقابل حصولك على نصائح بخصوص الشعار وتصميم الموقع إذا لم تكن متمكِّنًا في هذا المجال. لكن -إجمالًا- ينبغي أن يكون هذا المشروع رخيص الثمن وبسيطًا، وأن يكون التركيز منصبًا على المحتوى: كيف ستُظهِر مكانتك من خلاله؟ هل يبيِّن موقعك للزوَّار لماذا ينبغي عليهم أن يختاروك أنت بدلًا من اختيار غيرك بطريقة مقنعة؟ تحتاج -أيضًا- إلى أن يكون في موقعك قسم يعرض نماذج أعمالك حتى تثبت للآخرين أهليتك. إذا كنت جديدًا في عالم التطوير، ففي هذه الحالة عليك أن تكون مبدعًا؛ فمثلًا: إذا كنت قد تطوَّعت في المكتبة المحلية وأجريت بعض التحسينات على الموقع الإلكتروني الخاص بها، يمكنك أن توضِّح ذلك في معرض أعمالك. يعتبر وجود عنصر أو عنصرين في معرض أعمالك كافيًا للبدء في العمل الحر في مجال تطوير الووردبريس، إلى جانب قدرتك على أن تشير إلى خبرتك السابقة أثناء تفاعلك مع العملاء. العتاد أقصد بكلمة «عتاد» المعدَّات والأجهزة التي تحتاجها للقيام بعملك، وأهم ما يمكنني إخبارك به في هذا السياق هو أنَّ طراز العتاد لا يهم. سأذكر فيما يلي قائمة المعدَّات التي أستخدمها لتنفيذ عملي بصفتي مطور ووردبريس حر: حاسوب محمول يمكن لأي حاسوب محمول قد صُنع خلال السنوات العشر الماضية أن يؤدِّي الغرض. أنا أستخدم جهازًا يعمل بنظام ويندوز، ولكن إذا كنتَ شخصًا قابلًا للتكيُّف، فمن الأفضل لك استخدام جهاز ماك. يكره الأشخاص التقنيّون نظام ويندوز، ويفترضون أنَّك تستخدم نظام الماك عندما يكتبون شروحاتهم. يعتبر سطر الأوامر في نظام ويندوز سيئًا، ولكن لن يشكِّل هذا مشكلة حقيقية لعملك إلا إذا كنت تقضي زمنًا حقيقيًا وأنت تعمل على سطر الأوامر، وحتى لو كان الحال كذلك فهو ليس بدرجة كبيرة من السوء. هاتف لقد أضعت هاتفي القديم مؤخرًا، لذلك أحضرتُ بديلًا له من متجر وول مارت بقيمة 30$، ولكن من الضروري امتلاك هاتف في جميع الأحوال. سماعات الرأس السماعات التي تحجب الضوضاء جيِّدة حقًا، ولكن لا بأس في سماعات الأذن رخيصة الثمن إذا كانت ميزانيتك محدودة. ميكروفون أستخدم ميكروفون Blue Yeti حوالي مرتين في الشهر لتسجيل مقاطع فيديو، كما أستخدمه إذا لم يكن صوتي واضحًا أثناء إجراء المكالمات عبر برنامج Zoom أو برنامج Skype، ولكن من المؤكَّد أنَّ الميكروفون من الأجهزة التي يمكن تأجيل شرائها. البرامج العملية المطلوبة لا تساعدك هذه البرامج في تطوير الووردبريس بطريقة مباشرة، ولكنَّها مهمة لتنظيم وإنجاز عملك. برامج إدارة الوقت أنت بحاجة إلى معرفة الطريقة التي تمضي بها وقتك، وذلك لزيادة الوقت الذي تتقاضى عليه أجرًا ولتحديد مقدار المال الذي ستطلبه من زبائنك. إنَّ برنامج Toggl جيِّد لهذا الغرض. برامج إدارة الحسابات وجدول الرواتب يُعَدُّ برنامج QuickBooks Online جيّدًا لإدارة الحسابات وإعداد الفواتير، ويمكنك استخدامه أيضًا لجدول الرواتب إذا أردت. نحن نلجأ إلى شركة محاسبة قانونية محلية معتمدة، وهذا يفيدنا جدًا لأنَّها تتولّى كل أمورنا المتعلقة بالاستقطاعات والضرائب، ونحن واثقين من صحة ما تقوم به. تصل قيمة التكاليف الخاصة بنا إلى 60$ شهريًا مقابل الرواتب وحوالي 700$ سنويًا مقابل الضرائب. برامج مكالمات الفيديو إنَّ برنامج Zoom ممتاز. ينبغي أيضًا أن يكون لديك برنامج Skype، ولكن أرى أنَّه يزداد سوءًا منذ أن اشترته شركة مايكروسوفت. برامج تخزين الملفات أحبُّ استخدام دروب بوكس وجوجل درايف، والنسخة المدفوعة من دروب بوكس جديرة بالشراء إذا لم تكن تعاني من ضائقة مالية. برامج إدارة المشاريع يُعَدُّ برنامج Trello رائعًا، وهو مناسب للاستخدام الفردي، ولإدارة المشاريع مع فريق العمل، ولإدارة المشاريع الخاصة بالعملاء أيضًا. برامج الدردشة والمحادثة إذا كان لديك شركاء في العمل، فقد تحتاج إلى امتلاك حساب مجاني في برنامج Slack حتى تتعاونوا مع بعضكم بعضًا. برامج تعديل الصور بطبيعة الحال، من المهم أن يكون لديك معرفة بسيطة بكيفية تعديل الصور. يعدُّ برنامج GIMP جيّدًا جدًا ومجانيًا وهو نسخة مقلَّدة من برنامج الفوتوشوب. أنصحكم بالحصول عليه وتعلُّم أساسياته. كن مطور ووردبريس حر: الأمور التقنية الأساسية التي ينبغي مراعاتها على الأرجح أنَّك كنتَ تظنُّ أن يكون محور حديث المقال كلّه حول هذا القسم التقني، والذي ستتعرف من خلاله على المهارات البرمجية التي أنت بحاجة إلى امتلاكها حتى تبدأ في التسويق لنفسك كمطور ووردبريس حر. من المؤكَّد أنَّ هذا القسم مهم جدًا، وبدونه لن تقوم لك قائمة في العمل الحر في مجال تطوير الووردبريس. سنتناول فيما يلي بشيء من التفصيل عناصر الووردبريس التقنية الأساسية التي ينبغي أن تكون على علم بها بصفتك مطور ووردبريس حر. ما المشاريع التي تصلح الووردبريس في تطويرها؟ لماذا؟ متى تستخدمها؟ ما الذي يجعل الووردبريس مُجديًا؟ لماذا هو أفضل من Joomla ومن Drupal؟ لماذا ينبغي أن أستخدم الووردبريس في تطوير موقعي؟ أخبرني رئيسي أنَّ الووردبريس غير آمنة، فهل هذا صحيح؟ يوجد لدى موقع GoDaddy منشئ صفحات خاص به، فلماذا لا أستخدمه؟ أليس تكلفة إنشاء المواقع باستخدام Wix أرخص بكثير إذا أخذنا في الاعتبار الاستضافة وغيرها من الأمور؟ تحتاج إلى أن يكون لديك إجابات ذكية عن هذه الأسئلة، وليس ذلك لكي تخبرها لعملائك فحسب، ولكن لكي تكون أيضًا مدركًا للخدمات التي تقدِّمها في سوق العمل. إنَّ تحديد البرامج التي ستستخدمها ومعرفة طبيعة عملها -ما يمكنها القيام به وما لا يمكنها القيام به وكيف تتوافق مع البرامج الأخرى- هو من المسائل التقنية. ستقدِّم لك المقالات التالية إرشادات عامة بشأن الأسباب التي تدفعك إلى استخدام الووردبريس، وبشأن الحالات المناسبة لاستخدامها: المقال الأول: يستعرض مخطط يعطي فكرة بسيطة ومفيدة عن أنواع المشاريع التي تكون الووردبريس مناسبة لها وأنواع المشاريع التي لا تكون الووردبريس مناسبة لها. المقال الثاني: يتحدَّث فيه شريكي ديفيد عن الأسباب التي تدفعك لاستخدام الووردبريس. المقال الثالث: يقدِّم مقدمة عن Squarespace، ويبيِّن الحالات التي يكون فيها استخدام Squarespace أنسب من استخدام الووردبريس والعكس. البرامج المخصَّصة للمطورين ينطبق هنا ما ذكرناه سابقًا وهو أنَّ «طراز العتاد لا يهم»، إذ ينبغي أن تكون البرامج التي تستخدمها للتفاعل تقنيًا مع الووردبريس بسيطة جدًا. أخبرني بيبين ويليامسون (Pippin Williamson) ذات مرة بأنَّ البرامج المثبَّتة على حاسوبه المحمول بسيطة لدرجة أنَّه يستطيع إلقائه في بحيرة وأن يكون جاهزًا بعد 30 دقيقة للعمل على حاسوب جديد. أن يأتي هذا الكلام من المسؤول عن شركة تقدَّر قيمتها عدة ملايين من الدولارات وتعمل في مجال تطوير إضافات الووردبريس، فهذا يعني أنَّ مطوِّري الووردبريس المستقلين بإمكانهم أن يقوموا بالشيء ذاته. البرامج التي أحتاجها لإنجاز أي مشروع عادي هي: Sublime Text لتحرير النصوص البرمجية. FileZilla لنقل الملفات عبر بروتوكول نقل الملفات. WAMP الذي يمكن من خلاله تشغيل برامج الويب وتطويرها على شبكة محلية (أو MAMP لمستخدمي نظام الماك). متصفح ويب؛ أُفضِّل استخدام متصفح جوجل كروم وأدوات المطوِّر التي يوفرها. في الحقيقة، هذه البرامج فقط هي البرامج التي ستحتاجها للعمل على معظم المشاريع، وجميعها مجانية، ولن يستغرق معك تعلُّم أساسيات كلٍ منها أكثر من ساعة واحدة. المعرفة الأساسية باللغات التقنية اللغات الأساسية الأربعة اللازمة لتطوير الووردبريس -مرَّتبة حسب أهميتها- هي: PHP، وHTML، وCSS، وJavaScript. من الجيِّد أن يكون لديك خبرة بسيطة باللغات الثلاثة الأولى، ولكن حتى لو لم يكن لديك خبرة في لغة PHP، فإنَّه يمكنك -إلى حدٍ ما- أن تتعلَّمها من خلال تعلُّمك للنظام الأساسي الخاص بالووردبريس. لذا، إذا كنت لا تعرف استخدام لغة PHP، فأقترح عليك أن تتعلَّم PHP بينما تتعلَّم كتابة الشيفرات البرمجية في الووردبريس، لا أن تتعلَّمها على حدة، إذ أنَّ الووردبريس لا تستخدم إلا جزءًا صغيرًا من لغة PHP، وما تستخدمه في الواقع مخصَّص لها فقط بدرجة كبيرة. بعبارة مشابهة: من الأفضل لك أن تتعلَّم كيفية إنشاء أحواض السباحة بدلًا من أن تحصل على شهادة في الهندسة المعمارية بهدف أن تتمكَّن من إنشاء أحواض السباحة (إذا كان ذلك منطقيًا). إذا حاولتَ تعلُّم شروحات تطوير الووردبريس ووجدتَ نفسك تائهًا، فقد تكون بحاجة إلى علاج سريع لمواطن قصورك في أي لغة من اللغات السابق ذكرها والتي تمنعك من إحراز أي تقدُّم. نصيحتي لك هي اللجوء إلى موسوعة حسوب التي تقدِّم معلومات وافية عن كل لغة من هذه اللغات. إذا كان لديك معلومات تقنية عامة، يمكنني القول بأنَّ أسبوعًا من التعلُّم الجادّ للغات PHP و HTML و CSS كافٍ جدًا للدخول إلى صُلب الموضوع ألا وهو تعلُّم تطوير الووردبريس. أساسيات تطوير الووردبريس أعرض فيما يلي قائمة تحتوي على عدد من مفردات الووردبريس العشوائية التي تستثير ذاكرتك لكي تختبر مدى تقدُّمك في مجال تطوير الووردبريس، وينبغي أن تحفِّز كل مفردة من هذه المفردات مطوِّري الووردبريس المتمرِّسين على استحضار الكثير من الارتباطات والخبرات والذكريات والأفكار. add_action, add_filter, functions.php, stylesheet, customizer, wp_enqueue_script, wp_enqueue_style, the Loop, get_template_part, add_image_size, get_post_meta, get_the_content, get_the_ID, the_title, new WP_Query, template hierarchy, $args, foreach, is_singular, get_header, get_footer, Plugin Name: , Template: , while, wp_reset_postdata, update_option, get_option, add_shortcode, do_shortcode, get_the_terms إذا بدا لك كل ما في القائمة مألوفًا، فمن المؤكَّد أنَّك مطور ووردبريس بدرجة ما. كلَّما زاد عدد المفردات الغامضة بالنسبة لك، كان هذا مؤشِّرًا على أنَّك بحاجة إلى المزيد من الدراسة والمزيد من الخبرات حتى تصبح ضليعًا في تطوير الووردبريس. ملاحظة بشأن هذا التمرين: تتضمن القائمة السابقة بعض المفردات الأساسية التي اختيرت عشوائيًا والتي ينبغي على كل مطور ووردبريس أن يعلمها، ولا تحتوي القائمة على جميع -أو حتى معظم- المفاهيم الأساسية في مجال الووردبريس. يجب على جميع مطوِّري الووردبريس أيضًا أن يعلموا كيف يتناغم كل مفهوم من مفاهيم التطوير مع النظام التقني الكلي للووردبريس لكي يتمكَّنوا من استخدامه بالطريقة السليمة. إنَّ هذا التمرين هو مجرَّد اختبار عشوائي لتحديد مدى إلمامك ببعض المفردات الأكثر شيوعًا في مجال تطوير الووردبريس. أدوات تقنية أساسية تابعة لأطراف خارجية هذه الأدوات هي عبارة عن تقنيات الووردبريس الخارجية -مثل: القوالب، والإضافات، ومواقع الاستضافة، وغيرها- التي تؤثِّر بطريقة مباشرة على قدرتك على تقديم قيمة لعملائك. ينبغي عليك أن تحدِّد بعض الحلول التقنية التي ستلجأ إليها لكي تقدِّم المساعدة لعملائك عند الحاجة. شركة استضافة ينبغي أن تكون على علم دائم بشركة الاستضافة التي ستنصح عملاءك بالتعامل معها. أقترح أن يقع اختيارك المبدئي على شركة SiteGround (أو شركة WP Engine إذا احتاج العميل أو طلب استضافة مُدارة (managed hosting)). يمكنك معرفة المزيد من التفاصيل عن الأسباب التي جعلتنا نفضِّل هذا الخيار من خلال هذا الرابط. ينبغي أن تعلم أيضًا ما إذا كان نقل الموقع إلى استضافة أخرى يستحق العناء. بوجه عام، تكون عملية النقل ملائمة أكثر في الحالات التالية: هناك موقع واحد فقط على حساب الاستضافة. لا يزال الموقع في بداياته؛ وذلك حتى لا تضطر إلى ترحيل عشرات الرسائل الإلكترونية على سبيل المثال. المشكلات الموجودة في الاستضافة الحالية تُعيق الموقع عن النجاح؛ وليست مجرَّد مصادر إزعاج. ينبغي توجيه الانتباه للحالة الثالثة، إذ أنَّ الاستضافة البطيئة حد الإزعاج والمشكلات المرتبطة ببروتوكول SSL والدعم التقني السيئ وغيرها جميعها مصادر إزعاج رئيسية، ولكن لا تشكِّل هذه المشكلات عوائقًا استراتيجية أمام نجاح الموقع إلا في بعض الأحيان. إذا شعرت بأنَّ الاستضافة السيئة عائق استراتيجي، فاشرع في عملية النقل. أمَّا إذا كانت مجرَّد مصدر إزعاج، فتكيَّف معها. من الصعب التمييز بين الأمرين، ولكن سيزداد ذلك سهولة بمرور الزمن. منشئ النماذج (Form Builder) على الأغلب أنَّ النماذج هي أكثر الطرق شيوعًا لتفاعل المستخدم على مواقع الووردبريس، وتعتبر نماذج الاتصال (Contact forms) من الأمثلة الواضحة عليها. يمكننا إنشاء النماذج لأي غرض نريده بما في ذلك التسجيل للفعاليات أو حتى من أجل تفاعلات المستخدم المعقدة مثل التطوع لتبنِّي حيوان أليف. بالنسبة لي، أستخدم إضافة Gravity Forms لإنشاء النماذج. مع أنَّ هناك بعض الأشياء التي لا يمكنها القيام بها، إلا أنَّها خيار أولي ممتاز لإنشاء أي نموذج أحتاجه تقريبًا إلى أن يدفعني المشروع على استخدام خيار آخر. تُعَدُّ إضافة Ninja Forms وإضافة Caldera Forms من الإضافات الجيِّدة أيضًا، كما أنَّ إضافة Contact Form 7 مجانية وممتازة في إنشاء نماذج الاتصال. سأكون مرتابًا حيال استخدام أي إضافة لم أتطرَّق إلى ذكرها لإنشاء النماذج؛ فمع أنَّ هذا سيكون جائرًا بحق المشاريع الآخرى وبحق مطوِّريها، إلا أنَّ الإضافات التي ذكرتُها هي الخيارات الجيِّدة ذائعة الصيت، ومن غير المحتمل أن تحلَّ الخيارات الأخرى مشكلات لا تستطيع هذه الإضافات أن تحلَّها. منشئ الصفحات (Page Builder) يوجد في وقتنا الحالي إضافة ووردبريس جيِّدة جدًا لإنشاء الصفحات تُسمَّى Beaver Builder، وقد أحدثت تغييرًا جذريًا على الطريقة التي أعمل بها في مجال الووردبريس. من وجهة نظري، ينبغي عل كل مطور ووردبريس حر أن يحصل عليها وأن يتعلم كيفية استخدامها وأن تكون خياره الأول عندما يطلب منه العملاء إنشاء صفحة بتخطيط مخصَّص. إذا كنت ترغب في معرفة سبب تفضيلي لإضافة Beaver Builder عن برمجيات إنشاء الصفحات الرئيسية الأخرى، فقد كتبتُ مقالاً يقارن بطريقة مفصَّلة بين أربعة منها، ويمكنك الاطّلاع عليه من خلال هذا الرابط. ماذا عن استخدام Gutenberg؟ ماذا عن استخدام حلول إنشاء الصفحات التي توفِّر خدمة الاستضافة مثل Squarespace؟ دائمًا ما كنتُ متحمِّسًا لتجربة تأليف وتحرير المحتوى في الووردبريس، ولذلك كتبتُ الكثير بشأن هذا الموضوع خلال السنوات القليلة الماضية، وكتبتُ خصوصًا عن طريقة التفاعل المعقَّدة بين تقنيات معينة مثل Squarespace و Beaver Builder و Gutenberg، وألخِّص فيما يلي النقاط الرئيسية: لن تتسبَّب Gutenberg في اندثار إضافات الووردبريس مثل Beaver Builder في وقت قريب، حتى بعد صدور نسخة ووردبريس 5.0. أصبحت إضافة Beaver Builder أفضل من ذي قبل بعد صدور النسخة 2.0 منها (وهو من أفضل الإضافات لإنشاء صفحات الووردبريس من وجهة نظري). تجربة تأليف المحتوى باستخدام Squarespace أكثر روعة منها في Beaver Builder، كما يعتبر Squarespace تقنية أبسط من الووردبريس بوجه عام إذا أخذنا في الاعتبار الاستضافة وغيرها، وهو خيار جيِّد للمواقع البسيطة جدًا. أمّأ Beaver Builder فهو يوفِّر تجربة مشابهة للمشاريع التي تتطلَّب استخدام الووردبريس. ينبغي عليك أن تبتعد عن معظم إضافات الووردبريس الأخرى الخاصَّة بإنشاء الصفحات. من الصعب جدًا تطوير منشئ صفحات جيِّد للووردبريس، وقد بُنيت معظم المشاريع التي تهدف لذلك على نهج خطأ تمامًا (خاصةً اعتماد عناصر تخطيط الصفحة على الأكواد المختصرة). يعدُّ Visual Composer وDivi Builder أضخم مشروعين ولكنَّهما –أيضًا- من أسوأ المشاريع. تعدُّ إضافة Elementor من الإضافات الجيِّدة، ولكنَّني شخصيًا أُفضِّل Beaver Builder. القوالب ومتاجر القوالب من الصعب العثور على القوالب الجيِّدة، إذ أنَّ سوق القوالب يعجُّ بالقوى السوقية التي تعطي أولوية للمظاهر الفارغة على حساب محتوى القوالب وتصميمها المتقَن. إنَّ بناء موقعك الإلكتروني بالاعتماد على قالب سيئ هو أحد أسهل الطرق التي تجعل المشروع فظيعًا. من المؤكد أنَّه ينبغي عليك العثور على المتجر الذي تراه مناسبًا، ولكن أنصحك بالابتعاد عن متجر ThemeForest، وأقترح عليك متاجر القوالب الأتية: Solo Pine Elmastudio ThemeBeans Codestag قد ترغب في الاستغناء تمامًا عن القوالب التجارية نتيجة التطوُّر الكبير الذي طرأ على برامج إنشاء الصفحات. عمومًا، يُعجبني Understrap كقالب يمكن استخدامه لجميع الأغراض، وStorefront كقالب يمكن استخدامه للووكومرس، ولكن عليك أن تعلم بأنَّ قالب Understrap متقدم للغاية (يملك حوالي 8000 ملف على شكل اعتماديات وجميعها مرتبطة بمنفذات مهام [task runners] ومدراء الاعتماديات [dependency managers] وأوراق أنماط Sass المُصرَّفة وما إلى ذلك)، أمَّا قالب Storefront فيعتمد على مبدأ الخطافات (hook-based) بدرجة كبيرة. من الجيِّد أيضًا أن تتعلَّم كيفية تقييم القوالب قبل شرائها من خلال هذا الرابط. ينبغي عليك أيضًا أن تبتعد عن صنفين من القوالب وهما: القوالب القبيحة متعددة الأغراض الموجودة على متجر ThemeForest، وأي قالب يوفِّره موقع Elegant Themes بما في ذلك قالب Divi بصورة خاصة (يؤسفني قول هذا). حلول النسخ الاحتياطي وتصدير البيانات شخصيًا، لستُ مواظبًا على القيام بالنسخ الاحتياطي اليدوي كما "ينبغي" أن أكون، وذلك لأنَّ شركة SiteGround تحتفظ بنسخ احتياطية، ودائمًا ما أنقذني هذا في الحالات النادرة التي أفسدتُ فيها شيئًا. تجدر الإشارة -أيضًا- إلى نظام النسخ الاحتياطي الأوتوماتيكي الرائع الخاص بشركة WP Engine](e بسبب الخدمات التي تقدِّمها. من المؤكَّد أنَّ عملية النسخ الاحتياطي مهمة، وتعتبر إضافة BackupBuddy خيارًا جيِّدًا للقيام بها. إنَّ إضافة All-in-One WP Migration هي من حلول النسخ الاحتياطي وتصدير البيانات التي تعجبني بشدة. يمكنني الجزم بأنَّ هذه الإضافة يمكن الاعتماد عليها وهي توفِّر عليك الوقت على نحوٍ لا يُصدَّق، كما أنَّها تقدِّم حلًا كاملًا لإجراء النسخ الاحتياطي -كما هو واضح من اسمها-، إذ أنَّها تخزِّن بيانات موقعك بالكامل. الخلاصة تحدَّثنا في هذا المقال عن كيفية الاستعداد للانطلاق في العمل الحر في مجال تطوير الووردبريس، وقد تحدَّثنا عن أمور كثيرة، أليس كذلك؟ لا تُجهد نفسك، إذ أنَّك سوف تتقن هذه الأمور بمرور الزمن دون أن تضطر إلى التخطيط لجميع هذه الأمور مسبقًا. هذا المقال بمثابة الدليل الذي سيرشدك إلى "عيش حياة سعيدة". هناك الكثير من الأمور التي ينبغي التفكير فيها، ولكن لا يُشترط التفكير فيها جميعًا دفعة واحدة ولا قبل أن يحين وقتها. أتمنى أن يكون هذا المقال قد بيَّن لك الطريق الذي عليك أن تسلكه لكي تصبح مطور ووردبريس حر، وأن يكون أيضًا قد نبَّهك إلى نقاط ربما كنتَ غافلًا عنها. معظم الأمور التي ذكرتُها هي أمور تجاهلتُها حتى لم يعد أمامي خيار سوى التعامل معها، ولذلك كان الطريق الذي سلكتُه كمطور ووردبريس حر أطول وتشوبه الكثير من الصعوبات. إذا كان لديك أفكار أخرى عن كيفية الاستعداد للانطلاق في العمل الحر في مجال تطوير الووردبريس، فأخبرنا بها من خلال التعليقات. ترجمة -وبتصرف- للمقال Become a Freelance WordPress Developer: How to Make a Career of It لصاحبه Fred Meyer1 نقطة
-
في هذا الدرس سنستعرض بعض دوال النصوص المضمّنة في مكتبة دوال اكسل ونوضّح من خلال الأمثلة كيفية استخدامها لتطبيق إجراءات مختلفة على القيم النصيّة مثل، البحث عن النصوص واستبدالها، تنسيق حالة الأحرف للنصوص الإنجليزية، وغيرها. TRIM تعمل هذه الدالة على إزالة المسافات الزائدة بين الكلمات، أو في بداية ونهاية السلسلة النصية. والصيغة العامة لها هي: =TRIM(text) text: النص الذي نريد إزالة المسافات الزائدة منه. مثال: تحتوي الخلية B4 الموضّحة أدناه على مسافات غير منتظمة بين الكلمات، ولحذف المسافات غير المرغوبة نكتب الصيغة التالية في خلية النتيجة: بإمكاننا تحديد الخلية التي تحتوي على النص مباشرة، أو لصق النص يدويًا بين علامتي اقتباس (" "). نضغط على ENTER لإظهار النتيجة: كما نلاحظ في خلية النتيجة، تمت إزالة كل المسافات الزائدة باستثناء المسافات الفردية بين الكلمات. يمكننا استخدام هذه الدالة عند استيراد النصوص إلى اكسل ويكون تباعد الكلمات فيها غير منتظم. إذ ستكون عملية إزالة المسافات الزائدة أسهل وأسرع بكثير من القيام بها يدويًا. PROPER تعمل هذه الدالة على تحويل الحرف الأول من كل كلمة في السلسة النصية إلى حرف كبير وتبقي بقية الحروف صغيرة. ويمكننا الاستفادة منها عند استيراد نصوص معيّنة إلى اكسل وكانت حالة الأحرف للكلمات غير مرتّبة، إذ ستجعل هذه الدالة عملية تنسيق حالة الأحرف أسرع وأسهل بكثير من القيام بها يدويًا. الصيغة العامة لهذه الدالة: =PROPER(text) text: النص الذي نريد تطبيق الدالة عليه. مثال: تحتوي الخلية B5 الموضحة أدناه على نص باللغة الإنجليزية، وحالة الأحرف للكلمات غير منتظمة، لتعديل النص وجعل كل كلمة تبدأ بحرف كبير وبقية الحروف صغيرة، نكتب الصيغة التالية في خلية النتيجة: يمكننا تحديد الخلية التي تحتوي على النص، أو لصق النص غير المرتب بين علامتي اقتباس في الصيغة. نضغط على مفتاح ENTER لإظهار النتيجة: من خصائص دالة PROPER هو أنّه حتّى إذا كانت بداية الكلمة أرقام أو رموز (مثل 09test)، فأنّها تتجاوز الأرقام وتحوّل الحرف الأول إلى حرف كبير (أي تصبح الكلمة المذكورة 09Test). FIND تُستخدم هذه الدالة لتحديد موقع كلمة/عبارة معيّنة ضمن سلسلة نصيّة. فتقوم بإرجاع ترتيب الحرف الأول للكلمة التي نبحث عنها نسبة إلى عدد حروف السلسلة. وتكون هذه الدالة حساسة لتشكيل الكلمة في اللغة العربية ولحالة الأحرف (كبيرة أو صغيرة) في اللغة الإنجليزية. الصيغة العامة للدالة: =FIND(find_text; within_text; [start_num]) find_text: النص الذي نبحث عنه، وهو مطلوب في الصيغة. within_text: النص الذي نريد البحث فيه، وهو أيضًا مطلوب في الصيغة. start_num: مرتبة الحرف الذي نريد بدء البحث منه، ووجوده اختياري في الصيغة (معطيات الصيغة التي توضع بين قوسين مربعين [ ] تكون اختيارية). مثال: لمعرفة موقع كلمة "Functions" في نص الخلية G3 نكتب الصيغة التالية: نراعي وضع الكلمة التي نريد البحث عنها بين علامتي اقتباس في الصيغة ونتأكّد من مطابقة حالة الأحرف، ثم نضغط على مفتاح ENTER لإظهار النتيجة: تم إرجاع النتيجة "6" وهو بالفعل تسلسل أول حرف في كلمة "Functions". فكلمة "Text" تحتل 4 مراتب، والمسافة بين "Functions" و"Text" تأخذ مرتبة واحد ليصبح المجموع 5، وحرف "F" هو السادس. في هذا المثال لم نحدد قيمة start_num، وفي هذه الحالة سيتم افتراض هذه القيمة 1، أي يبدأ البحث من أول حرف في النص. لنغيّر الصيغة ونحدد قيمة المتغيّر start_num 17 مثلا: بالنتيجة تم إرجاع الخطأ #VALUE! لأنّه لم يتم العثور على كلمة "Functions" بعد المرتبة 17. فكلمتي "Text" و"Functions" مع المسافة بينهما تحتل 14 مرتبة، بمعنى أنّ كلمة "Functions" تقع قبل المرتبة 17: لنغيّر الصيغة ونبحث عن موقع كلمة "حسوب" في الخلية G2، وكالتالي: عند الضغط على مفتاح ENTER تم إرجاع الخطأ #VALUE! وذلك لأننا قمنا بإضافة ضمّة فوق حرف السين عند كتابة الصيغة، وكما أسلفنا الذكر، تكون دالة FIND حسّاسة لتشكيل الحروف في اللغة العربية. SEARCH تماثل دالة FIND من حيث الوظيفة، لكنّها غير حسّاسة لتشكل الحروف في اللغة العربية وحالتها في اللغة الإنجليزية. الصيغة العامة للدالة: =FIND(find_text; within_text; [start_num]) find_text: النص الذي نبحث عنه، وهو مطلوب في الصيغة. within_text: النص الذي نريد البحث فيه، وهو أيضًا مطلوب في الصيغة. start_num: ترتيب الحرف الذي نريد بدء البحث منه، ووجوده اختياري في الصيغة. مثال: سنطبّق هذه الدالة لتحديد موقع الكلمة "Functions" كما في المثال السابق: سنلاحظ أنّه سيتم إرجاع نفس النتيجة، "6"، بالرغم من أننا كتبنا بداية كلمة "functions" بحرف صغير: REPLACE تستخدم هذه الدالة لاستبدال نص معيّن في سلسلة نصيّة بنص آخر حسب عدد الحروف الذي نحدّده. ووظيفتها مشابهة لوظيفة أداة استبدال النصوص Replace. الصيغة العامة للدالة: =REPLACE( old_text; start_num; num_chars; new_text ) old_text: السلسلة النصية التي نريد استبدال جزء منها. start_num: مرتبة الحرف الأول للنص الذي نريد استبداله. num_chars: عدد حروف النص القديم الذي نريد استبداله. new_text: النص الجديد الذي نريد الاستبدال به. ملاحظة: كل المتغيرات أعلاه مطلوبة في الصيغة. مثال: لاستبدال كلمة "النصوص" في الخلية G2 بالكلمة "نصية"، نكتب الصيغة كالتالي: قمنا بإدخال الخلية G2 في الصيغة لأنّها تحتوي على النص الأصلي الذي نريد استبدال جزء منه، يليه الرقم "6" لأنّ مرتبة أول حرف من كلمة "النصوص هي السادسة (كلمة "دوال" مع المسافة بعدها تحتل 5 مراتب، وكلمة "النصوص" تبدأ عند المرتبة 6)، يليه الرقم "6" لأنّ كلمة "النصوص" تتكوّن من ستّة حروف، وأخيرًا كلمة "نصيّة" التي نريد الاستبدال بها بين علامتي اقتباس. والنتيجة: UPPER تقوم هذه الدالة بجعل كل أحرف السلسلة النصيّة كبيرة. والصيغة العامة لها هي: =UPPER(text) text: النص الذي نريد تطبيق الدالة عليه. مثال: لتحويل كل النصوص في الخلية B5 إلى أحرف كبيرة نكتب الصيغة التالية: والنتيجة: LOWER عملها معاكس للدالة السابقة، إذ تجعل كل أحرف السلسلة النصية صغيرة. الصيغة العامة لهذه الدالة هي: =LOWER(text) مثال: لتحويل نفس النص في الخلية B5 إلى أحرف صغيرة نكتب الصيغة التالية: والنتيجة: خاتمة لقد تعلّمنا كيفية إزالة المسافات الزائدة بين النصوص، كيفية البحث عن نصوص معيّنة واستبدالها، وكيفية تغيير حالة الأحرف باستخدام بعض الدوال النصيّة. في الدرس القادم سنغطّي المزيد من هذه الدوال ونتعلّم كيفية تجميع النص وكيفية استخلاص جزء منه.1 نقطة