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

حسام برهان

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

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

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

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

    31

أجوبة بواسطة حسام برهان

  1. ستحتاج إلى وضع السمة OnItemDataBound="Fetcher" ضمن عنصر الـ repeater على الشكل التالي:

    <asp:Repeater ID="tasks_repeater" runat="server" OnItemDataBound="Fetcher">
      <ItemTemplate>
         <asp:Panel ID="offerHelpVisitor_panel" runat="server"><asp:Panel>
      </ItemTemplate>
    </asp:Repeater>

    و Fetcher هنا هو اسم تابع يجب أن يكون موجودًا ضمن ملف الكود الخاص بالصفحة على الشكل التالي:

    public void Fetcher(object sender, RepeaterItemEventArgs e)
    {
        panels.Add((Panel)e.Item.FindControl("offerHelpVisitor_panel"));
    }

    أمّا بالنسبة للمتغيّر panels فهو من النوع List<Panel> حيث سيحتفظ بمرجع reference لكل عنصر Panel يتم توليده ضمن الـ repeater. عليك أن تصرّح عن هذا المتغيّر ضمن الصنف الخاص بالصفحة على الشكل التالي:

    private List<Panel> panels = new List<Panel>();

    عند تحميل الصفحة سيتم استدعاء التابع Fetcher عددًا من المرّات مساويًا لعدد عناصر الـ Panel التي سيولّدها الـ repeater وبالتالي يمكن أن تصل إليها جميعها عن طريق المتغير panels.

  2. أهلًا وسهلًا، السبب في هذه المشكلة أنّك كنت تستخدم ترميز ascii وهو غير ملائم للغات المختلفة عن اللغة الانجليزية، حيث لا يستطيع تمثيل الأحرف الخاصة التي لا توجد في أبجدية اللغة الانجليزية.

  3. إذًا أنت تعمل على 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 ولم يعد موجودًا على مستوى الصنف.

  4. لغة 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 بشكل متكامل عن طريق هذه السلسلة التعليميّة.

    • أعجبني 1
  5. هل الحقلين 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 إليه.

    • أعجبني 1
  6. حسبما يظهر من الصور المرفقة، فهناك مشكلة في مفتاح API التي أعطته إيّاك غوغل. 

    والسؤال هنا، هل كان موقعك يعمل منذ فترة ثم توقّف عن العمل فجأة؟ إذا كان الأمر كذلك، وكان مفتاح API الذي تستخدمه مجاني، فهناك حدود للإستهلاك يبدو أنّك قد وصلت إليها لذلك توقّف غوغل عن الاستجابة.

    يمكنك مراجعة المزيد عن هذا الموضوع من هنا، حيث يتحدّث عن أنواع الاستيثاق الذي تستخدمه غوغل للوصول إلى خدمة خرائطها.

     

    • أعجبني 1
  7. نعم الأفضل أن تقوم بذلك باستخدام SQL Server.

    بالنسبة لمنع أكثر من 3 رغبات، فستحتاج إلى القيام بذلك بشكل برمجي، ويكون ذلك على الشكل التالي:

    1- قبل إضافة أي مُدخل (سجل) إلى الجدول StudentSchools والذي يمثّل رغبات الطلاب بالنسبة للمدراس، عليك أن تحصي عدد المدخلات الموجودة ضمن هذا الجدول لطالب محُدّد.

    2- إذا كانت عدد المدخلات (الرغبات) لهذا الطالب أقل من 3 عندها فيمكنك إضافة مُدخل (رغبة) جديد. وإلّا فترفض تنفيذ هذه العمليّة.

    يمكنك إحصاء عدد المدخلات (الرغبات) الحالية لطالب محدد ضمن الجدول StudentSchools باستعلام SQL بسيط على الشكل التالي:

    SELECT COUNT(StudentId) FROM StudentSchools WHERE StudentId = @student_id

    حيث @student_id هو معرّف الطالب المراد البحث عنه

    • أعجبني 1
  8. أولًا لا أنصح مطلقًا باستخدام Access لأنّها غير مصمّمة أبدًا لهذه الغاية، وستحصل عاجلًا أم آجلًا على الكثير من المشاكل. استخدم بدلًا منها قواعد بيانات SQL Server

    على العموم ستحتاج برأيي إلى ثلاث جداول:

    1- جدول Students يحتوي على بيانات الطلاب ويضم ثلاثة حقول:

    • StudentId معرّف الطالب (مفتاح رئيسي)
    • Name اسم الطالب
    • Degree الدرجة العلمية للطالب.

    2- جدول Schools يحتوي على بيانات المدارس ويضم ثلاثة حقول:

    • SchoolId معرّف المدرسة (مفتاح رئيسي)
    • Name اسم المدرسة.
    • MinDegree الدرجة الدنيا للقبول في المدرسة.

    3- جدول StudentSchools وهو جدول الربط بين الطلاب والمدارس ويضم حقلين:

    • StudentId معرف الطالب (مفتاح رئيسي)
    • SchoolId معرّف المدرسة (مفتاح رئيسي)

    ومن الممكن إنشاء مفتاح ثانوي foreign key بين الجدول الثالث وبين كل من الجدولين الأوّل والثاني وفق StudentId و SchoolId على الترتيب.

    بالنسبة إلى أنّ كل طالب يمكن ان يكون له 3 رغبات فقط، فهذا أمر يتم إنجازه من خلال الشيفرة البرمجية.

    • أعجبني 1
  9. يمكنك ذلك بالطبع، لقد كتبت لك مثالًا بسيطًا يرشدك لهذا الأمر. أجريت الفرضيّات التالية عند كتابتي لهذا المثال:

    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 ليفهمها ويعرضها لك مرّة أخرى. يمكنك تنفيذ البرنامج بوضع التنقيح وتنفيذه خطوة بخطوة لتفهم ما يجري بالضبط.

  10. لقد أجريت تعديلًا على البرنامج الأساسي الذي يأتي مع هذه الخوارزمية، انظر إلى التعديل التالي الذي يعطيك اسم الصلاة القادمة حسب توقيت مدينة حلب:

    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]);
            }

     

    • أعجبني 2
  11. يمكنك ذلك باستخدام تقنية السحب والإفلات drag and drop. فإذا فرضنا أنّك تريد سحب PictureBox على النموذج form فعليك في البداية أن تضبط الخاصية AllowDrop لهذا النموذج لتكون true. صمّمت لك برنامجًا بسيطًا يوضّح آلية العمل في سحب PictureBox تحوي صورة على النموذج.

    MovePictureBox.zip

  12. أحد الأساليب الممكنة لذلك هو في إنشاء متغيّر من النوع 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
  13. في الواقع أنّه لا شبه بينهما إلا من ناحية الاسم فقط.

    يكمن الفرق الجوهري بينهما في أن لغة Java هي لغة يتم ترجمة التعليمات البرمجية المكتوبة بها عن طريق برنامج اسمه المترجم Compiler إلى لغة وسيطية تسمى ByteCode يتم تنفيذها عبر ما يسمى بآلة جافا الافتراضية Java Virtual Machine أو اختصارا JVM حيث يمكن للبرامج المكتوبة بلغة جافا أن تعمل على أي جهاز مهما كان نوعه طالما توفر لنظام تشغيل هذا الجهاز آلة جافا افتراضية تعمل عليه.

    أما لغة JavaScript فهي لغة نصية scripting language يتم تنفيذ تعليماتها البرمجية باستخدام المفسر Interpreter تعليمة برمجية تلو الأخرى. تعمل البرامج المكتوبة بهذه اللغة ضمن متصفح الويب على حاسوب المستخدم، وهي أساسية في كتابة برامج تسمح بالتفاعل مع المستخدم الذي يتصفح صفحات الويب. ومؤخرا أصبح بالإمكان كتابةتطبيقات بهذه اللغة تعمل ضمن بيئة تشغيل تسمى node.js. تمّ تصميم node.js للسماح لتطبيقات JavaScript للعمل على الخواديم، بحيث تصبح لغة برمجة من جهة الخادوم مثل PHP و Ruby on Rails وغيرهما.

  14. هناك أسلوبان أساسيّان للبرمجة في أندرويد:

    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.

     

     

    • أعجبني 2
  15. المجال الأفضل هو Machine Learning.

    أستطيع إرشادك إلى كورس أكثر من رائع للبروفسور Andrew Ng من جامعة ستانفود. الكورس ممتاز للغاية وهو يرشدك إلى الأسس النظريّة لموضوع Machine Learning بالإضافة إلى تطبيقاته العمليّة.

    الكورس عبارة عن سلسلة محاضرات فيديو باللغة الانجليزية، وهو يتطّلب معرفة رياضيّة لا بأس بها خصوصًا في موضوع التفاضل والتكامل Calculus. كما ستحتاج إلى وجود برنامج MATLAB أو البرنامج المجّاني Octave. رابط الكورس.

    أمّا إذا كنت تريد استخدام مكوّنات جاهزة فحسب دون الدخول في التفاصيل النظريّة فيمكن استخدام لغة بايثون مثلًا.

    انظر إلى هذا المقال الذي يرشدك إلى الخطوات اللازمة لذلك. كما يمكن الإطلاع على هذا الكتاب. وإذا كنت تريد نتائج سريعة يمكنك الإطلاع على هذا الكورس من Udemy.

     

×
×
  • أضف...