مشاريع
أقسام المقالات
Total Articles: 19
مؤتمرات وأحداث
مراكز وانجازات
.net 2008 Course
آخر 10 مواضيع
كتب وملخصات
Tips & Tricks
مدخل إلى WAP
الاثنين، ٢٥ أغسطس ٢٠٠٨


مقدمة :
في هذا الدرس ، سوف نتعرف سوية على التقنية المعروفة باسم Wireless Application Protocol والتي تعرف اختصاراً باسم WAP ، كما سنتطرق في الجزء الثاني من هذا الدرس إلى كيفية التعامل مع هذه التقنية من خلال .net .

الجزء الأول من الدرس : تعريف بالتقنية ...

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

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


....

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

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

ما هي WML ؟
هي طريقة لوصف البيانات مشابهة جداً لطريقة عمل HTML ولكنها على معايير XML ، وتختلف عن HTML في عدد من النقاط منها :
- الوسم Tag الرئيسي هو <wml> بدلاً من <html>
- ينقسم المستند إلى بطاقات Cards لتسهيل العرض حيث تبدأ كل بطاقة بـ <card> وتنتهي أيضاً بـ <card/> .

الجزء الثاني من الدرس : تعليم WML باختصار ...

بداية سنعرض مثالاً يوضح كيفية كتابة WML وذلك بالشكل التالي مثلاً - من ويكيبديا - :

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"
http://www.phone.com/dtd/wml11.dtd" >
<wml>
   <card id="main" title="First Card">
     <p mode="wrap">This is a sample WML page.</p>
</card>
</wml>

 قراءة القيم المختلفة وتخزينها وعرضها للمستخدم :
بكل بساطة يمكنك تعريف المتغيرات واسناد قيم لها بالشكل التالي :

<setvar name="First_Name" value="Ahmed"/>
<setvar name="Age" value="21"/>

ولاحقاً يمكنك عرضها بالشكل التالي مثلاً :

<p>First Name: $(First_Name)</p>

ويمكن ايضاً قراءة قيمة مربع نص أو Select بنفس الطريقة تماماً حيث يتم وضع اسم الأداة بدلاً من اسم المتغير ...
مثال لقراءة قيم أداة اختيار وعرضها للمستخدم - المثال منقول من موقع فرعون - :

<card id="card1" title="Tutorial">
<do type="accept" label="Answer">
<go href="#card2"/>
</do>
<p>
<select name="name">
<option value="HTML">HTML Tutorial</option>
<option value="XML">XML Tutorial</option>
<option value="WAP">WAP Tutorial</option>
</select>
</p>
</card>
<card id="card2" title="Answer">
<p>
You selected: $(name)
</p>
</card>
</wml>

الجزء الثالث والأخير من الدرس : أريد برمجة موقع ASP.net يدعم ال WAP ...

إذا قمنا بتحويل التطبيق الذي عرضناه في أول المقالة - المنقول من ويكيبيديا - والذي كان بالشكل التالي :

<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN"
"
http://www.phone.com/dtd/wml11.dtd" >
<wml>
   <card id="main" title="First Card">
     <p mode="wrap">This is a sample WML page.</p>
</card>
</wml>

 وقمنا بتحويله إلى .net فسوف يكون بالشكل التالي :

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>
<%@ Register TagPrefix="mobile" Namespace="System.Mobile.UI" %>
<mobile:Form runat="server">
<mobile:Label runat="server">
This is a sample WML page.
</mobile:Label>
</Mobile:Form>

في حالة رغبت في التعامل بواسطة VB.net غير السطر الأول فقط ليصبح بالشكل التالي :

<%@ Page Inherits="System.Mobile.UI.MobilePage" Language="C#" %>


والآن عند طلب الصفحة من قبل العميل ، يتم أولاً تحويل الصفحة إلى wml في حالة كان الطلب من جهاز هاتف محمول ، أو يتم التحويل مباشرة إلى HTML في حالة طلب الموقع من جهاز شخصي أو كومبيوتر كفي .

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

التسميات: , , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٤:٣٧ م   1 تعقيبات
Microsoft Ajax Toolkit
الأحد، ٢٤ أغسطس ٢٠٠٨


في هذا الدرس سوف نستعرض سريعاً كيفية الاستفادة من خدمات تقنية الإنترنت المعروفة باسم AJAX من خلال .net ولكن قبل البداية دعنا نتعرف على ما هي أجاكس ؟


