-
المساهمات
215 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
31
إجابات الأسئلة
-
إجابة حسام برهان سؤال في هل أبدأ بالبرمجة أم التصميم ؟ كانت الإجابة المقبولة
لدينا كما تعلم نوعين أساسيين من المطوّرين في تطوير تطبيقات الويب:
1- مطوّر تطبيقات خلفيّة back-end developer وهذا النوع من المطوّرين يهتم بتطبيقات تعمل على الخادوم Server مثل ASP.NET MVC (تستخدم لغة سي شارب)، أو لغة PHP، أو Ruby on Rails وغيرها.
2- مطوّر تطبيقات أماميّة front-end developer وهذا النوع من المطوّرين يهتم بالتطبيقات التي تعمل ضمن متصفّح الويب. ولعلّ أكثرها شهرةً تلك المكتوبة بلغة JavaScript، بالإضافة إلى اهتمامهم بطبيعة الحال ب HTML و CSS.
وهناك بكل تأكيد مجال التصميم الذي يعمل به مصمّمون ربما لا يعرفون شيئًا عن البرمجة.
نصيحتي إليك:
في الحقيقة ليس لديك تصنيف محدّد الآن، ولكم أعتقد أنّك ربما ستميل لأن تكون مطور تطبيقات خلفيّة back-end developer والتي من الممكن أن تستخدم تقنية ASP.NET MVC لإنشاء مثل هذه التطبيقات. وإذا أحببت يمكنك تعلّم PHP بالطبع.
أرجو أن تنتبه إلى أنّك لست بحاجة في الوقت الحالي أن تعرف كيف تصمّم موقع انترنت، وفي الحقيقة على الغالب لن تحتاج لذلك أبدًا. لأنّه توجد قوالب وتصاميم جاهزة يمكنك شراؤها والاستفادة منها.
ستحتاج لأن تتخصّص بشيء واحد فقط، مع الإلمام ببعض الأمور من باقي الاختصاصات. فإن كنت مبرمج ASP.NET MVC أو PHP مثلًا، فعليك أن تعرف كيفية التعامل مع JavaScript و HTML و CSS بالحدود الدنيا على الأقل.
توجد سلسلة دروس ممتازة على موقع PluralSight ولكنها ليست مجانية مع الأسف. انظر إلى الدرس الأوّل:
https://app.pluralsight.com/library/courses/full-stack-dot-net-developer-fundamentals/table-of-contents
المؤلّف: Mosh Hamedani
-
إجابة حسام برهان سؤال في ما هي آلية عمل صفحة "إستعادة كلمة المرور"؟ كانت الإجابة المقبولة
1- في الغالب الأعم يتم تخزين token الاستعادة في قاعدة البيانات لكل مستخدم يطلب إعادة تعيين كلمة المرور الخاصة به. وهناك حالتين للتخزين. فإمّا أن يكون ضمن نفس جدول المستخدمين عن طريق حقل إضافي. أو أن يكون ضمن جدول منفصل مرتبط بجدول المستخدمين، والحالة الأولى هي الأبسط بالطبع.
2- يتم تحديث الـ token ضمن قاعدة البيانات في كل مرة يطلب فيها المستخدم استعادة كلمة مروره.
3- بالنسبة للدوال التي تولّد مثل هذا الـ token فيعود ذلك إلى لغة البرمجة المستخدمة، أو إلى قاعدة البيانات المستخدمة في حال أردت استخدام Stored Procedure مثلًا.
4- لا أتصور أنّك قد تحتاج إلى طرق أخرى لفعل ذلك إلّا إذا كان لديك سبب وجيه.
-
إجابة حسام برهان سؤال في كيف أجعل زر يزيد قيمة المتغير في كل مرة يتم الضغط عليه في c#؟ كانت الإجابة المقبولة
إذًا أنت تعمل على ASP.NET Web Forms علمت ذلك لأنّك أخبرتني أنّك تستخدم UpdatePanel. على العموم المشكلة في ذلك أنّ تطبيقات الويب عمومًا لا تحافظ على الحالة الحاليّة لها Stateless. فأي متغيّر تعدّل قيمته عند طلب Request معيّن، سيزول تأثير هذا التعديل عندما تنتهي معالجة الطلب. وهكذا فالعدد الثابت الذي يعرضه برنامجك (القيمة 2) منطقية تمامًا.
احدى الحلول المتاحة لهذه المشكلة تكمن في استخدام طريقة تحافظ فيها على حالة التطبيق بين الطلبات المتتالية (قيمة المتغيّر posts_num على وجه التحديد). الطريقة التي اخترتها لك هي استخدام الخاصيّة Session من الصنف Page والتي تحافظ على قيمة المتغيّر posts_num. انظر إلى التعديل التالي الذي يجب أن تنجزه على شيفرتك:
protected void loadMore_btn_ServerClick(object sender, EventArgs e) { int posts_num; if (Session["CurrentPostValue"] == null) { posts_num = 1; } else { posts_num = (int)Session["CurrentPostValue"]; } counter_lbl.Text = posts_num.ToString(); posts_num++; Session["CurrentPostValue"] = posts_num; } لاحظ أنّ المتغيّر posts_num أصبح محليًّا local variable ولم يعد موجودًا على مستوى الصنف.
-
إجابة حسام برهان سؤال في ما هي لغة xml التي تُكتب بها قوالب بلوغر؟ كانت الإجابة المقبولة
لغة XML هي اختصار للكلمات التالية: EXtensible Markup Language وتعني لغة الرُماز الموسّعة. صمّمت هذه اللغة البسيطة كي تكون معيارًا موحّدًا لنقل البيانات بين التطبيقات المختلفة مهما كانت أنواعها وبصرف النظر عن أنظمة التشغيل التي تعمل عليها. تعتمد XML على قواعد بسيطة يمكنك أن تفهمها بسرعة. انظر مثلًا للبنية التالية المكتوبة باستخدام XML والتي تُعبّر عن بيانات بسيطة لمجموعة من الطلاب:
<Students> <Student> <FirstName>Ahmad</FirstName> <LastName>Saed</LastName> <Mark>60</Mark> </Student> <Student> <FirstName>Mamduh</FirstName> <LastName>Murad</LastName> <Mark>80</Mark> </Student> <Student> <FirstName>Ayman</FirstName> <LastName>Mohammad</LastName> <Mark>98</Mark> </Student> </Students> أتوقّع أنّه بتأمّل بسيط ستعلم عدد الطلاب وأسماؤهم ودرجاتهم أيضًا. يمكنك تعلّم XML بشكل متكامل عن طريق هذه السلسلة التعليميّة.
-
إجابة حسام برهان سؤال في مطلوب مساعدة في كيفية تكوين جملة Select لجلب قيمة مرتين مختلفتين كانت الإجابة المقبولة
هل الحقلين Help.RequestCat_id و Help.OfferCat_id هما حقلين Foreign Key؟
إذا كانا كذلك فيمكن أن تستخدم استعلام SELECT مع INNER JOIN على الشكل التالي مثلًا:
SELECT Help.ID[help_id], Help.Details[help_details], Help.DateTime[help_datetime], c1.Name, c2.Name FROM Help INNER JOIN Categories c1 ON Help.OfferCat_id = c1.ID INNER JOIN Categories c2 ON Help.RequestCat_id = c2.ID لقد اختصرت استعلامك السابق بغرض التبسيط. حاول تجربة هذا الاستعلام، وفي حال نجاحه يمكنك إضافة جدول Users إليه.
-
إجابة حسام برهان سؤال في كيف أنشئ هذه العلاقة بين جدولي إكسس في C#؟ كانت الإجابة المقبولة
أولًا لا أنصح مطلقًا باستخدام Access لأنّها غير مصمّمة أبدًا لهذه الغاية، وستحصل عاجلًا أم آجلًا على الكثير من المشاكل. استخدم بدلًا منها قواعد بيانات SQL Server
على العموم ستحتاج برأيي إلى ثلاث جداول:
1- جدول Students يحتوي على بيانات الطلاب ويضم ثلاثة حقول:
StudentId معرّف الطالب (مفتاح رئيسي) Name اسم الطالب Degree الدرجة العلمية للطالب. 2- جدول Schools يحتوي على بيانات المدارس ويضم ثلاثة حقول:
SchoolId معرّف المدرسة (مفتاح رئيسي) Name اسم المدرسة. MinDegree الدرجة الدنيا للقبول في المدرسة. 3- جدول StudentSchools وهو جدول الربط بين الطلاب والمدارس ويضم حقلين:
StudentId معرف الطالب (مفتاح رئيسي) SchoolId معرّف المدرسة (مفتاح رئيسي) ومن الممكن إنشاء مفتاح ثانوي foreign key بين الجدول الثالث وبين كل من الجدولين الأوّل والثاني وفق StudentId و SchoolId على الترتيب.
بالنسبة إلى أنّ كل طالب يمكن ان يكون له 3 رغبات فقط، فهذا أمر يتم إنجازه من خلال الشيفرة البرمجية.
-
إجابة حسام برهان سؤال في كيف نحدّث ICollection في ASP.NET MVC Razor؟ كانت الإجابة المقبولة
يمكنك ذلك بالطبع، لقد كتبت لك مثالًا بسيطًا يرشدك لهذا الأمر. أجريت الفرضيّات التالية عند كتابتي لهذا المثال:
1- الصنف Student يحتوي على خاصيتين Id و Name.
2- الصنف School يحتوي على خاصيتين أيضًا: Name و Students. حيث أنّ الخاصية Students من النوع IList<Student>. انظر إلى الشيفرة التالية:
public class Student { public int Id { get; set; } public string Name { get; set; } } using System.Collections.Generic; public class School { public IList<Student> Students { get; set; } public string Name { get; set; } } أنشئ مشروعًا جديدًا من نوع ASP.NET MVC ، وأضف إليه الصنفين السابقين (كل صنف بملف مستقل) ضمن المجلد Models. ثم اذهب إلى المتحكم IndexController وعدّل الأكشن Index ليكون على الشكل التالي:
public ActionResult Index(School school) { if (school.Students == null) { school.Students = new List<Student>(); } return View(school); } وإليك الآن ملف العرض Index.cshtml:
@model ModelBinding.Models.School @{ ViewBag.Title = "Home Page"; } @if (Model.Students.Count() == 0) { using (Html.BeginForm()) { <div class="form-group"> <h3>School Name</h3> @Html.TextBoxFor(m => m.Name, new {@class = "form-control", autofocus = "autofocus"}) </div> <hr/> for (int i = 0; i < 3; i++) { <div class="form-group"> <h4>Student @(i + 1)</h4> <label>Id</label> @Html.Editor("Students[" + i + "].Id") <label>Name</label> @Html.Editor("Students[" + i + "].Name") </div> } <button type="submit" class="btn btn-primary">Save</button> } } else { <h1>@Model.Name</h1> foreach (var student in Model.Students) { <p>@student.Id, @student.Name</p> } @Html.ActionLink("Back", "Index"); } نفّذ البرنامج وانتقل إلى Home/Index من المتصفّح، سيعرض إليك حقولًا فارغة لتعبّئها (افترضت أنّ هنا 3 طلاب فقط سيتم تعبئة البيانات لهم)، وبعد نقر Save ستُرسل البيانات إلى الأكشن Index ليفهمها ويعرضها لك مرّة أخرى. يمكنك تنفيذ البرنامج بوضع التنقيح وتنفيذه خطوة بخطوة لتفهم ما يجري بالضبط.
-
إجابة حسام برهان سؤال في كيف أحدّد الصلاة التالية والوقت المتبقي لها؟ كانت الإجابة المقبولة
لقد أجريت تعديلًا على البرنامج الأساسي الذي يأتي مع هذه الخوارزمية، انظر إلى التعديل التالي الذي يعطيك اسم الصلاة القادمة حسب توقيت مدينة حلب:
class Program { static void Main(string[] args) { PrayerTime p = new PrayerTime(); double lo = 36.202; double la = 37.1343; int y = 0, m = 0, d = 0, tz = 0; DateTime cc = DateTime.Now; y = cc.Year; m = cc.Month; d = cc.Day; tz = TimeZone.CurrentTimeZone.GetUtcOffset(new DateTime(y, m, d)).Hours; tz = 3; String[] s; DateTime[] prayerTimes; string[] salaNames = { "Fager", "Shorok", "Zuhur", "Asser", "Maghrib", "Maghrib", "Ishaa" }; int usefullIndex = -1; p.setCalcMethod(4); p.setAsrMethod(4); s = p.getDatePrayerTimes(y, m, d, lo, la, tz); prayerTimes = new DateTime[s.Length]; for (int i = 0; i < s.Length; ++i) { Console.WriteLine(s[i]); prayerTimes[i] = DateTime.Parse(s[i]); } for (int i = 0; i < prayerTimes.Length; ++i) { var span = cc - prayerTimes[i]; if(span.TotalHours < 0) { usefullIndex = i; break; } } Console.WriteLine("The next Sala is: {0}", salaNames[usefullIndex]); }
-
إجابة حسام برهان سؤال في كيف أحصي التعديلات على form بلغة c#؟ كانت الإجابة المقبولة
أحد الأساليب الممكنة لذلك هو في إنشاء متغيّر من النوع StringBuilder (موجود ضمن System.Text) ثمّ إضافة أي تعديل يقوم به المستخدم ضمن معالجات الأحداث الموجودة ضمن النموذج form. لمزيد من التوضيح أنشئ مشروع جديد ضمن Visual Studio ثم انسخ الشيفرة التالية إلى نافذة النموذج، مع الانتباه إلى ربط معالجات الأحداث textBox1_TextChanged و textBox2_TextChanged و button1_Click بالأحداث المناسبة لها:
using System; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private StringBuilder changes = new StringBuilder(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(changes.ToString(), "Changes", MessageBoxButtons.OK, MessageBoxIcon.Information); changes.Clear(); } private void textBox1_TextChanged(object sender, EventArgs e) { //do some operations changes.AppendLine("User made following changes in textBox1 : " + textBox1.Text); } private void textBox2_TextChanged(object sender, EventArgs e) { //do some operations changes.AppendLine("User made following changes in textBox2 : " + textBox2.Text); } } }
أو يمكنك تجريب المشروع الجاهز المرفق.
WindowsFormsApplication1.zip
-
إجابة حسام برهان سؤال في كيف أبدأ بتعلم برمجة تطبيقات أندرويد؟ كانت الإجابة المقبولة
هناك أسلوبان أساسيّان للبرمجة في أندرويد:
1- إنشاء تطبيقات أصليّة native apps:
- باستخدام الأدوات التي توفّرها غوغل لهذا الغرض مثل Android Studio مع لغة البرمجة Java.
- باستخدام المنصّة Xamarin التي تسمح بإنشاء مثل هذه التطبيقات باستخدام Visual Studio 2015 (تأتي مجّانيّة مع الإصدار Visual Studio Community 2015) مع لغة البرمجة سي شارب.
الميّزة في استخدام منصّة Xamarin (المملوكة لمايكروسوفت) هي إمكانيّة كتابة نفس شيفرة التطبيق تقريبًا لأكثر من نظام تشغيل (Android، iOS, Windows Phone).
2- إنشاء تطبيقات هجينة hybrid apps:
هناك العديد من الخيارات التي تسمح لك بإنشاء مثل هذه التطبيقات، ولكنّ معظمها في النهاية يحتاج إلى المكتبة Cordova (أو PhoneGap) للحصول على الخرج النهائي للتطبيق. يعتمد التطبيق الهجين على تقنيّات CSS و JavaScript و HTML5. وتمتاز التطبيقات الهجينة (كما هو الحال مع منصة Xamarin) أنّك تستطيع تشغيل نفس التطبيق الهجين على أكثر من نظام تشغيل بدون تعديلات تُذكر.
هناك الكثير من أُطر العمل التي تسهّل عمليّة إنشاء التطبيقات الهجينة مثل Sencha Touch و Telerik و DevExtreme و Ionic (يعتمد بشكل أساسي على المكتبة AngualrJS).
الجدير بالذكر إلى أنّ PhoneGap المملوك لشركة Adobe يوفّر خدمة سحابيّة لإنشاء التطبيقات على السحابة دون أن تنصّب أيّ شيء على حاسوبك الشخصي، وقد جرّبت هذه الخدمة وهي ممتازة.
الآن إذا أردت نصيحتي:
-إذا كانت لديك خبرة جيّدة في الثلاثي HTML5-CSS-JavaScript فعليك بالتطبيقات الهجينة وأخصّ بالذكر Ionic Framework.
- إذا كانت لديك خبرة بلغة Java فاستخدم Android Studio.
- إذا كانت لديك خبرة بلغة سي شارب فاتجه فورًا إلى Xamarin.
-
إجابة حسام برهان سؤال في كيف أبرمج تطبيق يتنبئ بحالة الطقس بالاعتماد على سجلات حالة الطقس السابقة؟ كانت الإجابة المقبولة
المجال الأفضل هو Machine Learning.
أستطيع إرشادك إلى كورس أكثر من رائع للبروفسور Andrew Ng من جامعة ستانفود. الكورس ممتاز للغاية وهو يرشدك إلى الأسس النظريّة لموضوع Machine Learning بالإضافة إلى تطبيقاته العمليّة.
الكورس عبارة عن سلسلة محاضرات فيديو باللغة الانجليزية، وهو يتطّلب معرفة رياضيّة لا بأس بها خصوصًا في موضوع التفاضل والتكامل Calculus. كما ستحتاج إلى وجود برنامج MATLAB أو البرنامج المجّاني Octave. رابط الكورس.
أمّا إذا كنت تريد استخدام مكوّنات جاهزة فحسب دون الدخول في التفاصيل النظريّة فيمكن استخدام لغة بايثون مثلًا.
انظر إلى هذا المقال الذي يرشدك إلى الخطوات اللازمة لذلك. كما يمكن الإطلاع على هذا الكتاب. وإذا كنت تريد نتائج سريعة يمكنك الإطلاع على هذا الكورس من Udemy.
-
إجابة حسام برهان سؤال في ما المعادلات الرياضية المستخدمة في تطوير لعبة كسر الطوب breakbricks ؟ كانت الإجابة المقبولة
تعتمد فكرة اللعبة بشكل أساسي على مبدأ فيزيائي بسيط. وهو مبدأ إنعكاس الشعاع الضوئي. فعندما ينعكس الشعاع الضوئي على سطح عاكس تكون زاوية الورود له تساوي زاوية الانعكاس. تمثّل الكرة في هذه اللعبة الشعاع الضوئي الوارد فعندما تصطدم بالعارضة الصغيرة في الأسفل تحدث عمليّة الإنعكاس. انظر الشكل المرفق.
الزاوية A هي زاوية الورود (التي ترد فيها الكرة)، والزاوية B هي زاوية الإنعكاس (التي تنعكس فيها الكرة عن سطح العارضة). يجب أن تكون كل من هاتين الزاويتين متساويتين.
هذا عن المبدأ. أمّا بالنسبة للمعادلات الرياضيّة المستخدمة فهي معادلات خطيّة في المستوي. لها الشكل العام التالي:
(y - a) = m (x - b) حيث m هو ميل المستقيم الذي تتحرّك عليه الكرة (لاحظ أنّ حركتها تكون بشكل مستقيم دومًا)، و (a, b) هما إحداثيي نقطة ثابتة من المستوي (قد تكون مثلًا نقطة تقاطع المستقيم حامل الكرة مع المستقيم الأفقي السفلي للشاشة). أمّا (x, y) فهما الإحداثيين الحاليين للكرة باعتبارها نقطة.
بمعرفة الاحداثيين (a,b) و (x,y) يمكن حساب ميل المستقيم بسهولة وبالتالي معرفة زاوية الورود، وبالتالي زاوية الانعكاس لها، وهذا يعطينا بدوره معادلة مستقيم الانعكاس الذي ينبغي على الكرة أن تسير وفقه عند ارتطامها بالعارضة الصغيرة.
الكلام السابق يبقى نفسه تمامًا عند إرتطام الكرة بجدران اللعبة أو حتى بقطع الطوب الموجودة في الأعلى. فزاوية الورود يجب دومًا أن تساوي زاوية الإنعكاس.
أرجو أن يكون كلامي واضحًا. على العموم أنا جاهز لأي استفسار.