Tammam Koujan

Welcome to my world

Archive for the ‘برمجة’ Category

أوبس!! هل حقا ما أراه؟

Posted by tammamkoujan on July 29, 2007

أوبس!! هل حقا ما أراه؟

بسم الله الرحمن الرحيم

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

for (float i = 0.5f; i < 1; i += 0.01f)
{
if (i == 0.6f)
{
Console.WriteLine(i);
}
}

في مقطع الشيفرة السابق أنشأت حلقة for و عرفت فيها المتحول i من النوع float و مهدته بالقيمة 0.5 و جعلت مقدار الزيادة على المتحول i في كل مرة تساوي 0.01 اي واحد بالمئة و جعلت الحلقة مستمرة طالما المتحول i اصغر من القيمة 1
حسنا كل شيء حتى الان طبيعي و صحيح
وضعت ضمن كتلة الحلقة عبارة if تقوم بطباعة قيمة المتحول i على الشاشة عندما تبلغ هذه القيمة 0.6
تبعا للشرح المنطقي السابق ستتوقع ان كل شيء صحيح و انه نتيجة تنفيذ مقطع الشيفرة السابق ستكون طباعة قيمة المتحول i عندما يصبح 0.6
اسف لان اخيب املك و اقول لك بأن شيئا لن يحدث و لن تطبع قيمة المتحول i ابدا
و للتأكد من هذا الامر قم بنسخ الشيفرة السابقة و ضعها في مشروع جديد و قم بالتنفيذ .
بعد أن تأكدنا من هذاالكلام دعنا نفسر ما الذي حدث و كيف نتجاوز هذه المشكلة
تكمن المشكلة السابقة في تعريفنا للمتحول i على انه من النوع float و الأنواع الخاصة بالفاصلة العائمة مثل float تتعامل مع الارقام و تجعلها تقوم بالعمليات الحسابية بطريقة خاصة و تحتفظ بقيمة تقريبية للناتج
للتأكد من هذا الكلام قم بتجربة الشيفرة التالية:

for (float i = 0.5f; i < 1; i += 0.01f)
{
Console.WriteLine(i);
}

سيكون الناتج كما في الصورة أدناه:

cmd.jpg

أمر مدهش أليس كذلك
لو بحثت عن القيمة 0.6 التي كنا نستخدمها في عبارة if من أجل المقارنة فلن تجدها
اذن فالمتحول i لن يحتوي على القيمة 0.6 في أي حال من الاحوال
ما هو الحل لهذه المشكلة ؟ حسنا كما اخبرتكم سابقا بسبب الطبيعة الخاصة للتعامل مع الاعداد ذات الفاصلة العائمة فسيتم تخزين قيمة تقريبية للعدد و ليس العدد نفسه لذا يمكن ان نعتبر ان المتحول i وصل للقيمة 0.6 عندما تكون قيمته قريبة جدا منها
لذا سنتستخدم الشيفرة التالية و التي ستعمل بشكل صحيح معنا:

for (float i = 0.5f; i < 1; i += 0.01f)
{
if ((i > 0.59f)&&(i < 0.6f))
{
Console.WriteLine(“0.6″);
}
}

نلتقي في الجزء الثاني مع حالة مدهشة جديدة

تمام كوجان في 29/07/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in C#, برمجة | 4 Comments »

Su Doku هيا بنا نبرمج لعبة

Posted by tammamkoujan on July 26, 2007

Su Doku هيا بنا نبرمج لعبة

بسم الله الرحمن الرحيم
Su Doku
ماذا ستتعلم من هذا الدرس :

اولا ستحصل على لعبة Su Doku مجانية ( و هو الاهم في رأيي )
كما انك ستتعلم كيفية انشاء اداتك اخاصة و برمجة خصائصها و احداثها و التعامل معها و التعامل مع الجموعات Collections إضافة إلى تعلمك كيفية انشاء الرسوم على النموذج كل هذا يتم من خلال تطبيق للـ Pocket Pc رغم انني راعيت ان يعمل التطبيق على Pc و Pocket Pc فلا داعي للقلق اذا لم يكن لديك Pocket Pc أو كانت هناك مشكلة مع المحاكي المتاح مع اللغة

هذا الدرس مطبق على :
- Microsoft Visual Studio .NET 2005
- Windows XP Professional SP2
مقدمة :

انا من الذين يؤمنون انه لتتعلم أي شيء يجب ان تستمتع فيما تتعلمه و في البرمجة بالذات المتعة في العمل هي الحافز للمتابعة و النشاط ( هذا ليس رأيك أنت ! حسنا انا اعبر عن رأيي الخاص و على فكرة من الذي اخذ رأيك )
لذا عندما قررت ان ابدا مع برمجة الكائنات في اطار عمل .NET Framework قررت ان ابرمج لعبة صغيرة حسنا فكرت ما هي اللعبة ؟ لا يوجد اية فكرة … اه فكر مرة ثانية ! لا يوجد
عندها ضربت رأسي بالحائط فسقط فكرة صغيرة اه انها لعبة Su Doku
ما هي لعبة Su Doku هي لعبة يابانية يمكن ان نشبهها بالكلمات المتقاطعة لكن لا يوجد احرف و انما ارقام
كيف تلعب : عليك أن تضع في كل حقل فارغ أحد الأرقام من 1 إلى 9 بحيث لا تستخدم الرقم نفسه أكثر من مرة واحدة في كل
خلية مؤلفة من 3*3 مربعات و ألا تستخدم الرقم نفسه أكثر من مرة واحدة في نفس الصف العمودي أو الأفقي الممتد من طرف الشبكة
إلى طرفها المقابل .

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

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

هذا يكفي كبداية و من ثم سنتوسع في تفاصيل الكائن

الان شغل Visual Studio .NET و اذهب إلى القائمة File و انقر New تظهر نافذة كما في الصورة ادناه

قم باختيار مشاريع Visual Basic .NET و انتق من Smart Device ان تنشأ Device Application

سم المشروع Su-Duko و انقر موافق .

من النافذة Solution Eplorer انقر باليمين على المشروع و اختر ADD و من ثم انقر على User Control سم الكائن MyPanel و من ثم انقر موافق
سيضاف كائن إلى المشروع , بعد اضافة الكائن انتقل إلى محرر الشيفرة الخاص بالكائن

