طارق جهاد

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

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

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

  • Days Won

    17

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

94 Excellent

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

7 متابعين

  1. يوجد عدة طرق بإمكانك استخدام ابسط طريقة وهي: 1. قراءة id المستخدمين بشكل غير مكرر. 2. قراءة الرسائل من جدول الرسائل بناءاً على النتيجة السابقة SELECT * FROM Messages WHERE UserId IN (SELECT DISTINCT UserId FROM Messages) بالتوفيق،،،
  2. اخي الكريم، اخبرتك باستخدام Retrofit بالرابط المرفق، يوجد بالرابط تفاصيل عمليات Post, Get, Put,Delete وغيرها.
  3. انت بحاجة لاستخدام Http Client لتتمكن من التواصل مع خدمات الويب. للاندرويد استخدم مكتبة Retrofit https://square.github.io/retrofit/ الإشعارات المتزامنة: Push Notifications انت بحاجة لاستخدام GCM Google Cloud Messaging وهي خدمة سحابية. حيث ستقوم بإنشاء مشروع على هذه المنصة، ثم تقوم هي بإرشادك لضبط الإعدادات، ضمن الاندرويد. الفكرة ببساطة، انك ستقوم بتسجيل جهازك او Installation Id الخاص بجهازك على هذه المنصة، بالتالي يصبح جهازك قادر على استقبال الاشعارات. وعند استقبالك للاشعار ضمن اندرويد بإمكانك معالجته باكثر من طريقة. بالتوفيق،،،
  4. وعليكم السلام ورحمة الله. اخي الكريم فكر بالمثال التالي: ليكن لدي نموذج لتسجيل المستخدمين ضمن تطبيق معين، ومن ضمن حقول هذا النموذج يوجد حقل تاريخ الميلاد والذي هو حقل اختياري وليس اجباري. بمعنى يمكن للمستخدم تحديد تاريخ ميلاده او عدم تحديده. الآن، لنفرض اسم الحقل هو BirthDate ونوعه بالتأكيد DateTime DateTime BirthDate; الآن لدينا حالتين: 1. قام احد المستخدمين بالتسجيل، وتحديد تاريخ ميلاده 1/1/1990، لاحقاً سيقوم التطبيق بحساب عمر المستخدم بناءً على تاريخ الميلاد فيكون عمره حالياً 29 عاماً. 2. قام احد المستخدمين بالتسجيل، ولم يحدد تاريخ ميلاده! لكن قاعدة البيانات ترفض ان يكون هذا الحقل فارغاً، لذلك ستقوم انت او السي شارب نفسها بإعطاء القيمة الافتراضية لهذا النوع DateTime وستكون 1/1/0001، لاحقا سيقوم التطبيق بحساب عمر المستخدم، فيكون عمره الحالي 2019 عاماً!!!، او ربما تقوم انت بافتراض قيمة معينة في حال لم يقما المستخدم بادخال القيمة، مثلاً، 1/1/1980، بالتالي سيكون عمر المستخدم 39 عاماً، لكن هذا غير صحيح، وسيظهر بشكل ان المستخدم قام بتحديد تاريخ ميلاده. بالتالي ستضطر لحل اخر وهو كالتالي: تقوم بتعريف متغير جديد من نوع bool وليكن اسمه IsBirthDateSelected، وفي حال قام المستخدم بتحديد تاريخ ميلاده تكون قيمة هذا المتغير True وعلى هذا الاساس سيقوم التطبيق باحتساب عمر المستخدم، واذا كانت False لن يقوم باحتساب عمر المستخدم!!! لكن ألا ترى أن هذه العملية مرهقة، خصوصاً اذا كان لديك عشر متغيرات اختيارية ضمن نموذج التسجيل هذا!، وربما في كامل التطبيق يكون لديك عشرات الحالات المشابه، وستضطر انت دائما لعمل تزامل بين قيمة BirthDate وقيمة IsBirthDateSelected، وهذا العمل كلياً هو زيادة بالكود لا اكثر، فقط لتقوم بالالتفاف على نقطة ان قيمة تاريخ الميلاد فارغة، وان الحقل BirthDate يتطلب وجود قيمة. اذا الحل الامثل هو بجعل الحقل BirthDate قادر على ان يحمل قيمة فارغة، اي Nullable، ضمن سي شارب هذا يتم ببساطة بتعريف المتغير بالشكل التالي: DateTime? BirthDate; لاحظ وضعنا اشارة الاستفهام بجانب النوع،اي اصبح قادرا على احتواء قيمة فارغة، الآن ضمن التطبيق، انت بحاجة لمعرفه اذا كان هذا الحقل يحوي قيمة أم لا، ويتم ذلك بواسطة: if( BirthDate.HasValue) { // Calculate Age DateTime BirthDate = new DateTime(); int age = ((DateTime.Now - BirthDate.Value).Days) / 365; } لاحظ اننا قمنا بالتحقق من ان الحقل يحوي على قيمة او لا أولاً، ثم داخل جملة If قمنا بالوصول لهذه القيمة عن طريق BirthDate.Value اعتقد بأن الصورة اصبحت واضحة. الآن قم بقياس هذا المثال على باقي الأنواع الأخرى مثل int، bool, double وغيرها. بالتوفيق،،،
  5. بالتأكيد اخي الكريم، يوجد تطبيقات عربية مثل كريم، وطلبات وغيرها، لكن المنافسة في الغرب اقوى بالتاكيد
  6. نعم اخي الكريم يمكنك اختراق المواقع الكبرى، ولكنك بحاجة لمعرفة توازي او تتفوق قليلا على مطوري هذه المواقع. بالتوفيق،،،
  7. أخي الكريم، الأعضاء هنا في الأكاديمية يحاولون المساعدة أو يبحثون عنها لذلك يرجى توضيح سؤالك بشكل جيد أولاً، وتجنب تكرار الأسئلة حتى نحافظ على الأسئلة بشكل منظم ومرتب يستفيد منه باقي الأعضاء. بالتوفيق،،،
  8. بالطبع ليست thread واحدة، كما ذكرت Thread Pool ضمن سيرفر IIS يحوي تقريبا على 5000 thread، يمكنها استقبال الطلبات، ولكن بدل ان تنشغل إحدى هذه thread بالقراءة مثلا من قاعدة البيانات، فإنها تسليم العملية ل Thread اخرى، يتولى نظام التشغيل بإنشائها واسناد كل ما تحتاجه من مصادر. بينما تعود ال thread الاساسية إلى Thread Pool وتكون جاهزة لأداء مهمات اخرى، طبعا كل الكلام السابق يتم ضمن اجزاء من الثانية، اضف إلى ذلك ان نظام التشغيل مسؤول عن تنظيم عمل هذه ال threads لذلك يطلق عليه ايضا اسم Scheduler وهو ايضا المسوؤل عن ترتيب هذه ال threads لإدخال للمعالج لتنفيذها، لذلك يسمى ايضا Dispatcher او الموزع. كل ما انت بحاجة معرفته، انه من الافضل توزيع المهام على threads بحيث يمكن تسمية التطبيق عندها Multi-Threading Application اذا عملت في برمجة تطبيقات الويندوز او سطح المكتب، وكان لديك عملية طويلة نسبيا مثل القراءة من قاعدة البيانات، ستجد ان الواجهة ستتجمد لحين انتهاء القراءة من قاعدة البيانات، والسبب هو ان التطبيق افتراضيا يملك thread واحد، هي المسوؤلة عن ادارة او تنفيذ التطبيق على CPU، بالتالي عندما تنشغل هذه thread بالقراءة من قاعدة البيانات، لا يعود بإمكانها إدارة الواجهة، لذلك تتجمد الواجهة. والحل بالطبع هو استخدام thread اخرى للقراءة من قاعدة البيانات، وإبقاء ال thread الاساسية مسؤولة عن عرض واجهات المستخدم فقط. بهذا الشكل يصبح التطبيق متجاوب Responsive ملاحظة: عندما تتجمد الواجهة كما ذكرنا، ليست المشكلة في المعالج او نظام التشغيل، لانك لو شاهدت Task Manager ستجد ان المعالج مستخدم بأقل من 10%، اذا باستطاعته تنفيذ العديد من threads الأخرى بنفس اللحظة، وهي مهتمك في انشاء هذه ال threads، ومهمة نظام التشغيل والمعالج في ترتيبها وتنفيذها. في علوم الحاسوب دائما يستخدم مصطلح Resources للدالة على استخدام الذاكرة واستخدام المعالج، بمعنى كل Thread لدينا يقوم نظام التشغيل بحجز مكان لها في الذاكرة وترتيب الية دخولها إلى CPU لتنفيذها، وهذا امر طبيعي ولا يؤدي إلى عطل في السيرفر، باستثناء كان الكود الذي يتم على تنفيذه هو من يستهلك مصادر الجهاز الاخرى، مثل كتابة كمية كبيرة من البيانات على الهارد يسك، هذا يؤدي إلى بطىء بعمل النظام بشكل عام. لكن في النهاية كل ما يحدث ضمن السيرفر او اي كمبيوتر، هو مرور منظم للتيار الكهربائي وخاصة ضمن المعالج. انت تقصد GPU وهو معالج خاص بالرسوميات، لأنها تستهلك من مصادر النظام، لذلك تم فصل عمل الرسوميات بمعالج مخصص لها. وإبقاء CPU لمعالجات العمليات الأخرى. في أنظمة مثل Linux server قد لا يكون هناك واجهة رسومية اطلاقا حتى لا يتم استهلاك مصادر الحاسوب بسبب رسوميات لا فائدة منها على السيرفر، لان المستخدم لا يتفاعل مباشرة مع السيرفر، لذلك يتم ادارة السيرفر عن طريق Shell او Command Prompts ايضا ضمن ويندوز سيرفر ستجد ان الواجهات ليست بالكفاءة الموجودة على الويندز العادي، لنفس السبب أيضا. اخيراً: كل هذا التعقيد لا يفيد كثير اثناء تطويرنا للتطبيقات، لان المسؤولية الكبرى تقع على عائق إدارة السيرفر. كل ما نحتاجة هو فهم عام لألية العمل، بالإضافة لإتباع التعمليات الخاصة بكل تقنية. فدائما يوجد حل لكل مشكلة، فحتى الشركات الكبرى مثل فيسبوك، لايمكن ان يقوم سيرفر واحد بتخديم كل هؤلاء المستخدمين، وإنما يتم توزيع الفيسبوك على مجوعة من السيرفرز. بالتوفيق،،،
  9. Remote Connection هو ببساطة اتصال بجهاز اخر، اي ليس Local Connection الأمر يعتمد على طبيعة او مكان وجود السيرفر ومكان وجود المستخدم في تطبيقات الويب، كل التطبيق تعمل ضمن بيئة local )ما لم يكن نظام موزع طبعاً( ويقوم بالرد على المستخدم. الآن لو كان الرد على المستخدم بشكل صفحة html وتحوي على كود جافا سكربت، مثلا ويقوم هذا الكود بارسال طلبات للسيرفر للتحقق من اي بيانات، او ارسال ajax request، بالطبع هذا لم يعد local وإنما remote ايضا لان السيرفر على جهاز والمستخدم على جهاز بالتوفيق،،،
  10. تجعله يتأخر وليست سبب بأن يتوقف بمعنى يتعطل! كل طلب يصل إلى السيرفر تقوم thread باستقبال هذا الطلب والبدء بمعالجته، يحوي السيرفر على ما يسمى ب thread pool، اي مجموعة من threads بانتظار استقبال الطلبات ومعالجتها، لإن إنشاء thread جديدة عن وصول كل طلب امر مكلف نسبياً، لذلك وجد مفهوم thread pool هذا. الآن، سيرفر مثل iis تقريبا يحوي على 5000 thread، تقوم thread بمعالجة الطلب والعودة لانتظار طلب جديد، بالتالي هناك حد معين لمعالجة الطلبات، خاصة اذا كانت المعالجة تتطلب وقت طويل نسبياً. لو فرضنا ان تم استهلاك جميع threads ضمن thread pool بنفس اللحظة، وكانت كل thread مشغولة بمعالجة طويلة نسيباً، هنا تصبح استجابة السيرفر بطيئة، لانه سيقوم بتسجيل الطلب بانتظار انتهاء احدى threads لمعالجته. لذلك هذه النقطة جوهرية جداً، وقد لا ينتبه لها البعض، الا لاحقاً عندما يصبح هناك ازدحام طلبات على التطبيق، لانه بالتأكيد الاستخدام العادي لا يشكل فرقاً كبيراً. الآن نأتي للشق الثاني من السؤال async، بالتأكيد هي الحل، لكن وبما اننا كنا نتكلم عن threads وبأن كل thread مسؤولة عن استقبال الطلب ومعالجته حتى النهاية، اذا تطبيقنا حاليا عبارة عن single threaded application والحل بأن يكون multi threaded application. وهكذا تصبح الية العمل تقوم thread باستقبال الطلب وتمريره مباشرة الى thread اخرى لتقوم بمعالجته، وتعود هي فورا لتخديم المستخدمين او الطلبات الجديدة دون انتظار معالجة الطلب، وإنما بمجر انتهاء معالجة الطلب، تقوم thread المخصصة للمعالجة باخبار ال thread الاساسية بأنها انتهت، لتقوم بدورها بالرد على المستخدم. شاهد هذا المثال من بيئة ASP.NET Core public class NewsController : Controller { [HttpGet("news")] public async Task<IActionResult> News() { // Request now received by thread 1 for example. NewsViewModel model = new NewsViewModel(); // Request is being processed by another thread // The main thread now go back to serve another request/user // When the processing is finish, the thread will be informed. // and continue after that await model.GetNews(); // This code will not executed, until thread 2 finish its job return View(model); } } لاحظ كيف ان thread اخرى تقوم بمعالجة الطلب، واخبارنا عند انتهاءها. بالتوفيق،،،
  11. وعليكم السلام ورحمة الله. انت بحاجة إلى Web Service )فكر بها كموقع الكتروني( هي التي تقوم بتخزين بيانات المستخدمين وصورهم والمعالجة الاخرى للبيانات. الآن انت بحاجة لربط تطبيق الجوال مع هذه الخدمة Web Service، بحيث يقوم تطبيق الجوال بارسال بيانات لها، وهي تقوم بتخزين بيانات المستخدم ورفع الصور ووو. يتم التواصل بين تطبيق الجوال وبين الخدمة Web Service عن طريق Web API. يمكن انشاء هذه الـ Web API بإحدا تقنيات Server Side مثل PHP, Java, ASP.NET, Python, Ruby وغيرها. ويمكنك طلبها هذه الخدمة من اي تطبيق سواء كان تطبيقات جوال، تطبيقات سطح مكتب، او حتى تطبيقات ويب اخرى. بالتوفيق،،،
  12. بامكانك العمل على بيئة Untiy لتطوير الألعاب باستخدام سي شارب https://www.devu.com/tutorials/unity
  13. وعليكم السلام ورحمة الله. اخي الكريم بداية لتكن المقارنة دائما بهدف اختيار المناسب بدل ان تكون بهدف تحديد الافضل والدخول بجدالات عقيمة. هناك مجموعة اسئلة قد تسألها لنفسك لتحدد اي مسار يناسبك اكثر. 1. كم هو الوقت المتاح لك لتعلم تقنية او تقنيات جديدة؟ أرغب بالبدء بأسرع وقت بمشاهدة تطبيقاتي تعمل على اجهزة العملاء فهذا سيطعني دافع اكبر للتعلم والمواصلة )اذهب مع الخيار الثاني( لا مشكلة لدي بالوقت، المهم ان تكون تطبيقاتي متوافقة 100 % مع معايير غوغل وابل ومايكروسوف، مهما طال الوقت )اذهب مع الخيار الأول( 2. هل لديك العزيمة الكافية لتعلم ثلاث تقنيات متتالية بهدف انشاء تطبيق )اضف لها الميزانية الكافية( نعم اريد ان اتعلم الاندرويد بلغة الجافا، ثم انتقل إلى بيئة مختلفة تماما ولغة برمجة مختلفة تماما وابدء بتعلم سوفت و Xcode وابدء من الصفر في تطوير نفس التطبيق الذي طورته ضمن اندرويد، ثم اعيد نفس الكرة مع ويندوز )اذهب مع الخيار الأول( لا أريد ان تقل عزيمتي اثناء تعلمي هذه التقنيات ومواجهة مشاكل كل تقنية بحيث اقف عند نقطة ولا استطيع المتابعة، ولكن ارغب باستثمار وقتي وتطوير تطبيقات بتقنية واحدة ومواجهة المشاكل مرة واحدة، بحيث استطيع الانطلاق وبعدها قد افكر بتعلم كل تقنية على حدة )اذهب مع الخيار الثاني( 3. ما هي طبيعة التطبيقات التي تود تطويرها هل هي تطبيقات ألعاب، معالجة صور وفيديو او تطبيقات خدمية كالمتاجر الالكترونية وغيرها؟ تطبيقات معالجة الفيديو والصوت والتطبيقات التي تعتمد كثيراً على هاردوير الموبايل نفسه )اذهب مع الخيار الأول( التطبيقات الخدمية وتطبيقات التواصل الاجتماعي وتطبيقات معالجة البيانات )اذهب مع الخيار الثاني( تابع باقي الأسئلة مع نفسك، وستحدد بعدها اي تقنية/تقنيات مناسبة اكثر لك في الوقت والمتطلبات والامكانيات الحالية لديك، وتأكد دائما بأن هذا الامر قابل للتغيير وليس قرآناً. فقد تقوم بتغيير رأيك عند نقطة معينة وقد تغير التقنيات المستخدمة بل وقد تغير ما لا يخطر ببالك حالياً. بالتوفيق،،،
  14. بإمكانك تجربة هذا الكود: static void Main(string[] args) { bool isExit = false; do { // Ask the user Console.WriteLine("Do you want to enter grades?"); Console.WriteLine("Yes: Enter subject name"); Console.WriteLine("No: Enter 1"); // Check input if it is subject name (continue) or 1 (exist) string input = Console.ReadLine(); int number; isExit = int.TryParse(input, out number); // Input =1, exit if (isExit) return; // Continue enter grades Console.Write("Enter students count:"); int count = int.Parse(Console.ReadLine()); int[] grades = new int[count]; int sum = 0; for (int i = 0; i < count; i++) { Console.Write("Enter student " + (i + 1) + " grade:"); grades[i] = int.Parse(Console.ReadLine()); sum += grades[i]; } Console.WriteLine("--- REPORT ---"); Console.WriteLine("Subject Name: " + input); Console.WriteLine("Students Count: " + count); Console.WriteLine("Average: " + (sum / count)); Console.WriteLine("---------------------------"); Console.WriteLine(); } while (!isExit); } بالتوفيق،،،
  15. ما هي لغة البرمجة المطلوبة، اعتقد ++C؟