الأحد، 21 يوليو 2013

دورة السي شارب الدرس 12- Multi-Threading


دورة السي شارب
الدرس 12- Multi-Threading

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

في درسنا اليوم سوف ندرس ال Multi-Threading (( المسارات المتعددة )) وهي مهمة جدا لأي برنامج يحوي على عمليات خارجية مثل القيام بفحص للفيروسات من قبل برنامج Anti-Virus أو جلب أسماء ملفات ما وما شابه ذلك...

سوف نستخدم في هذا الدرس المجال
System.Threading.Thread
لذلك قم من الان باستيراده

تبيين فائدة ال Multi-Threading ...

سوف أقوم بمقارنة مباشرة لذلك أولا سوف نستخدم برنامج لجلب أسماء الملفات بنفس الThread قم سوف نقوم ببرنامج اخر يقوم بنفس الوظيفة ولكن يستخدم Multi-Threading ...
وسوف يقوم البرنامج بعد جلب أسماء الملفات بكتابتها في ملف نصي...

البرنامج الأول: ( Single Threading ):

قم بإنشاء مشروع WindowsFormsApplication جديد وضع به Button

الكود البرنامج بعض وضع الأداة كاملا (( للإختصار )):


كود:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication20
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Collections.ArrayList myarr = new System.Collections.ArrayList();
private void button1_Click(object sender, EventArgs e)
{
if (System.IO.Directory.Exists("c:\test") == false)
{
System.IO.Directory.CreateDirectory(@"c:\test");
}
foreach (string x in System.IO.Directory.GetFiles(@"c:\windows\system32"))
{
myarr.Add(x);
}
System.IO.StreamWriter myw = new System.IO.StreamWriter(@"c:\test\mytest.txt");
foreach (string fx in myarr)
{
myw.WriteLine(fx);
}
myw.Close();
}
}
}
جرب البرنامج بالضغط على الButton ولاحظ... سوف يتوقف البرنامج عن العمل لمدة حوال 1 ثانية ثم يتم إضافة أسماء الملفات الموجودة في c:\windows\system32 إلى الملف...
حسنا الان مع حوال 2000 ملف توقف البرنامج لمدة 1 ثانية ماذا لو كنا نود عمل فحص للكومبيوتر كاملا؟؟؟؟ سوف يتوقف البرنامج عن العمل لمدة قد تصل إلى 30 دقيقة أو أكثر (( الشيئ متعلق بسرعة الكومبيوتر وكمية الملفات ))
(( ملاحظة إذا لم تلاحظ توقف الكومبيوتر فأعد التجربة في مكان يحوي على ملفات أكثر ))

--- وهنا ومن أجل ذلك تم إختراع مبدأ ال multi-threading حيث أصبح بإمكانك عمل كل تحركاتك دون أي تأثير على أداء البرنامج لنأخذ مثال على نفس البرنامج مع ال multi-threading

ضع أيضا نقس الأدوات السابقة (Listbox,Button) واكتب الكود التالي:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication20
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
System.Collections.ArrayList myarr = new System.Collections.ArrayList();
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread mythread = new System.Threading.Thread(dowork);
mythread.Priority = System.Threading.ThreadPriority.Lowest;
mythread.Start();
}
private void dowork()
{
if (System.IO.Directory.Exists("c:\test") == false)
{
System.IO.Directory.CreateDirectory(@"c:\test");
}
foreach (string x in System.IO.Directory.GetFiles(@"c:\windows\system32"))
{
myarr.Add(x);
}
System.IO.StreamWriter myw = new System.IO.StreamWriter(@"c:\test\mytest.txt");
foreach (string fx in myarr)
{
myw.WriteLine(fx);
}
myw.Close();
MessageBox.Show("Progress Completed!");
}
}
}
سوف تلاحظ عمل نفس الشيئ ولكن دون أي توقف أو بطئ للبرنامج مهما كان عدد الملفات...

أهم ما في الفئة Thread ...

1- Start وهي لبدأ ال Thread
2-Suspend لإيقاف الThread مؤقتا...
3- Abort لإيقاف ال Thread تهائيا...
4- Resume لإكمال ال Thread
5- IsBackGround ... جاء وقت شرحها...