انسخ الشيفرة التالية و ضعها عوضا عن الشيفرة الموجودة في المحرر

Public Class MyPanel

Private m_X As Integer
Public Property X() As Integer
Get
Return m_X
End Get
Set(ByVal value As Integer)
m_X = value
End Set
End Property
Private m_Y As Integer
Public Property Y() As Integer
Get
Return m_Y
End Get
Set(ByVal value As Integer)
m_Y = value
End Set
End Property

Private m_IsSelected As Boolean = False
Public Property IsSelected() As Boolean
Get
Return m_IsSelected
End Get
Set(ByVal value As Boolean)
m_IsSelected = value
End Set
End Property

Private m_Hold As Boolean = False
Public Property Hold() As Boolean
Get
Return m_Hold
End Get
Set(ByVal value As Boolean)
m_Hold = value

End Set
End Property
Public m_BackColor As Color

‘ Public Overrides Property BackColor() As Color
‘ Get
‘ Return m_BackColor
‘ End Get
‘ Set(ByVal value As Color)
‘ m_BackColor = value
‘ End Set
‘End Property

Enum MyPanelValue
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum

Private m_Value As MyPanelValue = MyPanelValue.Null
Public Property Value() As MyPanelValue
Get
Return m_Value
End Get
Set(ByVal value As MyPanelValue)
m_Value = value
End Set
End Property
Enum Group
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum
Private m_MyGroup As Group
Public Property MyGroup() As Group
Get
Return m_MyGroup
End Get
Set(ByVal value As Group)
m_MyGroup = value
End Set
End Property

Public Sub New()

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = -1
m_Y = -1
m_MyGroup = Group.Null
End Sub
Public Sub New(ByVal ValueX As Integer, ByVal ValueY As Integer)

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = ValueX
m_Y = ValueY
m_MyGroup = Group.Null
End Sub

Private Sub IncreaseValue()
If m_IsSelected = True And (Hold = False) Then
If m_Value < 9 Then
m_Value += 1
Else
m_Value = 0
End If
Else
m_IsSelected = True
End If

Me.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

‘ Dim FontFamily As New FontFamily(“Tahoma”)

Dim myFont As New Font(“Tahoma”, Me.Width / 3, FontStyle.Bold)
Dim myPoint As New Point(5, 70)
Dim solidBrush As New SolidBrush(Color.FromArgb(0, 0, 255))
Dim fs As SizeF = e.Graphics.MeasureString(m_Value, myFont)
If m_Value = MyPanelValue.Null Then
e.Graphics.DrawString(“”, myFont, solidBrush, 4, 4)
Else

‘ e.Graphics.DrawString(m_Value, myFont, solidBrush, 4, 4)

e.Graphics.DrawString(m_Value, myFont, solidBrush, _
((Me.Width – fs.ToSize().Width) / 2), _
((Me.Height – fs.ToSize().Height) / 2) _
)

End If

End Sub

Private Shadows Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
Me.Focus()
IncreaseValue()
Dim RowPanel As New MyPanels
Dim ColPanel As New MyPanels
Dim GroupPanel As New MyPanels
Dim h As MyPanel
Try

For Each h In Me.Parent.Controls
If Me.X = h.X Then
RowPanel.Add(h)
End If
If Me.Y = h.Y Then
ColPanel.Add(h)
End If
If (Me.MyGroup = h.MyGroup) Then
GroupPanel.Add(h)
End If
Next

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
RowPanel.Check(Me)
ColPanel.Check(Me)
GroupPanel.Check(Me)
End Sub
Private Shadows Sub GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
m_BackColor = Me.BackColor
If m_Hold = False Then
Me.BackColor = Color.Fuchsia
End If

End Sub
Private Shadows Sub LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LostFocus
m_IsSelected = False

‘ Me.BackColor = Color.Coral

If m_Hold = False Then
Me.BackColor = m_BackColor ‘Color.Coral
Else
Me.BackColor = Color.LightGray
End If
End Sub

End Class
Public Class MyPanels
Inherits CollectionBase

Public Sub Add(ByVal PanelToAdd As MyPanel)
List.Add(PanelToAdd)
End Sub

Public Sub Remove(ByVal PanelToRemove As MyPanel)
List.Remove(PanelToRemove)
End Sub

‘ Indexer for MyPanels

Public Property MyPanel(ByVal Index As Byte) As MyPanel
Get
Return Me.List(Index)

End Get
Set(ByVal value As MyPanel)
Me.List(Index) = value
End Set
End Property

Public Sub Check(ByRef CheckPanel As MyPanel)

For i As Integer = 0 To Me.Count – 1
If (CheckPanel.Value Su_Doku.MyPanel.MyPanelValue.Null) And (Me.MyPanel(i).Value = CheckPanel.Value) Then
Me.MyPanel(i).BackColor = Color.Red
CheckPanel.BackColor = Color.Red
Else
Me.MyPanel(i).BackColor = Color.Coral
End If
Next

End Sub
End Class

