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

لوحة المتصدرين

  1. Wael Aljamal

    Wael Aljamal

    الأعضاء


    • نقاط

      7

    • المساهمات

      6975


  2. Hassan Hedr

    Hassan Hedr

    الأعضاء


    • نقاط

      5

    • المساهمات

      2851


  3. Ali Haidar Ahmad

    Ali Haidar Ahmad

    الأعضاء


    • نقاط

      4

    • المساهمات

      1068


  4. Amer Abdallah

    Amer Abdallah

    الأعضاء


    • نقاط

      3

    • المساهمات

      150


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 08/17/21 في كل الموقع

  1. أحاول أن أقوم بعمل دالة تتأكد من أن متغير معين عبارة عن مصفوفة Numpy أم None لذلك قمت بعمل الدالة التالية: >>> import numpy as np >>> def check(x): ... if not x: print(True) ... >>> arr = None >>> check(arr) ... True >>> arr = np.array([1,2]) >>> check(arr) ... Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() >>> لم أفهم سبب هذا الخطأ، كيف يمكنني التأكد مما إذا كان المتغير arr عبارة عن None أم مصفوفة Numpy عادية؟
    2 نقاط
  2. منذ تسجيل المستخدم في الموقع يمكن إضافة حقل آخر (اختياري) مع وضع checkBox في حال النقر عليه (هل ترغب بالاشتراك بالنشرة الربيدية؟) (يظهر حقل إدخال للإيميل الآخر)يضع فيه البريد الإلكتروني الذي يريد أن يستقبل عليه النشرة البريدية مع أن معظم المستخدمين يتم وضع نفس بريدهم للنشرة.. ويمكنك وضعه نفسه بشكل افتراضي، ثم إخبار المستخدم إن رغب في تبديله ببريد آخر.. تطبيقا لفكرة المدرب سمير، بعمل جدول منفضل للنشرة البريدية، بعد تسجيل المستخدم في الموقع، يكون لدينا بريده الالكتروني، يمكن وبعد تأكيده لنية الاشتراك، إضافة بريده في الجدول الآخر وهو حل بسيط، وبالنسبة للمستخدمين غير المسجين يمكن وضع بريدهم في ذلك الجدول مباشرة.. إن كنت تريد إضافة خاصية confirm للمستخدمين المسجلين، يمكن عمل استعلامين واحد لجدول المستخدمين وآخر للزوار ودمج النتائج في مصفوفة و إرسال النشرة للجميع.
    2 نقاط
  3. الإصدار 1.0.0

    116573 تنزيل

    سطع نجم لغة البرمجة بايثون في الآونة الأخيرة حتى بدأت تزاحم أقوى لغات البرمجة في الصدارة وذاك لمزايا هذه اللغة التي لا تنحصر أولها سهولة كتابة وقراءة شيفراتها حتى أصبحت الخيار الأول بين يدي المؤسسات الأكاديمية والتدريبية لتدريسها للطلاب الجدد الراغبين في الدخول إلى مجال علوم الحاسوب والبرمجة. أضف إلى ذلك أن بايثون لغةً متعدَّدة الأغراض والاستخدامات، لذا فهي دومًا الخيار الأول في شتى مجالات علوم الحاسوب الصاعدة مثل الذكاء الصنعي وتعلم الآلة وعلوم البيانات وغيرها، كما أنَّها مطلوبة بشدة في سوق العمل وتعتمدها كبرى الشركات التقنية. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن بني هذا العمل على كتاب «How to code in Python» لصاحبته ليزا تاغليفيري (Lisa Tagliaferri) وترجمه إلى العربية محمد بغات وعبد اللطيف ايمش، وحرره جميل بيلوني، ويأتي شارحًا المفاهيم البرمجية الأساسية بلغة بايثون، ونأمل في أكاديمية حسوب أن يكون إضافةً نافعةً للمكتبة العربيَّة وأن يفيد القارئ العربي في أن يكون منطلقًا للدخول إلى عالم البرمجة من أوسع أبوابه. رُبط هذا الكتاب مع توثيق لغة بايثون في موسوعة حسوب لتسهيل عملية الاطلاع على أي جزء من اللغة مباشرة وقراءة التفاصيل باللغة العربية. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «المرجع الشامل إلى تعلم لغة بايثون»، أو مباشرةً من الآتي: المقال الأول: دليل تعلم بايثون اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3 المقال الثاني: تثبيت بايثون 3 وإعداد بيئتها البرمجية المقال الثالث: كيف تكتب أول برنامج لك المقال الرابع: كيفية استخدام سطر أوامر بايثون التفاعلي المقال الخامس: كيفية كتابة التعليقات المقال السادس: فهم أنواع البيانات المقال السابع: مدخل إلى التعامل مع السلاسل النصية المقال الثامن: كيفية تنسيق النصوص المقال التاسع: مقدمة إلى دوال التعامل مع السلاسل النصية المقال العاشر: آلية فهرسة السلاسل النصية وطريقة تقسيمها المقال الحادي عشر: كيفية التحويل بين أنواع البيانات المقال الثاني عشر: كيفية استخدام المتغيرات المقال الثالث عشر: كيفية استخدام آلية تنسيق السلاسل النصية المقال الرابع عشر: كيفية إجراء العمليات الحسابية المقال الخامس عشر: الدوال الرياضية المضمنة المقال السادس عشر: فهم العمليات المنطقية المقال السابع عشر: مدخل إلى القوائم المقال الثامن عشر: كيفية استخدام توابع القوائم المقال التاسع عشر: فهم كيفية استعمال List Comprehensions المقال العشرون: فهم نوع البيانات Tuples المقال الحادي والعشرين: فهم القواميس المقال الثاني والعشرين: كيفية استيراد الوحدات المقال الثالث والعشرين: كيفية كتابة الوحدات المقال الرابع والعشرين: كيفية كتابة التعليمات الشرطية المقال الخامس والعشرين: كيفية إنشاء حلقات تكرار while المقال السادس والعشرين: كيفية إنشاء حلقات تكرار for المقال السابع والعشرين: كيفية استخدام تعابير break وcontinue وpass عند التعامل مع حلقات التكرار المقال الثامن والعشرين: كيفية تعريف الدوال المقال التاسع والعشرين: كيفية استخدام *args و**kwargs المقال الثلاثين: كيفية إنشاء الأصناف وتعريف الكائنات المقال الحادي والثلاثين: فهم متغيرات الأصناف والنسخ المقال الثاني والثلاثين: وراثة الأصناف المقال الثالث والثلاثين: كيفية تطبيق التعددية الشكلية (Polymorphism) على الأصناف المقال الرابع والثلاثين: كيف تستخدم منقح بايثون المقال الخامس والثلاثين: كيفية تنقيح شيفرات بايثون من سطر الأوامر التفاعلي المقال السادس والثلاثين: كيف تستخدم التسجيل Logging المقال السابع والثلاثين: كيفية ترحيل شيفرة بايثون 2 إلى بايثون 3
    1 نقطة
  4. السلام عليكم هل يوجد كتاب للغة html ولغة css اذا كانت توجد هذه الكتب ارجو منكم ارسال اسمائها او روابطها
    1 نقطة
  5. السلام عليكم اريد ان اترجم المشروع الذي اعمل عليه و لكن هنالك مشكلة و هي ان الترجمة تتم فقط عند صفحة ال login , اما في الصفحات داخل الموقع لا تتم الترجمة. كما تعلمنا في فيديو الخاص بترجمة موقع ال instagram قام المدرب باضافة input من نوع dropdown box حيث يدخل فيه options و من ثم يحفظ ما اختاره المستخدم من لغة داخل الدالة store اما في مشروعي لقد قمت بعمل dropdown list (unordered list) و فيها خياران للغة فعند الضغط على احد اللغات لا يتغير لفة الموقع و عند الذهاب مثلا الى صفحة انشاء المشروع يكون ال url في الاعلى هكذا http://127.0.0.1:8000/project/setlang/ar و يظهر خطأ 404 اي ان الصفحة غير موجودة هذا code ال route Route::get('/', function () { return view('auth.login'); })->middleware('language'); Route::middleware(['auth:sanctum', 'verified', 'language'])->get('/home', function () { return view('home'); })->name('home'); // Route::get('/project', [ProjectController::class, 'index'])->name('index'); Route::resource('projects', ProjectController::class)->middleware('language'); Route::get('/project/create', [ProjectController::class, 'create'])->middleware('language'); Route::get('/project/{{project}}/edit', [ProjectController::class, 'edit'])->middleware('language'); Route::get('/users', [UserController::class, 'index'])->middleware('language'); Route::post('/users', [UserController::class, 'update'])->middleware('language'); Route::get('setlang/{language}', function ($lang) { if ($lang == "ar" || $lang == "en") { session(['language' => $lang]); } else { abort(404); } return redirect()->back(); }); و هذا كود ال navigation <!-- Navigation Links --> <div class="hidden md:flex items-center space-x-1 ml-3 "> <a href="/home" class="py-4 px-2 text-green-500 border-b-4 border-green-500 font-semibold ">{{__('Home')}}</a> @if(Auth::user()->role == 1) <a href="/users" class="py-4 px-2 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Users')}}</a> @endif <div class="dropdown inline-block relative"> <button class=" text-gray-500 font-semibold py-2 px-4 rounded inline-flex items-center hover:text-green-500 transition duration-300""> <span class=" mr-1 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Languages')}}</span> <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"> <path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z" /> </svg> </button> <ul class="dropdown-menu absolute hidden text-gray-700 pt-1"> <li class=""><a class=" bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="setlang/ar">{{__('Arabic')}}</a></li> <li class=""><a class="bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="setlang/en">{{__('English')}}</a></li> </ul> </div> <a href="" class="py-4 px-2 text-gray-500 font-semibold hover:text-green-500 transition duration-300">{{__('Contact Us')}}</a> </div> </div> و هذا كود ال middleware الخاص باللغة public function handle(Request $request, Closure $next) { $lang = $request->session()->get('language', 'en'); if (Auth::user() != null) { App::setLocale(Auth::user()->language); if (Auth::user()->language == "ar") { View::share('rtl', 'true'); } } else if (isset($lang)) { App::setLocale($lang); if ($lang == "ar") { View::share('rtl', 'true'); } } return $next($request); } }
    1 نقطة
  6. لدي مصفوفة Numpy من نوع int32، كيف يمكنني تحويلها إلى float32 في مكانها (أي بدون نسخها إلى متغير جديد)؟ أود أن أفعل شيء كالكود التالي: arr = arr.astype(numpy.float32) بدون نسخ المصفوفة لأنها كبيرة للغاية. كيف يمكن القيام بذلك في Numpy؟
    1 نقطة
  7. السلام عليكم ورحمة الله وبركاته عندي مشكلة في تشغيل node يطلعلي internal/modules/cjs/loader.js:892 throw err; ^ Error: Cannot find module 'C:\Users\Administrator\Desktop\hsoub academy\main.js' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:889:15) at Function.Module._load (internal/modules/cjs/loader.js:745:27) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12) at internal/main/run_main_module.js:17:47 { code: 'MODULE_NOT_FOUND', requireStack: [] } ,
    1 نقطة
  8. تمام، أرجو منك أن تتابع مشكلة الترجمة في ذلك السؤال
    1 نقطة
  9. تأكد أن ال middleware مسجل في نواة التطبيق وأن الطلبات تمر عبره، يمكنك وضع التالي (مؤقتًا) والتأكد أن بيانات الجلسة تحتوي على المتحول language بالقيمة الصحيحة public function handle(Request $request, Closure $next){ dd($request->session()); ... }
    1 نقطة
  10. أفضل استخدام كلمة subscribe لأن لها دلالة مناسبة بالضبط، أما confirm لوحدها مثلا تدل على تأكيد الإيميل..
    1 نقطة
  11. إن عمل Model للجدول هو أمر جيد بالفعل، مع ملفات التهجير وكل شيئ.. هذا مفيد بعد نقل المشروع و تنفيذ أوامر التهجير سيتم إنشاء الجدول مباشرة، ولا يتطلب عمله من جديد بشكل منفصل، أي بما أن هذا الجدول من صلب المشروع عليك بناءه بأفضل طريقة ممكنة وللتحديثات في المستقبل، لربما أضفت تصنيفات لمواضيع النشرة البريدية، إن عمل نموذج و ملف تهجير هو الأفضل. بالإضافة لإمكانية استخدام Eloquent ORM
    1 نقطة
  12. جرب جلب المستخدم الحالي من قاعدة البيانات عبر المعرف للمستخدم المسجل الآن كالتالي ... if(isset($lang)){ User::find(Auth::id())->update(['language' => $lang]); } ...
    1 نقطة
  13. حضرتك دلوقتي مش معايا فيزا وكنت هدفع الفلوس بفيزا اخويا هل كده الحساب هيتسجل باسمه؟ والشهادة هتطلع باسم مين؟
    1 نقطة
  14. في ال middleware الخاص بالترجمة اذا كان المستخدم مسجل دخول فأنت تعين لغة التطبيق كما هي محفوظة في قاعدة البيانات للمستخدم (وتتجاهل بيانات الجلسة التي حددتها بالضغط على خيار اللغة) يجب حفظ خيار اللغة الموجود في بيانات الجلسة في بيانات المستخدم الحالي أولا كما يلي public function handle(Request $request, Closure $next) { $lang = $request->session()->get('language', 'en'); if (Auth::user() != null) { // حفظ خيار تغيير اللغة if(isset($lang)){ Auth::user()->update(['language' => $lang]); } App::setLocale(Auth::user()->language); if (Auth::user()->language == "ar") { View::share('rtl', 'true'); } } else if (isset($lang)) { App::setLocale($lang); if ($lang == "ar") { View::share('rtl', 'true'); } } return $next($request); } }
    1 نقطة
  15. المشكلة في الروابط href في القائمة المنسدلة فهي روابط نسبية (تبدأ من الصفحة الحالية) وليست مطلقة (تبدأ من بداية العنوان) فعندما تمرر "setlang/ar"مثلا سيقوم المتصفح عند الضغط على هذا الرابط باضافته لنهاية رابط الصفحة الحالية والذهاب اليها في حالتك كانت الصفحة هي projects الرابط الناتج سيكون "projects/setlang/ar" وهو عنوان صفحة غير موجودة في مشروعك (سبب الخطأ 404) لجعل الرابط مطلق قم بإضافة "/" في بداية العنوان بالشكل التالي <li class=""><a class=" bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="/setlang/ar">{{__('Arabic')}}</a></li> <li class=""><a class="bg-gray-200 hover:bg-gray-400 py-2 px-4 block whitespace-no-wrap" href="/setlang/en">{{__('English')}}</a></li>
    1 نقطة
  16. كيف اعالج هده المشكلة ERROR Invariant Violation: Changing onViewableItemsChanged on the fly is not supported هذا هو الكود <Animated2.FlatList horizontal data={ads} keyExtractor={item => item.id.toString()} // onViewableItemsChanged={({viewableItems, changed}) => { // console.log(viewableItems[0].index); // setSelectedIndex(viewableItems[0].index); // }} onViewableItemsChanged={onViewableItemsChanged} viewabilityConfig={viewabilityConfig} style={{backgroundColor: 'red'}} contentContainerStyle={{justifyContent: 'center'}} onScrollEndDrag={() => goToSelectedLocation(selectedIndex)} renderItem={({item, index}) => { setSelectedIndex(index); console.log(index); return ( <MapCard onPress={() => goToSelectedLocation(index)} style={{margin: 4}} title={item.title} image={item.image} price={item.price} /> ); }} />
    1 نقطة
  17. اانا استخدم رياكت ناتيف واود ان احصل على الاندكس الخاص ب الايتم المعروضة حاليا .. هدا هو الكود <Animated2.FlatList horizontal data={ads} keyExtractor={item => item.id.toString()} // onViewableItemsChanged={({viewableItems, changed}) => { // console.log(viewableItems[0].index); // setSelectedIndex(viewableItems[0].index); // }} style={{backgroundColor: 'red'}} contentContainerStyle={{justifyContent: 'center'}} onScrollEndDrag={() => goToSelectedLocation(selectedIndex)} renderItem={({item, index}) => { setSelectedIndex(index); console.log(index); return ( <MapCard onPress={() => goToSelectedLocation(index)} style={{margin: 4}} title={item.title} image={item.image} price={item.price} />
    1 نقطة
  18. هل يمكنك نشر الكود بعد التعديل، لكي يتطلع عليه من يمر بنفس المشكلة لاحقًا
    1 نقطة
  19. السلام عليكم ورحمة الله وبركاته عندي سؤال يخصوص الجافا سكربت كيف يمكنني أن أكتب رقم float يعني هكذا 1.0 بدون أن يحذف الصفر وبدون استخدام toFixed لأنها تجعله string وأنا أريده من نوع number
    1 نقطة
  20. هل ممكن توضح مقصدك بأي كودين تريد دمجهم ؟
    1 نقطة
  21. لربط جدولين أو أكثر نستخدم join وفي هذه الحالة يمكننا ربط الجدولين بهذا الشكل $stmt = $db->prepare('SELECT m.*, a.* FROM `messages` as m inner join `accounts` as a WHERE a.id=m.recipient_id OR a.id =m.sender_id'); لاحظ أنه كان لديك خطأ في الاستعلام و هو تشابه الشرط WHERE a.id=m.recipient_id AND a.id =m.sender_id' فيجب أن يكون الشرط هنا من نوع OR وليس AND لأنه لو لم تقم بتحويله OR ستحدث معك مشكلة و هي أنه لا يمكن الحقل id يساوي الحقلين recipient_id و sender_id معاً
    1 نقطة
  22. تقوم الدالة argsort بإرجاع المؤشرات المستخدمة لاحقاً في فرز المصفوفة وتكون تصاعدياً إفتراضياً عن طريق إرجاع index العنصر حسب ترتيبه عند ترتيبه تصاعدياً وفي المثال السابق الذي طرحته لماذا تتوقع ذلك الناتج لذلك قم بالإطلاع النتاج وستعرف طريقة عملها print (arr.argsort()) # Output: [2 3 1 0] الناتج السابق يعني أن ال index 2 يجب أن يكون في أول المصفوفة ويعني أيضاً أنه أصغر رقم 2 هو ال index الخاص بالعنصر 0.0 3 هو ال index الخاص بالعنصر 0.1 1 هو ال index الخاص بالعنصر 1.41 0 هو ال index الخاص بالعنصر 1.48
    1 نقطة
  23. في بايثون، يتم التعامل مع ال arrays كمتجهات Vectors. أيضاً تسمى ال 2D-Arrays بال matrices. وهناك توابع جاهزة لتنفيذ الضرب بينهما في بايثون. وهما @ وتمثل التابع __matmul__ و numpy.dot وهما متشابهين جداً مع بعض الاختلافات. حيث تستخدم الدالة numpy.dot لإجراء ضرب المصفوفات matrices في بايثون (الضرب العادي) حيث يتحقق فيما إذا كان شرط ضرب المصفوفات محقق أولاً، أي أن عدد أعمدة المصفوفة الأولى يجب أن يكون مساوياً لعدد صفوف المصفوفة الثانية. ويعمل مع مصفوفات متعددة الأبعاد أيضاً. يمكننا أيضاَ تحديد مصفوفة بديلة كمعامل لتخزين النتيجة. المعامل @ يستدعي دالة __matmul__ لمصفوفة تُستخدم لإجراء نفس عملية الضرب. فمثلاً: # لاحظ كيف أعطيانا نفس الناتج import numpy as np a1 = np.array([[3,5],[0,3]]) a2 = np.array(([4,1],[6,7])) print(a1@a2) """ [[42 38] [18 21]] """ print(np.dot(a1,a2)) """ [[42 38] [18 21]] """ لكن عندما نتعامل مع المصفوفات متعددة الأبعاد ndArrays تكون النتيجة مختلفة قليلاً. يمكنك أن ترى الفرق في المثال: import numpy as np a1 = np.random.rand(2,2,2) a2 = np.random.rand(2,2,2) r1 = np.dot(a1,a2) r1 """ [[[[0.12022633 0.02387914] [0.01322726 0.14207161]] [[0.61570778 0.04646624] [0.66232634 0.33838594]]] [[[0.63522905 0.0644122 ] [0.55415297 0.43366682]] [[0.79912989 0.13910756] [0.2417268 0.84365592]]]] """ print(r1.shape) # (2, 2, 2, 2) r2 = (a1@a2) """ [[[0.12022633 0.02387914] [0.61570778 0.04646624]] [[0.55415297 0.43366682] [0.2417268 0.84365592]]] """ print(r2,r2.shape) # (2, 2, 2) حيث أن الدالة matmul تقوم بعملية "Brodcasting" على المصفوفة، أي يتم التعامل معها على أنها كومة من المصفوفات الموجودة في الفهرين الأخيرين ويتم بثها وفقاً لذلك. لكنها تحافظ على أبعاد الخرج أي : (n,k),(k,m)->(n,m) مثلاً: a = np.ones([9, 5, 7, 4]) c = np.ones([9, 5, 4, 3]) np.dot(a, c).shape #(9, 5, 7, 9, 5, 3) np.matmul(a, c).shape #(9, 5, 7, 3) # n is 7, k is 4, m is 3 ومن ناحية أخرى، تقوم الدالة numpy.dot بالضرب كمجموع حاصل الضرب على المحور الأخير من المصفوفة الأولى والثاني إلى الأخير من الثانية. هناك اختلاف آخر بينهما، وهو أن الدالة matmul لا يمكنها إجراء عملية ضرب للمصفوفة بقيم عددية: import numpy as np a = np.array([1, 2]) np.dot(a,5) # array([ 5, 10]) a@5 # ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
    1 نقطة
  24. يتم استخدام الوظيفة لإجراء فرز غير مباشر على طول المحور المحدد باستخدام الخوارزمية المحددة له (تحدد له الخوارزمية التي ستقوم بالفرز مثل الفرز على أساس الكومة أو باستخدام مبدأ فرق تسد mergesort أو خوارزمية الفرز السريع). تقوم بإرجاع مصفوفة من الفهارس من نفس الشكل مثل arr التي من شأنها أن تفرز المصفوفة.لها الشكل التالي: numpy.argsort(arr, axis=-1, kind=’quicksort’, order=None) بحيث أن الوسيط الأول هو الصفوفة، والثاني هو المحور وإذا تم ضبطه على None ، فسيتم تسوية المصفوفة "flatten" قبل الفرز. وافتراضياً هي -1 ، أي يقوم بالفرز على أساس المحور الأخير. أما الوسيط الثالث فهو نوع الخوارزمية [‘quicksort’, ‘mergesort’, ‘heapsort’] وافتراضياً هي quicksort. أما الوسيط الأخير فيستخدم عندما تكون المصفوفة عبارة عن مصفوفة ذات حقول محددة، حيث تحدد هذه الوسيطة الحقول المراد مقارنتها أولاً ، وثانيًا ، وما إلى ذلك. وتعيد هذه الدالة مصفوفة من الفهارس التي تفرز مصفوفتك على طول المحور المحدد. أمثلة: import numpy arr = numpy.array([ 3, 5, 1, 5, 4, 1]) print (arr) # [3 5 1 5 4 1] sorted = numpy.argsort(arr) print ("Output sorted array indices : ", sorted) print("Output sorted array : ", arr[sorted]) #Output sorted array indices : [2 5 0 4 1 3] #Output sorted array : [1 1 3 4 5 5] ########################################################################## import numpy arr = numpy.array([[ 5, 6], [4, 3]]) print (arr) """ [[5 6] [4 3]] """ # هنا حددنا خوارزمية فرق تسد # حددنا أيضاً الفرز على المحور العمودي sorted = numpy.argsort(arr, kind ='mergesort', axis = 0) print ("Output sorteded array indices along axis 0: \n", sorted) """ Output sorteded array indices along axis 0: [[1 1] [0 0]] """ # هنا غيرنا بالخوارزمية والمحور sorted2 = numpy.argsort(arr, kind ='heapsort', axis = 1) print ("Output sorteded array indices along axis 1: \n", sorted2) """ Output sorteded array indices along axis 1: [[0 1] [1 0]] """ ويمكنك استخدامها للتريب التنازلي أيضاً وتجد ذلك في الرابط التالي:
    1 نقطة
  25. الدالة argsort تقوم بإرجاع المؤشرات بالترتيب الذي من شأنه جعل الجدول مرتبا. في هذه الحالة: 2 هو مؤشر 0.0 3 هو مؤشر 0.1 1 هو مؤشر 1.41 0 هو مؤشر 1.48
    1 نقطة
  26. كما ترى في التعليقات فإنه توجد العديد من الطرق لتنفيذ المطلوب فمثلاً يمكنك استخدام for loop كالتالي x[[z for z in range(x.size) if not z in exclude]] قم بتحديد ال exclude من خلال list تحتوي على جميع العناصر التي لا تريدها كما يمكنك استخدام hstack كما في المثال التالي a = [0,1,2,3,4,5,5,6,7,8,9] np.hstack((a[:3], a[4:])) #قم بتحديد المقطع الذي تريد حذفه array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9])
    1 نقطة
  27. في هكذا حالات نستخدم قناع، أولاً تأمل الفكرة التالية: import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) #للعنصر الذي نريده أن يظهر True ننشئ قناع بالحجم الذي نريده ونضع mask=[True,True,True,True,True,False,True,True,True] #False الآن ستظهر كل عناصر المصفوفة ماعدا العنصر الذي وضعنا له a[mask] #array([1, 2, 3, 4, 5, 7, 8, 9]) # 6 غير موجودة حسناً هناك طريقة أكثر راحة لإنشاء القناع كالتالي: import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) mask = np.ones(a.shape, bool) mask # array([ True, True, True, True, True, True, True, True, True]) a[mask] #array([1, 2, 3, 4, 5, 6, 7, 8, 9]) الآن يمكننا تطبيق الفكرة السابقة لاستبعاد أي فهرس نريده: #فقط في القناع False الآن لو أردنا استبعاد عنصر نقوم بوضع # مثلاً أريد استبعاد الفهرس 6 exclude=5 mask[exclude] = False a[mask] # array([1, 2, 3, 4, 5, 7, 8, 9]) هناك طريقة أخرى وهي الأسهل وتتمثل باستخدام الدالة delete حيث نمرر لها فهرس العنصر المراد استبعاده، وطبعاً لاتؤثر على العنصر الفعلي الموجود في المصفوفة لأن هذه الدالة ترجع نسخة من المصفوفة وبالتالي التعديل لايتم على المصفوفة الأصلية: import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # مثلاً أريد استبعاد الفهرس 6 exclude=6 np.delete(a, exclude) # array([1, 2, 3, 4, 5, 6, 8, 9]) كذلك يمكنك استخدام np.isin ، لتوليد القناع، لكن دعنا نفهم ماتقوم به هذه الدالة أولاً: import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # numpy.isin(element, test_elements) #في مكان العنصر المراد True هذه الدالة تأخذ مصفوفة + العنصر المراد البحث عنه، وخرجها يكون مصفوفة بنفس الأبعاد لكن تضع #في باقي الأماكن False و np.isin(a, 6) # array([False, False, False, False, False, True, False, False, False]) # وبالتالي لو قمنا بعملية نفي على قيم المصفوفة سيكون الخرج ~np.isin(a, 6) # array([ True, True, True, True, True, False, True, True, True]) # وهذه الفكرة سنستخدمها لإنشاء القناع والحل يكون خطوة بخطوة: a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) b=np.ones(len(a)) # array([1., 1., 1., 1., 1., 1., 1., 1., 1.]) # مثلاً أريد استبعاد الفهرس 6 exclude=6 # أحول المصفوفة السابقة لقناع بولياني ~np.isin(b, exclude) # array([ True, True, True, True, True, True, False, True, True]) a[~np.isin(b, exclude)] # array([1, 2, 3, 4, 5, 6, 8, 9]) # واختصاراً # a[~np.isin(np.arange(len(a)), exclude)] وبنفس الطريقة نستخدم np.in1d: import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) a # array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # مثلاً أريد استبعاد الفهرس 6 exclude=6 a[~np.in1d(np.arange(len(a)), exclude)] # array([1, 2, 3, 4, 5, 6, 8, 9])
    1 نقطة
  28. يمكننا توليد مصفوفة من مواقع العناصر المطلوبة ثم أخذ هذه المصفوفة ك indexes للمصفوفة الهدف: a[np.arange(len(a))!=3] array([0, 1, 2, 4, 5, 5, 6, 7, 8, 9]) المصفوفة الأصلية فيها الأعداد من 0 حتى 9 (تم تخطي 3) ويمكن استعمال concatenate : np.concatenate((x[:i],x[(i+1):])) array([0, 1, 2, 4, 5, 6, 7, 8, 9]) حيث i هي الدليل المستبعد أي 3. كما يمكن استعمال masked array لتحديد العناصر التي لانريدها a = np.ma.array(a, mask=False) # الافتراضي False a.mask[3] = True # المستبعد print(a) # [0 1 2 -- 4 5 5 6 7 8 9]
    1 نقطة
  29. import math import numpy import scipy # من ناحية نمط البيانات type(numpy.pi)==type(math.pi)==type(scipy.pi) # True # القيمة math.pi == np.pi == scipy.pi # True 3.141592653589793 # نجد اختلاف بسيط من ناحية الأداء %timeit scipy.pi*1000 """ The slowest run took 36.02 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 5: 102 ns per loop """ %timeit numpy.pi*1000 """ The slowest run took 27.30 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 5: 107 ns per loop """ %timeit math.pi*1000 """ The slowest run took 23.38 times longer than the fastest. This could mean that an intermediate result is being cached. 10000000 loops, best of 5: 94.2 ns per loop """ ووجودها في 3 مكتبات يسهل عليك العمل، فمثلاً اعتبر أنها غير موجودة في نمباي وأنت الآن تتعامل مع مصفوفات نمباي وتريد استخدام هذه القيمة، وبالتالي ستكون مجبراً على استيرادها من الوحدة math أو scipy. لذا فإن وجودها في نفس المكتبة التي تعمل بها يريحك من عملية استيرادها عند الحاجة.
    1 نقطة
  30. >>> import math >>> import numpy as np >>> import scipy >>> math.pi == np.pi == scipy.pi True بإمكانك تجربة الكود المرفق, قيمة pi في المكتبات الثلاثة هي نفسها, لذلك يمكنك استخدام اي منها و ستحصل على نفس النتيجة. pi موجودة في المكتبات الثلات لأنك اذا اردت استخدام احدى هذه المكتبات, ستجد قيمة pi متوفرة في هذه المكتبة مباشرة و لن تحتاج لاستدعاء مكتبة اخرى من اجل الحصول عليها.
    1 نقطة
  31. في الواقع لا يوجد فرق بين قيم pi في اي من المكتبات الثلاث، للتاكد جرب الكود التالي: >>> import math >>> import numpy as np >>> import scipy >>> math.pi == np.pi == scipy.pi True هنا نحن نقارن بين قيم pi في الثلاث مكتبات والناتج هو true اي انهم جميعهم متساوون. السبب الوحيد لتوفير نفس قيمه pi في الثلاث مكتبات هي تسهيل استدعائها بغض النظر عن المكتبة التي تقوم باستدعاءها والعمل بها، نظرا لاهمية قيمه ال pi وكثرة استخدامها.
    1 نقطة
  32. هذا الجزء من الشيفرة const tasks = document.getElementById('tasks'); اذا قمنا بطباعته سوف يعطينا <div id="tasks"> <h3>sqsqs</h3> <h3>sqsqs</h3> <h3>sqsqs</h3> <h3>sqsqs</h3> <h3>sqsqs</h3> </div> أنت تحتاج الى مجموعة ال h3 التي يمكن ان تتواجد في الداخل او بالتحديد النص المتواجد داخل كل h3 لذا ستحتاج الى NodeList tasks.childNodes tasks.childNodes.forEach((node) => { if (node.nodeName === 'H3') { console.log(node.innerText); } }); الشيفرة بالأعلى كفيلة بان تأتي لك بكل النصوص الخاصة ب h3
    1 نقطة
  33. بالنسبة لي.. هذا السؤال مُثيرٌ للحماسة، ومُدهِشٌ، وإيجابيٌّ للغاية. مُثِيرٌ لأنَّه ينبهكَ إلى ما ينبغي أن تكون عليه (الجاذبية العملية). ومُدهِشٌ لأنه كالمِرآةِ تَرى فيها نفسَك وتكتشفُ فيها حاجاتِك الغائبة. وإيجابيٌّ للغاية؛ لأنه يُجِيب عن نفسه بنفسه بكلمة (أكثر)؛ فما يجذبُ العميلَ هو تَطورُكَ. وليس هذا فحسب، لكن أن تكون دائمًا (أكثرَ تطورًا) مِن ذِي قَبل، وأن تكون (أكثر إتقانًا للعمل)، و(أكثر إحاطةً بمتطلبات العمل)، و(أكثر إلملمًا بحاجات العميل)، و(أكثر اقتدارًا) على ترجمة معرض أعمالكَ الكبير إلى ثقة كبيرة لدى العملاء، و(أكثر استعدادًا للتميز) في مجتمع المستقلين، و(أكثر اتصافًا) بالكفاءة والخبرة والمرونة والدقة والاحترافية والجودة والشفافية والالتزام والمهارة. ما ينقص أي مستقل أن يُنافس نفسَه ويطورها دون حدود لهذا التطور، حتى يكون على أتم الاستعداد لتقديم أفضل الخدمات، وتنفيذ المشروعات الهائلة. سلامي وتحياتي وتقديري
    1 نقطة
  34. قد تتساءل لماذ يجب عليّ أن أستخدم ووردبريس؟ لكي تكون الأكثر فاعلية في عملك، من المهم جدًا أن يتعلم مصممو الويب والمطورون المحترفون الأدوات المناسبة ويستخدمونها. أردنا اليوم توضيح فكرة لماذا استخدام ووردبريس هو الخيار الأفضل لمعظم المستقلين (freelancers) -مرّة واحدة وللأبد-. سنغطي أيضًا كفية جعل سير عملك فائق الإنتاجية باستخدام إطار عمل قالب (theme framework). هناك الكثير من الأشياء المهمة التي تحتاج القيام بها عند إنشاء موقع ويب، إذ تحتاج إلى التأكد من أن الموقع يبدو رائعًا، وسريعًا، ومتجاوبًا (responsive)، ويظهر ظهورًا مرتبًا في جميع الأجهزة مختلفة الأحجام. يعدّ ووردبريس حقًا أفضل حلٍّ يمكنك استخدامه عند إنشاء معظم مواقع العملاء. بعض الاستثناءات ستكون تطبيقات ويب (web application) لأنك تحتاج حينها إلى بناء كل شيء من الصفر. مثلًا، في بناء موقع البحث عن الوظائف المُسمّى "AwesomeWeb" استخدم مطورو الموقع إطار عمل Ruby on Rails. بدأوا باستخدام مزيج من ووردبريس وإطار عمل CodeIgniter، ولكن لم يكن ووردبريس مرنًا كفاية لمثل هذه الحلول البرمجية عالية التخصيص. ومع ذلك، لن يحتاج معظم العملاء إلى حلول مخصصة. في ‎%98‎ من الحالات، سيحتاج العملاء إلى شيء شائع، مثل متجر على الإنترنت، أو علامة تجارية أو معرض أعمال (portfolio)، أو عضوية (membership)، أو مدونة للحصول على موقع تجاري بسيط. يمكنك بناء كل ذلك بسهولة باستخدام ووردبريس ومعرفة برمجية أساسية. هناك سبب وجيه لاستخدام ووردبريس من قبل الشركات الكبرى. السرعة والبساطة لماذا ووردبريس؟ ووردبريس هو نظام إدارة المحتوى (CMS) الأشهر، لسبب وجيه. صُمّمت %22 من جميع المواقع على الإنترنت باستخدام ووردبريس، وهي تشكّل حوالي 80 مليون موقع. إليك بعض الأسباب الرئيسية وراء شعبية ووردبريس: يسير التعلّم، ووردبريس برنامجٌ مفتوح المصدر. سهل وموثَّق (documented) توقيقًا شاملًا كذلك، بالإضافة إلى توفّر العديد من مقاطع الفيديو التدريبية المجانية. يحتوي العديد من الإضافات (plugins) والقوالب (themes)، أي لست بحاجة إلى خبرةٍ كبيرةٍ حتى تبدأ إنشاء مواقع باستخدام ووردبريس. في بعض الحالات، لا تحتاج إلى كتابة أي شيفرة برمجية لتحقيق النتائج التي تريدها. إنه قوي، يمكنك بناء الكثير عبره، مثل: متجر إلكتروني، ومدونة، وعضوية (membership)، ونماذج اتصال (contact forms)، بسهولة وسرعة فائقة من خلال استخدام القوالب (theme)، والإضافات المميزة. هناك آلاف من القوالب المجانية والمدفوعة متاحة على الإنترنت. قد يكون من المغري استخدام قالب مجاني، ولكن قبل اتخاذ هذا القرار، واصل القراءة.. الاستثمار مقابل أن تكون مكرّسًا وباحثًا عن المجانيّات. أقول ذلك لا يستحق المغامرة، ليس هنا لماذا استخدام قالب مدفوع أفضل من استخدام قالب مجاني؟ فوائد استخدام قالب مدفوع (premium theme)، مقابل القالب المجاني (free theme) كثيرة. السبب الأكثر أهمية لعدم استخدام قالب ووردبريس مجاني هو افتقارها للدعم والتوثيق (documentation) والتحديثات. فكّر في الأمر، إذا أنشأ المطوّر قالبًا مجانيًا، فهو لا يكسب أمولًا منها. لكنه لا يزال بحاجة إلى كسب لقمة العيش بطريقة أو بأخرى. لا يمكن أن يكون قالب ووردبريس المجاني خيارًا طويل الأمد، لأن المطوّر ليس لديه الحافز لدعم القالب مجانًا وتقديم التوثيق (documentation) وتحديثه خلال السنوات. هل ستقوم بكل هذا العمل مجانًا لو كنت في مكانه؟ لا يمكن توقّع مصادر التدريب (training resources) والوثائق (documentation) والدعم المجاني والتحديثات، عندما لا يكسب المطوّر منه أي مال. حتى لو كان أكثر الناس طيبة على وجه البسيطة، فإن كسب رزقه سيكون له الأولويّة دائمًا، علاوة على ذلك، ستكون القوالب (themes) المجانية أقل جودةً من تلك المدفوعة (premium) دائمًا. أنت تحصل على ما تدفع ثمنه. تتميز القوالب المدفوعة (premium themes) بشيفرة برمجية أنظف ووظائف أفضل. يقدّم جميع مزودي القوالب المدفوعة (premium themes) تصميمًا عالي الجودة وتوثيقًا معمّقًا (in-depth documentation) ودعمًا على مستوى عالمي. الدعم مهمٌّ للغاية، لأن هناك خطأٌ ما دائمًا أو شيء ما لا يعمل كما هو متوقّع. إذا اخترت قالبًا مجانيًا، فأنت تعتمد على حسن نية الآخرين لمساعدتك في المنتديات. أما عندما تختار شراء قالب ووردبريس مدفوع، فأنت تدفع مقابل الدعم ويكون مقدمو القوالب مسئولين عن مساعدتك. أفضل ما في الأمر أنّ قوالب ووردبريس المدفوعة تأتي بأسعار ميسورة جدًا بسبب المنافسة الشديد في السوق. هذه أخبار جيّدة لك! يمكنك شراء قالب مدفوع واحد مقابل 50 دولارًا أو الوصول لجميع قوالب المتجر مع الدعم مقابل 100 – 300 دولار/سنويًا. يمكنك استعادة هذه الأموال بسهولة من عميل واحد! لقد بدأوا في موقع ‎1stWebDesigner‎‎‎‎‎ منذ 7 سنوات بقالب ووردبريس مجاني، لكن الآن، لا ينظرون حتى النظر في القوالب المجانية. لأنها لا تستحق العناء ببساطة. أقترح عليك دفع 50 دولارًا مقابل قالب ووردبريس جميل وقابل للتخصيص الذي تريده مع التأكد من تضمين التوثيق (documentation) والدعم، مما سيوفّر لك الكثير من الوقت. هذا يعني أنك ستقضي الكثير من وقتك في محاولة معرفة الأشياء بنفسك. قوالب ووردبريس المدفوعة أم أطر عمل القوالب (Theme Framework) أم تطوير ووردبريس مخصص؟ عندما تنوي إنشاء تصميم ووردبريس مخصص، فهناك فقط طرق قليلة تبدأ بها. يتبّع الكثير من مصممي الويب المحترفين هذه الخطوات: العصف الذهني (brainstorm)، والحصول على فكرة عما يجب بناؤه، وكيف ينبغي أن يبدو التصميم. تصميم إطارات تخطيطية (wireframe) وتصميم موقع الويب ببرنامج فوتوشوب (Photoshop). تحويل ملف بصيغة PSD الناتجة من برنامج الفوتوشوب إلى قالب HTML / CSS. إضافة HTML / CSS إلى ووردبريس المثّبت. إضافة الوظائف (functionality) وعناصر ديناميكية (dynamic elements) مثل المدونة، والمتجر الإلكتروني. يبدأ بعض مصممو الويب مباشرةً بـ HTML / CSS ثم ينتقلون إلى ووردبريس، بينما ينتقل آخرون مباشرةً من صيغة ملف الفوتوشوب PSD إلى ووردبريس، وهي طريقة فعّالة بالفعل للعمل! ومع ذلك، يبدأ مصممو الويب الأذكياء وذوي الخبرة بقالب (theme) أو إطار عمل (framework) منذ البداية، واختيار التصميم (layout) والوظائف (functionality)، وتصميم الموقع بناءً على ذلك. يمكن القول أنّ هذه هي الطريقة هي الأكثر إنتاجية وفعالية لإنشاء المواقع. يؤمنون وبشدّة في ‏1stWebDesigner بهذا النهج. مثلًا، استغرق تصميم 1stWebDesigner السابق منهم أكثر من عام حتى الاكتمال عندما فعلوا ذلك بطريقة "تقليدية" بدءًا من الرسومات الأوليّة (sketching)، وتصميم الرسوم التخطيطية (wire framing)، وكتابة الشيفرة البرمجية المخصصة إلى ووردبريس. ومع ذلك، فإعادة تصميم موقع 1stWebDesigner حديث العهد لم يستغرق منهم سوى أسبوعين حتى الجهوز. بدأوا باستخدام إطار عمل Genesis، المخصص لقوالب ووردبريس، واختاروا قالبًا فرعيًا (child theme) بالتخطيط (layout) الذي أرادوه، وخصّصوا التصميم وأضافوا الوظائف (functionality)، وانتهوا من إعادة التصميم. هذا ما تعنيه الفعالية. يعد إنشاء قالب ووردبريس المخصص خيارًا جيدًا إذا كنت تعمل مع عملاء ذوي رواتب عالية، ومستعدين لدفع تكاليف الحلول المخصصة. تعدّ الشيفرة البرمجية المخصصة (custom code) ضرورية لبناء التطبيقات، وبرامج الويب، ومواقع العلامات التجارية الكبيرة جدًا. في هذه الحالات، لن تستخدم ووردبريس نهائيًا، ومع ذلك، فمعظم العملاء لا يحتاجون إلى ذلك. ما يحتاجونه هو موقع أعمال بسيط يحقق أهدافهم. لن يقدّروا شيفرتك النظيفة جدا (clean code) بقدر ما يقدّرون تسليم المشاريع السريع، وموقع الويب الذي ساعدهم في كسب المزيد من المال. ماذا يوجد خلف الكواليس؟ ما اطار عمل قوالب ووردبريس (WordPress theme framework)؟ قبل البدء في اختيار إطار عمل (framework) أو استخدامه مباشرةً، من المهم أن تفهم بالضبط ما هو إطار العمل وما يمكن أن يفعله لك. إطار عمل ووردبريس هو عبارة عن قالب ووردبريس متقدم مع بعض الإمكانيات، بكل بساطة. كلما طوّرت موقع ويب، فغالبًا ما تستخدم نفس المكونات (components). ستبدأ بالأساسيات، ثم تختار التصميم والتخطيط (layout) لـ (الترويسة [header]، والتذييل [footer]، صفحة ذات عمود واحد [single column]، وصفحة ذات عمودين). بعد ذلك، تبدأ بالعمل على الوظائف الرئيسية، مثل: المتجر الإلكتروني، وصفحة المبيعات، وصفحة العضوية (membership)، والمدونة. أخيرًا، عليك التفكير في إنشاء وظائف إضافية، مثل نماذج الاتصال (contact form) والحماية (security) وتحسين موقعك لمحركات البحث (SEO) وتجاوب موقعك لجميع الأجهزة (responsiveness). أطر عمل ووردبريس هي قوالب مبدئية (starter themes) تستخدمها أساسًا لإنشاء تصميماتك المخصصة. تسرّع أطر العمل عملية تطوير الموقع تسريعًا ملحوظًا. باعتبارك مطور ويب يعمل باستمرار على إنشاء قوالب ووردبريس مخصصة، فربما تكون قد سئمت من كل هذه المهام المتكررة، مثل كتابة نفس الشيفرة البرمجية مرارًا وتكرارًا، والتحقق من منها تحققًا مستمرًا. توفّر أطر عمل القوالب الكثير من الوظائف الجاهزة (built-in) وخيارات التخصيص، لذلك لا تحتاج إلى كتابة الشيفرة البرمجية لكل شيء من الصفر. صُمّمت أطر العمل بقوالب من نوع "أب" (parent theme) تستخدم هذه القوالب نقطة انطلاق لإكمال التصميم. هذه القوالب (قوالب الأب) هي الأساس الذي لا يُمس. يمكنك استخدام قالب الابن لإنشاء تصميماتٍ فريدةٍ ووظائفٍ إضافية. لماذا يستخدم مصممو الويب والمطوّرون أطر عمل ووردبريس؟ السبب الأكبر لاستخدام المصممين لإطار العمل هو تسريع عملية التطوير. تقلِّل أطر عمل القوالب على وقت التطوير تقليلًا عظيمًا؛ لأنك لست بحاجة إلى البدء من الصفر. يمكنك استخدام إطار العمل نقطة انطلاقة لتصميم قالبك النهائي، ثم يمكنك إضافة وظائف باستخدام وحدات (modules) مختلفة، مثل وظيفة السحب والإفلات (drag and drop)، وشريط التمرير (sliders)، والمتاجر الإلكترونية. يمكنك غالبًا الوصول إلى الوظيفة عن طريق تفعيل شيفرات برمجية قصيرة جاهزة (built-in) في إطار عمل ووردبريس. بدلاً من إنشاء قالب وكتابة شيفرته البرمجية من الصفر، يمكن أن يكون إنشاء موقع ووردبريس بسيطًا كإنشاء ملف تنسيقات style.css جديد، وتخصيص بعض الوظائف، وإضافة عناصر مرئية (visuals) يحتاجها عميلك. ثم، هأنتَ ذا انتهيت من الموقع! سيكون عميلك راضيًا بسبب التسليم السريع! من ناحية أخرى، ستكون سعيدًا لأنك اخترقت طريقك للتوّ من خلال عملية التطوير، وأنشأت موقع الويب الذي يريده العميل بسرعة فائقة! يمكنك الآن استثمار وقت إضافي في العمل مع عميلك والتأكد من أنّ موقع الويب هذا يحقق أهداف عميلك ويأتي بالنتائج الصحيحة. فوائد وعيوب استخدام إطار عمل ووردبريس إنها حقيقة أنه سيكون هناك دائما إيجابيات وسلبيات لقرارك. إيجابيات استخدام إطار عمل ووردبريس: توفير الوقت، وفعالية التطوير، والسرعة، وسهولة التطوير. كما ذُكر سابقًا أنه باستخدام إطار عمل القالب يمكن أن يقلّل وقت التطوير تقليلًا عظيمًا، ويسمح لك بتسليم العمل بسرعة. دعم قوي، ومجتمع من مطوري ووردبريس ذوي الخبرة. تحتوي أطر عمل ووردبريس الأكثر شهرةً على مجتمع ضخم ورائها، مما يساعدك على إصلاح الأخطاء وإيجاد الحلول بسرعة. الوظائف الجاهزة (built-in functionality). إضافة وظيفة فعالّة سهل للغاية مع التكامل الذي توفرّه متاجر القوالب الكبيرة. جودة الشيفرة البرمجية. تًكتب الشيفرات البرمجية باستخدام أفضل ممارسات ومعايير ووردبريس. وتكون شيفرات HTML و CSS و PHP محسّنة، كما أنها مُحسنة بأكبر قدر لمحركات البحث. الترقيات. سهولة التحديثات للإصدارات المستقبلية من ووردبريس ولا داعي للقلق بشأن ذلك. سلبيات استخدام إطار عمل ووردبريس: منحنى التعلم، سيستغرق الأمر بعض الوقت لإتقان أيٍّ من هذه الأطر. التكلفة، إطار العمل أغلى قليلاً من القالب المدفوع، لكنه يستحق ذلك. القيّود، تحدّد أطر العمل ما تستطيع وما لا تستطيع فعله. لا يمكنك كسر هذه الحواجز. يمكن أن يكون هذا عيبًا بالنسبة للمصممين المبتكرين الفائقين، لكن في معظم الحالات، يكون إيجابيًا وليس سلبيًا. شيفرات برمجية لا داعي لها، تأتي أطر العمل مع الكثير من الوظائف الجاهزة (built-in) التي قد لا تحتاجها. قد يؤدي هذا إلى إبطاء موقعك إذا لم تكن حريصًا على التخلّص من الخصائص التي لا تحتاجها. هل يجب عليّ استخدام إطار عمل ووردبريس؟ على الرغم من وجود منحنى تعليمي إضافي وتكلفة إضافية مأخوذة في الحسبان، يجب عليك حتمًا استخدام إطار عمل القوالب إذا كنت جادًا في تطوير مواقع ووردبريس. ستزداد سرعتك وسيتحسّن أداؤك تحسنًا كبيرًا قد يصل إلى عشرة أضعاف! ستكون قادرًا على التعامل مع عملاء أكثر وأفضل. علاوة على ذلك، سوف تكون قادرة على تلبية احتياجات عملائك وقضاء المزيد من الوقت في فهم أهدافهم، ستستطيع تنمية عملك من خلال القيام بذلك (استخدام أطر عمل القوالب). بناء موقع من الصفر يشبه بناء منزل دون مُخطّط (blueprint). في المقابل فالبدء بإطار عمل يشبه استخدام مُخطّط. سأل كاتب المقال نيكولاس تارت، وهو مصمّم يتمتع بخبرة 5 سنوات، عن رأيه في "وجوب استخدام إطار عمل" فأجاب نيكولاس: إنها حقيقةٌ لا تحتاج إلى كثير من التفكير في وجوب استخدام ووردبريس ووجوب تعلّم إطار عمل أو قالب مبدئي (starter theme) لخدمة عملائك خدمة جيدة. يركّزون في موقع ‎1stWebDesigner‎‎‎‎‎ بشِدّة على التوصية بووردبريس لمساعدتك أن تكون مستقلًّا ناجحًا. بالنسبة لمعظم المصممين المستقلّين، فمشكلتهم ليست في ضعف معرفة البرمجة والتصميم، ولكنها في ضعف مهاراتهم التجارية. سيدفع لك العملاء مقابل النتائج التي ستريهم إياها على هيئة موقع ويب. للقيام بذلك، تحتاج إلى تقليل التركيز قليلًا على التقنية وعليك بتعلم بعض مهارات التسويق. ترجمة -وبتصرف- للمقال Why You Should Choose WordPress من كتابة فريق التحرير بالموقع
    1 نقطة
×
×
  • أضف...