الأربعاء، ٤ يونيو ٢٠٠٨

الفرق بين التعريف باستخدام overridde و new

من المبادئ العامة في ال OOP استخدام مفهوم ال override ، في برامجك من خلال .net يمكنك تحديد الدالة لتكون قابلة لعمل override لها لاحقاً بالشكل التالي :

C#:

public class Base
{
    public virtual void SomeMethod()
    {
    }
}

 

vb.net:

Public Class Base
    Public Overridable Sub SomeMethod()
    End Sub
End Class

 

ومن ثم لعمل override لهذه الدالة في فئة Class آخر نقوم بكتابة الكود التالي :

C#:

public class Derived : Base
{
    public override void SomeMethod()
    {
    }
}

 

vb.net:

Public Class Derived
    Inherits Base
    Public Overloads Overrides Sub SomeMethod()
    End Sub
End Class

 

في هذه الحالة لو قمنا بتعريف نسخة من الفئة الأولى Base وقمنا بعملها من النوع  Derived فسيتم تنفيذ الدالة الموجودة في Derived مباشرة :

C#:

Base b = new Derived();
b.SomeMethod();

vb.net:

Dim b As Base = New Derived()
b.SomeMethod()

 

التعريف باستخدام new أو Shadows :

اما لو قمنا بتعريف ال  override باستخدام new أو Shadows في vb.net فكل ما سيحدث هو عملية اخفاء مؤقت hide ، لذا فإن الأمر التالي مثلاً :

C#:

public class Base
{
    public virtual void SomeOtherMethod()
    {
    }
}

public class Derived : Base
{
    public new void SomeOtherMethod()
    {
    }
}

Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();

vb.net:

Public Class Base
    Public Overridable Sub SomeOtherMethod()
    End Sub
End Class

Public Class Derived
    Inherits Base
    Public Shadows Sub SomeOtherMethod()
    End Sub
End Class

Dim b As Base = New Derived()
Dim d As New Derived()
b.SomeOtherMethod()
d.SomeOtherMethod()

سوف يقوم باستدعاء الدالة الأولى في السطر الثالث ، فيما يقوم باستدعاء الدالة الثانية فقط في السطر الرابع .

المصدر :
http://blogs.msdn.com/csharpfaq/archive/2004/03/12/88453.aspx

Read More......

السبت، ٣١ مايو ٢٠٠٨

Nullable Types

 

في عرف المتغيرات التقليدية تعد القيمة Null غير مقبولة اطلاقاً ، فالمتغير من نوع Boolean مثلاً لا بد ان يحتوي على True أو False ، المتغير Short لا بد ان يحتوي على ارقام ما بين الصفر و 32767 مثلاً ... وهكذا ، في حين كانت القيم النصية مثلاً String تستطيع استيعاب القيمة null لإنها من نوع reference .

لكننا في بعض الاحيان نضطر لأن يحمل متغير منطقي Boolean قيمة (لا قيمة - Null ) بمعنى اننا غير قادرين على تحديد فيما إذا كان True أو False ، ابسط امثلة ذلك هي المشكلة التقليدية التي تواجه اغلب مبرمجي قواعد البيانات في حالة عدم ادخال المستخدم لقيمة في حقل ما وليكن حقل (متزوج) ، ولنفرض ان المستخدم لم يحدد كون الشخص متزوجاً من عدمه ، في هذه الحالة سيظل الحقل يحتفظ بقيمة null ، وهو ما كان يستلزم عمل Check على انها ليست Null قبل وضعها في اي متغير من نوع bool مثلاً .

لكن ومع الاصدارة الثانية من .net framework اصبح بالامكان تعريف متغير مخصص ليسمح بتقبل القيمة null اضافة للقيم الاساسية له ، كما في المثال التالي :

bool? ismarried = null;

 

في هذه الحالة يمكننا اسناده لقراءة قيمة مباشرة من قاعدة البيانات دون القلق من كون القيمة الحالية هي Null .

 

هناك عدة طرق اخرى لتعريف متغير يقبل Null مثل الطريقة التالية ايضا :

Nullable<bool> nullableBool = null;

 

حيث ان ? هي فعلياً اختصار لل generic المسمى System.Nullable<T> ، وهو ما سنتعرف على معناه في مراحل قادمة من الدورة .

وبنفس الطريقة فيما لو اردنا تعريف دالة يكون ال return لها Nullable فسيكون ذلك بالشكل التالي :

public bool? functionName()

 

خصائص ال Nullable :

اهم خصائص ال nullable هي خاصية HasValue والتي تحدد فيما إذا كان المتغير به قيمة ام انه يحتفظ بقيمة Null بالشكل التالي :

if (ismarried.HasValue)

 

يمكن كتابتها باستخدام وسائل المقارنة ايضاً != أو <> في الفيجوال بيسك بالشكل التالي :

C#:

if (ismarried!=null)

 

VB.net:

if ismarried<>nothing then



*** حيث ان nothing خاصة بالفيجوال بيسك بدلاً من null في السي شارب .

المعامل ؟؟ :

يمكن استخدام المعامل ؟؟ مع القيم ال nullable لكي نخبره بوضع قيمة ما في حالة وجودها ب null ، لنفترض مثال حالة الزواج السابق ، وسنفترض ان اي شخص لم يقم بادخال بيانات الزواج فهو شخص اعزب بمعنى ان القيمة ستصبح False مباشرة ، سنقوم بكتابة الكود التالي من اجل ذلك :

int? ismarried = returnvaluefromdatabase() ?? False;

 




Read More......

أكبر رقم في العالم

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

هذا المقال ترجمة لمقال محمد نبيل ، كان قد وضعه على البلوج الخاص به منذ أكثر من سنتين على هذا الرابط :
http://mohnabil.blogspot.com/2006/02/biggest-number-used-in-mathematics.html

أكبر رقم في الرياضيات .

هو رقم اصغر من ما التعبير الرياضي ما لا نهاية (infinity) ولكنه في نفس الوقت اكبر من أي رقم تخيلته ، يعرف باسم Graham's Number

قبل البدء بالحديث عن هذا الرقم ، سنتحدث عن رقم مشابه ولكنه اصغر منه قليلاً ، هو رقم Googol الذي استمد محرك البحث الشهير Google اسمه منه .

رقم Googol اكبر من عمر الكون بالثواني ست مرات وهو الرقم 10 مرفوع للاس 100 ، اي الرقم واحد وبجانبه 100 صفر فقط  .

رقم googol اكبر من عدد الجزيئات الموجودة في الكون والتي تم توقعها بحوالي 10 مرفوعة لأس بين 72 إلى 87 .

إذا قمت برسم شكل مضلع هندسي عدد جوانبه هو رقم googol والذي هو 10 اس 27 ضعف الكون المعروف فسيظل هذا الشكل يظهر كدائرة حتى على مقياس Planck الذي يمثل 10 مرفوعة للاس -39 من المتر - السم جزء من 100 جزء من المتر اما ال Planck فهو جزء من الرقم 1 وبجانبه 39 صفر من المتر - .

هناك رقم آخر وهو Googolplex وهو ما يساوي رقم 1 وبجانبه رقم googol من الاصفار ، هناك ايضاً Googolduplex والذي هو رقم 1 وبجانبه رقم Googolplex من الاصفار ، Googoltriplex هو واحد وبجانبه الرقم Googolduplex من الأصفار ، وأخيراً Googolquadriplex هو الرقم 1 وبجانبه الرقم Googoltriplex من الأصفار  .