اجاكس AJAX
هي اختصار لكلمة Asynchronous JavaScript and XML ، وفي الواقع فهي ليست لغة برمجة جديدة أو تقنية جديدة قدر ما هي استخدام للموارد الموجودة بطريقة أخرى ، وببساطة ، تعتمد اجاكس على تجزيء الصفحة إلى عدة اقسام تتم معالجة كل قسم على حدة ، وفي هذه الحالة فإنه عند طلب العميل لجزء ما لن يكون مضطراً لانتظار تحديث الصفحة بالكامل .
ولعل أشهر أمثلة استخدام AJAX هو البريد الإلكتروني Gmail اضافة إلى النسخة الجديدة من البريد الإلكتروني لل Yahoo و Hotmail .
لمعرفة المزيد ربما تستطيع زيارة صفحة ويكيبديا عن هذه التقنية :
http://en.wikipedia.org/wiki/Ajax_%28programming%29

كيف أبدأ من خلال .net ؟

قامت مايكروسوفت باصدار عدة نسخ من الأدوات التي تساعدك وتسهل الحصول على المميزات المتاحة في AJAX ، لكنك على اية حال تستطيع القيام بهذا الأمر في أبسط صوره يدوياً ، أو باستخدام ما يسمى باسم Atlas وهي نسخة من مايكروسوفت خاصة ب AJAX .


وللمزيد من التسهيل قامت مايكروسوفت باصدار Asp.net Ajax ToolKit ، وهي مجموعة من الأدوات المختلفة التي يمكن استعراضها من خلال هذا الرابط :
http://ajax.asp.net/ajaxtoolkit/

تستطيع زيارة الموقع وتحميل هذه الأدوات من خلال الرابط :
http://ajax.asp.net/

كما يوفر الموقع مكتبة ضخمة من المواد التعليمية لهذه الأدوات ول Asp.net عموماً ، يمكن الوصول إليها عبر هذا الرابط :
http://www.asp.net/learn/default.aspx?tabid=63

يمكنك البدء من خلال هذا الفيديو تحديداً :
http://download.microsoft.com/downlo...List-Video.zip
وسيقوم بالشرح منذ البداية عن كيفية استخدام Atlas .

وهناك دروس أخرى لشرح كيفية البدء باستخدام Ajax ToolKit مباشرة منها هذا الفيديو :
http://www.asp.net/learn/videos/view...tabid=63&id=75
http://www.asp.net/learn/videos/view...tabid=63&id=76


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ١٢:٥٨ ص   1 تعقيبات
Expression Blend

 

ضمن التقنيات الجديدة التي ظهرت مع .net كانت تقنية WPF ، ومن اجل تطبيق اوسع لهذه التقنية قامت مايكروسوفت بتوفيرمجموعة من البرامج لتساعد في انتاج أكواد WPF ، واحد من هذه المجموعة كان Expression Blend  لتصميم واجهات برنامجك المختلفة ، حيث يوفر لك وسائل متعددة للتصميم ، سنحاول معرفة المزيد عنه بتفصيل في هذا الدرس ...


سنحاول الآن عمل تطبيق بسيط من خلال Expression Blend قم بتحميله أولاً من الروابط السابقة ، قم بتشغيله ومن ثم اختيار New Project ومن ثم WPF Application (*.exe) بالشكل التالي :

يمكنك اختيار اللغة التي تريد العمل عليها وال framework اضافة للاسم ومكان التخزين بالطبع .
من View اختر Active Document View ومن ثم اختر الوضع Split لتتمكن من عرض XAML و العرض العادي في نفس الوقت بالشكل التالي :

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

خلال عملياتك في الرسم ، ستجد لأي اداة مجموعة من الخصائص على الجانب ، تستطيع منها التحكم بالمظهر وخلافه :

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

<Canvas>
<Canvas x:Name="MainImageCanvas" Canvas.Left="40" Canvas.Top="120">

الآن قم باضافة MediaElement ولنضع فيه صورة مثلاً ، سيكون ناتج XAML بالشكل التالي :

<MediaElement x:Name="MainImage" Source="c:/example/futex.jpg" Width="300" Height="300" ></MediaElement>

والآن سنقوم بتطبيق بعض التأثيرات على ال Canvas حيث نطبق عملية الميل من خلال الخصائص ، سيكون ناتج XAML بالشكل التالي :

