Regular Expressionsالتعابير القياسية أو

 التعابير المنتظمة أو التعابير القياسية كما تم تعريبها هي عبارة عن نص خاص يعبر عن نمط معين من النص للبحث عنه ، مثلاً لو لديك نص طويل (كتاب مثلاً) و تريد أن تبحث عن جميع التواريخ الموجودة في الكتاب ، لنفرض مثلا أن لديك كتاب الرحيق المختوم و طُلب منك استخراج جميع التواريخ الهجرية و الميلادية اللتي في الكتاب كاملاً، و من حسن حظك أن الكتاب جاء بنسخة الكترونية (أو ملف .txt للسهوله) ، و أيضا من حسن حظك انك مبرمج و تستطيع كتابة برنامج لذلك، ماللذي ستكتبه؟ هل ستبحث كلمة كلمة و تختبرها اذا كانت رقم و يتبعها كلمة ميلادي أو هجري أم لا؟ هل ستكتب شيئًا مثل:

String result = ""; int i = 0; for(char c: word.toCharArray()) { if(Character.isDigit(c)) result += c; else if( i==word.length && (c == 'ه' || c == 'م' || c == 'ـ')) result += c; i++; }

هذا مثال عن برنامج يبحث في كل كلمة في الكتاب و يختبر هل هي رقم أو لأ و ثم يختبر هل يتبعها حرف “ه” أو “م” أو “ـ” (المد للحرف) و ثم يضيفة للحل، بما أن المشاكل اللتي تتعلق بالنصوص كثيرة في عالم كمبيوتر و يصعب معالجتها بسهولة لجأ المبرمجون لأبتكار حل في كيفية التعبير عن نمط معين في نص (مثل التاريخ في المثال أعلاه) لتسهيل البحث عنه و هي الـRegular Expressions أو التعابير القياسية، رجوعًا لمثالنا سيكون الحل كالتالي:

word.match("\\d{1,4}(م|ه|هـ|ميلادي|هجري)")

التعابير المنتظمة اذن هو النص اللذي في داخل الـword.match اللذي  يعبر عن بحث “كل كلمة تبدأ برقم طوله من رقم 1 الى 4 ارقام، و ثم يأتي بعدها أي من ’م’ أو ’ه’ أو ’هـ’ أو ’ميلادي’ أو ’هجري’.

أرجو ان المثال كان مقنع لكي تبدأ باستخدامها في حياتك البرمجية، و شخصيًا فادتني كثيرا في بعض البرامج اللتي تتأكد من ادخال ارقام و غيرها، و عفتني من كتابة أسطر و أسطر من الكود لمعالجة String معين.

 

 

لكي تتعرف على التعابير المنتظمة يجب أن تتعلم أساسياتها، و بكل سهولة اذا وضعت في التعبير أي حرف أو رقم سيتم مطابقته مثل اذا كان التعبير “ac” سيتم مطابقة أي نص من “ac” ، ولكن يوجد رموز خاصة تطابق أشياء أخرى، مثل اللتي موجودة في الجدول التالي:

الحرف وظيفته مثال
d\ يطابق أي رقم مره واحده يطابق “1” ، “3”
. (نقطة) يطابق أي شيء، من أرقام حروف أو رموز “3” ، “k” ، “#”
[ac34] يطابق أي شيء داخل الأقواس [ ] “a” “4”
Ammar^ علامة ^ تعني البداية، و هذه ستطابق أي Ammar مكتوبه في بداية السطر. ammar

Ammar

my name is Ammar

s\ سيطابق أي مسافه موجوده في نص Hi my name is Ammarسيطابق كل اللي في الأحمر
$Ammar يطابق أي كلمة في نهاية السطر ammar

Ammar

my name is Ammar

abc|def العلامة “|” تعني “أو”، اذن فالتعبير سيطابق أي نص يحتوي على abc  أو def  
*a تعني تكرار من ولا مرة الى مالانهاية aaa

aaaaaaaaaaaaa

?aab و هي علامة اختيارية تعني مره واحدة او ولا مره aa

aab

+a تطابق تكرار الحرف مره أو أكثر a

aa

aaa

aaaaaaa

[a-e]

[2-6]

[qwe]

تعريف لمجموعة من الرموز اللتي تستطيع استخدامها، مثلا [a-e] يطابق الحروف من a الى e، و الثاني يقبل الأرقام من 2 الى 6 فقط، و الثالث سيطابق الحروف الثلاثة فقط.  

و يوجد غير الجدول اللذي سبق ذكره رموز كثيرة أخرى تغطي الكثير من احتياج البحث في النصوص، قد يعاني المبتدئون من فكرة معينه في التعابير القياسية، و هي كيفية مطابقة نص اذا كان رقم من 1 الى 50 مثلا، أي مبتديء سيعتقد انها ستحل باستخدام التعبير التالي:

[1-50]

تعبير 1