لو اردنا كتابة اصغر واحد من الارقام السابقة وهو ال googolplex على صفحة تستطيع طباعة 100 صف بكل صف 100 حرف ، بمعنى انها تطبع في الصفحة الواحدة 10 الاف حرف ، في هذه الحالة سوف نحتاج إلى بليون طابعة ، تطبع كل واحدة منها بليون صفحة في الثانية ، بهذه الطريقة وبعد سنة كاملة سنجد ان هذا العدد من الطابعات تمكن فقط من طباعة 10 مرفوعة للاس 29 فقط ، وبعد بليون سنة أخرى سنجد انها استطاعت طباعة 10 مرفوعة للاس Googol-38 فقط من الارقام . بليون سنة اخرى لتصبح 37 وبليوني سنة لتصبح 36 ثم اربع بلايين سنة لتصبح 36 ثم 8 بلايين سنة لتصبح 35 - نتكلم هنا عن الاس لذا فهناك تضاعف - .

لنفكر بطريقة أخرى ، لو افترضنا اننا سنطبع هذه الارقام بخط رقم 1 والذي يحتل حوالي 3 مليمتر لكل حرف ، سنجد ان حجم الصفحة التي تكفي لطباعة كل هذا تساوي 3.5 * 10 مرفوعة للاس 98 متر ، في حين ان كامل مساحة الكون المعروف حتى الآن 7.4 * 10 مرفوعة للاس 26 . ايضاً لا ننسى عامل الوقت في الطباعة حتى لو افترضنا ان نقل البيانات يتم بسرعة الضوء .

كل هذا وما زلنا نتحدث عن googolplex ، فما بالك بما بعده . ثم لا تنسى ان هذا الرقم هو صغير جداً مقارنة برقمنا Graham's Number والذي لا يمكن كتابته في صيغة exponentiation اي رقم مرفوع للاس رقم ، بل لا بد من طريقة خاصة لكتابته لإن لا احد يستطيع كتابته بهذا الشكل ،

يمكنك الاطلاع على المزيد هنا :
http://www-users.cs.york.ac.uk/~susan/cyc/g/graham.htm

ولكن لماذا Graham's Number ؟؟؟
في الواقع جاء هذا الرقم كأكبر رقم في الكون حالياً لحل مشكلة رياضية اسمها Ramsey theory والتي تقول :

Consider an n-dimensional hypercube, and connect each pair of vertices to obtain a complete graph on 2n vertices. Then colour each of the edges of this graph using only the colors red and black. What is the smallest value of n for which every possible such coloring must necessarily contain a single-colored complete sub-graph with 4 vertices that lies in a plane?

بالرغم من ان هذه المشكلة لم تحل إلى الآن ، Graham's Number هو الحد الأعلى الأصغر حالياً .
في الختام ، اكثر اسم مسلي لرقم قرأته في حياتي ، هذا الاسم هو :
Novemnonagintanoncentinonmillinovamyriadecemyrilli on

المصادر:
http://en.wikipedia.org/wiki/Graham_number
http://en.wikipedia.org/wiki/Googol#Trivia
http://en.wikipedia.org/wiki/Other_names_of_large_numbers
http://en.wikipedia.org/wiki/Moser%27s_number
http://www-users.cs.york.ac.uk/~susan/cyc/g/graham.htm
http://en.wikipedia.org/wiki/Knuth%27s_up-arrow_notation
http://en.wikipedia.org/wiki/Hyper_operator
http://en.wikipedia.org/wiki/Conway_chained_arrow_notation
http://en.wikipedia.org/wiki/Skewes%27_number
http://home.earthlink.net/~mrob/pub/math/largenum-2.html
http://mathworld.wolfram.com/GrahamsNumber.html
http://www.madsci.org/posts/archives/oct98/905633072.As.r.html
http://en.wikipedia.org/wiki/Googolplex
http://wiki.tcl.tk/13471

إلى هنا انتهت الترجمة

في الواقع وجدت هذا الرابط لاسماء الارقام ، ستجدون الكثير من الاسماء الغريبة :
http://www.nationmaster.com/encyclopedia/Xonillion

Read More......

مقدمة إلى Microsoft Access

كتاب تم نشره سابقاً في منتديات فيجوال بيسك للعرب

tt

محتويات الكتاب

مقدمة عامة لقواعد البيانات .
مقدمة لأكسيس .
النماذج Forms
العلاقات Relationships
بعض عمليات قواعد البيانات .
منوعات في أكسيس .
لغة الاستعلامات الهيكلية TSQL

 

للتحميل اضغط هنا

Read More......

الجمعة، ٣٠ مايو ٢٠٠٨

Strategy Design Pattern

The Strategy Design Pattern
نبدأ أولاً مع التعريف وهو :

The Strategy Design Pattern basically consists of decoupling an algorithm from its host, and encapsulating the algorithm into a separate class. More simply put, an object and its behaviour are separated and put into two different classes. This allows you to switch the algorithm that you are using at any time.

وباختصار ، فإن هذا الباترن مكون من عملية decoupling للالجوريزم و encapsulating في كلاسات Classes مختلفة ، حيث يتم فصل الكائن عن سلوكه في كلاسين منفصلين ، وهو ما سيسمح لك لاحقاً بتغيير الالجوريزم وقت ما تريد .

مميزات هذا الباترن :
- يمكنك بكل بساطة من خلاله تغيير ال behaviour الخاص بك وقت ما تريد عن طريق فصل كل behaviour في كلاس خاص به .
- في حالة رغبتك في اضافة behaviour أو تعديله لن تضطر إلى التعديل في الكلاس الرئيسي .


الاستخدام :
عندما يكون لديك عدد من الكائنات Objects متشابه ومختلفة فقط في ال behaviour فإنه من المفضل دائماً استخدام Strategy حيث يمكنك اختصار جميع هذه الكلاسات في كلاس واحد فقط مع استخدام Strategies مختلفة .
كذلك الأمر أيضاً مع subclassing للكائنات ، حيث يعتمد الحل القديم على كون ال behaviour من نوع static ، وعندما ترغب في تغييره فإنك تقوم بعمل new instance ومن ثم تقوم بعمل تبديل replace للقديم ، ولكن الآن كل ما عليك هو تغيير ال Strategy وهو سيقوم تلقائياً بتعديل ال behaviour .


أيضاً فإن وجود عدد كبير من ال behaviour في كلاس واحد سيجبرك على كثرة استخدام الجمل الشرطية لمعرفة ال behaviour المطلوب ، أما مع Strategy فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

والله الموفق ..
والسلام عليكم ورحمة الله وبركاته .

Read More......

لدي فكرة مجنونة ، من موقع SourceForge

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

فكرة وجدتها وانا اتصفح موقع الفريق العربي للبرمجة . الفكرة مطروحة ايضاً على موقع sourceforge بالاساس وسأحاول ان اوضحها للجميع هنا .

لنفترض ان لدينا صورة 4*4 بيكسل ، نريد ان نجرب فيها كل الاحتمالات بلونين فقط هما الابيض والاسود ، هل تعرف كم صورة سيكون الناتج ؟
الناتج سيكون 2 مرفوعة للاس 4*4 وهو ما يعني 2 مرفوعة للاس 16 وتساوي 65536 .
حيث ستجد اولاً البكسل الاول اسود والباقي ابيض ، ثم الثاني ، ثم الثالث ، ثم الاول والثاني ، ثم الاول والثالث .... الخ .