<Canvas.RenderTransform><TransformGroup>
<SkewTransform x:Name="MainSkewTransform" AngleY="-19" AngleX="0" CenterX="0" CenterY="0"/> <ScaleTransform x:Name="MainScaleTransform" ScaleY="1" ScaleX = "1" CenterX="0" CenterY="0"/></TransformGroup></Canvas.RenderTransform></Canvas>

الآن قم بالضغط على F5 لتجربة العرض والذي سيكون بالشكل التالي :

سنحاول تطبيق نظرية الظل للصورة أيضاً ، لذا سنقوم بعمل Canvas ونضع فيه الصورة أيضاً ولكن مع زوايا ميل مختلفة هذه المرة بحيث تحاذي اطراف الصورة ، سيكون ناتج XAML بالشكل التالي :

<Canvas x:Name="ReflectionImageCanvas" Canvas.Left="260" Canvas.Top="640">

<MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">

</MediaElement>

<Canvas.RenderTransform>

<TransformGroup>

<SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />

<ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />

</TransformGroup>

</Canvas.RenderTransform>

</Canvas>

وسيكون الناتج للصورة بالشكل التالي :

آخر نقطة سنتعامل معها هي اضافة الشفافية لصورة الظل ، من ضمن الخصائص أيضاً ، لذا ستجد ناتج ال XAML في النهاية بالشكل التالي :

<Canvas x:Name="ReflectionImageCanvas" Canvas.Left="260" Canvas.Top="640">

<MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">

</MediaElement>

<Canvas.RenderTransform>

<TransformGroup>

<SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />

<ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />

</TransformGroup>

</Canvas.RenderTransform>

<Canvas.OpacityMask>

<LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">

<GradientStop Offset="0.345" Color="#00000000" x:Name="ReflGradientStop1" />

<GradientStop Offset="1.0" Color="#CC000000" x:Name="ReflGradientStop2" />

</LinearGradientBrush>

</Canvas.OpacityMask>

</Canvas>

قم بضبط بعض اعدادات ال Left وال Top يدوياً او من الكود لجعل صورة الظل منطبقة على الصورة الاصلية ، سيكون ناتج الصورة :

الكود الكامل XAML :

<Canvas>
            <Canvas x:Name="MainImageCanvas" Canvas.Left="40" Canvas.Top="120">

                <MediaElement x:Name="MainImage" Source="c:/example/FUTEX.JPG" Width="300" Height="300" >
                </MediaElement>
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <SkewTransform x:Name="MainSkewTransform" AngleY="-19" AngleX="0" CenterX="0" CenterY="0"/>
                        <ScaleTransform x:Name="MainScaleTransform" ScaleY="1" ScaleX = "1" CenterX="0" CenterY="0"/>
                    </TransformGroup>
                </Canvas.RenderTransform>
            </Canvas>
            <Canvas x:Name="ReflectionImageCanvas" Canvas.Left="267" Canvas.Top="645">
                <MediaElement x:Name="ReflImage" Source="c:/example/futex.jpg" Width="300" Height="300" Volume="0">
                </MediaElement>
                <Canvas.RenderTransform>
                    <TransformGroup>
                        <SkewTransform x:Name="ReflectionSkewTransform" AngleY="19" AngleX="-41" CenterX="0" CenterY="0" />
                        <ScaleTransform x:Name="ReflectionScaleTransform" ScaleY="-1" ScaleX="1" CenterX="0" CenterY="0" />
                    </TransformGroup>
                </Canvas.RenderTransform>
                <Canvas.OpacityMask>
                    <LinearGradientBrush StartPoint="0.5,0.0" EndPoint="0.5,1.0">
                        <GradientStop Offset="0.345" Color="#00000000" x:Name="ReflGradientStop1" />
                        <GradientStop Offset="1.0" Color="#CC000000" x:Name="ReflGradientStop2" />
                    </LinearGradientBrush>
                </Canvas.OpacityMask>
            </Canvas>
        </Canvas>

 

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

بالتوفيق ...


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ١٢:٥٣ ص   1 تعقيبات
مدخل إلى برمجة ال Pocket PC من خلال .net
السبت، ٢٣ أغسطس ٢٠٠٨

 

سوف نعتبر هذا الدرس هو نقطة الإنطلاق التي يستطيع المبتدئ من خلالها البدء في برمجة الأجهزة الكفية Pocket PC .


