الثلاثاء، 31 مارس 2009

الحلقة الثانية من دوت نت عربي

اليوم نشرت الحلقة الثانية من بود كاست دوت نت عربي مع صديقنا العزيز محمد سالم محمد سالم و محمد كان نشيطا في الفترة الماضية بإعطاء مجموعة من المحاضرات في Jordev  ( الموقع سيجهز في الاسبوعين القادمين بإذن الله ) مجتمع مطوري دوت نت في الأردن عن ال Enterprise Library .

أرجوا ان تستمتعوا بالحلقة.

الأحد، 29 مارس 2009

تلمبحات سي شارب #1

واحدة من المهام التي نحتاج لها خلال البرمجة هي معالجة النصوص (string manipulation )  هي عملية وصل و قطع و تعديل مجوعات النصوص مع بعضها البعض. و هنا أتكل مع عن جمع النصوص في الدوت نت هناك اكثر من طريقة لنستخدم هذه الخاصية و هي كالتالي علما باني ما يوجد هنا ينطبق على علميات معالجة النصوص الأخرى و أستخدمت الجمع كمثال لأشرح الموضوع.

  • الطريقة الأولى عملية الجمع +.

هناك خاصية بالسي شارب تسمى (Operators Overloading ) حيثم يتم أعطاء وظائف أخرى لمعاملات الجمع والطرح و القسمة التي تعمل مع الارقام فقط, لكن في الدوت نت تم إعطائها وظائف اخرى و بالتالي نستطيع إستخدامها مع متغيرات النصوص (string variables ). نقوم بإستخدام معامل الجمع + لجمع نصين مختلفين ليصبحوا نصا واحدا كما هو واضح في المثال ادناه.

string firstStr = "FirstString";

string secondStr = "SecondString";

string result = firstStr + " " + secondStr;

نتيجة السطر الثاث هو تخزين القيمة التالية “FirstString SecondString” في المتغير result .



  • الطريقة الثانية نستخدم الدالة العامة String.Concat




حيث يوجد في الدوت نت بعض الدوال العامة المعرفة في فئات الأنواع (Class Type) الخاصة بها فمثلا الفئة ( Class ) التي تمثل النوع string  هي String و بها تم تعريف عدد من الدوال (Method) المميزة بكونها Static و هذا النوع من المتغيرات و الدوال نستطيع أستخدامة والوصول إلية بدون إنشاء كائن (Instantiate an Object) على عكس المتغيرات و الدوال العادية.



لنعد إلى موضوعنا نستطيع ان نستخم هذه الدالة لجمع متغيرين أو أكثر و ممكن أن نستخدمها لجمع المتغيرين السابقية firstStr و المتغير secondStr كالتالي.



 