الآن سنفترض اننا نريد عمل صورة ملونة 16 مليون لون بحجم 640*480 ، هل تعرف كم الصور الناتجة ؟
طبعاً ، الناتج هو 16000000 مرفوع للاس 307200 ، وهو رقم كبير جداً ، يكفي ان تعلم ان 16 مليون مرفوعة للاس 2 ستحتوي على الاقل على ضعف عدد الاصفار اي 12 صفر ، للاس 3 سيصبح 24 صفر ، الاس الرابع سيصبح 48 اس ، بمعنى انه لن يزيد 6 اصفار في المرة بل ستتضاعف ، لذا لك ان تتخيل الرقم عند الاس الالف ومن ثم الرقم مرفوعاً للاس 307 آلاف ، ان حساب الرقم الناتج هو في حد ذاته مشكلة فما بالك بالحصول على الصور نفسها .
لكن هل تتخيل على ماذا ستحتوي هذه الصور ، بالواقع ستحتوي على كل الاحتمالات التي يمكن لكاميرا ما ان تلتقطها ، وهي بالتالي تحتوي على :

- صور جميع البشر سواء البشر الذين ولدوا او سيولدوا او الموجودين حالياً .
- جميع الكائنات الحية المكتشفة او التي لم تكتشف بعد .
- صور جميع الاختراعات ووسائل المواصلات التي اخترعت او ستخترع .
- صور جميع الكلمات المكتوبة ، هنا ستجد ايضاً افضل قصيدة قيلت او ستقال لإن القصيدة او بيت الشعر هو شيء يمكن تصويره .
- ستجد ايضاً الحل لكل المسائل الفيزيائية والهندسية والكيميائية ، حيث ان هذه الحلول هي صور ايضاً .
- ستجد ايضاً صور لجميع الدوائر الكهربية او الالكترونية الموجودة او تلك التي ستوجد .

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

لذا سنختم ببعض النقاط :

- اغلب هذه الصور غير ذا جدى في الواقع ، حيث انك ستجد صورة تحتوي على نقطة واحدة فقط من لون ، وهكذا لمدة 16 مليون صورة ، ثم تحتوي على نقطتين ثم على ثلاث ، ستجد رقماً مهولاً من الصور بهذه الطريقة .
- نحتاج إلى الجوريزم لاستبعاد الصور غير المهمة ، ولكن هذا الالجوريزم لا بد ان يكون ذكياً ، ربما الصورة غير مهمة حالياً ولكنها شيء لم نكتشفه بعد !
- ستجد لنفسك فقط عدة مليارات من الصور إن لم تكن اكثر ، خد صورتك وحول لون احد شعر رأسك للأحمر ثم للاخضر وهكذا لمدة 16 مليون لون ، ثم انتقل للشعرة التالية ، ثم للشعرة الاولى مع الثانية ... وهكذا ، ثم حرك راسك بمقدار بيكسل واعد الحسابات ، هذا لو سلمنا ان الشعرة بيكسل فما بالك لو كانت الشعرة تحتوي على اكثر من بيكسل ، هنا سنجد مقدراً مهولاً من التكرارات ، ثم نفس الامر مع صورة زميلك ثم مع تغيير الخلفية لتحتوي على تلفزيون بدلاً من مكتب ، ثم مكتب ببيكسل احمر في المنتصف ... الخ .

النص التالي منقول من موقع الفريق العربي للبرمجة لشرح فقط فكرة تكوين الصور وعدد الاحتمالات - مهندس أسامة - :

http://www.arabteam2000-forum.com/index.php?showtopic=155674&st=20&p=782920&#entry782920

لو فرضنا أنك تريد أن تحسب الأحتمالات لصورة مكونة من لونين فقط، وحجمها هو 3 × 1 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (2) مرفوع للأس (3) (حجم الصوره)= 2 أس (3×1) = 8 صور

الصورة المرفقة

وبالتالى: لو تريد أن تحسب الأحتمالات لصورة مكونة من لونين فقط، وحجمها هو 3 × 2 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (2) مرفوع للأس (6) (حجم الصوره)= 2 أس (3×2) = 64 صور = (2 أس 3) أس 2

الصورة المرفقة

إذن: تريد أن تحسب الأحتمالات لصورة مكونة من 256 لون، وحجمها هو 640 × 480 بيكسل، فيكون عدد الاحتمالات = عدد الألوان (256) مرفوع للأس (307200) (حجم الصوره)= 256 أس (640×480) = (256 أس 640) أس 480

الصورة المرفقة

أحسب الناتج، ولنفترض أن زمن تكوين الصوره يساوى 1 من مليون من الثانية (جدلاً)، فما الوقت الازم لتكوين جميع الاحتمالات؟؟؟

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ولحساب زمن تقريبي لتنفيذ هذه العملية ، هذا ايضاً من موقع الفريق العربي  للمهندس اسامة ايضاً :

 

هل حاولت حساب الوقت المستغرق لهذه العملية ؟ (عدد الأحتمالات تقريباً يساوى (10 أس 737280)، أى واحد وامامه 737280 صفر)

الصورة المرفقة

نفترض جدلاً ان لديك نظام يستطيع تكوين ألف مليار صورة فى الثانية، أى: 1.000.000.000.000، وهو تقريباً يساوى

أى عدد الثوانى التى تحتاجها لجميع الاحتمالات = 256 أس 307195، أى تقريباً (10 أس 737268) أى واحد وامامه 737268 صفر من الثوانى regular_smile.gif

الصورة المرفقة

وحيث أن السنه تحتوى تقريباً على 32.000.000 ثانية، أى كل 3 سنين تحتوى تقريباً على 10.000.000 ثانية (10 أس 7)
إذن تحتاج الى زمن قدره = 3 × (10 أس (737268-7)) = 3 × (10 أس 737261) سنة، 3 × (10 أس 737259) قرن
ولنفترض أن تكنولوجيا البرنامج تضاعفت سرعتها 3 مليون مليار مرة، اى اصبح ينتج: ثلاثة مليار مليار مليار صورة فى الثانية (أى واحد وامامه 24 صفر صورة فى الثانية). إذن ستحتاج لوقت يساوى (10 أس 737241) قرن
ولنفترض أنك ستختار صورة واحدة من كل مليار مليار مليار صورة (أى 0.000000000000000000000000000000000001%)، إذن ستحتاج لوقت يساوى (10 أس 737205) قرن أى (10 أس 737193) مليار قرن، أى (واحد وامامه 737207 صفر من السنين)
مع العلم أن عمر الأرض يقدر بحوالى (4.5 × 10 أس 9) سنة = 4.500.000.000 سنة
أى ستحتاج تقريباً إلى أكثر من (10 أس 737195) ضعف عمر الأرض regular_smile.gif ، ولو افترضنا بأننا (لا أدرى كيف؟) أنتقينا صورة واحدة من كل ((10 أس 30000) إلى (10 أس 40000)) صورة، لكانت المحصلة تساوى تقريباً (10 أس 700000) ضعف عمر الأرض، (واحد وامامه 700.000 صفر regular_smile.gif)
أى لو بدء البرنامج مع بدء عمر الأرض، وبقوة تصل إلى: ثلاثة مليار مليار مليار صورة فى الثانية، مع اختيار صورة واحدة من كل مليار مليار مليار صورة، وأن زمن اختيار واستبعاد الصور جدلاً يساوى صفر، وكان هناك حوالى (10 أس 700000) نظام بنفس القوه ويعملوا سوياً بالتوازى، لكنا الان نشاهد الرسالة regular_smile.gif

