يا this يا مرات ابويا !!

السلام عليكم , طبعا المقال غريب عنوانه شوي , لكن ليه علاقة وطيده جدا بالموضوع الذي سوف نتحدث عنه , سبب الحديث عن هذا الموضوع هو عملية بحث قام بها صديق مجهولة الهوية تحت عنوان " ما فائدة this في السي شارب "

Capture

عزيزي السائل سأحاول قدر المستطاع تبسيط الفكرة , لنضرب المثل التالي , تخيل انك متزوج وحده اسمها نوف مثلا , و ايضا بوك متزوج امراء اخرى اسمها نوف و هيا ليست امك يعني مرات ابوك , الفكرة , انت و الولد الله يحفظه جالسين على وجبة الغذاء مثلا و خلص الخبز او ارز او اي حاجة استعدت انك تنادي على نوف ! و هنا مربط الفرس اذا استخدمت اسم نوف فأي نوف انت تقصد , مرات ابوك و لا زوجتك !

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

   1: private int ID;
   2: private string name;
   3: private string location;
   4: private Emp manager = null; 
   5:  
   6: public Dept (int ID, string name, string location, Emp manager)
   7: {
   8:     ID = ID;
   9:     name = name;
  10:     location = location;
  11:     manager = manager;
  12: }


الشفرة مرة بسيطة عندي  حقول و عندي مشيد , لاحظ في المشيد اقوم بتعين قيم للحقول , و هنا ايضا مربط الفرس اي متغير انت تقصده بضبط ! المتغير اللي جاي مع المشيد و لا الحقل ! عشان كده احنا نستخدم this  حتى يفهم المترجم , انو اقصد المتغير هذا بحد ذاته او الطريقة هذي بحذ ذاته , الشفرة بعد التصحيح :



   1: private int ID;
   2: private string name;
   3: private string location;
   4: private Emp manager = null; 
   5:  
   6: public Dept (int ID, string name, string location, Emp manager)
   7: {
   8:    this.ID = ID;
   9:    this.name = name;
  10:    this.location = location;
  11:    this.manager = manager;
  12: }


, يعتبر استخدام كلمة this احد شروط الاساسية لكتابة شفرة سي شارب موافقة لمقاييس مايكروسوفت , تستخدام this  في ثلاث  حلات  :




  • عند استخدام طريقة ما داخل نفس التصنيف .


  • عند استخدام الحقول  كما في المثال السابق .


  • عند استخدام الخصائص داخل التصنيف .

سنتين على اطلاق مدونة انا سي شارب

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

a7038584-1122-4a0d-b821-ca1205cd9006

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

صفحت المدونة على تويتر .

صفحة المدونة على الفيس بوك .

بريد المدونة : imcsharp@windowslive.com 

بَلْ وَجَدْنَا آبَاءنَا كَذَلِكَ يَفْعَلُونَ - 1

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

للنظر لهذه الشفرة :

public string UsersName ;

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

Users user = new Users();

user.UsersName = "ALGHABBAn";

سابقا كانت  هذه الطريقة المتبعة للبناء الحقول العامة ,على  اية حال هذا الامر اصبح محظور شرعا في شريعة  C sharp   حيث استبدلت public field بـ Properties  , الشفرة : 

/// <summary>
/// The name of the user.
/// summary>
private string userName ; 
/// <summary>
/// Gets or sets the name of the user.
/// summary>
/// <value>
/// The name of the user.
/// value>
public string UserName 
{
   get {return name ;}
   set {name = value ;}
}

يمكن اختصار الشفرة في الاعلى اكثر من ذالك بكثير , بهذا الشكل : 


/// <summary>

/// Gets or sets the name of the user.

/// summary>
/// <value>
/// The name of the user.
/// value>
public string UserName { get ; set; }


حتى لا نقع في نفس فكرة الاية , سأوضح لماذا يحرم استخدام  Field على انها public و يجب استخدام  Properties او الخصائص , 

  • السبب الرئيسي و اهم سبب هنا و صدق او لا تصدق ( مشكلتك ),  جميع public field سيقوم مترجم الدوت نت في النهاية بتحويلها إلى Properties لذالك من  الاسرع  و الاسهل دائما و زياة مستوى الانتاج لشفراتك استخدام Properties مباشرة عوضا على تكليف المترجم بخطوة أخرى . 
  • اذا كانت مشاريعك تستخدم او تعتمد  System.Refelction فقد يصبح امرك في خبر كان , و اعتقد انك تفهم عن  ماذا اتحدث . 
  • في كثير من الاحيان قد تريد ان يتم تعين قمية الخاصية بطريقة معينة في حالة استخدامك للـ public field لن تستطيع ات فعل اي شي , بينما يمكنك استخدام الجزء set لكتابة اي الطريقة التي تريدها  . 
  • ايضا ربما تريد في كثيرة من الاحيان ان يكون الجزء الخاص بتعين قيمة المتغير محصور فقط على التنصنيف او Class الحالي , و لا تريد من ان يتم تعينه من خارج Class لذالك يمكنك استخدام private set . 