الان إلى شرح الشيفرة السابقة
• المتحول m_X يخزن هذا المتحول قيمة تمثل السطر الذي يتواجد فيه الكائن
• الخاصية X يتم من خلالها اسناد و استرجاع قيمة المتحول m_X
نلاحظ ان المتحول من نوع Private لإننا لا نريد للمستخدم الوصول إليه إلا من خلال الخاصية و التي من نوع Public مما يتيح لنا القيام بعمليات معينة عند قراءة او كتابة قيمة في المتحول من خلال خاصيته عند الحاجة
• المتحول m_Y يخزن هذا المتحول قيمة تمثل العمود الذي يتواجد فيه الكائن
• الخاصية Y يتم من خلالها اسناد و استرجاع قيمة المتحول Y_m
• المتحول m_IsSelected متحول بولياني يحدد فيما اذا كان الكائن محددا او لا
لن أشرح الخاصيات لانها كما ذكرت فقط لاسناد القيم او الحصول عليها من المتحولات
• المتحول m_Hold متحول بولياني يحدد فيما اذا كانت قيمة الكائن مثبتة ام لا ( أي ان قيمة الكائن مجمدة لا يمكن تغييرها عندما يكون المتحول True يستفاد من ذلك من اجل تبيت قيم عند بدء اللعبة مما يحدد درجة صعوبتها
• البنية MyPanelValue التي تحوي القيم اتي يجب ان يأخذها الكائن فقط
• المتحول m_Value الذي يخزن قيمة الكائن و يأخذ قيمه من البنية السابقة
• البنية Group التي تحوي المجموعة التي ينتمي إليها الكائن في Su Doku هناك تسع مجموعات اما المجموعة العاشرة Null فهي قيمة تمهيدية تعطى للكائن عند انشاءه
• المتحول M_MyGroup الذي يخزن المجموعة التي ينتمي إليها الكائن و يأخذ قيمه من البنية السابقة
• الباني New يستخدم الباني لإنشاء الكائن مع تمهيده بالقيم المناسبة حيث يأخذ افتراضيا قيمة -1 للسطر و -1 للعمود أي انه لا ينتمي لأية سطر أو عمود كما يتم تمهيد المجموعة عند القيمة Null أي انه لا ينتمي لأي مجموعة
• الباني المحمل بشكل زائد New() يتم من خلال هذا الباني انشاء كائن يتم تمهيد سطره و عموده من خلال القيم الممررة له .
• الاجرائية IncreaseValue تقوم هذه الدالة بتغيير قيمة الكائن عند النقر عليه .
• الاجرائية OnPaint التي تقوم برسم الكائن نلاحظ ان الكلمة Overrides تجعل هذه الدالة تهيمن على الحدث OnPaint الخاص بالكائن كما ان عملية الرسم تجعل النص الذي يعرض قيمة الكائن يرسم في وسط الكائن و بحجم يتناسب مع تغير حجم الكائن .

قبل المتابعة في شرح بقية الأجرائيات دعونا ننتقل إلى الصنف MyPanels الذي تم التصريح عنه في القسم الاخير من الشيفرة
نلاحظ العبارة Inherits CollectionBase التي تشير إلى وراثة هذه الفئة للفئة CollectionBase
تستخدم الفئة MyPanels كمخزن لعناصر MyPanel حيث يتم تجميع العناصر ضمن كائن من هذه الفئة

تحتوي الفئة MyPanels على الطرائق التالية :
• الإجرائية Add : تقوم هذه الإجرائية بإضافة الوسيط المرر لها إلى الكائن الذي يستدعيها
• الإجرائية Remove : تقوم بحذف الوسيط المرر لها من العناصر المخزنة في الكائن الذي يستدعيها اذا كان موجودا
• الخاصية MyPanel : تعود هذه الخاصية بالعنصر المخزن بالكائن و الذي يوافق فهرسه القيمة المررة , كما انها تسند قيمة عنصر للعنصر الذي فهرسه يوافق القيمة المكررة
• الجرائية Check تقوم هذه الإجرائية بتفحص فيما اذا كان العنصر المرر لها موجودا ضمن العناصر المخزنة ضمن الكائن . تعتبر هذه الجرائية من أهم الإجرائيات فمن خلالها نتفحص تكرار الرقم ضمن مجموعته و ضمن سطره و ضمن عموده .

الان لنتابع شرح بقية طرائق الكائن MyPanel
* الإجرائية MouseDown : للتعامل مع حدث الضغط بالفأرة نلاحظ انه للربط مع هذا الحدث هناك امران الاول ان يكون للدالة نفس عدد الوسائط التي تملكها الإجرائية MousDown التقليدية إضافة إلى إضافة العبارة Handles MyBase.MouseDown إلى نهاية السطر الذي صرحت فيه الإجرائية .
نلاحظ أن مهمة هذه الدالة هي : عند الضغط على الكائن قم بتحديده و من ثم قم بزيادة قيمته ثم يتم تعريف ثلاث متحولات من نوع MyPanels الأول يستخدم لتجميع العناصر الموجودة في نفس سطر الكائن
الثاني يستخدم لتجميع العناصر الموجودة في نفس عمود الكائن أما الثالث فيستخدم لتجميع العناصر التي تنتمي لنفس المجموعة , بعد أن نقوم بملئ المتحولات السابقة بالعناصر المناسبة من خلال حلقة
نستدعي إجرائية Check لكل منها

و هكذا أكون قد شرحت الأجزاء المهمة من الفئة MyPanel و الفئة MyPanels

ننتقل الأن إلى النموذج الرئيسي للمشروع اسم هذا النموذج هو MainForm لا تسأل لماذا فهي عادة عندي , فلنذهب الان إلى الإجرائية DrawCells تقوم هذه الإجرائية برسم العناصر على النموذج مع تمهيد مجموعة كل عنصر و سطره و عموده .
تستدعى الإجرائية السابقة في الباني New الخاص بالنموذج
الان بقي لدينا الحدث Paint للنموذج يتم من خلال هذا الحدث رسم الخطوط التي تؤلف لوحة الـ Su Doku

و أخيرا أصبح لديك لعبة سودوكو التي طالما حلمت بها لكن هل هذا كل شيء لا طبعا يمكنك ان تطور هذه اللعبة كأن تضع عدادا يشير إلى المدة الزمنية التي تنقضي منذ بدأ اللعبة كما يمكنك ان تكتب خوارزمية الحل
و تضع زرا لحل اللعبة عند فشل اللاعب بالحل كما و يمكنك أن تضيف امكانية حفظ اللعبة الحالية و تحميل لعبة محفوظة من خلال ملفات XML الأمر ليس صعب انشأ حلقة تمر على كل عنصر Mypanel و تقوم بحفظ خواصه الاساسية

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

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

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://www.enashir.com/blogs/TammamKoujan
أو يمكنك زيارة مندى المبرمجين العرب حيث اشارك في منتديات البرمجة هناك http://www.arabteam2000.com
اذا كنت ترغب بمراسلتي Tammam84@Yahoo.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .

الشيفرة :

لتحميل شيفرة البرنامج :
SuDoku.zip
للتحميل هذه المقالة بصيغة ملفات word :
Su_Doku.doc

كلمة أخيرة :

اتمنى ان تكون قد استفدت من الدرس , اذا كان عندك اية ملاحظات او اكتشفت اي خطأ أو كنت تملك معلومات اضافية قد تساعدني
اتمنى ان تراسلني و تخبرني بما عندك .

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://tammamkoujan.wordpress.com/

اذا كنت ترغب بمراسلتي tmmamkoujan@gmail.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .
تمام كوجان
‏الثلاثاء‏، 24‏ كانون الثاني‏، 2006

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

ملاحظة : كتب هذا الموضوع بالاصل بتاريخ 28‏ كانون الثاني‏، 2006 كما ذكر في نص المقالة
و قد نشر في منتديات الفريق العربي للبرمجة على الرابط:
Su Doku هيا بنا نبرمج لعبة
تمام كوجان في 26/07/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 3 Comments »

الجديد من ميكروسوفت

Posted by tammamkoujan on July 22, 2007

الجديد من ميكروسوفت

وصلتني رسالة إلكترونية من ميكروسوفت تتحدث عن موعد الطرح النهائي للمنتجات الجديدة للشركة
و اضع بين ايديكم الجزء الرئيسي من الرسالة و قد ترجمت القسم الاول منها نظرا لأهميته:

شباط (فبراير) سيصل أسرع مما تعتقد:

لماذا هو الامر مهم ان تنتظر منتصف الشتاء و أنت ما زلت في منتصف الصيف؟ الجواب هو ان شهر شباط (فبراير) 2008 سيكون مختلفا كونه سيكون شهر ميكروسوفت الذي ستطرح فيه أكبر عدد من منتجاتها المهمة على الإطلاق ذلك من خلال نسخ RTM من Visual Studio 2008 و Windows Server 2008 و SQL Server 2008 .
و يمكن أن تبدأ بالتحضير من الان. فالاصدار القادم من فيجوال ستوديو Microsoft Visual Studio 2008 (و المعروف بالاسم الكودي “Orcas” ) سيوفر للمطورين اختبار Windows Vista و كذلك نظام Microsoft Office 2007 إضافة إلى الويب
و لتوفر إمكانية الاختبار و التجريب المبكر فقد وفرت ميكروسوفت إصدارات Community Technology Preview (CTP) و Beta
من Visual Studio 2008

February will arrive sooner than you think.

Why is it so important to consider the middle of winter in the middle of summer? Because February 2008 is shaping up to be Microsoft’s largest launch month – ever – with RTMs of Visual Studio 2008, Windows Server 2008, and SQL Server 2008 all on tap. And you can begin preparing now. The next version of Visual Studio, Microsoft Visual Studio 2008 (formerly known as Microsoft Visual Studio code name “Orcas”), will provide a developer experience for Windows Vista, the 2007 Microsoft Office system, and the Web. To enable early feedback, Microsoft provides Community Technology Preview (CTP) and Beta releases of Visual Studio 2008. Get an early look at Visual Studio 2008 Beta 1 and check back for the late-summer Beta 2 release.

If you create software development tools, you’ll want to consider building on the Visual Studio 2008 Shell, a streamlined Visual Studio development environment that provides the core foundation so you can focus on building your tool’s unique features. Created in response to requests from our partners, the Visual Studio Shell gives you the option of integrating your tools with Visual Studio or creating an isolated, custom-branded application.

If you are building on the new features in the .NET Framework 3.0, such as Windows Workflow Foundation (WF), Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF), and Windows CardSpace, you’ll want to preview the The .NET Framework 3.5 Beta 1 release, which will ship with Visual Studio 2008. .NET Framework 3.5 adds several new features, including integration of Language Integrated Query (LINQ); ASP.NET AJAX; new Web protocol support for building WCF services including AJAX, JSON, REST, POX, RSS, and ATOM; full tooling support for WF, WCF, and WPF; and new classes in the base class library (BCL).