LEFT TO RIGHT

98% of task completed

ملاحظة: الحسابات بإفتراض الصورة 640 × 480 × 8 بت، وعليه:

  • 640 × 480 × 4 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000/2) = 10 أس 350.000
  • 640 × 480 × 16 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*2) = 10 أس 1.400.000
  • 640 × 480 × 24 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*3) = 10 أس 2.100.000
  • 640 × 480 × 32 بت، سيكون الناتج النهائى التقريبى = 10 أس (700000*4) = 10 أس 2.800.000
  • 640 × 480 × 4 بت = 320 × 480 × 8 بت = 640 × 240 × 8 بت = 320 × 240 × 16 بت، الناتج النهائى التقريبى = 10 أس (700000/2) = 10 أس 350.000
  • ... الخ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

في الواقع تبدو الفكرة مربكة إلى حد ما ، حيث انه من المستحيلات حالياً ايجاد مثل هذا التطبيق ، ولكني نقلته هنا ربما يستطيع احد تطبيق نفس المبدأ على افكار ومواضيع أخرى - قابلة للتحقيق هذه المرة - .

 

رابط الموضوع على منتدى الفريق العربي للبرمجة :
http://www.arabteam2000-forum.com/index.php?showtopic=155674

رابط الموضوع على فيجوال بيسك للعرب :

http://vb4arab.com/vb/showthread.php?t=13808


رابط الموضوع على sourceforge هنا :
http://sourceforge.net/community/forum/topic.php?id=451&page

 

Read More......

الأحد، ١٨ مايو ٢٠٠٨

مقدمة إلى التحكم بالأجهزة الخارجية - Physical Computing

Untitled-2

كتاب تم تقديمه في منتديات فيجوال بيسك للعرب عبر عدة دروس في هذا القسم :

http://vb4arab.com/vb/forumdisplay.php?f=57

المادة العلمية الاساسية قدمت في الاصل من FUTEX Group مشروع مادة Seminar في الفرقة الثالثة - كلية حاسبات ومعلومات حلوان .

محتويات الكتاب :

1- نظم الأرقام
2- المنافذ وتركيبھا وطريقة تعامل النظام معھا
3- منفذ الطباعة Parallel Port وطريقة التعامل معه بالتفصيل
4- برمجة منافذ الكومبيوتر
5- مدخل إلى الھاردوير - مقدمة .
6- مدخل إلى الھاردوير - وسائل الإخراج.
7- مدخل إلى الھاردوير - وسائل الإدخال .
8- مدخل إلى الھاردوير - وسائل المعالجة .
9- تطبيق تشغيل الأجھزة الكھربائية من خلال الكومبيوتر
10- قيادة عربة ريموت كنترول من خلال الكومبيوتر
11- مقدمة إلى عالم الروبوتات

لتحميل نسخة من الكتاب اضغط هنا

Read More......

الثلاثاء، ٢٢ أبريل ٢٠٠٨

الفروقات بين C# And VB.net - الخلاصة 99% تشابه

في هذه المقالة أهدف إلى توضيح بعض الفروقات بين C# و VB.net في اشارة إلى أن الفروقات بينها 90% فقط في طريقة الكتابة ، ولن أناقش مبدأ أنهما متشابهان في البنية التحتية فهذا أمر مفروغ منه ، ومن أجمل ما قرأت مقال الأستاذ أيمن المدهون بعنوان : لا تكذبي إني رأيتكما معاً ، على هذا الرابط : http://www.vb4arab.com/vb/showthread.php?t=726

ولكني الآن سأبدأ بالتعرض لأوجه الخلاف ، وستكتشف في نهاية الدرس أن ليس ثمة اختلافات حقيقة بل هي لعبة تسويقية من مايكروسوفت كي لا تخسر مبرمجي فيجوال بيسك ، وفي نفس الوقت لتجذب إليها مبرمجي عائلة C .

وسأضع هنا تنويهاً عن الفروقات الغوية الأبرز وأحيلك في آخر الدروس إلى موسوعة للفروقات بين هاتين اللغتين ، ولنبدأ بالفروقات اللغوية - فروق غير ذات قيمة - :

* أولاً : كونك مبرمج سي شارب لا تنس أن تضع ; في آخر كل سطر

* ثانياً : طريقة تعريف المتغيرات :

VB.net :

Dim X as Integer
Dim X as ClassName=new ClassName()



C#

int x;

ClassName x=new ClassName();




* ثالثاً : في حالة الشروط في VB.net اكتب = أما في C# اكتب == ، كما ستجد العلامة != لعدم المساواة بدلاً من <> .

* رابعاً : تعتمد لغة VB.net على جمل مثل End وتستخدمها في الاجراءات والكلاسات وغيرها مثلاً :

if x=1 Then

End if




بينما تجدها في C# باستخدام الأقواس :


if(x==1)

{

}



وكذلك في الكلاس والاجراءات أيضاً :


VB.net :

Imports System

Namespace MyNameSpace

Class HelloWorld

'Entry point which delegates to C-style main

Private Function

Public Overloads Shared Sub Main()

Main(System.Environment.GetCommandLineArgs())

End Sub

Overloads Shared Sub Main(args() As String)

System.Console.WriteLine("Hello World")

End Sub 'Main

End Class 'HelloWorld End Namespace 'MyNameSpace





C# :


using System

Namespace MyNameSpace

{

class HelloWorld

{

static void Main(string[] args)

{

System.Console.WriteLine(
"Hello

World"
)

}

}

}




* خامساً ، في فيجوال بيسك .net سوف تستخدم And,Or,Not,OrElse بينما في C# سوف تستخدم && ! .

* سادساً : عند جمع النصوص استخدم & في VB.net ولكن في C# استخدم + .

* سابعاً : else if في C# هي ElseIf في VB.net

* ثامناً : كما اسلفنا في موضوع End ، ففي الحلقات التكرارية تعتمد C# على الأقواس أيضاً :


for (i = 2; i < = 10; i += 2)

{

System.Console.WriteLine(i);

System.Console.WriteLine(i*10);

}



وفي حالة كونها سطر واحد يمكن الاستغناء عن الأقواس :


for (i = 2; i < = 10; i += 2)

System.Console.WriteLine(i);




أما في VB.net فهي تأخذ شكلاً موحداً :


For c = 2 To 10 Step 2

System.Console.WriteLine(c)

Next



ونفس الأمر بالنسبة لباقي الحلقات التكرارية While و for each وخلافه .


* تاسعاً : بالنسبة للمصفوفات وخلافه يستخدم القوس [] بدلاً من () في VB.net .

C#

int[] nums = {1, 2, 3};

for (int i = 0; i < nums.Length; i++)

Console.WriteLine(nums[i]);




Vb.net

Dim nums() As Integer = {1, 2, 3}

For i As Integer = 0 To nums.Length - 1

Console.WriteLine(nums(i))

Next



* لن تجد تعليقاً Comment لأكثر من سطر في VB.net مثل /* */ في C# ، وكذلك XML Comments على الرغم من أنني قرأت انها ستكون مدعومة في الاصدارة القادمة .

