لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 10/22/24 في كل الموقع
-
السلام عليكم ممكن افهم البيانات دي ؟ Testing.csv1 نقطة
-
السلام عليكم مرحبا جميعا ,احاول تعلم تقنية PWA مع جانغو ,لذلك قمت بإنشاء مشروع تجريبي بسيط عبارة عن زر واحد فقط وعند النقر عليه يتم تحميل التطبيق كpwa لكنه لايعمل مهما حاولت, على الرغم انه لايوجد لدي اي اخطاء ظاهرة سواء بالكونسول او في قسم ابليكيشن, ارجو منكم مساعدتي في ايجاد المشكلة . PWA-TEST.zip1 نقطة
-
سأشرح لك الأمر وحاول تطبيقه على مشروع لتستفيد، أولاً تثبيت مكتبة django-pwa: pip install django-pwa ثم في ملف settings.py في الجزء الخاص بـ installed apps قم بإضافة pwa: ثم في ملف urls.py الذي بجانب settings.py ضع المسار التالي: path(“, include(‘pwa.urls’)) ثم في مجلد js قم بإنشاء ملف باسم serviceworker.js وضع التالي: let staticCacheName = 'djangopwa-v1'; self.addEventListener('install', function(event) { event.waitUntil( caches.open(staticCacheName).then(function(cache) { return cache.addAll([ '', ]); }) ); }); self.addEventListener('fetch', function(event) { let requestUrl = new URL(event.request.url); if (requestUrl.origin === location.origin) { if ((requestUrl.pathname === '/')) { event.respondWith(caches.match('')); return; } } event.respondWith( caches.match(event.request).then(function(response) { return response || fetch(event.request); }) ); }); الآن في ملف settings.py ضع التالي بأي مكان: PWA_SERVICE_WORKER_PATH = os.path.join(BASE_DIR, ‘static/js’, ‘serviceworker.js’) ثم ضع التالي أيضًا: PWA_APP_NAME = 'hsoub' PWA_APP_DESCRIPTION = "hsoub PWA" PWA_APP_THEME_COLOR = '#000000' PWA_APP_BACKGROUND_COLOR = '#ffffff' PWA_APP_DISPLAY = 'standalone' PWA_APP_SCOPE = '/' PWA_APP_ORIENTATION = 'any' PWA_APP_START_URL = '/' PWA_APP_STATUS_BAR_COLOR = 'default' PWA_APP_ICONS = [ { 'src': 'static/images/icon-160x160.png', 'sizes': '160x160' } ] PWA_APP_ICONS_APPLE = [ { 'src': 'static/images/icon-160x160.png', 'sizes': '160x160' } ] PWA_APP_SPLASH_SCREEN = [ { 'src': 'static/images/icon.png', 'media': '(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)' } ] PWA_APP_DIR = 'ltr' PWA_APP_LANG = 'en-US' بالطبع لا تنسى وضع أيقونات في مجلد static/images لاحظ في الكود نقوم بتحديد أيقونة باسم icon.png وغيرها بمقاسات مختلفة كأيقونة لتطبيق PWA، تستطيع توليد تلك الصور من خلال https://redketchup.io/icon-converter. وسيقوم إطار جانغو بإنشاء ملف manifest.json من خلال تلك البيانات. والآن في قالب الصفحة الرئيسية ضع التالي بعد عنصر <html>: {% load pwa %} {% progressive_web_app_meta %} والآن عند تشغيل المشروع سترى أيقونة لتثبيت PWA في شريط العنوان على اليمين.1 نقطة
-
بالنسبة لمواقع الويب أفضل طريقة هي استخدام إضافة wappalyzer على المتصفح، ستعرض لك أغلب التقنيات المستخدمة بالموقع. توجد إضافات ومنصات أخرى لكن تلك أفضلهم. ستتجه إلى الموقع الذي تريد التعرف على التقنيات المستخدمة به ثم تقوم بالضغط على أيقونة الإضافة وسيتم عرض ما تم التعرف عليه. بعدها تستطيع استخدام موقع builtwith إن لم تحصل على ما تريد، فهو يوفر نفس الخدمة.1 نقطة
-
السلام عليكم هي اي المنصة Big Interview ومقابلات Byteboard ؟1 نقطة
-
Big Interview من اسمها منصة عبر الإنترنت توفر أدوات وموارد لمساعدة الأشخاص على التحضير لمقابلات العمل. ستجد بها مجموعة واسعة من أسئلة المقابلات الممارسة، مع ملاحظات فورية من الذكاء الاصطناعي، وتقدم نصائح وإرشادات حول كيفية التحضير لمقابلات العمل، بما في ذلك كيفية كتابة سيرة ذاتية قوية، وكيفية الإجابة على أسئلة صعبة، وكيفية التفاوض على الراتب. أيضًا خدمة مراجعة سيرة ذاتية من قبل خبراء في مجال التوظيف، وميزة ممارسة مقابلات الفيديو مع محاكاة بيئة مقابلة حقيقية. بينما Byteboard منصة توفر مقابلات تقنية ممارسة لطلاب علوم الكمبيوتر والمهندسين، أي تركيزها على مقابلات تقنية. ستجد بها مجموعة واسعة من أسئلة المقابلات التقنية، بما في ذلك أسئلة البرمجة، وأسئلة تصميم البيانات، وأسئلة حل المشكلات، مع ملاحظات فورية على أداء المتقدمين، بما في ذلك حلولهم للأسئلة. أيضًا تتوفر ميزة ممارسة مقابلات الفيديو مع محاكاة بيئة مقابلة حقيقية. ويوجد منصات مشابهة مثل Pramp التي توفر ممارسة مقابلات تقنية مجانية. و LeetCode لممارسة حل أسئلة البرمجة مع التركيز على أسئلة المقابلات.1 نقطة
-
1 نقطة
-
Big Interview هي منصة تدريب على الإنترنت للمقابلات الوظيفية تقوم بتقديم محاكاة للمقابلات، دروس الفيديو، ونصائح للسير الذاتية أي أنها تستهدف الباحثين عن عمل لتحسين مهاراتهم في المقابلات بينما Byteboard هي منصة تقييم للمبرمجين والمهندسين تقوم بتقديم اختبارات عملية تحاكي مهام العمل الحقيقية وتركز على تقييم المهارات التقنية والعملية للمرشحين كما تهدف لتحسين وتقليل التحيز في عملية التوظيف التقني.1 نقطة
-
1 نقطة
-
من المفترض أن تصل لجميع الدورات الخاصة بالشهادة، تأكد من أنك قمت بتسجيل الدخول من نفس الحساب الذي تم الدفع منه.1 نقطة
-
تُعدّ لغة PHP من أكثر اللغات استخدامًا في تطوير مواقع الويب لأنها سهلة وتتيح بناء تطبيقات الويب بسرعة. لكن رغم سهولتها إلا أنها تطورت وأصبحت تضم العديد من المميزات والفروق الرئيسية والدقيقة التي يمكن أن يخطئ بها المطورون بالرغم من سهولة استخدامها، فقد يقع المطورون في أخطاء بسبب هذه التفاصيل الدقيقة في اللغة، مما يستغرق منهم وقتًا طويلًا لإصلاحها. في هذا المقال. سنسلط الضوء في هذا المقال على 10 من الأخطاء الأكثر شيوعًا التي يجب على مطوري PHP توخّي الحذر منها. الخطأ 1: ترك مراجع References المصفوفة معلّقة بعد انتهاء حلقات foreach يمكن أن يكون استخدام المراجع في حلقات foreach مفيدًا إذا أردتَ العمل على كل عنصر من المصفوفة التي تمر عليها، فليكن لدينا مثلًا ما يلي: $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is now array(2, 4, 6, 8) ولكن إن لم تكن حذرًا، فقد يكون لهذه المراجع بعض الآثار الجانبية والعواقب غير المرغوب فيها، فمثلًا سيبقى المتغير $value ضمن النطاق Scope وسيحتفظ بمرجع إلى العنصر الأخير من المصفوفة بعد تنفيذ الشيفرة البرمجية في المثال السابق، وبالتالي قد تؤدي العمليات اللاحقة المُطبَّقة على المتغير $value إلى تعديل العنصر الأخير في المصفوفة عن غير قصد. تذكّر أن حلقة foreach لا تنشئ نطاقًا، وبالتالي يُعَد المتغير $value في المثال السابق مرجعًا ضمن النطاق العلوي للسكريبت، حيث تضبط حلقة foreach المرجع للإشارة إلى العنصر التالي من المصفوفة $arr في كل تكرار، ويبقى المتغير $value يؤشّر إلى العنصر الأخير من المصفوفة $arr، ويبقى ضمن النطاق بعد اكتمال الحلقة. إليك فيما يلي مثال عن نوع الأخطاء المربكة التي يمكن أن تؤدي إلى هذه المشكلة: $array = [1, 2, 3]; echo implode(',', $array), "\n"; foreach ($array as &$value) {} // من خلال المرجع echo implode(',', $array), "\n"; foreach ($array as $value) {} // من خلال القيمة (أي النسخة) echo implode(',', $array), "\n"; وسيكون خرج الشيفرة البرمجية السابقة ما يلي: 1,2,3 1,2,3 1,2,2 هذا ليس خطأ مطبعيًا، فالقيمة الأخيرة في السطر الأخير هي 2 وليست 3، والسبب هو بقاء المصفوفة $array دون تغيير بعد المرور على حلقة foreach الأولى، ولكن يُترَك المتغير $value بوصفه مرجعًا مُعلَّقًا للعنصر الأخير في المصفوفة $array لأن حلقة foreach وصلت إلى المتغير $value من خلال المرجع، لذا ستحدث أشياء غريبة عندما نمر على حلقة foreach الثانية، حيث تنسخ حلقة foreach كل عنصر تسلسلي من عناصر المصفوفة $array إلى المتغير $value في كل خطوة من الحلقة بسبب الوصول إلى هذا المتغير من خلال القيمة (أي من خلال النسخة). إليك ما يحدث في كل خطوة من حلقة foreach الثانية: تمرير القيمة 1: يؤدي إلى نسخ العنصر الأول من المصفوفة $array[0] (أي القيمة "1") إلى المتغير $value (وهو مرجع إلى العنصر $array[2])، لذا سيساوي $array[2] الآن القيمة 1، وستحتوي المصفوفة $array على العناصر [1, 2, 1]. تمرير القيمة 2: يؤدي إلى نسخ العنصر الثاني من المصفوفة $array[1] (أي القيمة "2") إلى المتغير $value (وهو مرجع إلى العنصر $array[2])، لذا سيساوي $array[2] الآن القيمة 2، وستحتوي المصفوفة $array على العناصر [1, 2, 2]. تمرير القيمة 3: يؤدي إلى نسخ العنصر الثالث من المصفوفة $array[2] (الذي يساوي القيمة "2" الآن) إلى المتغير $value (وهو مرجع إلى العنصر $array[2])، لذلك لا يزال العنصر $array[2] يساوي القيمة 2، وستحتوي المصفوفة $array الآن على العناصر [1, 2, 2]. يمكن الاستفادة من استخدام المراجع في حلقات foreach دون التعرض لخطر هذه الأنواع من المشاكل من خلال استدعاء الدالة unset() مع المتغير بعد حلقة foreach مباشرةً لإزالة المرجع كما في المثال التالي: $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // لم يَعُد المتغير $value مرجعًا إلى العنصر $arr[3] الخطأ 2: سوء فهم سلوك الدالة isset() تعيد الدالة isset() القيمة false في حالة عدم وجود عنصر، وتعيد أيضًا false للقيم null، حيث يُسبّب هذا السلوك مشكلات، فليكن لدينا المثال التالي: $data = fetchRecordFromStorage($storage, $identifier); if (!isset($data['keyShouldBeSet']) { // افعل شيئًا هنا عند عدم ضبط 'keyShouldBeSet' } يُفترَض أننا نريد التحقق ممّا إذا كان keyShouldBeSet مضبوطًا في $data، ولكن ستعيد الدالة isset($data['keyShouldBeSet']) أيضًا القيمة false حتى عند ضبط $data['keyShouldBeSet'] على القيمة null، وبالتالي يوجد تناقض مع ما ذكرناه سابقًا. إليك أيضًا المثال التالي: if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if (!isset($postData)) { echo 'post not active'; } تفترض الشيفرة البرمجية السابقة أنه إذا أعادت $_POST['active'] القيمة true، فسيكون postData مضبوطًا، وبالتالي ستعيد الدالة isset($postData) القيمة true، وتفترض أيضًا أن الطريقة الوحيدة التي ستعيد بها الدالة isset($postData) القيمة false هي إذا أعادت $_POST['active'] القيمة false، ولكن ستعيد الدالة isset($postData) القيمة false عند ضبط $postData على القيمة null، وبالتالي يمكن أن تعيد الدالة isset($postData) القيمة false حتى إذا أعادت $_POST['active'] القيمة true، لذا يوجد تناقض مع ما ذكرناه سابقًا. إذا كان الهدف من الشيفرة البرمجية السابقة هو التحقق مما إذا كانت $_POST['active'] تعيد القيمة true، فسيكون الاعتماد على الدالة isset() لذلك قرارًا برمجيًا سيئًا على أيّة حال، لذا يُفضَّل إعادة التحقق من $_POST['active'] بدلًا من ذلك كما يلي: if ($_POST['active']) { $postData = extractSomething($_POST); } // ... if ($_POST['active']) { echo 'post not active'; } يُعَد استخدام التابع array_key_exists() حلًا أكثر قوة بالنسبة للحالات التي يكون فيها من المهم التحقق مما إذا كان المتغير مضبوطًا فعليًا، أو للتمييز بين متغير غير مضبوط ومتغير مضبوط على القيمة null، فمثلًا يمكننا إعادة كتابة المثال الأول من المثالين السابقين كما يلي: $data = fetchRecordFromStorage($storage, $identifier); if (! array_key_exists('keyShouldBeSet', $data)) { // افعل ذلك عند عدم ضبط 'keyShouldBeSet' } إذا جمعنا بين التابعين array_key_exists() و get_defined_vars()، فيمكننا التحقق بطريقة موثوقة من ضبط متغير ضمن النطاق الحالي كما يلي: if (array_key_exists('varShouldBeSet', get_defined_vars())) { // المتغير $varShouldBeSet موجود في النطاق الحالي } الخطأ 3: الخلط بين الإعادة باستخدام المرجع وإعادتها باستخدام القيمة ليكن لدينا مقطع الشيفرة البرمجية التالي: class Config { private $values = []; public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; إذا شغّلتَ الشيفرة البرمجية السابقة، فستحصل على ما يلي: PHP Notice: Undefined index: test in /path/to/my/script.php on line 21 تكمن المشكلة في أن هذه الشيفرة البرمجية تخلط بين إعادة المصفوفات باستخدام المرجع وإعادتها باستخدام القيمة، حيث إن لم تخبر لغةَ PHP صراحةً بإعادة المصفوفة باستخدام المرجع (أي باستخدام &)، فستعيد لغة PHP المصفوفة باستخدام القيمة افتراضيًا، وهذا يمثّل إعادة نسخة من المصفوفة، وبالتالي لن تتمكّن الدالة المُستدعاة والمستدعِي من الوصول إلى النسخة نفسها من المصفوفة. يعيد استدعاء الدالة getValues() السابق نسخة من المصفوفة $values بدلًا من إعادة مرجع إليها. إذًا لنعيد النظر إلى السطرين الرئيسيين من المثال السابق: // تعيد الدالة getValues() نسخة من المصفوفة $values، مما يؤدي إلى إضافة عنصر 'test' // إلى نسخة من المصفوفة $values، وليس إلى المصفوفة $values نفسها $config->getValues()['test'] = 'test'; // تعيد الدالة getValues() مرة أخرى نسخة أخرى من المصفوفة $values، ولا تحتوي هذه النسخة // على عنصر 'test'، ولذلك نحصل على رسالة فهرس غير مُعرَّف "undefined index" echo $config->getValues()['test']; أحد الحلول الممكنة لهذه المشكلة هو حفظ النسخة الأولى من المصفوفة $values التي تعيدها الدالة getValues()، ثم العمل على تلك النسخة لاحقًا كما في المثال التالي: $vals = $config->getValues(); $vals['test'] = 'test'; echo $vals['test']; ستعمل هذه الشيفرة البرمجية بنجاح، أي أنها ستعطي test دون إنشاء أيّ رسالة فهرس غير مُعرَّف "undefined index"، ولكن قد يكون هذا الأسلوب مناسبًا أو غير مناسب اعتمادًا على ما تحاول تحقيقه، إذ لن تعدّل هذه الشيفرة البرمجية المصفوفة $values الأصلية، لذا إذا أردتَ أن تؤثر تعديلاتك (مثل إضافة عنصر test) على المصفوفة الأصلية، فيجب أن تعدّل الدالة getValues() لإعادة مرجع إلى المصفوفة $values نفسها. يمكن تحقيق ذلك من خلال إضافة & قبل اسم الدالة، مما يشير إلى أنها يجب أن تعيد مرجعًا كما يلي: class Config { private $values = []; // إعادة مرجع إلى المصفوفة $values الفعلية public function &getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; وسيكون الخرج test كما هو متوقع. لنجعل الآن الأمور أكثر إرباكًا كما في مقتطف الشيفرة البرمجية التالي: class Config { private $values; // استخدام كائن مصفوفة ArrayObject بدلًا من المصفوفة public function __construct() { $this->values = new ArrayObject(); } public function getValues() { return $this->values; } } $config = new Config(); $config->getValues()['test'] = 'test'; echo $config->getValues()['test']; إذا اعتقدتَ أن هذه الشيفرة البرمجية ستؤدي إلى خطأ "undefined index" نفسه الموجود في مثال المصفوفة array السابق، فأنت مخطئ، إذ ستعمل هذه الشيفرة البرمجية بنجاح، والسبب هو أن لغة PHP تمرّر الكائنات من خلال المرجع دائمًا على عكس المصفوفات، فالكائن ArrayObject هو كائن من مكتبة PHP المعيارية -أو كائن SPL- يحاكي استخدام المصفوفات، ولكنه يعمل بوصفه كائنًا. ليس من الواضح دائمًا في لغة PHP ما إذا كنت تتعامل مع نسخة أو مرجع كما توضح هذه الأمثلة، لذلك يجب أن تفهم هذه السلوكيات الافتراضية مثل تمرير المتغيرات والمصفوفات من خلال القيمة وتمرير الكائنات من خلال المرجع، ويجب التحقق بعناية من توثيق واجهة برمجة التطبيقات API الخاصة بالدالة التي تستدعيها لمعرفة ما إذا كانت تعيد قيمة، أو نسخة من مصفوفة، أو مرجعًا إلى مصفوفة، أو مرجعًا إلى كائن. يجب أيضًا تجنب ممارسة إعادة مرجع إلى مصفوفة أو كائن ArrayObject، لأنه يوفر للمستدعِي القدرة على تعديل البيانات الخاصة للنسخة، وهذا يناقض مفهوم التغليف Encapsulation، لذا يُفضَّل استخدام النمط القديم للجوالب Getters والضوابط Setters كما في المثال التالي: class Config { private $values = []; public function setValue($key, $value) { $this->values[$key] = $value; } public function getValue($key) { return $this->values[$key]; } } $config = new Config(); $config->setValue('testKey', 'testValue'); echo $config->getValue('testKey'); // echos 'testValue' تمنح هذه الطريقة المستدعِي القدرةَ على ضبط أو جلب أيّ قيمة من المصفوفة دون توفير وصول عام إلى المصفوفة $values الخاصة نفسها. الخطأ 4: إجراء الاستعلامات ضمن حلقة يمكن أن تصادف شيئًا كما يلي إذا كانت شيفرة PHP لا تعمل لديك: $models = []; foreach ($inputValues as $inputValue) { $models[] = $valueRepository->findByValue($inputValue); } قد لا يكون هناك أيّ شيء خاطئ، ولكن إذا اتبعت المنطق الموجود في هذه الشيفرة البرمجية، فقد تجد أن الاستدعاء البسيط السابق $valueRepository->findByValue() يؤدي في النهاية إلى استعلامٍ من نوعٍ ما كما يلي: $result = $connection->query("SELECT `x`,`y` FROM `values` WHERE `value`=" . $inputValue); لذا سيؤدي كل تكرار للحلقة السابقة إلى استعلام منفصل لقاعدة البيانات، فمثلًا إذا زوّدتَ الحلقة بمصفوفةٍ مكونة من 1000 قيمة، فستنشئ 1000 استعلام منفصل للمورد، وإذا اُستدعِي مثل هذا السكربت ضمن خيوط Threads متعددة، فيُحتمَل أن يؤدي ذلك إلى توقف النظام بأكمله، لذا يجب معرفة متى تُجري شيفرتك البرمجية الاستعلامات وجمع القيم ثم تشغيل استعلام واحد لجلب جميع النتائج كلما أمكن ذلك. أحد الأمثلة على الأماكن الشائعة إلى حدٍ ما التي ترى فيها إجراء الاستعلام بطريقة غير فعالة (أي ضمن حلقة) هو عند نشر استمارة مع قائمة من القيم (المعرّفات مثلًا)، ثم ستمر الشيفرة البرمجية ضمن حلقة على المصفوفة وتجري استعلام SQL منفصل لكل معرّف لاسترداد بيانات السجل الكاملة لكل معرّف من هذه المعرّفات كما يلي: $data = []; foreach ($ids as $id) { $result = $connection->query("SELECT `x`, `y` FROM `values` WHERE `id` = " . $id); $data[] = $result->fetch_row(); } ولكن يمكن تحقيق الشيء نفسه بفعالية أكبر في استعلام SQL واحد كما يلي: $data = []; if (count($ids)) { $result = $connection->query("SELECT `x`, `y` FROM `values` WHERE `id` IN (" . implode(',', $ids)); while ($row = $result->fetch_row()) { $data[] = $row; } } لذلك يجب أن تعرف متى تجري شيفرتك البرمجية الاستعلامات سواءً بطريقة مباشرة أو غير مباشرة، ويجب أن تجمع القيم ثم تشغّل استعلامًا واحدًا لجلب جميع النتائج كلما أمكنك ذلك، ولكن يجب توخي الحذر لكي لا نحصل على خطأ PHP الشائع التالي. الخطأ 5: تزييف استخدام الذاكرة وعدم كفاءتها يكون جلب العديد من السجلات في وقت واحد أكثر كفاءة من تشغيل استعلام واحد لجلب كل صف، ولكن يمكن أن يؤدي هذا النهج إلى حالة "نفاد الذاكرة Out of Memory" في مكتبة libmysqlclient عند استخدام إضافة PHP التي هي mysql. ليكن لدينا مثلًا مربع اختبار مع موارد محدودة (512 ميجابايت من ذاكرة RAM) وقاعدة بيانات MySQL وواجهة سطر الأوامر php-cli، حيث سنهيّئ جدول قاعدة بيانات كما يلي: // الاتصال بقاعدة بيانات mysql $connection = new mysqli('localhost', 'username', 'password', 'database'); // إنشاء جدول مؤلّف من 400 عمود $query = 'CREATE TABLE `test`(`id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT'; for ($col = 0; $col < 400; $col++) { $query .= ", `col$col` CHAR(10) NOT NULL"; } $query .= ');'; $connection->query($query); // كتابة 2 مليون صف for ($row = 0; $row < 2000000; $row++) { $query = "INSERT INTO `test` VALUES ($row"; for ($col = 0; $col < 400; $col++) { $query .= ', ' . mt_rand(1000000000, 9999999999); } $query .= ')'; $connection->query($query); } لنتحقّق الآن من استخدام الموارد كما يلي: // الاتصال بقاعدة بيانات mysql $connection = new mysqli('localhost', 'username', 'password', 'database'); echo "Before: " . memory_get_peak_usage() . "\n"; $res = $connection->query('SELECT `x`,`y` FROM `test` LIMIT 1'); echo "Limit 1: " . memory_get_peak_usage() . "\n"; $res = $connection->query('SELECT `x`,`y` FROM `test` LIMIT 10000'); echo "Limit 10000: " . memory_get_peak_usage() . "\n"; ويكون الخرج كما يلي: Before: 224704 Limit 1: 224704 Limit 10000: 224704 لاحظ أن الاستعلامات مُدارة داخليًا بأمان فيما يتعلق بالموارد، ولكن يمكن التأكد من ذلك من خلال زيادة الحد الأقصى مرة أخرى، حيث سنضبطه على القيمة 100000، وسينتج ما يلي: PHP Warning: mysqli::query(): (HY000/2013): Lost connection to MySQL server during query in /root/test.php on line 11 المشكلة هنا هي الطريقة التي تعمل بها وحدة mysql الخاصة بلغة PHP، فهي مجرد وكيل لمكتبة libmysqlclient، والتي تذهب إلى الذاكرة مباشرةً عند تحديد جزء من البيانات. لا يدير مدير PHP الذاكرة، وبالتالي لن تعرض الدالة memory_get_peak_usage() أيّ زيادة في استخدام الموارد عندما نزيد الحد الأقصى في استعلامنا. يؤدي ذلك إلى ظهور مشاكل مثل المشكلة السابقة، إذ سنُخدَع من خلال الاعتقاد بأن إدارة ذاكرتنا جيدة، ولكنها سيئة فعليًا وسنواجه مثل هذه المشكلة. يمكنك تجنب هذا التزييف من خلال استخدام الوحدة mysqlnd بدلًا من ذلك، بالرغم من أنها لن تؤدي إلى تحسين استخدام الذاكرة، حيث تُصرَّف Compiled هذه الوحدة بوصفها إضافةً أصيلة Native للغة PHP وتستخدم مدير ذاكرة PHP، لذلك إذا أجرينا الاختبار السابق باستخدام الوحدة mysqlnd بدلًا من الوحدة mysql، فسنحصل على صورة أكثر واقعية لاستخدام ذاكرتنا. Before: 232048 Limit 1: 324952 Limit 10000: 32572912 تستخدم الوحدة mysql ضعف عدد الموارد التي تستخدمها الوحدة mysqlnd لتخزين البيانات وفقًا لتوثيق PHP، لذا يستخدم السكربت الأصلي الذي يستخدم وحدة mysql ذاكرةً أكبر مما هو موضّح هنا فعليًا (حوالي ضعف ذلك). يمكن تجنب مثل هذه المشاكل من خلال تحديد حجم استعلاماتك واستخدام حلقة ذات عدد صغير من التكرارات كما يلي: $totalNumberToFetch = 10000; $portionSize = 100; for ($i = 0; $i <= ceil($totalNumberToFetch / $portionSize); $i++) { $limitFrom = $portionSize * $i; $res = $connection->query( "SELECT `x`,`y` FROM `test` LIMIT $limitFrom, $portionSize"); } إذا أمعنا النظر في هذا الخطأ والخطأ رقم 4، فإننا سندرك أن هناك توازنًا صحيًا تحتاج شيفرتك البرمجية إلى تحقيقه بطريقة مثالية، حيث يجب إما أن تكون استعلاماتك صغيرة ومتكررة جدًا من ناحية، أو أن يكون كل استعلام فردي كبيرًا جدًا من ناحية أخرى، لذا يجب إيجاد توازن بينهما، إذ يمكن أن يسبّب استخدام أيٍّ منهما إلى الحد الأقصى مشكلات مع شيفرة PHP البرمجية التي لن تعمل بطريقة صحيحة. الخطأ 6: تجاهل مشكلات الترميز Unicode/UTF-8 تُعَد هذه المشكلة خاصة بلغة PHP بحد ذاتها أكثر من كونها مشكلة قد تظهر أثناء تنقيح أخطاء شيفرة PHP، ولكن هذه المشكلة لم تُعالَج بطريقة كافية، إذ كان من المقرر جعل نواة PHP 6 متوافقةً مع الترميز الموحّد Unicode، وجرى تعليق ذلك عند تعليق تطوير PHP 6 في عام 2010، ولكن ذلك لا يعفي المطور بأيّ حال من الأحوال من تقديم ترميز UTF-8 بطريقة صحيحة وتجنب الافتراض الخاطئ بأن جميع السلاسل النصية ستكون "نصًا عاديًا قديمًا يستخدم معيار ASCII". تشتهر الشيفرة البرمجية التي تفشل في معالجة السلاسل النصية التي ليست ASCII بإدخال أخطاء هايزنبغ Heisenbug المعقدة في شيفرتك البرمجية، إذ قد تسبّب حتى استدعاءات strlen($_POST['name']) البسيطة مشكلات إذا حاول شخص يحمل اسم عائلة مثل "Schrödinger" التسجيل في نظامك. إليك فيما يلي قائمة صغيرة لتجنب مثل هذه المشكلات في شيفرتك البرمجية: إذا كنت لا تعرف الكثير عن ترميز Unicode و UTF-8، فيجب أن تتعلّم الأساسيات على الأقل. تأكد من استخدام دوال mb_* دائمًا بدلًا من دوال السلاسل النصية القديمة، وتأكد من تضمين إضافة "تعدد البايتات multibyte" في إصدار PHP الخاص بك. تأكد من ضبط قاعدة البيانات والجداول الخاصة بك لاستخدام ترميز Unicode، إذ لا تزال العديد من إصدارات MySQL تستخدم معيار latin1 افتراضيًا. تذكّر أن الدالة json_encode() تحوّل الرموز التي ليست رموز ASCII، حيث تحوّل السلسلة النصية "Schrödinger" إلى "Schr\u00f6dinger" مثلًا، ولكن التابع serialize() لا يفعل ذلك. تأكّد من أن ملفات شيفرة PHP البرمجية الخاصة بك مشفَّرة أيضًا باستخدام ترميز UTF-8 لتجنب التعارض عند ضم السلاسل النصية مع ثوابت السلاسل النصية المكتوبة أو المضبوطة. اطّلع على مقال معالجة الملفات والبيانات المرمزة بترميز UTF-8 في PHP لمزيدٍ من المعلومات. الخطأ 7: افتراض أن المصفوفة $_POST ستحتوي على بيانات POST الخاصة بك دائمًا لن تحتوي المصفوفة $_POST على بيانات POST الخاصة بك دائمًا على عكس ما يدل عليه اسمها، إذ يمكن أن تكون فارغة. لنفترض مثلًا أننا أنشأنا طلب خادم باستخدام استدعاء التابع jQuery.ajax() كما يلي: // js $.ajax({ url: 'http://my.site/some/path', method: 'post', data: JSON.stringify({a: 'a', b: 'b'}), contentType: 'application/json' }); لاحظ نوع المحتوى contentType: 'application/json' هنا، حيث نرسل البيانات بتنسيق JSON، وهو أمر شائع جدًا لواجهات برمجة التطبيقات، وهو الإعداد الافتراضي للنشر في خدمة AngularJS التي هي $http مثلًا. نفرّغ معلومات محتوى المصفوفة $_POST من طرف الخادم في مثالنا كما يلي: // php var_dump($_POST); والمفاجأة أن النتيجة ستكون كما يلي: array(0) { } لم تظهر سلسلة JSON النصية الخاصة بنا {a: 'a', b: 'b'}، حيث تحلّل لغة PHP حِمل طلب POST تلقائيًا عندما يكون نوع المحتوى application/x-www-form-urlencoded أو multipart/form-data فقط، إذ كان هذان النوعان من المحتوى هما النوعان الوحيدان المُستخدَمان منذ سنوات عند تنفيذ المصفوفة $_POST الخاصة بلغة PHP، لذا لا تحمّل لغة PHP حِمل طلب POST تلقائيًا مع أيّ نوع محتوى آخر حتى الأنواع التي تحظى بشعبية كبيرة اليوم مثل application/json. تُعَد المصفوفة $_POST ذات نطاق عام عالي Superglobal، لذا إذا عدّلناها مرة واحدة (ويُفضَّل أن يكون ذلك في وقت مبكر من السكربت)، فستكون القيمة المُعدَّلة (بما في ذلك حِمل طلب POST) قابلةً للإشارة إليها من شيفرتنا البرمجية. يُعَد ذلك أمرًا مهمًا، لأن أطر عمل PHP وجميع السكربتات المخصَّصة تقريبًا تستخدم المصفوفة $_POST استخدامًا شائعًا لاستخراج بيانات الطلب وتحويلها. نحتاج إلى تحليل محتويات الطلب يدويًا (أي فك تشفير بيانات JSON) وتعديل المتغير $_POST عند معالجة حِمل طلب POST مع نوع المحتوى application/json مثلًا كما يلي: // php $_POST = json_decode(file_get_contents('php://input'), true); إذا فرّغنا معلومات محتوى المصفوفة $_POST بعد ذلك، فسنرى أنها تتضمّن حِمل طلب POST الصحيح كما في المثال التالي: array(2) { ["a"]=> string(1) "a" ["b"]=> string(1) "b" } الخطأ الشائع 8: الاعتقاد بأن لغة PHP تدعم نوع بيانات المحارف Character اطّلع على الشيفرة البرمجية التالية وحاول تخمين ما سينتج: for ($c = 'a'; $c <= 'z'; $c++) { echo $c . "\n"; } إذا أجبت أنها ستطبع المحارف من 'a' إلى 'z'، فقد تتفاجأ عندما تعرف أنك مخطئ، حيث أنها ستطبع المحارف من 'a' إلى 'z'، ولكنها ستطبع أيضًا 'aa' إلى 'yz'، إذ لا يوجد نوع البيانات char في لغة PHP، بينما يوجد نوع بيانات السلاسل النصية string فقط، وبالتالي سينتج عن زيادة السلسلة النصية z بمقدار واحد في لغة PHP السلسلة النصية aa: php> $c = 'z'; echo ++$c . "\n"; aa ولكن تُعَد السلسلة النصية aa أصغر من z من معجميًا: php> var_export((boolean)('aa' < 'z')) . "\n"; true لذلك تطبع الشيفرة البرمجية الحروف من a إلى z، ولكنها تطبع أيضًا بعد ذلك من aa إلى yz، وتتوقف عندما تصل إلى za، وهي القيمة الأولى الأكبر من z التي تصادفها: php> var_export((boolean)('za' < 'z')) . "\n"; false لذا استخدم الطريقة التالية للمرور ضمن حلقة على القيم من 'a' إلى 'z' في لغة PHP بصورة صحيحة: for ($i = ord('a'); $i <= ord('z'); $i++) { echo chr($i) . "\n"; } أو استخدم الطريقة التالية: $letters = range('a', 'z'); for ($i = 0; $i < count($letters); $i++) { echo $letters[$i] . "\n"; } الخطأ 9: تجاهل قواعد ومعايير كتابة الشيفرة البرمجية لا يؤدي تجاهل قواعد كتابة الشيفرة البرمجية مباشرةً إلى الحاجة إلى تنقيح أخطاء شيفرة PHP، ولكنه لا يزال أحد أهم الأشياء التي يجب مناقشتها، إذ قد يؤدي تجاهل هذه المعايير إلى حدوث عدد كبير من المشكلات في المشروع مثل الحصول على شيفرة برمجية غير متناسقة في أحسن الأحوال لأن كل مطور ينجز عمله بطريقته الخاصة، أو الحصول على شيفرة PHP لا تعمل أو من الصعب -أو من المستحيل في بعض الأحيان- التنقل ضمنها، مما يصعّب تنقيح أخطائها وتحسينها وصيانتها في أسوأ الأحوال. يؤدي ذلك إلى تخفيض إنتاجية فريقك بما في ذلك الكثير من الجهد الضائع أو غير الضروري. توجد توصية لمعايير PHP أو PHP Standards Recommendation -أو PSR اختصارًا، والتي تتألف من المعايير الخمسة التالية: PSR-0: معيار التحميل التلقائي. PSR-1: معيار كتابة الشيفرة البرمجية الأساسي. PSR-2: دليل تنسيق كتابة الشيفرة البرمجية. PSR-3: واجهة المسجِّل. PSR-4: المحمِّل التلقائي. لقد أُنشِئت معايير PSR بناءً على مدخلات من المشرفين على المنصات الأشهر في السوق لتوفر إرشادات وممارسات موحدة لتنظيم كتابة الأكواد في PHP. وقد وُضعت هذه المعايير من قبل مجموعة من المطورين والمشرفين على أبرز المنصات وأطر العمل الشهيرة مثل Zend و Drupal و Symfony و Joomla وغيرها في هذه المعايير، وتتبع هذه المنصات تلك المعايير، ويشارك الآن إطار عمل PEAR الذي حاول أن يكون معيارًا لسنوات قبل ذلك في وضع معايير PSR. لا يهم تقريبًا ما هو معيار كتابة الشيفرة البرمجية الخاص بك طالما أنك توافق على المعيار وتلتزم به، ولكن يُعَد اتباع معايير PSR فكرة جيدة إن لم يكن لديك سبب مقنع في مشروعك يخالفها، إذ أصبحت هناك العديد من الفرق والمشاريع التي تتوافق مع معايير PSR التي يُعِدّها أغلب مطوري PHP بوصفها المعيار الحالي، لذا سيساعد استخدامها في ضمان معرفة المطورين الجدد بمعيار كتابة الشيفرة البرمجية الخاص بك وسيشعرون بالارتياح عند انضمامهم إلى فريقك. الخطأ 10: استخدام الدالة empty() استخدامًا خاطئًا يفضِّل بعض مطوري PHP استخدام الدالة empty() لإجراء عمليات فحص منطقية لكل شيء تقريبًا، ولكن توجد حالات يمكن أن يؤدي فيها ذلك إلى الارتباك. أولًا، إذا عُدنا إلى المصفوفات ونُسخ كائن المصفوفة ArrayObject (الذي يحاكي المصفوفات)، فمن السهل افتراض أن المصفوفات ونسخ الكائن ArrayObject ستتصرف بطريقة مماثلة بسبب تشابههما، ولكنه افتراض خطير كما هو موضّح فيما يلي في الإصدار PHP 5.0: // PHP 5.0 أو بعد: $array = []; var_dump(empty($array)); // خرجها bool(true) $array = new ArrayObject(); var_dump(empty($array)); // خرجها bool(false) // لماذا لا ينتج كلاهما الخرج نفسه؟ وستكون النتائج مختلفة في الإصدارات التي قبل الإصدار PHP 5.0: // الإصدارات التي قبل الإصدار PHP 5.0: $array = []; var_dump(empty($array)); // خرجها bool(false) $array = new ArrayObject(); var_dump(empty($array)); // خرجها bool(false) تحظى هذه الطريقة بشعبية كبيرة لسوء الحظ، فمثلًا هذه هي الطريقة التي يعيد بها كائن Zend\Db\TableGateway في إطار عمل Zend Framework 2 البيانات عند استدعاء الدالة current() مع نتيجة الدالة TableGateway::select()، ويمكن للمطور أن يصبح بسهولة ضحيةً لهذا الخطأ مع مثل هذه البيانات. يمكن تجنب هذه المشكلات من خلال التحقق من وجود بنى مصفوفات فارغة باستخدام الدالة count() كما يلي: // لاحظ أن ما يلي يعمل في جميع إصدارات PHP (سواء قبل أو بعد الإصدار 5.0): $array = []; var_dump(count($array)); // خرجها int(0) $array = new ArrayObject(); var_dump(count($array)); // خرجها int(0) تحوّل لغة PHP القيمة 0 إلى false، فيمكن أيضًا استخدام الدالة count() ضمن شروط تعليمة if للتحقق من المصفوفات الفارغة. تجدر الإشارة أيضًا إلى أن الدالة count() في PHP لها تعقيد ثابت Constant Complexity (أو O(1)) على المصفوفات، مما يوضّح أنه الاختيار الصحيح. يوجد مثال آخر لذلك عندما تمثّل الدالة empty() خطرًا من خلال دمجها مع دالة الأصناف السحرية __get(). لنعرّف مثلًا صنفين Class مع وجود الخاصية test في كليهما، حيث نعرّف أولًا الصنف Regular الذي يتضمن الخاصية العادية test كما يلي: class Regular { public $test = 'value'; } نعرّف بعد ذلك الصنف Magic الذي يستخدم التابع السحري __get() للوصول إلى الخاصية test الخاصة به كما يلي: class Magic { private $values = ['test' => 'value']; public function __get($key) { if (isset($this->values[$key])) { return $this->values[$key]; } } } لنرى الآن ما سيحدث عندما نحاول الوصول إلى الخاصية test لكل صنف كما يلي: $regular = new Regular(); var_dump($regular->test); // خرجها string(4) "value" $magic = new Magic(); var_dump($magic->test); // خرجها string(4) "value" يبدو كل شيء على ما يرام حتى الآن، ولكن لنرى الآن ما يحدث عندما نستدعي الدالة empty() مع كل منهما كما يلي: var_dump(empty($regular->test)); // خرجها bool(false) var_dump(empty($magic->test)); // خرجها bool(true) إذا اعتمدنا على الدالة empty()، فيمكن تضليلنا للاعتقاد بأن الخاصية test الخاصة بالصنف $magic فارغة، بينما هي مضبوطة على القيمة 'value'. لسوء الحظ، إذا استخدم الصنفُ التابع السحري __get() لاسترداد قيمة خاصيةٍ ما، فلا توجد طريقة مضمونة للتحقق مما إذا كانت قيمة الخاصية فارغة أم لا. يمكنك خارج نطاق الصنف التحقق فقط من إعادة القيمة null، وهذا لا يعني بالضرورة عدم ضبط المفتاح المقابل، لأنه كان من الممكن ضبطه على القيمة null. إذا حاولنا الإشارة إلى خاصية غير موجودة لنسخة من الصنف Regular، فستظهر ملاحظة مشابهة لما يلي: Notice: Undefined property: Regular::$nonExistantTest in /path/to/test.php on line 10 Call Stack: 0.0012 234704 1. {main}() /path/to/test.php:0 لاحظ أنه يجب استخدام التابع empty() بحذر لأنه قد يؤدي إلى نتائج مربكة ومضللة. الخلاصة يمكن أن تؤدي سهولة استخدام لغة PHP إلى جعل المطورين يشعرون بالراحة الزائدة في التعامل معها، مما قد يؤدي إلى تجاهل بعض الأخطاء الدقيقة التي تحتاج إلى تنقيح ومعالجة وعدم مراعاة بعض الفروق الدقيقة والخصوصيات في اللغة، ويمكن أن يؤدي ذلك إلى عدم عمل شيفرة PHP بنجاح وظهور إحدى المشكلات التي تعرضنا لها في هذا المقال. لقد تطورت لغة PHP تطورًا ملحوظًا على مدار تاريخها الطويل وشهدت تحسينات ومميزات عديدة، لذا يُعَد التعرف على تفاصيلها الدقيقة أمرًا جديرًا بالاهتمام، لأنها ستساعد على ضمان أن البرنامج الذي تنتجه أكثر قابلية للتوسع والقوة والصيانة. ترجمة -وبتصرُّف- للمقال Buggy PHP Code: The 10 Most Common Mistakes PHP Developers Make لصاحبه Ilya Sanosian. اقرأ أيضًا تعرف على لغة PHP تعلم لغة PHP اصطلاحات ومواضيع متفرقة مهمة لكل مبرمج PHP التعامل مع الأخطاء في PHP الأخطاء العشرة الأكثر شيوعًا في شيفرة بايثون Python البرمجية1 نقطة
-
1 نقطة
-
1 نقطة
-
مرحبًا بك في مقال إدخال البيانات وتعديلها وتحريرها، من سلسلة مقالاتنا حول كيفية استخدام برنامج مايكروسوفت إكسل. سنبدأ في هذا المقال بتطوير ورقة العمل حتى تظهر كما في الشكل 01 "مثال لورقة عمل إكسل مع مخطط مضمَّن"، المهارات التي سنشرحها في هذا المقال هي المستخدمةُ عادةً في المراحل الأولى من تطوير ورقة عملٍ واحدة أو أكثر في المصنف. مثال لورقة عمل إكسل مع مخطط مضمَّن. إدخال البيانات Entering Data سوف نبدأ بإنشاء المصنف الموجود في الشكل 001 عن طريق إدخال البيانات يدويًا في ورقة العمل، وفي الخطوات الآتية كيفية كتابة عناوين الأعمدة الموجودة في الصف الثاني من ورقة العمل: اختر الخلية A2 في ورقة العمل. اكتب كلمة "الشهر". اضغط على السهم المتجه نحو اليمين، ستُحفَظ بذلك الكلمة في الخلية A2، ثم حدِّد الخلية المجاورة لها من ناحية اليمين. اكتب كلمة "وحدة المبيعات" ثم اضغط على السهم المتجه نحو اليمين. كرر هذه العملية لكتابة باقي المعلومات ("متوسط السعر" و"السعر بالدولار"). يوضح الشكل كيف ستبدو ورقة عملك بعد إدخال عناوين الأعمدة في الصف 2، وهنا قد تلاحظ اختفاء بعض الكلمات، لأن العمودَ أصغر من أن يناسب الكلمات التي أدخلتها. إدخال عناوين الأعمدة في ورقة العمل. التأكد من صحة العمل يُعَد إدخال عناوين الأعمدة التي تصف البيانات والمعلومات بدقة أمرًا حساسًا وخطرًا عند إدراجها في كل عمود في ورقة العمل. وفي بيئة عملك الرسمية، من المرجّح أنك ستشارك مصنفات إكسل مع زملائك في العمل، لذا فاختيارك الجيد لعناوين الأعمدة سيقلل من احتمالات حدوث سوء فهم للبيانات المُدخلة في ورقة العمل، والتي قد تؤدي إلى أخطاءٍ فادحة ومكلفة حسب مجال عملك. اختر الخلية B3. اكتب الرقم "2670" ثم اضغط على زر الإدخال Enter، وسيفعّل هذا الخلية B4، إذ أن استخدام زر الإدخال يُعَد طريقةً فعالةً لإدخال البيانات عموديًا باتجاه أسفل العمود. كرر الخطوة (7) لإدخال الأرقام التالية في الخلية B4 حتى الخلية B14: 2160, 515, 590, 1030, 2875, 2700, 900, 775, 1180, 1800, 3560 لماذا نتجنب استخدام التنسيق عند إدخال أرقام في ورقة العمل؟ يُفضل تجنب كتابة رموز التنسيق عند كتابة الأرقام في ورقة العمل (مثل: رمز الدولار $ والفواصل من النوع ' وغيرهم). وبالرغم من أن إكسل يسمح لك بإدخال هذه الرموز، إلا أنها تُبطئ من عملية إدخال البيانات، لذلك من الأفضل أن تستخدم ميزات التنسيق في إكسل لإضافة الرموز إلى الأرقام بعد كتابتها في ورقة العمل. اختر الخلية C3. اكتب الرقم 9.99 واضغط زر الإدخال. كرر الخطوة (10) لإدخال الأرقام التالية في الخلية C4 حتى الخلية C14: 12.49, 14.99, 17.49, 14.99, 12.49, 9.99, 19.99, 19.99, 19.99, 17.49, 14.99 اختر الخلية D3. اكتب الرقم 26685 واضغط زر الإدخال. كرر الخطوة (13) لإدخال الأرقام التالية في الخلية D4 حتى الخلية D14: 26937, 7701, 10269, 15405, 35916, 26937, 17958, 15708, 23562, 31416, 53370 حتى تتأكد من سلامة العمل، من المهم جدًا أن تراجع وتدقق ورقة عملك بحرص، خاصةً عند إدخال بياناتٍ رقمية، إذ أن تبديل الأرقام عند إدخال البيانات يدويًا يُعَد خطأً شائعًا. فعلى سبيل المثال: قد تبدل الرقم 536 بالرقم 563، وخطأٌ كهذا قد يهدد طبعًا سلامة مُصنفك. يوضِّح الشكل الآتي كيف يجب أن يكون شكل ورقة العمل بعد إدخال البيانات. تحقق من أرقامك بعناية للتأكد من أنها قد أُدخلت بدقةٍ في ورقة العمل. إدخال مُكتمل للبيانات في الأعمدة B و C و D. تعديل البيانات Editing Data بإمكانك تغيير البيانات المُدخلة في الخلايا عبر الضغط ضغطةً مزدوجةً على موقع الخلية، أو عن طريق استخدام شريط الصيغ؛ فكما لاحظت أن البيانات التي تُدخلها في الخلية تظهر أيضًا في شريط الصيغ، فهذا الشريط يُستخدم في إدخال البيانات بالإضافة لتعديل البيانات التي قد أُدخلت فعلًا. ستوضح لك الخطوات التالية كيفية إدخال البيانات وتعديل البيانات التي أُدخلت مسبقًا: اختر الخلية A15 في ورقة العمل "ورقة 1". اكتب الكلمة "الإجـ" واضغط على زر الإدخال. اضغط على الخلية A15. حرك مؤشر الفأرة إلى شريط الصيغ، ستلاحظ تغير شكل المؤشر، حرك المؤشر إلى نهاية الكلمة "الإجـ" واضغط يسارًا. اكتب الحروف "مالي" لإكمال الكلمة "الإجمالي". اضغط فوق علامة الاختيار الموجودة على يسار شريط الصيغ، هذا سيغير شكل الخلية. استخدام شريط الصيغ وتعديل وإدخال البيانات. اضغط مرتين على الخلية A15. أضف مسافةً بعد كلمة "إجمالي" واكتب كلمة "المبيعات". اضغط على زر الإدخال. وفي حال كانت هناك أوامر تريد إعطاءها دون استخدام الفأرة، فيمكنك مثلًا تعديل البيانات في الخلية عبر اختيار الخلية المراد تعديلها والضغط زر F2 في لوحة المفاتيح. الملء التلقائي Auto Fill هي خاصية في برنامج إكسل تمكّنك من إكمال البيانات المُدخلة سواءً كان التسلسل كميًا أو نوعيًا، وبإمكانك استخدامها أيضًا في نسخ ولصق المعلومات في ورقة العمل. تكون هذه الميزة ممتازةً في حال إدخال البيانات يدويًا إلى ورقة العمل، ولها استخدامات عديدة، ولكن تظهر فائدتها العظمى عند استخدامها في إدخال البيانات ذات التسلسل المحدد، مثل الأرقام (2.4.6.8…) إلى آخره، أو إدخال البيانات غير الرقمية مثل أيام الأسبوع أو أشهر السنة. توضح الخطوات التالية كيف يمكن استخدام هذه الخاصية لإدخال أشهر السنة في العمود A: اختر الخلية A3 في ورقة العمل. اكتب الكلمة "يناير" واضغط على زر الإدخال. اختر الخلية A3 مرةً أخرى. حرك مؤشر الفأرة إلى الجانب السفلي الأيمن من الخلية A3. سيظهر لك مربعٌ صغير بأسفل الخلية، يسمى هذا المربع بـ "مقبض التعبئة"، عندما يقترب مؤشر الفأرة من مقبض التعبئة تتحول علامة الزائد البيضاء إلى علامة زائد سوداء. مقبض التعبئة. 5.اضغط على الفأرة واسحب مقبض التعبئة حتى الخلية A14، وستلاحظ أن مربع مقبض التعبئة يشير إلى الشهر الذي سيوضع في كل خلية. بعدها حرر زر الفأرة الأيسر عندما يظهر في مربع التعبئة كلمة "ديسمبر". الملء التلقائي. بمجرد تحريرك للفأرة، ستظهر جميع شهور السنة بالترتيب في نطاق الخلايا "A3:A14". سيظهر أيضًا زر خيارات الملء التلقائي؛ وبالضغط على هذا الزر، ستظهر لك عدة خيارات لتساعدك في إدراج البيانات في مجموعة من الخلايا. خيارات زر الملء التلقائي. اضغط بالفأرة على زر "خيارات الملء التلقائي". اختر "نسخ خلايا"، سيؤدي هذا إلى تغيير الأشهر في نطاق الخلايا "A4:A14" إلى "يناير". اضغط مرةً أخرى على زر "خيارات الملء التلقائي". اضغط على خيار تعبئة الأشهر لإعادة شهور السنة إلى نطاق الخلايا "A4:A14". سيؤدي خيار "سلسلة التعبئة" إلى نفس النتيجة. حذف البيانات Delete data وإلغاء الخطوة الأخيرة Undo Command هنالك العديد من الطرق التي بإمكانك استخدامها لحذف بياناتٍ محددة من ورقة العمل، سنشرح بعضها بالتفصيل في هذا المقال. بإمكانك استخدام "إلغاء الخطوة الخيرة" دومًا لتساعدك في استعادة بياناتٍ حُذفت بالخطأ من ورقة العمل. وستوضح لك الخطوات التالية كيفية حذف خلية أو نطاق من الخلايا: اختر الخلية C2. اضغط على زر الحذف Delete في لوحة المفاتيح، ستُحذف بذلك البيانات التي تحتويها الخلية. حدد نطاق الخلايا "C3:C14" عن طريق الإشارة إلى الخلية C3 ثم سحب الفأرة حتى الخلية C14. أشر بالفأرة إلى مقبض التعبئة وستلاحظ أن علامة الزائد البيضاء تحولت إلى اللون الأسود. اضغط على علامة الزائد السوداء، واسحب السهم مجددًا إلى الخلية C3 ثم حرر الفأرة، ستُحذف بذلك البيانات الموجودة في نطاق هذه الخلايا. استخدام الملء التلقائي وحذف البيانات. اضغط على خيار "إلغاء الخطوة الأخيرة" الموجود في شريط الوصول السريع للأدوات لتستعيد البيانات المحذوفة من نطاق الخلايا "C3:C14". اضغط على خيار "إلغاء الخطوة الأخيرة" مجددًا لتستعيد البيانات المحذوفة من الخلية C2. أوامر يمكن إعطاؤها دون استخدام الفأرة من أمثلة هذه الأوامر نجد خيار "إلغاء الخطوة الأخيرة"، والذي من أجل الوصول إليه، اضغط مع الاستمرار على زر Ctrl ثم اضغط على الحرف Z. حدد نطاق الخلايا "C2:C14". اضغط على زر الإزالة أو المسح Clear الموجود في علامة التبويب الرئيسية Home في شريط إكسل. (انظر شكل "القائمة المنسدلة لأوامر المسح") ستظهر قائمة تحتوي على خياراتٍ عديدة للمسح والحذف. لاحظ أن لديك أيضًا خياراتٌ لمسح التنسيقات الموجودة في الخلية فقط أو الارتباطات التشعبية. اضغط على خيار "مسح الكل" لحذف البيانات في نطاق الخلايا. اضغط على خيار "إلغاء الخطوة الأخيرة" لاستعادة البيانات المحذوفة. قائمة المسح. ضبط قياسات الأعمدة والصفوف هنالك بعض البيانات المُدخلة التي تبدو مقطوعةً أو غير كاملة، وهذا لأن العمود ضيق جدًا مقارنةً مع حجم الكلمة. بإمكانك تعديل قياسات الأعمدة والصفوف في ورقة العمل حتى يتناسب حجمها مع البيانات المُدخلة في الخلية، وستشرح الخطوات التالية كيفية ضبط عرض الأعمدة وارتفاع الصفوف في ورقة العمل: حرك مؤشر السهم إلى النقطة بين العمود A والعمود B في ورقة العمل "ورقة 1" كما هو مُوضح في الشكل الموالي. يمكنك الآن رؤية علامة الزائد البيضاء تتحول إلى سهمٍ مزدوج. اسحب العمود إلى اليمين حتى تتمكن من رؤية الكلمة كاملةً، وستلاحظ أيضًا مربع عرض العمود (المربع الذي يظهر عند تعديل عرض العمود باستخدام طريقة الضغط والسحب) الذي يُظهر عدد الحروف التى تتسع في العمود باستخدام نوع الخط "Noto Sans Arabic". ضبط عرض الأعمدة. إن كنت بحاجة إلى تحديد عرضٍ معين لعمود أو أكثر، فقد تجد أن استخدام طريقة الضغط والسحب غير فعالة. الخطوات من 4 إلى 7 تشرح طريقةً أخرى لضبط عرض العمود بتحديد عدد الحروف أو المقاطع. اختر أي خلية في العمود A، وبإمكانك اختيار أكثر من خلية إن كنت ستحدد نفس عدد الحروف لكلّ الخلايا. اضغط على زر التنسيق في علامة التبويب الرئيسية. (انظر الشكل "مجموعة الخلايا في علامة التبويب الرئيسية") اضغط على خيار "عرض العمود" من القائمة المنسدلة (انظر الشكل "قائمة التنسيق")، وستفتح نافذة ضبط عرض العمود. اكتب الرقم "21" واضغط على زر التأكيد Ok. سيُضبط العمود A على العرض المناسب لعدد الحروف هذا. (انظر الشكل "نافذة ضبط عرض العمود") مجموعة الخلايا في علامة التبويب الرئيسية. قائمة التنسيق. نافذة ضبط عرض العمود. أوامر يمكن إعطاؤها دون استخدام الفأرة تستطيع هنا أن تعطي أوامر دون الحاجة لاستخدام الفأرة، كما يلي. عرض العمود لتحديد عرض العمود دون استخدام الفأرة، اتبع الخطوات التالية: اضغط على زر Alt في لوحة المفاتيح، ثم اضغط على أزرار H و O و W في نفس الوقت. وفي ملفنا: اختر الخلية A15. اضغط على زر "التنسيق" في علامة التبويب الرئيسية. (انظر الشكل "مجموعة الخلايا في علامة التبويب الرئيسية") اضغط على خيار "طول الصف" من القائمة المنسدلة (انظر الشكل "قائمة التنسيق"). ستفتح نافذة ضبط طول الصف. اكتب الرقم "24" واضغط على زر التأكيد Ok. سينضبط الصف 15 ليكون طوله 24 نقطة. تستخدم وحدة القياس pointMetric عند قياس ارتفاع الصف؛ وتكافئ 4.5 سنتيمترًا تقريبًا. وللتأكيد، لقد أُجريَ هذا التعديل في ارتفاع الصف لإنشاء مسافة بين مجاميع ورقة العمل هذه وبقية البيانات. طول الصف لتحديد طول الصف دون استخدام الفأرة، اتبع الآتي: اضغط على زر Alt في لوحة المفاتيح، ثم اضغط على أزرار H و O و W في نفس الوقت. انظر الشكل "Excel Objective 1.0 بالعمود A والصف رقم 15 مُعدلان" حيث يظهر شكل ورقة العمل بعد التعديل. Excel Objective 1.0 بالعمود A والصف رقم 15 مُعدلان. مراجعة للمهارة: ضبط الأعمدة والصفوف لضبط قياسات الأعمدة والصفوف يدويًا، اتبع الخطوات التالية: اختر على الأقل خليةً واحدةً في الصف أو العمود المراد تعديله. اضغط على علامة التبويب الرئيسية في شريط إكسل. اضغط على زر التنسيق في مجموعة الخلايا Cells group. اضغط على طول الصف أو عرض العمود من القائمة المنسدلة. أدخلْ طول الصف بالنقاط أو عرض العمود بالحروف في المربع. اضغط على زر الموافقة Ok. إخفاء الأعمدة والصفوف Hide & Unhide بالإضافة إلى ضبط أبعاد الأعمدة والصفوف، يمكنك أيضًا إخفاؤها من ورقة العمل. يفيد هذا الأسلوب في تحسين المظهر المرئي لورقة العمل التي تحتوي على بياناتٍ ليست ضروريةَ العرض. ستُعرض هذه الميزات باستخدام مصنف Excel Objective 1.0، ولكن لا حاجة لإخفاء أعمدة أو صفوف من ورقة العمل هذه، بالتالي سيكون استخدام هذه المهارة لغرض العرض التوضيحي فقط. لإخفاء عمودٍ أو صف من ورقة عمل، اتبع الخطوات التالية: اختر الخلية C1 في ورقة العمل "ورقة 1". اضغط على زر التنسيق في علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "الإخفاء والإظهار Hide & Unhide" الموجود في القائمة المنسدلة، ستُفتح قائمة فرعية من الخيارات. (انظر الشكل "قائمة التنسيق"). اختر "اخفاء الأعمدة " من القائمة الفرعية، سيختفي العمود C. قائمة الإظهار والإخفاء الفرعية. أوامر يمكن إعطاؤها دون استخدام الفأرة من بين هذه الأوامر: إخفاء الأعمدة اضغط مع الاستمرار على زر Ctrl ثم اضغط على الرقم 0. يُظهر الشكل التالي المصنفَ الذي أُخفيَ منه العمود C في ورقة العمل "ورقة 1"، بإمكانك معرفة أن هناك عمود مخفي بسبب غياب الحرف C. عمود مخفي. ولإلغاء إخفاء هذا العمود، اتبع الخطوات التالية: حدِّد نطاق الخلايا "B1:D1" عن طريق اختيار الخلية B1 والسحب حتى الخلية D1. اضغط على زر التنسيق في علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "الإخفاء والإظهار" الموجود في القائمة المنسدلة، ستظهر قائمةٌ فرعية من الخيارات. (انظر الشكل "قائمة التنسيق"). اختر إلغاء إخفاء الأعمدة من القائمة الفرعية، سيعود العمود C. إلغاء إخفاء الأعمدة حتى تُظِهر عموداً مُختفيًا، عليك أن تحدِّد الخلايا الموجودة على جانبَي الخلية المخفية، اضغط مع الاستمرار على زر Ctrl، ثم اضغط على الزر Shift، وزر القوس المنغلق ()) على لوحة المفاتيح. ستوضح الخطوات التالية كيفية إخفاء الصفوف، وهي شبيهةٌ بإخفاء الأعمدة: اختر الخلية A1 في ورقة العمل "ورقة 1". اضغط على زر التنسيق من علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "الإخفاء والإظهار" الموجود في القائمة المنسدلة، ستظهر قائمة فرعية من الخيارات. (انظر الشكل "قائمة التنسيق"). اختر "إخفاء الصفوف" من القائمة الفرعية، سيختفي الصف رقم 3. إخفاء الصفوف يمكنك الضغط مع الاستمرار على زر Ctrl ثم اضغط على الرقم 9. ولإلغاء إخفاء الصف، اتبع الخطوات التالية: حدِّد نطاق الخلايا "A2:A4" عن طريق اختيار الخلية A2 والسحب حتى الخلية A4. اضغط على زر التنسيق في علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "الإخفاء والإظهار" الموجود في القائمة المنسدلة، ستظهر قائمة فرعية من الخيارات. (انظر الشكل "قائمة التنسيق"). اختر إلغاء إخفاء الصفوف من القائمة الفرعية، وسيعود الصف 3 . (انظر الشكل "قائمة الإظهار والإخفاء الفرعية"). إلغاء إخفاء الصفوف سيكون بإمكانك إلغاء إخفاء الصفوف دون استخدام الفأرة من خلال تحديد الخلايا الموجودة في أعلى وأسفل الخلية المخفيّة، ثم الضغط على زر Ctrl؛ مع الضغط على الزر Shift وزر القوس المفتوح (() من لوحة المفاتيح. تفقُّد صحة العمل للتأكد من سلامة العمل المنجز حتى اللحظة عليك بالآتي: الأعمدة والصفوف المخفية يشيع في معظم الوظائف أن يستخدم الموظفون مصنفات إكسل مصممةً من قبل زميل في العمل. لذلك تحقق دائمًا من الصفوف والأعمدة المخفية قبل استخدامك مصنفًا من تصميم شخصٍ آخر. بإمكانك معرفة ما إذا كان الصف أو العمود مخفيًا بسهولة، من خلال ملاحظة ما إذا كان هناك رقم صف أو حرف عمود مفقودَين. مراجعة للمهارة: إخفاء الأعمدة والصفوف بإمكانك إخفاء الأعمدة والصفوف عبر اتباع الخطوات التالية: اختر على الأقل خليةً واحدةً في الصف أو العمود المُراد تعديله. اضغط على علامة التبويب الرئيسية في شريط إكسل. اضغط على زر التنسيق في مجموعة الخلايا Cells group. اضغط على على خيار "الإخفاء والإظهار". اختر إخفاء الصف أو إخفاء العمود. مراجعة للمهارة: إلغاء إخفاء الأعمدة والصفوف أما إلغاء إخفاء الأعمدة والصفوف فيتم عبر الخطوات التالية: حدِّد الخلايا الموجودة على جانبَي العمود المخفي أو الخلايا الموجودة في أعلى وأسفل الصف المخفي. اضغط على علامة التبويب الرئيسية في شريط إكسل. اضغط على زر التنسيق في مجموعة الخلايا Cells group. اضغط على على خيار "الإخفاء والإظهار". اختر إلغاء إخفاء الصف أو إلغاء إخفاء العمود. إدراج أعمدة وصفوف Inserting يُعَد استخدام مصنفات إكسل المُصممة من قبل الآخرين طريقةً فعّالةً لإتمام العمل بسرعة، لأنها تلغي الحاجة إلى إنشاء أوراقِ عملٍ لاحتواء البيانات من نقطة الصفر. لكن على الرغم من ذلك، قد تحتاج لإضافة أعمدة أو صفوف إضافية لإكمال هدفك. في هذه الحالة يمكنك إدراج أعمدة أو صفوف فارغة في ورقة العمل. توضح الخطوات التالية كيفية القيام بذلك: اختر الخلية C1 في ورقة العمل. اضغط على السهم في زر الإدراج الموجود في علامة التبويب الرئيسية في شريط إكسل. انظر الشكل "زر التعبئة" زر التعبئة. اضغط على خيار "إدراج أعمدة في ورقة العمل" من القائمة المنسدلة (انظر الشكل "قائمة الإدراج"). سيُدرج عمودٌ فارغ إلى يسار العمود C، وستنتقل البيانات التي كانت موجودةً سابقًا في العمود "C" الآن إلى العمود "D". يمكنك ملاحظة أنه دائمًا ما تُدرج الأعمدة إلى يسار الخلية المحددة. أوامر يمكن إعطاؤها دون استخدام الفأرة تتضمن هذه الأوامر ما يلي: إدراج الأعمدة بإمكانك اتباع الخطوات التالية لإدراج الأعمدة دون الاعتماد على الفأرة: اضغط على زر Alt في لوحة المفاتيح، ثم اضغط على أزرار H و I و C في نفس الوقت. سيُدرج عمود بجوار الخلية المحددة. قائمة التعبئة. اختر الخلية A3 في ورقة العمل. اضغط على الزر "تعبئة" في علامة التبويب الرئيسية على شريط إكسل (انظر الشكل "زر التعبئة"). اضغط على الخيار "تعبئة سريعة" من القائمة المنسدلة (انظر الشكل "قائمة التعبئة")، وسيُدرج صف فارغ أعلى الصف 3، وستنتقل البيانات التي كانت موجودة سابقًا في الصف "3" الآن إلى الصف "4". يمكنك ملاحظة أنه دائمًا ما تُدرج الصفوف أعلى الخلية المحددة. إدراج الصفوف بإمكانك اتباع الخطوات التالية لإدراج الصفوف دون الاعتماد على الفأرة: اضغط على زر Alt في لوحة المفاتيح، ثم اضغط على أزرار H و I و R في نفس الوقت. وسيُدرج صف بجوار الخلية المحددة. مراجعة للمهارة: إدراج الأعمدة والصفوف ستوضح لك الخطوات التالية كيفية إدراج الأعمدة والصفوف: حدِّد الخلايا الموجودة على الجانب الأيمن للعمود أو الخلايا الموجودة أسفل الصف. اضغط على علامة التبويب الرئيسية في شريط إكسل. اضغط على زر الإدراج في مجموعة الخلايا Cells group. اضغط على خيار "الإخفاء والإظهار". اختر إلغاء إدراج الصف أو العمود. بإمكانك هنا أن تنقل البيانات من موقع إلى آخر في ورقة العمل بمجرد أن تدخل البيانات في الورقة. ستوضح الخطوات التالية كيفية نقل البيانات إلى مواقع مختلفة في ورقة العمل: حدِّد نطاق الخلايا "D2:D15" عن طريق اختيار الخلية D2 والسحب حتى الخلية D15. حرك مؤشر السهم إلى الطرف الأيسر من الخلية D2، ستلاحظ تحوّل علامة الزائد البيضاء إلى سهمٍ مزدوج. (انظر الشكل "نقل البيانات") يؤكد هذا التحوّل إمكانية نقل الخلايا إلى موقع مختلف. نقل البيانات. اسحب المؤشر إلى الخلية C2. حرر المؤشر، ستظهر البيانات الآن في العمود C. اضغط على زر "إلغاء الخطوة الأخيرة" الموجود في شريط الوصول السريع للأدوات لإعادة البيانات إلى العمود D. تفقد صحة العمل قبل نقل البيانات داخل ورقة العمل، تأكد من تحديد جميع البيانات المُنتمية إلى السلسلة التي تنقلها. على سبيل المثال، إذا كنت تنقل عمود بيانات، تأكد من تضمين عنوان العمود، فتأكد أيضًا من تحديد جميع القيم والأرقام في العمود قبل نقلها. حذف الأعمدة والصفوف قد تحتاج إلى حذف أعمدة أو صفوف بيانات كاملة من ورقة العمل. يمكن أن تكون أعمدةً أو صفوفًا فارغةً في ورقة العمل، أو أعمدةً وصفوفًا تحتوي على بيانات. لقد وضّحنا طرق حذف محتويات الخلية مسبقًا، ويمكن استخدامها نفسها لحذف البيانات غير المرغوب بها؛ أما إذا كنت لا تريد صفًا أو عمودًا فارغًا في المصنف، فبإمكانك حذفه باستخدام الخطوات التالية: حدِّد الخلية A3. اضغط على السهم المتجه نحو الأسفل على الزر "حذف" في مجموعة الخلايا في علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "حذف صفوف الورقة" من القائمة المنسدلة (انظر الشكل "قائمة الحذف"). يؤدي هذا إلى إزالة الصف 3 وإزاحة جميع البيانات (الموجودة أسفل الصف 2) إلى الصف الواقع فوقه. أوامر يمكن إعطاؤها دون استخدام الفأرة من بين هذه الأوامر: حذف الصفوف من الممكن حذف الصفوف دون استخدام الفأرة، وذلك بالضغط على زر Alt في لوحة المفاتيح، ثم الضغط على أزرار H و D و R في نفس الوقت. سيُحذف الصف الذي يحوي الخلية المحددة. قائمة الحذف. حددِّ الخلية C1. اضغط على السهم المتجه للأسفل على الزر "حذف" في مجموعة الخلايا في علامة التبويب الرئيسية في شريط إكسل. اضغط على خيار "حذف أعمدة من الورقة" من القائمة المنسدلة (انظر الشكل "قائمة الحذف"). يؤدي هذا إلى إزالة العمود C وإزاحة جميع البيانات (الموجودة على الجانب الأيمن من العمود B) إلى العمود الواقع على يساره. حذف الأعمدة من الممكن أن نحذف الأعمدة أيضاً دون استخدام الفأرة، عبر الضغط على زر Alt في لوحة المفاتيح، ثم الضغط على أزرار H و D و C في نفس الوقت. سيُحذف العمود الذي يحوي الخلية المحددة. مراجعة للمهارة: إدراج الأعمدة والصفوف حدِّد الخلايا الموجودة في العمود أو الصف المُراد حذفه. اضغط على علامة التبويب الرئيسية في شريط إكسل. اضغط على زر الحذف في مجموعة الخلايا Cells group. اضغط على خيار "حذف الصف" أو "حذف العمود". خلاصة لنستعرض المآخذ الرئيسة التي مرت معنا في هذا المقال: يجب استخدام عناوين الأعمدة في ورقة العمل، ويجب أن تصف العناوينُ البياناتِ الموجودةَ في العمود بدقة. يمكن أن يؤدي استخدام الرموز -مثل علامة الدولار- عند إدخال الأرقام في ورقة العمل إلى إبطاء عملية إدخال البيانات. يجب التركيز بشدة في أوراق العمل عند إدخال البيانات يدويًا. يُعَد أمر "إلغاء الخطوة الأخيرة" أداةً قيمةً ومهمة في استعادة البيانات التي حُذفت بالخطأ من ورقة العمل. عند استخدام ورقة عمل صُممت من قبل شخص آخر، ابحث بعناية عن الأعمدة أو الصفوف التي من الممكن أن تكون مخفية. بهذا نكون قد وصلنا إلى نهاية المقال، لا تنس متابعة المقال الموالي من السلسلة حتى تتعرف أكثر على كيفية العمل في ملفات إكسل. ترجمة بتصرف للمقال Entering, Editing, and Managing Data من "calango website". اقرأ أيضًا المقال السابق: نظرة عامة على برنامج مايكروسوفت إكسل Microsoft Excel التعرف على Microsoft Excel وإنشاء المصنف الأول كيف تتحكم بطريقة عرض أوراق العمل في Microsoft Excel استخدام أدوات مايكروسوفت إكسل لتنسيق الخلايا عن طريق الشيفرات VBA مدخل إلى تطبيق مايكروسوفت أوفيس إكسل 365 أونلاين1 نقطة
-
حتى تحصل على شهادة أكاديمية حسوب، عليك الإلمام ب 4 مسارات ضمن الدور التي تشتريها، ومن ثم تقديم امتحان و يتوجب عليك النجاح به للحصول غلى الشهادة. و إن الشهادة تتوفر على شكل رابط انترنت مرفوع على استضافة تابع لشركة حسوب قابلة للتحقق الكترونيا بمجرد دخول الرابط و ستكون باسمك الكامل. و سوف يضاف لحسابك في مستقل شارة تؤكد أنك خريج أكاديمية حسوب. الاعتراف بالشهادة هو موضوع تؤكد عليه مهاراتك (حتى الشهادة الجامعية لاتدل على شيء إن لم يكون صاحبها بارع في مجاله و ملم به)، حيث أن معظم شركات البرمجة لها مقابلات توظيف للتأكد من مهارات المبرمجون، شهادة الأكاديمية سوف تفيدك في التقديم على وظائف، بجانب اهتمامك بمعرض أعمالك و نشرهم ليستطيع العملاء مشاهدتها و اختبارها و من ثم توظيفك على المشاريع. يمكنك تصفح الأسئلة الشائعة و فيها رابط يصف الامتحان و باقي التفاصيل من هنا بالتوفيق1 نقطة
-
شكرا جزيلا جزاك الله خير عندي اختبار بكره عن هذا الموضوع وساعدتني المقاله في تجميع افكاري وفهم الموضوع بصوره اوضح1 نقطة