بشكل عام هذا التعبير شكله جدا مألوف و قد تعتقد أن هذا الحل صحيح، لكن للأسف هذا لا يعني ما تعتقده، التعابير المنتظمة لا تعرف الأرقام كأرقام، انما تتعرف عليها كرموز ببغض النظر عن معنى الرقم، بعد أن تعرف هذه الحقيقة يجب أن تفكر مثل ما هي تراها، حيث أن التعبير في (تعبير 1) يعني “المجموعة اللتي تحتوي على الأرقام من 1 الى 5 بالأضافة الى الرقم صفر” يعني النص “1” سيتم مطابقته بالاضافة الى “2” و “0” و “3” و لن يقبل “50”، لتقبل رقم من 1 الى 50 سيكون التعبير كالتالي:

[1-9]|[1-4][0-9]|50

حيث اول مجموعة [9-1] سيغطي الأرقام من 1 الى 9، و المجموعة الثانية [1-4][0-9] ستغطي الأرقام من 10 الى 49 و الأخير سيغطي الرقم 50.

بعد هذه المقدمة المتواضعة عن التعابير القياسية أريد أن أشارككم ببعض التعابير اللتي أتوقع أنها ستفيدكم في عملكم خاصة لمطوري الويب عند التعرف على مدخلات مستخدمين، أرجو من القرّاء الذين قد استخدمو تعابير يتوقعون أن غيرهم قد يستفيد منها أن لا يبخل علينا منها:

التعبير الاستخدام الفورمات
(0[1-9]|[1-2][0-9]|30)-(0[1-9]|1[0-2])-\d{4} التعرف على التاريخ الهجري. dd-mm-yyyy
05\d{8} التعرف على جوال سعودي 0567846879
[1-2]\d{9} التعرف على رقم الهوية 1234567890

 

المراجع

  • http://www.regular-expressions.info: هذا الموقع يعتبر مرجع للتعابير القياسية
  • http://regexlib.com/ يوجد في هذا الموقع مجموعة كبيرة من التعابير القياسية الجاهزة للاستخدام مثل تعابير العناوين و البريد الالكتروني و غيرها، و الجيد في الموقع انه يوجد تعليقات و نظام تقييم ممتاز ، و ميزة أخرى انه من السهل مشاركة الآخرين بالتعابير اللتي تتوقع انها ستفيد غيرك.
  • http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/1565922573 كتاب يستحق الشراء ، يتكلم عن الموضوع بتعمق.

هندسة البرمجيات Software Engineering

بما أني سأكتب كثيرًا عن هندسة البرمجيات في المدونة، لماذا لا أعرفها أولا؟ ولكن قبل ذلك يجب أن اتكلم عن مصلح الـSoftware

ماهو الـSoftware

قد يختلط على كثير من الناس مصطلحين في الحاسب و هما Program و Software.
في اللغة العربية توجد كلمة ترادف Program و هي "برنامج" كما يعرف جميعكم ، و لكن Software لا يوجد لها مرادف "دقيق" في اللغة العربية، المرادف الوحيد اللذي يستخدم هو "برمجيات"، و شخصيًا لم اقتنع به كثيرًا.

رجوعًا إلى المصلحين Program و Software مصطلح Software هو اعم من Program لأنه يحتوي الـProgram بالاضافة الى أشياء أخرى: 
1- البرنامج (أو Program): قد يكون برنامجًا واحدًا أو أكثر من برنامج.
2- المستندات: المستندات تكون عبارة عن أكثر من مستند، مثل مستندات النظام (أو System Documents)، و هي اللتي تحتوي على هيكل البرنامج Structure و تصميمة Design و متطلباته Requirements، و ايضا على دليل المستخدم اللتي تشرح طريقة استخدام البرنامج.
3- الاعدادات: الأعدادات اللتي تخص البرنامج و اللتي تجعله يعمل بشكل صحيح. مثال على الأعدادات مثل ملفات فايرفوكس اللتي تغير اعدادات المتصفح، قد تعرفونها كـabout:config و هي الأعدادات اللتي تستطيع منها تعديل العديد من خيارات الفايرفوكس.

Software

 

ماهي هندسة البرمجيات Software Engineering؟

هندسة البرمجيات هي
فرع من فروع الهندسة اللتي تهتم بجميع جوانب انتاج البرامج، من مرحله مبكرة (مواصفات البرنامج/ System Specifications) الى مرحلة المراقبة و الصيانة (System Maintenance).
و من هذا التعريف يجب أن نستوضح نقطتان مهمتان و هما:
1 – فرع من فروع الهندسة: المهندسون بشكل عام يجعلون الأشياء تعمل بغض النظر عن الطريقة أو الأسلوب المتبع، و دائمًا يحاولون ايجاد الحلول للمشاكل حتى لو لم يكون هناك نظريات او اساليب لحل المشكلة و عادة هذه الحلول تكون تقريبية و ليست حاسمة، و المهندسون يعملون تحت قيود تنظيمية و مالية عادةً، فيبحثون عن الحلول في هذه القيود، مثلًا لو في أحد المشاريع واجه المهندس مشكلة، و حلها يكلف أكثر من ما يستطيع المشروع تحمله، سيكون الحل غير جيد و غير مجدي و يجب ايجاد حل آخر.

