• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Tayseer_Project

اعضاء جدد
  • عدد المشاركات

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

  • تاريخ اخر زياره

السمعه بالموقع

5 عادي

عن Tayseer_Project

  • الرتبة
    عضو جديد

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

  • الجنس ذكر

أحدث الزائرين لملفلك الشخصي

796 زياره للملف الشخصي
  1. درس: البداية مع Kinect

    السلام عليكم ورحمة الله، كنت اراجع الدرس - لم اعرف لماذا لم اضع البرامج مع الدروس. البرامج في المرفقات. طبعا يتطلب وجود جهاز ال kinect لغرض التنفيذ.   و على امل اكمال الدروس في المستقبل KinectCam.rar DepthCam1.rar DepthCam2.rar
  2. البداية مع الـ WCF

    شكرا لك اخي 1z1z و جزاك الله بالمثل.   اهلا بك اخي عمرو - وان شاء الله استفدت من الدروس. اسأل الله ان يبارك في اوقاتنا لاستطيع  اكمال بقية الدروس. موضوع ال WCF دقيق نوعا ما ويتطلب ان تكون انت كذلك دقيق في الخطوات - يجب ان تتبع الخطوات المذكورة بالضبط والا تظهر لك الاخطاء. انا ايضا مبتدئ في الموضوع - وكانت عندما تظهر لي اخطاء - كنت احاول ان اكون مشروع جديد و ابدء من جديد. بالنسبة للسؤال الاول - تاكد من IMyCalculator.cs يجب ان يكون هكذا  namespace MyCalcService{    [ServiceContract()]    public interface IMyCalculator    {         [OperationContract()]         int Add(int num1, int num2);    }}واحدة من اسباب الخطأ في صورتك الاولى مثلا هو عدم وجود   [ServiceContract()]بالنسبة لهذا السؤال  لم افهم ماذا تقصد بالضبط - لكن عموما لتكون service هناك اكثر من طريقة - لذا يمكنك من التغيير نوعا ما في البرنامج - لكن هناك اساسيات يجب ان تحافظ عليها.   بالنسبة للسؤال الاخير - لست متأكد من الخطأ - لكن يبدو انه لديك مشكلة في برنامج MyCalcServiceHost  والذي هو مسؤول عن عملية الاستضافة - الخطأ يقول انه ليس هناك entrypoint - وهذه المفروض مضافة عن طريق هذا السطر في برنامج الاستضافة.  host.AddServiceEndpoint(typeof(MyCalcService.IMyCalculator), new WSHttpBinding(), "");و لا توجد اي مشكلة اخي من الاسئلة - فهي تغني الموضوع ان شاء الله - وانا اجيب على قدر معلوماتي البسيطة لأني كما ذكرتُ انا مبتدئ و اتعلم واكتب الدروس في نفس الوقت.   بالتوفيق
  3. البداية مع الـ WCF

    السلام عليكم ورحمة الله، هذا الدرس سيكون تطبيق عملي – سنأخذ مثال بسيط يوضح بعض الامور عمليا ثم بعدها سنعود لنتكلم عن بعض الامور نظريا ان شاء الله. في الدرس الاول ذكرتُ التالي:   وهذا ما سنتعامل معه في هذا الدرس. سنرى كيف ان الـ Visual Studio توفر عليّ الوقت و الجهد مع هذه المشاريع. كون مشروع جديد من نوع WCF Service Library وسمه AdditionServiceLibrary الان لو تلاحظ من ال solution explorer انه مباشرة تم تكوين ملف ال interface ثم class يقوم بتطبيق هذه ال interface اضافة الى ملف ال config قم بحذف ملفي ال Service1.cs و IService1.cs و ذلك بتحديدهما و الضغط على زر delete. و سنقوم نحن بأضافة الملفات من الصفر. ال service التي سنقوم بتطبيقها ستكون عبارة عن دالة لجمع عددين من نوع complex – كما في الخطوات بالامثلة السابقة عموما – سنحتاج الى تعريف interface ثم class يعمل تطبيق لهذه ال interface – اضافة انه في مثالنا هذا سنتحتاج ان نضيف class اخر لتمثيل الارقام من نوع complex. لعمل كل هذه الامور – يمكننا اما ان نضيف ثلاث ملفات (ملف لكل نقطة) او يمكننا ان نضيف ملف واحد و نقوم بتعريف جميع هذه الامور ضمنه (وهذا ما سنفعله في مثالنا هذا) قم بأضافة ملف من نوع class الى المشروع و سمه مثلا AdditionService   ثم سنقوم بأضافة الكود – و سيكون كاملا كالاتي:   namespace AdditionServiceLibrary{    [DataContract]    public class Complex    {        [DataMember]        public int real;        [DataMember]        public int imag;    }    [ServiceContract]    public interface IAdditionService    {        [OperationContract]        Complex Add(Complex c1, Complex c2);    }    public class AdditionService : IAdditionService    {        public Complex Add(Complex c1, Complex c2)        {            Complex result = new Complex();            result.real = c1.real + c2.real;            result.imag = c1.imag + c2.imag;            return result;        }    }}قمنا اولا بتعريف ال class الخاص ب complex ثم عرفنا ال interface لل service ثم قمنا بأضافة ال class الذي يعمل تطبيق لهذه ال interface وهو يحوي على دالة لجمع عددين من نوع complex. الدالة ستستلم عددين نوع complex و تقوم بأرجاع نوع complex – اي ان هذا ال class سيتم ارساله بين ال service وال client، ولهذا لاحظ تعريف ال complex class كان مختلف قليلا عن تعريف اي class بالصورة الاعتيادية. اقصد اننا سبقناه ب [DataContract] ثم سبقنا كل عضو داخل هذا ال class ب [DataMember] وهذا لكي يتم نقل هذا ال class بين ال service و ال client.   اضغط double click على ملف الApp.config  وسنقوم بتعديلات بسيطة عليه و ذلك لان هذا الملف مكتوب لملف ال Service1.cs و ملف ال IService1.cs الذين قمنا بحذفهما – لذا سنقوم بكتابة AdditionService بدل Service1 و IAdditionService بدل IService1 بالمحصلة سيكون الملف كالاتي:   <?xml version="1.0" encoding="utf-8" ?><configuration>  <system.web>    <compilation debug="true" />  </system.web>  <system.serviceModel>    <services>      <service name="AdditionServiceLibrary.AdditionService">        <host>          <baseAddresses>            <add baseAddress = "http://localhost:8732/Design_Time_Addresses/AdditionServiceLibrary/AdditionService /" />          </baseAddresses>        </host>        <endpoint address ="" binding="wsHttpBinding" contract="AdditionServiceLibrary.IAdditionService">          <identity>            <dns value="localhost"/>          </identity>        </endpoint>        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior>          <serviceMetadata httpGetEnabled="True"/>          <serviceDebug includeExceptionDetailInFaults="False" />        </behavior>      </serviceBehaviors>    </behaviors>  </system.serviceModel></configuration>طبعا نحن انشئنا مشروع من نوع WCF Service Library وهذا كما ذكرنا يوفر و يسهل على المطور بعض الامور. اذا تذكرون في التطبيقات السابقة – كنا بعد ان ننتهي من كتابة ال service كنا نقوم بعمل لها hosting. الان ومع هذا النوع من البرامج – يمكنني ان انفذ البرنامج بعد الانتهاء من كتابة ال service وقبل عمل hosting لها. الان قم بتنفيذ البرنامج – لاحظ ان ال VS سيستدعي برنامج WCF Test Client والذي من خلاله يمكنك التاكد من ال service التي قمت بتطويرها و انها تعمل بصورة صحيحة. لاحظ الصورة     يمكنك من خلال هذه النافذة ادخال قيم الادخال للدالة Add ثم الضغط على Invoke و ستظهر لك النتيجة في الجزء السفلي.   هذا الامر فقط للتأكد من ان ال service تعمل بصورة صحيحة – و بعدها يمكنك عمل ال Hosting ثم كتابة برنامج Client للتعامل مع هذه ال service.   اريد ان اتكلم عن امر اخر. لو رجعت الى الفيجوال استوديو. كما رأينا ملف ال config يمكنك ان تعدل عليه من خلال الكود. هناك طريقة اخرى اسهل وهي، اضغط بالزر الايمن على ملف ال config واختر كما في الصورة     ستظهر لك هذه النافذة     والتي من خلالها يمكنك التعديل على هذا الملف بسهولة. مثلا لأضافة endpoint جديدة نقوم بالاتي:     ثم اسم ال interface     ثم طريقة الاتصال – و لتكن مثلا tcp     ثم نعطي العنوان     واخيرا Finish   لاحظو الان تم اضافة endpoint جديدة   طبعا لانه البرنامج بالاساس كان يحوي على two endpoints سيكون الان لدينا three endpoints. عند غلق ال editor سيطالبك بالخزن اضغط نعم – ثم اضغط yes ليقوم باعادة تحميل ملف ال config لترى التغيير في الكود الخاص بالملف.   طبعا عن طريق ال Config. Editor يمكنني انجاز الكثير من الامور و بسهولة – كما لاحظتم –   الان يمكنك ان تعمل Hosting لهذه ال service كما تعلمنا في الدروس السابقة – لكني انوي ان شاء الله ان اغير طريقة ال hosting – كما ذكرنا هناك اكثر من طريقة لهذا الامر – ونحن كنا نستخدم ال self-hosting وانا انوي ان شاء الله ان استخدم طريقة ال windows services في درس قادم ان شاء الله.   ما بقي من امور مهمة سأوضحها في قادم الدروس ان شاء الله: 1-  الحديث عن ملف ال config والذي لم نعطيه حقه الى الان مع بعض التطبيقات بأستخدام ال editor. 2-  عملية ال hosting بأستخدام ال windows services.   و السلام عليكم ورحمة الله
  4. البداية مع الـ WCF

    السلام عليكم ورحمة الله،   هذا الدرس ممكن اعتباره ملحق للدرس السابق. سأقوم بأعادة كتابة نفس البرنامج في الدرس الاول لكن هذه المرة سأقوم بتعريف ال endpoint الخاصة بال service في ملف ال config. لذا يمكنك فتح البرنامج في المثال الاول للتعديل عليه. سيكون تعديلنا على الجزء المتلعق ببرنامج ال hosting. اضغط بالزر الايمن على مشروع ال hosting والذي كان اسمه MyCalcServiceHost و اختر Add à new item ثم اختر Application Config. File     ستكون لديك ملف كما في الصورة     وهنا يمكنك ان تقوم بأضافة ال endpoints الخاصة ب service. سنقوم بتعديل هذا الملف كالاتي:   <?xml version="1.0" encoding="utf-8" ?><configuration>  <system.serviceModel>    <services>      <service name = "MyCalcService.MyCalculator"               behaviorConfiguration="MyCalcServiceMEXBehavior">        <endpoint address = ""        binding = "basicHttpBinding"        contract = "MyCalcService.IMyCalculator"/>        <endpoint address = "mex"        binding = "mexHttpBinding"        contract = "IMetadataExchange" />        <host>          <baseAddresses>            <add baseAddress = "http://localhost:8080/SimpleCalculator"/>          </baseAddresses>        </host>      </service>    </services>    <behaviors>      <serviceBehaviors>        <behavior name = "MyCalcServiceMEXBehavior" >          <serviceMetadata httpGetEnabled = "true" />        </behavior>      </serviceBehaviors>    </behaviors>  </system.serviceModel></configuration>  الان – اذهب الى ملف Program.cs التابع لبرنامج ال host و غيره كالاتي class Program    {        static void Main(string[] args)        {                       //Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");                       ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator));            host.Open();            Console.WriteLine("Service is hosted at " + DateTime.Now.ToString());            Console.WriteLine("Host is up and running... Press <Enter> key to stop");            Console.ReadLine();        }    }لاحظ اننا قمنا بحذف الكود الخاص بتعريف ال endpoint وذلك لاننا قمنا بأضافتها عن طريق ملف ال config. الان اضغط ctrl + F5 لتنفيذ البرنامج. دع البرنامج يتنفذ واذهب الى مشروع ال client و اضغط بالزر الايمن على ServiceReference1 واختر Update Service Reference. كما في الصورة   ثم قم بتنفيذ البرنامج – وستحصل على نفس النتيجة في الدرس الاول.   طبعا بقي ان نشرح ملف ال config و خاصة الجزء الخاص ب IMetadataExchange و هذا ما سأقوم به في الدرس القادم ان شاء الله. و السلام عليكم ورحمة الله
  5. البداية مع الـ WCF

    السلام عليكم ورحمة الله،   في الدرس الماضي رأينا عمليا كيف من الممكن عمل WCF Service ثم كيف الوصول اليها من خلال الـ client. قبل البدء في هذا الدرس اود ان اوضح نقطة بخصوص الدرس السابق وهي ان جزء الـ client (اقصد الخطوات التي اتبعناها لكتابة برنامج الـ client) يمكن ان تنفذ من حاسبة ثانية غير الحاسبة التي تستضيف الـ service. فقط سيتطلب الامر اعطاء الـ IP الخاص بالحاسبة المستضيفة. مثلا لو لديك حاسبتين على نفس الشبكة و لنفرض عناوينها 10.0.0.1 10.0.0.2   لو قمت ببناء الـ service على الحاسبة الاولى ثم تريد استضافتها عليها – كل ما عليك فعله هو تغير الكود السابق في الدرس الاول في برنامج ال hosting وتحديدا هذا السطر   Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");      الى     Uri httpUrl = new Uri("http://10.0.0.1:8080/SimpleCalculator");      ثم على الحاسبة الثانية عند بناء برنامج الـ client يجب اعطاء هذا العنوان في هذه النافذة       و هذا كل ما في الامر!!   الان دعونا نبدء بدرسنا الثاني   في الدرس السابق كان لدينا برنامج عملي بعيد عن كثير من التوضيحات التي تخص تقنية ال wcf.. لذا في هذا الدرس – مستعينا بالله - اود ان اوضح بعض هذه الامور. ساتكلم اولا عن ما يعرف ب The ABCs of WCF   لكي يتم الاتصال بين برنامج ال client وبرنامج ال host يجب ان تكون هنالك ثلاث امور معروفة والتي يرمز لها اختصارا ب ABC وهي   1-  Address2-  Binding3-  Contract    الامر الاول وهو العنوان Address الخاص بال service. وهذا الامر حددناه في برنامجنا السابق في هذه الجملة     Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");     طبعا العنوان يجب ان يكون unique  وهو يتكون من اكثر من جزء   الجزء الاول هو البروتوكول المستخدم – وهو في مثالنا http الجزء الثاني هو machine or domain والذي كان ممثلا ب localhost – وهو اما اسم الحاسبة او ال IP الخاص بها. الجزء الثالث وهو رقم ال port  وهو اختياري لان لدينا ال default port – مثلا عند استخدامنا لل  Http Binding سيكون ال port هو 80. ثم اخيرا ال path الخاص بال service.   ملاحظة: 1-      لو اردنا استخدام TCP Address فيجب  كتابة net.tcp بدل http فسيكون لدينا عنوان كالاتي مثلا:   Net.tcp://localhost:8888/MyService2-     الـ WCF يمكن ان تستخدم للأتصال بين two processes على نفس الحاسبة (ما يعرف ب Inter-Process Communication)  في هذه الحالة يجب استخدام net.pipe في بداية ال address.   الامر الثاني وهو ال Binding والذي نستخدمه لتحديد نوع ال network protocol  - مثلا http او tcp و غيرها - وهذه البروتوكولات مدعومة ضمنيا مع ال wcf – ولو تلاحظون في البرنامج السابق قمنا باستخدام WSHttpBinding لتحديد نوع البروتوكول.. و هناك عدة انواع اخرى مثلا BasicHttpBinding NetTcpBinding   ومن خلال ال binding يمكننا ايضا تحديد امور اخرى مثلا تحديد ال channels هل ستكون one-way, request-reply, or duplex ايضا يمكننا تحديد ال encoding مثلا xml or binary   الامر الثالث  وهو ال Contract وهي ال service نفسها – والتي كانت ممثلة ب interface و التي تحوي على ال methods التي تصدرها ال service للعالم الخارجي! كما لاحظتم في البرنامج الاول يجب ان نعرف ال interface بهذا الشكل       [ServiceContract]    public interface IMyCalculator               اي يجب استخدام     [serviceContract] قبل التعريف. ثم عندما نعرف ال methods يجب ان نسبقها ب           [OperationContract]  ولا مانع من ذكر هذه الامور باللغة الانكليزية مأخوذة من كتاب Pro WCF 4 Practical Microsoft SOA Implementation 2nd Edition   -          The address specifies where the messages can be sent (or where the service lives).-          The binding describes how to send the messages.-          The contract describes what the messages should contain.هذه الامور الثلاثة مجتمعة تسمى endpoint والتي تعتبر كبوابة gateway يتم من خلالها التعامل مع ال service. طبعا كل service عند بنائها يجب ان تحوي على الاقل endpoint واحدة – ممكن اكثر طبعا. هذا بالنسبة لبرنامج ال service او على الجهة اخرى – واقصد بها ال client side – سيكون لدينا endpoint  واحدة فقد لل service. طبعا يمكن لبرنامج ال client ان يتصل مع اكثر من service ولكل service يكون لها endpoint خاصة بها. لكن لل service  الواحدة سيكون لدينا endpoint واحدة.     برمجيا – لتعريف endpoint – اما يتم ذلك عن طريق الكود كما فعلنا في البرنامج السابق و استخدمنا مثلا هذه الدالة AddServiceEndpoint – او يمكننا استخدام ملف ال app.config والذي هو اسهل ويجنبك الاخطاء الاملائية حيث يمكنك استخدام wizard للتعامل معه. اذا تذكرون في بداية الدرس السابق قلنا هناك اكثر من طريقة لتكوين مشروع لبناء service وكانت الطريقة الاولى هي بناء مشروع من نوع Class Library – وهذا ما استخدمناه في برنامجنا الاول – وقلنا هذا يتطلب اضافة المكتبات المطلوبة يدويا – اضافة الى انه لا يحوي على ملف app.config. الطريقة الثانية التي ذكرناها هي بناء مشروع من نوع WCF Service Library والتي ستقوم مباشرة بتكوين ملف ال app.config مع اضافة المكتبات المطلوبة.. في الدروس القادمة سنتعامل قليلا مع هذه الطريقة.   ملاحظة: أريد ان اشير هنا الى نقطة. في برنامج ال host  في الدرس السابق استخدمنا دالة AddServiceEndpoint لاضافة endpoint. قد تجد ربما في بعض الامثلة على النت او في الكتب – ان برنامج ال host يكون ابسط من برنامجنا في مثالنا الاول حيث يتكون فقط من شيء من هذا القبيل               Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");                       ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator), httpUrl);            host.Open();  دون ان يضيف endpoint بصورة واضحة! هذا يتم فقط مع ال .NET 4.0 وما يليها حيث تم اضافة خاصية Default Endpoints – اي هناك endpoints معرفة يتم استخدامها في حالة عدم تحديد واحدة بصورة صريحة.   دعوني الخص موضوع ال endpoint بهذه النقاط   -          Every service must expose at least one endpoint.-          Each endpoint has exactly one contract.-          All endpoints on a service have unique addresses-          A single service can expose multiple endpoints-          You can configure endpoints either administratively (using a config file) or programmatically.موضوع اخير اريد الحديث عنه ايضا و هو عملية ال hosting. في البرنامج السابق قمنا بكتابة Console Application لعمل استضافة لل service الخاصة بنا بالاعتماد على ServiceHost class – هذه الطريقة تسمى ب Self-hosting وهناك انواع عديدة اخرى لعملية ال hosting مثلا   -          Hosting using IIS-          Hosting in windows services-          Hosting in Windows Azureربما سنفصل اكثر في هذه الطرق اذا استخدمناها مستقبلا ان شاء الله.   لازال الامر يتطلب الكثير من الكلام و التطبيق العلمي - ان شاء الله نكمل في اقرب وقت.
  6. البداية مع الـ WCF

    البرنامج في المرفقات.   MyCalcService.rar
  7. السلام عليكم ورحمة الله،   هذه بداية مختصرة عن تقنية الـ wcf.. و اقول مختصرة لان هذه التقنية واسعة وبها تفاصيل كثيرة لست ملما بها جميعا في الوقت الحالي، لكني حبيت ان اسجل ما اعرفه الان – و سأضعها على اجندتي ان شاء الله لأفصل بها لاحقا ما ان تسنح لي الفرصة. لهذا لن اتكلم في هذا الدرس عن هذه التقنية بصورة نظرية او اعطاء لمحة تاريخية ، بل سأحاول البدء بتطبيق مباشرة.   نبدء على بركة الله..   عند بناء WCF distributed system بصورة عامة سيكون لدينا ثلاث مكونات اساسية: 1-      ملف الـ dll والذي سيحوي على الـ service المراد تكوينها (WCF Service assembly) 2-      برنامج يقوم بعمل أستضافة لهذه الـ service  (WCF service host) 3-      برنامج الـ client المستفيد من هذه الـ service (WCF client) نحن سنستخدم الـ Visual Studio 2010 مع لغة C# لعمل هذه الاجزاء، و طبعا هناك اكثر من طريقة لانشاء كل جزء، و سنفصل بها لاحقا ان شاء الله.   الان، لنكون برنامج جديد من اجل بناء wcf service – يمكننا ذلك من خلال تكون مشروع جديد من خلال الفيجوال ستوديو- ويكون المشروع من نوع Class Library و في هذه الحالة سنحتاج الى أضافة الـ references يدويا الى المشروع (سنرى هذا لاحقا) و هناك خيار ثاني و هو انشاء مشروع من نوع WCF Service Library وهنا ستكون جميع المكتبات مضافة الى برنامجنا تلقائيا، وايضا سيكون ملف الـ App.config مضاف الى المشروع (وربما سنتكلم عن هذا الملف لاحقا) وهناك ايضا خيار ثالث وهو تكون new website ثم اختار WCF Service وهنا عملية الـ hosting ستكون داخل الـ IIS.   لا اظننا سنتعامل مع الخيار الثالث – لكن ان اسعفني الوقت – سنتكلم عن الخيار الاول و الثاني ان شاء الله و توضيح ذلك بأمثلة بسيطة توضح الخطوات التي يجب اتباعها.. لكي تتضح الصورة لدى القارئ الكريم. سنكون مثال يحوي على service بسيطة وظيفتها جمع عددين ثم ارجاع نتيجة الجمع.   قم بتشغل الـ Visual studio لنبدء بكتابة اول تطبيق لنا. ستحتاج ان تقوم بتشغيل برنامج الـ VS بصلاحيات الادمن. لعمل ذلك اضغط بالزر الايمن على برنامج الـ VS  واختر منها Run as administrator     وهذا الامر مهم والا سيظهر لك اخطاء وقت التنفيذ.   الجزء الاول   كون مشروع جديد من نوع Class Library و سنسميه MyCalcService     قم بأضافة ملف جديد الى المشروع – وذلك بالضغط بالزر الايمن على اسم المشروع كما في الصورة التالية     من النافذة الظاهرة – اختر Interface وسمها IMyCalculator     سيكون الملف بهذا الشكل بعد اضافة الكود النهائي اليه namespace MyCalcService{    [ServiceContract()]    public interface IMyCalculator    {        [OperationContract()]        int Add(int num1, int num2);    }}  (يرجى الانتباه الى كلمة public المضافة قبل  كلمة interface ) لو تلاحظ انه لم يتم التعرف على ServiceContract و OperationContract وهذا لاننا لم نقم بأضافة المكتبة المطلوبة، و لأضافتها اضغط بالزر الايمن على اسم المشروع واختار Add Ref.     ثم من الجزء الخاص بـ .NET اختر System.ServiceModel     ثم اضف هذه الجملة في اعلى الكود   using System.ServiceModel;من نافذة الـ Solution Explorer قم بأعادة تسمية ملف الـ Class1.cs الى MyCalculator.cs     وسيكون الشكل النهائي لهذا الملف كالاتي بعد اضافة الكود اليه     namespace MyCalcService{    public class MyCalculator : IMyCalculator    {        public int Add(int num1, int num2)        {            return num1 + num2;        }    }}وهنا قد انتهينا من كتابة الـ service الخاصة بنا – ويمكنك عمل Build للمشروع. سأوضح المشروع السابق باختصار. لكي نقوم بعمل service فاول شيء يجب تعريف ما يعرف بـ Service contract.   A service contract is essentially a group of operations that you want to support on the service.   وهذه تم تمثيلها في الكود السابق بـ interface والتي قمنا تعريفها كـ ServiceContract بعد ذلك قمنا بتعريف الدوال المراد تصديرها من الـ service وفي مثالنا لدينا دالة واحدة فقط وهي دالة الـ Add  والتي تم تعريفها على انها OperationContract. وهذا الامر يجب ان نفعله مع اي دالة نريد ان نصدرها من الـ service. يعني مثلا للتوضيح لو اردنا ان نقوم بالعمليات الحسابية الاربعة سيكون حينها شكل الـ service كالاتي:           [ServiceContract()]        public interface IMyCalculator        {            [OperationContract]            double Add(double n1, double n2);            [OperationContract]            double Subtract(double n1, double n2);            [OperationContract]            double Multiply(double n1, double n2);            [OperationContract]            double Divide(double n1, double n2);        }  وبعد تعريف الـ interface  نقوم بتعريف class لعمل implementation  لهذه الـ service. -- هنا انتهينا من الجزء الاول و سننتقل الى الجزء الثاني و هو عمل hosting لهذه الـ service.   الجزء الثاني   قم بأضافة مشروع جديد الى الـ solution الحالي. قم بالضغط بالزر الايمن على اسم الـ solution كما في الصورة     سنكون مشروع من نوع Console Application ونسمه  MyCalcServiceHost     كما فعلنا في البرنامج السابق قم بأضافة System.ServiceModel الى المشروع. ثم سنقوم اضافة Ref. اخر، لكن هذه المرة من الجزء الخاص بـ  Projects اختر المكتبة الناتجة من المشروع الاول     الان قم بأضافة جمل الـ using في اعلى الجزء الخاص بالكود    using System.ServiceModel;using System.ServiceModel.Description;                     دالة الـ Main ستكون كالتالي  class Program    {        static void Main(string[] args)        {                       Uri httpUrl = new Uri("http://localhost:8080/SimpleCalculator");                       ServiceHost host = new ServiceHost(typeof(MyCalcService.MyCalculator), httpUrl);            host.AddServiceEndpoint(typeof(MyCalcService.IMyCalculator), new WSHttpBinding(), "");            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();            smb.HttpGetEnabled = true;            host.Description.Behaviors.Add(smb);            host.Open();            Console.WriteLine("Service is hosted at " + DateTime.Now.ToString());            Console.WriteLine("Host is up and running... Press <Enter> key to stop");            Console.ReadLine();        }    }  لفهم الكود التالي نحتاج الى توضيح بعض الامور المتعلقة بـ WCF.. سأاجل هذه الامور الى الدرس القادم ان شاء الله.. وهنا سأكتفي بوضع الكود فقط.   الان يمكنك تنفيذ البرنامج. اضغط بالزر الايمن على اسم المشروع واختر كما في الصورة     ثم نفذ البرنامج.     الجزء الثالث   الان سنقوم بعمل برنامج client لأستخدام الـ service الخاص بنا.   سنكون مشروع جديد من نوع Console App.  و سنسميه ConsoleHost (يمكنك ان تضيف مشروع جديد الى الـ solution الحالي او ان تشغل نسخة جديدة من برنامج الـ VS و تنشئ مشروع جديد)   لتتعامل مع الـ service من خلال الـ client يجب ان تكون ما يعرف بالـ proxy لعمل ذلك هناك طريقتين اولا – بأستخدام الاداة svcutil.exe و التي يمكن تشغيلها من خلال الـ cmd الخاص بالـ VS والذي يمكن ان تصل اليه من خلال قائمة start مع ملاحظة انه ايضا يجب تشغيله تحت صلاحيات admin     (و نحن في هذا المثال لن نستخدم هذه الطريقة)   الطريقة الثانية لعمل الـ proxy هي من خلال الـ VS وذلك بالضعط بالزر الايمن على المشروع و اختيار كما في الصورة   في النافذة التي تظهر قم بأدخال عنوان الـ service التي تريد الوصول اليها. عندما قمنا بعمل hosting لل service في الكود في الاعلى – قمنا باعطاء هذا العنوان http://localhost:8080/SimpleCalculator وهذا هو عنوان ال service الذي يجب ادخاله هنا. طبعا هنا يجب ان تكون ال service شغالة. يعني برنامج ال hosting  يجب ان يكون شغال في هذه الاثناء.   انا لدي ثلاث مشاريع في ال solution سأقوم اولا بتنفيذ برنامج ال hosting بالضغط على Ctrl + F5 لكي يكون التنفيذ بدون debug لكي استطيع العودة و التعامل مع برنامج ال VS الان من النافذة التي تظهر عند اختيار Add Service Ref. سنقوم بأدخال عنوان ال service     ثم نضغط على Go   لاحظ ان ال service الخاصة بي ستظهر     الان يمكنك الضغط على زر OK لاحظ انه تمت اضافتها الى المشروع     ومن خلال ال Object Browser يمكنني مشاهدة ال class والدالة الخاصة بال service .     الان سنضيف الكود المطلوب   في دالة ال Main اضف             MyCalculatorClient ch = new MyCalculatorClient();            Console.WriteLine(ch.Add(4, 5).ToString());            Console.ReadLine();  واضف في اعلى البرنامج جملة ال using using Consolehost.ServiceReference1;مع ملاحظة ان هذه الجملة ستختلف حسب اسم برنامجك – و لهذا يمكنك الضغط على MyCalculatorClient بالزر الايمن و اختيار Resolve لكي يقوم ال VS باضافة المكتبة لك.   الان لدي برنامج ال hosting منفذ مسبقا و هو قيد التنفيذ حاليا. ساقوم بعمل برنامج ال client على انه البرنامج الاساسي للتنفيذ ثم اقوم بتنفيذه       مبروك الان انتهيت من تنفيذ برنامجك الاول.   اعلم انه هناك بعض الامور بحاجة الى التوضيح. سأحاول ان اوضحها في درس لاحق.  و ايضا سأحاول التطرق الى عملية ال hosting فهناك اكثر من طريقة لعمل ذلك.. سأحاول التفصيل اكثر اذا شاء الله و سنح لي الوقت.   و السلام عليكم
  8. درس: البداية مع Kinect

    السلام عليكم ورحمة الله،   قبل البدء في درس اليوم – احب فقط ان اذكر المصادر التي أأخذ منها المعلومات الخاصة بهذه الدروس المصدر 1 http://www.amazon.com/Start-Here-Learn-Kinect-API/dp/0735663963/ref=pd_sim_sbs_b_1   المصدر 2 http://www.amazon.com/Kinect-Windows-SDK-Programming-Guide/dp/1849692386   في درسنا اليوم سنتكلم عن Skeleton Tracking بصراحة هذا من الامور الجميلة جدا في الـ Kinect ويفتح الباب امام الكثير من التطبيقات الجميلة  و التفاعلية. الـ Skeleton Tracking تتيح لك مراقبة شخص معين يظهر امام جهاز الـ Kinect وتتبع جميع حركاته. يعني ممكن ان تعرف اذا قام بالتلويح بيده او هز رأسه وما الى ذلك. وهذا مستخدم في كثير من العاب الـ Xbox. يعني يمكن ان تتحكم بحاسبتك عن بعد بحركات يدك! مثلا اذا حركة يدك الى اليمين تقوم برفع الصوت واذا حركتها لجهة اليسار تقوم بخفضه – او يمكنك ان تعمل برنامج متصفح صور و بتحريك يدك يمكنك التنقل بين الصور. الافكار كثيرة .. و الموضوع مسلي صراحة. دعونا نعود الى الكلام العلمي جهاز الـ Kinect يمكنه اظهار 6 اشخاص فقط كحد اقصى لغرض الـ Skeleton Tracking. اثنان منهم فقط يمكنك تعقبهم بصورة كاملة. لتغرض التعقب، الـ Kinect قام بتبسيط جسم الانسان ومثله فقط بـ 19 عظم تتصل بـ 20 نقطة التقاء (joint points).   اشعر ان ترجمتي ركيكة  :(  لذا سأضع النص الانكليزي المأخوذ من كتاب Kinect for Windows SDK Programming Guide Using the Kinect for Windows SDK, you can track up to six players and up to 20 joints for each skeleton.Only two users can be tracked in detail, which means the sensor can return all the twenty tracked joint points information; whereas, for reset users, it just gives the overall position. This is because it would require a lot of processing to track joint information for all the six users.  الصورة خير من الف كلمة  :)     من خلال الـ Kinect SDK  يمكنني الحصول على قيم هذه النقاط و ملاحظة تغيراتها. نفس الكلام و نفس هيكلية البرامج التي استخدمناها في الدروس السابقة ينطبق على الـ skeleton tracking. يعني يجب اولا تفعيل الـ skeleton stream ثم مراقبة الـ event  الخاص به. و اخيرا كتابة الكود داخل الـ event لغرض معالجة قيم الـ skeleton حسب وظيفة برنامجنا.   الحدث الخاص بمعالجة الـ skeleton هو SkeletonFrameReady . كل frame يحصل عليه البرنامج سيحوي على مصفوفة (collection) من نوع Skeleton. سيكون عددها طبعا بعدد الاشخاص الموجودين فعليا امام جهاز الـ Kinect. وكما ذكرنا اكبر عدد هو 6. و كل Skeleton سيحوي على  20  Joints. سنرى بعد قليل كيف يمكنني التعامل معها برمجيا.   لو نبدء ببرنامج بسيط مأخوذ من المصدر 1 البرنامج سيقوم فقط بأظهار قيم النقطة العليا من الـ skeleton و التي هي الـ head. البرنامج بسيط وليس ذا فائدة فعليه الا انه يوضح بعض النقاط الاساسية  في كيفية التعامل مع هكذا نوع من البرامج.   اتبع نفس الخطوات السابقة لتكوين برنامج هذا هو الكود الخاص بـ Loaded event   private void Window_Loaded(object sender, RoutedEventArgs e)        {            myKinect = KinectSensor.KinectSensors[0];            myKinect.SkeletonStream.Enable();            myKinect.Start();            myKinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(myKinect_SkeletonFrameReady);        }  لا شيء هنا جديد!   وفي كود معالجة الحدث الخاص بـ skeleton سنضيف    void myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)        {                      string message = "No Skeleton Data";            Skeleton[] skeletons = null;            using (SkeletonFrame frame = e.OpenSkeletonFrame())            {                if (frame != null)                {                    skeletons = new Skeleton[frame.SkeletonArrayLength];                    frame.CopySkeletonDataTo(skeletons);                }            }            if (skeletons == null) return;                             foreach (Skeleton skeleton in skeletons)            {                               if (skeleton.TrackingState == SkeletonTrackingState.Tracked)                {                    Joint headJoint = skeleton.Joints[JointType.Head];                    SkeletonPoint headPosition = headJoint.Position;                    message = string.Format("Head: X:{0:0.0} Y:{1:0.0} Z:{2:0.0}",                        headPosition.X,                        headPosition.Y,                        headPosition.Z);                }            }                       StatusTextBlock.Text = message;                    }  اول شيء مهم هنا هو تعريف مصفوفة من نوع Skeleton لاننا لا نعرف كم شخص سيكون لدينا امام الـ Kinect وكما ذكرنا ان الحد الاقصى للأشخاص هو 6. بعدها سننقل القيم (data) الى هذه المصفوفة ثم سيكون لدينا loop  عن طريق الـ foreach – لاحظ في بداية الـ loop لدينا هذه الجملة                   if (skeleton.TrackingState == SkeletonTrackingState.Tracked)هذه للتأكد هل الـ skeleton الحالي هو متابع ام لا. مرة اخرى.. جهاز الـ Kinect يسمح لي بتتبع شخصين فقط بصورة كاملة (اي بالنقاط الـ 20 كاملة) طيب، انا الان ممكن ان احصل على 6 اشخاص، اذن كيف من الممكن ان احدد هل الشخص الحالي الذي حصلت على بياناته هو متابع بصورة كاملة؟ هذا الامر يتم في جملة الـ if التي بالاعلى. لاحظو بقية القيم     من هنا اعرف هل الشخص متابع – اي يمكنني الحصول على الـ 20 نقطة الخاصة به – ام لا   بعد ذلك سنقوم بالحصول على قيمة الـ head عن طريق هذين السطرين   Joint headJoint = skeleton.Joints[JointType.Head];SkeletonPoint headPosition = headJoint.Position;ايضا لاحضو هنا عن طريق الـ JointType يمكنني الحصول على بقية النقاط     و بعد ذلك نقوم بعرض هذه القيم على واجهة برنامجنا. طبعا في ملف الـ xaml الخاص بواجهة البرنامج ستحتاج الى ان تضيف التالي بدل الـ image التي كنا نستعملها في الدروس السابقة   <StackPanel>        <TextBlock Name="StatusTextBlock" Text="Skeleton Status" HorizontalAlignment="Center" FontSize="72"></TextBlock>    </StackPanel>  الان ماذا لو اردنا ان نظهر الـ skeleton كاملا على الشاشة؟ الامر سهل – المفروض الان انت تعرف كيفية الحصول على النقاط الخاصة بالجسم joint points كل ما عليك هو ان ترسم خطوط بين هذه النقاط ليظهر لك الـ skeleton بأبسط صورة. كل ما عليك معرفته هو كيفية الرسم في الـ WPF (بمشيئة الله و عونه ستكون لي دروس عن الـ WPF في اقرب وقت)   و هناك برنامج كاملا في مجلد الـ samples الخاص بـ Kinect SDK يوضح هذا الامر.     أسف فلقد كتبت هذا الدرس على عجالة.. ان شاء الله أفصل اكثر خاصة في موضوع الـ space transformation المهم جدا عند التعامل مع الـ skeleton stream - ما ان يسمح لي الوقت. نحن الان وضعنا اول قدمنا في طريق برمجة تطبيقات تتعامل مع الـ Kinect.. الان فقط بدأت المتعة. يمكنك تطبيق العديد من الافكار بربط الـ Kinect مع تطبيقاتك.   و السلام عليكم و رحمة الله
  9. درس: البداية مع Kinect

    السلام عليكم ورحمة الله،   في الدرس السابق وضحنا في مثال بسيط كيفية الحصول على video stream من جهاز الـ Kinect وعرضها في برنامجنا.   نكمل اليوم ان شاء الله مع مقدمة في جهاز الـ Kinect. كما وضحنا مسبقا – جهاز الـ Kinect يعتبر كـ multistream source. حيث يمكننا الحصول على اشكال مختلفة للبيانات. هناك تقريبا اربع انواع من الـ stream التي يمكننا الحصول عليها. وهي:   1-      Video streamوهذا النوع هو الذي تعاملنا معه في الدرس السابق.   2-      Depth streamسنتحدث عنه اليوم – ان شاء الله   3-      Audio stream4-      Skeleton streamعند البدء في كتابة اي برنامج للتعامل مع ال Kinect يجب اولا تحديد مع اي stream سيتم التعامل – علما انه من الممكن التعامل مع اكثر من stream في البرنامج.  مثلا في الدرس السابق استخدمنا   myKinect.ColorStream.Enable();  لأننا كنا نريد التعامل مع الـ video stream العادي. ثم الخطوة التالية تكون بمعالجة الحدث المرتبط مع الـ stream الذي سنقوم بالتعامل معه. مثلا في الدرس السابق استخدمنا   myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);  هذه الطريقة – اي تعرق event handler تسمى بـ Event model  والتي فيها يقوم الـ Kinect sensor بأرسال frame جديد حال توفره. هناك طريقة ثانية تعرف بـ polling model  والتي تكون عند الطلب on-demand – يعني عندما احتاج ان احصل على frame جديد من الـ Kinect sensor سأقوم انا بأرسال طلب اولا الى الـ Kinect ثم يقوم بعدها الـ sensor بأرسال الـ frame. هذه كانت بعض الملاحظات العامة. اما درسنا اليوم فكما ذكرتُ سابقا انه سيكون عن التعامل مع الـ depth stream.   The Depth Data   كما هو معرف في الصور العادية ، قيمة الـ pixel تمثل اللون، لكن مع الـ depth image الامر مختلف. قيمة الـ pixel هنا تمثل المسافة بين الـ object الظاهر في الصورة وبين الـ Kinect sensor. طبعا هذا الامر مفيد ويسهل كثير من الامور التي كانت تتطلب كثير من الجهد في الصور الاعتيادية – مثلا موضوع الـ object recognition و غيره. الان لنبدء بتطبيق بسيط للحصول على الـ depth data ثم عرضها في برنامجنا.   سنتبع تقريبا نفس الخطوات في الدرس السابق – قم بتكوين جديد كما فعلت في الدرس السابق من نوع WPF ثم قم بأضافة الـ reference المطلوب ثم اضف الحدث Loaded وفي داخلة قم بكتابة الاتي:                   myKinect = KinectSensor.KinectSensors[0];                myKinect.DepthStream.Enable();                myKinect.Start();                myKinect.DepthFrameReady += new EventHandler<DepthImageFrameReadyEventArgs>(myKinect_DepthFrameReady);  لاحظ الكود مقارب للدرس السابق – الذي تغير هنا هو نوع الـ stream لاننا هنا نتعامل مع الـ DepthStream وايضا نوع الحدث (event ) هو ايضا الخاص ب DepthStream   ثم بعد ذلك علينا كتابة الكود الخاص بدالة myKinect_DepthFrameReady وهو ايضا مقارب للكود في البرنامج السابق:           void myKinect_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)        {                       using (DepthImageFrame depthimageFrame = e.OpenDepthImageFrame())            {                if (depthimageFrame == null)                {                    return;                }                short[] pixelData;                pixelData = new short[depthimageFrame.PixelDataLength];                int stride = depthimageFrame.Width * 2;                depthimageFrame.CopyPixelDataTo(pixelData);                depthImageControl.Source = BitmapSource.Create(depthimageFrame.                Width, depthimageFrame.Height, 96, 96, PixelFormats.Gray16, null,                pixelData, stride);            }        }  طبعا لا تنسى ان تضيف هذا السطر الى ملف الxaml   <Image Name="depthImageControl" Stretch="Fill" />  و الان نفذ البرنامج. و سترى النتيجة       مبروك – اذا كانت هذه هي المرة الاولى التي تكتب برنامج و تحصل على depth image  ;)   المهم في الـ depth image ليس الحصول على صورة من هكذا نوعية لعرضها فقط – لكن هذه الطريقة تسهل كثير من الامور خاصة في مجال معالجة الصور.   كما ذكرنا ان قيمة البكسل في هذه الصور تمثل المسافة بين ال objects في الصورة وبين جهاز الـ Kinect. طيب كيف من الممكن الان ان اعرف و استخلص المسافة بين نقطة معينة في الصورة وبين جهاز الـ Kinect؟ كل قيمة ( depth data ) تُمثل بـ 16-bits. اول 3 بتات تمثل الـ index player  اما ال 13 bits التي تليها تمثل قيمتها المسافة.     لكن ما هو المقصود بـ index player؟ كما ذكرنا مسبقا ان جهاز الـ Kinect ظهر اولا لجهاز الـ Xbox الخاص بالالعاب لذا هو يسمح لنا بتتبع لاعب معين. دعوني اوضح اكثر. هناك امكانية بجهاز الـ Kinect  تعرف بـ skeleton tracking والتي من خلالها ممكن ان اتتبع حركة جسم (شخص) معين يظهر لي في الصورة (ربما سنتكلم لاحقا عن الـ skeleton stream  في دروس متقدمة)   الان لنعود الى الـ depth data جهاز الـ Kinect  يقوم بعملية الـ depth vision للحصول على depth data في حدود تقريبا 2.6 feet to 13.1 feet الاقل من هذه القيم تكون قريبة جدا و الاكبر تكون بعيدة جدا و بالتالي لا يمكننا الحصول علي قيمها بصورة depth. الان، لو اردنا ان نعرف كم يبعد بكسل معين عن الـ Kinect سنقوم ببساطة بعمل bitwise shift operation  بمقدار 3 للحصول على قيمة المسافة والتي ستكون مقاسة بـ millimeters. اما لو اردنا ان نتعامل مع الـ index player سنحتاج الى عمل logical AND operation. هنا يجب ان تضع بعين الاعتبار انه جهاز الـ Kinect  يمكنه ان يكتشف 6 players كحد اقصى في الـ frame (قيمهم هي من 1 الى 6)   الان لكي نطبق شيء عملي على هذا الكلام – سنقوم بتعديل على البرنامج السابق. سنقوم فقط بعرض الـ pixels الخاص بـ player بلون معين. لو قمنا بأضافة هذه الدالة الى برنامجنا          private void TrackPlayer(short[] depthFrame)        {            for (int depthIndex = 0, colorIndex = 0; depthIndex < depthFrame.            Length && colorIndex < this.depth32.Length; depthIndex++, colorIndex            += 4)            {                int player = depthFrame[depthIndex] & 7;                if (player > 0)                {                    depth32[colorIndex + 2] = 0;                    depth32[colorIndex + 1] = 0;                    depth32[colorIndex + 0] = 255;                }            }        }  والتي ستقوم بعمل loop على جميع الـ pixels لكي تحصل على قيمة الـ player index الخاصة بكل pixel اذا كانت هذه القيمة اكبر من 0 يعني هناك player فسنقوم بأعطائه لون مختلف لتميزه. ثم عليك استدعاء هذه الدالة داخل myKinect_DepthFrameReady   void myKinect_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)        {                       using (DepthImageFrame depthimageFrame = e.OpenDepthImageFrame())            {                if (depthimageFrame == null)                {                    return;                }                pixelData = new short[depthimageFrame.PixelDataLength];                              int stride = depthimageFrame.Width * 2;                depthimageFrame.CopyPixelDataTo(pixelData);                depth32 = new byte[depthimageFrame.PixelDataLength * 4];                               this.TrackPlayer(pixelData);                depthImageControl.Source = BitmapSource.Create(depthimageFrame.Width, depthimageFrame.Height, 96, 96,                    PixelFormats.Bgr32, null, depth32, depthimageFrame.Width * 4);            }        }  لو تنفذ البرنامج الان لن تحصل على شيء! لاني نسيت ان اذكر انه لا يمكن الحصول على ال player index الا مع تفعيل ال skeleton stream. لذا يجب اضافة هذا السطر داخل ال Loadeed     myKinect.SkeletonStream.Enable();يعني سيكون لديك ال stream  الخاص ب ال depth  و ال skeleton كلاهما مفعليين.   والان انت جاهز لتنفيذ البرنامج       و السلام عليكم و رحمة الله
  10. السلام عليكم و رحمة الله   البداية مع جهاز الـ Kinect   مقدمة   اذا كنت لم تسمع مسبقا بهذا الجهاز – المقدم من شركة ميكروسوفت – يمكنك ببساطة زيارة صفحة الويكيبيديا للتعرف على هذا الجهاز الرائع! http://en.wikipedia.org/wiki/Kinect ببساطة جدا يمكن اعتبار الجهاز ككاميرا. يسمح لنا الجهاز بأدخال video & audio. الجديد في الجهاز والذي يمكن اعتباره نقله في التعامل مع الصور خاصة، ان الجهاز يتعامل مع depth image. يعني يمكن ان تعرف بعد object معين عن جهاز الـ Kinect. طبعا هذا الامر يسهل كثير من الامور التي تخص التعامل مع الصور. لذا رغم اطلاق هذا الجهاز في اول الامر لجهاز الـ Xbox الا انه أسال لعاب المبرمجين و الباحثين لأستخدام هذا الجهاز في مجالات عديدة بعيدة عن الالعاب مثلا يمكن استخدام الجهاز في تطبيقات تخص     HealthcareRoboticsEducationVirtual realityMilitary  بصراحة انا قبل اشهر فقط تعرفت على هذا الجهاز وقررت ان احصل على واحد وابدء بتعلم اسرار البرمجة الخاصة به. طبعا الجهاز اطلق في بادء الامر لأجهزة الـ Xbox ثم بعد ذلك اطلقت مايكروسوفت نسخة خاصة بالوندوز. انت يمكنك البدء بالبرمجة سواءا على نسخة الـ Xbox او النسخة الخاصة بـ windows. الفرق الوحيد الذي اعرفه لحد الان هو ان نسخة الويندوز تكون افضل و ادق في كشف و تتبع الاجسام القريبة من جهاز الـ Kinect. النسخة الخاصة بـ Xbox تفشل في تتبع الاجسام الاقرب من 80 cm  بينما نسخة الويندوز تعمل حتى حدود الـ 40 cm.   متطلبات العمل:   Windows 7 or 8   Visual Studio 2010 or 2012   Kinect for Windows SDK والتي يمكن تحميلها من هنا http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx   Kinect device (for Xbox or Windows) http://www.amazon.com/Microsoft-Xbox-Kinect-Sensor-360/dp/B009XD5YV0/ref=pd_sim_vg_1 http://www.amazon.com/Microsoft-L6M-00001-Kinect-for-Windows/dp/B006UIS53K   Power Supply Cable for Kinect http://www.amazon.com/gp/product/B004S7GA46/ref=oh_details_o04_s00_i00?ie=UTF8&psc=1   الجهاز الذي لدي انا هو الخاص بالـ Xbox.   ملاحظة: هناك عدة مكتبات لكتابة تطبيقات خاصة بجهاز Kinect وربما من اشهرها OpenNi  http://www.openni.org/ لكن في هذه المقدمة، سأستخدم المكتبة الخاصة بميكروسوفت لأني اجيد لغة الـ C# والتي ستسهل على العمل. (احاول الان التعامل مع الـ OpenNI وربما يكون درس لي خاص به في المستقبل بمشيئة الله)   عملية اعداد (تنصيب) الحزمة الخاصة بمايكروسوفت سهلة جدا – فقط ملاحظة انه يجب عند تنصيب الحزمة يكون جهاز الـ Kinect  غير متصل بجهاز الحاسب. بعد انتهاء عملية التنصيب يمكنك وصل الجهاز للبدء بكتابة التطبيقات الخاصة بالـ Kinect.   الان وبعد تنصيب الحزمة الخاصة بالـ Kinect وربط الجهاز ، يمكنك كتابة تطبيقك الاول.   كون مشروع جديد من نوع WPF من نافذة الـ Solution Explorer قم بالضغط على Reference بالزر الايمن واختار Add Reference   من النافذة التي تظهر اختر جزء Browse واذهب الى مكان تنصيب Kinect sdk على جهاز الحاسب والذي من المفترض ان يكون   C:\Program Files\Microsoft SDKs\Kinect\v1.6\Assemblies\  ثم اختر ملف Microsoft.Kinect.dll   الان اول شيء يجب عمله في الجزء الخاص بالكود هو اضافة جملة الـ using الخاصة بمكتبة الـ Kinect   Using Microsoft.Kinect;  الان، للتعامل مع Kinect  تحتاج الى تعريف object من KinectSensor class قم بأضافة هذا التعريف كما موضح في الصورة     سنقوم بالتهيئة والتعامل مع هذا الـ object داخل الحدث Loaded الخاص بالبرنامج، لذا سنقوم الان بأضافة الحدث Loaded الى برنامجنا، ولعمل ذلك انتقل الى الجزء الخاص بالتصميم في برنامج الفيجوال استوديو. تأكد من ان الاختيار والجزء المفعل من برنامجك هو window ثم من الجزء الخاص بالاحداث (events) اضغط double click  على الحدث Loaded     ستنتقل تلقائيا الى ملف الكود حيث سنضيف بعض الكود داخل هذا الحدث.   اولا سنقوم بتهيئة المتغير myKinect  ( والذي سبق وان عرفناه ) بأضافة هذا السطر   myKinect = KinectSensor.KinectSensors[0];  طبعا هنا ال KinectSensors عبارة عن collection يقوم بخزن جميع الـ Kinect devices المتصلة مع الجهاز. انا لدي فقط جهاز Kinect واحد والذي سيكون رقمه [0] . يعني لو كان لديك اكثر من جهاز Kinect يمكنك التعامل مع كل واحد بصورة مستقلة. الان انا متصل مع جهاز الـ Kinect برمجيا ويمكنني البدء بالتعامل فعليا معه. بما انه جهاز الـ Kinect يمكنني من الحصول عن البيانات في وضعيات مختلفة (حيث ممكن استخدامه ككاميرا اعتيادية او استخدامه للحصول على depth image او حتى audio)، لذا اول خطوة يجب ان تكون هي تحديد مانوع البيانات او طريقة الحصول على البيانات من جهاز الـ Kinect. في هذا التطبيق سنستخدم الجهاز ككاميرا اعتيادية – اي الحصول على color video. لنعمل ذلك سنضيف   myKinect.ColorStream.Enable();  هنا دالة Enable استخدمناها بصورتها الاساسية دون اي متغيرات لذا هذه الدالة ستقوم بتوليد video frames بأبعاد 640 X 480 بمعدل 30 frames كل ثانية. الان اخبرنا الـ Kinect بأننا نريد الحصول على البيانات من ما يعرف بـ RGB Camera (اي الكاميرا العادية). الخطة التالية ستكون هي اخبار برنامجنا ماذا سيفعل عند الحصول على الصور من الكاميرا. طبعا الفيجوال ستوديو يوفر لنا حدث (event) لهذا الامر. الحدث هو ColorFrameReady والذي يتولد كلما يكون هناك frame جديد من الـ kinect قم بأضافة   myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);  طبعا الفيجوال ستوديو يساعدك كثير في كتابة الكود. يعني في الكود الذي في الاعلى بمجرد ان تكتب = وتضغط space سترى كما في الصورة   كل ما عليك هو ان تضغط tab  ثم سيقترح عليك مرة اخرى الفيجوال ستوديو بتعريف الدالة لك ايضا اضعط tab   ستكون الدالة كالاتي           void myKinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)        {            throw new NotImplementedException();        }  الان ببساطة الذي حدث انه اخبرنا برنامجنا انه كلما يأتيه frame جديد يقوم بأستدعاء دالة myKinect_ColorFrameReady وطبعا سنقوم بعد قليل بكتابة الكود الخاص بهذه الدالة. اخيرا ما سنحتاجه هنا هو استدعاء دالة Start لتقوم فعليا ببدء جهاز الـ Kinect . سيصبح الكود الكلي الخاص بـ Loaded هو كالتالي           private void Window_Loaded(object sender, RoutedEventArgs e)        {            myKinect = KinectSensor.KinectSensors[0];            myKinect.ColorStream.Enable();            myKinect.ColorFrameReady += new EventHandler<ColorImageFrameReadyEventArgs>(myKinect_ColorFrameReady);            myKinect.Start();        }  الان سننتقل الى جزء اخر من البرنامج وهو التعامل مع البيانات المستلمة. سنقوم بعرض هذه الصور (frames) في برنامجنا. اولا سنحتاج الى ان نضيف الى واجهة برنامجنا ما يعرف بـ image element (هذا الجزء يخص الـ WPF ولغة الـ XAML) عموما الامر بسيط حتى اذا كنت لا تجيد التعامل جيدا مع الـ WPF (مثلي :D ) انتقل الى جزء التصميم – اي الى ملف MainWindow.xaml. يمكنك التعامل مع واجهة برنامجك من خلال كتابة كود xaml من خلال نافذة 1 في الصورة، او يمكنك اضافة الـ controls من خلال الـ Toolbox مباشرة الى نافذة 2.     سنقوم بأستخدام كود XAML وسنقوم بتعديل بسيط بحذف Grid واضافة Image حيث سيكون الكود الكلي الخاص بالنافذة كما موضح   <Window x:Class="KinectCam.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">    <Image Name="kinectVideo" /></Window>  الان بقي الجزء الاخير وهو كتابة الكود الخاص بالدالة myKinect_ColorFrameReady والتي ستقوم بعرض الـ frame على نافذة برنامجي.   الكود الكلي الخاص بالدالة سيكون كالتالي:     using (ColorImageFrame colorFrame = e.OpenColorImageFrame())            {                if (colorFrame == null)                    return;                byte[] colorData = new byte[colorFrame.PixelDataLength];                colorFrame.CopyPixelDataTo(colorData);                kinectVideo.Source = BitmapSource.Create(                    colorFrame.Width, colorFrame.Height, // image dimensions                    96, 96, // resoultion - 96 dpi for video frames                    PixelFormats.Bgr32, // video format                    null, // platte - none                    colorData,  //video data                    colorFrame.Width * colorFrame.BytesPerPixel); // stride            }   اولا في الكود السابق، يجب الحصول على الصورة والتي تمرر الى الدالة عن طريق المتغير e. وبما اننا مسبقا نعرف اننا نتعامل مع الـ RGB camera وسنحصل على صورة بالالوان، قمنا بتعريف متغيير من نوع ColorImageFrame لخزن الصورة به. (طريقة تعريف المتغيير بهذه الطريقة – اي داخل جملة using – تكون اكثر كفاءة للتعامل مع الذاكرة خاصة في حالة برنامجنا حيث سيكون لدينا 30 frames في كل ثانية. بهذه الطريقة سنضمن انه يتم التخلص من المتغيير عندما تنتفي الحاجة اليه)   ثم بعد ذلك جملة                   if (colorFrame == null)                    return;  للتأكيد ان كل شيء على ما يرام واننا لسنا – لسبب او لاخر – فقدنا الاتصال او الصورة من الجهاز.   ثم في الخطوات التالية، قمنا بتعريف متغيير buffer لخزن الصورة. حجم هذا الـ buffer سيكون بحجم البايتات في الصورة والذي يمكن معرفته من خلال colorFrame.PixelDataLength.   اخيرا لعرض الصورة على kinectVideo (وهو الجزء الخاص بعرض الصورة الذي قمنا بأضافته في ملف الـ xmal) سنقوم بأستخدام خاصية Source واعطاءها القيمة المرجعة من دالة BitmapSource.Create   اخيرا قم بتنفيذ البرنامج لترى الفيديو من الكاميرا.   و السلام عليكم ورحمة الله