مقالات عامة

  1. السلام عليكم ورحمة الله وبركاته
    الأهداف:
    لهذه المسابقة هدف واحد وهو اثراء المحتوى العربي في البرمجة بمقالات ونقاشات هادفة متميزه عن غيرها بالطرح و التنوع بعالم البرمجة
    طريقة المشاركة:
    كل ماعليك هو تجهيز مقالة ممتازة وطرحها تحت احد أقسام ساحات النقاش لك الحرية باختيار ماتحب ان تكتب المهم أنه يندرج تحت البرمجة عندما تقوم بالكتابه فانك مباشرة تشترك بالمسابقة يمكنك الاستفادة من طريقة طرح المقالات في صفحة المقالات من تنسيق واسلوب في الطرح 
    طريقة الربح:
     الطرح المميز بعد مراجعته من قبل فريق عالم البرمجة سوف يتم نقله مباشرة لصفحة المقالات برئيسية الموقع عندما يتم نقل الطرح ليصبح مقال برئيسية الموقع فإنك تعتبر فائز وتستحق الجائزة مباشرة
    الجائزة:
    عندما يتم اختيار طرحك ليصبح مقال بصفحة المقالات بعالم البرمجة فإنك ستحصل مباشرة على مبلغ 200 ريال سعودي مقابل المقال
    شهريا سيتم اختيار 10 مقالات للفوز بهذه الجائزة ليفوز الطرح المميز ويثري المحتوى العربي في مجال البرمجة
    القوانين:
    ان يكون النقاش او المقال عن البرمجة وتعليمها ليكون ذو فائدة للجميع يمنع نقل المواضيع او المقالات من مواقع اخرى الا اذا كنت تملك كافة حقوق المقال ولك حق نقله لموقع عالم البرمجة يجب ان يكون الطرح منسق ومرتب ويستخدم ادوات المحرر بعالم البرمجة مثل كتابة الاكواد وغيرها يجب رفع الملفات و الصور على موقع عالم البرمجة واستخدامها بالمقال بدل رفعها على مواقع اخرى يمنع وضع روابط خارجية لموقع بهدف الدعاية بالمقال او بالصور المرفوعة مسموح وضع روابط المكتبات البرمجية و غيرها من موقع المطور بالطرح لك حرية استخدام شعار عالم البرمجة على الصور المرفوعة (بالمرفقات صورة للشعار عالي الدقة لمن يرغب بإستخدامه) عدد المشاركات مفتوح يمكن ان تشارك باكثر من طرح وتفوز باكثر من جائزة الحصول على الجائزة:
    في نهاية كل شهر يمكنك الحصول على الجائزة مباشرة بحوالة بنكية لاي بنك داخل السعودية او لاي حساب PayPal لمشتركينا من خارج السعودية كل ماعليك بعد فوزك بالجائزة مراسلتنا عبر نموذج اتصل بنا بالبيانات التالية
    الاسم الثلاثي رقم الحساب ايبان واسم البنك لمن بداخل السعودية حساب PayPal اذا لم يكن لديك حساب داخل السعودية مدة المسابقة:
    هذه المسابقة فعاله من تاريخ نشر هذه المقاله وباذن الله سوف تكون شهرية مادام لدينا الميزانية للإستمرار وسوف يتم تحديث المقال في حالة انتهت المسابقة
    طرق أخرى للربح:
    عالم البرمجة نصب كل جهدنا لمكافئة المبدعين الذين يساعدون بنشر العلم المفيد يمكنك أيضا الإستفادة والربح من كتاباتك بالموقع اذا كان لديك حساب Adsense شاهد التفاصيل من هنا
    الإقتراحات:
    تستطيع مراسلة الإدارة بجميع ماترغب من إقتراحات وتطويرات عبر نموذج  اتصل بنا
    شعار عالم البرمجة عالي الوضوح
    بخلفية

    بدون خلفية

    مستوى المقال: مبتدئ
  2. السلام عليكم ورحمة الله وبركاته.

    سنشرح في هذه المقالة طريقة الاستفادة من منصة Transifex لترجمة مشاريعك ترجمة "بشرية" دقيقة بعيدا عن استخدام المترجمات الآلية.
     
    نبذة عن موقع  Transifex: هي منصة متكاملة لترجمة المشاريع البرمجية، حيث يطرح المبرمج أو المسؤول عن ترجمة البرنامج ملف الترجمة الخاص بالبرنامج، ويمكنه تعيين فرق أو إدارتها لتسهيل عملية الترجمة إلى مختلف اللغات. 
     
    هل الموقع مجاني ؟ في حال أردت التسجيل في الموقع كمترجم متطوع فتسجيل الحساب مجاني ويمكنك طلب الانضمام إلى الفرق للبدء بالمساعدة بالترجمة، أما في حال أردت نشر مشروعك لطلب المساعدة على الترجمة من المتطوعين في الموقع أو لتسهيل عملية الترجمة على فريق الترجمة لديك باستخدام هذه المنصة فسيكون نشر المشروع مجانيًا في حال كان مشروعك مفتوح المصدر.
     
    من يستخدم هذه المنصة؟ العديد من المواقع والبرامج المعروفة تستخدم  Transifex لترجمة مشاريعها مثل Trello, Soundcloud, VLC وغيرها. 
     
    كيف أنشر مشروعي (المفتوح المصدر) على المنصة؟ بعد تسجيل حساب جديد في الموقع إضغط على القائمة المجاورة لصورة المستخدم، هذه القائمة هي قائمة المنظمات التي اشتركت بها وتساعد في ترجمة مشاريعها، إضغط على Create Organization لإنشاء منظمة جديدة:



     
    ثم املأ النموذج بالمعلومات الصحيحة لمنظمتك أو فريقك، وضع علامة ☑️ على خيار Yes, my content has Open Source license ويجب أن يكون مشروعك في هذه الحالة مفتوح المصدر ومرخصا بإحدى الرخص المتعارف عليها للمشاريع مفتوحة المصدر (مثل GPL, MIT, Apache وغيرها) وسيُطلب منك إدخال رابط المستودع الخاص بمشروعك لاحقا.
     

     
    تم الآن إنشاء المنظمة الخاصة بك، عليك أن تقوم بإنشاء مشروع جديد بالضغط على 
     
    سيظهر لك نموذج إنشاء المشروع، وسنشرح الخيارات واحدة واحدة:
     
    عليك أن تحدد في هذه الخانة نوع المشروع، private للمشاريع الخاصة التي لا تريد أن يطلع عليها إلا فريقك الخاص، public للمشاريع العامة، اختر public واختر My project is a non-commercial Open Source project في حال كان مشروعك مفتوح المصدر وغير ربحي (في حال لم يكن كذلك فلن يكون نشر مشروعك على المنصة مجانيا) ثم عليك تزويد Transifex برابط المستودع الخاص بمشروعك (على GitHub مثلا) حتى يتحققوا من الرخصة الخاصة بالمشروع:
     

     
     
    في هذه الخانة ستحدد نوع المشروع على Transifex من ناحية طريقة الترجمة، الطريقة الأولى هي File-based يجب عليك فيها أن ترفع ملف اللغات إلى الموقع ويقوم المترجمون بتصفح قائمة الكلمات وترجمتها، أما الطريقة الثانية (وهي طريقة جديدة في تاريخ كتابة هذه الكلمات) فهي تعتمد على Javascript حيث يقوم الموقع باستخراج جميع الكلمات من موقعك، ويعرض موقعك داخل نافذة مصغرة بحيث يمكنك الضغط على الكلمة التي تريد وترجمتها.
     

     
    وهذا مثال من موقع عالم البرمجة على طريقة عرض وترجمة الكلمات (لكن بالطبع لا يمكنني القيام بالترجمة فيجب إضافة مكتبة Javascript تزودني بها Transifex حتى تتمكن من تخزين الكلمات لديها مع الترجمات) :
     

     
    الخيار الأخير تحدد منه اللغة الأصلية لمشروعك واللغات التي تريد الترجمة إليها :
     

     
    كل ما بقي عليك فعله الآن هو دعوة المترجمين إلى المشروع وانتظار الترجمات الدقيقة  🙃
    مستوى المقال: مبتدئ
  3. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
     
    الفائزون في شهر September-2017
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  4. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
    اعتدنا في مسابقة عالم البرمجة للنقاش الهادف مكافئة 10 مقالات مميزه ولكن هالشهر ولشدة المنافسه قمنا بترقية ومكافئة 12 مقال من مبدعي عالم البرمجة
     
    الفائزون في شهر August-2017
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  5. بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله وبركاته
     
    مقدمة
    سأتحدث في هذا الموضوع عن دورة حياة المشروع البرمجي ولن يكون موضوع واحد فقط وانما عبارة عن سلسلة مواضيع سأتحدث بها عن SPLC -وتعني Software Project Life Cycle- للمستقلين، وأعني بالمستقلين المبرمجين الذين يعملون بشكل مُستقل وليس مع فريق، والسبب الرئيسي لتحدثي عن هذا الموضوع هو انعدام جودة أغلب المشاريع البرمجية التي تتم بشكل فردي أو يتوقف تطويرها في مرحلةٍ ما بسبب عدم فهم الكثير من الأمور التي تتعلق بالمشروع البرمجي وقد تسبق كتابة الكود ايضاً.
     
    ملاحظة: SPLC هو مصطلح غير علمي والمصطلح المعروف SDLC -وتعني System Development Life Cycle- ولكن في هذه الدروس لن أتحدث عن دورة حياة تطوير المشروع بشكل خاص وانما عن دورة حياة المشروع البرمجي بشكل عام.
     
    جدول المصطلحات الهامة المستخدمة
    تمت الإشارة للمصطلحات الهامة باللون الأخضر
    المصطلح الوصف Ad Hoc Approach الطريقة الخاطئة التي يتبعها المستقلين حالياً. SDLC System Development Life Cycle دورة حياة تطوير البرمجيات. SPLC Software Project Life cycle دورة حياة المشروع البرمجي. وهو مصطلح غير علمي كما ذكرنا. Standard هي عبارة عن معايير ونماذج تحددها شركات كبيرة، وهذه النماذج مختبرة، ومجربة، وتم اثبات جدارتها، وتمنح الشركات المطبقة لهذه النماذج او المعايير بالشكل الصحيح شهادات اعتماد. Phases مراحل. Models نماذج. Build اصدار من البرنامج يكون مكتمل ويكون محدد باصدار؛ مثال: Buld 1، Build2...الخ. GUI Graphical User Interface واجهة المستخدم. AI Artificial intelligence الذكاء الاصطناعي.  
    اولاً ماهو المشروع البرمجي؟ وما الهدف منه اصلاً؟
    يوجد الكثير من الأشخاص الراغبين في تعلم البرمجة او لنكون دقيقين يرغبون في تعلم لغة برمجة، وذلك بهدف برمجة تطبيق او موقع على الانترنت، او حتى برنامج سطح مكتب، او لعبة...الخ ولكن للرغبة نوعان: نوع قد يكون بهدف، والأخر قد لا يكون بهدف؛ ومن هذا المنطلق نستطيع القول ان المشروع البرمجي هو هدف مبني على رغبة، وليس رغبة بحد ذاتها، وهذا الهدف لا يكون الا لحل مشكلة انسانية او تسريع اعمال او للقيام بالامور الحسابية بشكل فاعل وأسرع، أو حتى بالمجال الطبي أو بالمجال الاقتصادي، وبالغالب كل مجالات الحياة الانسانية، وبسبب هذه الأهداف أصبحت الرغبة بتسريع الأمور  وتسهيلها هاجس انساني بحت، حتى وصلنا اليوم الى الـ AI وتقدمنا فيه بشكل كبير. 
    خلاصة: اذاً فالمشروع البرمجي هو عبارة عن برنامج مبني على الحاسوب والهدف منه هو حل المشكلات الإنسانية او تسهيل الحياة او تسريع أداء المهام، أو حتى للمتعة.
     
    ثانياً ماهي المشكلة بالطريقة المتبعة حالياً من قبل المستقلين؟
    للأسف فالكثير من المبرمجين المستقلين حالياً يعملون على الكثير من المشاريع البرمجية سواءً مشاريع شخصية لمسعىً ربحي او مشاريع لأفراد وجميع هذه المشاريع تتم بشكل عشوائي وبطريقة نسميها علمياً Ad Hoc Approach.
    تعريف Ad Hoc Approach: هي الحلول المتبعة او الطرائق التي يتخذها المبرمج لإنجاز مشروعه، وهذه الحلول او الطرائق تكون غالباً مبنية على رؤية المبرمج -وليس بطرق مُنظمة بُنيت على الكثير من التجارب التي تم اثباتها-، وغالباً هذه الطرق التي يتخذها المبرمج غير قابلة للاستخدام في مشاريع او اهداف اخرى وذلك لعدم كفائتها فهي غالباً وإن لم تكن دائماً تُنتج مُخرجات ذات جودة رديئة تكون غير قابلة للإختبار، أو التطوير، او قد تكون غير قابلة للتعديل لاحقاً.
    وهذه العادة المؤسفة والمتبعة من قبل الكثير من المستقلين قد تطفىء الضوء عن كثير من المشاريع سواءً (مواقع الكترونية، تطبيقات للهواتف الذكية، أو ألعاب)  مُبكراً وذلك لرداءة جودتها كما ذكرنا سابقاً، وقد ينتهي المشروع الى قضايا قانونية يرفعها صاحب المشروع على المستقل المنفذ لهذا المشروع بسبب رداءة المنتج او عدم تطبيق طلب الطرف الأول بشكل صحيح.
     
    ثالثاً ماهي دورة حياة تطوير البرمجيات (SDLC):
    SDLC او System Development Life Cycle هي دورة حياة تطوير البرمجيات، وتعتبر هذه الدورة بكل مراحلها من ضمن مجالات هندسة البرمجيات، والتي تهدف لتفصيل الإجراءات والأساليب المتبعة لحوكمة وضبط عمل فريق تطوير البرمجيات، والتي أصبحت أساس من أساسيات بناء اي مشروع برمجي، وقد تختلف المراحل من مشروع الى أخر حسب حجم واحتياجات المشروع، وتطبيق جميع المراحل يجعل من المشروع ذا جودة عالية جداً، وموافق للمعايير القياسية (Standard).
     
    مراحل دورة حياة تطوير البرمجيات (SDLC):
    نظراً لأن الأخطاء التي يتم اكتشافها مؤخراً تكون مكلفة وصعبة المعالجة؛ لذا فتصور دورة الحياة يُسهل لنا التنبؤ بالأخطاء مُبكراً ويسمح للمبرمجين بالتركيز على جودة التطبيق والوقت المحدد لتنفيذ البرنامج، وايضاً وضع التكلفة المطلوبة في الاعتبار؛ وتتضمن دورة الحياة التي يمر بها تطوير البرمجيات المراحل الأتية:
    1 - Feasibility Study دراسة الجدوى.
    2 - Analysis التحليل.
    3 - Design التصميم.
    4 - Implementation التنفيذ.
    5 - Testing الاختبار.
    6 - Maintenance الصيانة.
    7 - Evaluation التقدير.
     

     
    المراحل الأساسية والمتعارف عليها:
    1 - Planning التخطيط.
    2 - Analysis التحليل.
    Requirement المتطلبات Definition المفاهيم 4 - Design التصميم.
    5 - Implementation التنفيذ.
    6 - Testing الاختبار.
    7 - Deployment التنصيب.
    8 - Maintenance الصيانة.
    9 - Evaluation التقدير.

     
    وهذه المراحل Phases هي مراحل مهمة جداً وأساسية في بناء المشاريع البرمجية، وكما ذكرنا سابقاً أن هذه المراحل قد لا تدخل جميعها في مرحلة بناء المشروع البرمجي وانما يتم انتقائها حسب الاحتياج، ولكن نؤكد لكم أن بعضاً من هذه المراحل الزامية ويجب ان تدخل في كُل مشروع برمجي احترافي وذو جودة عالية وقد تم تحديدها باللون الأحمر.
     
    ملاحظة: أساس من أساسيات بدأ او تنفيذ اي مشروع برمجي هو اختيار طريقة تنفيذ SDLC وفي الشطر التالي من هذا الموضوع سنتحدث عن هذه الطرائق او النماذج.
    ملاحظة: بشكل عام جميع المراحل أعلاه قد تكون تسلسلية فلا تبدأ مرحلة حتى تنتهي المرحلة التي تسبقها.
    ملاحظة: قد تختلف مسميات بعض المراحل فمثلاً Implementation يطلق عليها احيانا Development.
     
    أ. مرحلة التخطيط:  في هذه المرحلة يتم عمل دراسة لجدوى المشروع، والتواصل مع العميل لفهم المشروع وبناء صورة مبدئية له، والتحقق من الامكانيات لتنفيذ هذا المشروع، فهي تعتبر مرحلة اتخاذ قرار مبدئي.
    ب. التحليل: تعتبر من أهم مراحل دورة حياة المشروع البرمجي، وهي البادئة الفعلية لل SDLC حيث يتم في هذه المرحلة الاقتراب أكثر من العملاء لفهم المشروع، وتحديد مُتطلباته Requirement، وتحديد المفاهيم والأهداف وايطار المشكلة، وحذف المفاهيم الغير منطقية واستبيان وفهم المشروع بشكل أكبر، فهي تعتبر خطوة تحديد الطلب، وعلى أساسها يتم تنفيذ المراحل التالية.
    Requirement المتطلبات: هي رغبات العميل، وتطلعاته وهي مهمة جداً في فهم المشروع وتحديد مشكلة العميل وماذا يريد بالضبط.
    ج. مرحلة التصميم: هي المرحلة التي يتم من خلالها عمل التصميم المبدئي للمشروع، ولا نعني بالتصميم ال GUI وانما مخططات المشروع تماماً مثل المهندس المعماري عندما يرسم مخططات المنزل قبل بنائه، فهذه الخطوة اساسية جداً ولاحقاً سأشرح التصميمات التي يحتاج المستقل ان يعملها لبناء مشروعه بشكل احترافي.
    د. مرحلة الاختبار: في هذه المرحلة يتم اختبار المشروع، والتحقق من أنه يعمل بشكل جيد ويوجد نوعين من الاختبارات الأساسية Black Box Testing و White Box Testing وسنتعرف على هذه الانواع لاحقاً.
    ك. التنصيب: وهي عملية نقل المشروع من بيئة التطوير الى بيئة التشغيل في مكان العميل.
    ص. الصيانة: أهم مراحل SDLC وقد تكون الأكثر ثمناً والأطول في المدة.
     
    رابعاً كيف ابدأ المشروع البرمجي؟
    هناك الكثير من الطرق أو النماذج التي يتبعها اغلب المستقلين المحترفين في المجال البرمجي، وتكون من بداية المشروع حتى مرحلة التسليم ثم التطوير، وهذه النماذج لا استطيع القول انها جيدة ولكنها مستخدمة، وهي أفضل بكثير من Ad Hoc،  ونطلق على هذه النماذج مسمى Models، وسأذكر في هذا القسم البعض من هذه الطرائق.
    ملاحظة: سأطلق على Models لاحقاً بالطرائق أو النماذج.
    خلاصة: مما تم ذكره سابقاً نستطيع القول أنه لا توجد طريقة واحدة لبدء المشروع البرمجي، وانما هنالك الكثير من الطرق المعترف بها والمجربة تطبيقياً، وجميع هذه الطرق لم تجرب في مشروع واحد وانما لها تاريخ من الفشل والتطوير، ثم الفشل والتطوير، ...، وسلسلة طويلة من قصص فشل وتطوير حتى توصلنا الى Standard عام لهذه الطرائق، وليومنا هذا مازالت اغلب الطرق قيد التطوير. والهدف من هذه الطرق او النماذج هو تطبيق SDLC بالشكل الأمثل.
    ومن هذه النماذج (الطرق) نذكر:
    1 - Code and Fix: وهذه الطريقة مستخدمة كثيراً من قبل أغلب المستقلين وهي سيئة جداً في حال تم تطبيقها لمشروع كبير او متوسط الحجم، وهي بكل بساطة نبدأ بكتابة الشفرة البرمجية حتى ننتهي، في حال ظهور مشاكل نصلحها او حتى نحصل على رضا المستخدم، ثم نبدأ بكتابة بقية الشفرة حتى ننتهي، وفي حال ظهور مشاكل نصلحها او حتى نحصل على رضا المستخدم، ونستمر بهذه الدورة حتى يكتمل المشروع.
    لاحظ في هذا النموذج استخدمنا مرحلة ال التخطيط، والتنفيذ فقط.

     
    وهذه الطريقة مناسبة جداً للمشاريع الصغيرة والتي لا تكون حساسة، مثل المواقع الشخصية الصغيرة، أو التطبيقات المصغرة جداً مثل تطبيقات عرض الأخبار أو الألعاب الصغيرة.
     
    2 - Incremental: هذه الطريقة تستخدم كثيراً في التطبيقات العامة التي يتم تطويرها وبيعها للمستخدمين، وهذه الطريقة جيدة ولكن لها سلبياتها للأسف، وهي بكل بساطة أن نعمل اصدارات للمشروع البرمجي وكل اصدار يسمى Build وكل Build أثناء تنفيذه يتم تطبيق جميع مراحل SDLC تقريباً  بشكل تكراري Itrative، وسنتحدث عن هذه المراحل في موضوع أخر ان شاء الله.
     
    3 - Agail: هذه الطريقة هي دمج مابين Incremental و Itrative وتركز على تنفيذ المشروع بالشكل الذي يحقق رضا العملاء، عن طريق التسليم السريع للمنتج، وهذه الطريقة تعتبر سلسة جداً من ناحية الاستخدام وهي من الطرق التي يستطيع استخدامها المستقلين.

     
    ملاحظة: هذه بعض النماذج التي احببت ذكرها، وهي نماذج جيدة جداً، ويستطيع المستقل استخدامها بسلاسة نوعاً ما.
    خلاصة: اذاً اجابتاً على السؤال: كيف ابدأ المشروع البرمجي؟ الاجابة تكمن في اختيار الطريقة او النموذج الصحيح؛ واختيار نموذج او طريقة العمل ليس سهل وانما يتطلب خبرة عالية وفهم عميق للمشروع، ولكن لا تقلق حتى لو كنت مبتدأ فمعرفتك البسيطة بهذه النماذج سوف يساعدك كثيراً على اختيار الصحيح -تقريباً- منها.  على كُل حال فهذه النماذج قد لا تكون واضحة للبعض ولكن لاحقاً في موضوع أخر سنشرح هذا النماذج بشكل أفضل ونشرح طرق الاختيار.
     
    خامساً تحليل وتلخيص المعلومات:
    اذا لنربط المعلومات ونوضح الأفكار ونضمن فهمك للموضوع بشكل جيد سنضع نقاط وسيتم تلخيص كل نقطة.
    ماهي المشكلة مع الطريقة التي يتبعها المستقلين في مشاريعهم البرمجية. ماهي المخاطر الممكنة او المتوقعة التي تسببها الطرق الخاطئة في تنفيذ المشاريع البرمجية. كيف ابدأ ببناء مشروع برمجي ذو جودة عالية. SDLC و SDLC Models. أ. ماهي المشكلة مع الطريقة التي يتبعها المستقلين في مشاريعهم البرمجية؟: المشكلة باختصار تكمن في جودة المنتج، فتنفيذ المشاريع البرمجية لا يكون فقط بكتابة الكود، وانما التخطيط الصحيح والتصميم الأمثل، واتباع الطريقة الأكثر فعالية لضمان بناء المشروع بجودة عالية، وسهولة اختباره، وامكانية صيانته وتطويره لاحقاً.
    ب. ماهي المخاطر الممكنة أو المتوقعة التي تسببها الطرق الخاطئة في تنفيذ المشاريع البرمجية؟:  الجودة، صعوبة الاختبار والتحقق، صعوبة الصيانة، و القضايا القانونية.
    ج. كيف ابدأ ببناء مشروع برمجي ذو جودة عالية؟: لبناء مشروع برمجي ذو جودة عالية، يجب ان تبدأ اولاً بفهم المشروع بشكل صحيح، ثم كتابة متطلبات المشروع، ثم عمل التصميمات التوضيحية وتأكيد فهم المشروع، ثم التنفيذ، ثم الاختبار، ولاحقاً الصيانة، وكل ماتم ذكره سابقاً من مراحل SDLC والتي يتم تنفيذها بشكل فعال من خلال SDLC Models.
    د. SDLC و SDLC Models: دورة حياة تطوير المشروع البرمجي SDLC هي مجموعة مراحل يجب تنفيذها لبناء المشروع البرمجي بشكل صحيح، وطريقة تنفيذ هذه المراحل يكمن من خلال نماذج دورة حياة تطوير المشروع البرمجي SDLC Models.
     
    خاتمة
    من المتوقع كثيراً خصوصاً مع كثرة المُصطلحات والأفكار أن يكون فهمك لأهمية SPLC غير كامل وقد يكون مُبهم، لذلك لا تقلق ففي المواضيع القادمة والتي ستكون تحت عنوان دورة حياة تطوير البرمجيات: X -حيث أن X يمثل العنوان الفرعي- سنتحدث بالتفصيل عن مراحل SDLC، وعن الأدوات، والنماذج التي سوف تساعدك كمستقل على ادارة مشروعك البرمجي بشكل احترافي لتضمن جودته. 
     
    الموضوع التالي دورة حياة تطوير البرمجيات: المرحلة الأولى التخطيط
     
    هذا وصلى الله وسلم على نبينا محمد وعلى آله وصحبه اجمعين
    مستوى المقال: مبتدئ
  6. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
     
    الفائزون في شهر July-2017
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  7. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
     
    الفائزون في شهر June-2017
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  8. بسم الله الرحمن الرحيم
    كيف تحمي بيانات المستخدمين من الإختراق عن طريق
    Salted Password Hashing
     
    مقدمة:
    إذا كنت مطور تطبيقات ففي الغالب أنك أنشأت في نظامك جزء خاص بإدارة حسابات المستخدمين (User Account Management). ما يهمنا هنا هو كيفية حماية بيانات المستخدمين في قاعدة البيانات. كما لا يخفى على الجميع أن الكثير من المواقع أو التطبيقات المشهورة تعرضت للإختراق وتم الحصول على بيانات المستخدمين. فما هي الطريقة المناسبة لحماية كلمات المرور أو بيانات المستخدمين البنكية. سنركز هنا على كلمات المرور والفكرة واحدة.
    الطرق المختلفة لحفظ المرور في قاعدة البيانات:
    -         حفظ كلمة المرور كنص واضح (Plaintext)
    -         تشفير كلمة المرور ثم حفظ النص المشفر (Ciphertext)
    -         استخدام الـ Hashing.
    -         استخدام Salted Password Hashing
     
    حفظ كلمة المرور كنص واضح (Plaintext)
    هذه الطريقة هي أبسط الطرق وهي عملية حفظ كلمة المرور كما أدخلها المستخدم. مثلا أدخل 123 فهي تحفظ في قاعدة البيانات كما هي (123). فإذا نسيت كلمة المرور وطلبت من الموقع الذي أنت عضو فيه استعادة كلمة المرور فتم إرسال كلمة المرور كما هي على بريدك الالكتروني فهذا الموقع يستخدم هذه الطريقة أو الطريقة الثانية.
    هذه الطريقة خطيرة جدا فأبسط عملية اطلاع على قاعدة البيانات يستطيع المخترق أن يعرف كلمة مرور أي مستخدم أو عضو مسجل. فأبتعد عن هذه الطريقة.
     
    تشفير كلمة المرور ثم حفظ النص المشفر (Ciphertext)
    كما نعرف جميعا أن التشفير في أبسط تعريف له هو عملية تحويل المعلومات من صيغتها الحقيقة المفهومة إلى صغية غير مفهومة. أو تحويلها من صيغها الحقيقية إلى صيغة أخرى.
    ويتم ذلك عن طريق أحد أنواع التشفير التالية:
    -         التشفير المتناظر/ المتماثل (Symmetric key / Private key)
    حيث يتم التشفير (Encryption) وفك التشفير (Decryption) بنفس المفتاح.
    -         التشفير الغير متناظر/ الغير متماثل (Asymmetric / Public key)
    هنا يتم التشفير بالمفتاح العام (Public Key) ويتم فك التشفير بالمفتاح الخاص (Private Key) ويكون المفتاح العام معروف عند الجميع أما المفتاح الخاص فلا يعرفه إلا المالك نفسه. أما إذا عكسنا العملية فتم التشفير بالمفتاح الخاص وتم فك التشفير بالمفتاح العام (التحقق من المرسل) فهذا يسمى التوقيع الإلكتروني (Digital Signature).
     
    موضوع التشفير وأنواعه لا تهمنا حاليا. ما يهمنا هنا هو عملية تشفير كلمة المرور ثم حفظها في قاعدة البيانات.
    مثال: لنفرض أن خوارزمية التشفير هي الإزاحة (The Shift Cipher) وأن مفتاح التشفير هو الازاحة 3 خانات.

     
    كما نلاحظ تتمت الإزاحة 3 خانات لكل حرف من النص الأصلي فمثلا 123 تصبح 456.
    ففي هذه الطريقة يتم حفظ 456 في قاعدة البيانات ولو تكرر أن مستخدم أخر يستخدم كلمة المرور 123 فتصبح أيضا 456 مخزنة في قاعدة البيانات.
    هذه الطريقة أصعب قليلا من الطريقة الأولى ولكن أيضا غير عملية فلو تم اكتشاف مفتاح التشفير فستصبح قاعدة البيانات واضحة ويمكن الحصول على كل كلمات المرور الخاصة بالمستخدمين.
    يمكن تعقيد هذه الطريقة في حال أصبح لكل مستخدم مفتاح عام (Public key) ومفتاح خاص (Private Key) ولكن يصعب تنفيذ هذه الطريقة فأنت تحتاج لنظام لإنشاء مفاتيح للمستخدمين. فعند تسجيل المستخدم يتم تشفير كلمة المرور الخاصة به بالمفتاح العام. وعندما يقوم المستخدم بعملية تسجيل الدخول فيجب أن يكتب أو يرفق المفتاح الخاص به وهذا ينافي مبدأ التشفير الغير متناظر حيث يمكن معرفة المفتاح الخاص.
     
    استخدام الـ Password Hashing
    هذه الطريقة مستخدمة في العديد من المواقع وهي طريقة عملية ويصعب نوعاً ما أكتشاف كلمات المرور المخزنة في قاعدة البيانات عندما نستخدم هذه الطريقة. ولكن تظل طريقة لها العديد من الطرق التي تخترقها خصوصا في ظل تقدم التقنيات والأجهزة ذات المواصفات العالية.
    ما هو الـ Hashing :
    هو أحد علوم الـ (Cryptography) ولكن ليس تشفير (Encryption). فهي طريقة وحيدة الإتجاه (One way function) والتي تقوم بتحويل النص مهما كان طوله إلى نص ثابت (fixed-length). ولا يمكن إرجاع النص الناتج إلى النص الأصلي. أي لا يوجد فك للتشفير.
    الفرق بين الـ Hashing  و التشفير (Encryption) ؟
    عندما نشفر الكلمة 123 فتصبح 456 فإننا نستطيع فك التشفير من 456 لتعود إلى 123. ولكن في الـ Hashing عندما نحول 123 إلى 456 فلا يمكن إعادة 456 إلى النص الأصلي 123.

     
    كما نلاحظ في الشكل السابق أن النص الناتج من عملية الـ Hashing  نص ثابت الطول (10) خانات مهما أختلف طول النص في النص الأصلي في الجهة اليسار. أيضا نلاحظ أن 123 كانت عملية الـ Hashing  لها واحدة (Fdeom83nyU) مهما تكررت يكون الناتج واحد.
    خوارزميات الـ Hashing:
    يوجد العديد من خوارزميات الـ Hashing من أشهرها:
    ·         MD5   Message Digest Algorithm 5
    ·         SHA-1,SHA-2,SHA-3  Secure Hash Algorithm
    ·         BLAKE and BLAKE2
     

     
    كيف يتم كسر كلمات المرور؟
    في البداية يمكن إكتشاف كلمة المرور دون النظر إلى كيفية تخزينها في قاعدة البيانات هل هي بنص واضح أو مشفرة أو تم عمل Hashing  لها. وهناك خيارين ليتم كسر أو كشف كلمة المرور أو أي بيانات حساسة.
    -         أن يتم الدخول على خوادم أي موقع أي أنه تم تجاوز عدة تحصينات سابقة وتم الحصول على قاعدة البيانات خصوصا جدول المستخدمين مثلا. فهنا إما أن تكون الكلمة مخزنة بشكل واضح وهذه بسيطة. أو تكون مشفرة أو Hashed Password. فهنا يتم التعامل معها بإحدى الطرق التي بالأسفل.
    -         أو يكون المخترق لديه اسم المستخدم ويحاول الحصول على كلمة المرور. بمعنى أنه لا يمتلك قاعدة البيانات ولا يعرف الشكل الذي به تم حفظ كلمة المرور.
    في الخيار الأول غالب يتم استخدام الأختراق الغير مباشر (Offline Attack)  بمعنى أن المخترق لديه كلمة مشفرة أو Hashed ويريد معرفة الكلمة الأصلية (Plaintext) فهنا يتم استخدام برامج تعتمد على الطرق التي بالأسفل لكي يحصل على الكلمة الأصلية دون التعامل المباشر مع الموقع الأصلي الذي تم اختراقه مسبقاً.
    وغالبا في الخيار الثاني يتم استخدام الاختراق المباشر (Online Attack) حيث يكون لدى المخترق اسم المستخدم ويقوم بإستخدام برامج أيضا تعتمد على الطرق التي بالأسفل ويتم إرسال طلبات إلى الموقع المسجل لديه بيانات المستخدم.
    كما عرفنا سابقا أن Hashing  وحيدة الإتجاه (One way function) أي لا يمكن إعادة النص الأصلي (Plaintext). ومع ذلك فإنه يمكن أن تكتشف الكلمة الأصلي ويتم ذلك بعدة طرق. وهذه الطرق إما أن تعتمد على مبدأ التخمين أو البحث في قاعدة بيانات كبيرة (جدول) تحتوي على العديد من كلمات المرور مع الـ hash  المقابل لها. ويتم ذلك ضمن خورزميات وعمليات حسابية طويلة ومقعدة لتضمن فعالية هذه الطرق.
    ومن هذه الطرق:
    1-    Dictionary Attack
    هذه الطريقة تعتمد على مبدأ التخمين (Guessing ) حيث يكون هناك ملف يحتوي على قائمة كبيرة من الكلمات المستخدمة أو المشهورة بإنها تستخدم ككلمة مرور. أو تكون هذه القائمة متوقعة بالنسبة لشخص محدد مثل تاريخ الميلاد رقم الهاتف الخ. ويمكن استخدام هذه الطريقة من خلال (Online Attack) أو (Offline Attack) وفي الـ Offline Attack  تقوم بعض البرامج أثناء التنفيذ بعمل الـ Hash  المقابل لكل كلمة في الملف ويتم مقارنتها مع الHashed Password  التي يمتلكها المخترق وفي حال التطابق يتم معرفة كلمة المرور الأصلية.
     
    مثال: لنفرض أن المخترق لديه هذا الحساب [email protected] وكلمة المرور هي Car ( بالتأكيد لا يعرفها المخترق). ستتم هذه الطريقة حسب الملف الذي يمتلكه المخترق (الشكل بالأسفل)

             ستتم تجربة كلمات الملف كالتالي

     
     
    2-    Brute Force Attack
    هذه الطريقة شبيهه بالطريقة السابقة حيث أنها تعتمد أيضا على التخمين ولكن التخمين بالاعتماد على عمليات حسابية حيث يتم تجربة كل الاحتمالات الممكنة مثلا تجربة كل الاحتمالات لكلمة مرور ذات طول 6 خانات عبارة عن أرقام أو أحرف. فهنا الموضوع لا يعتمد على جدول أو ملف إنما تجربة أثناء وقت التنفيذ. وهذه الطريقة تأخذ وقت طويل يزيد وينقص حسب طول كلمة المرور.
     
    مثال : لنفرض أن المخترق لديه هذا الحساب [email protected] وكلمة المرور هي  111333 ( بالتأكيد لا يعرفها المخترق).
    تعمل هذه الطريقة بهذا الشكل:

    سيتم تجربة كل الاحتمالات الممكنة حتى يصل إلى كلمة المرور. وقد تستمر إلى وقت طويل جداً حتى يتم إيجاد كلمة المرور. أيضا هنا تم استخدام (Online Attack) حيث أن المخترق يرسل للخادم في كل مرة اسم المستخدم مع احتمال لكلمة المرور بشكل متسلسل.
     
    ويمكن استخدام الـ (Offline Attack) إذا كانت كلمة المرور محفوظة كـ Hash حيث يكون لدى المخترق الـ Hashed Password فيمكن اكتشاف كلمة المرور بنفس الطريقة ولكن يتم أولا عمل Hash   أُثناء التنفيذ لكل سلسلة من الحروف ثم مقارنتها مع الـ Hashed Password. لنفرض أن المخترق لديه هذه الكلمة (Hashed Password) التالية:
    62b37844f7adeb0df6f180126327dca339fb7003

     
     
    3-    Lookup Tables
    أو ما يسمى (Pre-Computed dictionary attack) لنعرف أولا معنى Pre-Computed أو
    Precomputation  يقصد بها:
    عملية تجهيز الجدول قبل وقت التنفيذ (Run Time) ففي الطريقة السابقة (Dictionary attack) لدينا قائمة كبيرة من الكلمات وفي الـ (Offline Attack) يتم عمل Hash  لكل كلمة من القائمة أثناء التنفيذ ومقارنتها مع الكلمة التي يتملتكها المخترق (Hashed Password) فهذه الطريقة تأخذ وقت كبير ولكن هنا يتم إعداد جدول أو قائمة يكون مقابل كل كلمة الـ Hash  الخاص بها حسب خوارزمية الـ Hashing.
    وهذا الجدول يستفيد منه المخترق دائما دون عمل الـHash  مرة أخرى لكل كلمة أثناء التنفيذ. وتكون العملية فقط بحث عن الـ Hash  المطابقة للكلمة التي لدى المخترق ففي حالة التطابق يتكون كلمة المرور هي المقابلة للـ Hash
     
    مثال: لنفرض أن لدى المخترق هذه الـ Hashed Password
    e9989db5dabeea617f40c8dbfd07f5fb
    ولديه هذا الجدول ( هذا الجدول تم إنشائه مسبقا Pre-Computed ) وليس أثناء وقت التنفيذ.

     
    فالعملية هي عملية بحث أو استعلام عادية للحصول على الـ Hash  الموجودة في الجدول والمطابقة لما لدى المخترق (e9989db5dabeea617f40c8dbfd07f5fb). وهنا تكون كلمة المرور الأصلية هي Car.
    وطبعا هذه الطريقة تختصر الوقت لكن تعتمد كفائتها على كمية الكلمات الموجودة في الجدول.
     
    يوجد بعض البرامج التي تقوم بإنشاء هذه الجداول حسب بعض المعطيات لدى المخترق ( أي لا يشترط أن يكون هناك قائمة جاهزة للكلمات المشهورة إنما يمكن إنشائها) من هذه المعطيات أن يتم إنشاء جدول (Lookup tables) للكلمات ذات الطول من 1 إلى 7 خانات وتكون عبارة عن أرقام فقط. ويمكن أن تكون أرقام أو حروف أو رموز. كلما زادت المعطيات زاد وقت إنشاء هذه الجداول وزادت مساحة التخزين.
     
    4-    Rainbow Tables
    هو نوع مخصص من Lookup table بنفس الفكرة والاعتماد على (precomputation ). ولكن تعمل تحت مبدأ (space/time trade-off) وهذا يعني زيادة مساحة التخزين في سبيل تقليل وقت التنفيذ أو وقت الحصول على النتيجة. ولكن وقت التنفيذ أقل من Brute Force Attack وكذلك مساحة التخزين أقل من Lookup table.

     
    الفرق بين الـ Rainbow table و Lookup table هو في طريقة إنشاء جدول الكلمات حيث يعتمد الـ Rainbow table على دالة الاختزال أو التقليص (Reduction function) والتي تعمل على تقليل حجم الجدول الناشئ حيث يتم استبعاد حفظ بعض كلمات المرور والـ Hash  المقابل لها. شرح التفاصيل الخاصة بالـ Rainbow table and Reduction function يحتاج موضوع مستقل. لكن سأذكر في النهاية بعض المواضيع التي تشرحها بشئ من التفصيل.
     
    ملاحظة: تم توضيح الطرق السابقة في أبسط صورها وقد تم إضافة الكثير من التحسينات وتم استخدام خوارزميات معقدة تزيد من فعاليتها. ومعرفة هذه الطرق وتفاصيلها أحد الأسباب الرئيسية لحماية بياناتك أو حماية بيانات المستخدمين لديك  وتساعدك في فرض عدة قيود صلبة تجعل عملية الإختراق صعبة أو شبه مستحيلة.
     
    استخدام الـ Salted Password Hashing
    هذه الطريقة هي الهدف الرئيسي من هذا الموضوع. كما ذكرنا سابقاً أن عملية الـ Hashing  للكلمة 123 هو  Fdeom83nyU ( مثال فقط) فهنا كلما تكررت 123 ككلمة مرور لأي مستخدم ستكون النتيجة هي Fdeom83nyU وهذه النقطة تساعد المخترق على محاولة إستنتاج كلمة المرور من النص Fdeom83nyU بإستخدام الطرق السابقة أو غيرها. أما طريقة Salted Password تعمل على أن يكون الـ Hash للكلمة 123 مختلف في كل مرة وذلك بإضافة نص عشوائي للكلمة الأصلية 123 ثم عمل الـ Hashing  لها كما في الشكل التالي:

     
    نلاحظ في الشكل السابق إختلاف الناتج من عملية الـ Hashing في كلمة مرور حتى وإن كانت كلمة المرور واحدة.
    الهدف من الكلمة Salt والتي تعنى ملح هو شيء مشابه للفائدة من الملح وهو تحسين الطعام أيضا هنا النص المضاف Salt يعني إضافة نص عشوائي إلى كلمة المرور الأصلية لتحسينها حتى تكون قوية يصعب كسرها أو إكتشافها.
    طريقة عمل Salted Password Hashing:
    أولا في مرحلة تسجيل البيانات حيث يقوم المستخدم بتعبئة بياناته على الموقع ثم يقوم بالحفظ. حيث تتم الخطوات التالية:
    1-    يدخل المستخدم كلمة المرور لنفرض 123
    2-    يقوم البرنامج بإنشاء نص مضاف (Salt) بشكل عشوائي لنفرض Nd29kd63w1po
    3-    يتم دمج كلمة المرور مع النص العشوائي المضاف لتصبح 123Nd29kd63w1po
    4-    يتم عمل Hash للنص 123Nd29kd63w1po وسيكون الناتج jdhsi3jf92 ( طبعا النص أطول من ذلك حسب خوارزمية الـ Hash  ).
    5-    يتم حفظ الناتج jdhsi3jf92 و النص العشوائي المضاف Nd29kd63w1po في قاعدة البيانات مع بيانات المستخدم الأخرى كالبريد الالكتروني والاسم ..الخ.
     
    ثانيا عند تسجيل الدخول يتم التالي:
    1-    يُدخل المستخدم اسم المستخدم وكلمة المرور لنفرض 123
    2-    يتم الاستعلام عن بيانات المستخدم بواسطة اسم المستخدم من قاعدة البيانات للحصول على الـ Salt  و الـ Hashed Password ونفرض أن Salt هو  Nd29kd63w1po والـ Hashed Password هي jdhsi3jf92.
    3-    يتم دمج كلمة المرور المدخلة 123 مع النص Salt وهو Nd29kd63w1po لتصبح 123Nd29kd63w1po  ثم يتم عمل Hashing  لها ليصبح الناتج jdhsi3jf92
    4-    ثم يتم مطابقة النص الناتج jdhsi3jf92 مع كلمة المرور المخزنة في قاعدة البيانات Hashed Password وهي jdhsi3jf92 وفي حال التطابق يتم تسجيل الدخول.
     
    نصائح مهمة عند عمل Salted Password Hashing:
    1-    عدم إعادة استخدام الـ Salt   نفسه مع كل كلمة مرور حيث يجب أن يكون عشوائي مع كل كلمة مرور.
    2-    لا تستخدم Salt قصير يجب أن يكون نص عشوائي طويل على الأقل 16 حرف ( أيضا يمكنك الاعتماد على نوع خوارزمية الـ Hash لتحديد طول الـ Salt )
    3-    استخدام خوارزميات الـ Hash  مثل (MD5,SHA1,SHA2,SHA3) في Salted Password Hashing يعتبر آمن ولكن هذه الخورزميات تعتبر قديمة والمخترقين لديهم عدة طرق لكسر كلمات المرور التي تم إنشائها بواسطتها وحتى مع وجود الـ Salt هي مجرد مسألة وقت ويمكن كسرها. لذلك يفضل عدم استخدامها بل استخدام (password-based key derivation function) مثل  PBKDF2, bcrypt, scrypt
    4-    لا تقوم بإنشاء دالة خاصة تقوم بتوليد (Generate)  نص عشوائي Salt بل يفضل استخدام الدوال الجاهزة حسب لغة البرمجة كما في الشكل التالي:

     
    تطبيق: بلغة (ASP.Net (C#,VB)) مع قاعدة البيانات SQL Server
    الفكرة:
    سيتم إن شاء الله إنشاء تطبيق بسيط لعملية تسجيل أو إنشاء المستخدمين أيضا تسجيل الدخول. حيث يقوم المستخدم بتعبئة بياناته في صفحة التسجيل (Registration) وهي اسم المستخدم و الاسم كاملأ وكلمة المرور. ثم يقوم البرنامج بعمل Salted Password ( الـ Salt و Hashed Password  ) ثم يتم حفظ البيانات في قاعدة البيانات. وعندما تتم عملية التسجيل يمكن للمستخدم تسجيل الدخول عن طريق صفحة الدخول (Login) حيث يتم كتابة اسم المستخدم وكلمة المرور حسب الخطوات التي تم ذكرها بالأعلى في جزئية طريقة عمل  Salted Password Hashing.
    التطبيق يعتمد على PBKDF2.
    وهي خورازمية للـ (Password-Based Key Derivation Function) وليست للـ Hashing  بشكل مباشر مثل (MD5,SHA) والهدف منها استخدام إحدى خوارزميات الـ Hashing  المباشرة ولكن بطريقة تعمل على زيادة قوة الـ Hash  الناتج من كلمة المرور الأصلية بحيث يصعب كسر أو إكتشاف كلمة المرور من خلال Rainbow tables  أو Brute force attack.
    ويتم ذلك من خلال  عدة نقاط  مثل طول الـ Salt  أيضا عدد الـ Iterations والذي يعمل على تحسين الـ Hash  الناتج من كلمة المرور الأصلية. لنفرض أن عدد الـ هو Iterations 30000 هنا تتم عملية التحسين 30000 مرة  وهذا مما يزيد في صعوبة إكتشاف كلمة المرور ولكن من الطبيعي يكون هناك بطئ أثناء وقت التفيذ حسب عدد الـ  Iterations. سأذكر إن شاء الله  في نهاية الموضوع بعض المصادر التي تشرح key derivation function و PBKDF2 وكذلك Key stretching.
     
    الـ PBKDF2 في الـ .Net  يمكن استخدام الـ Rfc2898DeriveBytes والذي يعتمد على SHA-1.
     
    قاعدة البيانات:
    تم إنشاء جدول للمستخدمين يحتوى على عدة حقول كما في الشكل أدناه.

    CREATE TABLE UsersAccounts ( Username nvarchar(30) PRIMARY KEY, FullName nvarchar(200) NOT NULL, Salt nvarchar(100) NOT NULL, HashedPassword nvarchar(100) NOT NULL )  
    الفئات (Classes)
    نحتاج لـ Two Classes  الأول خاص بقاعدة البيانات (SQLHelper) والثاني خاص بالـ Hashing  وهو (SaltedPassword) وهذا الأخير و لب هذا التطبيق.
     
    فئة (Class) للتعامل مع قاعدة البيانات (SQLHelper)
    يحتوي على دالتين
    -         دالة الاستعلام حيث يتم إرسال جملة الإستعلام ويتم حفظ النتائج في جدول (DataTable)
    -         دالة تنفيذ جمل الإضافة والتعديل والحذف ويتم من خلالها إرسال البيانات وحفظها في قاعدة البيانات.
    SQLHelper Class
    C#
    using System; using System.Data; using System.Data.SqlClient; public class SQLHelper { public SQLHelper() { // // TODO: Add constructor logic here // } public static readonly string ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionString1"].ConnectionString; // Select Queries public static DataTable ExecuteQuery(string commandText, CommandType commandType, SqlParameter[] parameters) { DataTable table = new DataTable(); try { // ConnectionString كائن الإتصال مسؤول عن فتح وإغلاق الاتصال بقاعدة البيانات حسب المسار في using (SqlConnection connection = new SqlConnection(ConnectionString)) { // كائن الأوامر يتم من خلاله تجهيزة جملة الاستعلام والإضافة ليتم تنفيذها على قاعدة البيانات using (SqlCommand command = new SqlCommand(commandText, connection)) { // تحديد نوع كائن الأوامر // Text: like (Select * from table ...) // StoredProcedure: will be the name of StoredProcedure command.CommandType = commandType; // هي القيم التي يتم تمريرها مثل رقم الطالب والتي تكون مدخله من المستخدم parameters الـ if (parameters != null) command.Parameters.AddRange(parameters); connection.Open(); // DataSet مسؤول عن تعبئة النتائج في جدول أو SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(table); } } } catch (Exception ex) { EventsLogger.SaveToLog(ex.Message); return null; } return table; } // Insert,Update and Delete public static bool ExecuteNonQuery(string commandText, CommandType commandType, SqlParameter[] parameters) { try { using (SqlConnection connection = new SqlConnection(ConnectionString)) { using (SqlCommand command = new SqlCommand(commandText, connection)) { command.CommandType = commandType; if (parameters != null) command.Parameters.AddRange(parameters); connection.Open(); if (command.ExecuteNonQuery() > 0) { return true; } else return false; } } } catch (Exception ex) { EventsLogger.SaveToLog(ex.Message); return false; } } } VB.Net
    Imports Microsoft.VisualBasic Imports System.Data Imports System.Data.SqlClient Public Class SQLHelper Private Shared ConnectionString As String = System.Configuration.ConfigurationManager.ConnectionStrings("connectionString1").ConnectionString 'Select Queries Public Shared Function ExecuteQuery(commandText As String, commandType As CommandType, parameters As SqlParameter()) As DataTable Dim table As New DataTable() Try Using connection As New SqlConnection(ConnectionString) Using command As New SqlCommand(commandText, connection) command.CommandType = commandType If parameters IsNot Nothing Then command.Parameters.AddRange(parameters) End If connection.Open() Dim adapter As New SqlDataAdapter(command) adapter.Fill(table) End Using End Using Catch ex As Exception EventsLogger.SaveToLog(ex.Message) Return Nothing End Try Return table End Function ' Insert,Update and Delete Public Shared Function ExecuteNonQuery(commandText As String, commandType As CommandType, parameters As SqlParameter()) As Boolean Try Using connection As New SqlConnection(ConnectionString) Using command As New SqlCommand(commandText, connection) command.CommandType = commandType If parameters IsNot Nothing Then command.Parameters.AddRange(parameters) End If connection.Open() If command.ExecuteNonQuery() > 0 Then Return True Else Return False End If End Using End Using Catch ex As Exception EventsLogger.SaveToLog(ex.Message) Return False End Try End Function End Class  
    فئة (Class) للتعامل مع الـ (Salted Password Hashing)
    يحتوي على ثلاثة دوال:
    -         دالة لإنشاء النص العشوائي المضاف Salt  .وهي GenerateSalt
    -         دالة لعمل الـ Hash . وهي HashPasswordUsingPBKDF2
    -         دالة للمطابقة عند تسجيل الدخول للتحقق من اسم المستخدم وكلمة المرور. وهي VerifyPassword
     
    SaltedPassword Class
    C#
    using System; using System.Security.Cryptography; public class SaltedPassword { public SaltedPassword() { // // TODO: Add constructor logic here // } private const int pbkdf2NoOfIterations = 30000; private const int hashSize = 32; private const int saltSize = 32; /// <summary> /// Hashing دالة لإنشاء نص عشوائي ليتم إضافته إلى كلمة المرور قبل عملية الـ /// </summary> /// <returns></returns> public static string GenerateSalt() { RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] salt = new byte[saltSize]; rng.GetBytes(salt); return Convert.ToBase64String(salt); } /// <summary> /// Hash دالة تقوم بإنشاء كلمة المرور كـ /// </summary> /// <param name="Password">كلمة المرور الأصلية التي أدخلها المستخدم</param> /// <param name="Salt"> النص المضاف التي تم إنشائه سابقا</param> /// <returns></returns> public static string HashPasswordUsingPBKDF2(string Password,string Salt) { byte[] bSalt = Convert.FromBase64String(Salt); Rfc2898DeriveBytes PBKDF2 = new Rfc2898DeriveBytes(Password, bSalt, pbkdf2NoOfIterations); byte[] key = PBKDF2.GetBytes(hashSize); return Convert.ToBase64String(key); } /// <summary> /// دالة للتحقق من كلمة المرور المدخلة أثناء تسجيل الدخول /// </summary> /// <param name="UserPassword">كلمة المرور المدخلة من قبل المستخدم أثناء تسجيل الدخول</param> /// <param name="Salt">النص المضاف المحفوظ في قاعدة البيانات</param> /// <param name="HashedPassword">Hash كلمة المرور التي تم حفظها في قاعدة البيانات كـ </param> /// <returns></returns> public static bool VerifyPassword(string UserPassword, string Salt,string HashedPassword) { string hash = HashPasswordUsingPBKDF2(UserPassword, Salt); // المقارنة بين القيمتين للتأكد من صحة كلمة المرور // New Hash with Hashed Password (from Database) if (String.Compare(hash, HashedPassword, false) == 0 ) return true; // كلمة المرور صحيحة else return false; } } VB.Net
    Imports Microsoft.VisualBasic Imports System.Security.Cryptography Public Class SaltedPassword Private Const pbkdf2NoOfIterations As Integer = 30000 Private Const hashSize As Integer = 32 Private Const saltSize As Integer = 32 ''' <summary> ''' Hashing دالة لإنشاء نص عشوائي ليتم إضافته إلى كلمة المرور قبل عملية الـ ''' </summary> ''' <returns></returns> Public Shared Function GenerateSalt() As String Dim rng As New RNGCryptoServiceProvider() Dim salt As Byte() = New Byte(saltSize - 1) {} rng.GetBytes(salt) Return Convert.ToBase64String(salt) End Function ''' <summary> ''' Hash دالة تقوم بإنشاء كلمة المرور كـ ''' </summary> ''' <param name="Password">كلمة المرور الأصلية التي أدخلها المستخدم</param> ''' <param name="Salt"> النص المضاف التي تم إنشائه سابقا</param> ''' <returns></returns> Public Shared Function HashPasswordUsingPBKDF2(Password As String, Salt As String) As String Dim bSalt As Byte() = Convert.FromBase64String(Salt) Dim PBKDF2 As New Rfc2898DeriveBytes(Password, bSalt, pbkdf2NoOfIterations) Dim key As Byte() = PBKDF2.GetBytes(hashSize) Return Convert.ToBase64String(key) End Function ''' <summary> ''' دالة للتحقق من كلمة المرور المدخلة أثناء تسجيل الدخول ''' </summary> ''' <param name="UserPassword">كلمة المرور المدخلة من قبل المستخدم أثناء تسجيل الدخول</param> ''' <param name="Salt">النص المضاف المحفوظ في قاعدة البيانات</param> ''' <param name="HashedPassword">Hash كلمة المرور التي تم حفظها في قاعدة البيانات كـ </param> ''' <returns></returns> Public Shared Function VerifyPassword(UserPassword As String, Salt As String, HashedPassword As String) As Boolean Dim hash As String = HashPasswordUsingPBKDF2(UserPassword, Salt) ' المقارنة بين القيمتين للتأكد من صحة كلمة المرور ' New Hash with Hashed Password (from Database) If [String].Compare(hash, HashedPassword, False) = 0 Then Return True Else ' كلمة المرور صحيحة Return False End If End Function End Class  
    صفحة التسجيل (Registration.aspx)

     
    Design
    <div class="center" dir="rtl"> <table class="center"> <tr> <td class="td">اسم المستخدم:</td> <td> <input id="txtUsername" type="text" runat="server" class="textBox" maxlength="20" required="required" /></td> </tr> <tr> <td class="td">الاسم:</td> <td> <input id="txtName" type="text" runat="server" class="textBox" maxlength="200" required="required" /></td> </tr> <tr> <td class="td">كلمة المرور:</td> <td> <input id="txtPassword" type="password" runat="server" class="textBox" maxlength="20" required="required" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" title="كلمة المرور يجب أن تكون 8 خانات وخليط من الارقام والحروف الصغيرة والكبيرة والرموز" /></td> </tr> <tr> <td colspan="2"> <asp:Button ID="btnRegister" runat="server" Text="تسجيل" CssClass="button" OnClick="btnRegister_Click" /></td> </tr> </table> <br /> <asp:Label ID="lbMessage" runat="server" CssClass="lableMsg"></asp:Label> </div>  
     
    الكود بداخل زر التسجيل (btnRegister)
    C#
    protected void btnRegister_Click(object sender, EventArgs e) { try { string salt = SaltedPassword.GenerateSalt(); string hashedPassword = SaltedPassword.HashPasswordUsingPBKDF2(txtPassword.Value, salt); // Save Into database // نستخدم هذه الطريقة للحماية من // Sql Injection // command حيث نمرر القيم داخل SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@Username",txtUsername.Value), new SqlParameter("@FullName",txtName.Value), new SqlParameter("@Salt",salt), new SqlParameter("@HashedPWD",hashedPassword), }; // ويفضل استخدام الإجراءات المخزنة // Stored Procedures if (SQLHelper.ExecuteNonQuery("INSERT INTO UsersAccounts VALUES(@Username,@FullName,@Salt,@HashedPWD)", CommandType.Text, parameters)) lbMessage.Text = "تم تسجيل البيانات بنجاح"; else lbMessage.Text = "حدث خطأ أثناء تسجيل البيانات"; } catch (Exception ex) { EventsLogger.SaveToLog(ex.Message); lbMessage.Text = "حدث خطأ أثناء تسجيل البيانات"; } } VB.Net
    Protected Sub btnRegister_Click(sender As Object, e As EventArgs) Try Dim salt As String = SaltedPassword.GenerateSalt() Dim hashedPassword As String = SaltedPassword.HashPasswordUsingPBKDF2(txtPassword.Value, salt) ' Save Into database ' نستخدم هذه الطريقة للحماية من ' Sql Injection ' command حيث نمرر القيم داخل Dim parameters As SqlParameter() = New SqlParameter() {New SqlParameter("@Username", txtUsername.Value), New SqlParameter("@FullName", txtName.Value), New SqlParameter("@Salt", salt), New SqlParameter("@HashedPWD", hashedPassword)} ' ويفضل استخدام الإجراءات المخزنة ' Stored Procedures If SQLHelper.ExecuteNonQuery("INSERT INTO UsersAccounts VALUES(@Username,@FullName,@Salt,@HashedPWD)", CommandType.Text, parameters) Then lbMessage.Text = "تم تسجيل البيانات بنجاح" Else lbMessage.Text = "حدث خطأ أثناء تسجيل البيانات" End If Catch ex As Exception EventsLogger.SaveToLog(ex.Message) lbMessage.Text = "حدث خطأ أثناء تسجيل البيانات" End Try End Sub  

    صفحة تسجيل الدخول (Login.aspx)

     
    Design
    <div class="center" dir="rtl"> <table class="center"> <tr> <td class="td">اسم المستخدم:</td> <td> <input id="txtUsername" type="text" runat="server" class="textBox" maxlength="20" required="required" /></td> </tr> <tr> <td class="td">كلمة المرور:</td> <td> <input id="txtPassword" type="password" runat="server" class="textBox" maxlength="20" required="required" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" title="كلمة المرور يجب أن تكون 8 خانات وخليط من الارقام والحروف الصغيرة والكبيرة والرموز" /></td> </tr> <tr> <td colspan="2"> <asp:Button ID="btnLogin" runat="server" Text="تسجيل دخول" CssClass="button" OnClick="btnLogin_Click"/></td> </tr> </table> <br /> <asp:Label ID="lbMessage" runat="server" CssClass="lableMsg"></asp:Label> </div>  
     
    الكود بداخل زر تسجيل الدخول (btnLogin)
    C#
    protected void btnLogin_Click(object sender, EventArgs e) { try { SqlParameter[] parameters = new SqlParameter[]{ new SqlParameter("@Username",txtUsername.Value), }; // الحصول أولا على معلومات المستخدم من خلال الاستعلام بإسم المستخدم DataTable userInfo = SQLHelper.ExecuteQuery("SELECT * FROM UsersAccounts WHERE [email protected]", CommandType.Text, parameters); if (userInfo == null || userInfo.Rows.Count <= 0) lbMessage.Text = "اسم المستخدم أو كلمة المرور غير صحيحة"; else { string salt = userInfo.Rows[0]["Salt"].ToString(); string hashedPassword = userInfo.Rows[0]["HashedPassword"].ToString(); if (SaltedPassword.VerifyPassword(txtPassword.Value, salt, hashedPassword)) lbMessage.Text = "تم تسجيل الدخول بنجاح"; else lbMessage.Text = "اسم المستخدم أو كلمة المرور غير صحيحة"; } } catch (Exception ex) { EventsLogger.SaveToLog(ex.Message); lbMessage.Text = "حدث خطأ أثناء تسجيل الدخول"; } } VB.Net
    Protected Sub btnLogin_Click(sender As Object, e As EventArgs) Try Dim parameters As SqlParameter() = New SqlParameter() {New SqlParameter("@Username", txtUsername.Value)} ' الحصول أولا على معلومات المستخدم من خلال الاستعلام بإسم المستخدم Dim userInfo As DataTable = SQLHelper.ExecuteQuery("SELECT * FROM UsersAccounts WHERE [email protected]", CommandType.Text, parameters) If userInfo Is Nothing OrElse userInfo.Rows.Count <= 0 Then lbMessage.Text = "اسم المستخدم أو كلمة المرور غير صحيحة" Else Dim salt As String = userInfo.Rows(0)("Salt").ToString() Dim hashedPassword As String = userInfo.Rows(0)("HashedPassword").ToString() If SaltedPassword.VerifyPassword(txtPassword.Value, salt, hashedPassword) Then lbMessage.Text = "تم تسجيل الدخول بنجاح" Else lbMessage.Text = "اسم المستخدم أو كلمة المرور غير صحيحة" End If End If Catch ex As Exception EventsLogger.SaveToLog(ex.Message) lbMessage.Text = "حدث خطأ أثناء تسجيل الدخول" End Try End Sub  
    ويكون شكل البيانات في الجدول كالتالي:

     
    الخلاصة:
    موضوع حماية بيانات المستخدمين متشعب كما نلاحظ في بعض النقاط السابقة. حاولت التركيز على الموضوع الرئيسي وهو استخدام الـ Salted Password Hashing وتم المرور على بعض المفاهيم الأخرى التي بعضها الحقيقة يحتاج إلى موضوع مستقل ولكن نسأل الله التيسر حتى استطيع شرح بعض هذه المفاهيم في مواضيع أخرى مثل Rainbow table  أو password-based key derivation function.
    خلاصة هذه الموضوع التركيز على هذه النقاط.
    -         عند تسجيل بيانات المستخدمين مثل كلمة المرور يجب أن لا تُقبل كلمات المرور القصيرة أو السهلة يفضل إجبار المستخدم على كلمة مرور معقدة.
    -         استخدم الـ Salted Password Hashing.
    -         العمل بالنقاط الموجودة في جزئية نصائح مهمة عند عمل  Salted Password Hashingالموجودة بالاعلى.
     
    مراجع للإطلاع:
    -      Salted Password Hashing - Doing it Right
    https://www.codeproject.com/Articles/704865/Salted-Password-Hashing-Doing-it-Right
    -      How Rainbow Tables work
    http://kestas.kuliukas.com/RainbowTables
    -      Rainbow Tables
    https://stichintime.wordpress.com/2009/04/09/rainbow-tables-part-1-introduction
    -      PBKDF2
    https://en.wikipedia.org/wiki/PBKDF2
    -      Key Derivation Function
    https://en.wikipedia.org/wiki/Key_derivation_function
     
    تمت بحمد الله.
     
    التطبيق في المرفقات
    Demo.rar
     
    Talal Almutairi
    https://twitter.com/talalsql
    مستوى المقال: متوسط
  9. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
    الفائزون في شهر May-2017
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  10. السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
    الفائزون في شهر April-2017
    المقال الفائز:
     
    المقال الفائز:
     
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ
  11. في هذا المقال سنبرمج سوياً تطبيق يعمل على جميع الهواتف باستخدام منصة زامرن Xamarin. التطبيق ببساطة سيقوم بتحويل الرقم الذي يدخله المستخدم إلى رقم روماني.
    في البداية، يمكنك استخدام زامرن من خلال زامرن ستديو أو كإضافة في برنامج فيجوال ستديو وهو ما سنستخدمه في هذا المقال. يمكنك الاطلاع على هذا الفيديو لمعرفة طريقة التحميل.
     
    إنشاء التطبيق
    من شريط الأدوات، اختر File، ومن ثم اضغط New Project. بعد ذلك، من قائمة Cross-Platform اختر تطبيق (Cross-Platform App (Xamarin.Forms or Native، وسنسمي المشروع “RomanNumerals”

    ستظهر لك هذه النافذة تلقائياً، تأكد من اختيار Xamarin.Forms و PCL بالإضافة إلى Blank App كما في الصورة:

    بعد الانتهاء من إنشاء المشروع، ستلاحظ من مستعرض الملفات في الجهة اليمنى بأن المشروع يحتوي على 3 مجلدات، الأول Portable مشترك، والثاني لأجهزة الأندرويد، والثالث لأجهزة الآيفون. وقد يظهر لك مجلد آخر أيضاً لأجهزة الويندوز.

    سأجرب التطبيق الآن على جهازي سامسونج  بالضغط باليمين على مجلد الأندرويد RomanNumerals.Droid واختيار Set as StartUp project. ثم الضغط على زر التشغيل كما في الصورة:

    في حال واجهتك مشاكل في تشغيل التطبيق على جوالك فأنصحك بالرجوع إلى هذا الفيديو، كما يمكنك تشغيله على محاكي في الكمبيوتر باتباع هذه الطريقة.
    هذه صورة من التطبيق بعد تشغيله على الجوال:

    نعود إلى ملفات المشروع: في المجلد الأول (Portable) نقوم بكتابة الكود مرة واحدة ليعمل في جميع الأنظمة، لكن مستقبلاً ربما تحتاج استخدام المجلدات الأخرى لكتابة كود مخصص لأحد الأنظمة، أو للاستفادة من أحد المميزات التي تتوفر على نظام واحد فقط.
    في المجلد المشترك يوجد ملفين من نوع .xaml، هذه الملفات تحتوي على كود يشبه كود XML لتصميم الواجهات. عند الضغط على السهم بجانب الملف، سيظهر لك ملف بنفس الاسم من نوع cs. يحتوي على الكود البرمجي الخاص بالتنفيذ.
    ملف App هو الملف الأساسي الذي سيبدأ منه البرنامج التنفيذ، ولكل ملف واجهة أو صفحة Page. وداخل هذا الملف الأساسي App.cs وُضعت الصفحة الرئيسية للتطبيق = MainPage.xaml:
    MainPage = new RomanNumerals.MainPage(); لنلقي نظرة على تصميم الصفحة الرئيسية MainPage.xaml:
    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:RomanNumerals" x:Class="RomanNumerals.MainPage"> <Label Text="Welcome to Xamarin Forms!" VerticalOptions="Center" HorizontalOptions="Center" /> </ContentPage> باختصار تحتوي على صفحة من نوع ContentPage، وهذه الصفحة تحتوي على عنوان Label، نص العنوان= Welcome to Xamarin Forms! والنص يتوسط الصفحة أفقياً وعمودياً.
     
    تصميم واجهة التطبيق
    لتصميم تطبيق تحويل الأرقام سنحتاج لتعديل الصفحة بإضافة ثلاثة عناصر:
    Entry لنأخذ إدخال المستخدم Button زر يضغطه المستخدم بعد إدخال الرقم Label نكتب فيه النص أو الرقم الروماني بعد التحويل سنضع هذه العناصر في قالب StackLayout لتكون مرتبة فوق بعضها البعض.
    بالتالي استبدل كود الصفحة الرئيسية MainPage.xaml بهذا:
    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:RomanNumerals" x:Class="RomanNumerals.MainPage"> <StackLayout VerticalOptions="Center" Padding="20,0,20,0" Spacing="20"> <Entry x:Name="userEntry" /> <Button x:Name="doneButton" Text="موافق"/> <Label x:Name="resultLabel" Text="هنا ستظهر النتيجة" HorizontalOptions="Center"/> </StackLayout> </ContentPage> لاحظ أننا أعطينا كل عنصر اسم x:Name حتى نتمكن من استخدامه في الكود التنفيدي في MainPage.cs.
    جرب تشغيل البرنامج الآن! من المفترض أن تكون الشاشة كما هي فالصورة:

     
    برمجة التطبيق
    انتهينا من تصميم التطبيق، لكن لو ضغطت زر موافق لن تظهر لك أي نتيجة لأننا لم نبرمجه بعد.
    في ملف MainPage.cs مباشرة تحت 
    using Xamarin.Forms; أضف 
    using Xamarin.Forms; وتحت ()InitializeComponent أضف السطر التالي:
    doneButton.Clicked += DoneButton_Clicked; والذي بدوره ينفذ الدالة DoneButton_Clicked كلما ضغط المستخدم الزر الذي أسميناه سابقاً doneButton من خلال x:Name في MainPage.xaml.
    بعد القوس {، وقبل أن نعرف الدالة التي ستُنفَّذ عند ضغطة الزر، أضف الدالة المسؤولة عن تحويل الرقم:
    public static string ToRoman(int number) { if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); if (number < 1) return string.Empty; if (number >= 1000) return "M" + ToRoman(number - 1000); if (number >= 900) return "CM" + ToRoman(number - 900); //EDIT: i've typed 400 instead 900 if (number >= 500) return "D" + ToRoman(number - 500); if (number >= 400) return "CD" + ToRoman(number - 400); if (number >= 100) return "C" + ToRoman(number - 100); if (number >= 90) return "XC" + ToRoman(number - 90); if (number >= 50) return "L" + ToRoman(number - 50); if (number >= 40) return "XL" + ToRoman(number - 40); if (number >= 10) return "X" + ToRoman(number - 10); if (number >= 9) return "IX" + ToRoman(number - 9); if (number >= 5) return "V" + ToRoman(number - 5); if (number >= 4) return "IV" + ToRoman(number - 4); if (number >= 1) return "I" + ToRoman(number - 1); throw new ArgumentOutOfRangeException("something bad happened"); } هذه الدالة ستأخذ رقم وستعيد لنا نص الترقيم الروماني المكافئ للرقم. بالتالي عندما يضغط المستخدم الزر، نريد أن نرسل لها نص المحتوى الذي أدخله -مُحولاً إلى رقم-، ثم سنجعل نص النتيجة في الشاشة يساوي النص الذي يرجع من الدالة.
    فنضيف هذه الدالة كخطوة أخيرة:
    private void DoneButton_Clicked(object sender, EventArgs e) { resultLabel.Text = ToRoman(Convert.ToInt16(userEntry.Text)); } ليصبح كامل الكود بهذا الملف كالتالي
    using Xamarin.Forms; using System; namespace RomanNumerals { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); doneButton.Clicked += DoneButton_Clicked; } public static string ToRoman(int number) { if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); if (number < 1) return string.Empty; if (number >= 1000) return "M" + ToRoman(number - 1000); if (number >= 900) return "CM" + ToRoman(number - 900); //EDIT: i've typed 400 instead 900 if (number >= 500) return "D" + ToRoman(number - 500); if (number >= 400) return "CD" + ToRoman(number - 400); if (number >= 100) return "C" + ToRoman(number - 100); if (number >= 90) return "XC" + ToRoman(number - 90); if (number >= 50) return "L" + ToRoman(number - 50); if (number >= 40) return "XL" + ToRoman(number - 40); if (number >= 10) return "X" + ToRoman(number - 10); if (number >= 9) return "IX" + ToRoman(number - 9); if (number >= 5) return "V" + ToRoman(number - 5); if (number >= 4) return "IV" + ToRoman(number - 4); if (number >= 1) return "I" + ToRoman(number - 1); throw new ArgumentOutOfRangeException("something bad happened"); } private void DoneButton_Clicked(object sender, EventArgs e) { resultLabel.Text = ToRoman(Convert.ToInt16(userEntry.Text)); } } } لقد انتهينا من برمجة التطبيق وأصبح جاهزاً للاستخدام! 😀

    إذا أردت تحميل التطبيق كاملاً، فبإمكانك تحميله من هنا.
    مستوى المقال: مبتدئ
  12. السلام عليكم ورحمة الله وبركاته 
    كيف تؤسس موقع WordPress على Google Cloud Platform (خطوة بخطوة)
    Goole Cloud Platform هي خدمة حوسبة في السحاب تقدمها Google تقدم استضافة على البنية الأساسية الداعمة التي تستخدمها Google داخليا لمنتجات المستخدمين مثل بحث غوغل و يوتيوب. منصة سحابية توفر منتجات للمطور لبناء مجموعة من البرامج من مواقع بسيطة لتطبيقات معقدة.
    اولا لماذا Google Cloud Platform ؟ 
    Google Cloud Platform  
    يتميز بثلاثة أمور: 
    ١- بنية تحتية آمنه
    آمنة وعالمية وعالية الأداء وفعالة من حيث التكلفة و في تحسن دائم و مستمر.
    ٢-  تأخذ تحليل البيانات على محمل الجد 
    تمكنك من الاستفادة من البيانات الكبيرة للعثور على إجابات أسرع وبناء منتجات أفضل.
    ٣-  الخوادم:
    تنمو من النموذج الأولي prototype إلى الإنتاج production على النطاق العام planet-scale، دون الحاجة إلى التفكير في الإمكانيات، والموثوقية و الأداء.
     
    لابد للحديث عن تكلفة انشاء حساب في Google Cloud Platform في بادئ الأمر:
    - اول ٦٠ يوم مجاناً ولكن فيما بعد تكون التكلفة على حسب السعة المستخدمة من Cloud Platform وفي المعدل يتم خصم ٢٥ دولار لكل شهر اي ما يعادل ٣٠٠ دولار في السنه 
    السؤال: هل هي تستحق ذلك ؟ 
    الإجابه: نعم!
     
    لنبدأ الشرح ..
    أولا: يجب أن تقوم بإنشاء حساب بريد التروني في Gmail جديد يخص المشروع غير البريد الذي تستخدمه، لماذا؟ لأن البريد الذي تفعل فيه مشروعك سيكون Public بكل المعلومات الذي يحتويه
    ثانياً: تقوم بالدخول على https://console.cloud.google.com و تختار Try It 
    ثالثاً: بعد تعبئة مايلزم من المعلومات سنقوم بإنشاء اول مشروع كما يلي 
     
    أ)  انشاء مشروع :
    - اختر: Create Project 
     

     
    - بعد انشاء المشروع اذهب لقائمة Compute Engine ثم VM instances  للبدأ بضبط الاعدادات الVirtual Machine Instances

    - حدّث project instances

     
    - اختر SSH واكتب الكود الاتي
    اولا: ( لتعطي الامر ك Super User ) * في كل مرة نريد تحديث او تغيير امر يجب اولاً كتابة امر الدخول ك Super User
    sudo su - ثانياً : لتحميل اخر تحديث ل ال instances: 
    APT-get update نحن الان عملنا تحديث updated 
    ويمكننا الان تعديل القيم الخاصة باعدادات php :
    كيف؟
    اولا: بكتابة :
    sudo nano /etc/php5/apache2/php.ini  
    - ثم نبدأ بتغيير ال Memory Limit وسرعة الإستجابة اقترح تغيير القيم كالآتي: 
    ;;;;;;;;;;;;;;;;;;; ; Resource Limits ; ;;;;;;;;;;;;;;;;;;; ; Maximum execution time of each script, in seconds ; http://php.net/max-execution-time ; Note: This directive is hardcoded to 0 for the CLI SAPI max_execution_time = 180 ; Maximum amount of time each script may spend parsing request data. It's a good ; idea to limit this time on productions servers in order to eliminate unexpectedly ; long running scripts. ; Note: This directive is hardcoded to -1 for the CLI SAPI ; Default Value: -1 (Unlimited) ; Development Value: 60 (60 seconds) ; Production Value: 60 (60 seconds) ; http://php.net/max-input-time max_input_time = 180 ; Maximum input variable nesting level ; http://php.net/max-input-nesting-level ;max_input_nesting_level = 64 ; How many GET/POST/COOKIE input variables may be accepted ; max_input_vars = 1000 ; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = 1024M ;;;;;;;;;;;;;;;;; ; Data Handling ; ;;;;;;;;;;;;;;;;; ; Maximum size of POST data that PHP will accept. ; Its value may be 0 to disable the limit. It is ignored if POST data reading ; is disabled through enable_post_data_reading. ; http://php.net/post-max-size post_max_size = 512M ;;;;;;;;;;;;;;;; ; File Uploads ; ;;;;;;;;;;;;;;;; ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 512M ; Maximum number of files that can be uploaded via a single request max_file_uploads = 1000 ولحفظ القيم الجديدة:  ctrl+X 
    ثم عليك كتابة هذا الأمر لتحديث نسخة apache2 مع الاعدادات والقيم الجديدة التي قمت بها
    sudo service apache2 restart  
     
     
    - اخيراً وليس آخراً سنقوم الان بتنصيب Wordpress :
    أولا: الذهاب للقائمة الجانبية API Manager > Library 
    اختر Google Cloud APIs > Cloud Deployment Manager API كما في الصورة:

    ثم: اختر  ENABLE

    ثم : اختر : Start with a prebuilt solution to continue.

     
    ثانياً: من القائمة الجانبيه اختر Cloud Luancher
    - وابحث عن WordPress من قائمه CMS او عن المنصة التي ترغب بالعمل عليها

    - انقر على Launch on Compute Engine

    بعد كذا تتابع الخطوات وتختار Deploy ويظهر لك نموذج لتعبئة المعلومات الخاصة بموقعك وماتحتاج له من سعه وغيره وهنا ما اقترحه لك:

    - اختر Deploy WordPress للبدأ بالتحميل
    - بمجرد الانتهاء من التحميل ستأخذك الصفحة الى Deployment information وفيها المعلومات الخاصة بموقعك من: WordPress administrator username and password,
     MySQL administrator password,
    and phpMyAdmin username
    ويمكنك الان البدأ ببناء موقعك بنجاح ..
    ويمكنك مشاهدة الفديو لفهم كامل المقال بشكل اسهل واسرع
     
    تحياتي:
    لمياء الشمري 
    مستوى المقال: مبتدئ

عالم البرمجة

عالم البرمجة مقالات برمجة و دورات مجانية لإحتراف البرمجة هدفنا تبسيط البرمجة ونشرها بيد الكل بشكل ممتع ومتطور ومحدث بإستمرار لمواكبة جديد تطورات البرمجة الحديثة و المتقدمة بدون مقابل