Speaking of ASP.NET, MSDN is now offering the ASP.NET “How Do I” video series, with dozens of videos designed for all ASP.NET developers, from the novice to the professional. If you are new to ASP.NET, you can learn the basics of how to create dynamic Web applications with ASP.NET 2.0 and Visual Web Developer 2005 Express Edition, using either Visual Basic or C#. If you have a bit of development experience, you will learn how to employ some of the great new features introduced in ASP.NET 2.0. New videos are added every week, so check back often.

And here’s a learning tip that comes with free stuff. Register to attend an MSDN Event near you from August through September in one of dozens of U.S. locations, and you’ll receive a copy of the MSDN Events Technical Resource Kit, which includes access to the latest builds of new technologies, including Visual Studio 2008, a sample Silverlight application (with source code), free trials of Microsoft Expression suite products, Visual Web Developer 2005, and more.
Thanks for reading.
Editor, MSDN Flash

Posted in C Sharp, C#, SQL Server, برمجة, تكنولوجيا | 4 Comments »

خوارزمية المطابقة الصوتية SoundX

Posted by tammamkoujan on April 8, 2007

خوارزمية المطابقة الصوتية SoundX

بسم الله الرحمن الرحيم
اظن ان هذه المقالة هي اول مقالة تكتب عن خوارزمية صوتية تدعم اللغة العربية
ستفهم مبدأ عمل الخوارزمية من خلال المقالة و ستتمكن من تحميل مثال كتبته لتطبيق الخوارزمية
على اللغة العربية المثال مكتوب بلغة الـ C Sharp.
في عام 1935 قامت هيئة الإحصاء الامريكية بتصميم خوارزمية SoundX , و هي خوارزمية تقوم بتحويل الكلمات إلى ما يسمى (اكواد SoundX) ثابتة الطول
تقوم الخوارزمية على تقسيم الكلمات المتشابهة صوتيا في مجموعات مبنية على صفات صوتية مميزة.
يوضحها الجدول التالي :
post-63163-1174742488.jpg

لتشفر اسما ما فإن الخوارزمية تحفظ الحرف الأول من الاسم ثم تستبتدل الأحرف الصامتة التي تليه بالقيم الرقمية المعروضة في الجدول السابق , اما الاحرف الصوتية و كذلك الأحرف ( h, w , y ) يتم تجاهلها لأن المعلومات الصوتية التي تقدمها هذه الحروف تسبب غاليا لبسا او غموضا عندما ترفق مع حروف أخرى.
اذا ما جاء حرف صامت متكررا وراء نفسه فإنه يمثل لمرة واحدة في الكود .

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