* في C# سوف تستخدم العلامة المئوية % بدلاً من Mod في VB.net للحصول على باقي القسمة .

* لن تدعم لك VB.net استخدام Bitwise Operations في حالة Assignment على عكس ال C# حيث تتيح لك ذلك .

الآن نترك عنا الفروقات اللغوية ، فسوف نشير للباقي منها في نهاية المقال ، نتطرق هنا على عجالة للفروقات الفعلية :

* أول تلك الفروقات هي case sensitive ، حيث أنه في VB.net فإن Ahmed هي نفسها ahmed وهو ما لا يوجد في أي لغة في العالم سوى Basic ، ولا أستطيع أن أحدد فيما إذا كان هذا ميزة أم عيب .

مميزات في VB.net - باختصار - :

* دعم ال optional parameters موجود في VB.net وليس موجود في C# .

* with موجود في VB.net وليس موجود في C# .

* Catch ... When موجودة في VB.net وهي تتيح نظاماً أفضل لفلترة الأخطاء .

* يقوم VB.net بعمل Compile للكود في BackGround ، وهذه ميزة في التطبيقات الصغيرة ولكنها عيب في التطبيقات الكبيرة حيث تلاحظ بطء الفيجوال ستوديو .

مميزات في C# - اختصار - :

* يدعم C# ما يعرف باسم unsigned types ، وهو ما يمكنك استخدامه أيضاً في VB.net ولكنه ليس جزءاً اساسياً من اللغة .

* الميزة الأقوى في C# والتي لا تتوفر في VB.net هي السماح باستخدام

unsafe أو unmaneged code ما يتيح لك العمل على Pointers وخلافه ، ما يفتح لك آفاقاً واسعة في عدة مجالات مثل معالجة الصور image processing وخلافه .

ولعل هذه الميزة مما جعل C# قريبة من C++ من ناحية تعاملها مع كود منخفض المستوى Low Level Code وهو ما يجعل سي شارب الاختيار الأمثل للكثيرين .

* لن تجد increment و decrement في VB.net حيث ستتضطر إلى كتابة كود بالشكل التالي :

A=A+1

A-=1



بينما في C# يمكنك القيام بذلك بالشكل التالي :



A++

A--



* يمكنك أن تجد الخاصية sizeof في C# بينما لن تجدها في VB.net .


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

في النهاية : ماذا أختار ؟

إذا كنت منتقلاً من VB 6.0 فعليك ب VB.net أما إذا كانت لديك خبرة ب C/C++/Java فعليك ب C# وإذا كنت جديداً في مجال البرمجة فأنت حر في اختيار ما يناسبك .

وفي النهاية ومهما كان اختيارك قم بالاطلاع على اللغة الثانية - علشان تضحك على الناس وتقول انا ببرمج بلغتين مش لغة واحدة - ، ويمكنك ايضاً في هذه الحالة أن تبرمج ب J# ويبقى اسمك ادام الناس بيبرمج ب 3 لغات

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

http://www.codeproject.com/dotnet/vb...difference.asp

أيضاً الملف من موقع مايكروسوفت لتوضيح الفروقات :

http://support.microsoft.com/kb/308470

والسلام عليكم ورحمة الله وبركاته .

Read More......

الأحد، ٢٣ مارس ٢٠٠٨

Traffic Monitoring System

اسم المشروع : نظام لمراقبة المرور مع نموذج للقيادة الآلية .
Traffic Monitoring System With Automatic Driving Model


المشروع فائز بالمركز الأول على مستوى جمهورية مصر العربية في يوم الهندسة المصري EED فرع IT .

فريق العمل :
1- أحمد جمال خليفة .
2- أحمد سعيد أنور .
3- أحمد عماد أحمد .
4- أحمد محمد عيسوي .
5- حسام الدين محمد صادق .
6- خالد عادل محمد سلامة .

اسم المشرف :
بروفيسور: عراقي خليفة .
م. عمر غنيم .


الكلية والجامعة :
جمهورية مصر العربية - جامعة حلوان - كلية الحاسبات والمعلومات - قسم علوم الحاسب.
السنة : 2007 .


وصف مختصر للمشروع :
المراحل الأساسية للمشروع - باختصار شديد - لمزيد من التفاصيل راجع ال Documentation في آخر الموضوع .

مقدمة :
أصبح لأنظمة الكومبيوتر الآلية تأثير عميق على حياتنا اليومية حيث أصبحنا نرى كل يوم أبحاث ومشاريع جديدة من أجل استخدام الكومبيوتر لتسهيل الحياة وتخفيف الضغوط التي يتحملها البشر .
والمشروع عبارة عن مزيح من آخر التقنيات التي قدمت في هذا الفرع من علوم الكومبيوتر المتعلقة بالرؤية الحاسوبية ونظم دعم اتخاذ القرار المقدمة في مجال تطوير المدن الآلية ، حيث يستخدم النظام للمساعدة في عملية المراقبة ، ازدحام الطرق ومراقبة اشارات المرور وتدفق السير في المدن ، هو عبارة عن نظام لمراقبة السير ودعم قرارت القيادة الآلية حيث أن هذين النظامين لم يتم ربطهما سوية من قبل .
وكل ما نطمح إليه حالياً هو تقديم خطوة في طريق تطبيق نظام مراقبة في الواقع عن طريق دعمه للتكامل مع النموذج المستقبلي لنظام القيادة الآلية من خلال نموذج مصغر لمدينة تحتوي على سيارات يتم التحكم بها عن بعد وتتم ادارته من خلال الكومبيوتر .

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

السيناريو :
* مخطط لسيناريو المشروع :

* مخطط Collaboration Diagram للمشروع :

وصف المشروع :
باختصار شديد : المشروع يحتوي على كاميرا تقوم بارسال صور فورية إلى الكومبيوتر الذي يقوم بتحليلها وفهمها والخروج ببعض التقارير والإحصائيات عن الطرق ونظام المرور ، وفي الجزء الثاني من المشروع وعند بداية مهمة لتحريك السيارة من نقطة إلى أخرى يتم الرجوع إلى هذه المعلومات لحساب الطريق الامثل للتحرك من خلاله ، وأخيراً يتم اللجوء إلى بعض مبادئ Physical Computing من أجل تحريك السيارة الموديل الموجودة في المدينة المصغرة .
وسنبدأ الآن في الشرح التفصيلي لبعض المراحل باختصار .


معالجة الصور :
المرحلة الأولى في عملية معالجة الصور هي مرحلة Road Extraction حيث يتم معرفة الطرق الموجودة في المدينة عن طريق مراحل متعددة تمر بها عملية استخراج الطرق بعد ذلك يمكن حصرها اجمالاً في المراحل التالية (Generate Road Seed points, Snaxles, Snakes) حيث يتم التعرف في آخر مرحلة بصورة مفصلة على جميع الطرق غير المستقيمة أو المنحنية بانحناءات متعددة .


وباختصار شديد فإن هذه المرحلة تعتمد على ما يسمى باسم Edge Detection كمرحلة أساسية في هذه الخطوة حيث نقوم بقراءة الصورة ومحاولة استخراج الحواف المميزة لها :