قبل البداية ، ما هي الأجهزة الكفية Pocket PC ؟
هي مجموعة من أجهزة الهواتف المتنقلة تتميز باستخدام نظام تشغيل متقدم اضافة إلى هاردوير يمكنها من تشغيل مهام هذا النظام ، ويشكل نظاما التشغيل Windows Mobile ونظام التشغيل سيمبان اضافة لنظام Windows CE 2003 وما قبله أشهر نظم التشغيل التي تعمل على الأجهزة الكفية .
أما على صعيد الهاردوير فالأجهزة الكفية لا تمتلك هارد ديسك Hard Disk بالمعنى المشهور ، لكن بعضاً منها يستخدم جزء من ال RAM كهارد ديسك لا يتم مسح البيانات من عليه بعد اعادة تشغيل الجهاز ، وهناك أنوع أخرى تستخدم ROM لتخزين البرامج ونظام التشغيل وما شابه .


وماذا يمكنني عمله للأجهزة الكفية Pocket PC من خلال .net ؟
تستطيع من خلال لغة البرمجة اضافة برامج تستخدم أجزاء معينة من الجهاز لتحقيق خدمات للمستخدم سواء أكان استخدام بسيط (استخدام الذاكرة) لتخزين البرامج وتنفيذها وتخزين قواعد البيانات ، أو كان الأمر يختص باستخدام الكاميرا مثلاً والأجهزة الصوتية في الجهاز .
كيف أبدأ ؟
بكل بساطة ، سنقوم بعمل برنامج يظهر رسالة ترحيب عن الضغط على زر أمر .
1- قم بتشغيل الفيجوال ستوديو Visual Studio .net .
2- قم باختيار C# أو VB أو اللغة التي تود البرمجة من خلالها .
3- قم باختيار Smart Device ، ومن ثم قم باختيار Pocket PC 2003 أو Smartphone 2003 أو Windows CE 5.0 حسب الجهاز الذي تود العمل عليه .
4- بعد اختيار القسم المناسب قم باختيار Device Application .
5- قم بسحب Button من الأدوات ، وقم بكتابة هذا الكود في داخله :

MessageBox.Show("Welcome...")

فقط قم باضافة ; في حالة كونك مبرمج C# .

6- قم بالضغط على F5 اختار نوع ال deploy الذي ترغب فيه حسب الجهاز الذي تود العمل عليه ، أو قم باختيار نوع يعمل على الـ PC للتجربة فقط .
7 - مبروك ، لقد قمت بعمل برنامج الأول ، يمكنك أيضاً نقل الملف التنفيذي exe إلى الجهاز وتشغيله مباشرة ، لا بد في هذه الحالة ان يكون .net framework موجوداً على الجهاز الكفي Pocket PC .
كيف اكمل البرمجة من خلال .net ؟
بكل تأكيد فإن البرنامج السابق يعد من أبسط الصيغ الممكنة لبرنامج يعمل على Pocket PC ، فيما ستتضطر لاستخدام التخزين في البرامج الجدية والتعامل مع قواعد البيانات حيث يمكنك استخدام الملفات النصية كقواعد بيانات ، أو ملفات XML وحتى قواعد البيانات من نوع SQL Server CE .
كما يمكن ان تضطر للتعامل مع الملفات ، أو الصوتيات والشاشة ، أو حتى مع الأجهزة الملحقة مثل الكاميرا وخلافه .


بكل بساطة كل ما عليك هو الدخول إلى هذا الموقع : www.msdn.com وستجد فيه كل ما تريد ، يمكنك الدخول أيضاً مباشرة على هذا الرابط : http://msdn2.microsoft.com/en-us/library/aa458721.aspx

هل هناك أدوات مساعدة ؟
بكل تأكيد هناك العديد من الأدوات التي تساعدك على بناء تطبيقاتك وجعلها أفضل بطريقة أسهل - لكن لا تنشغل بالأدوات دون ان تعرف ولو بصورة عابرة كيف يمكنك العمل يدوياً - ، ومن أحدث هذه الأدوات Windows Mobile 6 Developer Resource Kit :
http://msdn.microsoft.com/windowsmob...t/default.aspx

هل هناك طرق أخرى غير .net لبرمجة الأجهزة الكفية ?
بكل تأكيد . نعم ، وبالعكس فإن لغة مثل سيمبان تعد أقدم من لغات مايكروسوفت ، كمان أن لغة مايكروسوفت لا زالت غير قادرة على اقتحام عالم الموبايلات التي لا تزال تسيطر عليه شركتي سيمبان وجافا .
http://www.ce4arab.com/vb7/index.php