إن ال BackGround Thread تتشابه بحد كبير مع ال Thread العادي ولكن الفرق يكمن بينهما في ما يلي...

أولا ضع Button وكتب في الحدث Click الخاص به:
System.Threading.Thread.CurrentThread.Abort();
سوف تلاحظ أن البرنامج توقف عن العمل ولكن لماذا؟؟؟؟

السبب:
لم يعد هناك أي Fore Thread حي ولذلك تم إغلاق البرنامج ...

نتيجة... :إذا لم هناك أي Fore Thread قيد الإستخدام يغلق البرنامج...

أما لو كان ال Thread الذي يعمل مع برنامجك بشكل إفتراضي مع BackGround Thread فلن تراه في عمرك  ...

فحتى لو كان هناك BackGround Thread حي و لا يوجد أي Fore Thread فسوف يغلق البرنامج دون أن يهتم بالباقي....

أما العكس فليس صحيح..

أرجو أن تكون قد إستفدت من هذا الدرس ولكن حديثنا عن ال Threads لم ينتهي بل سوف يكون هناك له بقية إن شاء الله للتجنب بالوقوع في أخطار هذه ال Thread لأن لها أخطار كبيرة على برنامجك......
مع تحياتي:abdalkader Al-badani

إلى اللقاء في الدرس القادم إن شاء الله...

السبت، 20 يوليو 2013

هل فكرت يوما وتخيلت كيف يصل النت إلى بيتك

هل فكرت يوما وتخيلت كيف يصل النت إلى بيتك
كيف تتصل بالإنترنت
وكيف يصل الإنترنت إلي منزلك
هل فكرت يوما وتخيلت كيف يصل النت إلى بيتك

سبحان الله الملك
علم الإنسان ما لم يعلم

يلا مع الصور يا جماعة
ودعواتكم لي بالشفاء وصلاح الحال
وفى انتظار ردودكم الحلوة















قصص الأنبياء : قصة إسحاق عليه السلام + قصة يعقوب عليه السلام

قصص الأنبياء كاملة من بداية الخلق الى رسول الله صلى الله عليه وسلام


إسحاق عليه السلام

نبذة:

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

سيرته:

ذكر الله تعالى عبد إسحاق بالصفات الحميدة وجعله نبيًا ورسولا، وبرأه من كل ما نسبه إليه الجاهلون، وأمر الله قومه بالإيمان به كغيره من الأنبياء والرسل، وقد مدح رسول الله صلى اللهعليه وسلم نبي الله إسحاق وأثنى عليه عندما قال( إن الكريم ابن الكريم ابن الكريم ابن الكريم يوسف بن يعقوب بن اسحاق بن إبراهيم)). فهؤلاء الأنبياء الأربعة الذين مدحهم رسول اللهصلى الله عليه وسلم هم أنبياء متناسلون، ولا يوجد بين الناس أنبياء متناسلون غيرهم وهم يوسف ويعقوب وإسحاق وإبراهيم عليهم الصلاة والسلام.

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

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


يعقوب عليه السلام


نبذة:

ابن إسحاق يقال له "إسرائيل" وتعني عبد الله، كان نبيا لقومه، وكان تقيا وبشرت به الملائكة جده إبراهيم وزوجته سارة عليهما السلام وهو والد يوسف.
هو يعقوب ابن نبي الله إسحاق ابن نبي الله إبراهيم، وأمه ((رفقة)) بنت بتوئيل بن ناصور بن ءازر أي
بنت ابن عمه، ويسمى يعقوب ((إسرائيل)) الذي ينتسب إليه بنو إسرائيل.

سيرته:

هو يعقوب بن إسحاق بن إبراهيم.. اسمه إسرائيل.. كان نبيا إلى قومه.. ذكر الله تعالى ثلاث أجزاء من قصته.. بشارة ميلاده.. وقد بشر الملائكة به إبراهيم جده.. وسارة جدته.. أيضا ذكرالله تعالى وصيته عند وفاته.. وسيذكره الله فيما بعد -بغير إشارة لاسمه- في قصة يوسف.
نعرف مقدار تقواه من هذه الإشارة السريعة إلى وفاته.. نعلم أن الموت كارثة تدهم الإنسان، فلا يذكر غير همه ومصيبته.. غير أن يعقوب لا ينسى وهو يموت أن يدعو إلى ربه.. قال تعالى في سورة (البقرة):
أَمْ كُنتُمْ شُهَدَاء إِذْ حَضَرَ يَعْقُوبَ الْمَوْتُ إِذْ قَالَ لِبَنِيهِ مَا تَعْبُدُونَ مِن بَعْدِي قَالُواْ نَعْبُدُ إِلَهَكَ وَإِلَهَ آبَائِكَ إِبْرَاهِيمَ وَإِسْمَاعِيلَ وَإِسْحَاقَ إِلَهاً وَاحِداً وَنَحْنُ لَهُ مُسْلِمُونَ (133) (البقرة)
إن هذا المشهد بين يعقوب وبنيه في ساعة الموت ولحظات الاحتضار، مشهد عظيم الدلالة.. نحن أمام ميت يحتضر.. ما القضية التي تشغل باله في ساعة الاحتضار..؟ ما الأفكار التي تعبر ذهنه الذي يتهيأ للانزلاق مع سكرات الموت..؟ ما الأمر الخطير الذي يريد أن يطمئن عليه قبل موته..؟ ما التركة التي يريد أن يخلفها لأبنائه وأحفاده..؟ ما الشيء الذي يريد أن يطمئن -قبل موته- على سلامة وصوله للناس.. كل الناس..؟
ستجد الجواب عن هذه الأسئلة كلها في سؤاله (مَا تَعْبُدُونَ مِن بَعْدِي). هذا ما يشغله ويؤرقه ويحرص عليه في سكرات الموت.. قضية الإيمان بالله. هي القضية الأولى والوحيدة، وهي الميراث الحقيقي الذي لا ينخره السوس ولا يفسده.. وهي الذخر والملاذ.
قال أبناء إسرائيل: نعبد إلهك وإله آبائك إبراهيم وإسماعيل وإسحاق إلها واحدا، ونحن له مسلمون.. والنص قاطع في أنهم بعثوا على الإسلام.. إن خرجوا عنه، خرجوا من رحمة الله.. وإن ظلوا فيه، أدركتهم الرحمة.
مات يعقوب وهو يسأل أبناءه عن الإسلام، ويطمئن على عقيدتهم.. وقبل موته، ابتلي بلاء شديدا في ابنه
توفي يعقوب عليه السلام وله من العمر ما يزيد على المائة، وكان ذلك بعد سبعة عشر سنة من اجتماعه بيوسف، وقد أوصى نبي الله يعقوب ابنه يوسف عليه السلام أن يدفنه مع أبيه إسحاق وجده إبراهيم عليهم الصلاة والسلام ففعل ذلك، وسار به إلى فلسطين ودفنه في المغارة بحبرون وهي مدينة الخليل في فلسطين.

جهاز نقل الملفات من USBالى USB آخر أو محرك أقراص بدون كمبيوتر

جهاز نقل الملفات من USBالى USB آخر أو محرك أقراص بدون كمبيوتر
من أجل نقل الملفات من محرك أقراص فلاش USB لفلاش آخر أو محرك أقراص SD، تحتاج الكمبيوتر دائما.
حتى لو قمت بنقل عن طريق الكمبيوتر سيأخذ وقت طويل لذلك نحن نحتاج لحل بسيط لذلك.

الآن لدينا مفهوم reddot الذي قد فاز بعدة جوائز USB2USB التي تسمح لك بنقل البيانات بين USB الى آخر .

سمك الجهاز هو فقط 3 ملليمترات كسمك بطاقة الائتمان، يمكنك ببساطة وضعها في محفظتك. بل هو أيضا يأتي مع شاشة تعمل باللمس وفتحة لبطاقة SD واثنين وصلات USB. يمكن شحن هذا الجهاز مباشرة باستخدام موصل USB.



دورة السي شارب الدرس 11- شرح تقنية WCF والتخصص بال Sockets مع مثال


دورة السي شارب
الدرس 11- شرح تقنية WCF والتخصص بال Sockets مع مثال