اذا لم تتغير قناعتك بضرورة التخلي عن public fleid فأنصحك بالانتحار فورا  .!! 




سي شارب بنكهة القوائم البريدية

السلام عليكم  , اليوم انظم للمدونة الاخ مروان الحربي , الاخ مروان الحربي من المهتمين بنشاء و ادارة القوائم و المجموعات البريدية , من خلال الاشتراك بإيمل المدونة حتوصلك بشكل يومي او ربما اسبوعي لا اعلم في الحقيقة  :) , رسائل للمدونة بكتب مجانية او اهم المقالات و المدونات المنشوره , و افكار مشاريع و برامج مفتوح المصدر جميعها متعلقة بـ سي شارب , من المفترض ان تكون , ان شاء الله انها تكون قائمة ممتعة و ملئية بالفائدة و المنفعة لجميع المتابعين  , بتوفيق للاخ مروان الحربي و ان شاء الله تكون بداية ممتعه و حماس , و شكرا على موافقتك للنظام للمدونة . 

للاشتراك في المدونة ارسل رسالة فارغة على imcsharp@windowslive.com  .

عزيزي العميل FrameWork

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

  • قد يختلف البنك الذي يستعمله المستأجر عن المؤجر , و بالتالي ستختلف كليا طريقة تعامل البيانات من بنك إلى اخر فربما يستخدم البنك X  ملفات XML و SOAP  للتعامل مع الطلبات الخارجية من بنوك اخرى بينما تجد البنك B يتعامل مع برتوكولات FTP  .
  • حتى في حالة كون كلا الجهتين المستفيده المستأجر و المؤجر يتعاملان مع نفس البنك , و كون الخدمة التي تقدمها شركتك المبجلة مستقلة عن نظام البنك , فعليك ايضا ان تتفاهم بطريقة او بأخرى مع اسلوب تصميم قواعد البيانات و API او SOAP  التي يستخدمها البنك لتحويل من عميل إلى أخر  , لكل بنك .

هناك حلول كثيرة لهذه المشكلة اليك بعض الحلول :

  1. اولا قد تفكر ببناء تطبيق معين لكل بنك على حدة , فكرتك العبقرية هذه تعتمد بها على ان كل بنك لديه تطبيق معين و اسلوب مختلف في التعامل مع البيانات البيانات .
  2. اما في حالة التعاملات بين بنكين , فقد يتنج لك اكثر من تطبيق لكل طريقة تعامل مع البيانات .

image

عموما كلا الحلين اغبى من الاخر , ليس فقط اغبى بل يصل لدرجة جحى من الحماقة . هنا يأتي دور ما يسمى بالـ FrameWork  .

ما هو الصلا FrameWork  :

تختلف التعاريف حول مفهوم FrameWork  و لكن تتفق جميعها على مبدأ واحد لا تكرر الشفرة , يرى البعض بأن FrameWork  مجموعة كبيرة من الـ Method  مقسمة على NameSpaces  فحين يرى الاخر بأن FrameWork هو شفرة معينة تقوم بحل مشكلة ما لديها القدرة على التأقلم بمختلف الظروف الممكنة , فحين يرى مجموعة اخرى من العلماء gee's بأن الـ FrameWork  يجب ان يجمع بين الاثنين , بإضافة شرط أخر ان يكون لديه القدرة على اعادة استخدامه في اكثر من امكان .

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

  • رقم حساب العميل المسـتأجر .
  • اسم العميل المستأجر .
  • مبلغ الحوالة من العميل المستأجر .
  • رقم الحساب للعميل المؤجر .
  • اسم العميل المؤجر .

هناك ثلاثة طرق ستكرر في كل التطبيقات و هيا بشكل التالي :

  • سحب مبلغ مالي من حساب العميل المستأجر .
  • ايداع المبلغ المسحوب من العميل المستأجر في حساب العميل المؤجر .
  • خصم الربح من العميل المؤجر لحساب الشركة  .

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

IMAG0007

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

عموما ازفني الوقت , سأتحدث كثيرا عن هذا الامر في المقالات القادمة , لا ستعجل على رزقك ابتسامة 

وجود صلاحيات على المجلد

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

هناك نوعين من الصلاحيات الاول على الملفات لن اتحدث عن الملفات فأمرها بسيط , ما يهمني هنا هو  المجلدات , تختلف الطرق في الحقيقة التي تستخدم لتأكد من وجود صلاحيات الكتابة في مجلد معين من عدمها , البعض يستخدم فضاء الاسماء system.security  بكل تفرعاته .