أخيراً ، درس بسيط يحتوي على مجموعة أكواد مفيدة في عالم برمجة ال Pocket PC :

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

التسميات: , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ١١:٥٠ م   0 تعقيبات
كتاب Speech SDK
الأحد، ١٣ يوليو ٢٠٠٨

كتاب تم ارساله لي بخصوص شرح مكتبة Microsoft Speech SDK ، في المقدمة الخاص بالكتاب يقول المؤلف :

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

pic

فهرس الكناب :

  1. تنزيل واعداد المكتبة .
  2. شرح بعض الاساسيات .
  3. شرح طريقة عمل فهم الأوامر المستقبلة صوتياً .
  4. شرح مكتبة الاملاء .
  5. شرح طريقة تحويل الكتابة إلى كلام .
  6. الاعدادات ولوحة التحكم .
  7. تدريب الحاسوب .
  8. تطبيق برنامج يقوم بنطق الساعة .
  9. برنامج تسجيل الدخول عن طريق نطق كلمة السر .
  10. برنامج رد التحية .
  11. برنامج محادثة مع الحاسوب .
  12. الة حاسبة باستخدام الأوامر الصوتية .
  13. برنامج املاء يقوم بحفظ النصوص إلى ملف نصي

وفي النهاية ، يمكنك تحميل الكتاب مرفق به الأمثلة من هنا .

التسميات: , ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٢:٥٥ م   0 تعقيبات
IComparable Interface
الثلاثاء، ١٧ يونيو ٢٠٠٨

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

كما هو واضح من الاسم ، يستخدم هذا ال interface للمقارنة ، ولذا من الطبيعي ان يكون شكل هذا ال interface بالشكل التالي :

C#:

public interface IComparable
{
int CompareTo(object o);
}

vb.net:

Public Interface IComparable
Function CompareTo(ByVal o As Object) As Integer
End Interface

يمكنك ملاحظة ان الدالة تعيد قيمة رقمية ، فعلياً هي تعيد في المعتاد القيم 0 في حالة التساوي ، القيمة 1 في حالة كون الطرف الأول اكبر ، و -1 في حالة كون الطرف الأول أصغر .

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

C#:

class Car
{

string Name;
int year;
}

vb.net:

Class Car
Private Name As String
Private year As Integer
End Class

والآن نرغب في ترتيب السيارات بناء على تاريخ الصنع year ، لذا أول خطوة لدينا هي جعل الفئة الخاصة بنا تطبق الفئة IComparable :

C#:

class Car:IComparable
{

string Name;
int year;
}


vb.net:

class Car:IComparable
{

string Name;
int year;
}

ثم نكتب بعض الاكواد في الدالة CompareTo ، لنفترض الشكل التالي مثلاً :

c#:

int IComparable.CompareTo(object obj)
{
Car temp = (Car)obj;
if(this.year > temp.year)
return 1;
if(this.year < temp.year)
return -1;
else
return 0;
}

vb.net:

Private Function CompareTo(ByVal obj As Object) As
Integer Implements IComparable.CompareTo
Dim temp As Car = DirectCast(obj, Car)
If Me.year > temp.year Then
Return 1
End If
If Me.year < temp.year Then
Return -1
Else
Return 0
End If
End Function

طبعاً لا داعي لتذكيرك بانك تستطيع اعادة -100 و 0 و 94 بدلاً من -1و0و1 ، لكن هذا لتسهيل المفهوم ، الدالة تعمل بدلالة رقم سالب يعني اصغر ، صفر يعني التساوي ورقم موجب يعني اكبر فقط دون ان يعنيها قيمة هذا الرقم الفعلية .

الدالة Sort :

لنفترض ان لدينا مصفوفة array من الارقام باسم myNumbers ، في هذه الحالة لو قمنا بكتابة الأمر التالي لكان الكود مفهوماً :
c#:

Array.Sort(myNumbers);


vb.net:

Array.Sort(myNumbers)

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

لكن في حالة كون الفئة car تطبق ال IComparable interface ، ففي هذه الحالة سيمكنك استخدام هذا الدالة ببساطة لإنها سوف تقوم بالمقارنة اعتماداً على دالة CompareTo التي قمت انت ببرمجتها ، ربما يكون هذا سبباً كافياً لتقوم بتطبيق هذا ال interface وكتابة كود الدالة بدلاً من كتابة دالة باسم check مثلاً او اي اسم آخر للقيام بنفس المهمة . هذا طبعاً بالاضافة لتسهيل استخدام الفئة الخاصة بكل لاحقاً ووضوحها لأي مبرمج آخر .


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٨:٣٥ م   0 تعقيبات
FileSystemWatcher
الخميس، ٥ يونيو ٢٠٠٨