string concatResult = String.Concat(firstStr, secondStr);



  • الطريقة الثالثة : أستخدام فئة StringBuilders . و هي فئة موجودة في ال namespace الذي يدعى System.Text و هي شبية جدا بالنوع string إذ انها تنشئ سلسلة نصية من الأحرف والرموز لكن الفرق الوحيد بينها و بين النوع string يكمن في أن الكائن الذي تنتجه قابل للتغير إذ أن الكائنات الناتجة من النوع string غير قابلة للتغير مطلقا هذا الفرق سنبين أهميتة فيما بعد و لأريكم الان كيف تستخدمو هذه الفئة في المثال التالي.





    StringBuilder sb = new StringBuilder();

    sb.Append(firstStr);

    sb.Append(secondStr);

    Console.WriteLine(sb);


     



    حيث نعرف كائن جديد من نوع StringBuilder و نستخدم الدالة Append لكي نغير النص المخزن فيها و نظيف له كما في السطر الثاني و الثالث ثم نخرجه للطباعة.



    حسنا ها قد عرفنا الطرق المختلفة لعملية جمع النصوص و معالجتها, إذا ما الفرق بين العمليات الثلاث؟ الفرق يكمن في السرعة.



    فكما عرفنا سابقا أن النوع String غير قابل للتغير أي Immutable و هذا يقود لمشكلة في السرعة عند إستخدامه, إذ أننا عند محاولة تغير الكائن الخاص به مثل عملية الجمع أو تغير القيمة فإن ما تقوم به بيئة تشغيل الدوت نت هو إنشاء مساحة جديدة على الذاكرة و وضع القيم الجديدة بها و تغير مؤشرات القيم إليها. لذلك تشعر أنها لم تغير شيئا أما في الحالتين الاخريين على الرغم من أن الكائن من نوع stringغير قابل للتغير من قبلنا إلا أنه ليس كذلك بالنسبة لمكتبات الدوت نت نفسها إذ انها تستطيع التغير به كما تشاء.



    و لأثبت ذلك قمت بكتابة برنامج يقوم بفحص السرعة للثلاث طرق و هو ببساطة  جمله دوران ل 100000 مرة كيث أجمع أكون نص من قيمة الأرقام المتولدة و هذا هي الشفر المصدرية للبرنامج.



    using System;
    using System.Text;

    namespace ConsoleApplication1
    {
    class Program

    {
    static void Main(string[] args)

    {

    string firstStr = "FirstString";

    string secondStr = "SecondString";

    //string result = firstStr + " " + secondStr;

    //Console.WriteLine(result);

    string str="";

    DateTime firstTime = DateTime.Now;

    for (int i = 0; i <= 100000; i++)

    {

    str += i;

    }

    DateTime secondTime = DateTime.Now;

    Console.WriteLine("for spend this time:" + (secondTime - firstTime).ToString());

    string concatResult = String.Concat(firstStr, secondStr);

    str = "";

    firstTime = DateTime.Now;

    for (int k = 0; k <= 100000; k++)

    {

    String.Concat(str,k.ToString());

    }

    secondTime = DateTime.Now;

    Console.WriteLine("for spend this time String.Concat :" + (secondTime - firstTime).ToString());

    StringBuilder sb = new StringBuilder();

    firstTime = DateTime.Now;

    for (int j = 0; j <= 100000; j++)

    {

    sb.Append(j.ToString());

    }

    secondTime = DateTime.Now;

    Console.WriteLine("for spend this time for StringBuilders :" + (secondTime - firstTime).ToString());

    Console.Read();

    }

    }

    }


    وكما ترون أقوم بحساب الوقت لكل عملية و طباعتة و هذه هي النتيجة عندما شغلته على جهازي ولاحظوا الفرق الهائل في الوقت بين إستخدام معامل الجمع و الطرق الأخرى.



    for spend this time:00:01:42.4687500

    for spend this time String.Concat :00:00:00.0312500

    for spend this time for StringBuilders :00:00:00.0312500


    إذا لماذا توجد الطريقة الاولى و أستخدمها؟ نستخدم طريقة الجمع بمعامل ال + في حالة معالجة نصوص بسيطة لكن عندما نعالج كميات كبيرة سنستخدم الطرق الأخرى. أرجوا أن أكون قد اكون أفدتكم بهذا الموضوع و للأسئلة والتعليقات يمكنك التعليق هنا.

    الاثنين، 23 مارس 2009

    مقابلتي في دوت نت عربي

    هذا عنوان بود كاست ( برنامج إذاعي على الإنترنت ) أنشاه الصديق والاخ عماد العشي. يقابل في البرنامج عدد من المبرمجين العرب للتكلم عن موضوعات مختلفة تهم المطور العربي و خاصة مطورو الدوت نت. و الحلقة الأولى من البود كاست كانت معي :-) 

    snapshot.png

    عنوان دوت نت عربي

    السبت، 21 مارس 2009

    كأس التخيل 2009 هذا العام في مصر

    كاس التخيل هي مسابقة للطلاب من قبل مايكروسوفت للطلاب ; حيث يتم طرح موضوع للمسابقة بحيث تكون البرامج المطورة حول هذا الموضوع. السنة هذه المسابقة ستكون في مصر, و الموضوع هو تغيير العالم, حيث تم طرح عشرة ثمانية محاور من قبل الامم المتحدة  يمكن من خلالها الإسهام في تغير العالم.

    اليوم قمت بتدريب مجموعة من طلبة الجامعات الذين يشاركون بالمسابقة كجزء من مجهود بناء مجتمع للمطورين في الأردن. و هنا سأرفق ملف البرامج التي كانت أمثلة لما قدمته اليوم بناء على طلب المشاركين.