هناك حل اسرع و اكثر وضوحا و لكن طبعا على حساب الاداء رغم ان الفرق ليس بذلك الفارق الكبير , خصوصا في الوقت الحاضر طبعا , الحل كتالي :

   1: public static bool CheckDirectoryAccessRigth(string directory)
   2:         {
   3:             string fullPath = directory + TEMP_FILE;
   4:             if(AHString.IsNotNullAndEmpty(directory))
   5:             {
   6:                 if(Directory.Exists("directory"))
   7:                 {
   8:                     try 
   9:                     {
  10:                         using(FileStream fs = new FileStream(fullPath,FileMode.Create,FileAccess.Write))
  11:                         {
  12:                             fs.WriteByte(0xff);
  13:                         }
  14:                         
  15:                         if(File.Exists(fullPath))
  16:                         {
  17:                             File.Delete(fullPath);
  18:                             return true ;
  19:                         }
  20:                     }
  21:                     catch
  22:                     {
  23:                         throw new Exception(" you don't have access to this Directory !");
  24:                     }
  25:                 }
  26:                 throw new Exception("Directory not Exists");
  27:             }
  28:             return false;
  29:         }

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


اعدادات IMCS لـ Visual Studio 2010

بعد الفيديو اللي تحدث فيه عن Unit Test ساني اكثر من شخص عن اعدادات بيئة VS 2010  اللي استخدمها , في هذه المقالة حشارك معكم هذه الاعدادات , طبعا تقدر تغير هذي الاعدادات من Tools > Opetion  , فيما يتعلق بالاختصارات هذا الجدول في كل الاختصارات من لوحة المفاتيح :
الاختصار العمل
Ctrl + D GoToDefination
Ctrl +Shift + D GoToDecraltion
Alt + Shfit + F Add New Folder
Alt + Shift + P Add New Project
Alt + Shift + C Add new Class
Alt + Shift + R Add new References
Alt + Shfit + D Show Data Soruce Window
Ctrl + W + S Show Sulotion Explorer
Ctrl + W + E Show Error Window
Ctrl + W + P Show Proprties Window
Ctrl + W + L Show Server Exploere
Ctrl + W + Output Show Output window
Ctrl + R + M Create Selected Code to Method
Ctrl + R + E CreateFiled
Ctr + K + T view Call history
Ctrl + w + T Show task List Window
Alt + v + n Go to Next Error
Alt + B Create breakpoint
alt + N Step in
alt + o step out
alt + B + B Create book mark
alt + B + N next book mark
alt + B + V Preivaes Book Mark
Ctrl + w + B Book mark window
ctrl + W + W Show Web Browse Window
ctrl + Shfit + B Build
بالإضافة إلى الكثير من التعديلات على خيارات بيئة التطوير اللي من شأنها انها تزيد من سرعة VS  بكثير , اخيرا الاعدادات هذي تجي بثلاث اشكال , الصور :
Snap_2012.01.05 17.02.11_001لتثبيت اي من هذه الاعدادات من قائمة Tools > Import And Export Setting حدد الخيار Import selected envirment setting  , لا تنسى ايضا تحديد جميع الخيارات في شاشة الاعدادات .

بروتوكول SFTP باستخدام C Sharp

للاسف الشديد لا تعدم .Net  مباشرة الية العمل مع بروتوكول SFTP , بروتوكول SFTP مطابق تمام لبروتوكول FTP  لكن الفرق بأن عملية تمرير البيانات من جانب إلى أخر ستكون مشفرة هذه المرة في حالة SFTP , حاليا لا يوجد دعم رسمي من قبل .Net , طبعا بسبب بسيط لأن SFTP مدعومة فقط من Liunx ,  و لكن ضهرت حلول كثيرة لتجاوز هذه المشكلة , منها استخدام اسلوب الـ java .net integration لان هذه الأخيرة تدعم SFTP و هذا تقريبا ما تقوم بعملة المتكبة SharpSSH  . 

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

Sftp Client = new Sftp("192.167.23.10","IMCSHARp","12345");
Client.Connect(22); //<-- Sftp prot , by defult is 22 
, ثم يمكنك تحميل ملف ما , بطريقة التالية : 

Client.Get("/home/alghabban/Test.txt","C:\\Test.txt");

يمكنك ايضا تصفح الملفات الموجود على مجلد معين باستخادم الطريقة GetFileList , بهدا الشكل : 

ArrayList fileList = Client.GetFiles("/home/alghabban/");


كما يمكنك استخدام الطريقة Put لرفع ملفات إلى service بطريقة التالية : 

Client.Put("C:\\Text.txt","/home/alghabban/");

اعتذر عن حماقة الخط