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

طارق جهاد

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

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

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

  • عدد الأيام التي تصدر بها

    17

إجابات الأسئلة

  1. إجابة طارق جهاد سؤال في كلاس واحد لجميع عمليات قواعد البيانات كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    تختلف العملية بحسب حجم المشروع، وبحسب التقنية التي تعمل عليها.
    ولكن أضعف الإيمان هي استخدام كلاس واحد، ولكن دعني اوضح بعض النقاط، لتطوير طبقة الاتصال بقاعدة البيانات بالشكل الأفضل.
    1. نقوم بتعريف الدوال (الميثودز) الخاصة بالقراءة والكتابة على قاعدة البيانات ضمن Interface وليكن اسمه IDataRepository
    2. نقوم بإنشاء كلاس، بحيث يرث من الـ Interface السابق، الآن تصبح لدينا تطبيق هذا الـ Interface او بمعنى اخر كتابة الكود الخاص بالاتصال بقاعدة البيانات.
    3. نقوم بتسمية الكلاس بإسم يوافق اسم التقنية او قاعدة البيانات التي نعمل عليها، لنفترض اننا نتعامل مع MySQL فيكون اسم الكلاس بالشكل التالي IMySqlRepository
    4. ضمن اقسام التطبيق لا نتعامل مع الكلاس مباشرة، بل نتعامل مع الـ Interface، بحيث يكون التطبيق لدينا بمعزل عن التقنية المستخدمة للتعامل مع قاعدة البيانات، بالتالي مستقبلا يمكن استبدال تقنية MySQL ب SQL Server، عندها نقوم بإنشاء كلاس جديد ISqlRepository، أو قد نتعامل مع ملفات XML فنقوم بإنشاء كلاس جديد ايضا IXMLRepository، دون اي تعديل على باقي اقسام التطبيق.
    وكنصيحة أخيرة، انصحك بإنشاء أكثر من Repository بمعنى كل قسم ضمن مشروعك يجب أن يكون له Interface وكلاس خاص به. على سبيل المثال، لو فرضنا انك تقوم بتطوير تطبيق مشتريات عبر الانترنت. فيمكنك عندها:
    1. إنشاء طبقة بيانات خاصة بقراءة المنتجات والبحث فيها (IProductRepository)
    2. إنشاء طبقة بيانات خاصة بالطلبات وسلة الشراء (IOrderRepository)
    3. إنشاء طبقة بيانات خاصة بالإدارة (IAdminRepository)
    طبعاً يمكنك إنشاء الطبقات بحسب حجم المشروع واقسامه، ولكن الفكرة هي بتقسيم المشروع إلى أقسام صغيرة قدر الإمكان، بحيث تسهل عملية التطوير أولاً، ويصبح بالإمكان التعديل على الجزئيات دون أن تتأثر باقي أقسام المشروع.
    سأرفق مثالاً عملياً بلغة سي شارب وقواعد بيانات SQL لاحقاً إن شاء الله
    بالتوفيق...
  2. إجابة طارق جهاد سؤال في ما هو ال remote connection كانت الإجابة المقبولة   
    Remote Connection
    هو ببساطة اتصال بجهاز اخر، اي ليس Local Connection
    الأمر يعتمد على طبيعة او مكان وجود السيرفر ومكان وجود المستخدم 
    في تطبيقات الويب، كل التطبيق تعمل ضمن بيئة local )ما لم يكن نظام موزع طبعاً( ويقوم بالرد على المستخدم.
    الآن لو كان الرد على المستخدم بشكل صفحة html وتحوي على كود جافا سكربت، مثلا ويقوم هذا الكود بارسال طلبات للسيرفر للتحقق من اي بيانات، او ارسال ajax request، بالطبع هذا لم يعد local وإنما remote
    ايضا لان السيرفر على جهاز والمستخدم على جهاز
    بالتوفيق،،،
  3. إجابة طارق جهاد سؤال في هل كثرة الاتصالات بخادم تجعله يتوقف ام فقط يتاخر في الاجابة كانت الإجابة المقبولة   
    تجعله يتأخر وليست سبب بأن يتوقف بمعنى يتعطل!
    كل طلب يصل إلى السيرفر تقوم 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 اخرى تقوم بمعالجة الطلب، واخبارنا عند انتهاءها.
     
    بالتوفيق،،،
  4. إجابة طارق جهاد سؤال في كيف يعمل البرنامج كانت الإجابة المقبولة   
    أخي الكريم.
    على اعتبار ان اي برنامج سيتم تحويلة إلى لغة الألة بالنهاية Binary. وهي الشيء الوحيد الذي يفهمة المعالج
    بالتالي انت بحاجة للتعرف على ألية عمل المعالج نفسه، والذي يتكون من مجموعة من Registers المتصلة مع بعضها، ويتم نقل الاشارات الكهربائية Bits بين هذه register بطريقة منطقية، بمعنى بطريقة مصممة مسبقاً، بحيث ينتج عنها معالجة البيانات )معالجة البيانات ليست اكثر من عملية الجمع!( 
    لاحظ الصورة المرفقة ل Register. يحوي المعالج على دارات مشابه له. مع مجموعة من الداوئر الالكترونية الاخرى مثALU, Accumulator
    جدير بالذكر، ان طبيعة هذه الـ Register إما 32-bit او 64-bit، وبالطبع 64 بت تكون اكثر قدرة على تخزين البيانات بالتالي قدرة معالجة اكبر
     
    حاول الاطلاع على الية عمل المعالج CPU، وهذا فيديو مساعد
    https://www.youtube.com/watch?v=cNN_tTXABUA 

  5. إجابة طارق جهاد سؤال في احتاج مساعده في لغة السي شارب #c كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    انت بحاجة فقط لمجموعة حلقات تكرارية loops للمرور على المصفوفة لتعبئتها اولا ثم لجمع الاسطر والاعمدة والاقطار.
    using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // Read the array dimensions from the user Console.Write("Enter the array size: "); int size = int.Parse(Console.ReadLine()); // If the array size is even (not odd), then break; if (size % 2 == 0) { Console.WriteLine("Please enter en odd number!"); return; } // Define our [Size x Size] array int[,] array = new int[size, size]; // Assume that the array is magic until we make our calculations bool isMagic = true; // Just Print the array, to make it more readable // We have 2 loops, one for rows and the other for columns // It start from the [0,0], then [0,1] index until complete the first row // Then complete for [1,0], then [1,1] index until complete the second row, and so on... Console.WriteLine("Array size:"); for (int row = 0; row < size; row++) { for (int col = 0; col < size; col++) { Console.Write($"[{row},{col}]"); } Console.WriteLine(); } // Fill the array // Also using 2 loops Console.WriteLine(); Console.WriteLine("Please fill the array"); for (int row = 0; row < size; row++) { for (int col = 0; col < size; col++) { Console.Write($"Enter number at [{row},{col}]: "); array[row, col] = int.Parse(Console.ReadLine()); } } // Start our calculations Console.WriteLine(); Console.WriteLine("Calculating:"); // Sum the first row, where other rows, columns and diagonals must match int magicValue = 0; for (int i = 0; i < size; i++) { magicValue += array[i,0]; } // We will start by calculating the first row sum and the first col sum. for (int row = 0; row < size; row++) { int rowValue = 0; int colValue = 0; for (int col = 0; col < size; col++) { rowValue += array[col, row]; colValue += array[row, col]; } // if the current row sum != magicValue then break if(rowValue!= magicValue) { isMagic = false; break; } // Also if the current column sum != magicValue then break if(colValue!= magicValue) { isMagic = false; break; } // first loop match // Reset values to calcaute the rest of rows and cols. rowValue = 0; colValue = 0; } // If we reach this code without any break, then all rows and cols are matched // we need to check if isMagic still true, and not flagged to false inside the loops. if (isMagic) { // Print the final array Console.WriteLine("It's Magic Array :)"); for (int row = 0; row < size; row++) { for (int col = 0; col < size; col++) { Console.Write($"[{array[row,col]}]"); } Console.WriteLine(); } } else { Console.WriteLine("Not match"); } } } } يمكنك التجربة بمصفوفة بحجم 3x3
    والمدخلات كالتالي:
    [2][7][6] [9][5][1] [4][3][8] بالتوفيق،،،
  6. إجابة طارق جهاد سؤال في الفرق بين Parseو Convert في سي شارب كانت الإجابة المقبولة   
    أخي الكريم Convert ليست دالة ولكنها كلاس او Helper class
    تحوي على مجموعة دوال (دول int.Parse و double.Parse و DateTime.Parse وباقي دوال التحويل الاخرى) بحيث يمكن الوصول لجميع هذه الدوال عن طريق Convert.
    ولذلك ذكرت بان Convert هي Helper Class بمعنى كلاس يحوي على Static Methods يمكن استدعائها مباشرة (دون الحاجة لعمل اوبجكت من هذا الكلاس).
     
    مثال مشابه.
    لو فرضنا ان لديك كلاس Student بحيث يحوي على FirstName و LastName وكنت بحاجة للحصول على الاسم الكامل لهذا الطالب، فستقوم انت بعمل دالة داخل الكلاس Student بالشكل التالي:
    public string GetFullName(){ return FirstName + " " + LastName; } الآن لو كان لديك كلاس اخر Customer مثلا، ويحوي ايضا على FirstName و LastName فستوم ايضاً بإضافة نفس الدالة للحصول على الاسم الكامل.
    لكن ولكي لا تقوم بتكرار نفس الخوارزميات، يمكنك إنشاء Helper Class وليكن اسمه PrintHelper ويكون شكله بالشكل التالي:
    pulic static class PrintHelper { public static string GetFullName(string firstName, string lastName) { return firstName + " " + lastName; } } الآن ضمن كلاس Student يمكنك عمل التالي:
    public class Student { ... public string GetFullName() { return PrintHelper.GetFullName(FirstName, LastName); } } ضمن كلاس Customer ايضاً:
    public class Customer { ... public string GetFullName() { return PrintHelper.GetFullName(FirstName, LastName); } }  
    اذا فعلياً كل ما قمت به أنا هو تسهيل عملية الوصول لهذه الخوارزميات، لكن النتيجة دائماً نفسها.
     
    بالتوفيق،،،
  7. إجابة طارق جهاد سؤال في ممكن شرح لهذا الكود C# سي شارب كانت الإجابة المقبولة   
    في المثالين الهدف هو التنسيق النصي:
    1. نقوم بوضع الرمز @ للتخلص مما يسمى ب Escape Character، مثل backslash \
    قومي بتجريب هذا المثال في بيئة سي شارب عندك:
    Console.WriteLine("C:\Program Files\Microsoft"); ستلاحظين ان بيئة سي شارب تعطي خطأ هنا، لأن backslash تعتبر escape character، بمعنى انها في هذا المثال لا يقصد بها الرمز \ وإنما تؤخذ كرمز واحد مع الحرف الذي يليها:
    \P لاتعني شيء بالنسبة لسي شارب، لذلك يظهر عليها الخطأ
    \M أيضا لا تعني شيء بالنسبة لسي شارب، لذلك يظهر عليها الخطأ ايضا
    ولكي تتضح الصورة اكثر، نلاحظ المثال التالي:
    Console.WriteLine("C:\Program Files\Microsoft\n"); سنلاحظ هنا ان سي شارب لم تعترض على n\ لانها تعني سطر جديد! أي ان سي شارب قامت بالنظر إلى backslash وشاهدت الحرف الذي يليها، واذا لم يكن من ضمن الرموز المعرفة في سي شارب، فسيظهر الخطأ.
    طبعا لحل هذه المشكلة، نقوم بإضافة backslash اضافي، كما يلي:
    Console.WriteLine("C:\\Program Files\\Microsoft\n"); الآن سي شارب لن تعترض على استخدم backslash بهذه الطريقة.
    لكن يمكننا التخلص من هذا الـ backslash الاضافي، فقط باخبار سي شارب ذلك، عن طريق وضع الرمز @ بداية النص:
    Console.WriteLine(@"C:\Program Files\Microsoft"); الآن ايضا سي شارب لن تعترض.
     
    2. نقوم بوضع الرمز $ لسهولة التنسيق النصي ضمن سي شارب. مثلا 
    Console.WriteLine("The sum of " + 4 + " and " + 5 + " = " + 9 +""); هذه طريقة التنسيق التقليدية في سي شارب. ونلاحظ انها صعبة الفهم والتتبع خاصة في حال وجود اخطاء، لذلك افترضت سي شارب، ان نقوم بعمل تنسيق نصي مناسب اكثر، وهو بدل ان نضع الرقم 4 مباشرة بهذا الشكل، نضع رمز او مؤشر مكانه، ثم نقوم باستبدال هذا الرمز او المؤشر بالرقم 4 لاحقاً كما يلي:
    Console.WriteLine("The sum of {0} and {1} = {2}", 4, 5, 9); الآن نلاحظ ان التنسيق اصبح اكثر وضوحاً! وسيتم استبدال الرمز {0} بالرقم 4 لاحقاً.
    يمكن استخدام هذا النمط من التنسيق خارج جملة Console.WriteLine من خلال استخدام الدالة string.Format
    var result = string.Format("The sum of {0} and {1} = {2}", 4, 5, 9); لكن مؤخراً قامت سي شارب باختصار هذه الصيغة ايضا كونها لا زالت تحمل بعض التعقيد او الغموض، فمثلا لو أردت ان اعرف ما هي القيمة التي سيتم استبدالها عند الرمز {2} سأقوم بعد المتغيرات 4 و 5 حتى اعثر على 9! لكن ماذا لو كان لدي 20 متغير او اكثر، هنا سيصعب تتبع البيانات!
    الحل كان باستخدام الرمز $ والذي يسبق التنسيق النصي، مع هذا الرمز سأتخلص من الدالة string.Format اولاً، ثم بدل ان أضع {2} وأقوم لاحقا باستبدالها بالرقم 9، سأقوم بوضع 9 مباشرة ضمن القوسين كما يلي:
    var result = $"The sum of {4} and {5} = {9}"; طبعاً في جميع الحالات النتيجة ستكون واحدة، لكن الهدف هو تسهيل العمل على المطور. 
    لذلك تسمى جميع هذه الاختصارات والتكتيكات ب Syntactic Sugar او التجميل اللغوي، لانها فعليا لا تؤثر على المعنى ولكن على الشكل فقط!
     
    بالتوفيق،،،
  8. إجابة طارق جهاد سؤال في ايهم اسهل و افضل Cordova او زمرن كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    اذا كان لديك خلفية بلغة السي شارب، انصحك بالزامرن، لانها تعطيك تطبيقات Native من حيث المظهر والأداء، بالإضافة لدعمها لجميع الخدمات التي تقدمها اللغات الأم مثل جافا و سويفت.
    الاختلاف الجوهري، انو كوردوفا تمكنك من عمل (تطبيقات) او فعليا شاشة واحدة هي WebView بشكل Native، بحيث تعمل جميع اجزاء التطبيق ضمن هذه الشاشة، ومسؤولية رسم العناصر واظهار البيانات تقع على عاتق هذه الشاشة، وليس على نظام التشغيل، على عكس Xamarin التي تتعامل مع نظام التشغيل بشكل كامل.
     
    وانصحك بمتابعة صحفات Xamarin على مواقع التواصل، فهم تقريبا يقدمون تحديثات وميزات بشكل يومي، لعل اخر ميزة كانت مثيرة بالنسبة لي، هي دعم الواجهات العربية او (شاشات اليمين لليسار)
     
    بالاضافة لوجود العديد من المصادر التعليمية لهذه التقنية، ويمكنني ان انصحك بمتابعة قناة حسام ديلاي على اليوتيوب فيها شرح جميل.
    https://www.youtube.com/channel/UCCYR9GpcE3skVnyMU8Wx1kQ
     
    بالتوفيق،،،
  9. إجابة طارق جهاد سؤال في هل أحتاج لتعلم الjavascript Dom إذا كنت أجيد العمل على مكتبة الjQuery ؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله
    DOM هي تمثيل لعناصر الصفحة في الذاكرة، وانت تحتاج بالطبع لمعرفة الية للوصول لجميع هذه العناصر، والوصول لخصائص هذه العناصر.
    جافا سكربت تعطيك هذه الامكانية، jQuery تعطيك هذه الامكانية ايضا، لكن بشكل مختصر، او فعليا هي تقدم خدمات جافاسكربت نفسها لكن بشكل مختصر، ولا تخترع شيئاً جديداً.
    لذلك ارى اذا كنت تستخدم jQuery فهي تكفي حالياً، الا في الحالات التي قد تواجهك لاحقاً، بحيث انك تريد التعامل مع DOM، لكن لا يوجد لديك مكتبة jQuery هناك، وقتها يمكنك البحث عن الطريقة المناسبة باستخدام جافا سكربت، اما الأن اكتفي ب jQuery، وحاول توجيه جهدك نحو تعلم اشياء اكثر اهمية.
     
    بالتوفيق،،
  10. إجابة طارق جهاد سؤال في هل يمكن تغيير كود تطبيق أندرويد دون خسارة العملاء كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    نبدا من اخر نقطة، Google Play بالتأكيد ليس لديه أي مشكلة، يتم تعريف التطبيق على Google Play عن طريق APP ID وهو غالبا اسم التطبيق مع نطاق الشركة بشكل معكوس، مثلا:
    com.plevina.myapp عندما تقوم بإصدار نسخة جديدة من التطبيق مهما كانت المنصة التي قمت بالتطوير عليها، بالنهاية انت لديك تطبيق بامتداد .apk بالإضافة لهذا الـ App ID، كل ما عليك فعله، هو اعطاء التطبيق الجديد رقم نسخة يزيد عن اخر نسخة على المتجر. اما اذا اختلف App IDK، فانت في حالة تطبيق جديد كلياً.
     
    بالنسبة لقاعدة البيانات ليس لها دخل بالتطبيق، بمعنى، ان تطبيقك (او مجموعة تطبيقات اخرى) سيرتبط مع خدمة ويب او Web API تقدمها انت (او قاعدة بياناتك)، تقوم هذه الخدمة بقراءة البيانات من قاعدة البيانات او الكتابة عليها عن طريق روابط، في الفقرة التالية شرح مفصل لهذه النقطة.
     
    بالنسبة لعملائك، لا انصحك بإجراء تغيير مفاجىء وكبير في شكل والية عمل تطبيقك. او اجراء تعديلات من شأنها التأثير على عمل التطبيق القديم.
    لذلك، ومهما كانت قاعدة البيانات او التكنولوجيا التي تستخدمها، انت بحاجة لعمل version جديدة من خدمة الويب التي يتواصل التطبيق معها.
    مثلا لنفرض ان تطبيقنا السابق com.plevina.myapp يقوم بجلب مجموعة المنتجات عن طريق خدمة الويب (Web API)، ويستخدم لذلك الرابط التالي:
    http://www.plevina.com/api/products الآن عندما تقوم بتطوير التطبيق الجديد، وفي حال كانت بيانات المنتجات فيه تختلف عن بيانات المنتجات في التطبيق السابق، هنا "إحذر" يجب ان تترك الرابط السابق يعمل بشكل سليم، وتقوم بإنشاء نسخة جديدة من هذه الخدمة، مثلاً:
    http://www.plevina.com/api/v1/products بالتالي، عند اصدار النسخة الجديدة من التطبيق، لن يؤثر ذلك على عمل التطبيق السابق، وسيتمكن جميع عملائك من الانتقال للتطبيق الجديد بسلاسة.
     
    نقطة اخيرة أوؤكد عليها، سواء طورت تطبيقك بلغة الجافا او اي تقنية هجينة اخرى، انت ستحصل على ملف APK او Android Package، يمكن تثبيته على اي نظام تشغيل اندرويد، وبالنسبة للمتجر، جميعها تطبيقات اندرويد، لذلك لا فرق تقنياً بين هذه التطبيقات، وانما الفرق بالإداء والشكل والحجم والإمكانيات.
     
    بالتوفيق،،،
  11. إجابة طارق جهاد سؤال في مطور واجهة مستخدم Fron End ومصمم (تجربة مستخدم وواجهة استخدام) UI\UX كانت الإجابة المقبولة   
    UX أو User Experience او تجربة المستخدم
    يمكنك اعتبارها كدستور اثناء تطويرك لواجهة المستخدم، وهي غير مرتبطة بالويب فقط، بل بجميع انواع التطبيقات.
    سأعطيك مثال بشكل مختصر.
    تطبيقات الأندوريد تختلف عن تطبيقات الآيفون من حيث الشكل، لكن غالبا تكون المهام التي يقوم بها التطبيق على كلا الجهازين متشابه، مثلا تطبيق الواتساب على نظام الاندرويد يحوي على Tabs لعرض الدردشة، والحالة والمكالمات، تكون هذه ال tabs من أعلى الشاشة، وعبارة عن نص فقط CHATS   STATUS   CALLS
    لكن ضمن تطبيق الواتساب على الآيفون توجد هذه ال Tabs في الأسفل وتحوي على أيقونة ايضا وتحتها نص.
    أيضا، في اجهزة الأندرويد يوجد زر الرجوع (زر أساسي من الجهاز نفسه) يمكنك من الرجوع للصفحة السابقة، بينما على آيفون لا يوجد هذا الزر، بكل بإمكانك سحب الشاشة لليمين للرجوع للصفحة السابقة. وقس على ذلك العديد من الأمثلة والاختلافات.
     
    الآن، مستخدم الأندرويد، ومن خلال اعتياده على استخدام نظام الاندرويد، عندما يقوم بتثبيت تطبيق جديد، يتوقع أن يكون استخدام هذا التطبيق واضح اعتمادا على تجربته السابقة في استخدام نظام الاندرويد بشكل عام. الآن انت عندما تقوم بتصميم تطبيق للأندرويد، ولا تدعم زر الرجوع مثلا، او تضع ال Tabs في الأسفل، أو... فأن المستخدم سيحصل له حالة من النفور او الانزعاج من هذا التطبيق، لانه غريب عليه ولم يدخل في تجربته السابقة.
    نفس الحالة تنطبق على مستخدم آيفون ايضاً
    شركة غوغل من اكثر الشركات التي تحاول جعل هذه العملية منظمة ومقننة، واطلقت تصميمها الخاص Material Design والذي يقصد استخدام المواد الموجودة حولنا في التصميم. فتشعر المستخدم أنه ببيئة واقعية من خلال تفاعل عناصر الواجهة بشكل كما لو كانت مواد طبيعية بدل ان تكون ازرار او قوائم.
     
    في النهاية، UX ليست شي منفصل بحد ذاته، بقدر ما هي قواعد ونصائح واساليب واضحة لتطوير الواجهات UI بشكل يأخذ تجارب المستخدم السابقة بعين الاعتبار.
     
    بالتوفيق،،،
  12. إجابة طارق جهاد سؤال في ماهو رمز اختصار اللغة العربية في البرمجة كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    باختصار الرمز هو: ar
    لكن يمكن ان تستخدم ar-sy او ar-qa بحسب الدولة!
    اذا يجب ان ننتبه لمفهومين اساسين هما:
    1. Globalization
    2. Localization
    والذان يتم دمجهما في مصطلح واحد هو Internationalization او اختصار i18n (اي حرف i ويليه 18 حرف ثم اخيرا حرف n)
    Globalization: تعني انك تريد تطوير التطبيق بأكثر من لغة (العربية، الانجليزية، الفرنسية...)
    Localization: تعني انك ستنزل في تفاصيل globalization الواحد (بنفس اللغة) اكثر لدعم المناطق المختلفة، كمثال:
    يمكن لتطبيقك ان يدعم اللغة العربية وتستخدم الرمز ar، وانتهى الأمر، لكن هناك بعض القيم تختلف من دولة عربية لأخرى. مثلاً: المملكة العربية السعودية تستخدم التاريخ الهجري، وعملتها الريال السعودي. بينما دولة قطر تستخدم التاريخ الميلادي وعملتها الريال القطري.
    في قطر يتم استخدام اسماء الأشهر كما في مصر (يناير، فبراير، مارس... ديسمبر) بينما في سوريا يتم استخدام الاسماء العربية (كانون الثاني، شباط، اذار... كانون الأول)
    اذا يوجد اختلاف في الثقافات بين هذه البلدان. لذلك تجد في لغات البرمجة ما يسمى ب culture، يعنى بإمكانك تغيير ثقافة التطبيق بحسب ثقافة البلد.
    اذا ar وحدها تعتبر Globalization، و ar-sy تعتبر Globalization + Syrian Localization
    الأمر مشابة للغة الانجليزية مثلا
    en-us للولايات المتحدة الامريكية
    en-uk للمملكة المتحدة
    en-in للهند الانجليزية
     
    بالتوفيق،،،
     
  13. إجابة طارق جهاد سؤال في ماهي اللغة المناسبة في تصمميم برنامج ترجمة بدون انترنت؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    الأمر يعتمد على لغة البرمجة التي تتقنها، لانك بالنهاية بحاجة لعمل تطبيق سطح مكتب Desktop Application يقوم بالقراءة والكتابة على قاموس Dictionary
    هناك العديد من التقنيات:
    1. من مايكروسوفت يمكنك استخدام Windows Forms, WPF, UWP
    2. من جافا استخدام Java SE لبناء تطبيقات سطح المكتب
    3. Python استخدم Tkinter
    4. يمكنك ايضا استخدام Qt مع لغة سي بلس بلس
    5. واذا كان لديك معرفة ب جافا سكربت، استخدم Electron والتي تعمل على جميع انظمة التشغيل.
    بالنهاية تطبيق قاموس هو عبارة عن برنامج لقراءة من ملف، واعتقد ان السرعة ستكون مثالية في جميع التقنيات السابقة، كونها تعمل بشكل local على نفس الجهاز، العقبة الوحيدة لديك هي درجة اتقانك لاحدى التقنيات السابقة، وكتابة التطبيق بالشكل الأمثل.
     
    بالتوفيق،،،
  14. إجابة طارق جهاد سؤال في هل يمكن حفظ حقوق الملكية على المتصفح؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    JavaScript يتم تفسيرها على المتصفح (Interpreted Language)، بالتالي يجب ان تكون واضحة له حتى يستطيع قرائتها، يقابلها Compiled Language والتي يتم ترجمتها إلى Machine Code لا يمكن فهمة إلا بواسطة المعالج.
    احدى الطرق التي يمكن حماية كود جافا سكربت وأيضا زيادة الأداء في التطبيق، هي باستخدام Minification اي استخدام نسخة مضغوطة من كود الجافا سكربت، بمعنى اخر، إعادة تسمية المتغيرات إلى حرف واحد (مثل بدل name نستخدم m)، وايضاً تغيير اسماء الدوال، واختصار كل ما يمكن اختصاره، بالإضافة لإزالة جميع التعليقات Comments، بالتالي، ودمج جميع ملفات الجافا سكربت في ملف واحد Minified يكون حجمه صغير، ويصعب جدا قرائته.
    بالإضافة طبعاً، لذكر حقوق الملكية للكود المصدري بشكل واضح على الموقع، وعم قانونية التلاعب به.
    يوجد موقع يمكنه المساعدة في حماية هكذا ملفات:
    https://javascriptobfuscator.com/
    بالتوفيق،،،
  15. إجابة طارق جهاد سؤال في ما هي فائدة الكلمة المفتاحية var؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    نعم var هي variable تستخدم فيما يسمى Dynamic Type، يعنى عندما لا تريد او لا ترغب بالضبط بتحديد نوع البيانات التي تتعامل معها. بحيث يقوم الـ Compiler بمعرفة نوع البيانات خلال وقت التنفيذ، وانت يمكنك استخدامها والتعامل معها كباقي المتغيرات الأخرى.
    في المثال المرفق المتغير cameraRotation غالبا سيكون من نوع double أو float او ربما يكون عدد صحيح int، يمكنك استخدام var وسيتم تحديد النوع تلقائيا.
    طبعا الأمر يختلف من لغة برمجة إلى لغة اخرى.
    كلامي السابق ينطبق على لغة مثل سي شارب، لكن كلغة مثل الجافا سكربت، لايوجد اصلا إلى var باعتبارها لغة Dynamic Type بتصميمها.
    في لغة Swift ستجد مفهوم let, var ايضا، حيث ان let تشبة const اي لا يمكن تغيير قيمته بعد تعريفها.
    في لغة Kotlin ستجد مفهوم var, val، ايضا بنفس المفاهيم.
    في النهاية، الافضل دائما استخدام اللغات التي تسمى ب Type Safe، كي لا يحدث اي ضرر بالأداء او الذاكرة. ويتم اكتشاف الاخطاء في اوقات مبكرة. وهذا احد الاسباب الذي دفع مايكروسوفت لتطوير لغة TypeScrpit والتي هي مبينة على جافا سكربت لكنها TypeSafe
     
    بالتوفيق،،،
  16. إجابة طارق جهاد سؤال في هل يدعم xamarin اللغة العربية؟ كانت الإجابة المقبولة   
    اذا لم تستخدم محتوى خاص لتطبيق اخر (مثل الايقونات او الاسماء) فلا يوجد أي مانع، من تقوم بتطوير التطبيق الذي تريد بالخيارات التي تريد.
    بالتوفيق،،،
  17. إجابة طارق جهاد سؤال في كيف نقوم بإنشاء الدوال في لغة سي شارب؟ كانت الإجابة المقبولة   
    هذه هي نقطة البداية لتطبيق سي شارب. معرفة بهذه الشكل ليقوم نظام التشغيل باستدعائها تلقائياً.
    Static تعنى انها وحيدة على مستوى التطبيق، ولا يمكن عمل نسخة اخرى منها بالتالي فهي نقطة البداية الوحيدة للتطبيق، ويمكن استدعائها مباشرة دون الحاجة لعمل Object
    void اي اننا لا نتوقع منها اي نتائج بعد عملية استدعائها (فقط مهمتها كنقطة بداية)
    string[] args هذه هي مجموعة ال Parameters التي يمكن تحديدها عند تشتغيل التطبيق من Command Line
    على سبيل المثال: في نظام التشغيل ويندوز يوجد تعليمة mkdir لإنشاء مجلد جديد ضمن المسار الموجودين فيه، لكن التعليمة بحد ذاتها غير كافية فهي تحتاج لإسم المجلد الجديد مثلا: mkdir MyFolder هذه التعليمة ستقوم بإنشاء مجلد اسمه MyFolder
    الأن بإمكانك اعتبار التعليمة mkdir  هي نفسها اسم برنامج السي شارب، و MyFolder هي args الاول في هذه المصفوفة. شاهد الصورة المرفقة
    namespace mkdir { class Program { static void Main(string[] args) { if (args.Length > 0) { string folderName = args[0]; System.IO.Directory.CreateDirectory(folderName); } } } }  

    بالتوفيق،،،
  18. إجابة طارق جهاد سؤال في ما هي آلية إنشاء التطبيقات للهواتف الجوالة؟ كانت الإجابة المقبولة   
    فقط للتوضيح:
    Xamarin هي شركة مستقلة، تم الاستحواذ عليها من قبل مايكروسوف في March 2016، وتم دمج تقنياتها مع Visual Studio واصبحت مفتوحة المصدر، وتحت ترخيص MIT.
    وكما اخبرتك هي منصة مستقلة يوجد برنامج Xamarin Studio يمكنك من تطوير تطبيقات الموبايل والديسك توب، وتم دعم Linux في النسخة المحدثة، بالتالي بإمكانك إنشاء تطبيقات لنظام التشغيل Linux باستخدام Xamarin.
    بالنسبة لتطبيق محادثة او اي تطبيق اخر يقوم بإدارة بيانات معينة، كما اخبرتك سابقاً، يمكنك ذلك بالطبع، وسأشرح ذلك لك، لكن ايضا ليس له أي علاقة برفع التطبيق على Google Play، بمعنى إن كان تطبيقك خاص بجهاز الاندرويد مثلا، (كادراة الملفات او الصور، او اي تطبيق مساعد لمستخدم الاندرويد) او سواء كان تطبيقك هو خدمي، يعتمد على الويب، او سيرفر خارجي لإدارة بياناته وبيانات المستخدمين، بالنهاية سيكون لديك ملف .apk هذا ما سيتم رفعه على المتجر، بغض النظر عن المهام التي يقوم بها.
    حتى تتمكن من إنشاء هكذا تطبيق، انت بحاجة لتطبيق ويب (Web Application) وليس Web Site، بمعنى انت بحاجة لقاعدة بيانات على سيرفر ما، وتطبيق ويب يقوم باستقبال الطلبات على البيانات ويرد بالشكل المناسب، هذا السلوك هو ما يطلق عليها Web Service، من خدمات الويب هذه يوجد العديد من المفاهيم، ما تحتاجه انت لتربط تطبيقك الجوال مع خدمة الويب هذه هو REST API. سأبسط لك العملية اكثر.
    بوجود تطبيق الويب خاصتنا على سيرفر معين، وبدعمه ل REST API، الأن بإمكانك استخدام Uri مع HTTP سواء لطلب البيانات لعرضها للمستخدم، او ارسالها للمعالجة (تشمل هذه العملية تسجيل المستخدمين، والمحادثة، وكل ما قد تحتاجه) الفكرة نفسها. 
    مثلا لو فرضنا انك تريد جلب بيانات مستخدم من مستخدمين تطبيقك، من على تطبيق الويب التابع لك، الذي قمت بإنشائه مسبقا، وقمت باستضافته على سيرفر معين. لنفرض ان اسم الموقع الخاص بك mohammad
    http://www.mohammad.com/api/users/123 من خلال هذا الـ Uri (الرابط) يمكنك طلب بيانات الملف الشخصي للمستخدم صاحب الرقم 123. وبما أني ذكرت (طلب البيانات) اي الميثود GET، التابعة ل HTTP، اي عندما تطلب هذا المصدر من خلال تطبيق الجوال، يجب ان تحدد ان نوع الفعل او الأكشن المطلوب هو GET أو قراءة فقط.
    بمعنى انك لو قمت بتغيير نوع الفعل إلى DELETE فإنه سيقوم بحذف هذا الملف الشخصي صاحب الرقم 123
     
    اذا: انت تتعامل مع البيانات بشكل بسيط، وباستخدام مفاهيم HTTP. وبالتأكيد يمكنك استخدام POST لكتابة البيانات الجديدة، او PUT  للتعديل على بيانات سابقة.
    السؤال الآن: كيف احصل على على خدمة الويب هذه )REST API)
    الجواب: ستقوم بتطويرها (بشكل موقع الكتروني، بدون واجهات للمستخدم ان لم تكن بحاجتها)، يمكنك استخدام تقنية ASP.NET Web API، لانجاز المهمة بشكل مثالي.
    كما يمكنك ايضا استخدام API، تابعة لشركة او تطبيق اخر، اذا قاموا هم بتوفير  هذا الخدمة (مثال خدمة الطقس، انت تستطيع قراءتها من Yahoo مثلاً، دون الحاجة لكتابة خدمة ويب خاصة بالطقس).
    ويمكنك ايضا استخدام Google Firebase لإدارة بيانات المستخدمين وعمل تطبيق محادثة والعديد من الخيارات الاخرى، ويمكنك ايضا استخدام Microsoft Azure، او اي منصة سحابية اخرى.
     
    غالبا سيكون الخيار الاول هو المناسب، وهو ان تقوم ببناء الخدمة بنفسك، لانك اعلم باحتياجات تطبيقك.
    في النهاية، بعد الانتهاء من تطوير خدمة الويب، يمكنك رفعها على اي سيرفر كما نقوم برفع اي موقع الكتروني اخر. (مرة اخرى لا علاقة لتطبيق الجوال بهذه المتطلبات).
    بعد رفع التطبيق على المتجر، وبافتراض ان (موقعك) او خدمة الويب تعمل بشكل صحيح على www.mohammad.com، فإن تطبيقك سيعمل بالشكل المطلوب.
     
    بالتوفيق،،،
  19. إجابة طارق جهاد سؤال في ممكن طريقة تثبيت برنامج سويفت Swift و XCode على ويندوز 10؟ كانت الإجابة المقبولة   
    مساء النور أخي الكريم
    طبعا xcode لا يعمل إلا على اجهزة الماك، او فعليا على نظام Mac OS X،
    سويفت او Swift هي لغة برمجة مرفقة مع xcode، لذلك انت بحاجة فقط ل xcode.
    على اجهزة الويندز انت بحاجة ل Virtual Machine يمكنك تحميلها من https://my.vmware.com/en/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/12_0
    بعدها انت بحاجة لتشغيل نسخة من نظام Mac OS على هذا الجهاز الافتراضي، يمكنك تحميل نسخة Serria من http://macdrug.com/download-macos-sierra-dmg-installer-iso-without-apple-store/
    بعد ان تنتهي من هذه العمليات، يصبح لديك جهاز Mac افتراضي (الافضل ان يكون لديك جهاز mac حقيقي، خصوصا اذا كنت ترغب بالعمل الجدي على ios وليس لهدف التجريب فقط)
    اذا بعد الانتهاء تقوم بتنزيل xcode من App Store ضمن بيئتك الافتراضية الجديدة.
     
    بالتوفيق،،،
  20. إجابة طارق جهاد سؤال في هل يمكن إدخال الاختيارات إلى النماذج لإرسلها عن طريق الخاصية action كانت الإجابة المقبولة   
    بالتأكيد اخي، جميع انواع input و select و textarea مخصصة لجمع البيانات وارسالها للسيرفر عن طريق form.
    معلومة على الهامش: يجب اعطاء نفس الإسم لكل checkbox ضمن نفس المجموعة من checkboxs ويتم استقبالها على السيرفر ك مصفوفة من القيم
    ويجب اعطاء نفس الإسم ايضا لكل radiobutton ضمن مجموعة radiobuttons حتى يتم اختيار واحد فقط، ويتم استقبالها على السيرفر كقيمة واحدة.
     
     
    بالتوفيق،،،
  21. إجابة طارق جهاد سؤال في ما الفرق بين Constructors و الـ structures في C# كانت الإجابة المقبولة   
    كلامك غير صحيح، ولا أعلم من اين اتيت بهذا الربط اخي الكريم.
    Class, Struct هما تمثيل لبنية بيانات معينة والفرق بينهما ان Class هو Reference Type بمعنى ادق (بيانات يتم تخزينها في الذاكرة العشوائية Heap)، بينما Struct هو بينة بيانات ايضا لكنه Value Type بمعنى ادق (بيانات يتم تخزينها في الذاكرة السريعة او المحدودة Stack)
    بينما Constructor هو دالة او ميثود رئيسية، يتم استدعائها عند انشاء Object جديد من Class او Struct
    مثلا لو كان لدي كلاس Student، واردت عمل Object جديد
    Student student = new Student(); Student هو الكلاس نفسه
    ;()Student هي استدعاء الـ Constructor الافتراضي ضمن كلاس Student
    يمكن للكلاس ان يحوي على اكثر من شكل من اشكال Constructor لتهيئة البيانات بقيم معينة.
    Student student = new Student("Ahmad", 20); هناك بعض الاختلافات بين Constructors كل من Class, Struct ربما اهمها ان Struct لا يحتاج إلى Constructor بدون قيم كما في المثال. لكن المبدأ واحد.
     
    بالتوفيق،،،
  22. إجابة طارق جهاد سؤال في هل هناك فرق بين OOP و Data Access Layer و MVC في ASP.NET؟ كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله.
    الفروق كثيرة بسبب اختلاف مكان كل منها من حيث المفاهيم والاستخدام.
    OOP: مفهوم البرمجة الكائنية، عبارة عن مفاهيم عامة في طريقة تمثيل البيانات، وارتباطها مع بعضها البعض. عملية انشاء كلاس هي العملية الاساسية في OOP.
    Data Access Layer: المقصود بها فصل العمليات المتعلقة بالتواصل مع قاعدة البيانات (عمليات القراءة والتعديل والحذف وغيرها)، ووضعها في طبقة مستقلة، خلافات لبعض التطبيقات التي يتم دمج كود الاتصال مع قاعدة البيانات مع كود الواجهات، وهو ما يصعب عملية التطوير واكتشاف الاخطاء.
    MVC: نمط تصميم غير مرتبط ب ASP.NET فقط، بل موجود بكل التقنيات (مثل PHP وحتى Android)، لكن ضمن بيئة ASP.NET فيعتبر بديل ب Web Forms، وهو نمط جميل في تطوير تطبيقات الويب على ASP.NET MVC، ويقوم على فصل التطبيق إلى ثلاث اقسام رئيسية.
    Model: وهو يمثل هيكيلة البيانات وطبقة Data Access Layer، وما يسمى ب Business Logic، فهو بالتالي غير مرتبط بنوع تطبيقك سواء كان ويب او غيره.
    View: عبارة عن ألية العرض ل Model، بحيث نقوم بتمرير Model ل View معينة لتقوم بدروها بتوليد HTML المناسب، والذي سيتم ارسالة لاحقا للمستخدم.
    Controller: هو الرابط بين Model و View، فهوم يقوم بتلقي الطلبات من المستخدم (مثل طلب عنوان ويب معين، يقوم ال Controller بمعالجة هذا الطلب)، ثم يقرر ما النتيجة المطلوبة، هل هي صفحة HTML، او تنزيل ملف معين، أو Web Api وغيرها. بالتالي ليس من مهمة Controller العمليات البرمجية الحسابية او التواصل مع قاعدة البيانات، هو فقط وسيط، يأخذ البيانات من View ويمررها ل Model والذي سيقوم بالمطلوب، او يقرأ البيانات من Model معين ويقوم بتمرريها ل View لتقوم برسمها بشكل HTML.
     
    أخيراً أود القول: ان المفاهيم السابقة ليست حكرا على بيئة الدوت نت أو اي لغة برمجة أخرى، هي مفاهيم اساسية مع غيرها من المفاهيم، وهو ما يشكل ما يمسى ب هندسة البرمجيات.
    مفاهيم اخرى يمكن التعمق بها، على سبيل المثال وليس الحصر:
    Design Patterns
    Separation of Concerns
    Dependency Injection
    Parallel Programming - Multi-threading
     بالتوفيق،،،
  23. إجابة طارق جهاد سؤال في هل علي التعمق في PHP؟ كانت الإجابة المقبولة   
    اخي الكريم.
    من جهتي لست خبيراً ب PHP، لكن اعطيك نصحية، اذا كان Laravel Framework، يقوم بالعديد من العمليات نيابة عنك، فأنت غير مطالب بالتعمق في PHP، إلا في حدود ما تحتاجه لإتمام عملك. بمعنى؛ لا تتعمق بأي مفهوم إلا في حالة احتجت ذلك المفهوم، وسيكون وقتها سهل عليك دراسته وفهمه ويمكنك التطوير علية أيضاً.
    اذكر عندما استخدمت ASP.NET Identity لاول مرة، لم أكن أعلم كيف تتم عمليات تسجيل المستخدمين وتسجيل الدخول والخروج وتغيير كلمة المرور وتأكيد الحساب وغيرها، فكانت ASP.NET Identity هي الحل الأمثل الذي اختصر علي الوقت والجهد.
    لاحقاً مع تطور المشاريع التي اعمل عليها، بدأت اتعمق بها وادرس كل تفصيلة، واضيف المزيد والمزيد من الخواص عليها، حتى صار عندي مكتبات خاصة بتنظيم حسابات المستخدمين. 
    فإياك ان تستمع لمن يفضل البدء بالعمل من الصفر على استخدام Framework جاهز. لأن المطورين الذين انشأوا هذه Frameworks مروا بتجارب وخبرات اكبر من خبارتنا حتى توصولوا لضرورة انشاء Framework خاص يسهل عملية التطوير، وصدقني اذا قلت لك عند نقطة معينة من خبرتك ستجد نفسك في مكانهم قادر على عمل Framework مشابه، وشاهد على ضرورته في تسريع عملية التطوير.
     
    بالتوفيق،،،
  24. إجابة طارق جهاد سؤال في كيف أحسب نسبة 9% للتقاعد من الراتب؟ C# كانت الإجابة المقبولة   
    بكل بساطة اخي الكريم انت تريد عمل خصم (9%) أو (9 بالمئة) أو (0.09)
    بالتالي عملية ضرب بسيطة:
    10800 * 0.09 = 972  (الخصم)
    10800 - 972 = 9828 (الراتب بعد الخصم)
  25. إجابة طارق جهاد سؤال في الملفات لا تظهر بالشكل الصحيح بعد عملية الرفع asp.net كانت الإجابة المقبولة   
    وعليكم السلام ورحمة الله،
    اخي الكريم ما يحدث معك طبيعي جداً، الملفات التي تقوم برفعها حاليا من نفس جهازك، يتم رفعها إلى مجلد Files، ويمكن استخدامها ضمن الموقع بدون مشاكل،
    بمعنى لا يوجد داعي لان تكون مضافة لملفات المشروع (الملفات موجودة بشكل سليم، لكن هذه وجهة نظر Visual Studio لها، باعتبارها لا تنتمي لملفات المشروع، واقصد بملفات المشروع، اي اذا قمت برفع الموقع إلى احد الخوادم، فلن يتم رفع هذه الملفات معها (واتوقع هذا ما تريده باعتبار هذه الملفات ملفات تجريبية على جهازك)).
    لا تقلق الملفات ستعمل بشكل سليم تماماً. وهذا هو السلوك الافتراضي.
×
×
  • أضف...