السلام عليكم ورحمة الله وبركاته...
اليوم وفي أول درس من المستوى المتوسط أولا سوف نقوم بشرح ال WCF بشكل عام ثم التخصص بالSockets


أولا: WCF : Windows Communication Foundation

هي تقنية جديدة مقدمة من Microsoft للبرامج التي تعمل في الإتصال مع شبكات أو مع كومبيوترات أخرى ... مثل برامج الحادثة (( أي تقنية للربط بين جهازين ما ))

- ما هي مجالات إستخدام ال WCF ...
لا تظن أن تقنية ال WCF ظهرت من أجل غرض فقط بل يمكنك من خلالها القيام ب WebService 

أن العمل على المجال العام للربط بين الأجهزة أو ماشابه ذلك يتم في المجال System.Runtime.Remoting

ولكن نحن لن نستخدمه أبدا لأننا سوف نستخدم شيئ أقوى من هذا المجال العام لهذا الغرض وهو ال Sockets ....


البداية مع ال Sockets:
لأدخلك من باب رائع في إستخدام ال Sockets أولا عليك فهم ما يلي:

1- IP Address :
وهو عنوان بروتوكول الإنترنت ويكون ال ip لكل كومبيوتر غير متصل بشبكة هو 127.0.0.1
أما الكمبيوتر المتصل بشبكة فسوف يكون رقم ما غير معين...

2- Port:
وهي المنفذ الذي يقوم البرنامج بالإنتظار بينما يقوم البرنامج الاخر بالإتصال على هذا المنفذ وتكون ال Port من تحديدك مثلا 1220...

- تكوينة برامج الإتصال...

أولا يجب أن تفهم مايلي:
1- أن كل برنامج من هذا النوع يتألف من Server و Cilent (( خادم و عميل ))
2- ما الخادم والعميل إلا برنامجان متصلان مع بعضهم البعض بواسطة IP Address و Port موحدة...
3- إن العميل هو الذي يرسل البيانات للخادم لكي يتم تنفيذ ما تريد...
4- إن الخادم مهمته إنتظار العميل بينما يقوم بالإتصال به عبر ال IPAddress الخاص بالجهاز الذي يملكه الخادم.


- مثال بسيط...

قم بإنشاء مشروع WindowsFormApplication جديد وسميه Cilent ...

وفتح ال Visual Studio مرة أخرى وقم بإنشاء مشروع Console Application جديد...

الان إذهب إلى ال Cilent وبدأ معي:

أولا قم بتعريف المتغيرين العامين التاليين على الشكل التالي:
Socket mysoc=new Socket(AddressFamily.InterNetwork,SocketType.Stream.protocoltype.IP);
IPEndPoint  PCLocation=new IPEndPoint  (IPAddress.Parse("127.0.0.1"),1480);

                            تنبيه للمنتقلين من المستوى المبتدئ متغير عام يعني أن يضع المتغير داخل Class وليس داخل دوال ما مثلا كما فعلنا الان فيكون الكود كاملا:


namespace Cilent
{
    public partial class Form1 : Form
    {
        Socket mysoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        IPEndPoint PCLocation = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1480);
        public Form1()
        {
            InitializeComponent();
        }
    }
}
قهكذا يكون المتغير عام ))

أولا سوف نشرح المتغير الأول mysoc وهو ال Socket المستخدمة لإقامة الإتصال بين البرنامجين وأما عن المعطيات فلا تقلق فشرحها سوف تجده ولكن الان يهمني أن تعلم أن اخر معطية هي أننا نود إستخدام ال IP Address لكي يجد البرنامجين بعضهما...

ثانيا: PCLocation وهو متغير يتم من خلاله تحديد ال IPAddress وال Port للكومبيوتر لإستخدامها في ما بعد وأما عن الدالة Parse فقد تم شرحها في الدروس السابقة...

الان ضع ثلاثة Button وسم الأول Connect والثاني Disconnect والثالث Send Message

الان أدخل إلى الحدث Click الخاص بال Button1 واكتب...




if (mysoc.Connected == false)
            {
                try
                {
                    mysoc.Connect(PCLocation);
                }
                catch (Exception x)
                {
                    MessageBox.Show(x.Message);
                }
            }
            else if (mysoc.Connected == true)
            {
                MessageBox.Show("you are already connected to a server in:" + mysoc.LocalEndPoint);
            }