تعتبر هذه الفئة مفيدة جداً في حالة رغبتنا في مراقبة سلوك ملف معين ومعرفة اي تغيير يطرأ عليها من التغييرات الموجودة في ال System.IO.NotifyFilters enum والذي يراقب اي من التغييرات التالية :

public enum NotifyFilters {
Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size,
}

طبعاً بما اننا نتحدث عن events وتغييرات ، سنحتاج فوراً لتعريف دوال يتم تنفيذها مرتبطة بالاحداث ، اي دالة تستخدم لقراءة احداث مثل التعديل والتغيير وخلافه لا بد ان تكون على شكل delegate التالي :

void MyNotificationHandler(object source, FileSystemEventArgs e)


حدث تغيير الاسم لا بد أن يتبع لل delegate التالي :
void MyNotificationHandler(object source, RenamedEventArgs e)


الآن سنقوم بتعريف برنامج عادي ، يقوم بمراقبة حالة الملفات ، طبعاً ولإننا نرغب في ان نرى نتائج البرنامج فلا بد ان نجعل البرنامج يعمل حتى يضغط المستخدم حرف q مثلاً ، لو كنا في windows Forms كان بامكاننا المراقبة مباشرة طبعاً ، في مثالنا هذا سنراقب كافة الملفات النصية في القرص الصلب c:\ لحدثي الاضافة والحذف :

C#:

FileSystemWatcher watcher = new FileSystemWatcher();




// monitor files at:


watcher.Path = @"c:\";





// monitor files when


watcher.NotifyFilter = NotifyFilters.LastAccess NotifyFilters.LastWrite NotifyFilters.FileName NotifyFilters.DirectoryName;





// watch files of type


watcher.Filter = "*.txt";





// watch events:


watcher.Created += new FileSystemEventHandler(OnChanged);


watcher.Deleted += new FileSystemEventHandler(OnChanged);





watcher.EnableRaisingEventys = true;





Console.WriteLine("Press 'q' to quit app.");





while (Console.Read() != 'q') ;

vb.net:
Dim watcher As New FileSystemWatcher()




' monitor files at:


watcher.Path = "c:\"





' monitor files when


watcher.NotifyFilter = NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName





' watch files of type


watcher.Filter = "*.txt"





' watch events:


AddHandler watcher.Created, AddressOf OnChanged


AddHandler watcher.Deleted, AddressOf OnChanged





watcher.EnableRaisingEvents = True


Console.WriteLine("Press 'q' to quit app.")





While Console.Read() <> "q"C


End While

كما لاحظت ، عندما يحدث أي حدث فإننا نقوم باستدعاء الدالة OnChanged ، يمكن تخصيص دالة لكل حدث أو كما تحب لكن هذا فقط مثال ، يمكننا كتابة الدالة OnChanged بالشكل التالي مثلاً - عرض الملف والتغيير ووقت التغيير - :

C#:

static void OnChanged(object source, FileSystemEventArgs e)

{


Console.WriteLine("File Changed, File Path: {0} , Change: {1}, DateTime: {2}", e.FullPath, e.ChangeType,DateTime.Now.ToString());


}

vb.net:
Private Shared Sub OnChanged(ByVal source As Object, ByVal e As FileSystemEventArgs)




Console.WriteLine("File Changed, File Path: {0} , Change: {1}, DateTime: {2}", e.FullPath, e.ChangeType, DateTime.Now.ToString())


End Sub

والآن جرب البرنامج ...

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

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٣:٠٠ م   1 تعقيبات
- إالغاء جميع البيانات من الادوات الموجوده في جميع الشاشات النشطه :