في الخطوات التالية نقوم باستبعاد تلك التي تمثل مباني مثلاً أو ناتجة عن تشويش في الصورة ، نقوم بدمج الخطوط سوية ... الخ .
وبما أن الناتج لن يكون بالطبيعي 100% فإننا نسمح للمستخدم بالانتقال إلى شاشة رسم الطرق والتعديل حيث يمكنه اضافة وحذف الطرق الخاطئة كما يمكنه تسمية الشوارع والمباني وغيرها ...
المرحلة الثانية في عملية معالجة الصور هي متابعة تحركات السيارات في المدينة ، ويتم ذلك أيضاً عبر مجموعة من العمليات الخاصة بكيفية استخراج خلفية فارغة من جميع السيارات دون الاضطرار لتصوير المدينة وهي فارغة ، ومن ثم البدء في قراءة الصورة عن طريق الطرح المباشر كخطوة أولى ، وهذه مجموعة من الصور :

الخطوة الثانية تعتمد على البدء الفعلي في قراءة الصور ويتم ذلك عبر تحويلها إلى صور Binary مع تطبيق بعض ال morphological filtering من اجل توضيح الصورة ، وهذه المحصلة النهائية لهذه العمليات :

الخطوة الأخيرة هي البدء بتتبع هذه السيارات فترة عمل النظام ، ويتم ذلك باستخدام LUCAS-KANADE OPTICAL FLOW ALGORITHM على سبيل المثال .
نظام الإحصائيات والتقارير القيادة الآلية :
بعد أن استطعنا في المرحلة السابقة معرفة أماكن السيارات في المدينة وحالة الطرق ، جاء دور المرحلة الثانية من النظام والتي تتلخص في الاستفادة من هذه البيانات ، وتتم الاستفادة من هذه البيانات بطريقتين :

نظام الإحصائيات والتقارير :
حيث يتم عرض تقرير فوري بحالة الطرق ونسب الإزدحام وخلافه .

نظام القيادة الآلية :
وهذا هو الجزء الثاني من المشروع ، حيث يتم كبداية تحديد مهمة للانتقال من نقطة أ إلى نقطة ب .
أول العمليات التي يتم تنفيذها هي حساب ال Best Path عن طريق معادلة لكل طريق يتم من خلالها اختيار الطريق الأنسب وبدء العمل على تحريك السيارة من خلاله

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


الهاردوير Hardware :
كما أسلفنا في النقطة السابقة ، فإنه تلزمنا بعض التعديلات ليصبح بمقدورنا تحريك السيارة الموديل عن طريق الكومبيوتر .
بداية استعنا بسيارة ريموت كنترول RC Car مع مراعاة وجود أكثر من تردد Frequency في حالة استخدام أكثر من سيارة أو استخدام crystals أو Removable Strips من أجل تجنب تداخل الموجات .
ثم قمنا بعمل موديل لمدينة مصغرة وقمنا برسم بعض الطرق وبناء بعض المباني كما هو موضح في الصور المرفقة .
وقمنا باستخدام كاميرا عادية لالتقاط الصور .
المرحلة الأولى هي ربط الكاميرا بالكومبيوتر ، وتم ذلك عبر منفذ USB حيث يمكن قراءة الكاميرا بأكثر من طريقة وحسب لغة البرمجة المستخدمة .
الخطوة الثانية هي ربط الريموت بالكومبيوتر ليتم التحكم في السيارة ، ويتم ذلك عن طريق استخدام مبادئ ال Relays والتي تسمح للتيار بالمرور في الريموت عند تلقي أمر معين من الكومبيوتر من خلال منفذ الطابعة Parallel Port .
وهاتين الصورتين توضحان الفرق بين الريموت العادي حيث يتم تحريك صفائح على بعضها مقارنة بالريموت الجديد حيث أصبح ال Relay هو المتحكم في توصيل الكهرباء .

التطبيق في العالم الواقعي :
لكي يصبح هذا النظام قابلاً للتطبيق في أرض الواقع وعلى مدينة حقيقة فإنه ما زال بحاجة إلى بعض التعديلات ، نوجزها في الثلاث نقاط التالية :


- من جهة معالجة الصور : سيتم استبدال الكاميرا بصور مباشرة للأقمار الصناعية مثل Googel Earth والتي بدأت تقدم خدمات بث مباشر لبعض المدن حول العالم .
أيضاً لا زلنا بحاجة للمزيد من التسريع والدقة في عمليات معالجة الصور ، أيضا لمزيد من الفلترة للمؤثرات الجوية الخاصة مثل الغيوم ، الأمطار ... الخ .
- من جهة نظام قيادة السيارة : لن يتحمل السيرفر وحده عبء القيادة بل سيكون هناك جهاز على السيارة أو Microcontroller يستقبل المسار ويبدأ في توجيه نفسه بنفسه وذلك منعاً لتثقيل العمل على السيرفر وزيادة في السرعة .
أيضاً سيتم استخدام دوائر كهربائية مثل ultra-sonic حتى في الموديل الصغير لتلافي الاصطدامات التي تنتج عن أجسام مفاجئة حيث تقوم بارسال واستقبال موجات ويتم احتساب زمن ارتدادها لمعرفة ومن خلالها يمكن معرفة المسافة التي تفصلها عن أقرب جسم في الاتجاه والزاوية التي ترسل بها الموجات .
- من جهة نظام التحكم والاتصال : لن يتم الاتصال عبر موجات Radio عادية بل لا بد من وجود Wireless network ، والشرط الأهم هو كونها محمية وهو ما لم تتوصل إليه البحوث حتى الآن حيث لا توجد شبكة لا سلكية محمية بصورة كاملة أبداً .
ومن الجهة الأخرى فنحن بحاجة إلى تطويع هاردوير السيارات لاستقبال أوامر عن طريق الكومبيوتر وهو ما لا يعد مرحلة صعبة من ناحية التطبيق ، ولكنه سيواجه مشاكل عديدة تنتج عن سرعة السيارة مثلاً وسرعة الاستجابة للأوامر في ظل سيرها على سرعات كبيرة والتوقف المفاجئ وتوقع الاعطال وغيره .

المشروع :


تم تسليم المشروع باستخدام C# ولكن بداية العمل في المشروع لم تكن كذلك ، حيث تم استخدام MATLAP نظراً لكونه الأسهل في التعامل مع ال Image Proccessing ، ومن ثم تم ربطه بالنظام الذي قمنا بعمله من خلال C# ولكن وبالرغم من ذلك فلن تجد اللغة المستخدمة تفرق كثيراً حيث أن أغلب البرنامج عبارة عن معادلات وقوانين لن يختلف تطبيقها من لغة إلى أخرى أبداً .
وللتحويل إلى C# تم استخدام SharperCV وهي مكتبة مفتوحة المصدر متخصصة في عمليات ال Image Proccesing وهي عبارة عن Warrper لمكتبة OpenCV التي تم تصميمها للعمل على C++ ، وسبب الاستعانة بهذه المكتبة هو التعقيد الكبير الذي سينتج عن استخدام أكواد سي شارب مباشرة في كل عملية من عمليات معالجة الصور التي نستخدمها نظراً لإنك ستضطر للتعامل مع المؤشرات Pointers وهو ما يضطرك لاستخدام unsafe code ، وبصراحة فهي لا تعطيك كافة المميزات التي تقدمها لك لغة مثل C++ وفي نفس الوقت تحرمك من السهولة التي تجدها في الماتلاب .
ولكن هذا لم يمنع استخدام أكواد مباشرة في كثير من الأحيان ، وإنما تم استخدام SharperCV فقط في العمليات المتكررة أو التي يتم التعامل فيها مع كمية كبيرة من الأكواد حيث تختصر عليك ال SharperCV جزء كبير من المهمة برغم كثرة مشاكلها ، ولكنك ستجد نفسك مضطراً في النهاية للبرمجة اليدوية .
كان بالإمكان اضافة حل آخر وهو استخدام عمليات التحويل من ماتلاب إلى .net ولكن ظهور بعض المشاكل أدى إلى ايقاف هذه العملية ، عموماً ما زالت جميع مراحل العمل على معالجة الصور موجودة من خلال matlap ومن خلال C# أيضاً .
أما الجزء الآخر الخاص بالنظام والشاشات والقيادة الآلية ومعادلات الحركة والربط بالكاميرا من جهة أو الربط بالسيارة من جهة أخرى وعمليات التعديل والتحرير وقواعد البيانات والتقارير وخلافه فقد تمت برمجته باستخدام C# مباشرة .
لقطات وصور من المشروع :


