Sam Ahw

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

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

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

  • Days Won

    9

السُّمعة بالموقع

536 Excellent

المعلومات الشخصية

  • النبذة الشخصية Software Engineer

6 متابعين

  1. يجب عليك حذف منصات SDK المثبتة مسبقاً والتي يمكنك إيجادها ضمن المسار التالي: ~\Android\Sdk\platforms وإعادة تحميلها من جديد من خلال SDK Manager. في حال لم تتم حل المشكلة، يمكنك تحديث Gradle ضمن مشروعك: في الملف android/build.gradle: buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.0.2' // قم بتحديث النسخة لأحدث نسخة موجودة ... } } ضمن الملف android/gradle/wrapper/gradle-wrapper.properties: distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip # تحديث رقم النسخة هنا أيضاً
  2. أبسط طريقة هي باستخدام مكتبة image_picker، حيث تحتوي خاصية imageQuality وهي قيمة رقمية يمكنك تعديلها بشكل فوري: ImagePicker imagePicker = ImagePicker(); PickedFile compressedImage = await imagePicker.getImage( source: ImageSource.gallery, imageQuality: 75, ); أو يمكنك أيضاً كتابة حد أعظمي لأبعاد الصورة كي لا تتجاوزه بكتابة الخاصيتين maxWidth و maxHeight: PickedFile compressedImage = await imagePicker.getImage( source: ImageSource.gallery, maxHeight: 200, maxWidth: 200 ); ); وأيضاً يوجد حزمة من الأدوات ضمن مكتبة الصور في لغة البرمجة Dart والتي يمكنك استخدامها مع المكتبة path_provider لتحقيق ذلك، مثال: import 'package:image/image.dart' as Im; import 'package:path_provider/path_provider.dart'; import 'dart:math' as Math; void compressImage() async { File originialImage = await ImagePicker.pickImage(); final tempDir = await getTemporaryDirectory(); final path = tempDir.path; int randomTitle = new Math.Random().nextInt(10000); Im.Image image = Im.decodeImage(originialImage.readAsBytesSync()); Im.Image smallImage = Im.copyResize(image, 500); var compressedImage = new File('$path/new_$randomTitle.jpg')..writeAsBytesSync(Im.encodeJpg(image, quality: 85)); } حيث نقوم بضغط الصورة المطلوبة من خلال التابع copyResize وهنا وضعنا القيمة التجريبية 500. يمكنك الاطلاع على المزيد من التفاصيل والأدوات من توثيق المكتبة image_picker أو حزم التعامل مع الصور ضمن لغة dart.
  3. يتم تحديث المحتوى باستمرار ضمن كافة دورات أكاديمية حسوب، ولكن حتماً ستبقى وتيرة التحديث ضمن المكتبات نفسها ولغات البرمجة أسرع من أي محتوى مسجّل على الانترنت. وبما أن طريقة الشرح تعتمد على التطبيق الواقعي وليس الأمور النظريّة، قد تتطلب هذه التحديثات بعض الوقت لإضافتها. أما في حال واجهتك أي مشكلة برمجية أو خطأ أثناء متابعتك للدروس والتطبيق العملي جراء هذه التحديثات، يمكنك متابعة التعليقات أسفل الدروس وكتابة تعليقك الخاص مع ذكر تفاصيل المشكلة وسيقوم فريق المدربين بمساعدتك وتقديم الحل بشكل مباشر. كما أنصحك باستخدام نفس النسخ والإصدارات من المكتبات أو أطر العمل التي يستخدمها المدربون ضمن الدروس لتلافي هذه الأخطاء قدر المستطاع.
  4. بالنسبة لنقل المشروع إلى جهاز آخر أو نشره، ستجد خيارين عند النشر ضمن Deployment Mode: 1- Framework-Dependent: والتي تعني أنه سيتم فقط نقل حزم ومكاتب محددة الخاصة بالتطبيق إلى مكان النشر. 2- Self-Contained: والتي ستقوم بنسخ كافة ملفات .NET Core runtime وجميع المكتبات الأخرى اللازمة لعمل التطبيق. أما عن آلية تشغيل مواقع الويب ASP.net على خادم IIS: تأكد من تحميل حزمة .NET Core Hosting على خادم IIS والتي تحوي كل من NET Core Runtime و .NET Core Library و ASP .NET Core Module لتسمح بتشغيل مواقع .NET Core على خادم IIS. وبعدها قم بإعادة تشغيل الجهاز والخادم، ثم بعد تهيئة الإعدادات اللازمة لعمل الموقع مثل تحديد مسار الملف واسم النطاق localhost والأمور الأساسية، توجه لمشروع وقم بنشره publish إلى مجلّد (Folder) ثم نضع المسار الذي قمت بتحديده سابقاً في إعدادات الخادم. وسيقوم بدوره بتوليد الملف web.config ضمن مجلّد المشروع بشكل تلقائي. ملاحظة: في حال لم تتمكن من تشغيل الموقع الرجاء كتابة الخطوات التي حاولت تنفيذها ورسائل الخطأ التي تظهر لك بوضوح لنستطيع مساعدتك بشكل أفضل في المستقبل.
  5. في حال لا ترغب باستخدام مكاتب إضافية، يمكنك استخدام التابع setInterval في جافاسكريبت والذي يقوم بالتنقّل بين الشرائح أو الصور خلال فترات زمنية معيّنة بشكل تلقائي: مثال بسيط بفرض لديك الشرائح التالية: <div class="carousel"> <div class="carousel-item"> <div class="red"></div> </div> <div class="carousel-item"> <div class="green"></div> </div> <div class="carousel-item"> <div class="yellow"></div> </div> <div class="carousel-item"> <div class="violet"></div> </div> </div> التنسيق المبدئي للشرائح (يمكنك تغييرها أو استبدالها بصور حسب المطلوب): * { box-sizing: border-box; } .carousel { position: relative; width: 400px; height: 270px; overflow: hidden; background-color: #cdcdcd; } .carousel .carousel-item { position: absolute; width: 100%; height: 270px; border: 1px solid #2e2e2e; top: 0; left: 100%; } .carousel .carousel-item.active { left: 0; transition: all 0.3s ease-out; } .carousel .carousel-item div { height: 100%; } .carousel .carousel-item .red { background-color: red; } .carousel .carousel-item .green { background-color: green; } .carousel .carousel-item .yellow { background-color: yellow; } .carousel .carousel-item .violet { background-color: violet; } وبعد ذلك يتم استدعاء شيفرة جافاسكريبت التالية للتنقّل بين الشرائح: window.onload = function(){ var slides = document.getElementsByClassName('carousel-item'), addActive = function(slide) {slide.classList.add('active')}, removeActive = function(slide) {slide.classList.remove('active')}; addActive(slides[0]); setInterval(function (){ for (var i = 0; i < slides.length; i++){ if (i + 1 == slides.length) { addActive(slides[0]); slides[0].style.zIndex = 100; setTimeout(removeActive, 350, slides[i]); if (slides[i].classList.contains('active')) { slides[i].removeAttribute('style'); setTimeout(removeActive, 350, slides[i]); addActive(slides[i + 1]); break; } } }, 4000); } يمكنك التحكّم بزمن تأخير الانتقال بين الشرائح بتعديل القيمة 4000 الموجودة في التابع setInterval.
  6. لا يمكن تحديد أسباب الرفض فهي غير محدودة، ولكن يجب عليك اتباع الإرشادات الموجودة في الموقع حسب المنتج الذي ترغب بنشره، فكل منتج له قواعد معيّنة يجب اتباعها يوجد متطلبات واضحة لكل منتج، ويمكنك الوصول إليها بكتابة المتطلبات أو requirements مع نوع المنتج لديك فمثلاً إذا كان لديك صفحات bootstrap يمكنك البحث عن Bootstrap Skins Category Requirements وهكذا في حال كان لديك تطبيق موبايل أو غيره. أما بالنسبة للخطوط والهوامش وjQuery، فلا يوجد قيم معيّنة مفروضة لذلك وإنما يجب على التصميم أن يكون متاجوب بشكل كامل على كافة المتصفحات والأجهزة والشاشات، ومراعاة جميع القواعد ضمن أطر العمل التي تستخدمها (مثلاً في bootstrap يجب عليك اتباع Bootstrap core styling). وفي حال استخدمت أي مكتبة خارجية ضمن jQuery يجب عليك كتابة شرح كامل عن استخدام هذه المكتبة بالإضافة لوضع تعليقات ضمن الشيفرة البرمجية توضّح كل قسم لديك وما الغرض منه. هذه القواعد وغيرها هي لضمان جودة المنتجات التي يتم نشرها واستخدامها، ويمكنك البحث عنها ضمن الموقع.
  7. إن مفهوم البرمجة الكائنية أو object oriented هو مفهوم موجود في جميع لغات البرمجة، وبمجرّد فهمك له ستستطيع تطبيقه في جافاسكريبت وغيرها من لغات البرمجة. عندما يتواجد لديك مجموعة من الخصائص المرتبطة ببعضها، من الأفضل تجميعها ضمن كائن. فمثلاً إذا كان لديك صفات الاسم، العمر، العنوان،..إلخ وكل هذه الصفات تابعة لشخص (أو مستخدم): var name = "Ahmad" var age = 30 var address = "any address 123" يمكنك تجميعها ضمن غرض واحد لتصبح بالشكل التالي: var person = { name: "Ahmad", age: 30, address: "any address 123" } وبنفس الطريقة بالنسبة للتوابع، في حال كانت تتشارك حول محور معيّن أو مهمة معيّنة، يمكنك تجميعها معاً ضمن كائن واحد. وذلك سيساعد أي مطوّر يقرأ الشيفرة البرمجية، لأن هذه الصفات مرتبطة ببعضها وتعبّر جميعها عن الكائن نفسه، ولا معنى لها بتواجدها بشكل مستقل. يمكنك الاطلاع على المزيد الأمثلة والتفاصيل حول البرمجة الكائنية وطرق استخدامها في الشيفرة البرمجية في المقال التالي:
  8. يمكنك طلب تزويدك بتوثيق لخطوات الدمج من قبلهم، كما أنك لن تحتاج لبناء موقع ويب كامل بخصائص أخرى، يكفي وجود خادم ويب لمعالجة هذه العملية وحفظ البيانات اللازمة لتطبيقك في قاعدة البيانات.
  9. في حال قمت بتحويل الصورة إلى النمط svg يمكنك إدراج شيفرة جافاسكريبت ضمنها باستخدام الوسم CDATA والاستجابة لنشاط المستخدم داخلها، مثال بسيط: <svg width="600" height="600"> <script type="text/JavaScript"> <![CDATA[ function showColor() { alert("Color of the Rectangle is: "+ document.getElementById("rect1").getAttributeNS(null,"fill")); } function showArea(event){ var width = parseFloat(event.target.getAttributeNS(null,"width")); var height = parseFloat(event.target.getAttributeNS(null,"height")); alert("Area of the rectangle is: " +width +"x"+ height); } ]]> </script> <g> <text x="30" y="50" onClick="showColor()">show rectangle color.</text> <rect id="rect1" x="100" y="100" width="200" height="200" stroke="green" stroke-width="3" fill="red" onClick="showArea(event)"/> </g> </svg> يعتبر النمط SVG أفضل للحفاظ على تجاوبية الرسم مع اختلاف أحجام شاشات العرض، ولكن ذلك قد يتطلب منك معرفة إضافية بالتعامل مع SVG للوصول إلى العناصر المطلوب التفاعل معها.
  10. لقراءة الملف: يجب أن تقوم أولاً بتحديد مسار الملف، ثم قراءة المحتوى باستخدام الدالة readlines وإرساله إلى المستخدم كالتالي: root = os.path.realpath(os.path.dirname(__file__)) json_path = os.path.join(root,'myfile.json') {% قم بتغيير المسار حسب تموضعه ضمن مشروعك %} myfile = open(json_path) json_data = myfile.readlines() myfile.close() return json_data وللكتابة على الملف، يمكنك استخدام الدالة dump الموجودة ضمن مكتبة json: with open('myfile.json', 'w') as f: json.dump(data, f) {% مع استبدال المتغيّر data بالبيانات المطلوبة %} يمكنك أيضاً الاطلاع على المزيد من الخصائص والأمثلة التي تقدمها هذه المكتبة من التوثيق الرسمي.
  11. بما أنك ستحتاج موقع على الويب (بغض النظر عن لغة البرمجة) فنعم ستحتاج لاستضافة للموقع واسم نطاق (دومين). أما بالنسبة للغة البرمجة أو التقنية المطلوبة ضمن الموقع فيجب عليك التواصل معهم لمعرفة لغات البرمجة المدعومة من قبلهم والخطوات التفصيلية لعملية الدمج. بعض وسائط الدفع لا تدعم التكامل المباشر مع طرف المستخدم وهنالك وسائط أخرى تحتاج لآلية توثيق معيّنة (خادم إلى خادم) لذلك قد يطلب منك وجود موقع الكتروني أو ببساطة (خادم ويب) يستطيع إجراء هذه العملية مع وسيط الدفع.
  12. كما في التعليق السابق يتم استخدام نسب مئوية ليتناسب العرض مع عرض الشاشة. وعندما نرغب بتغيير العرض والطول معاً عند تغيير حجم الشاشة نستخدم بالإضافة لذلك height: auto ليبقى الطول متناسق مع العرض (وهو الشكل التلقائي) كالتالي: .res-img { width: 100%; height: auto; } في حال أردنا من الصورة أن تزداد في الطول فقط دون أن تصبح أكبر من حجم الشاشة، نقوم بكتابة الحد الأعظمي لعرض الصورة: .res-img { max-width: 100%; height: auto; } كما يمكننا وضع حد أعظمي للصورة لكي لا تتجاوزه مهما كبر بعدها حجم الشاشة، وذلك يستخدم للتعامل مع شاشات الأجهزة الكبيرة: .res-img { width: 100%; max-width: 400px; height: auto; } ويمكنك البحث على خصائص object-fit في CSS للتحكم بطريقة عرض الصورة نفسها.
  13. Arithmetic Operators أو العمليات الحسابية في الجافاسكريبت هي: + , - , * , / , % هل قمت بمحاولة حل السؤال؟ أرجو أن تنشر الطرق التي جربتها والناتج الذي ظهر معك
  14. حاول التأكد من إعادة كتابة التنسيقات لتتوافق مع النسخة الخامسة. وتأكد من أنه تم تضمين جميع ملفات بوتستراب اللازمة في حال قمت بتحميله من خلال Nuget أو بطريقة مباشرة. إذا لم تستطع حل المشكلة يجب عليك ذكر المزيد من التفاصيل وأجزاء الشيفرة البرمجية من مشروعك المتعلقة بتضمين المكتبة ورسالة الخطأ التي تظهر لك كما هي لنستطيع مساعدتك بشكل أفضل.
  15. يتم شطب الدوال التي تم تحديثها وإهمالها في النسخ الحديثة من android. وهذه الدالة أصبحت مهملة وتم استبدالها بالدالة registerForActivityResult حيث كانت الطريقة السابقة كالتالي: public void openSomeActivityForResult() { Intent intent = new Intent(this, SomeActivity.class); startActivityForResult(intent, 123); } @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == 123) { doSomeOperations(); } } والتي يمكن استبدالها لتصبح بالشكل التالي: ActivityResultLauncher<Intent> someActivityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); doSomeOperations(); } } }); public void openSomeActivityForResult() { Intent intent = new Intent(this, SomeActivity.class); someActivityResultLauncher.launch(intent); } للمزيد من التفاصيل والأمثلة يمكنك مراجعة التوثيق الرسمي والبحث عن الدالة registerForActivityResult