وهنا قد إستخدمنا الأمر Connect كما هو واضح أعلاه حيث أعطيناه مكان الكومبيوتر الاخر...

** أظن أن هذا الكود واضح تماما **

والان إذهب إلى الحدث Click لل Button2 واكتب...
if (mysoc.Connected == true)
            {
                try
                {
                    mysoc.Disconnect(false);
                }
                catch (Exception x)
                {
                    MessageBox.Show(x.Message);
                }
            }
            else if (mysoc.Connected == false)
            {
                MessageBox.Show("your are not connecting to any server..");
            }
والان إذهب إلى الحدث Click الخاص بال Button3 واكتب...
if (mysoc.Connected == true)
            {
                try
                {
                    byte[] mymes = new byte[5];
                    mymes[0] = 1;
                    mymes[1] = 2;
                    mymes[2] = 3;
                    mymes[3] = 4;
                    mymes[4] = 5;
                    mysoc.Send(mymes);
                }
                catch (Exception x)
                {
                    MessageBox.Show(x.Message);
                }
            }
            else if (mysoc.Connected == false)
            {
                MessageBox.Show("Connect to server first!");
            }
وهكذا نكون قد أتتممنا ال Cilent ...


والان حان دور ال Server ...

كون السيرفر Console Application فإنه في حال فقدان جميع ال ForeTherads سوف يغلق البرنامج لذلك سوف نضطر إلى عمل Thread لا منتهية لحل هذه الأزمة...
(( لا يقلق الصاعدين من المبتدئ لأن هذا الموضوع لم أتطرق عليه بالدورة بعد ولكن وقته بات قريبا ))

قم بعمل ال Thread بالشكل التالي:

ولا قم بإضافة هذا الأمر:
static void infinity()
        {
            System.Threading.Thread.CurrentThread.Suspend();
        }
ثم ضف Thread وشغلها كالتالي:
System.Threading.Thread life = new System.Threading.Thread(infinity);
            life.Start();
فيصبح الكود كامل:
namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread life = new System.Threading.Thread(infinity);
            life.Start();
        }
        static void infinity()
        {
            System.Threading.Thread.CurrentThread.Suspend();
        }
    }
}
والان لنبدأ بالسيرفر:

أولا قم بتعريف المتغيرين العامين نفسهم...
static Socket mysoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        static IPEndPoint PCLocation = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1480);
ثم بعد بعض الإضافات يكون الكود كاملا...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Server
{
    class Program
    {
       static Socket mysoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
       static IPEndPoint PCLocation = new IPEndPoint(IPAddress.Any, 1480);
        static void Main(string[] args)
        {
            System.Threading.Thread life = new System.Threading.Thread(infinity);
            System.Threading.Thread listen = new System.Threading.Thread(filerec);
            listen.Start();
            life.Start();
        }
        static void infinity()
        {
            System.Threading.Thread.CurrentThread.Suspend();
        }
        static void filerec()
        {
            mysoc.Bind(PCLocation);
            mysoc.Listen(5);
            Console.WriteLine("waiting for cilent...");
            Socket cilent = mysoc.Accept();
            Console.WriteLine("connection accept!  receving data...");
            byte[] msg = new byte[5];
            cilent.Receive(msg);
            Console.WriteLine(msg[0].ToString());
            Console.WriteLine(msg[1].ToString());
            Console.WriteLine(msg[2].ToString());
            Console.WriteLine(msg[3].ToString());
            Console.WriteLine(msg[4].ToString());
        }
    }
}
الان لم يبقى عليك إلا تجربة البرنامج كالتالي...

إفتح الServer ثم إفتح ال Cilent وإضغط على زر Connect سوف تلاحظ إتصل ال Cilent بال Server
الان إضغط على زر Send Message فقوم ال Cilent بإرسال رسالة إلى ال Server ويقوم ال Server بتلقيها وطباعتها على ال Console


مبروك!! أول برنامج لك في عالم ال Sockets أصبح جاهزا...
مع تحياتي: abdalkader Al-badani
يتبع في الدرس القادم إن شاء الله.