2- جميع جوانب انتاج البرنامج: هندسة البرامج لا تهتم فقط بالجوانب التقنية بصناعة البرامج، بل تمتد الى ما هو اكثر من ذلك، كادارة المشاريع، و تطوير الادوات و اساليب و نظريات لمساندة صناعة البرامج.

عمومًا هندسة البرمجيات تتبنى منهجية نظامية و مرتبة للعمل، ﻷن هذه أكثر طريقة فعالة ﻷنتاج برامج عالية الجودة، و لكن الهندسة تعنى باختيار افضل الطرق المناسبة لبعض الحالات، و بعض الحالات هذه تحتاج ابداعية و تقليل الرسمية في انتاج البرامج، و من هذه الحالات هي برمجة تطبيقات الويب أو برمجة اجهزة الهواتف النقالة كالـiPhone و غيرها اللتي تعتمد على ابداع و تفكير خارج عن العادة، مثل الفن.

كيف يتم بناء البرامج بنظرة مهندس البرمجيات؟

SDLC

من أهم مجالات هندسة البرمجيات هي دورة تطوير البرمجيات (Software Develepment Life Cycle) و هي المنهجية المتخذة في تطوير البرامج و كيفية عملها. يوجد الكثير و الكثير من انواع لهذه الدورة، و هي بشكل عام تأخذ نفس المراحل (كما في الرسم) و لكن باختلافات لكل عملية. يطول الحديث عن هذه الدورات في هنا، قد يكون من الأنسب جعل تدوينة أو عدة تدوينات لهذا الموضوع.
 

قد يتبادر الى ذهن البعض (ما هو الفرق بين هندسة البرمجيات و علوم الحاسب؟)

علوم الحاسب بشكل عام يهتم بالنظريات و الطرق اللتي تكمن وراء الحاسب كعتاد (Hardware) و برمجيات، و هندسة البرمجيات يهتم بالجانب العملي من مشاكل انتاج البرامج، فمعرفة في علوم الحاسب ضرورية لمهندس البرمجيات كضرورة معرفة المهندس الكهربائي للفيزياء.

secs

علاقة هندسة البرمجيات بهندسة النظم جدا قوية، هندسة البرمجيات أكثر تخصصًا من هندسة النظم، حيث يهتم مهندس النظم بتطوير و تطوّر الأنظمة المعقدة اللتي تكون البرنامج جزءًا مهما منها عادةً.

SECSSE

اهلا بالعالم!

اهلا و سهلا بكم اعزائي القراء في مدونتي :)
بعد تفكير عميق و عدة نقاشات مع اصدقائي و 200 ريال و 13 ساعة لاحقا ، فتحت مدونتي!
لم يكن قرار سهلا و ترددت كثيرا ، لكن بحمد الله اقتنعت بفتح مدونة شخصية لي.
لم أحدد ماذا سيكون توجه المدونة في كثير من المحاور ، ﻷني في مرحلة التفكير بها لكني استطيع ان اوضح لكم ما افكر فيه عن طريق سؤال نفسي.
هل ستكون المدونة باللغة العربية الفصيحة؟
لا اعتقد اني سأتكلم اللغة العربية الفصيحة دائما ، يجب أن “أشطح” قليلا و اتكلم عامي.
ما هو توجه المدونة؟ تقني؟ اجتماعي؟ سياسي؟ رياضي؟ سياحي؟
ستصبح المدونة مرتع ﻷهتماماتي في جميع المجالات ، و أنا شخص تقني و فتحت هذه المدونة للمواضيع التقنية و البرمجية ، و هذا لا يمنع من وجود تدوينات من مواضيع اخرى تهمني.
ما هي اهدافك اللتي تريد ان تحققها من لمدونتك؟
اهدافي في هذه المدونة كالتالي:
1- تطوير كتابتي: الكتابة مهارة أساسية و يجب تعلمها وأنا شخصيا لا يعجبني مستوى كتابتي الحالي فأردت تطويره ، و بالاضافة ان الكتابة تطور طريقة التفكير و الحديث للكاتب و تسهل عليه التعبير و ذلك بتعلم مفردات و تطوير تركيبها في جمل.

2- تعليم نفسي: لمواضيع طالما اردت تعلمها، ﻷكتب مواضيع في المدونة ، يجب أن أتعلم الكثير في المواضيع اللتي أريد أكتب عنها. (يعني تعليم
بالغصب)

3- لاحظت في جميع المدونات العربية التي تهتم بالتقنية أن معظمها لا تتطرق لهندسة البرامج مع انها من اهم المواضيع في تطوير البرامج ، فقلت “لماذا لا أغطي هذا الجانب؟”
4- نوع من الانجاز الشخصي.