اذا سيتقسم عملنا إلى ما يلي :
- إبقاء الحرف الاول من الاسم .
- استبدال المحارف (a, e, i, o, u, h, w,y) بالرقم 0
- استبدال المحارف (b, f, p, v) بالرقم 1
- استبدال المحارف (c, g, j, k, q, s, x, z) بالرقم 2
- استبدال المحارف (d, t) بالرقم 3
- استبدال المحارف (l) بالرقم 4
- استبدال المحارف (m, n) بالرقم 5
- استبدال المحارف r بالرقم 6

بعدها نخزن الكود الناتج عن كلمة و عندما يدخل المستخدم كلمة نقوم بالبحث عن الكلمات التي لها نفس الكود الصوتي .

بالنسبة للغة العربية قمت بعمليات بحث كثيرة عن نسخة عربية من SoundX لكن لم اجد فبدأت ببعض التجارب الشخصية بناء على فكرة النسخة الانجليزية لكن لم تكن النتائج مرضية إلى ان وجدت ورقة بحث لفريق من الباحثين من معهد ايلينويس للتكنولوجيا Illinois Institute of Technology قام بها خمسة باحثين من المعهد في العام 2006 للحصول على نسخة عربية من SoundX و كانت نتائج البحث رائعة لكن التطوير عليها ما يزال ممكنا للحصول على نتائج أفضل .

و ما دمنا حصرنا الحروف العربية في مجموعات مناسبة اذا اصبح بامكاننا تنفيذ العملية كما نفذناها مع النسخة الانجليزية.

الان إلى الشيفرة :
في الأسفل مثال كامل عن استخدام SoundX من اجل اللغة العربية و الانكليزية على حد سواء , و المثال مكتوب بالـ C#
p5ost-63163-1174742777.jpg
و فيما يلي روابط تتحدث عن برمجة SoundX للغة الانكليزية بعدة لغات برمجة :
Vb.NET و C#
Soundex Implementation in C# and VB.NET
Delphi :
1971. Searching Strings by the way they sound
ليست افضل الخوارزميات الصوتية و هي مجرد بداية و النسخة العربية الموجودة في موضوعنا ما تزال بحاجة
للتطوير كما انه هناك خوارزميات صوتية اخرى بحاجة للدراسة اذ انه في العادة يتم دمج نتائج عدة خوارزميات صوتية للحصول على افضل النتائج (انا اعمل على ذلك لكن بشكل متقطع و انا لست ملزما ان اكمل او اتابع)

هناك العديد من الخوارزميات الصوتية مثل :
Soundex
Levenshtein
Metaphone
Phonix
n-gram
الخوارزميات الصوتية تقسم إلى نوعين :
1 – خوارزميات مرتبطة باللغة و ميزاتها مثل SoundX حيث لا يمكن ان نطبق النسخة الانكليزية على اللغة العربية
2 – خوارزميات مستقلة عن اللغة اي يمكن تطبيقها على اية لغة مباشرة مثل Levenshtein
من التطبيقات الشائعة للخوارزميات الصوتية محررات النصوص مثل MS Word فأنت عندما تكتب كلمة انكليزية بشكل خاطئ
تجد ان المحرر يقترح عليك عدة تصحيحات لكلمات لها نفس اللفظ الصوتي للكلمة التي ادخلتها

ملاحظة مهمة : المثال المرفق يتعامل مع قاعدة بيانات MS SQL Server
بالنسبة لقاعدة البيانات فقط قموا بإنشاء قاعدة بيانات SQL Server جديدة و من ثم قوموا باضافة جدول
مؤلف من ثلاث حقول هي
id من نوع int
name من توع VarrChar
value من نوع VarChar

لتحميل الشيفرة : انقر هنا

تمام كوجان في 08/04/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in برمجة | 2 Comments »

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

Posted by tammamkoujan on March 17, 2007

الربط مع قواعد البيانات في الدوت نت
Data Access with .NET

بسم الله الرحمن الرحيم
ماذا ستتعلم من هذا الدرس :

مستوى الدرس : مبتدأ

لغة البرمجة : C# , VB.NET

مضمون الدرس : اذا كنت مبتدأاً يعلمك هذا الدرس واحدة من طرق الربط مع انواع مختلفة من قواعد البيانات

البداية :

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

هذا الدرس مطبق على :
- Microsoft Visual Studio .NET 2005
- Microsoft SQL Server 2000
- Microsoft Access 2003

مقدمة :

إذا كنت تبرمج برنامجا يعتمد على قواعد البيانات و إذا كنت كسولا مثلي فلربما ستسأل نفسك ألا يوجد طريقة بسيطة و سهلة تريحني من كتابة عبارة الإتصال التي ارتبط بها مع قاعدة البيانات , تهانينا ستجد هنا الطريقة السحرية التي طالما حلمت بها .
في دوت نت يمكنك الارتباط بقواعد البيانات من خلال فضائي الاسماء :
- System.Data.SqlClient : هذا الفضاء مخصص للتعامل مع قواعد بيانات Microsoft SQL Server .
- System.Data.OleDb : هذا الفضاء مخصص للتعامل مع بقية أنواع قواعد البيانات التي تدعم OLE مثل
Microsoft Access.
ملاحظة : بما ان SQL Server تدعم OLE فيمكنك التعمل معها من خلال الفضاء System.Data.OleDb لكن
الفضاء System.Data.SqlClient هو الافضل و الاسرع في التعامل مع SQL Server .

كبداية سريعة إنطلق مباشرة إلى سطح مكتبك (لا أقصد سطح مكتبك في الغرفة بل الذي في حاسبك) و انقر بزر الفأرة الأيمن في أي مكان فارغ فيه , ثم انقر على الخيار “New” ثم اختر مستند نصي “Text Document”
كما في الصورة التالية :

1.JPG

قم بتغيير اسم الملف إلى Connection.udl (عند تغيير اسم الملف تأكد من أنك غيرت لاحقته فعلا و إلا فإنه سيبقى ملفا نصيا )

عند تغيير اسم الملف ستظهر لك الرسالة التالية :

2.JPG

انقر Yes , ستتحول أيقونة الملف إلى الشكل التالي :

3.JPG

سنبدأ أولا بالاتصال مع قاعدة البيانات SQL Server 2000 , انقر على الملف , سفتح لك نافذة قد تكون مألوفة لك اذا كنت قد كتبت تطبيقات قواعد بيانات من قبل .
اذهب إلى الصفحة Provider:

4.JPG

قم باختيار Microsoft OLE DB Provider for SQL Server (يبدو انك قد لاحظت كلمة OLE في العبارة رغم
اننا قلنا بأنه لن نستخدم OLE في الاتصال بـ SQL Server ثق بي فقط و أكمل)
انقر على الزر Next , ستنتقل عندها إلى الصفحة Connection

5.JPG

قم بتحديد اسم السرفر الذي تتواجد عليه SQL Server ( في مثالنا هذا هو TAMMAM_PC )
ثم قم بتحديد طريقة الدخول للقاعدة (في المثال قمت باستخدام أمان ويندوز) , في الجزء الثالث و الأخير أنقر على
القائمة المنسدلة و قم بتحديد قاعدة البيانات التي تريد الاتصال بها (في هذا المثال استخدم قاعدة Northwindالمرفقة مع SQL Server كمثال) , الان كل شيء جاهز تقريبا انقر على الزر Test Connection اذا كان كل شيء صحيحا ستظهر لك الرسالة التالية :

6.JPG

انقر زر OK لتغلق الرسالة ثم زر OK لتغلق النافذة .

اذهب الان إلى Visual Studio .NET قم بإنشاء مشروع جديد (رغم أنني سأضع الشيفرة بالـ C# و الـ VB.NET إلا
ان الصور ستكون للمشروع المكتوب بالـ C# ) و قم بتسميته CreateConnection كما في الصورة :

7.JPG

قم بإضافة زر إلى النموذج و قم بتغيير خاصية الـ Text له إلى : SQL Server Test Connection كما في الشكل :

8.JPG

انقر بزر الفأرة الأيمن على النموذج و اختر View Code , قم بإضافة فضاء الاسماء System.Data.SqlClient
إلى البرنامج في الجزء العلوي من الشيفرة و ذلك لدعم SQL Server :

C# :

using System.Data.SqlClient;

VB.NET :

Imports System.Data.SqlClient

عد إلى واجهة التصميم و انقر على الزر ثم قم بكتابة ما يلي :

C# :

try
{
SqlConnection objConn = new SqlConnection();
objConn.Open();
objConn.ConnectionString = “”;
MessageBox.Show(“Hello” + (char)13 + ” I am Connected to SQL Server 2000″);
}
catch (Exception ex)
{
MessageBox.Show(“Can not Connect to the database “+ex.Message);
}

VB.NET :

Try

Dim objConn As New SqlConnection()
objConn.ConnectionString = “Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=TAMMAM_PC”
objConn.Open()
MessageBox.Show(“Hello” + vbCrLf + “I am Connected to SQL Server 2000″)
Catch ex As Exception
MessageBox.Show(“Can not Connect to the database ” + ex.Message)
End Try

الان نعود إلى ملف Connection.udl الذي أنشأناه في بداية هذا الدرس , قم بالنقر باليمين على الملف ثم اختر
Open With ثم قم بإختيار Notepad :

9.JPG

بدءاً من عبارة Integrated Security قم بنسخ السطر إلى نهايته (لاحظ اننا تجاهلنا العبارة Provider=SQLOLEDB.1; في
بداية السطر لأننا نتصل من خلال الفضاء System.Data.SqlClient و ليس من خلال
System.Data.OleDb رغم انه يمكنك تجاهلها بالنسبة لـ OLE أيضا لانه القيمة الافتراضية لكن من الفضل وضعها عند استخدامه)
و من ثم الصقه في الشيفرة عند objConn.ConnectionString في مثالنا سيكون بالشكل التالي :

C# :

objConn.ConnectionString = ” Integrated Security=SSPI;Persist Security
Info=False;Initial Catalog=Northwind;Data Source=TAMMAM_PC”;

VB.NET :

قم بضغط F5 سيتم تنفيذ البرنامج انقر على الزر و اذا مان كل شيء صحيحا ستظهر لك الرسالة التالية :

10a.JPG

الان انهينا ما يتعلق بالاتصال بـ SQL Server و ننتقل إلى الاتصال من خلال OLE

قم بإنشاء ملف Microsoft Access جديد , ثم قم بالنقر على الملف Connection.udl الذي أنشأناه اذهب إلى الصفحة
Provider و قم باختيار Microsoft Jet 4.0 OLE DB Provider انقر على الزر Next سيتم نقلك إلى الصفحة Connection قم بتحديد مسار القاعدة ثم انقر الزر Test Connection انقر OK ثم OK .

قم بإضافة زر جديد إلى البرنامج اكتب في خاصية Text للزر : OLE DB Test Connection
قم بإضافة فضاء الاسماء System.Data.OleDb إلى البرنامج في الجزء العلوي من الشيفرة و ذلك لدعم OLE :

C# :

using System.Data.OleDb;

VB.NET :

imports System.Data.OleDb

عد إلى واجهة التصميم و انقر على الزر الثاني ثم قم بكتابة ما يلي :
C# :

try
{
OleDbConnection objConn = new OleDbConnection();
objConn.ConnectionString = “”;
objConn.Open();
MessageBox.Show(“Hello” + (char)13 + “I am Connected to OLE DB”);
}
catch (Exception ex)
{
MessageBox.Show(“Can not Connect to the database ” + ex.Message);
}

VB.NET :

Try

Dim objConn As New OleDbConnection()
objConn.ConnectionString = “”
objConn.Open()
MessageBox.Show(“Hello” + vbCrLf + “I am Connected to OLE DB”)

Catch ex As Exception

MessageBox.Show(“Can not Connect to the database ” + ex.Message)
End Try

الان نعود إلى ملف Connection.udl الذي عدلنا الاتصال فيه , قم بالنقر باليمين على الملف ثم اختر
Open With ثم قم بإختيار Notepad :

11.JPG

بدءاً من كلمة Provider قم بنسخ السطر إلى نهايته , و من ثم الصقه في الشيفرة عند objConn.ConnectionString في مثالنا سيكون بالشكل التالي :
C# :

objConn.ConnectionString = @” Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;Persist Security Info=False”;

VB.NET :

objConn.ConnectionString = ” Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Test.mdb;Persist Security Info=False”

قم بتنفيذ البرنامج ثم اضغط الزر الثاني ستظهر لك الرسالة :

12.JPG

هكذا تكون تعلكت كيف تنشأ عبارة الاتصال مق قواعد بيانات SQL Server و OLE و بالتالي اصبح من السهل عليك ان تتوسع و تربط مع اي قاعدة بيانات تريدها

الشيفرة :

لتحميل شيفرة البرنامج :
CreateConnection.zip

كلمة أخيرة :

اتمنى ان تكون قد استفدت من الدرس , اذا كان عندك اية ملاحظات او اكتشفت اي خطأ أو كنت تملك معلومات اضافية قد تساعدني
اتمنى ان تراسلني و تخبرني بما عندك .

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://tammamkoujan.wordpress.com/
اذا كنت ترغب بمراسلتي Tammam84@Yahoo.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .

تمام كوجان في 17/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in برمجة | 8 Comments »

إلتقط الصور باستخدام الجهاز الكفي من خلال برنامجك

Posted by tammamkoujan on March 14, 2007

إلتقط الصور باستخدام الجهاز الكفي من خلال برنامجك

ألم تفكر يوما بأن تستعيض ببرنامج الكاميرا ببرنامج اخر من كتابتك يتضمن بعض الأمور التي لا يوفرها البرنامج الأصلي او كنت كمبرمج تكتب برنامجا يتطلب تشغيل الكاميرا و التقاط الصور لهدف معين
سنتحدث في هذه المقالة عن تشغيل الكاميرا و التقاط الصور على أجهزة البوكت بي سي Pocket PC و الهواتف الذكية Smart Phones

أولا انشأ مشروع جهاز ذكي جديد في Visual Studio 2005 في هذه المقالة سننشأ مشروع Windows Mobile 5.0 Pocket PC

بعد إنشاء المشروع قم بإضافة مرجع لفضاء الاسماء Microsoft.WindowsMobile.Forms في المشروع و ذلك من خلال القائمة Project ثم النقر على Add Reference

ثم استخدام الفضاء كالتالي :

using Microsoft.WindowsMobile.Forms;

اضف إلى النموذج أداة صورة Picture و أداة زر Button
نضع في الزر الشيفرة التالية:

CameraCaptureDialog myCapture = new CameraCaptureDialog();
myCapture.Mode = CameraCaptureMode.Still;
myCapture.Resolution = new Size(160, 160);
myCapture.StillQuality = CameraCaptureStillQuality.High;
myCapture.ShowDialog();
string strFileName = “”;
strFileName = myCapture.FileName;
pictureBox1.Image = new Bitmap(strFileName);

للتحكم بالكاميرا يتم باستدعاء CameraCaptureDialog الخاص بنظام التشغيل
في الشيفرة السابقة نعتمد على CameraCaptureDialog لكنه لا يتيح لنا الحصول على الصورة مباشرة
عندما نشغل CameraCaptureDialog من خلال برنامجنا و نلتقط الصورة كما قلت لن نحصل
على الصورة الملتقطة مباشرة لكننا سنحصل على مسارها الذي حفظت فيه
ثم نحملها إلى برنامجنا

انتبه لأمر مهم توابع الكاميرا غير موجودة في Pocket PC 2003
لكنها موجودة في Windows Mobile 5.0 كما انها موجودة في Smart Phone 2003 فما بعد

لتحميل الشيفرة :CameraTest.zip

تمام كوجان في 15/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 1 Comment »

مكون EAN 13 Barcode

Posted by tammamkoujan on March 7, 2007

مكون EAN 13 Barcode

بسم الله الرحمن الرحيم
EAN 13 Barcode

أقدم لكم مكون Ean13 Barcode لانشاء الباركود من نوع EAN13 و المستخدم على نطاق واسع في مختلف انواع المنتجات
هذا المكون قمت بكتابته في اواخر شهر اذار 2006 و لم تسنح لي الفرصة من وقتها لإكماله (ليس على قائمة اولوياتي حينها)
لكني حاليا بدأت بالعمل على نسخة احترافية و سوف اتابع في سلسلة مكونات الباركود وصولا إلى الانواع المعقدة مثل PDF417 لكني اظن ان النسخة الاحترافية الكاملة لن تكون مجانية
المكون الحالي مكتوب بالـ VB.NET لكن سيكون طقم الادوات القادم بالـ #C
المكون غير مكتمل تماما و لكن النواقص فيه بسيطة جدا فهو يحتاج إلى ضبط القياسات بدقة اكبر و ضبط قياس الاعمدة عند تغير قياس المكون إضافة لبعض الخاصيات المتممة و التوسعات لكنه بشكل عام يعمل و قد جربته حتى ان قارئ الباركود كان يلتقطه من على شاشة الكمبيوتر

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

تمام كوجان في 07/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها و الاستفادة من الشيفرة المتاحة بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in برمجة | 1 Comment »

بعض المفاهيم في .NET

Posted by tammamkoujan on March 2, 2007

بعض المفاهيم في .NET

اشتريت مؤخرا كتابا يتحدث عن برمجة .NET Compact Framework , و بدأت القراءة فيه
و كان الجزء الأول من الكتاب يتحدث عن مفاهيم .NET Framework و ألية عمله و تصميمه
بعض مميزات المترجمات للغات الدوت نت
سأحاول أن أشارككم ببعض النقاط المهمة من هذا الكتاب

private void SayHello()
{
string str1 = “Hello”;
StringBuilder sb1 = new StringBuilder(“Hello”);
MessageBox.Show(“Hello”, “Hello”);
}

في المثال السابق نلاحظ أن كلمة Hello قد تكررت أربع مرات فهل يتم حفظ أربع كلمات Hello
في التطبيق الذي أنشأناه , فعليا لا يتم ذلك بل يقوم المترجم بإضافة اربع مؤشرات تدل لعبارة Hello واحدة
و بالتالي سيكون حجم الملف التنفيذي أصغر مما كان ممكنا أن يكون لو تم تخزين أربع كلمات “Hello”

نتحدث عن الانواع القياسية للبيانات في .NET :
هناك نوعان قياسيان :
Value Types : و هي انواع بسيطة معدة لتخزن بيانات مجردة
أمثلة على Value Types :

Integers

Floating-point numbers

Data structures

Enumerations

الهدف من Value Types ان تكون صغيرة و سريعة , و عندما تستخدم كمتحولات محلية
فإنها تتوضع في المكدس Stack , و عندما تحتوى في object فإنها تمثل على شكل stream بسيط من البايتات

كل الـ value types تتفرع عن صنف اساسي هو System.ValueType
و هذا الصنف يتفرع بدوره عن System.Object
الـ value types لها محدودياتها أيضا , فبينما تعرف على أنها أصناف .NET , فإنها بحد
ذاتها تعتبر أصنافا مغلقة , أو بعبارة أخرى لا يمكنك ان تستخدم System.Int32 (او اي value-type class أخر)
كصنف رئيسي (base class ) لأنواع أخرى
ايضا المتحولات من نوع value-type يجب ان تحتوي دوما على قيمة ما و يجب ألا تكون فارغة

Reference Types

أغراض الـ Reference Types يمكن الوصول لها في زمن التنفيذ باستخدام مرجع (Reference )
هو مؤشر للغرض بحد ذاته .

أمثلة على reference types :
Objects created from a class

Objects encapsulating Win32 system objects (forms, controls, graphic objects, threads, mutexes, files, and so on)

Arrays

Strings

كل غرض (object ) يمتلك ترويسة غرض قياسية (standard object header)
حجم ترويسة الغرض هو 8 بايت
و الحجم لأصغر غرض ممكن هو 12 بايت
و بالتالي فإن reference types تأخذ مساحة أكبر مما تأخذه value types

Reference types تمتلك دعما تاما للبرمجة غرضية التوجه
و من اكثر ميزاتها فائدة هي الوراثة , كما بمكن ان تكون قيمتها null

النقطة التي اريد التركيز عليها هي التالية :
استخدام Value Types و Reference types كمتحولات
Value Types يمكن ان تمرر بالقيمة او بالمرجع
عندما تمررها بالقيمة فإن نسخة من قيمة المتحول توضع في المكدس (stack)
و بالتالي فن الدالة المستدعية ستتعامل مع نسخة من المتحول و لن تؤثر على قيمة المتحول الأصلية
أما عندما تمررها بالمرجع فإنه يتم وضع مؤشر في المكدس يشير إلى القيمة
و الدالة التي تستدعي المتحول تستطيع ان تغير قيمته
فكرة التمرير بالقيمة و المرجع فكرة معروفة لكثيرين لكن ليس هذا بيت القصيد اكملوا معي
المتحول من نوع reference-type يحتوي على مؤشر يشير للغرض
هنا قد يحصل بعض الارباك
هناك نوعان Value Types و reference-type و هناك طريقتان لتمرير المتحولات
بالقيمة (Value ) و بالمرجع (reference)

لذا قد تكون توقعت انه يجب ان نمرر Value Types بالقيمة (Value ) و reference-type بالمرجع (reference) ؟

الـ Value Types كما ذكرنا تمرر بالقيمة و بالمرجع
أما الـ reference-type فتمرر على نحو مألوف عادة بالقيمة و ليس بالمرجع

السبب هو ان قيمة الـ reference-type هي عبارة عن مؤشر , و بالتالي قيمتها هي القيمة نفسها التي تمرر بين الدوال (و ليس نسخة عنها)
من دون شك يمكنك ان تمرر reference-type بالمرجع لكن هذا يؤدي إلى الحصول على مؤشر لمؤشر , و هذا ما يحص نادرا
و هذه الامكانية تحدث لحالات قليلة كبعض الاستدعاءات لـnative code عند الحاجة

تمام كوجان في 02/03/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in برمجة | Leave a Comment »

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي 2

Posted by tammamkoujan on February 19, 2007

مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي 2
Pocket PC Controlled – Wireless Car 2

ذكرت في الموضوع السابق مشروع التحكم بسيارة لاسلكياً من خلال الجهاز الكفي اننا سنستخدم منفذ USB الموجود
على الجهاز الكفي Pocket PC للقيام بعملية التحكم
لذا يجب ان ندرس منفذ USB و نتعرف عليه

ما هو الـ USB؟

كلمة USB تشير إلى العبارة Universal Serial Bus و هو معيار اتصال عالي السرعة يوفر واجهة (interface) توصيل ركب و شغل (Plug And Play) بسيطة إلى الأجهزة كأجهزة المودم و الكاميرات الرقمية و كاميرات الفيديو و لوحات المفاتيح و الفأرة .

أشكال وصلة USB :

تظهر الصورة التالية الاشكال المتاحة لوصلات USB .

USB ConnectorsType
بنية كبل الـ USB :

توضح الصورة التالية بنية كبل الـUSB .

USB-Cable

يرمز للـ USB بأيقونة على شكل رمح ثلاثي كما في الصورة ادناه

USB-Symbol
معلومات تقنية : محدوديات USB :

يوضح الجدول التالي امكانيات و محدوديات USB

USB-Properties

يقصد من Tiers Bus انه يمكننا توصيل أجهزة USB حتى خمسة مستويات (تخيل الأمر ببنية شجرية)
اما Device Bus فيعني انه يمكن توصيل حتى 127 جهاز معا من خلال USB

اذا احببت ان تتعرف USB بشكل اوسع يمكنك زيارة المواقع التالية :
Universal Serial Bus
Universal Serial Bus – wikipedia
Universal Serial Bus – Intel

نكمل في الحلقة القادمة حيث ستظهر أول المشاكل و أخطرها

تمام كوجان في 19/01/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC, برمجة | 3 Comments »

.NET Micro Framework, I Love It

Posted by tammamkoujan on February 17, 2007

.NET Micro Framework
I Love It

تحدثت في موضوع سابق : ميكرو و ما ادراك ما ميكرو عن أطلاق .NET Micro Framework
كل يوم تظهر معلومات جديدة عنه و كلما تعرفت على ميزاته زاد حبي له
في هذا الموضوع سنستعرض المزيد عن .NET Micro Framework من خلال بعض الصور و مقاطع الفيديو

و الان إلى بعض الصور:

10microframework.jpg

moneyshot.jpg

02sumobot.jpg

moneyshot1.jpg

و للمزيد عن المعلومات عن .NET Micro Framework و متابعة المستجدات يمكنك
زيارة الموقع التالي : .NET Micro Framework

تمام كوجان في 17/02/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in .NET Micro Framework, برمجة | Leave a Comment »