لقطات وصور من البرنامج :


وهذه نسخة من ال Documentation للمشروع يمكن الاطلاع عليها من خلال هذا الرابط :
http://hammada2091.googlepages.com/Documentation.pdf

مراكز أخرى حققتها جروبات كلية حاسبات ومعلومات حلوان :

http://www.fcih.net/details.asp?id=94

Read More......

Singleton Design Pattern

المشكلة :

أحياناً ما تحتاج لإن يكون ال Class الذي قمت بانشائه لا يمكن تعريف سوى نسخة أو Object واحد فقط منه ، وتحتاج إلى مثل هذه العملية في حالة كود هذا ال Class لا بد أن يكون موجوداً مرة واحدة في البرنامج وتظل قيمه مقروءة لجميع المستخدمين من أي مكان .


المشكلة ليست في جعل ال Class لا يتم سوى عمل نسخة واحدة منه ، بل إن هذا يتم بكل بساطة باستخدام الكلمة المحجوزة Sealed ، ولكن المشكلة تكمن في أنك عندما تريد أن تستخدم نسخة أخرى فإنك لن تستطيع ، وبذا لن يمكنك الاستفادة منه في كل مكان


في هذه الحالة نلجأ لما يسمى Singleton .


الشرح :


في البداية سوف ننشأ Class وليكن اسمه Singleton .
وفي كلا الأحوال لا بد للمنشىء constructor أن يكون private لكي لا يتمكن أحد من عمل نسخة جديدة منه .
وسنعرف نسخة من ال Class داخل ال Class نفسه بالشكل التالي :

private readonly Singleton instance;




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








public Singleton getInstance

{


if (instance ==null) instance = new Singleton();


return instance


}






والآن هناك طريقتين لتطبيق هذه التقنية ، الطريقة السابقة التي ذكرناها وبامكانها العمل على أي لغة برمجة - بغض النظر عن أنني استخدم C# في الشرح - ، أما الطريقة الثانية فهي تتطلب لغة يمكنها قراءة static من أي مكان وهو ما يتوفر مثلاً في الجافا أو ال C# ولا يتوفر في ال C++ .

الطريقة الثانية تعتمد على الغاء الفنكشن getInstance والاعتماد على أن بامكان اللغة تعريف new من المتغير وقت التعريف ، ليصبح أمر التعريف بالشكل التالي :








public static readonly Singleton instance = new Singleton();






وفي هذه الحالة قم دائماً بقراءة instance دون الحاجة إلى التعريف لإنها static .

وهذه صورة توضح التقنيتن المشروحتين :









Read More......

StringBuilder

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


عندما نقوم بدمج النصوص ، يلجأ الكثيرون منا لاستخدام المعامل + في C# أو المعامل & في VB.net بالشكل التالي - مثال اضافة امتداد البريد الإلكتروني :

//C#:
Label1.Text = Text1.Text + "@hotmail.com";

'VB.net:
Label1.Text = Text1.Text + "@hotmail.com";

إلا أن Visual Studio قدمت لنا طريقة أخرى لدمج النصوص باستخدام الفئة StringBuilder ، في مجال الأسماء System.Text.StringBuilder ، يمكن استخدامها لدمج النصوص بالشكل التالي :

//C#:
System.Text.StringBuilder mail = New System.Text.StringBuilder(Text1.Text);
mail.Append("@hotmail.com");

'VB.net:
Dim mail As New System.Text.StringBuilder(Text1.Text)
mail.Append("@hotmail.com")

الفارق بين الاثنين يكمن في ان stringbuilder يظل كما هو منذ لحظة انشاءه ، اما استخدام المعاملات + أو & فهو يقوم بعمل Object جديد من ال String مع كل عملية دمج .
والآن سنفترض مثال Loop تقوم بدمج عدد من النصوص ، وسنصور المقارنة مباشرة من كتاب .Net Gotachas ، حيث قام بعمل اختبار لعدد عمليات دمج ابتداء من 10 عمليات دمج وحتى 1000000 عملية دمج ، وقام بمقارنة الأداء بين استخدام StringBuilder او استخدام معاملات الدمج التقليدية ، مع ذكر زمن التنفيذ بالثانية لكل منهم .

لا تنسى ان 3562.933 ثانية تعني 59.4 دقيقة تقريباً ...
والآن ... هل ما زلت تستخدم & او + لدمج النصوص ؟؟؟


توفر الفئة stringbuilder ايضاً عمليات استبدال Replace وادراج Insert وحذف Remove وعمليات نصوص أخرى كثيرة ، يمكنك الاطلاع على أوجه كثيرة للمقارنة مدعومة بالرسوم البيانية من خلال هذا الرابط من Code Project :
http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .

Read More......

الخميس، ١٣ مارس ٢٠٠٨

دعوة لحضور Microsoft launch event

يوم الإثنين 24-3-2008 .

العنوان : فندق انتركونتينتال سيتي ستارز .

جدول اليوم :

Read More......

دعوة لحضور dotNetWork.org 3rd gathering


رابط الموضوع الأصلي :

Read More......

موقع MSDN


بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


يعد الـ Microsoft Developer Network أو ما يعرف اختصاراً باسم MSDN واحداً من أكبر مراكز الدعم للمبرمجين الذي يستخدمون أدوات Microsoft المختلفة .
http://msdn2.microsoft.com/en-us/default.aspx


في هذا الموقع ، تجد كل ما تريد من الأوامر الأساسية والفرعية وشروح لمختلف التطبيقات على لغات البرمجة من انتاج مايكروسوفت ، ففي الصفحة الأولى انت مخير للاختيار بين واحد من هذه اللغات أو التقنيات :
.NET Framework, ASP.NET, Office, SQL Server, Visual Basic, Visual C++, Visual C#, Visual Studio, Visual Studio Express, Windows Vista And More


يحتوي الموقع أيضاً على آخر الاخبار والنصائح بخصوص هذه التقنيات ، كما تجد مجموعة من الفيديو Videos التي تشرح مختلف التطبيقات والتقنيات ، اضافة إلى روابط وتحديثات للأدوات التي تقدمها Microsft ، كما يمكنك التواصل معهم بعد تسجيل الدخول لارسال آخر الاخبار والتطورات ، ويمكنك أيضاً الاستفادة من خدمة RSS لهذا الموقع لتصفح آخر البيانات .