سوف نقوم بتقسيم المشكله الى قسمين :
اولا : حذف جميع البيانات الموجوده في الcontrols في الشاشه الاساسيه
ثانيا : الوصول الي باقي الشاشات الفعاله وتكرار الخطوه الاولى
ولكن اولا , قم باضافه    ( button ( clear button ) , textbox , combo box ,button ( clear all) ,label and button ( show f2

اولا : حذف جميع البيانات الموجوده في الcontrols في الشاشه الاساسيه (شاشه واحده فقط ) :
- قم ياضافه الكود في Clear button :

untitled1 

ثانيا : الوصول الي باقي الشاشات الفعاله وتكرار الخطوه الاولى 
-قم باضافه الكود السابق في Clear all button :
سونف نقوم بالغاء الcomment من على الكود السابق واضافه comment على الكود :
cc= this.Controls
الكود Application.OpenForms للوصول الى كل الشاشت الفعاله في البرنامج
وبالطبع في الزر show f2 سوف تقوم بكتابه الكود المسؤول عن فتح نافذه جديده
 

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Mohamed Abd El hafeez @ ٥:٢٥ ص   0 تعقيبات
الفرق بين const و static readonly
الأربعاء، ٤ يونيو ٢٠٠٨

لو كنت قد جربت التعامل مع الثوابت بكثرة ، فلا بد انك تساءلت ، ما هو الفارق بين تعريف ثابت const او تعريفه باستخدام static readonly ، فكلاهما كما تعلم لا يمكن تغيير قيمتهما .

الفارق بسيط جداً ، هو ان ال const يتم تعريف قيمتها وقت ال compile time ، اما قيمة ال static readonly فيتم تعريفها وقت ال run time .

لهذا سنجد مزية اضافية لل static readonly ، وهو اننا يمكن ان نقوم بتعريفة في ال static constructor بالشكل التالي مثلاً :

 

class Program
    {
        public static readonly Test test = new Test();
        static void Main(string[] args)
        {
            test.Name = "Program";
}

 

التسميات: ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٣:٤٦ م   1 تعقيبات
الفرق بين التعريف باستخدام 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


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٣:٣٣ م   0 تعقيبات
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;

 

التسميات: ,


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ١١:٥٣ م   1 تعقيبات
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 فلن تحتاج إلى ذلك أبداً .
طريقة العمل بكل بساطة في الصورة التالية :

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

التسميات:


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة Ahmed Gamal @ ٣:٤٤ م   1 تعقيبات
تشفير الأسرار للمستخدم الحالي
الاثنين، ٢٦ مايو ٢٠٠٨


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



 


و الحل المثالي هو جعل نظام الويندوز يقوم بتشفير البيانات من أجلك ولتحقيق هذا ستحتاج إلى ما يسمى بـ DPAPI أو Data Protection API والذي يقوم بتشفير البيانات باستخدام مفتاح متماثل مبني على معلومات خاصة بالمستخدم والآلة وبهذه الطريقة لم تعد تقلق بخصوص تخزين المفتاح ووثوقيته وبدلا عن ذلك يتأكد نظام التشغيل من وثوقية المستخدم عندما يدخل إلى النظام وتكون البيانات المخزنة من قبل مستخدم غير ممكنة الوصول بالنسبة للمستخدمين الآخرين.


في النسخ السابقة من الدوت نيت لايوجد فئات مدارة لاستخدام DPAPI وتم تصحيح هذا في الدوت نيت 2.0 بالفئة الجديدة ProtectData في مجال الأسماء System.Security.Cryptography


 


كيف يمكنني فعل ذلك


 


            الفئة ProtectData تقدم طريقتان مشتركتان Shared Methods الأولى ProtectData تأخذ مصفوفة بايتات تمثل البيانات المراد تشفيرها وتعيد مصفوفة بايتات بالبيانات المشفرة والثانية UnprotectData تقوم بالعملية المعاكسة حيث تأخذ مصفوفة بايتات بالبيانات المشفرة وتعيد مصفوفة بايتات بالبيانات المفكوك تشفيرها. وباستخدام ProtectData و UnprotectData يمكنك فقط التعامل مع مصفوفات بايتات Byte Array وهذا يعني أنك عندما تريد تشفير بيانات من أي نوع عليك القيام بتحويلها إلى مصفوفة بايتات قبل القيام بالتشفير.


 


مثال عملي


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


 


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


        EncodedData, False)


 


        End If


    End Sub


 


End Module


 


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


 


  ' Verify the data is encrypted by reading and displaying it


  ' without performing any decryption.


  DataStream = New MemoryStream(EncodedData)


  Dim Reader As New StreamReader(DataStream)


  Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


  Reader.Close()


 


            ولتفكيك تشفير البيانات يجب عليك وضعها في مصفوفة بايتات ثم استخدام الطريقة UnprotectData لاستخلاص البيانات من مصفوفة البايتات ويمكنك إضافة StreamReader لإضافة دعم لتفكيك التشفير للمثال السابق مثلا يمكنك إضافة الكود التالي ليقرأ البيانات من الملف ويظهر الجملة التي أدخلتها سابقا


 


If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


تذكر بما أن البيانات تم تشفيرها بواسطة حساب المستخدم الحالي يمكنك تفكيك تشفيرها في أي وقت والقيد الوحيد هو انك يجب أن تدخل باستخدام نفس حساب المستخدم ولاحظ أنك عندما تقوم بحماية البيانات يجب عليك اختيار واحدة من القيم من التعداد DataProtectionScope Enumeration ويكون بذلك لديك خياران:


 


LocalMachine


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


 


            CurrentUser


                        سيقوم ويندوز بتشفير البيانات بمفتاح خاص بالمستخدم وبالتالي لا يمكن قراءتها من قبل المستخدمين الآخرين


 


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



 


وفيما يلي سرد للمثال كاملا وهو تطبيق من نوع Console Application


 


 


Imports System.Security.Cryptography


Imports System.IO


 


Module ProtectData


    Sub Main()


 


        ' Get the data.


        Console.WriteLine("Enter a secret message and press enter.")


        Console.Write(">")


        Dim Input As String = Console.ReadLine()


        Console.WriteLine()


 


        If Input <> "" Then


            Dim Data(), EncodedData() As Byte


 


            ' Write the data to a new MemoryStream.


            Dim DataStream As New MemoryStream()


            Dim Writer As New StreamWriter(DataStream)


            Writer.Write(Input)


            Writer.Close()


 


            ' Convert the MemoryStream into a byte array,


            ' which is what you need to use the ProtectData() method.


            Data = DataStream.ToArray()


 


            ' Encrypt the byte array.


            EncodedData = ProtectedData.Protect(Data, Nothing, _


              DataProtectionScope.CurrentUser)


 


            ' Store the encrypted data in a file.


            My.Computer.FileSystem.WriteAllBytes("c:\secret.bin", _


               EncodedData, False)


 


            ' Verify the data is encrypted by reading and displaying it


            ' without performing any decryption.


            DataStream = New MemoryStream(EncodedData)


            Dim Reader As New StreamReader(DataStream)


            Console.WriteLine("Encrypted data: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        If My.Computer.FileSystem.FileExists("c:\secret.bin") Then


            Dim Data(), EncodedData() As Byte


 


            EncodedData = My.Computer.FileSystem.ReadAllBytes("c:\secret.bin")


            Data = ProtectedData.Unprotect(EncodedData, Nothing, _


              DataProtectionScope.CurrentUser)


 


            Dim DataStream As New MemoryStream(Data)


            Dim Reader As New StreamReader(DataStream)


 


            Console.WriteLine("Decoded data from file: " & Reader.ReadToEnd())


            Reader.Close()


            Console.WriteLine()


        End If


 


        Console.ReadLine()


    End Sub


 


End Module


ماذا عن ...


            حماية البيانات قبل تخزينها في قاعدة البيانات؟ طالما أنك استخدمت الفئة ProtectedData لتشفير بياناتك يمكنك وضعها في أي مكان تريده ففي المثال السابق قمت بكتابة البيانات المشفرة إلى ملف ومع ذلك يمكنك كتابة البيانات الثنائية إلى سجل قاعدة البيانات ولفعل ذلك ستحتاج ببساطة إلى حقل ثنائي binary في جدولك بمساحة كافية ليتسع لمصفوفة البايتات المشفرة وفي الـ Sql Server تستخدم نوع البيانات varbinary لهذا الغرض


 


يوجد بقية للمقال . اضغط هنا لقراءتها

تم التحرير بواسطة samerselo @ ١٠:٤٧ م   0 تعقيبات
الصفحة الرئيسية
Google Search
Google
       

كتاب المدونة
من نحن ؟
مجموعة من الكتاب باللغة العربية بلغة الدوت نت ، نلتقي هنا لكي نتشارك الخبرات والمعلومات حول الجديد في عالم الدوت نت
ارشيف المواضيغ والمقالات السابقة
VB.net <> C#

الفروقات بين سي شارب و في بي . نت
روابط ومواقع تقنية عربية
عداد الزيارات
Locations of visitors to this page
أشخاص شرفونا بزيارتهم
مركز التحميل
© 2005 DotNet4Arab Blogspot Template by Isnaini Dot Com