• الإعلانات

    • فيصل الحربي

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

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

romansy

الخبراء المعتمدون
  • عدد المشاركات

    1,049
  • تاريخ الانضمام

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

كل شيء نشر بواسطة romansy

  1. السلام عليكم ورحمه الله وبركاته ،، ايمانا مني بضرورة نشر المعلومات وعدم وضعها فوق الأرفف ، فقد أرتأيت أن اضع مشروعي وذلك لكي يستفيد منه من بعدي ، وان كان المشروع أراه حاليا غير مفيد خاصه لمن لديهم معرفة جيدة بالمجال ، لكن على كلٍ فهذا جُهد المقل ، والفضل لله وحده، وما كان في بحثي من صواب فمن الله تعالى، وما كان من خطأ فمن نفسي ومن الشيطان. كما أرحب بأي انتقاد أو سؤال أو حتى دعوة للمشاركة في مشروع متعلق بالمجال .. سواء كان مجاني أو تجاري وكم أتمنى أن نرى ذات يوم منتديات ومجلات متخصصه بالعربية في مجال الفايروسات ومكافحتها .. المشروع يتكون من من البحث موجود في ebook ، والكود المصدر للبرامج source code مرفق معها النسخ التنفيذيه ،، الحجم 6 ميغا .. Computer Viruses strategies and detection techniques ملاحظة: شكر خاص لكل من وقف وراء هذا العمل ومساعدتي ولو بأبسط الأشياء..جزاهم الله خيرا وأحسن اليهم.. والحمد لله رب العالمين ..
  2. نعيش اليوم في عالم تتوفر فيه المعلومات في كل مكان بعدة أشكال (مقالات، دروس، كتب، دورات تعليمية) وأصبح الوصول اليها غير مكلف وفي وقت سريع، فبمجرد بحث بسيط تستطيع الوصول الى ملايين من المعلومات، سواء كان لديك سؤال وتبحث عن إجابة أو مشكلة برمجية تحتاج لحل، أو طريقة لإعداد برنامج ما أو حتى تريد الحصول على خدمات من مواقع العمل الحر فكل ذلك يمكن الوصول اليه بدون تكلفة أو بتكلفة بسيطة في غالب الأحيان. ليس هذا فقط، بل حتى الأدوات Tools والبرمجيات أصبحت كذلك رخيصة أو مجانية وهناك الخيارات البديلة للبرمجيات المغلقة المدفوعة في عالم ال Open Source وقد يكون بعضها مساو أو أفضل من المدفوعة. وحتى الأجهزة والمعالجات Hardware أصبحت أقل تكلفة وأكثر مقدرة، بعكس ما كان عليه قبل سنوات حيث كانت المراجع شحيحة والمعلومات غير متوفرة بسهولة والأجهزة الجيدة يصعب امتلاكها. " فإذا كانت المعرفة والمعلومات والأدوات رخيصة فالمتبقي هو المهارات Skills " المجتمع لم يبقى مجتمع معرفي knowledge Based Society بل أصبح قائم على المهارات Skill Based Society فالمعرفة موجودة في كل مكان حولنا، وفي السابق أي درجة علمية من الجامعة كانت تكفي لكي تحصل على وظيفة مرموقة، أما الان لا فلا أحد يهتم بما تعرف ومن أين حصلت على شهادتك، بل بما تستطيع عمله "مهاراتك Your Skills". فامتلاك المعرفة ليس كافياً بل معرفة كيفية استخدامها سواء كانت هي معرفتك أو معرفة غيرك فهو الأهم. في هذا الكتيب سوف نركز على موضوع التعليم وعلى المهارات واكتسابها، وتعرف كيف تستخدم معرفتك أو معرفة غيرك، وسوف نحاول أن نغير نظرتك في كيفية تعلم التقنيات واختيار الطريقة المناسبة في التعلم بالإضافة الى تحفيزك لبناء خطة تعلم تتناسب معك وتستطيع من خلالها تحقيق كل اهدافك التي ترغب بها.     رابط الكتاب (يستوجب تسجيل الدخول): https://moalfat.com/ProductPage/8/%D9%83%D9%8A%D9%81-%D9%8A%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC-%D8%A8%D8%B4%D9%83%D9%84-%D8%B5%D8%AD%D9%8A%D8%AD%D8%9F
  3. يعني انه يجب أن تقرأ المعلومة أكثر من مرة حتى تفهمها ويفضل أن تكون من مصادر مختلفة، اي شخص يقرأ موضوع لأول مرة لا يستوعبه بشكل جيد ، وانما عليه العودة والقرائه فيه مرة أخرى حتى تثبت المعلومة أكثر ولو كانت بعد وقت..   وشكراً.
  4. ? How to install lucene library in Netbeanse

    فقط ضيف ال library بدون الjava doc فهذه غير ضرورية الا اذا احببت ان تضيفها من نفسك لكي ترى التوثيق ولكن فقط ضع الJar في الLibrary Folder في النت بينز وسوف تعمل
  5. السلام عليكم ورحمه الله ويركاته ،، مقدمه : =-=-=-= إن موضوع التحليل والتصميم بالكائنات من أهم المواضيع الني ينبغي لأي مبرمج أو مطور يستخدم لغه كائنيه أن يجيده ، حيث على المبرمج أن يقوم بتحليل البرنامج أولا ويعرف ما هي المشكله التي يريد أن يحلها Analysis ومن ثم يبدأ هذا المبرمج بطرح الحلول وكيف يمكن أن تتفاعل هذه الكائنات مع بعضها البعض design ، ومن ثم يقوم بعمليه الCoding ويقوم بتطبيق التصميم الذي طرحه في المرحله السابقه ، وأخيرا يقوم باجراء الTesting للبرنامج والتأكد من مطابقته لمتطلبات الزبون Customer Requirement . العمليات السابقه التي ذكرتها (Analysis,Design,Coding,Testing) تعرف بدوره حياه المشروع Software Development Life Cycle . وبالطبع أي مشروع يجب أن يمر على جميع هذه المراحل بترتيب معين حيث أن عمليه التطوير يجب تكون على منهجيه معينه وباتباع طريقه ما Methodology والا ستعم الفوضي ولن تستطيع حتى كتابه سطر واحد صحيح من البرنامج . باتباع هذه المهجيات سوف تضمن أن عمليه تطويرك للبرنامج تسير في المنحنى الصحيح ، كما أنها توفر لك كل ما تحتاجه من وقت البدء في تحليل المشروع الى وقت التسليم والصيانه للمشروع ، اضافه الى توضيح نوعيه الوثائق والمخططات التي ستنتجها كل مرحله Activities & Artifacts وليس هذا فقط فهناك منهجيات توفر لك نصائح وارشادات في عمليه جدوله المشروع واداره الفريق وما الى ذلك من العمليات الإداريه Management Task . قديما كانت تجري هذه العمليات SDLC بالترتيب وبشكل متنازل وهو ما يعرف بنموذج الشلال Waterfall Model .. حيث يقوم أولا المحلل بتحليل البرنامج بالكامل وكتابه جميع الوثائق المطلوبه ومن ثم يمرر هذه الوثائق للمصمم الذي يقوم بتصميم النظام ووضع حلوله أيضا ، ومن ثم تمر بالمبرمج الذي يقوم بكتابه الكود وعندما ينتهي تجرى الأختبارات على هذا البرنامج وأخيرا يسلم الى الزبون .. ولكن للأسف هذا النموذج لا يصلح بتاتا الا في المشاريع الصغيره والتي لا يوجد فيها خطوره ما (مثلا فريق التطوير قد قام بمشروع مشابه للمشروع الحالى ، حينها يمكن أن يستخدم هذا النموذج) .. مشكله أخرى وهي عدم وجود وثائق موحده تمر علي جميع فريق التطوير فالمحلل لديه اساليب خاصه فيه والمصمم كذلك وكل منهم بحاجه الى مزيد من الوقت لكي يفهم ماذا كان يقصد الشخص الذي كتب هذه الوثائق .. ليس هذا فقط فعند الدخول في المشاريع الكبيره تبدأ المشاكل الأكبر بالظهور، فنموذج الشلال لا يسمح يتغيير المتطلبات ، حيث يجب على المحللين في البدايه أن يقوموا بتحليل النظام بشكل كااامل ومن ثم تبدأ مرحله التصميم وهكذا لجميع المراحل حيث لا عوده للخلف بتاتا .. السؤال هنا ماذا لو تغيرت متطلبات هذا الزبون بعد مرور 3 أشهر من التحليل والتصميم وبالبدء بالكود ، كارثه !! وحتى ولو لم تتغير المتطلبات ففي حال استخدم نموذج الشلال في مشروع كبير فهذا يعني تحليله بالكامل ثم تصميمه بالكامل وبرمجته بالكامل وهذا غير منطقى خصوصا في البرامج الكبيره حيث يجب أن تقسم لأجزاء صغيره يتم العمل على كل منها على حده . الصوره التاليه تشبه عمليه تطوير مشروع ضخم باستخدام نموذج الشلال بعمليه أكل فيل من غير تقسيم :) : ناهيك عن الوقت المستغرق في كل مرحله ، حيث لأنها يجب أن تكون كامله وشامله يبدأ الخوف لدي المحللين فيأخذوا وقت أكثر من المفترض أن يكون به ويبدأ في ذكر "يبدوا أن هناك شيء ناقص ، سنعيد تحليل هذه النقطه" ، "يجب أن نراجع التحليل مره أخرى ، حيث اذا حدثت مشكله الأن سوف تبقى على اكتافنا" وهكذا يصاب المحلل ب Analysis Paralysis ، بنفس الأمر عند المصمم والمبرمج والشخص الذي يقوم بالأختبار كل منهم يصاب بهذه العقده خاصه ان كان قد فشل في مشروع سابق :). مع وجود كل هذه العيوب في هذا النموذج الا أنه يقدم تسلسل منطقى في عمليه تطوير (تحليل ثم تصميم ثم برمجه ثم اختبار) وبالتالي يمكن أن يستفاد من هذه التسلسل في منهجيات أخرى أكثر مرونه في الشلال وهذا ما حصل بالفعل . النموذج الحلزوني Spiral كان من أول المحاولات في تطوير الشلال ، حيث يمكن أن نطور المشروع في أكثر من دوره (بمعنى أكثر من نموذح شلال في اَن واحد) .. وبنفس المراحل الموجوده في الشلال .. وبالتالى كان يمكن لفريق التطوير أن يقوموا بأخذ متطلبات غير كامله ويبدؤا بتحليلها وتصميمها وبرمجتها ، وهكذا تنتهي الدوره الأولى .. وتبدأ الدوره الثانيه وهكذا الى أن ينتهي تطوير المشروع بالكامل . النموذج الحلزوني قلل من المشاكل بشكل كبير ، ولكن يمكن أن تظهر نفس المشكله في التي كانت تظهر في الشلال ، حيث في حال أكتشف المبرمج أن هناك خطأ أو نقص في التصميم لا يمكن العوده للخلف ويجب الانتظار حتى البدء في الدوره الثانيه .. النموذج جيد ولكن نريد أن نسمح بالعوده للخلف .. النموذج المتكرر Iterative Methodology كان هو الحل لهذه المشكله ، حيث يمكن في هذا النموذج أن نعود خطوه للوراء ونصلح ذلك الخلل ونكمل السير في هذه الدوره بالتالى أصبحت عمليه التطوير هي عباره عن عده دورات ، كل منها تستطيع التحرك خطوه للأمام أو الخلف على حسب ما تريده .. ولكن ما زالت المشاكل بالظهور فما زلت تقوم بأكل الفيل من مره واحده ،، جيث الدورات السابقه كانت لاصلاح خلل وغالبا ما تكون 4 دورات .. نحن نريد تقسيم المشروع لأكثر من دوره وفي كل مره نقوم بتطوير جزئيه معينه وهذا هو النموذج المتصاعد ، الصوره التاليه تبين تطوير الاصدارات مع تقدم الزمن .. في حال أنك لاحظت أن جميع هذه الطرق (الشلال ، الحلزوني ، المتصاعد ، المتكرر) كل منها توجد فيه خاصيه مفيده في عمليه التطوير ، وبالتالى يمكن أن نجمع جميع هذه الطرق مع بعضها البعض وبالتالى نستفيد من جميع المزايا في كل واحده من الطرق بعد جمع هذه الطرق جميعها ، مازال ينقص شيء مهم جدا ، وهو توضيح مالذي يجب أن نفعله في مرحله التحليل ، ما هي نوعيه الوثائق التي يجب أن تنتج ؟ ما هو شكل الأختبارات التي يجب أن تكون ؟ ما هي المخططات التي يجب أن تستخدم في مرحله التصميم ؟ نعم نحن بحاجه الى لغه موحده للرسومات ومنهجيه معينه في التطوير تسمح لي باتباع خطواتها للوصول للمشروع الناجح ان شاء الله .. من هذه النقطه ظهرت العديد المنهجيات التي توضح كيفيه تطوير المشاريع مثل RUPو Ripple و Agile ، بالاضافه الى العديد من الطرق المستخدمه في وصف ورسم العلاقات والطرق المستخدمه وكانت أشهرها وأفضلها وأصبحت الأن هي المقياس هي Unified Modeling Language . RUP وUML كانت نتيجه مجهودات الأصدقاء الثلاثه Grady Booch و Ivar Jacobson و James Rumbaugh حيث كان لكل منهم لغه نمذجه خاصه فيه اضافه الى منهجيه معينه للتطوير ، فاجتعموا على تطوير لغه نمذجه موحوده ومن هنا كانت بدايه لUML ، وبعدها أصحبت معيار رسمي وسجلت لدى OMG .. أما RUP فتعتبر من أشهر المنهجيات للتطوير ومن أصعبها أيضا على المبتدئين .. Agile methodology هي مجموعه من المنهجيات الجيده و التي ترحب بتغييرات المتطلبات في أي لحظه في دوره حياه المشروع ، كما أنها تتسم بالسرعه والخفه .. أحد أشهر هذه المنهجيات هي eXtreme Programmingوهي تعمل بمبدأ test-driven development و pair programming بمعنى ان المبرمج سيقوم قبل كتابه الكود بكتابه أختبار سيجريه على الكود الذي سيكتبه وعند الأنتهاء يختبر الكود فاذا نجح فينتقل للخطوه التاليه (كود الأختبار قبل الكود) .. أما pair programming فتعني أنه يجب أن يكتب الكود من قبل مبرمجين اثنين يكونوا أما الشاشه في نفس اللحظه .. أحدهم يراقب الكود والأخر يستلم عجله القياده (الكيبورد) :) .. فاذا تعب يتم التبديل وهكذا ... مناصروا الXP يروا أن استخدام هذه الطريقه يزيد من كفائه المبرمجين وخاصه في حال جلس مبرمج مبتدأ مع أخر خبير بالمجال.. أما Ripple فهي أيضا أحد المنهجيات والتي هي عباره عن نسخه مبسطه من الRUP ، الصوره التاليه تبين لك المخرجات الناتجه في كل مرحله من مراحل التطوير باستخدام Ripple .. لاحظ أن جميع هذه المنهجيات أصبحت تستخدم UML كلغه موحوده في جميع المشاريع ، وبالتالى على المبرمج أن يكون على بهذه المخططات البسيطه ( هي 13 مخطط فقط) .. ملاحظه اخرى وهى أن هذه المخططات في النهايه هي عباره عن مخططات فقط !! فهي لن ترشدك في عمليه التطوير ولن تريك ما الذي يمكن أن تفعله في هذه المرحله فهي من مسؤوليه المنهجيه .. بالتالى على المبرمج أن يتعلم هذه المنهجيات ويعرف الفرق فيما بينهم وما هي المنهجيه التي ستفيده في مشروعه الحالى .. بالطبع تعلم منهجيه ثقيله كRUP أو حتى ripple بالنسبه للمبتدئين أمر غير جيد حيث سيصعب على المبتدئ التعلم من خلال هذه المنهجيات ، لذلك كانت هناك منهجيات خفيفه lightweight process يمكن أن تستخدم كمثال عملي على التطوير باستخدام منهجيه ما . وهناك الكثير من المنهجيات الخفيفه بل ربما يمكنك أن تنشئ منهجيتك الخاصه في التطوير .. الصوره التاليه توضح خطوات منهجيه خفيفه سوف نستخدمها في الدروس المقبله ان شاء الله . مقدمه في UML : =-=-=-=-=-=-=-= لغه UML تقدم وصف لكيفيه بناء المشروع البرمجي ، وتقدم وصف دقيق لمعماريه مشروعك Architecture ، فكما يقوم البنائيين ببناء المنازل من خلال اتباع مخطط Blueprint قام بعملها المهندس المعماري ، يقوم المبرمج باتباع مخططات UML قام بها المحللين والمصممين للبرنامج. هذه اللغه كما ذكرنا أصبحت المقياس في وصف المخططات عند بناء أي مشروع برمجي . وهي حوالي 13 مخطط . سوف نستعرض أهمهم الأن بشكل مبسط بدون الدخول في التفاصيل وهم : use-case , sequence , collaboration , activity , state , package , component . هذه المخططات يمكنك استخدامها وقت ما تشاء كيفما تشاء ، فلغه UML لم تحدد وتفصل مالذي يجب أن تستخدمه مثلا في مرحله التصميم أو التحليل .. فهذه من مسوؤليه المنهجيه .. لغه UML هي فقط مجموعه من المخططات عليك أن تعرف كيف ومتى يجب أن تستخدمهم .. لذلك موضوع المنهجيه مهم جدا لأنه بدون منهجيه ولو كانت بسيطه فلن تستطيع معرفه ما المخطط المطلوب في مرحله جمع المتطلبات أو مرحله التحليل وهكذا سيكون أستخدام UML وبالا عليك (ماعدا في Toys-example كما سنرى بعد قليل ) . Use-Case Diagram يستخدم هذا المخطط لوصف متطلبات النظام بشكل High-level حيث يوضح المهام الذي يجب أن يقوم بها المستخدم (سواء كان انسان Customer أم نظام فرعي Subsystem) . ومن خلال النظر في المخطط يمكن للمبرمج أن يعرف ماهي المهام التي يجب أن يؤديها النظام . حيث تمثل الدائره المهمه أو الوظيفه التي يجب أن يقوم بها النظام ، ويمثل اللاعب Actor الشخص أو النظام الذي سوف يقوم بهذه المهمه . Class Diagram يوضح هذا المخطط الModel الذي سوف تقوم ببنائه ، بالاضافه الى العلاقه بين كل من هذه الكلاسات .. ويستخدم عاده في مرحلتين التحليل والتصميم ، حيث في المرحله الأولى نقوم بتوضيح اسم الكلاس وعلاقته مع البقيه ، أما في مرحله التصميم فنوضح جميع الخصائص والعمليات التي يقوم بها هذا الكلاس بالتفصيل .. مثال على class diagram في مرحله التحليل : وهنا مثال على class diagram في مرحله التصميم : Sequence Diagram وهو أحد مخططات التفاعل Interaction Diagram يوضح هذا المخطط طريقه عمل Use-Case ما خلال الزمن ، وستشاهد أن هناك خطوط متقطعه تمثل الزمن ، ومستطيل صغير خلال هذه الخطوط يمثل زمن البدء في عمل هذا الكائن ويسمى activation . Collaboration Diagram أيضا هو أحد مخططات التفاعل Interaction Diagram وهو يشبه مخطط التتابع ولكنه لا يوضح التسلسل الزمني للأحداث ، المثال التالى لمخطط تفاعل لاسترجاع كلمه مرور . Activity Diagram يوضح هذا المخطط سلوك النظام بشكل عام أو أحد مهمات النظام Use-Case وكيف تنتقل من نشاط لأخر . وهو يشبه الflow chart . وغيرها من المخططات والتي يستخدم كل منهم لأمر معين .. يمكنك البحث والقرائه في كتب UML للمزيد عنها . سوف نستعرض الأن موضوع مهم وهو العلاقات بين الكائنات ونأخذ مثالين على ذلك .. Modeling Class Relationship من أهم المخططات في UML هي مخططات الكلاس ، حيث ستكون الأساس في عمليه البرمجه ، وهناك الكثير من البرامج تستطيع توليد الكود من خلال مخططات الكلاس ، وأيضا هناك برامج تقوم بالبعكس فهي تخرج المخطط من الكود ، نقوم بالتفصيل الأن في هذا المخطط المهم . مخطط الكلاس في أبسط حالته يكون بالشكل التالى : حيث يحتوي على المتغيرات التي توجد في الكلاس ، بالاضافه الى الدوال التي تعمل على ذلك الكائن ، ويمكن أن تستخدم note للاشاره الى المخطط الذي تريده وللشرح بشكل أوضح .. وكما هو الحال في الكلاسات العاديه فيجب تحديد الرؤيه Visibility لأي متغير أو داله في الكلاس وذلك باستخدام الاشارات (-و+،#) .. الصوره التاليه توضح ذلك : نقوم بالتطبيق مثلا على حساب بنكي يحتوي على رصيد ودوال للعمليات عليه ، وبالتالى يكون شكل المخطط كالتالي : بعض الأحيان قد تحتاج لأن تقوم بتوضيح مصطلح جديد غير موجود في مخطط الكلاس ، وهو يسمى ب Steretype ويكون بالشكل << >> وتكتب بداخل القوسين المصطلح الجديد ، مثلا abstract , accessors , interface وغيرها . يكفي هكذا ولنرى أنواع العلاقات بين الكلاسات بشكل مبسط ونأخذ مثالين عمليين على نوعين من العلاقات .. بشكل عام العلاقات بين الكلاسات هي اعتماديه Dependency ، وارتباط association ، ووراثه Generalization . الاعتماديه تشير الى أن الكائن من كلاس يعتمد في عمله على كائن أخر ، مثلا لدينا كائن X يستقبل كائن أخر Y كمعامل في أحد الدوال ، وفي هذه الداله نقوم باستدعاء داله في Y من خلال الكائن Y . هنا أصبح الكلاس X يعتمد في عمله على الكائن Y ، ففي حال تغيرت الداله في الكائن Y (سواء اسمها أو معاملاتها) يجب اجراء التعديل في الكائن X . وبشكل عام يفضل تقليل الاعتماديه الى أقل ما يمكن في البرنامج . وتوصف الاعتماديه من خلال سهم متقطع ، بهذا الشكل : النوع الأخر من العلاقات وهو ال Association وهو يوضح علاقه احتواء كائن لكائن أخر (Composition , Aggregation) ، أو يوضح الدور الذي يمكن يلعبه الكائن مع الأخر Plain Association . ويمكن توضيح العلاقه من خلال سهم عادي ، ومن ثم نقوم بكتابه اسم العلاقه ، المثال التالي يوضح أن الشخص يستطيع أن يقترض من البنك .. ويمكن أيضا أن توضح الدور الذي يلعبه كل كائن في العلاقه ، المثال التالي يوضح أن borrower هو الذي يلعب دور الشخص وأن Lender هو الذي يلعب دور البنك : يمكن أيضا توضيح عدد الكائنات التي تلعب الدور المعين وذلك من خلال الMultiplicity ، الشكل التالي يوضح أن البنك يتعامل مع شخص واحد أو أكثر ، بينما الشخص يستطيع التعامل مع 0 أو أكثر من بالبنوك .. كما ذكرنا يمكن أن تصف هذه العلاقه عما اذا كان الكائن يحتوي على كائن أخر Has-A ، وهناك نوعين منهم وهم الComposition و Aggregation وسبق أن ذكرناهم هنا في هذا الموضوع. أخيرا النوع الثالث من العلاقات وهو الوراثه generalization وبالتأكيد الجميع يعرف هذا المفهوم ، ويكون شكل المخطط كالتالي : نبدأ الأن بأخذ مثال على علاقه الأحتواء Has-a (مثال Bank Account) وسوف نستخدم سي++ للتوضيح هنا .. ومن ثم نأخذ مثال أخر لتوضيح علاقه الIs-a (مثال Company Employee) وسوف نستخدم جافا لكي يتابعوا معنا مبرمجي جافا . سنقوم بحل هذه المشكلتين بشكل مبسط ولن نتطرق لموضوع المنهجيه أو حتى رسم المخططات بالكامل .. هذا الحديث في المقاله القادمه ان شاء الله .. مثال على برنامج Bank Account =--=-=-=-=-=-=-=-=-=-=-=-= نأخذ مثال على الأن على برنامج بسيط لبنك يقوم بانشاء حساب للزبائن ويستطيع الزبون بايداع أو سحب النقود من حسابه كما يمكنه الاطلاع على حسابه ومعرفه كم يوجد به من نقود .. أيضا يستطيع عامل البنك من معرفه مجموع النقود في جميع الحسابات .. يمكنك أن تجلب ورقه وقلم وتقوم برسم المخططات بشكل يدوي أو استخدام برنامج لهذا الأمر ، وحاليا بما أنك ترسم هذه المخططات لأول مره يفضل ورقه وقلم .. وتبدأ عمليه عصر الدماغ brainstorming . بعد تحديدك لمشكله البرنامج أو الMission Statement ، يجب أن تبدأ في تحديد المهمات الأساسيه في البرنامج من خلال المشكله أعلاه ..وبالطبع هذه العمليه ربما تصعب عليك من البدايه ولكن مع حل العديد من المشاكل تزداد خبرتك وتستطيع تحديد المهمات بكل سهوله .. حاليا المهمات ( الUse-case ) في البرنامج المطلوب وهي : * انشاء حساب جديد * القيام بعمليه ايداع في الحساب * القيام بعمليه سحب من الحساب * معرفه الرصيد الحالى للزبون * معرفه مجموع النقود في جميع الحسابات . واللاعب الذي يلعب الدور (يقوم بالمهمه) في كل من هذه الUse-Case هو العامل في البنك . حيث هو الذي يقوم بانشاء الحساب وهو الذي يقوم باخراج الرصيد الحالى للزبون وهكذا لبقيه العمليات . يمكنك الأن أن تقوم برسم مخططات الUase-Case فهي توضح لك متطلبات البرنامج والمهام التي يجب القيام بها بشكل رسومي سهل ، وأيضا توضح من الذي يفترض أن يقوم بذلك الدور . الشكل التالي يوضح use-case diagram بعدها نقوم بعمل توضيح Realization لكل من هذه الUase-Case وذلك باستخدام مخططات الActivity Diagram و Seqeunce Diagram و Collaboration Diagram .(كل منهجيه تستخدم نوع معين من المخططات أثناء مرحله التحليل والتصميم) حاليا نحن نعمل بدون منهجيه معينه لغرض توضيح كيفيه استخدام هذه المخططات بشكل عام . نقوم الأن باستخدام مخطط Activity لتوضيح أي من الUse-Case التي استخرجناها سابقا .. ومخطط النشاط هذا يوضح لي النشاطات التي ستجرى على الuse-case المحدد .. وهنا سنجد أننا لكي نقوم بعمل حساب جديد يجب أن نقوم بفتح الحساب (ويكون موافي للشروط) ومن ثم نقوم بتسجيل هذا الحساب في البنك . يمكنك الأن بشكل مبدئي ان تقوم برسم الكلاسات التي سوف تستخدمها في برنامجك ، حاليا من خلال المهام يتضح لدينا أن هناك Bank وهناك Account و هناك Employee (فقط عليك برسمهم من غير الدخول في التفاصيل ، سنقوم برسمهم في الخطوه التاليه ) . بعدها لكي يتم توضيح خطوات اي use-case بترتيبها الزمني سنستخدم ال Seqeunce Diagram بالشكل التالي : وهكذا سنقوم بتطبيق المخططات Activity و sequence و collaboration على جميع الuse-case لكي نوضح طريقه عمل كل منهم .. الأن من خلال هذه المخططات يتضح أن لدينا الكلاسات التاليه Account و Bank و Employer .. ولكن الأخير Employer لن نحتاجه في البرنامج حيث هو ليس من ضمن المشكله التي نريد حلها ، هو فقط سيكون المسبب أو المستخدم لكل من المهمات في النظام . وبالتالى ينتج لدينا الكلاسين التالين Account,Bank . (عمليه استخلاص الكلاسات من أصعب المهمات على الاطلاق والخبره هي الفيصل دائما في مشاكل استخلاص الكلاسات) . ومن خلال المشكله نفسها ، يمكن أن نعرف أن الAccount يحتوي على رصيد ورقم للعميل بالاضافه الى اسمه .. اما الbank فهو الذي سيجري جميع هذه المهمات على الaccount . هكذا نكون قد عرفنا الخصائص والعمليات على هذين الكلاسين .. اما العلاقه التي ستربط الكلاسين ببعضهم هي Composition أي أن الBank سوف يحتوي على صفر أو أكثر من الaccounts . الصوره التاليه توضح مخطط الكلاس الذي يوضح العلاقه بالاضافه لمحتويات كل من الكلاسين .. الى هنا قمنا بتحليل المشكله وتصميم الكلاسات ، بقي أن نبدأ بعمليه البرمجه . وسوف نقوم بكتابه النظام بسي++ بشكل مبسط .. لاحظ الداله الرئيسيه main حيث قمنا باختبار كل واحد من هذه الuse-case وعدى الأختبار بنجاح بالتالي يمكنك الأن بناء التطبيق النهائي سواء باستخدام واجهه GUI أو قائمه من الخيارات في console . // Example of Bank Account Application #include <iostream> #include <vector> using namespace std; class Account; // decleration for class typedef vector<Account> :: iterator ITR; class Account { public : Account (int id, string str, double amount) : idNumber(id),name(str),balance(amount) { } // Accessores function (setter & getter) void setName (const string str) { name = str; } string getName () const { return name; } int getIdNumber () const { return idNumber; } double getBalance () const { return balance; } void addBalance (double amount ) { balance += amount; } void subBalance (double amount ) { if ( balance >= amount) balance -= amount; } friend ostream& operator << (ostream& ostr , const Account& rhs); private : string name; int idNumber; double balance; }; ostream& operator << (ostream& ostr , const Account& rhs) { ostr << "Account Number : " << rhs.getIdNumber() << endl << "Account Name : " << rhs.getName() << endl << "Account Balance: " << rhs.getBalance() << endl; return ostr; } class Bank { public : Bank(string str) : name(str) { } void openNewAccount (int idNumber , string name, double balance); void creditAccount (int idNumber , double balance ); void depositAccount (int idNumber , double balance ); double getBalance (int idNumber ); double getTotalBalance (); string getName () const { return name; } friend ostream& operator << (ostream& ostr, const Bank& bank); private : // prevent pass by value & assignment operator Bank (const Bank& lhs); Bank operator = (const Bank& lhs); private : vector<Account> accounts; ITR itr; string name; }; void Bank :: openNewAccount (int idNumber , string name , double balance ) { Account tmp(idNumber,name,balance); accounts.push_back(tmp); } void Bank :: creditAccount (int idNumber ,double balance ) { for ( itr = accounts.begin(); itr != accounts.end(); ++itr) { if ( itr->getIdNumber() == idNumber ) { itr->addBalance(balance); break; } } } void Bank :: depositAccount (int idNumber ,double balance ) { for ( itr = accounts.begin(); itr != accounts.end(); ++itr) { if ( itr->getIdNumber() == idNumber ) { itr->subBalance(balance); break; } } } double Bank :: getBalance (int idNumber ) { for ( itr = accounts.begin(); itr != accounts.end(); ++itr) { if ( itr->getIdNumber() == idNumber ) { return itr->getBalance(); } } } ostream& operator << (ostream& ostr , const Bank& bank ) { ostr << "Welcome To : " << bank.getName() << endl; ostr << "-----------------------------" << endl << endl; for (vector<Account> :: const_iterator itr = bank.accounts.begin(); itr != bank.accounts.end(); ++itr) { ostr << *itr << endl << endl; } return ostr; } double Bank :: getTotalBalance () { double sum = 0; for (itr = accounts.begin(); itr != accounts.end(); ++itr) { sum += itr->getBalance(); } return sum; } int main (int argc, char* argv[]) { Bank bank("ArabTeam2000"); // open new account use case test bank.openNewAccount(1,"Wajdy essam",2000); bank.openNewAccount(32,"Ali Ahmed",425); bank.openNewAccount(42,"Omer Khalid",6000); // credit account use case test bank.creditAccount(1,100); // deposit account uses case test bank.depositAccount(42,1000); // display all accounts use case test cout << bank << endl; // get balance use case test cout << "Balance for customer ID (42) : " << bank.getBalance(42) << endl; // get All balance use case test cout << "Total Bank balance : " << bank.getTotalBalance() << endl; return (0); } مثال على برنامج Company Employer =-=-=-=-=-=-=-=-=-==-=-=-=-=-= سنستعرض الأن مثال على النوع الأخر من العلاقات وهو الوراثه Specialization ولن نهتم الأن سوى بمخطط الكلاسات فقط .. حيث أن المشكله قريبه من المشكله السابقه .. ليكن لدينا شركه برمجيه تحتوي على العديد من المبرمجين .. المطلوب كتابه تطبيق يخرج لي معلومات حول معلومات المبرمج (المعرف ، الراتب ، لغه البرمجه التي يستخدمها) . مع العلم أنه يمكن للمبرمج أن يغير لغته البرمجيه . من خلال المشكله السابقه قد نستنتج نوع العلاقه وهي أن الشركه تحتوي على العديد من المبرمجين ، أي العلاقه هنا احتواء has-a وتكون في مثالنا هنا Aggregation . الشكل التالي يوضح مخطط الكلاس لهذه المشكله : [img ]http://www.sudancs.com/wajdy/OOAD8.PNG[/img ] الأن سوف نبدأ مباشره بعمليه البرمجه ، ويمكن أن يكون شكل الكلاس Programmer بهذا الشكل : public class Programmer { private String name; private double salary; private int idNumber; private String language public Programmer (int id , String name , double salary,Sting lang) { this.name = name; this.idNumber = id; this.salary = salary; this.language = lang; } public int getId () { return idNumber; } public String getName () { return name; } public double getSalary () { return salary; } public String getLanguage () { return language; } public void setLanguage (String lang) { language = lang } public String toString() { return idNumber + " : " + name + " , Language : " + language + " take " + salary + " $"; } } بعد انتهائك من كتابه الكلاس ، قد سمعت بأن هناك أحتمال دخول موظفين أخرين لهذه الشركه مثلا مدير أو موظف عادي ، لذلك في مثل هذه الحالات يمكن أن تلجأ لأسلوب الوراثه من كلاس .. وبما أن المبرمج أو المدير هو في النهايه موظف في الشركه ، فسوف نقوم بعمل كلاس Empolyer ونرث منه ما نريد وقت الحاجه ونضيف الأمور التي تميز المبرمج عن الموظف العادي (وهي في حالتنا هنا لغه البرمجه المستخدمه) . وبالتالى يكون شكل المخطط هو : [img ]http://www.sudancs.com/wajdy/OOAD9.PNG[/img ] نقوم الأن باجراء التعديلات التاليه للكلاس السابق : public class Employee { private String name; private double salary; private int idNumber; public Employee (int id , String name , double salary) { this.name = name; this.idNumber = id; this.salary = salary; } public int getId () { return idNumber; } public String getName () { return name; } public double getSalary () { return salary; } public String toString() { return idNumber + " : " + name + " take " + salary + " $"; } } public class Programmer extends Employee { private String language; public Programmer (int id , String name ,double salary , String language) { super(id,name,salary); this.language = language; } public String getLanguage () { return language; } public String toString () { return super.toString() + " ,language : " + language; } } الى الأن لم نكمل في البرنامج للأخير وتبقى الكلاس Software House .. وقبل أن نبدأ به حصل تغيير في المتطلبات مره أخرى ، وهذه المره ذكر العميل أن مبرمج جافا يمنح 20% زياده لراتبه .. أيضا أي مجموعه من المبرمجين يجب أن يداروا من قبل مدير للمشروع Project Leader ، هذا المدير لديه راتب شهري اضافه الى أنه يحصل على 10% زياده على كل مبرمج في فريقه . التغيير الأول بسيط ، حيث كل ما علينا اعاده تعريف داله الراتب في الكلاس Programmer ونضيف التغيير الجديد ،، أما بالنسبه للمدير فهذا يتطلب وجود كلاس جديد في النظام .. وبما أن أي مدير يدير مجموعه من المبرمجين فإن يمكن أن تكون العلاقه أحتواء أيضا has-a . بالاضافه الى أن الشركه أصبحت تحتوي أيضا على مجموعه من المديرين (بالاضافه الى المبرمجين ) . الصوره التاليه توضح مخطط الكلاس : بما أن الكلاس Software House يحتوي على Container من الكائنات تمثل المبرمجين وأخرى تمثل المديرين . فاننا اذا أردنا أن نطبع جميع محتويات هذه الشركه قد نحتاج لأن نمر على جميع عناصر الContainer الأول ونقوم بطباعتها وهكذا بالنسبه للContainer الثاني . بالرغم من أن التصميم السابق صحيح لكنه يحتوي على تكرار في الكود ، ويمكن أن نحسنه قليلا عن طريق استخدام مفهوم تعدد الأشكال Polymorphism ، حيث سنجعل المدير والمبرمج من نوع empolyee وفي داله الطباعه سنقوم بطباعه الكائن الحالى الموجود في الcontainer والذي سيطبع الكائن المناسب . نقوم بتعديل التصميم قليلا ، ويخرج لدينا المخطط التالي : [img ]http://www.sudancs.com/wajdy/OOAD11.PNG[/img ] نقوم الأن بالبدء في البرمجه : // Employee.java public abstract class Employee { private String name; private double salary; private int idNumber; public Employee (int id , String name , double salary) { this.name = name; this.idNumber = id; this.salary = salary; } public int getId () { return idNumber; } public String getName () { return name; } public double getSalary () { return salary; } public String toString() { return idNumber + " : " + name + " take " + salary + " $"; } } public class Programmer { private String name; private double salary; private int idNumber; private String language public Employee (int id , String name , double salary,Sting lang) { this.name = name; this.idNumber = id; this.salary = salary; this.language = lang; } public int getId () { return idNumber; } public String getName () { return name; } public double getSalary () { return salary; } public String getLanguage () { return language; } public void setLanguage (String lang) { language = lang } public String toString() { return idNumber + " : " + name + " , Language : " + language + " take " + salary + " $"; } } // Programmer.java public class Programmer extends Employee { private String language; public Programmer (int id , String name ,double salary , String language) { super(id,name,salary); this.language = language; } public String getLanguage () { return language; } public String toString () { return super.toString() + " ,language : " + language; } public double getSalary () { double value = super.getSalary(); if ( language.equals("java") ) value *= 0.2; return value; } } // ProjectLeader.java import java.util.Iterator; import java.util.ArrayList; public class ProjectLeader extends Programmer { private ArrayList<Employee> team; public ProjectLeader (int id ,String name , double salary,String language) { super(id,name,salary,language); team = new ArrayList<Employee>(); } public void addMember (Employee p) { team.add(p); } public String toString () { String str = super.toString(); str += "\nMember Information : \n"; Iterator itr = team.iterator(); while ( itr.hasNext() ) { Employee tmp = (Employee) itr.next(); str += tmp.toString() + "\n"; } return str; } public double getSalary () { double value = super.getSalary(); int size = team.size(); double tmp = value * size * 0.1; return value + tmp; } } // SoftwareHouse.java import java.util.ArrayList; import java.util.Iterator; public class SoftwareHouse { private ArrayList<Employee> staff; private String name; public SoftwareHouse (String name) { this.name = name; staff = new ArrayList<Employee>(); } public void addMember (Employee p) { staff.add(p); } public String toString () { String str = "Staff : " + name + "\n"; Iterator itr = staff.iterator(); while ( itr.hasNext() ){ Employee tmp = (Employee) itr.next(); str += tmp.toString() + "\n"; } return str; } public double getTotalSalary () { double sum = 0; Iterator itr = staff.iterator(); while ( itr.hasNext() ) { Employee tmp = (Employee) itr.next(); sum += tmp.getSalary(); } return sum; } } ملف الأختبار : public class Main { public static void main (String args[]) { SoftwareHouse app = new SoftwareHouse("SudanCS"); Programmer p1 = new Programmer(1,"Wajdy",4000,"java"); Programmer p2 = new Programmer(2,"Geek",5000,"Assembly"); Programmer p3 = new Programmer(3,"Ahmed",3200,"C++"); Programmer p4 = new Programmer(4,"romansy",3000,"Php"); ProjectLeader pld = new ProjectLeader(10,"Mohammed",9000,"C++"); ProjectLeader pld2 = new ProjectLeader(20,"Ossma",5000,"pascal"); pld.addMember(p1); pld.addMember(p4); pld2.addMember(p3); app.addMember(p1); app.addMember(p2); app.addMember(p3); app.addMember(p4); app.addMember(pld); app.addMember(pld2); System.out.println(app); System.out.println("total salary : " + app.getTotalSalary()); } } الأمثله أعلاه مثالين صغيرين جدا ، وبالتالى من خلال الخبره يمكن لأي مبرمج البدء والشروع في هكذا مشروع من غير الحاجه للمخططات .. المخططات تستخدم في حال كنت تريد فهم المشكله لأنها متداخله وكبيره ، كنت تريد أن يفهم المبرمجين والمستخدمين طريقتك في الحل ، كنت تصمم البرنامج لكي يبرمجه غيرك ، كنت تعمل في مشروع كبير وبالتالى يجب عليك تطوير البرنامج بشكل متصاعد increment-iterative فبالتأكيد سوف تحتاج الى مخططات بعد الأنتهاء من دوره تطوير واحده one iteration. المره القادمه باذنه تعالى نتناول مشكله معينه ونقوم بحلها ونستخدم المنهجيه الخفيفه التي سبق أن عرضناها سابقا ، بالاضافه الى عرض مفاهيم SOLIDفي التطوير .. نقطه النهايه : =-=-=-=-=-=-= المبرمج المحترف لا يقتصر عمله في الCoding ، المبرمج المحترف يجيد موضوع الDesign بشكل كبير ، المبرمج المحترف يجيد تطبيق الاختبارات على الوحدات التي يكتبها Testing ، المبرمج المحترف يجيد تتبع البرامج وايجاد الأخطاء بها Debugging ، المبرمج المحترف يعرف مستوى أداء برنامجه Performance Analysis ويستطيع ايجاد نقطه الخلل والبطء فيه Performance Bottleneck كما يستطيع تحسين الكود Optimization بالاضافه الى كتابه برامج ذات كفائه عاليه Efficient code . عالم البرمجه الموجهه كبير للغايه ، عليك أن تستفيد وتتعلم من أفكار غيرك ، عليك أن تعرف أهم المشاكل التي تحصل في مرحله التصميم وكيف يمكن تجنبها Design Pattern ، عليك أن لا تخترع العجله من جديد وأن تقوم باعاده استخدام الكود وخاصه الCollections التي تقدمها لغه البرمجه -ان كانت تقدم لك ذلك- . موضوع التحليل والتصميم الكائني موضوع متقدم لذلك حاول أن تتعلم بالتدريج ، تعلم منهجيه معينه وكيف يمكن أن تستخدم UML بها ، ثم انتقل لغيرها بعد مده ، وبالتالى تزداد خبرتك في حل المشاكل وتطوير الحلول الكائنيه التوجه . مصادر الموضوع : =-=-=-=-=-=-= Object-Oriented Design with UML and Java Object-Oriented Analysis and Design - Understanding System Development with UML 2.0 Sams Teach Yourself Object Oriented Programming in 21 Days Professional C++ اي تصحيح ، اضافه ، تعليق ، سؤال -بسيط فقط :)- يرحب به .. والسلام عليكم ورحمه الله وبركاته ، لا يمكن أن أضيف جميع الصوره بالموضوع ؟
  6. طلب شرح برنامج مترجم netbeans

    اعتقد هناك مترجمات موجودة في القسم ابحث عنها ايضاً قم بتعلم البرمجة بجافا مع Swing لعمل الشاشات ، ال Netbeans ليس الا IDE وليس مكتبة أو لغه..   بالتوفيق  
  7. برنامج جافا تغيير أسماء الملفات

    نعم يمكن 
  8. Start Network Programming In Java

    السلام عليكم ورحمه الله وبركاته ،، أحد أهم ميزات لغه الجافا هي سهوله التعامل مع البرامج التي تتعامل في الشبكه ، لذلك أصبح يطلق عليها The Language of Internet ، فشركه sun وفرت لنا طاقم جيد من الكلاسات يمكننا بكل سهوله عمل أي برنامج يتعامل في الشبكه وبدون الدخول في تفاصيل كيفيه الأرسال أو الأستقبال أو أي أمر أخر، مثلا برامج المحادثه Chatting ، برامج مشاركه الملفات Sharaing File ، العاب عبر الشبكه ، وبشكل عام يمكن بناء 90% من البرامج الشبكيه الموجوده بلغات أخرى . (هناك برامج لا تستطيع كتابتها بلغه الجافا كـ Ping وبرامج الأختبارات كهذه ) . في هذه الجلسه الأولى Session One ، سوف نتناول بشكل عام : - التعامل مع العنواين IP Address - التعامل مع URI و URL وكيفيه عرض محتويات Web Page . - برمجه Client\Server باستخدام TCP Socket . - برمجه Client\Server باستخدام UDP Socket. - اضافه الى بعض البرامج التطبيقيه كـ : Day-Time Server , Port Scanner , Simple Chat Program ونبدأ على بركه الله ،،، InetAddress Class : ============== جميع الأجهزه المتصله بالأنترنت لها عنوان Address ، هذا العنوان IP يستخدم للوصول الى الجهاز المحدد ، ونظرا لصعوبه حفظ هذه العنواين ، تم تصميم نظام Domain Name System وتم أعطاء أسم Host Name لكل موقع ، الأن عندما أريد الوصول الى الموقع الفلاني سأستخدم الأسم Host Name ومن ثم سيتصل البرنامج الذي أستخدمه (مثلا المتصفح browser ) بالنظام الخاص بهذه الأسماء Local Domain Name Server وسيقوم بارجاع العنوان للأسم الذي أستقبله ، في حال لم يجد Local DNS العنوان المحدد للأسم ، سوف يتصل بDNS أخر ، وهكذا ... (يمكنك قرائه المزيد عن DNS في أي كتاب متعلق بالشبكات) . والكلاس المسؤول عن هذه العمليه في جافا هو في الباكيج java.net وهو الكلاس InetAddress ووظيفته كما يتضح من الأسم هو التعامل مع العنوانين سواء أسم Host Name ، أو عنوان Address ، وأغلب الكلاسات الموجوده في java.net تتعامل أيضا مع هذا الكلاس . وأهم الدوال الموجوده في هذا الكلاس / public static InetAddress getByName(String hostName ); هذه الداله تأخذ اسم الموقع أو الجهاز ، ومن ثم ترجع عنوانه IP Address ، وذلك باستخدام نظام Domain Name System أختصارا DNS ، أو تأخذ العنوان وترجع الأسم . public static InetAddress getLocalHost (); هذه الداله ترجع العنوان للجهازالحالي ، وسوف يرجع 127.0.0.1 في حال لم تكن متصل بالأنترنت . public static InetAddress [] getAllByName ( String hostName); هذه الداله نفس الداله ، ولكن اذا كان للموقع أكثر من عنوان ، فإن هذه الداله ترجع جميع العناوين للـ HostName (في شكل مصفوفه من InetAddress ) . ملاحظات هامه : الكلاس InetAddress يسمى Factory Class وذلك لعدم أحتوائه على داله بناء Constructor . جميع الدوال السابقه دوال static ، ذلك سوف يتم استدعائها من خلال اسم الكلاس (.) اسم الداله . عند التعامل مع دوال InetAddress ، فإنها تولد Exception من نوع Checked ، لذلك يجب التعامل مع هذا الإستثناء وذلك من خلال أما عمل try\catch ، أو thrwos للException . الـ Exception الذي يولده هذا الكلاس هو : UnknownHostException ، وهو يحصل عندما لا يستطيع DNS إيجاد عنوان HostName وهذا يحدث اذا كان الـ HostName خاطئ ، أو مثلا الجهاز غير متصل بالأنترنت . جميع الدوال السابقه عند أستدعائها فإنها تقوم بالأتصال Make Connection With DNS . هناك دوال أخرى يوفرها InetAddress ، لكن هذه الدوال لا تقوم بعمل أتصال ، فقط تجلب بعض المعلومات الموجوده في الكائن من نوع InetAddress : public String getHostName( ) هذه الداله ترجع فقط أسم الموقع Host Name الموجود في الكائن InetAddress . public byte[] getAddress( ) هذه الداله ترجع عنوان الموقع على شكل مصفوفه من البايت ، تستخدم غالبا لأختبار هل العنوان من نوع IPv4 أو IPv6 . public String getHostAddress( ) تقوم بارجاع عنوان الموقع كنص String . هناك أيضا دوال أخرى لمعرفه خصائص IP معين ، مثلا هل هو عنوان للنشر ، أو عنوان أختبار Loopback ، وغيرها من الخصائص ، هذه الدوال لن نحتاجها هنا في دروسنا السريعه وهي : public boolean isAnyLocalAddress( ) public boolean isLoopbackAddress( ) public boolean isLinkLocalAddress( ) public boolean isSiteLocalAddress( ) public boolean isMulticastAddress( ) public boolean isMCGlobal( ) public boolean isMCNodeLocal( ) public boolean isMCLinkLocal( ) public boolean isMCSiteLocal( ) public boolean isMCOrgLocal() ويمكنك قراه الـ Documnation للمزيد حول هذه الدوال . بالنسبه لنوع للعنواين فهي غالبا ما تكون 4 بايت (IPv4) مثل : 152.2.21.2 ، أما النوع الجديد للعنواين فهي 16 بايت ( IPv6)ويكتب بنظام Hex مثل : 2001:0250:02FF:0210:0250:8BFF:FEDE:67C8 . وهناك كلاسين خاصين بهذا الأمر ، لكن لم أجد أي فائده منهم ، حيث أنها ورثت Extends الكلاس InetAddress ، اضافه الى أن جميع برامجنا الشبكيه سوف تعمل في طبقه التطبيقات Application Layer وفي هذه الطبقه لا نحتاج الى معرفه نوع العنوان . public final class Inet4Address extends InetAddress public final class Inet6Address extends InetAddress لكن في حاله أردنا أن نعرف ما هو نوع العنوان ، يمكن أن نستخدم الداله : public byte[] getAddress( ) ومن خلال طول المصفوفه ، سوف نعرف نوع العنوان . بعد قليل سنشاهد مثال لذلك . أخيرا هناك الدوال التي يرثها الكلاس InetAddress من الكلاس Object ، حيث: public class InetAddress extends Object implements Serializable الدوال هي (طبعا تم عمل Override لها) : public boolean equals(Object o) وهي للاختبار التساوي، وهنا يتساوى InetAddress مع أخر في حاله كان لهما نفس العنوان Address . سنرى مثال بعد قليل على هذه الداله . public int hashCode( ) لن تحتاج لهذه الداله لأنها تستخدم في HashTable . public String toString( ) الداله toString() يتم استدعائها في حاله قمنا بطباعه العنوان فقط بدون تحديد أي داله أخرى ، وهنا الكلاس InetAddress قام بعمل Override للداله toString() ، وأصحبت تطبع getHostName() "\" getHostAddress() ، أي بالشكل : hostname/dotted quad address أمثله تطبيقيه على الـ InetAddress : مثال ، لمعرفه العنوان الحالي للجهاز LocalHost : import java.net.InetAddress; import java.net.UnknownHostException; public class Demo { public static void main (String args[]) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println( "\n\nHostName/Address : " + address ); System.out.println( "HostName/Address : " + address.toString() ); System.out.println( "Host Name : " + address.getHostName() ); System.out.println( "Address : " + address.getHostAddress() ); } catch (UnknownHostException e) { System.out.println("Cannot Find Local Host !"); System.exit(1); } } } المخرج ، وقد يختلف بالطبع اذا كنت متصل بالانترنت : HostName/Address : romansy-9f0da85/127.0.0.1 HostName/Address : romansy-9f0da85/127.0.0.1 Host Name : romansy-9f0da85 Address : 127.0.0.1 مثال لاستخراج جميع عنواين موقع ما وليكن google : // print All IP for Site import java.net.InetAddress; import java.net.UnknownHostException; public class Demo { public static void main (String[] args) { try { InetAddress[] addresses = InetAddress.getAllByName("www.google.com"); for (int i = 0; i < addresses.length; i++) System.out.println(addresses[i]); } catch (UnknownHostException e) { System.out.println("Could not find www.google.com"); } } } المخرج : www.google.com/72.14.253.147 www.google.com/72.14.253.99 www.google.com/72.14.253.103 www.google.com/72.14.253.104 مثال لاستخدام الداله getAddress() ، وهنا سوف نختبر نوع العنوان هل هو IPv4 ـ أو IPv6 ، وذلك عن طريق النظر الى طول المصفوفه الناتجه : public static int getVersion(InetAddress ia) { byte[] address = ia.getAddress( ); if (address.length == 4) return 4; else if (address.length == 16) return 6; else return -1; } مثال لمقارنه عنوان مع عنوان : // Compare Two InetAddress import java.net.InetAddress; import java.net.UnknownHostException; public class Demo { public static void main(String args[]) { try { InetAddress ca = InetAddress.getByName("www.google.ca"); InetAddress com = InetAddress.getByName("www.google.com"); if (ca.equals(com)) System.out.println("same"); else System.out.println("not the same"); } catch ( UnknownHostException e) { System.out.println("Cannot Find Host Name !"); } } } النتيجه هنا : not the same تمرين : أكتب برنامج يدخل String من الكيبورد أو يستقبله كمعامل من Command Line ، في حاله كان هذا النص عنوان قم بطباعه الأسم HostName ، وفي حاله كان النص هو HostName قم بطباعه العنوان ، البرنامج مشابه لـ برنامج nslookup هو أحد البرامج في Unix . وفي المرفقات ، مثال بسيط كتبته من فتره ، يقوم بنفس المهمه ، ولكن في شكل GUI . الى هنا نتوقف ، ونكمل المره القادمه في URL ، وباذن الله نكتب متصفح Browser بسيط للغايه ، الى اللقاء . IP_Finder.rar
  9. اريد افكار لعمل application

    لا البرنامج سهل، كل ما عليك هو iterate على الملفات واستخراج جميع الملفات في المجلد المعين ، واثناء ذلك تقوم بتجميع الملفات في مكان ما ، وبعد الانتهاء يمكنك معرفة من المكرر   طبعاً يفضل ان تأخذ ال md5 hash للملفات ونخزنها في set مكونه من مسار الملف والهاش، وبعدها عندما يأتي الملف التالي تشوف هل هو موجود فاذا كان كذلك فهذا يعني انه مكرر واعرضه على الشاشع مع مساره حتى تستطيع حذفه   بالتوفيق
  10. اريد افكار لعمل application

    في أي مجال تريد ؟ وما الغرض ؟   هذه افكار لبرامج : http://informatic-ar.com/small_projects/
  11. [إستفسار] كيفية عمل خطوات في جافا

    الفكرة انك ستقوم بعمل panel لكل Step في هذا ال Wizard وبعد ذلك تضعهم كلهم في CardLayout (والذي هو Layout يعرض لك Panel واحد في اللحظة)   وعندما تضغط next تقوم بعرض ال panel الثاني، وهكذا لnext أو back تستطيع عرض البانل التي ترغب بها   ابحث أكثر عنه وسوف تستطيع عملها بسهوله http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html   بالتوفيق،
  12. السلام عليكم ورحمه الله وبركاته   تم افتتاح منصه انفورماتيك التعليمية وهي موقع متخصص في المقالات البرمجية ومقالات في علوم الحاسب بفروعه ، يمكنكم الاستفاده منها : http://informatic-ar.com/   يوجد بها  حوالي 65 موضوع متنوعة في عده مجالات متعلقة ، و5 كُتاب في الموقع ، ونطمح بالمزيد ، فاذا كانت لديك كتابات قديمة أو وددت المشاركة بمقالات جديدة فيمكنك التواصل معنا،،   المقالات سوف تضمن انتشارها اكثر بسبب وجود قنوات اجتماعية لنشر تلك الروابط بين جمهور من المستفيدين    أحد اهدافنا هو استخراج المقالات الجيدة من المنتديات والتي اختفت بمرور الوقت ، وفي الموقع سوف تضمن وجود المقاله وسهوله الوصول اليها من خلال الموقع أو محركات البحث   بالتوفيق،
  13. ما رأيك في ترجمة توثيق الجافا للعربية ؟

    أفضل أن تكتب في مواضيع في الجافا تفيد المبرمجين من أنك تبدأ في ترجمة ال Documentation ، والسبب في وجه نظري أن القله ينظر للتوثيق وهم الفئة المتوسطة ، فالمبتدئين لا ينظروا لها فهم بحاجه لفهم الأساسيات أكثر والمحترفين ينظروا للSource Code مباشرة (وهي من العادات الجيدة أنك تنزل ال Code في ال IDE الذي تستخدمه وتربطه مع مشروعك،  وتنظر له في حال أردت البحث عن دالة أو كلاس، فسوف تجد داخله التوثيق + كود يفيدك لمعرفة ماذا يحدث بداخله)..   يمكنكم الكتابه بالعربي كمقالات عن الأمور من هنا: http://docs.oracle.com/javase/tutorial/   مثلاً شخص يتحدث عن JNI والأخر عن JMX والثاني عن 2D والخ مع ذكر تطبيقات عملية لهم    هذا رأي والله أعلم،
  14. HashList تخزن عناصر متمائلة ومكررة

    الHash Table بشكل عام تحتاج الدالة hashCode  والدالة equals في الكلاس، انت الان تستخدم الدالة الموجودة في الكلاس Object ولكنها ترجع قيم مختلفة للموظف الأول والرابع لذلك هم مختلفين، يجب ان تعيد تعريفها.   ضع الدالتين التاليتين وهم في ابسط شكل بسبب انك تقارن بال id:   @Overridepublic boolean equals(Object otherObject) {if ( otherObject == this )return true;if ( otherObject == null || !(otherObject instanceof Employee))return false;Employee other = (Employee) otherObject;return other.id == this.id;}@Overridepublic int hashCode() {return  id;}هناك قواعد وشروط لكتابه دالة equals وال hashcode يجب مراعتها،،   نظرة حول الدالة Equals بالتوفيق،
  15. مشكلة ترميز رسائل SMS من خلال جافا

    الكود يحول النص الى Hex String ، فاذا كان لديك نص مكون من 100 بايت  فهذا يعني ان الناتج سوف يكون 200 بايت بعد تحويلها للهكس (لأن اي بايت يرمز ب 2 هكس) .. اي الزياده سوف تكون الضعف.   يمكنك ان تستخدم Base64 وسوف تحصل على نص اقل من الذي يخرجه لك ال hex ، حيث لكل 3 بايت من المدخل سوف تحصل 4 بايت مخرج، فاذا كان النص طوله 100 بايت سوف تحصل على نص بطول 133 بايت بترميز Base64.   طبعاً هذا في حالة كان الوسيط الذي يستلم منك ويرسل الرساله لا يدعم ال Unicode. فيمكنك استخدام ال Encoding السابقه (ك Hex وهي تضاعف الحجم مرتين، أو Base64 وهي تضاعف ولكن النسبه اقل من الهكس).   بالتوفيق،
  16. تحديد انماط محتوى الـ Arrsylist

    المساواة ب equals لم تعمل بسبب أنه تم عمل مساواة بين ال reference (اي هل الكائن هو نفسه) وهذا الوضع الطبيعي للدالة equals عندما لا تعيد تعريفها without override   لا يفضل وضع بيانات مختلفة النوع في collection ، وانما يجب تحديد ال type فيها.. واذا أردت ان تحمل عدة بيانات مختلفة  يمكنك وضعها في كلاس يمثل المفهوم لذلك الشيء.
  17. كيف تُستخدم ال UML بشكل صحيح ؟ https://www.facebook.com/photo.php?fbid=596697003695288&set=a.596624623702526.1073741826.596618987036423&type=1   "كيف تُستخدم ال UML بشكل صحيح ؟ كون أن لغه UML لها مقياس Standard وهناك جهه (ال ISO) تتولى الاهتمام بذلك، الا أن هذا لا يعارض وجود أكثر من استخدام لها أثناء فترة تطوير المشروع، وهذا الاختلاف بين طرق الاستخدام قد يدخلك في صراع أو نقاشات مطوله خصوصاً لو عملت مع شخص يستخدمها بطريقة ما ولا يدري الطرق الاخرى التي يمكن ان تكون لل UML فائده منها. سأتحدث عن طريقتين الآن الأولى وهي توضيح كل العلاقات والكلاسات وبما داخلها بشكل مفصل جداً (سوف نسمية Blueprint) ، أما الثانية وهو توضيح جزء معين من تصميم المشروع Designing فقط بدون حتى الدخول في تفاصيله الدقيقة (سوف نسميه Sketch ) هذه الطرق يمكن ان تستخدمها قبل كتابه المشروع Forward Engineering، أو بعد كتابه المشروع Reverse Engineering، ولكل منها سبب، لنتحدث عن طريقة عمل التفاصيل لكل شيء وهي المفضلة لدى المناهج الأكاديمية Blueprint فمثلاً يقوم الطالب أو المبرمج بعمل المشروع بالكامل ومن ثم في الأخير يقوم بتوليد أو رسم ال UML لهذا المشروع (هنا فائده ال UML أصبحت قليله والسبب أن المشروع انتهي والتوثيق ورسومات ال UML قد تكون اعقد من الكود نفسه) ، لذلك في غالب مشاريع تخرج الطلاب نجد أنهم يتبعوا Reverse Engineering Blueprint. الطريقة الأخرى في ال Blueprint وهي أن تقوم بعمل ال UML قبل المشروع، وهي لها فوائد مثلاً كنت مبرمج محترف ولديك مبرمج مبتدئ تريده أن يعمل فيمكن أن تقوم بعمل Forward Engineering وعمل ما يلزم لهذا المبرمج حتى يستطيع العمل والبرمجة بمفرده. في الغالب القيام بعمل التفاصيل Blueprint يستلزم أدوات لتوليدها سواء كانت ضمن بيئتك البرمجية IDE أو أداة خارجية Third-Party تقوم بها (سواء قبل Forward أو بعد المشروع Reverse). الكتب الأكاديمية تسمى هذه الأدوات CASE Tools وقد سمى هذا المصطلح Martin Fowler (مهندس البرمجيات المعروف) بال Dirty Word وأن كثير من الشركات والمصنعين Vendors أصبحوا لا يستخدمونه ، واتفق معه في ذلك  .. الطريقة الثانية للاستخدام UML وهو ما افضله واستخدمه وهو رسم ما يلزم لايصال الفكرة بدون الحاجه للدخول في التفاصيل Sketch. مثلاً كنت تريد ان تحل مشكلة عمل فهرسه للملفات فسوف تقوم بوضع ال High Level Design مع الفريق أو مع نفسك ومن ثم ترى هل سيحل هذا التصميم المشكلة ؟ فاذا كان كذلك والا فتقوموا بالتعديل عليه الا حين الوصول للشيء المناسب (طريقة الاستخدام هذه Forward Sketch تصلح ايضاً في اجتماعات المبرمجين في الفريق )، أو مثلاً لنقل أنك انهيت حل مشكلة ما وتريد توثيق الDesign أو أن هناك مبرمج جديد انضم وتريد شرح الفكرة العامه من هذا الاجزاء من الكود فال Reverse Sketch هنا أيضاً مفيد في تلك الحالة. عندما تقوم بال Sketcher فقد لا تلتزم بأي Standard للرسم ، بمجرد أن تصل فكرتك المطلوبة للفريق وهذا هو الهدف Communication Ideas فهذا يكفى ولو لم تكن مطابق لل UML Standards (الصورة المرفقة توضح Sketch قديم قمت بعمله وهو يوضح فكرة معينة بغض النظر عن الالتزام الحرفي بالمعيار وطريقة الرسم). فأسأل نفسك هل انت Sketcher أم Blueprinter ، ولا تتعصب لطريقة واستخدم كل منها في الوقت المناسب"
  18. نعم يمكن ، انظر هنا: http://stackoverflow.com/a/9762578/230188
  19. إضافة JTable للJTextArea

    لماذا لا تستخدم اي Component يدعم  HTML Rendering وتقوم بعرض البيانات على HTML Table مثلاً:   http://alvinalexander.com/blog/post/jfc-swing/how-create-simple-swing-html-viewer-browser-java
  20. بالاضافة الى الرد السابق ، من المسؤول عن تعبئة الmap ، لأنك تقوم بقرائة ما بها وهي لن تكون فارغه والا لكنت حصلت على NullPointerException بعد جملة else؟   if (AdminPage.getMap().containsKey(transaction.getID())) { currentShirt = AdminPage.getMap().get(transaction.getID()); } else { System.out.println("Error: Invalid part number"); } currentShirt = AdminPage.getMap().get(transaction.getID());
  21. مشاريع طلاب ستانفورد في مادة معالجة الصور: http://www.stanford.edu/class/ee368/Project_12/index.html   متوفرة مع الشرح والكود وأغلبها تستخدم الماتلاب ، انظر لها سوف تفيدك كثيراً,
  22. تفضل الرابط اخي:   http://wajdyessam.com/files/ebooks/Computer_Viruses_strategies_and_detection_techniques.zip  أو:http://www.kutub.info/library/book/4883
  23. تمرير قيمة null

    لازم تعطي id لل city يكون موجود في الجدول اللى مرتبط به هذا الحقل،، حالياً انت تدخل القيمة o.getCity_id() هي صفر تقريباً ولا توجد مدينة بهذا الرقم  ،، لذلك كحل لهذه المشكلة يمكن ان تدخل مدينة في ذلك الجدول بال id صفر ومثلاً اسم يكون no city او empty string (او تدخلها برقم Id ثاني ويكون هو الافتراضي مع اي كائن من work لا يوجد به مدينة),
  24. قواعد البيانات هذه MS-SQL Server & MySQL مخصصه ل Server Side أكثر من أنها لل Client أو تطبيقات سطح المكتب العادية,,   يمكنك عمل Setup يتكون من برنامجك + ال Setup الخاص بالقاعده وباستخدام برنامج ال Build الذي تستخدمه تستطيع وضع Prerequisite وسيعمل setup القاعدة أولاً وعلى المستخدم اكمال شاشه التحميل حتى النهايه,, لكن بالطبع الحجم سوف يكون كبير جداً + المستخدم قد لا يستطيع تنصيب ال RDMBS جيداً,   حل أخر هو بعمل Silent Installation (تحميل بدون اشعار المستخدم) وتقريباً تستطيع تحميل MySQL بهذه الطريقة (يمكنك البحث عنها حيث لم اقم بها من قبل) ولكن تحتاج لكتابه Script لعملية التحميل أو استخدام NSIS وكتابه السكربت بها،   هذه حلول ربما تناسب حالتك،  ولكن لا انصح بها اذا كان تعاملك مع القاعده بشكل عادي، لأن هذه القواعد ليست خفيفة وتقوم بفتح منافذ على الجهاز وتأخذ من الموارد ايضاً، لذلك اذا كان تعاملك مع القاعدة عادي ( لا تستخدم سوى عمليات الاضافه والحذف من القاعدة SQL ، بدون مثلاً Stored Procedure أو Triggers أو اي خصائص متقدمة ) فيمكنك استخدام اي Client Database أخرى مثلاً Derby, SQLite وميزتها أن تكون مع تطبيقك ولا تحتاج لعمل اي Setup أو أي شيء أخر فقط اضافه Jar واحد مع تطبيقك,,   بالتوفيق،
  25. البرنامج المكتوب بجافا وكما نعلم يعمل على أي جهاز أو نظام تشغيل يحتوي على مكتبات التشغيل الأساسيه ومفسر الجافا (JRE - Java Run Time Environment ) . وهذه بالطبع من أفضل ميزات لغه الجافا .. ونظرا لأن البرنامج سوف يعمل على بيئه خاصه فيه MV فالتحكم في نظام التشغيل بلغه جافا أمر غير سهل ويحتاج الى أستخدام طرق أخرى مثل JNI . منذ صدور جافا 1.3 وفرت sun كلاس يسمى Robot الهدف منه كما قالت sun : أي سؤال حول الموضوع .. في المرفق تجد البرنامج (ملف السيرفر والكلاينت) ، مكتوب بـ Netbeans 5 . RemoteDesktop.rar