إلا ان النقطة الأبرز والأكثر أهمية في MSDN تظل هي Developer Centers مركز المبرمجين ، والذي تجد فيه كل ما تحتاجه .
والآن قم باختيار أي قسم تود البحث أو التعلم فيه وليكن .net frame work مثلاً ، في هذا القسم سوف تجد قسم Downlaods لتحميل آخر البرامج والأدوات ، أيضاً تجد القسم التعليمي وهو الأهم على أية حال .

في القسم التعليمي ستجد قسم لأسئلة وأجوبة ، قسم للعروض التقديمية Presentations ، قسم آخر للتدريب وللكتب وغير ذلك .
أما لو قمنا باختيار قسم يهتم بالكود مثل Viusal C# فسوف تجد مجموعة من Tutorial التعليمية تأخذك خطوة بخطوة عبر هذه اللغة أو التقنية ، حيث تستطيع ايجاد كم هائل من الدروس والتطبيقات الجاهزة .
وفي كلا الأحوال تستطيع البحث عن ما تريد لتجد مجموعة من الأجوبة التي تفيدك في هذا الموضوع ، فمثلاً لو اردنا البحث عن SqlConnection والتي تستخدم لربط قاعدة البيانات من نوع Sql فسوف نجد الصفحة التالية :
http://msdn2.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(VS.71).aspx
والتي تحتوي على شرح كامل لهذا الـ Class بكل التقنيات المتاحة في الغالب ، كما سيحتوي الدرس على روابط لمواضيع متعلقة سوف يهمك أغلبها إذا استمررت في العمل من خلال هذا الـ Class ، كما قد تجد في بعض المواضيع مثالاً للعمل ، أو حتى تطبيقاً جاهزاً يمكنك عمل Download له .


وبعيداً عن الدروس المباشرة ستجد أحياناً مجموعة من التعليمات السريعة Hints لمشاكل ربما تواجه في العادة مستخدمي هذه التقنية ، كما ستجد مقالات تشرح لك ماذا يحدث خلف الكود وكيفية عمل هذه التقنية بالضبط .
بقي أن نشير أيضاً إلى وجود MSDN على أقراص CD's ليتم العمل عليه في حالة عدم الاتصال بالانترنت ، ويمكن تحديثها بالربط بالموقع أيضاً ...
ويمكنك تسجيل نفسك كعضو في MSDN للاستفادة من كامل الخدمات التي يقدمها الموقع من خلال بريدك الالكتروني على Live Hotmail .

Read More......

مقدمة إلى لغة الذكاء الإصطناعي برولوج - 2


من منا لا يعرف مسألة أو لغز آينشتاين الذي انتشر كثيراً على المنتديات وجروبات الياهو وفي كل مكان ، وهو اللغز الذي يعتقد آينشتاين أن 98% من البشر لا يمكنهم حله ، هذا هو اللغز :

1- توجد خمس منازل لكل منها لون مختلف .

2- يسكن كل منزل شخص من جنسية مختلفه .

3- كل ساكن يفضل ان يشرب مشروبا معين , ويدخن سجائر نوع معين منها,ويحتفظ بحيوان أليف معين .

4- لاأحد من الجيران الخمسة يشرب نفس المشروب أو يدخن نفس النوع من السجائر أو لديه نفس الحيوان الأليف .

معلومات الربط :

* يسكن البريطاني في المنزل الأحمر .

* لدى السويدي كلب. * يحب الدنماركي شرب الشاي .

* البيت الأخضر على الجانب الأيسر من البيت الأبيض.



* مالك البيت الاخضر يشرب القهوة.

* الشخص الذي يشرب سجائر نوع بال مال لديه طائر.

* الرجل الذي يسكن في البيت الأوسط يشرب الحليب.

* مالك المنزل الأصفر يدخن سجائر نوع دانهيل .

* يسكن النرويجي في المنزل الاول .

* يسكن مدخن سجائر نوع مارلبور مجاورا لمن لديه قطه.

* الرجل الذي لديه حصان يسكن مجاورا لمن يدخن سجائر نوع دانهيل

* مدخن سجائر نوع وينفيلد يحب شرب الجعه (شراب الشعير).

* يسكن النرويجي مجاورا للبيت الأزرق .

* يدخن الألماني سجائر نوع روثمانز.

* مدخن سجائر نوع مارلبور لديه جار يحب شرب الماء.

المطلوب -.:

تحدد اللون / الجنسيه / الحيوان / المشروب / نوع السجائر لكل واحد مع توضيح :

من منهم لديه السمكة (أو أن حيوانه الأليف سمكة)؟

لا توجد خدعه في حل هذا اللغز , بل هو منطق صرف من يعرف الإجابة سيكون من ضمن أذكى أذكياء العالم (2% الأذكياء في العالم).

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

بداية هذه المسألة بالغة الانجليزية لنستخلص منها بعض المصطلحات

The Brit lives in the red house.
The Swede keeps dogs as pets.
The Dane drinks tea.
The green house is on the left of the white house.
The green house's owner drinks coffee.
The person who smokes Pall Mall rears birds.
The owner of the yellow house smokes Dunhill.
The man living in the center house drinks milk.
The Norwegian lives in the first house.
The man who smokes Blends lives next to the one who keeps cats.
The man who keeps horses lives next to the man who smokes Dunhill.
The owner who smokes Bluemaster drinks beer.
The German smokes Prince.
The Norwegian lives next to the blue house.
The man who smokes Blend has a neighbour who drinks water.

والآن سننقل نفس البيانات السابقة ولكن بنظام كتابة برولوج :

next_to(X, Y, List) :- iright(X, Y, List).
next_to(X, Y, List) :- iright(Y, X, List).
iright(L, R, [L [R _]]).
iright(L, R, [_ Rest]) :- iright(L, R, Rest).
einstein(Houses, Fish_Owner) :-
=(Houses, [[house, norwegian, _, _, _, _], _, [house, _, _, _, milk, _], _, _]),
member([house, brit, _, _, _, red], Houses),
member([house, swede, dog, _, _, _], Houses),
member([house, dane, _, _, tea, _], Houses),
iright([house, _, _, _, _, green], [house, _, _, _, _, white], Houses),
member([house, _, _, _, coffee, green], Houses),
member([house, _, bird, pallmall, _, _], Houses),
member([house, _, _, dunhill, _, yellow], Houses),
next_to([house, _, _, dunhill, _, _], [house, _, horse, _, _, _], Houses),
member([house, _, _, _, milk, _], Houses),
next_to([house, _, _, marlboro, _, _], [house, _, cat, _, _, _], Houses),
next_to([house, _, _, marlboro, _, _], [house, _, _, _, water, _], Houses),
member([house, _, _, winfield, beer, _], Houses),
member([house, german, _, rothmans, _, _], Houses),
next_to([house, norwegian, _, _, _, _], [house, _, _, _, _, blue], Houses),
member([house, Fish_Owner, fish, _, _, _], Houses).

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

?- einstein(Houses, Fish_Owner).

بداية ، دعني استغل ذكائك وحاول القيام بالحل بمفردك ، يمكنك التأكد من حلك باستخدام برولوج ، وفي النهاية لا تنس أن تحاول أن تتوسع في برولوج فقد تستفيد الكثير لاحقاً .

وفي الختام هذا هو الحل يمكنك اظهاره بتحديد الكلمة التالية بالماوس (الألماني) ، إذا لم يكن هذا هو حلك فأنت مرشح للانضمام إلى نادي ال 98% ، وهي نسبة ليست بسيطة كما ترى .

Read More......