• الإعلانات

    • فيصل الحربي

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

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

رغيد الطيب

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

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

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

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

27 عادي

2 متابعين

عن رغيد الطيب

  • الرتبة
    عضو شرف
  • تاريخ الميلاد 08/20/1980

طرق الإتصال

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

  • الجنس ذكر
  • الدولة : اليمن - عدن

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

9,431 زياره للملف الشخصي
  1. بسم الله السميع العليم مقدمة اود هنا ان اقدم برنامج صغير ... يمثل سرفر لعمل بث فيديو من النوع MJPEG او ما يعرف بالـ Motion-JPEG .... وهو عبارة عن استريم من مجموعة صور JPG ترسل بالتتابع عبر برتوكول الـ HTTP .. إمكانية بث فيديو مباشر من كمبيوترك الى اي جهاز عميل ... إياً كان مصدر هذ البث : من الشاشة ... او الكاميرا ... او الهارد ديسك ... او اي مصدر آخر تريده. لماذا MJPEG Streaming بالتحديد ؟ يكمن سبب إختياري للـ MJPEG بالتحديد على الرغم من ان عملية ارسال صور الى جهاز بعيد ممكنة بعدة طرق اسرع و افضل ... السبب هو كون هذا البروتكول مدعوم ضمنيا من قبل عدة برامج وعلى عدة منصات (اجهزة كمبيوتر, اجهزة ذكية موبيلات , اجهزة لوحية ومعظم كميرات المراقبة IP Cameras تعتمد اغلبها عليه ) ... وذلك لانه يمكنك فتحه بإستخدام اغلب متصفحات الانترنت كالـفايرفوكس او الكروم او مشغل الفي إل سي VLC Player .. إلق نظرة على الصورة ادناه : بل يمكن ايضا من هاتفك الذكي ... مثلا آندرويد مع متصفح الفايرفوكس او اي من البرامج المجانية الكثيرة التي يمكن تحميلها من الـ Google Market ... انظر الصورة التالية : كيف يمكن استخدام المكتبة المرفقة هنا ؟ لن اخوض هنا في تفاصيل الـ MJPEG ولكنني سوف اوضح كيفية استغلال البرنامج المرفق هنا لبث سلسة من الصور على شكل فيديو يمكن عرضه من اي جهاز بعيد. الفئة الاساسية في برنامجنا وهي الـ ImageStreamingServer وتحتوي هذه الفئة على أمرين methods و ثلاثة خصائص properties : الوظائف أو الأوامر : 1 - Start() : تشغيل السرفر على منفذ معين. 2 - Stop() : إيقاف تشغيل السرفر و اغلاق كل الإتصالات الحالية. و الخصائص التالية : 1 - ImagesSource : مصدر الصور التي سيتم عمل استريمنج لها و إرسالها الى اي عميل يطلبها. 2 - Interval : المدة الزمينة التي ينبغي على السرفر الانتظار فيها بعد كل صورة يرسلها. 3 - IsRunning : يمكن بواسطتها معرفة اذا كان السرفر شغال حاليا ام لا. 4 - Cleints : يعيد لك مصفوفة بكل الاتصالات النشطة حاليا. مثال : لكي نجعل السرفر يقوم ببث فيديو عن سطح مكتبنا الحالي الى اي جهاز (سوف نحتاج الى كود مكون من سطرين برمجيين فقط بإستخدام هذه المكتبة !!) ... ImageStreamingServer كالتالي : ImageStreamingServer server = new ImageStreamingServer(); server.Start(8080); والان لكي تتصل بالسرفر من الجهاز الحالي او جهاز بعيد .... افتح متصفح الانترنت جوجل كروم او فايرفكس (لأن الانترنت اكسبلور من مايكروسوفت حاليا لايدعمه بشكل مباشر انما يمكن عن طريق بعض الاضافات) .... بعد فتح متصفحك اكتب اسم كمبيوترك او عنوان الاي بي متبوعا بـنقطتين فوق بعض (:) ثم رقم المنفذ (وهو في حالتنا السابقة 8080) : http://127.0.0.1:8080 سوف يظهر لك شيء مشابه لـ : بناء مصدر الصور الخاص بك : في المثال السابق الذكر لاحظ انك لم تحدد ان يكون مصدر بياناتك (الصور والفيديو) هو شاشة كمبيوترك ومع ذلك يفترض السرفر هذا المصدر كمصدر افتراضي للصور عن طريق الخاصية ImageSource و التي هي من النوع IEnumerable<Image> ولنفترض انك تريد ان تجعل مصدر الصور ... الكميرا او مجموعة صور الـ JPG في مجلد معين داخل الجهاز ... ينبغي ان تقوم ببناء دالة معينة تقوم بذلك ... كالتالي : IEnumerable<Image> CameraImagesSource() { // هنا ينبغي ان تكتب الشفرة التي تعيد الصور من الكميرا } IEnumerable<Image> FolderImagesSource(string path) { // هنا ينبغي ان يكون الكود الذي يعيد الصور من المسار المعين } وكمثال عملي تخيل انني اريد ان اقوم ببناء مصدر بيانات لجميع صور ال *.jpg في مجلد معين فإنني ساكتب كود كالتالي : private IEnumerable<Image> FolderImagesSource(string path) { var files = System.IO.Directory.GetFiles(path, "*.jpg"); foreach (var file in files) yield return Image.FromFile(file); yield break; } private void Form1_Load(object sender, EventArgs e) { var source = FolderImagesSource(@"C:\Pictures\"); _Server = new ImageStreamingServer(); _Server.ImagesSource = source; _Server.Start(8080); } في الكود السابق الدالة FolderImagesSource تعيد جميع الصور الموجودة في المجلد "C:\pictures" وفي بداية تشغيل الفورم نقوم بإنشاء كائن من النوع ImageStreamingServer ليمثل سرفرنا و الذي غيرنا الخاصية ImagesSource التابعة له كي تكون عبارة عن الصور الراجعة من الدالة FolderImagesSource ثم قمنا بتشغيل السرفر عن طريق الدالة Start. طبعا الكود السابق يمكن اختصاره كثيرا ... كالتالي var source = System.IO.Directory.GetFiles(@"C:\Pictures\", "*.jpg").Select(s => Image.FromFile(s)); _Server = new ImageStreamingServer(source); _Server.Start(8080); في الاصدارات القادمة بإذن الله تعالى .... سنضيف دعم الكاميرا .... او نافذة معينة او فيديو من برنامج معين او منطقة في الشاشة ... بحيث يتم بثها بواسطة الـ MJPEG Streaming .. اتمنى للجميع الإستفادة ولنا جلسة اخرى بإذن الله تعالى السلام عليكم ورحمة الله rtaVideoStreamer-src.zip
  2. السلام عليكم و رحمة الله وبركاته الأخ الكريم ... حسين شكرا على المقال الرائع جدا .... وأحب ان اضيف نقطة سيكون من الجميل لو أخذتها بالحسبان .... نحن نتكلم هنا عن ملفات كبيرة الحجم (بالجيجا بايت) فمن المهم عندها الإهتمام بالذاكرة .... فبملاحظة سريعة على الكود نجد انه بعد ان يستلم الطرف الثاني اسم وحجم الملف المراد إراسلة يقوم بعمل مصفوفة بايتات (في الذاكرة !) ليتم الإستلام إليها ثم بعد ذلك تخزين الى ملف ... هذا امر بحاجة الى اعادة نظر .... خاصة اذا تخيلت انني اريد ان ارسل لنقل محتوايات قرص ديفي دي مضغوط في ملف ... اربعة جيجا ! ... من المرهق جدا للحاسوب وبقية البرامج العاملة حجز هذه المساحة من الذاكرة لبرنامج واحد حتى وان كان الملف اصغر من ذلك بكثير (واحد جيجا شي غير طبيعي ابدا ) .. الاقتراح الذي يتم عمله هنا الكتابة مباشرة الى القرص الصلب يعني مع وصول كل باكت من المرسل يتم كتابته دايركت الى الملف الذي سينمو بالتدريج مع عملية الاستلام (كما يمكن ان يتم حجز المساحة كاملة في القرص الصلب من البداية وبعدها الكتابة بالتدريج للحصول على اداء اافضل بقليل) ..... واذا كنت مهتم توجد حلول افضل من هذه ايضا ... اعود فا اشكرك على البرنامج الجميل ... الذي لن يضيف المقترح البسيط هنا اي شيء .. ولكنه للفائدة فقط السلام عليكم
  3. اتعلمت برمجة فين ؟

    و خير جليس في الزمان كـتاب ! (بأي مكان او وقت - حتى و إن كان بي دي إف PDF :) ).
  4. كيف يتم تمرير البيانات بين النوافذ

    السلام عليكم ورحمة الله وبركاته إن كنت قد فهمتك فقد احجت لشيء مماثل في السابق .. وصممت الفئة البسيطة في هذا الرابط http://www.arabteam2000-forum.com/index.php?showtopic=147747&st=0&p=748255&hl=%D1%DB%ED%CF&fromsearch=1entry748255 افادك الله بها السلام عليكم
  5. انا وبكاء طفلتي الصغيرة !

    بسم الله الرحمن الرحيم والان بعد انتهينا من الجزء الأول من تحليل البيانات والوصول لتفجير الحدث CryStart عند بكاء الطفلة ..... سنجد عيبا خطيرا كنت قد اشرت عليه في ملاحظتي بآخر المشاركة الاخيرة. وهذا العيب يكمن في ان البرنامج يقوم بمراقبة ترددات الصوت وبمجرد وصولها الى اعلى من الخاصية CryLevel التي تحدد مستوى التحذير ... فإن البرنامج يسوف يعتبر ان هذا بكاء ينبغي التحذير منه ... وهو تصرف غير صحيح ... بسبب الاصوات العابرة. مثل بكاء قصير لثلاث ثواني مثلا .. او تخيل معي ان احدهم قام بفتح باب الغرفة مصدرا صوت فرقعة بسيط من جراء ارتطام الباب ... فبرنامجنا بحالته هذه سيعتبر ان هذا امرا ينبغي التحذير عنده خاصة اذا تجاوز الصوت 15 بالمئة كما جاء في مثالنا السابق. ولكن هذا غير صحيح .... و الحل لهذه المعضلة البسيطة يمكن ان نعمله بعدة طرق منها مثلا مراقبة الوقت .... اي عدم تفجير الحدث مباشرة وانما الانتظار حتى تنقضي عدد من الثواني والصوت مازال مستمرا ثم نقوم بتفجير الحدث. غير اني هنا سا استخدم طريقة مستوحاه من حكم مصرية قديمة. اضافة النهكة المصرية لبرنامجنا. يقول اخوتنا المصريون ( من فات قديمه تاه ) .... كما يقولون ايضا ( اللي مالوش ماضي مالوش مستقبل ) .... وهي اقوال صحيحة الى حد كبير. ولكي تعرف ما علاقة هذه الامثال ببكاء طفلتنا الصغيرة !! .. ينبغي علينا استغلال الماضي قليلا لنستمتع بحاضرنا ... دعوات للتأمل .... كثير من الناس قد يفتح الحنفية ويشرب الماء وهو يلعن هذا الزمن الذي لا يوجد فيه راحة وكله تعب و و و و .... بينما لو تذكر اخينا هذا انه لم يكن من قبل هناك حنفيات في منازلنا وكان ينبغي الذهاب الى البئر في كل مرة نريد ان نشرب فيها لقال الحمد لله واستمتع بحاضره. اصبحت اجلس في مكتبي الصغير في منزلي وادير راسي باتجاه التلفاز ممسكا بالريموت كونترول واختار القناة التي تروقني ثم اواصل تصفحي في الكمبيوتر لموقع موجود في اقصى الارض وانهل منه المعلومات التي اريدها بينما اكلم اخي الموجود على بعد كيلومترات خارج المنزل بالهاتف الجوال و ازيد من درجة برودة الغرفة بالريموت كونترول ايضاً دون ان اضطر للقيام لهناك ..... ولو حسبت كم اماكن وصلت اليها دون ان تقوم من كرسيك لأصابك الذهول !!! ... لم يكن في الماضي من يجروء او يستطيع مجرد التخيل لهكذا امور ... بينما تمر علينا مرور الكرام ولا اذكر ابدا انني حمدت الله مرة على مجرد كوني قادرا على ان اتصل بمن اريد واكلمه اينما كان على وجه البسيطة .... هل تعلم ان ابي وابوك فقط وفي زمن ليس بالبعيد اذا ذهب احدهم لزيارة الآخر ولم يجده واخبروه بانه خرج من المنزل !! .... فلاتوجد اي قوة في العالم يمكنها ان تجمعهم حتى يعود الى البيت ثانية حتى وإن كان قد ذهب الى المكتبة المجاورة في ركن الشارع لشراء جريدة ما مثلا ... ولا يمكن ان يلتقوا وربما فوتوا لقائهم المنتظر فقط لانه لم يكن هناك اساليب اتصال حديثة ... والخارج من البيت مفقود حتى يعود بحفظ الله .... وكم قد تفطرت اكباد امهات ينتظرن ابناءهم الذين تأخروا خارج البيت لوقت متأخر لكتشف الام بعدها ان الابن كان سهران عند احد اصدقاءه هنا او هناك .... بينما بكل سهولة في هذه الايام يمكن ان يرفع احدهم سماعة هاتفه ويصل اليه ويعرف اين هو في ثواني. فإذا لم تقل الحمد لله من قبل فقلها الآن إذ أن ربك يقول : { اعْمَلُوا آلَ دَاوُودَ شُكْرًا وَقَلِيلٌ مِّنْ عِبَادِيَ الشَّكُورُ } جعلني الله واياك من الشاكرين كعادتي اتفلسلف كثيرا واخرج عن الموضوع الاساسي ... اقدم اعتذراتي عن التشتيت .... دعنا نعود الى صلب موضوعنا ..... قلنا اننا سنستغل الماضي عملا بنصيحة اخواننا المصريين فمن الخطأ ان نأخذ القيمة الحالية للصوت دون الأخذ بالماضي .... ولمعرفة التأثير فتخيل معي .. كيف هي العلاقة التي تربط الماضي بالحاضر ... اليك اربع حالات مختلفة : الحالة الاولى - (ضجيج بعد هدوء) وهي ان يكون تردد الصوت الان مرتفع (حاضر) بينما التردد السابق منخفض (ماضي) فإن هذا يعني ان الصوت بدأ اي بداية بكاء ولكن في نفس الوقت قد يكون تكون فرقعة باب مثلا او ماشابه .... الحالة الثانية - (ضجيج بعد ضجيج) وهي ان يكون التردد الان مرتفع (حاضر) بينما التردد السابق كان مرتفعا ايضا(ماضي) فإن هذا يعني ان الصوت هو ضجيج مستمر وبالتالي فات الامر هنا اقرب الى بكاء الطفل وقد نرغب حينها في إعلام الأم بذلك .... الحالة الثالثة - (هدوء بعد ضجيج) وهي ان يكون التردد الان منخفض (حاضر) بينما التردد السابق مرتفع (ماضي) فإن هذا يعني ان الضجيج انتهاء وهدءت الامور. الحالة الأخيرة (هدوء بعد هدوء) وهي احب الحالات الى قلبي والتي تعني ان الطفلة نائمة بهدوء ولا يوجد اي ضجيج في جوار. في الحالات السابقة نرى بوضوح ان الماضي والحاضر مرتبطان ويمكن بدراستهما الخروج بمعلومات مفيده ... والذي يهمنا هنا هو الحالة الثانية (ضجيج بعد ضجيج) ... ومعناها .. البكاء المتواصل... للإستفادة من ذلك في برنامجنا قمت بإضافه متغير جديد الى اليه بإسم History يقوم بتخزين قيم الصوت الأخيرة في مصفوفة ثم يستخرج متوسط (معدل Average) الصوت فإذا تجاوز الـ 15 بالمئة وهي قيمة الخاصية CryLevel فانه يتم التحذير. لمساعدتك على استيعاب الفكرة ... تخيل معي ان المتغير History يخزن القيم العشر الاخيرة للصوت ... وبالتالي ... لندرس الحالات التالية: : الحالة الاولى تخيل ان تكون القيم العشر تساوي صفرا اي انه لايوجد صوت (هدوء بعد هدوء).... ثم فجاءة يفتح احدهم الباب فيرتفع مستوى الصوت الى 70 بالمئة مثلا لتمثيل الضجيج الحاصل من صوت الباب (ضجيج بعد هدوء) .... اذا حصل ذلك في برنامجنا الاول فانه سوف يفجر الحدث CryStart وسيعتبر ان الطفل يبكي ويجب تحذير الام.... بينما في برنامجنا الان بعد الاضافة الاخيرة سيقوم البرنامج بجمع القيم العشر الموجودة في المتغير History وهي عبارة عن القيمة الاخيرة 70 والتسع الباقيات صفر ... وبالتالي فالمجموع هو : 70 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 -------> = 70 وبالتالي فأن المتوسط هو : 70 / 10 = 7 حين نقسم المجموع (70) على عدد القيم المخزنه وهي عشر فالناتج عندها هو 7 بالمئة اي اقل من 15 بالمئة فلايوجد داعي للتحذير. تخيل ان الصوت في اللحظة التي تليها استمر 70 مرة اخرى (ضجيج بعد ضجيج) فأن هذا يعني ان القيميتن الاخيرتين هما 70 بينما الثمان القيم الباقية 0 و بالتالي فالمجموع هو 140 والمتوسط 14 (بالقسمة على عشرة) وهو ايضا دون المستوى 15 ولا يحتاج الى تحذير. بينما لو استمر الامر كما هو وجائت القيمة التي تليها ايضا 70 او لنقل 50 مثلا (ايا تردد كان) ... (ضجيج بعد ضجيج ) فانه سيكون لدينا ثلاث قيم 70 و 70 و 50 و البقية اصفار ... فالمجموع عندها 190 والمتوسط 19 بالمئة اي يفوق الـ 15 بالمئة وعندها يتوجب تحذير الأم لان الصوت قد استمر فترة طويلة نسبيا. لهذا ينبغي الان التركيز على انه وعلى الرغم من ان الصوت الحالي في حالتنا الاولى كان 70 إلا ان المتوسط هو 7 فقط وفي حالتنا الثانية كانت القيمة الحالية 70 و المتوسط 14 واما في الاخيرة فالقيمة الحالية كانت 50 بينما المتوسط 19 ... وما اريد قوله هو انه وعند اي لحظة زمنية اصبح لدينا قيمتان (قيمة الصوت الحالية ) و (قيمة الصوت المتوسطة) ... ولهذا الغرض فقد اضفت الخاصية AverageValue الى الفئة CryDetector كي نستخدمها لمعرفة موسط الصوت عند اي لحظة .... ويجد الذكر بانني جعلت البرنامج يحفظ آخر خمسين عينة للصوت ويوجد المتوسط لها ... وليس العشر الاخيرة كما جاء للتوضيح فقط منذ قليل. ماسبق يؤكد لنا ان اخوتنا المصريين لم يكونوا مخطئين عندما ربطوا الماضي بالحاضر ... كما حصل واستفدنا من امثالهم الشعبية في برنامجنا هذا جزى الله عنا شعب مصر كل الخير. واتركم الان مع البرنامج المعدل ... و الذي انهينا فيه تحليل الصوت ... و سننتقل في الجزء القادم الى قسم التبيهات وإبلاغ الام بما قمنا بتحليله هنا. السلام عليكم ورحمة الله وبركاته rtaBabyCryingDetector.zip
  6. السلام عليكم اخي الكريم نعم يمكن ذلك بتطبيق الاقتراح المذكور في ردي السابق بإذن الله تعالى. ولبقية الشباب مثال عن استخدام الاصدار الثاني للاداة في مراقبة شاشة كمبيوتر بعيد في الشبكة على الرابط التالي : http://www.arabteam2000-forum.com/index.php?showtopic=213056 السلام عليكم ورحمة الله
  7. السلام عليكم مثال عن استخدام الاداة في مراقبة شاشة كمبيوتر بعيد في الشبكة على الرابط التالي : http://www.arabteam2000-forum.com/index.php?showtopic=213056 السلام عليكم ورحمة الله
  8. بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته في الايام الخوالي كانت عملية مراقبة شاشة الكمبيوتر التابعة لكمبيوتر بعيد في الشبكة امر مرهق ويحتاج لبعض الكودات الطويلة. اما الان فقد اختلف الامر خاصة ونحن نملك بعض الادوات التي طورناها بأنفسنا في هذا الموقع المبارك .... فلدينا اداة برمجة الشبكات التي سنستخدمها هنا وستجعل كود الارسال لايعدو سطرا واحدا. وهي اداه قمنا بتطويرها على الرابط http://www.arabteam2000-forum.com/index.php?showtopic=212998 وبالطبع يحتاج برنامجنا الى اللتقاط صورة مصغرة لسطح المكتب مع مؤشر الماوس كي يتم ارسالها الى الطرف الآخر ... وهو ما ستقوم به الفئة rtaDesktop التي قمنا بمناقشتها جيدا على الرابط التالي : http://www.arabteam2000-forum.com/index.php?showtopic=213002 وبالتالي فان برنامجنا يصبح سهلا جدا ... قم فقط بفتح البرنامج في كمبيوترك والكمبيوتر الآخر ثم اكتب عنوان الكمبيوتر البعيد في مربع النص واضغط على الزر Start ... وسوف يتم ارسال صورة مصغرة من سطح مكتبك الى الكمبيوتر الآخر مباشرة (كما في الصورة المرفقة). مرفق الكود مع المشروع .... تحياتي. السلام عليكم ورحمة الله وبركاته rtaSendDesktop.zip
  9. انا وبكاء طفلتي الصغيرة !

    بسم الله السميع العليم المرحلة الثانية - تحليل الصوت والان ننتقل الى الخطوة التي تليها ... وهي فقرة تحليل الصوت ... في هذه الفقرة سوف نقوم بمعالجة الصوت المدخل ومعرفة ما اذا كان الطفل يبكي ام لا. لكي نقوم بذلك قمت بتصميم فئة بسيطة CryDetector تقوم بتغليف الاداة السابقة rtaSoundLibrary لتسجيل الصوت وتعرفها بهذا الشكل : Private WithEvents Detector As New CryDetector(Me) لاحظ اننا قمنا هنا بتعريف متغير جديد باسم Detector من نوع الفئة الجديدة CryDetector وهذه الفئة الجديدة فيها خاصيتين مهمتين هما الخاصية CryLevel وتفيد بتحديد القيمة التي سيعتبر اي صوت اعلى منها هو (بكاء للطفلة الصغيرة) بحيث يمكنك ان تضبط الخاصية كما تشاء (وبحسب إزعاج طفلك الصغير) .... والقيمة تتراوح من 0 الى 100 يعني كمثال تجريبي نقول ان كل صوت يتعدى الـخمسة عشر بالمائة عبارة عن بكاء بالشكل التالي : Detector = New CryDetector(Me) Detector.CryLevel = 15 Detector.Start() وهذا الكود ينشى كائن جديد من النوع CryDetector ويطلق عليه الاسم Detector ثم يحدد حساسية البرنامج الى الدرجة 15 بالمئة واخيرا يبداء بالاستماع الى الاصوات عن طريق الامر Start. والان في اي وقت يتجاوز الصوت 15 بالمئة سوف يتفجر حدث اسمه CryStart وعندما يتوقف البكاء او يهدأ سوف يتفجر الحدث CryStop. ويمكننا ان نستغل هذه الاحداث كي نعرض صورة تبين لنا ان الان الطفل يبكي وصورة اخرى عندما يعود للنوم. الخاصية الثانية بإسم IsCrying وهي تعيد True اذا كان الطفل يبكي و False في الحالة الاخرى(حالة نومه). ملاحظة مهمة هذا الجزء من معالجة البيانات يقوم فقد بتحسس الصوت الكبير (الذي يتجاوز القيمة التي تحددها في الخاصية CryLevel) ثم يفجر الاحداث على اساسه .... وهذه الطريقة مجرد مدخل وتحتوي على عيب خطير جدا سنناقشه في الجزء الثاني من تحليل بيانات الصوت بإذن الله تعالى. في المرفقات صورتين للبرنامج واحدة عند البكاء و الاخرى عند النوم وكذلك البرنامج للاطلاع على الفئة الجديدة وكيف سنقوم بتعديلها في الجزء الثاني من تحليل بيانات الصوت ... قم بتشغيل البرنامج واصدر بعض الضجيج حتى ترى التاثيرات الحاصلة تحياتي السلام عليكم ورحمة الله وبركاته rtaBabyCryingDetector.zip
  10. بسم الله الرحيم الرحيم لصورة سطح شعبية كبيرة فكثيرا هي البرامج التي يتطلب فيها الحصول على لقطة لسطح المكتب، مثل البرامج الرسومية او برامج مراقبة الشاشات و حتى الترفيهية منها. وللحصول على صورة لسطح المكتب يوجد العديد من الطرق المعقدة و التي تستخدم الـ API او حافظة الوينذوز Clipboard كوسيط تخزيني قبل جلب الصورة الى برنامجنا في هذا الدرس البسيط سأعرض طريقة بسيطة في فئة بسيطة تستخدم كود دوت نت نقي (بدون API او خلافه) ... للحصول على صورة لسطح المكتب .... مع بعض المزايا الاضافية. تعتمد فئتنا البسيطة على الدالة CopyFromScreen من الكائن Graphics حيث تقوم بنسخ محتويات شاشة الكمبيوتر كاملة الى كائن جرافكس نستخدمه بعدها لإنشاء صورة لسطح المكتب. وكود الفئة الجديدة rtaDesktop هو كالتالي : Public Class rtaDesktop Public Shared Image As Image Public Shared Bounds As Rectangle Shared Function GetDesktopImage(Optional ByVal Width As Integer = 0, Optional ByVal Height As Integer = 0, Optional ByVal ShowCursor As Boolean = True) As Image Dim W As Integer = Screen.PrimaryScreen.Bounds.Width Dim H As Integer = Screen.PrimaryScreen.Bounds.Height Dim DesktopBitmap As New Bitmap(W, H) Dim g As Graphics = Graphics.FromImage(DesktopBitmap) g.CopyFromScreen(0, 0, 0, 0, New Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height), CopyPixelOperation.SourceCopy) If ShowCursor Then Cursors.Default.Draw(g, New Rectangle(Cursor.Position, New Size(32, 32))) g.Dispose() If Width = 0 And Height = 0 Then Image = DesktopBitmap Return DesktopBitmap Else Dim ScaledBitmap As Image = DesktopBitmap.GetThumbnailImage(Width, Height, Nothing, IntPtr.Zero) DesktopBitmap.Dispose() Image = ScaledBitmap Return ScaledBitmap End If End Function End Class تحتوي الفئة rtaDesktop على دالة واحدة من النوع Shared (Static) وبالتالي فيمكنك استخدامها بدون إنشاء كائن لها (اي سندها اى متغير) .. بالشكل التالي : Dim Img As Image = rtaDesktop.GetDesktopImage() الكود السابق سوف يخزن صورة لسطح المكتب في المتغير Img بينما وهذه الصورة سوف تتضمن صورة مؤشر الفارة ايضا عليها. مؤشر الماوس لكن توجد حالات لانريد ان يظهر فيها مؤشر الماوس على الصورة التي سنلتقطها لسطح المكتب. في هذه الحالة يمكنك بسهولة تغيير السطر السابق الى التالي : Dim Img As Image = rtaDesktop.GetDesktopImage(ShowCursor:=False) هذا الكود سوف يجلب لنا صورة سطح المكتب السابقة ولكن دون مؤشر الفارة. حيث False لإخفاء المؤشر و True لإظهاره. ابعاد صورة سطح المكتب في بعض الاحيان تحتاج الى اخذ صورة صغيرة لسطح المكتب !! ... تخيل معي انك تريد ان تقوم بارسال نسخة مصغرة من سطح المكتب الى كمبيوتر آخر في الشبكة لنقل صورة بعرض 300 * 200 .... طبعا من الممكن ان تقوم بأخذ صورة عادية كما في الطريقة السابقة وارسالها الى الكمبيوتر الآخر ثم تقوم هناك بعرضها داخل PictureBox صغير بحيث يقوم بتصغيير حجمها ليناسبه! غير ان فعلك لهذا يعتبر خطأ كبير جدا ... لأنك غامرت بارسال بيانات كبيرة تؤثر سلبا على سرعة برنامجك وعلى اداء الشبكة ككل في حين انك لا تريد سوى صورة صغيرة لجزء معين هو 300 في 200 مثلا. وللتخيل فظاعة المشكلة ينبغي ان تعرف ان الصورة بحجم كامل للشاشة في جهازي مثلا كان حجمها 1.4 ميجا بايت اي تقريبا ميجا ونصف بينما نفس الصورة بحجم 300 في 200 .... فقد وصل حجمها الى 111 كيلو ... اي ان حجم الاخيرة حوالي 8% من حجم الصورة الكاملة ... وبكلام آخر ان حجم الصورة الكاملة يزيد عن حجم صورتك الصغيرة بإثنا عشر مرة. لهذا اذا اغفلت شيئا كهذا سيعني ان صورة واحدة ترسلها الى الشبكة يمكن لغيرك ان يرسل عشر صور بنفس التكلفة تبعك. المهم في موضوعنا هذا انك يمكن ان تحصل على صورة بالابعاد التي تريدها لسطح المكتب بإستخدام فئتنا العزيزة كما يلي : Dim Img As Image = rtaDesktop.GetDesktopImage(300,400,True) في الكود السابق ستحصل على صورة بابعاد 300 في 200 وتحتوي على مؤشر الماوس. ارجوا ان تستفيد من هذه الفئة البسيطة تحياتي السلام عليكم ورحمة الله وبركاته
  11. السلام عليكم الاخ الكريم psa في الواقع في حالة ان احد البرنامجين مغلق وقمت با الارسال من الاول الى الثاني من المنطقي ان تضيع الرسالة الرسالة لان لايوجد من يستقبلها في الطرف الاخر .. ولذا فلايوجد اي خطأ بإذن الله تعالى. اما اذا كنت تقصد انك تريد التاكد من وصول الرسالة فهنا انا انصحك ان تستخدم بروتكول آخر غير الـ udp لان هذه هي خصائصه .... وبغض النظر عن ذلك اذا كنت مصر ... فيمكن التلاعب قليلا وارسال رسالة من البرنامج B الى البرنامج A بعد كل ارسال ... بحيث يرسل البرنامج A الرسالة الى B وينتظر الرد فاذا جاءه رد فان هذا يعني ان الرساله وصلت. تحياتي السلام عليكم السلام عليكم ورحمة الله وبركاته لقد تم منذ قليل ‘نهاء الاصدار الثاني من الاداه وفيها الغيت الاوضاع CommandMode و TextMode و استبدلتهما بالوضع الجديد الاكثر شمولية ObjectsMode والاداة مع برنامج تجريبي مع السورس كود تجدها في الرابط http://www.arabteam2000-forum.com/index.php?showtopic=212998 تحياتي السلام عليكم __________________
  12. بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته اداة التراسل البديلة عن الوينسوك في الدوت نت - rtaUDPSocketLibrary الإصدار الثاني الاداة بحالتها الحالية اسمها rtaUDPSocket تحتوي على عدة خصائص و دوال واحداث ... وتعتمد على ارسال و استقبال البيانات بإستخدام بروتكول الـ UDP وفيما يلي لمحة بسيطة عنه. بروتكول الـ UDP او الـ User Datagram Protocol عبارة عن برتوكول لإرسال و استقبال البيانات بشكل غير مضمون التوصيل و الترتيب ... بما معناه انك اذا ارسلت عدة رسائل بإستخدام هذا البرتوكول فلايوجد اي ضمان بان جميع الرسائل ستصل اصلا وفي حالة وصولها لايوجد ضمان بوصولها بنفس الترتيب الذي اُرسلت عليه !! ... كما انه لايوجد ضمان بانها ستصل دون اخطاء ! فبالتالي فأي رسالة تُرسل بهذا البروتوكول هي عرضه للثلاثة مخاطر (الضياع اي عدم الوصول, ضياع تسلسل الارسال والاستقبال , الوصول مع بعض الاخطاء) وعلى الرغم من ذلك فكلا من هذه المخاطر هي نادرة الحصول غير ان حصولها يبقى جائزا. قد يكون هذا الكلام صادما للبعض فما حاجتنا لبرتوكول كهذا ليس كبروتوكول الـ TCP الذي يضمن وصول البيانات تحت اي ظروف كما يضمن خلوها من اخطاء الارسال وكذلك ضمان وصولها متسلسلة بالشكل السليم. طبعا وعلى الرغم من انني بدأت بعيوب هذا البرتوكول فان الاجابة تكمن في كون هذا البرتوكول له خصائص جميلة جدا تميزه عن برتوكول الـ TCP .... منها : 1 - السرعة .... حيث ان ارسال واستلام البيانات فيه اسرع بكثير من برتوكول TCP. 2 - عدم الحاجة الى انشاء اتصال دائم. 3 - امكانية البث الاداعي Boradcasting و Multicasting وفيه ارسال رسالة واحدة للشبكة كاملة او لجزء منها. للتوضيح فأن سرعة هذا البرتوكول تجعله المفضل لبعض التطبيقات مثلا عند ارسال الفيديو المباشر (من كاميرا مثلا) او لنقل الصوت وخلافه فإن هذا البرتوكول اكثر فائدة واستخدام في اي برنامج يحتاج الى سرعة في ارسال الرسائل القصيرة نسبيا... فمثلا لن يضيرنا ان يحدث فقد بسيط في اجزاء صغيرة من الصوت او الصورة مقابل السرعة في ايصالهما. .... مثال آخر تخيل انك تريد التحكم بماوس جهاز بعيد فان استخدام هذا البرتوكول يجعل ارسال اوامر الماوس الى الجهاز البعيد اسرع بكثير. الخاصية الثانية بهذا البروتكول هو انه لا يحتاج الى اتصال كامل بين الجهازين حتى يتم الارسال ... ففي حالة برتوكول الـ TCP لا يتم الارسال إلا بعد انشاء اتصال كامل بين الجهازين بحيث يرسل الاول طلب اتصال بالمنفذ المعين ثم يقبل الطرف الآخر الاتصال وبهذا يتم الاتصال ثم يبدأ الارسال وبعد انتهاء الاتصال يجب قطع الاتصال بين الجهازين. Connect, Send , Disconnect اما في برتوكول الـ UDP فلايستلزم الامر وجود الاتصال الكامل وانما عندما يتستخدم البرنامج هذا البرتوكول فان البرنامج المرسل يقوم فقط بارسال الرسالة الى الهدف دون الانتظار لكي ينجح الاتصال و يتحقق من وصول البيانات و يتأكد من صحتها. حيث انك اذا ارسلت مثلا 100 رسالة قصيرة فان هذا البرتوكول سوف يقذف الرسائل الى الشبكة باتجاه هدفها ولن ينتظر للتأكد من وصولها بشكل سليم .... وهذا يجعله سريعا جدا في الارسال. امكانية البث الاذاعي Broadcasting تمكنك من ارسال رسالة الى الشبكة كاملة على منفذ معين بحيث تستلم الرسالة جميع الاجهزة بالشبكة وهي خاصية جميلة لها تطبيقات عديدة سنتطرق اليها في موضوع مستقل كمثال حقيقي على استخدام الاداه. ملاحظة مهمة: هدف هذا البروتوكول ارسال واستلام الرسائل القصيرة السريعة ... اما في حالة البحث عن اتصال دائم وقوي لإرسال واستلام اي نوع وحجم من البيانات فانه يفضل استخدام الـ TCP برتوكول (وسوف أضع قريبا بإذن الله تعالى اداة مشابهة للتعامل مع هذا البرتوكول). ---------------------------------------------------------------- مكونات الإصدار الثاني لإداة rtaUDPSocket تحتوي الاداة في اصدارها التجريبي المرفق هنا على خمس خصائص هم : RemoteIP ويحتوي على اسم او عنوان الجهاز المراد الاتصال به. RemotePort يحتوي على المنفذ المراد الاتصال به. ListenPort يحتوي على المنفذ الذي سيتم انتظار الاتصالات الخارجية عليه. IsListening وهي خاصيه يمكن عن طريقها معرفة ما اذا كانت الاداة في حالة استماع. SocketDataMode وهذه الخاصية يمكن ان تكون واحدة من قيمتان تحدد نوع البيانات التي سيتم ارسالها واستلامها: النوع الأول هو DataMode وفيه سيتم التراسل عن طريق البيانات الثنائية Binary .. مثال : Dim Data() As Byte = New Byte(){0,1 , 23, 5, 98} skt.SocketDataMode = SocketDataModes.DataMode skt.Send(Data) والنوع الثاني هو ObjectsMode وهو مفيد لإرسال الكائنات على شكل رسائل تتكون من شقين الاول هو الأمر Command وهو عبارة عن نص قصير يمثل نوع او عنوان الرسالة والجزء الثاني الـ Object وهو عبارة عن الكائن الذي تم ارساله مثال: skt.SocketDataMode = SocketDataModes.ObjectsMode skt.Send("NewMessage", "How Are You?") الاسلوب ObjectsMode سيكون مفيدا لتسهيل التراسل بين برنامجين على شكل امر ورسالة اختصارا وفي المثال المرفق تجد توضيح لها الامر. وبالتالي فانه بواسطة هذه الاداه يمكن ارسال اي كائن بسهولة ويسر ودون ان تقوم بذلك بنفسك ... فقط ارسل الكائن الذي تريده بإستخدام الامر Send وفي الطرف الاخر سوف يتم تفجير الحدث ObjectReceived .. تخيل معي ان لديك ثلاث متغيرات الاول عبارة عن صورة و الثاني عبارة عن عدد و الثالث عبارة نص. Dim Img As Image = Image.FromFile("c:\....") Dim msg as String = "How are you Ragheed?" Dim num As Integer = 123 udp.Send("NewImage", Img, "192.168.1.200", 20202) udp.Send("NewMsg", msg, "192.168.1.200", 20202) udp.Send("NewNum", Num, "192.168.1.200", 20202) لاحظ اننا لدينا هنا ثلاثة متغيرات img و msg وnum وكلها من انواع مختلفة ومع ذلك قمنا بارسالها بنفس الطريقة عن طريق Send الى العنوان 192.168.1.200 و المنفذ 20202. هذا الامر لم تكن الوينسوك الاصلية يمكنها القيام به ... غير انه ومع الدوت نت يمكن عمله بسهولة وسترى الفرق عندما تريد ان ترسل صورة سطح المكتب مثلا. ------------------------------------------------------------------------------- وهي تحتوي على اربعة احداث مختلفة هي DataReceived Event هذا الحدث يتم تفجيره عند استلام بيانات من اي كمبيوتر عندما تكون الخاصية SocketDataMode = DataMode وفيه يتم استلام مصفوفة من البايتات عن طريق e.Data ... ObjectReceived Event يتم تفجير هذا الحدث عندما تكون الخاصية SocketDataMode = ObjectsMode... مثلا في الشفرة السابقة ارسلنا ثلاثة متغيرات (صورة ونص وعدد) وعندما يتم استلامهم في الطرف الآخر سوف يتفجر هذا الحدث بالشكل التالي: Private Sub udp_ObjectReceived(....) Handles udp.ObjectReceived Select Case e.Command Case "NewImage" MsgBox("تم استلام صورة") Me.BackgroundImage = e.Object Case "NewMsg" MsgBox(e.Object.ToString,,"تم استلام نص") Case "NewNum" MsgBox(e.Object.ToString,,"تم استلام رقم") End Select End Sub آخر الاحداث هو الحدث Error Event وهو الحدث الذي يتم تفجيره عند حصول اي خطأ والان الى الاوامر او الدوال التابعة لهذه الفئة ..... حيث ان لديها اربع اوامر او وظائف هي: Send() لارسال البيانات الى عنوان جهاز معين Broadcast() وهو نفس الامر Send غير انه لا يتطلب ادخال العنوان وانما المنفذ فقط لأن الرسالة سوف تبعث الى الشبكة كلها وليس الى كمبيوتر معين فقط. وهذا الامر له تطبيقات خرافية سنأتي عليها لاحقا .. بإذن الله تعالى. Listen() وهو الامر المستخدم لإنتظار الرسائل على منفذ معين Close() وهو امر الاغلاق لإنهاء الانتظار على اي منفذ. --------------------------------------------------------------------- اضع هنا شفرة الاداة الإبتدائية مع برنامج بسيط ... و لاحقا ساقوم بوضع برنامجين كامثلة على استخدام هذه الاداة. 1 - برنامج شات داخل الشبكة بدون الحاجة الى استخدام سرفر. 2 - وبرنامج مراقبة سطح المكتب لكمبيوتر بعيد. 3 - وربما لاحقا برنامج مراقبة شاشات الكمبيوتر للمعلمين داخل الفصل. تحياتي السلام عليكم ورحمة الله وبركاته TestPrograms.zip rtaUDPSocketLibrary.zip
  13. انا وبكاء طفلتي الصغيرة !

    لتحسين الشكل الخارجي للبرنامجنا الصغير .... يمكن تجربة الكود المرفق فقد صممت اداة بسيطة لتحسين عرض بيانات الصوت الظاهر على الشاشة بدلا الليبل Label1 تحياتي السلام عليكم rtaSoundsBars.zip
  14. انا وبكاء طفلتي الصغيرة !

    السلام عليكم ورحمة الله وبركاته. ننتقل الان بعون الله تعالى بعد ان اخذنا فكرة عامة لما نحن مقدمون عليه الى مسئلة ادخال الصوت !.... لكي يقوم الكمبيوتر بقراءة الصوت من الميكرفون انت بحاجة للخروج عن الدوت نت قليلا .. لانه لايوجد في الدوت نت مسجل للصوت (على الرغم من انه يوجد فيها مشغل SoundPlayer ) إلا انه وحتى الان لا يوجد مسجل اصوات ضمنيا فيها ولهذا يمكن اللجوء الى عدة خيارات مثل DirectSound او دوال الادخال والاخراج في الـ APIs. على العموم لتسهيل المهمة قمت بعمل مكتبة صغيرة على السريع تعتمد على الدايركت اكس لنستخدمها في برنامجنا (المكتبة غير مسقرة بعد وغير مجربة بالشكل جيد) غير انها ستفي بالغرض بإذن الله تعالى. اسميتها rtaSoundRecorder ... تجدها مرفقة مع البرنامج المرفق بإسم rtaSoundLibrary.dll المهم في الموضوع ان هذه الآداه يمكن تعريفها بالشكل التالي : Private WithEvents Snd As New rtaSoundsLibrary.rtaSoundRecorder وبهذا يكون لدينا متغير اسمه Snd يمكن استخدامه لقراءة الاصوات من الميكروفون عن طريق الامر Record كالتالي : Snd.Record( Me.Handle, 1, 8, 8000 ) في السطر السابق قمنا باستدعاء امر التسجيل ومررنا له عنوان الفورم ثم الرقم 1 من اجل قنوات الصوت Channels والرقم 8 ويعني 8 بت (أي بايت واحد) والرقم 8000 ويعني تردد التسجيل. كل هذه الارقام تمثل جودة الصوت الذي سيتم ارجاعه لنا ويمكن تغيرها لكن لاتقم بذلك في هذا البرنامج لانها اكثر من كافية ... حيث اننا لا نريد تسجيل الصوت بدقة عالية وانما نريد فقط استشعار صراخ الطفلة. ولأننا طلبنا ان تكون البيانات المسجلة بطول 8 بت (بايت واحد) فان الراجع لنا سيكون على شكل مصفوفة من البايتات في الحدث SoundRecorded Private Sub Snd_SoundRecoreded(ByVal Sender As Object, ByVal SoundData() As Byte) Handles Snd.SoundRecoreded End Sub لاحظ ان المصفوفة SoundData تحتوي على جميع قيم الصوت المرجعة لنا. ومثلا لمعرفة اكبر قيمة صوت يمكن استخدام الكود التالي: Dim MaxValue As Integer = SoundData.Max وبهذا يكون لدينا المتغير MaxValue والذي فيه اكبر قيمة للصوت المقرؤء لحظيا. ملاحظة مهمة: القيم ستكون محصورة في حدود البايت الواحد ... اي من صفر الى 255 ولان القيمة 128 هي المنتصف فالقيمة ستكون محصورة غالبا بين: 128 و 255 ... بحيث ان 128 يرمز الى عدم وجود صوت و 255 ترمز الى اعلى صوت. دعنا مثلا نعرض الصوت الحالي في Label1 ... سيصبح كود برنامجنا كاملا كالتالي : Public Class Form1 Private WithEvents Snd As New rtaSoundsLibrary.rtaSoundRecorder Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Snd.Record(Me.Handle, 1, 8, 8000) End Sub Private Sub Snd_SoundRecoreded(ByVal Sender As Object, ByVal SoundData() As Byte) Handles Snd.SoundRecoreded Dim Max As Integer = SoundData.Max Me.Label1.Text = Max - 128 End Sub End Class لاحظ ان هذا هو كل مايلزمنا لقراءة الصوت ورؤية اكبر قيمة له في الفورم وتحديدا في Label1 ... وقد تكون القيم من 128 الى 255 مربكة بعض الشيء ومن الجميل تحويلها الى نسب مئوية بين الصفر و 100%وذلك عن طريق التعديل التالي : Public Class Form1 Private WithEvents Snd As New rtaSoundsLibrary.rtaSoundRecorder Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Snd.Record(Me.Handle, 1, 8, 8000) End Sub Private Sub Snd_SoundRecoreded(ByVal Sender As Object, ByVal SoundData() As Byte) Handles Snd.SoundRecoreded Dim Max As Integer = SoundData.Max Dim Value As Integer = Math.Round((Max - 128) / 127 * 100) Me.Label1.Text = Value.ToString & " %" End Sub End Class الى هنا نكون قد انتهينا من ادخال الصوت الى الكمبيوتر بكل سهولة بحمد الله تعالى ويمكن الاطلاع على المل المرفق. السلام عليكم ورحمة الله وبركاته rtaSoundInputTest.zip
  15. بسم الله السميع العليم السلام عليكم ورحمة الله وبركاته سوف اشارككم اليوم احدى مشاكلي العائلية منذ نشوئها وحتى تم إغلاقها بفضل من الله ومنة .... -------------------------------------------------- المشكلة -------------------------------------------------- نشئت المشكلة منذ عشرة اشهر تقريبا وبالتحديد منذ ان رزقني الله بصبية صغيرة لونت حياتي واضافت عليها مزيجا رائعا من الالوان الجذابة .... فأزدادت مشاعر حبي لهذه الرضيعة (كثيرة البكاء) منذ ايامها الاولى التي حرمني نومي فيها بكائها المتواصل واصبحت شخصا آخر توسعت مداركه وتجاوزت اهتمامتي مجالها المعروف (فكل اهتمامتي كانت برمجية بحثه) ... اما الان فانا اهتم بالكثير من الاشياء الجديدة بالنسبة لي فمن بعد متابعتي لآخر اخبار مايكروسوفت اصبحت اتابع آخر اخبار الأبقار !!! ... (مثل اخبار جنون البقر ، اسعار الألبان ، و و و ........ الخ ) و الكثير من الاشياء المشابهة..... وبعيدا عن إهتماماتي الابوية تلك و بعيدا عن هذه المقدمة الدرامية .... فمشكلتي الحالية مع صغيرتي يدخل فيها عوامل مختلفة مثل حالة الطقس! ... وتصميم المنزل الذي اسكن فيه وخلافه .... المسئلة بإختصار تكمن في كون الجو حار في منطقتي مما يلزم النوم في غرف مكيفة كحال غرفة نومي و بالتالي فإننا نضع الصغيرة في غرفة النوم (المكيفة) ثم اذهب انا لعملي وتذهب امها للمطبخ .... فتنشأ مشكلة العزلة الكاملة التي تعانيها الصغيرة بسبب كون المطبخ بعيدا جدا عن غرفة النوم ... فتبكي البنت بكاء شديدا بسبب الجوع وماشابه دون ان يتنبه احد لذلك ولكون الجو حار فلا نستطيع اخراجها من غرفة النوم الى غرفة اخرى اقرب الى المطبخ حتى يتسنى سماعها لأنها ببساطة (اصبحت فتاة مدللة) ولاتستطيع النوم إلا في غرف مكيفة!!!. والان اذا كنت تتسائل ما الذي يدفع محدثك (الممل) الى جلب مشاكله العبيطة مع طفلته الرضيعة الى صفحات منتدانا الذي يزحم بشباب ليس لديهم وقت ليضيعونه على هكذا مشاكل ؟!! .... فالاجابة تكمن في كوني لم استطع ان اتجاهل بكاء الطفلة سواءا بتركها تبكي في غرفتها او بإخراجها لتبكي في الجو الحار ... فبعد كوب من الشاي وضرب بضعة اخماس في اسادس (666 * 55 * 65 ** 66 * 555) ... ارتأيت ان استعين بصديقي القديم Mr. VB.NET للخروج من هذه المشكلة ------------------------------------------------------- فكرة الحل ------------------------------------------------------- يكمن الحل في نظري في ارضاء جميع الاطراف .... الطرف الاول الطفلة بحيث نجعلها تنام في الغرفة التي تحبها وهي بالطبع الغرفة ذات التكييف وفي نفس الوقت إرضاء والديها بالاطمئنان عليها وهي بعيدة عنهم. وبهذا نخلص الى ضرورة تصميم برنامج يقوم بمراقبة الطفلة اثناء نومها وفي حال استيقاضها وشروعها في البكاء يقوم بتحليل الوضع لمعرفة ما اذا كان بكاءاً عابراً (ربما انت لا تعرف ان الاطفال قد يفتحوا اعينهم ويبكون لثواني معدودة ثم يعودوا للنوم وكأن شيئاً لم يكن) ولذا وجب على برنامجنا ان يقوم ببعض التحاليل لمعرفة ما اذا كان هذا بكاءاً عابرا ام لا ... وفي حال كونه استيقاضا كاملا وبكاء غير عابر يقوم بتنبيه الأم في مطبخها ليكي تأتي بالحليب للصغيرة الباكية. ------------------------------------------------------- دراسة المشروع ------------------------------------------------------- اجزاء المشروع تنقسم الى ثلاثة اقسام هي : ( إستقبال البيانات ، تحليلها ، ارسال التنبيهات ) او قل لنسميها ثلاثة تحديات ... سنتصدى لها واحد تلو الآخر ونصمم سويا مشروعنا الصغير للتنبيه عن حالات بكاء صغيرتي المدللة. التحدي الأول : إدخال البيانات ------------------------------------ يختلف برنامجنا عن غيره من البرامج في كونه لن يكون هناك مستخدم يجلس امام الكمبيوتر ليزوده بالمعلومات عن حالة الطفلة هل هي تبكي ام انها تنام بسعادة واطمئنان. لهذا وجب على برنامجنا ان يستخلص المدخلات استخلاصا دون مساعدة أي إنسان. التحديث الثاني : تحليل البيانات ------------------------------------ اذا نجح برنامجنا في تحديه الأول واستطاع ان ينتزع المدخلات بنفسه ودون مساعده سيتوجب عليه بعذ هذا تحدي آخر هو فلترة هذه المدخلات لمعرف الحالة الحقيقية للطفلة وبكلام آخر يجب ان يكون لذى برنامجنا دماغ صغير يستخدمة لفحص ومقارنة المدخلات والتفكير فيها حتى يقرر ما اذا كان التنبيه واجبا ام لا. التحدي الثالث : ارسال التنبيهات ------------------------------------- يؤسفني انه لازال امام برنامجنا تحدي آخر يكمن في كيفية ارسال البيانات وكيف سينبه الأم التي في المطبخ ؟! .. فهي لاتمتلك جهاز كمبيوتر (لتطبخ فيه بعض المجلدات بنكهة لوحة التحكم ) حتى نتمكن من ارسال رسالة اليها بالبريد مثلا او تنبيه على شكل رسائل في شاشة الكمبيوتر مثل رسائل برامج الماسنجر ... فلاشيء هناك في المطبخ غير بعض الاطعمة الشهية مع القليل من الدخان المتطاير. على سيرة الدخان ... حكمة خارجة عن الموضوع تقول : تواضع تكن كالنجم لاح لناظر **** على صفحات الماء وهو رفيعُ ولا تكن كالدخان يعلو بنفسه **** إلى طبقات الــجو وهو وضيعُ جعلني الله واياك من المتواضعين ------------------------------------------------------- تحليل الحل البرمجي لمشروعنا ------------------------------------------------------- رأينا في السابق ان برنامجنا ينقسم الى ثلاثة اقسام اولها هو .. تحليل ادخال البيانات : لكي نقوم بإيجاد بيانات ادخال لبرنامجنا يمكننا التفكير في طريقتين .... الاولى عن طريق الكاميرا بحيث ناخذ صور من الكاميرا الموجهة على الصغيرة اثناء نومها ثم نحلل هذه الصور في الفقرة الثانية لمعرفة ما اذا كانت الصبية قد افاقت ام لا. والطريقة الثانية هي عن طريق المايكروفون بحيث نراقب ترددات الصوت طوال فترة نوم الصغيرة ونقوم بتحليلها لمعرفة ماذا كانت تبكي بكاء عابرا او بكاء فوقان من النوم. بالنسبة لنا هنا سنختار الطريقة الثانية كونها الانسب لحالتنا هذه وذلك لأنها ستراقب بكاء الطفلة وليس حركتها فقد تفيق الطفلة وتعلب لبعض الوقت في الفراش دون ان يكون هناك ما يضايقها فلاداعي لإقلاق الام وننبهها دون وجود مايستحق التنبيه ولندعها تركز في وجبة الغداء الشهية التي طالما يعود الأب للبيت وهو يحلم فيها. تحليل القسم الثاني (البيانات) : عرفنا سويا كيف سنحصل على المدخلات لبرنامجنا وما نوعها وينبغي ان نعرف كيف سنحللها .... في الواقع ان مدخلات الصوت ما هي إلا عبارة قيم متسلسلة تعبر عن الصوت على شكل بايتات (مصفوفة بايتات) وهذه البايتات تمثل القيم التي اذا ما ارسلناها الى السمعات فسوف تخرجها على شكل صوت .... تخيل معي ان قيمة الصوت تتراوح بين 0 و 100 فان هذا سيعني انه اذا كانت القيمة 0 فمعناها الصمت المطبق (لاصوت) وهي حالة نادرة لانه لابد وان يكون هناك ضوضاء ولو خفيفة جدا لاتسمع ... المهم انه واذا وجد قيمة 100 فان هذا يعني اكبر صوت تستطيع اخراجه سماعاتك وبين ذلك فقيم تمثل قوة الصوت فلو كانت 60 فيعني 60% من قدرة سماعات كمبيوترك. نستخلص من ذلك انه اذا كان لديك مصفوفة من الارقام المتراوحة بين 0 و 100 مثلا فان السماعات ستشغل هؤلاء واحدة تلو الاخرى بحسب قوة (قيمة) كل رقم. طبعا في الوضع الحقيقي القيم ليست من صفر الى مئة بل تعتمد على نوع التسجيل الذي اخترته انت WaveFormat يعتمد على عدة خيارات مثل هل تريده احادي (مونو) او ثنائي (استريو) كما انه يمكن تحديد طول كل عينة من الصوت التي سيقوم المكرفون بإلتقاطها (بايت او اثنين .... وهكذا) ... والتردد (كم عينات ستؤخذ في الثانية الواحدة). المهم لك لتعرفه ان قيم الصوت تعتمد على نوع التسجيل الذي اخترته وهذا موضوع لايمهنا هنا كثيرا. فسوف آخد ابسط نوع للتسجيل مثلا نوع احادي بطول بايت واحد وتردد صغير.... وبهذا تكون القيم تبعنا محصورة في (بايت واحد) ومن 128 الى 255 ... عرفنا في التحليل السابق ان الصوت عبارة عن قيم تعبر عن مستوى الضجيج وهو ما سنقوم بمراقبته لمعرفة فترات بكاء الطفلة من فترات سكوتها. تحليل القسم الثالث (التبيهات) : اذا استطعنا بنجاح ان نعرف ماذا كان التبيه واجب ام لا ... وفي حال وجوب التبيه ينبغي التفكير بإسلوب بسيط غير مكلف لننبه به الام عن بكاء طفلتها ... وهنا يمكن الاتجاه الى AT Commands فليس ابسط من ان نقوم بوصل سلك الهاتف العادي بكمبيوترنا بحيث انه اذا بكت الطفلة واجتازت البيانات المرحلتين السابقتين بنجاح فسنجعل الكمبيوتر يقوم بالاتصال بالأم على جوالها من رقم البيت فيرن مرتين او ثلاث ثم يقطع الاتصال فتعرف الام بأن المتصل هو برنامجنا الصغير دون ان اي تكلفة تذكر... فتهرع الى طفلتها الصغيرة. الى هنا اكتفي لأن النوم قد اعياء عيناي ولنا لقاء بإذن الله تعالى لنكمل التصميم وتطبيق مشروعنا الصغير. اتركم في رعاية الله السلام عليكم ورحمة الله وبركاته