المتابعون للمدونة

الاثنين، 31 ديسمبر 2012

في وداع عام.. في وداع حب (6)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


 (6/12)

سادسُها دقّةُ أفراحٍ تَزهو في عُرسِ مآقينا
والحُورُ العِينُ تُراقِصُنا بِكلامٍ غنّى في فِينا
قد قلتُ: "أذوبُ أنا عِشقًا"، قد قلتِ: "حنانُكَ يَكفينا"
صرنا نجمينِ إلى أبدٍ نُعطي للّيلِ مَضامينا
بمجردِ نَبضِ حنايانا، بمجردِ همسِ معانينا
كانتْ في عمري أيامًا مرّْت تَنفحُنا يَسْمِينا
كانتْ أحلامي دعواتٍ، وملائكُ أُنْسٍ تَرقِينا
وحلاوةُ حبِّكِ تُسكرُني ونسيمُ البهجةِ يُنشينا
ورياضُ مُنانا مَسكنُنا، والحزنُ يُهاجرُ مِسكينا
وزهورُ الأيكةِ تَحرسُنا، ووعودُ الحبِّ صياصينا
كانتْ أيامًا أعشقُها تَشهدُ عن نُبلِ مَرامينا

حسبة برما


حسبة برما

 

ذات يوم كانت سيدة من قرية (برما) التابعة لمركز طنطا بمحافظة  لغربية، تسير وهي تحمل سلة بيض، وفجأة اصطدم بها رجل فسقط البيض وانكسر.. سألها الرجل عن عدد البيض ليدفع لها ثمنه، فقالت له: لا أعرف عدد البيض بالضبط، لكن كل ما أعرفه هو:

- أنني إذا وزعته على سلتين تتبقى بيضة زائدة.

- وإذا وزعته علي ثلاث سلال تتبقى بيضة زائدة.

- وإذا وزعته علي أربع سلال تتبقى بيضة زائدة.

- وإذا وزعته علي خمس سلال تتبقى بيضة زائدة.

- وإذا وزعته علي ست سلال تتبقى بيضة زائدة.

- وإذا وزعته علي سبع سلال لا يتبقى أي شيء من البيض خارج السلال.

هل تستطيع رسم مخطط تدفق Flowchart يحل هذه الحسبة التي أرهقت أهل (برما) برمتهم؟

ج: لم يكن أهل (برما) محظوظين بالتأكيد لأنهم ليسوا مبرمجين، فالأمر يغدو في غاية البساطة باستخدام الحاسب!
الفكرة هنا هي أن نستخدم متغيرا اسمه n تبدأ قيمته بواحد، ونستمر في زيادة قيمته بواحد داخل جملة تكرار Loop، ولا نتوقف عن فعل هذا إلا إذا تحققت كل الشروط الستة التالية معا:

n mod 2 = 1,      n mod 3 = 1,      n mod 4 = 1

n mod 5 = 1,      n mod 6 = 1,      n mod 7 = 0

حيث mod تعني باقي القسمة.. فمثلا n mod 2 تعني الباقي من قسمة n على 2.. وهكذا.

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

أما إذا تحققت كل الشروط معا، فهذا يعني أن الرقم الموجود في المتغير n في هذه اللحظة هو عدد البيض، وعلينا عرضه على الشاشة وإنهاء البرنامج.

والصورة التالية توضح مخطط تدفق حسبة (برما).

لاحظ أنك لو نفذت هذا المخطط بكود فيجيوال بيزيك، فستحصل في أقل من ثانية واحدة على ناتج يخبرك أن عدد البيض هو 301 بيضة.. هل تصدق أن هذه هي "حسبة برما" التي يضرب بها الناس المثل؟!!

وهناك ملحوظة أخرى هامة تتعلق بتحسين أداء البرنامج.. فما فعلناه هو إلقاء العبء كاملا على كاهل الحاسوب، دون أي تدخل من ذكائنا الإنساني، مع أننا بملاحظة بسيطة سنكتشف أن العدد الذي يحل حسبة (برما) لا بد أن يكون من مضاعفات الرقم 7، لأن قسمة عدد البيض على 7 هي الحالة الوحيدة التي لا يتبقى فيها باق!

هذه الملحوظة البسيطة يمكن أن تساعدنا في تحسين سرعة البرنامج إلى سبعة أضعاف.. فبدلا من أن نزيد قيمة المتغير n بواحد، سنجعل قيمته المبدئية 7 ونزيده في كل مرة بمقدار 7، ليكون باستمرار أحد مضاعفات العدد 7.. أليس هذا أذكى ويوفر 6/7 من الوقت الذي يستهلكه البرنامج؟

سأترك لك تعديل خريطة التدفق للاستفادة من هذه الفكرة.

في وداع عام.. في وداع حب (5)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


 (5/12)

خامِسُها دَقّةُ بَهجتِنا بلقاءٍ نَعَّمَ شاكينا
يَشدو ببراءةِ قصّتِنا، وجِنانُ الطُّهرِ تُنادينا
فيه استيقظنا من حُلمٍ في حُلمٍ حُلوٍ يَحوينا
ورأيتُ حياءَكِ يأسِرُني، وثِمارَ الروعةِ بادينَ
ولَمَستُ دلالَكِ داعبَني والسوسنُ كانَ يُناجينا
والطيرُ العاشقُ يُنشدُنا فوقَ الأفنانِ أفانينا
وتمرُّ على الرَّوضِ رياحٌ تُهدى للقلبِ رياحينَا

في وداع عام.. في وداع حب (4)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


 (4/12)

رابعُها دقّةُ أفكاري: أشتبَكَتْ قَدَرًا أيدينا؟
هل حقا عِشقُكِ راودَني عن نفسي فَرْحا يُغرينا؟
هل يُعقَلُ أَهذِي مَفتونًا لمجردِ همسِ أغانينا؟
هل صِدقٌ ما أشعرُ: أنّي أحببتُكِ في الغيبِ سنينا؟
أم أن الحُلمَ يُغرّرُ بي، وَلَسوفَ أراكِ تغيبينَ؟
ويَلَذُّ السُهْدُ بأفكاري، فأظلُّ على النومِ ضَنينا

هل يمكن رسم قرار ثلاثي؟


س: في خريطة التدفق Flowchart هل يمكن رسم قرار ثلاثي؟

 

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

 

ملاحظة:

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

Dim Grade As Integer = TextBox1.Text

Dim Result As String

Select Case Grade

Case IS < 50

Result = "Bad"

Case IS < 65

Result = "Accepted"

Case IS < 75

Result = "Good"

Case IS < 90

Result = "Very Good"

Case Else

Result = "Excellent"

End Select

MsgBox(Result)

في وداع عام.. في وداع حب (3)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


 (3/12)

ثالثُها دقّةُ بَسمتِها جعلتني حُرًّا وَسَجينا!
ورسمْتُ نجومي عينيها ورسمتُ عيونا تَسقينا
ونَهِلتُ وما بي مِن ظَمَأٍ لكنْ ضِحكتُها تُنشينا
تكفيني لذةُ لُقياها لجميعِ الدنيا تُنسينا
كم إنّي أهوَى بسمتَها، كالبدرِ بدفءِ ليالينا
هي قُرّةُ عيني، تَغسلنُي من همّي فورَ تَلاقينا

الأحد، 30 ديسمبر 2012

في وداع عام.. في وداع حب (2)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


 (2/12)

ثانيها دقّةُ نظرتِها عزفَتْ مَكنوني تلحينا
سكبتْ في دمّي بهجتُها أطيافَ جميعِ أمانينا
ترسُمُ برشاقةِ ريشتِها وتُلوّنُ عُمري تلوينا
وكراتُ دَمِي بالوناتٌ تلهو وتفوحُ رياحينا
تعلو بفضاءِ خيالاتي وتقبّلُ طيرًا شادينَ
في النشوةِ غرقتْ عينانا وقوافي الشِّعرِ تُغنّينا

في وداع عام.. في وداع حب (1)


في وداع عام.. في وداع حب

دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا


(1/12)

فالأولى دَقّةُ لُقياها، ذِكرى أنغامِ أسامينا
كانتْ كملاكٍ هَفهافٍ بِرحيقِ الروعةِ يُحذِينا
آهٍ لو أذكرُ عينيها ذِكْرًا مُنْطبقًا وأمينا
لاجْـتاحَ الشوقُ جوانِحَكُم ووددتمْ رُؤيتَها حِينا
وَلَبِثْتُمْ حولَ مباهجِها في حلمٍ أرقى تَكوينا
فيه مناراتٌ وطيورٌ ونجومٌ تلمعُ تَهدينا
فيه فراشاتٌ وزهورٌ وحريرٌ يترقرقُ لِينا

أي اللغات أفضل وأقوي في لغات الدوت النت؟


س: أي اللغات أفضل وأقوي في لغات الدوت النت؟


ج: كل لغات دوت نت تملك مزايا إطار العمل وتستخدم مكتبته الضخمة من الفئات، وكل هذه اللغات تترجم في النهاية إلى اللغة الوسيطة IL، وبالتالي فإن كفاءة تنفيذ البرامج المكتوبة بها واحدة، ويبقى التفصيل بينها مسألة ترجع للمبرمج نفسه.. فمن يألفون صياغة C++ سيفضلون C# ومن يجيدون الجافا سينتقلون إلى J# ومن يستريحون لصياغة فيجوال بيزيك سيفضلون VB.NET، ومن ما زالوا يحبون باسكال سيستخدمون دلفي دوت نت.. وهكذا.. أما من لا تعجبه كل هذه اللغات، فيمكنه كتابة لغة جديدة خاصة به وإضافتها إلى دوت نت!

الجدير بالذكر أن هناك بعض المزايا القليلة تميز بعض اللغات عن الأخرى..

فلغة سي شارب على سبيل المثال تتيح استخدام المؤشرات Pointers للتعامل مع الذاكرة مباشرة، ولكن هذا الكود يسمى في دوت نت بالكود غير المدار Unmanaged code ولا يُنصح باستخدامه.. خاصة أن إطار العمل يتيح لكل لغات دوت نت نوعا من المؤشرات الآمنة مثل الفئة IntPtr، كما تتيح بعض فئات إطار العمل التعامل مع الذاكرة بطريقة غير مدارة.. كما يمكن اعتبار أي كائن مؤشرا للذاكرة، لأن المتغير المعرف من الفئة يحمل مرجعا للذاكرة.. وبهذا المبدأ البسيط شرحت في كتاب من الصفر إلي الاحتراف كيف يمكن إنشاء Linked List باستخدام الفئات، ودون استخدام المؤشرات كما هو متبع عند إنشائها في C++.

أما فيجيوال بيزيك، فتمتاز بسهولة ووضوح الكود المكتوب بها، ويقدم محرر الكود Code Editor والمصحح Debugger تسهيلات كثيرة للمبرمج لاكتشاف الخطأ وتصحيحه.. كما تمتلك فيجوال بيزيك مكتبة كاملة من قوالب الكود Modules قادمة من VB6 معظمها له مثيل في إطار العمل، كما تمتلك فيجوال بيزيك دوت نت نطاقا اسمه My فيه معظم الوظائف البرمجية التي يكثر احتياج المبرمج إليها، وبعضها لا يمكن تنفيذه من خلال إطار العمل بسهولة.

أيضا يمكن في فيجوال بيزيك بسهولة إنشاء برنامج وحيد النسخة Single Instance، وهو ما يحتاج لكود معقد في سي شارب باستخدام العمليات Processes، إلا لو قام المبرمج باستيراد نطاق فيجوال بيزيك في برنامج سي شارب، واستخدم الفئة WindowsFormsApplicationBase الخاصة بفيجيوال بيزيك.

كما أن استعلامات LinQ تملك بعض التسهيلات الإضافية لا توجد في سي شارب، ولكن يمكن أداء نفس الوظائف باستدعاء الدوال الإضافية Extension Methods المعرفة في الفئة Enumerable.

بشكل عام: لا يوجد شيء يمكن فعله في سي شارب ولا يمكن فعله في فيجوال بيزيك، والعكس صحيح أيضا.

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

في وداع عام.. في وداع حب (0)


في وداع عام.. في وداع حب

(كُتبت في لحظات احتضار عام 1994)

(0/12)

دقاتُ الساعةِ تَنعينا ... أيامًا كانتْ تَحوينا
تُعلنُ عن عامٍ مولودٍ لَنْ يَشهدَ غيرَ مآسينا
دقاتُ الساعةِ في رَعَشٍ تُبطِئُ في مَفرِقِ وادينا
هل تُوقِفُ زمنًا فَرّقنا؟.. أم تَمضي تَقضي تَرمينا؟
هل تتركُ قلبي مُفرَدَهُ في ليلِ جليدِ صحارينا؟
في ذِكرَى حبٍّ قد ولَّى تُؤرِي الدَّمعاتِ فتَكوينا
دقاتُ الساعةِ هي عمرٌ يُفلتُ مِن بينِ أيادينا

السبت، 29 ديسمبر 2012

ابحث مع شفيق عن 8 مليون مصوت


ابحث مع شفيق: 8 مليون ممن صوتوا لشفيق

أين اختفوا في استفتاء الدستور؟!

 

هذه المسألة لهواة الرياضيات السياسية:

-  حصل د. محمد مرسي في انتخابات الرئاسة على أصوات 13 مليون مصري تقريبا.

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

-      عدد من صوتوا لشفيق في انتخابات الرئاسة حوالي 12 مليون مصوت.

-  عدد من قالوا لا للدستور حوالي 6 مليون مصوت، فإذا خصمنا 2 مليون من الشباب الثوري الذين تراجعوا عن تأييد مرسي، فهذا يترك لنا 4 مليون من الفلول قالوا لا للدستور.. السؤال هو: أين باقي الملايين الثمانية التي صوتت لشفيق في انتخابات الرئاسة؟!

-  في استفتاء 19 مارس كان عدد من يحق لهم التصويت حوالي 45 مليونا، وفي انتخابات الرئاسة كان عدد من يحق لهم التصويت 51 مليونا، بفارق 6 مليون صوت لا أحد يدري من أين ظهرت فجأة!

من كل الحقائق السابقة:

احسب عدد الأصوات الوهمية التي صوتت لشفيق، وعدد من تم شراؤهم بالنقود للتصويت لشفيق!

***

تبعا لجهاز التعبئة والإحصاء، عدد سكان مصر حاليا 83.5 مليون نسمة (وليس 90 مليونا كما أوهمونا فجأة في العام الماضي!!):


منهم 40% تحت سن 18 سنة أي حوالي 33.5 مليون فتى لا يحق لهم التصويت.. وهذا يترك حوالي 50 مليون مواطن فوق سن 18 سنة.. منهم حوالي 2 مليون في الجيش والشرطة، ويجب أن نخصم أيضا رجال النيابة والقضاء وكل من لا يحق لهم التصويت من المسجونين ومن أفرج عنهم وما زالوا لم يرد اعتبارهم (لمدة 6 سنوات)، إضافة إلى من لا يحملون بطاقة رقم قومي حتى اليوم من المناطق النائية.. فلنقل إن هناك مليون إنسان آخر لا يحق لهم التصويت.. إذا وصلنا إلى استبعاد 3 مليون مواطن.

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

من كل ما سبق نستنتج أن قاعدة البيانات يجب أن تحتوي على 50 – 3 = 47 مليون مصوت على أقصى تقدير، لكنها الآن تحتوي على 51 مليونا بفارق 4 مليون صوت!

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

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

الجمعة، 28 ديسمبر 2012

مترجم للغة سي شارب بلغة سي شارب!


مترجم للغة سي شارب بلغة سي شارب!

 

أجريت بعض عمليات البحث، ووصلت إلى معلومات تقول إن مترجم سي شارب C# Compiler قبل الإصدار الرابع تمت كتابته بلغة سي ++ (في الغالب VC++)، ولكن بدءا من الإصدار الرابع وما يليه تمت كتابة مترجم سي شارب بلغة سي شارب نفسها!

هذا الكلام يبدو غريبا ومربكا: إذ كيف يمكن كتابة مترجم لغة بنفس اللغة؟!

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

وهذا الموضوع يشرح كيفية كتابة مترجم للغة خاصة بك في دوت نت:


وهذا مثال لمترجم لكود سي شارب مكتوب بسي شارب:


 

بأي لغة برمجة تم تطوير لغات الدوت نت؟


س: بأي لغة برمجة تم تطوير لغات الدوت نت؟

 

ج: بالنسبة للغات دوت نت، يمنحك إطار العمل الأدوات الكلملة لإنشاء لغة برمجة خاصة بك تستهدف إطار العمل وتعمل في بيئة فيجوال ستديو دوت نت.. لهذا فإن لغات مثل J# وF# وكوبول دوت نت وفورتران دوت نت إلى آخر كل هذه اللغات، يمكن كتابتها بسي شارب.. وهذا ينطبق أيضا على بعض تقنيات دوت نت مثل ASP.NET و WPF وغيرها.

أما واجهة فيجوال ستديو والجزء الرئيسي في إطار العمل CLR قد تمت كتابتهما بفيجوال سي ++ (VC++) وهي أقوى لغة برمجة على نظام الويندوز، وأصعبها أيضا، لأنها تتعامل بشكل رئيسي مع مكتبات API التي تم بناء الويندوز بها، كما تسمح بكتابة مقاطع بكود لغة التجميع Assembly منخفضة المستوى لمخاطبة مكونات الجهاز مباشرة.

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

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

ولو أردت رؤية كود فئات إطار العمل، فيمكنك استرجاع الكود الخاص بها بأحد برامج الانعكاس Reflection مثل هذا البرنامج المجاني (وكوده المصدري متاح أيضا):


يتيح لك هذا البرنامج استرجاع الكود الأصلي لأي برنامج مكتوب بدوت نت، سواء في صورة كود سي شارب أو كود فيجيوال بيزيك أو كود اللغة الوسيطة IL.. ويتضمن هذا فئات إطار العمل المكتوبة بسي شارب.

بالمناسبة: قرأت أن واجهة فيجيوال ستديو دوت نت 2012 تمت إعادة برمجتها بتقنية Wpf، وفي الغالب بلغة سي شارب.

 

ملاحظة:

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

 

الخميس، 27 ديسمبر 2012

هل الحب استكانة؟


على لسان سماح، من رواية حائرة في الحب:


هل الحُبُّ اسْتكانة؟

اسْتكانةٌ أمْ سكينة؟

قارِبٌ مِن ورقٍ مُفضَّضٍ لا يَسْأَلُ التّيارَ عن اتّجاهِه، أم حُلْمٌ بلا نهاية، والحُلْمُ وقْتُه النّوم، والنّائمُ في ملكوتٍ آخر، تتحكّمُ فيه قوانينُ أُخَر؟

ماذا فعلَ بي هذا الفتى؟.. كيف أكونُ أمامَه هكذا بلا حولٍ ولا قوّة؟

لا يَهمُّني.. أليستْ مُتْعةُ الدنيا كلِّها، أنْ تكوني في حمايةِ شخْصٍ تثقينَ به، بجوارِه تخلعينَ عنكِ الدنيا: همومَها وحَذَرَها وشكوكَها؟

أن تجدي مَن يحْملُ عنكِ عناءَك، ويمْنَحُكِ البهجةَ والتحليق؟

لي هو (إياد)، في حَضْرتِه أعْجزُ عنْ مُصانعةِ مَنْ حولي الكلامَ والمَرَح.. هو موجودٌ: إذن يكفي.. إذن فما معنى العقلِ، الكلامِ، المرحِ الزائفِ، التفاهات؟

فقط العينُ والأُذنُ والقلب، وكلُّ الإحْساسِ مُسَخَّرٌ للتفاعلِ مع ما تعيشُه.

لماذا أشغلُ ذِهني؟.. أحبُّه وهذا يكفيني.

*****

كنتُ سعيدة.. سعيدةً كأنّي تزوّجْتُه!

إنها أوّلُ مرّةٍ يهتمُّ بي فيها بمثلِ هذا الشّكل.. هل أخيرًا لاحظَ اهْتمامي به؟

اهتمامي؟.. (يَعْ)!.. ما أسْخفَه مِنْ لفظ!

الاهتمامُ مصطلحٌ هزيلٌ، مُصابٌ بأنيميا المَعاني، بجوارِ شعوري به.

أنا أعشقُه، أتمنّاه، أعيشُه.

 

 

الأربعاء، 26 ديسمبر 2012

الفئات والسجلات والنصوص كحالة خاصة


س: إذا كان النوع String فئة Class، فلماذا عندما نسند إليه قيمة نكتب مثلاً:

Dim X As String = "Any Thing"

بدلاً من:

Dim X As New String("Any Thing")

وإذا كان النوع Integer هو Structure فلماذا نسند له أرقام مباشرة بدلاً من استخدام الصيغة:

Dim I As New Integer(1000)

 

ج: الفئات Classes:

هي أنواع مرجعية Reference Types.. هذا معناه أن الكائن Object الذي يتم تعريفه من الفئة هو مجرد متغير يحمل مرجعا Reference للذاكرة التي تحتوي على تفاصيل هذا الكائن.. على سبيل المثال:

Dim F As Form

الكائن F في الكود السابق هو مجرد مخزن يوضع فيه عنوان الذاكرة الذي يحتوي على كل بيانات النموذج.. ونظرا لأن الكود السابق لم ينشئ أي نموذج، فإن المتغير F سيكون فارغا وقيمته Nothing، أي انه لا يشير إلى أي ذاكرة، ولو حاول المبرمج استخدام المتغير F في أي عملية في الكود، فسيحدث خطأ في البرنامج.. لهذا يجب استخدام الكلمة New لإنشاء كائن النموذج في الذاكرة، ووضع عنوانه (مرجعه) في المتغير F:

F = New Form( )

الآن، صار المتغير F يشير إلى كان النموذج الجديد، ويمكن استخدامه في الكود بشكل عادي لتغيير حجم النموذج أو لون خلفيته أو عرضه... إلخ:

F.Show( )

ويمكن نسخ المرجع الموجود في المتغير F ووضعه في متغير آخر:

Dim F2 As Form = F

في هذه الحالة لا يتم إنشاء نموذج جديد، ولكن كل ما يحدث هو أن يحمل كل من المتغيرين F و F2 نفس العنوان (المرجع) الذي يشير إلى نفس نسخة النموذج، وأي تغيير يحدث على أي متغير، يؤثر على المتغير الآخر، لأنهما فعليا مجرد اسمين لنفس الكائن، وليسا كائنين مختلفين.

هذه هي القاعدة العامة للتعامل مع جميع الفئات والكائنات المعرّفة منها.. لكن الأمر يختلف عند التعامل مع الفئة String، نظرا لأنها نوع أساسي يستخدم بكثرة في الكود، ومن المريح التسهيل على المستخدم عند التعامل مع هذا النوع.. لهذا يوجد استثناءان عند التعامل مع النصوص:

1- لا يحتاج المبرمج إلى استخدام الكلمة New عند تعريف النص.. لهذا يمكن استخدام الصيغة:

Dim X As String = "Any Thing"

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

مع ملاحظة أن الصيغة الأصلية أيضا متاحة وصحيحة:

Dim X As New String("Any Thing")

وكما قلت لك: كلتا الصيغتين ستنتجان نفس الكود بالضبط في اللغة الوسيطة J

2- إسناد متغير نصي إلى آخر يؤدي إلى نسخ القيمة وليس المرجع..  مثال:

Dim X As String = "A"

Dim Y As String = X

X = "B"

MsgBox(X) ' B

MsgBox(Y) ' A

ستعرض الرسالتان قيمتين مختلفتين، لأن المتغيرين X و Y يشيران إلى كائنين مختلفين في الذاكرة.. وهذا معناه أن فئة النص تتصرف كالسجلات عند إسناد القيم.

ملحوظة:

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

 

أما بالنسبة للسجلات Structures:

فهي أنواع قيمية Value Types، وهذا معناه أن الكائنات المعرفة من السجلات تحمل كامل البيانات المحفوظة في الذاكرة مباشرة، وليست كالفئات تحمل مجرد عنوان الذاكرة.. وبسب هذا الفارق، لا تحتاج السجلات إلى استخدام الكلمة New في تعريفها (وإن كان من الممكن استخدامها في فيجوال بيزيك اختياريا).. فبمجرد تعريف متغير من السجل، يتم حجز مساحة الذاكرة التي يحتاجها هذا السجل، ويعتبر السجل موجودا وقابلا للاستخدام في الحال.. أي أن الكود:

Dim I As Integer = 3

مكافئ تماما للكود:

Dim I As New Integer( )

I = 3

مع ملاحظة أنك لا تستطيع وضع أي أرقام بين القوسين، لأن السجل Integer ليس له حدث إنشاء (منشئ) Constructor يقبل معاملا Parameter.

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

Dim I As Integer = 5

I = Nothing

MsgBox(I) ' 0

ونظرا لأن متغير السجل يحتوي على قيمته الفعلية، فإن إسناد سجل إلى آخر يؤدي إلى نسخ قيم السجل الأول إلى الثاني، مع بقاء كل منهما مستقلا عن الآخر، وليس كما هو الحال في نسخ الفئات مرجعيا.

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

Class X

     Dim A As X

End Class

بينما لا يمكن تعريف متغير داخل السجل من نفس نوع السجل.. الكود التالي مرفوض:

Structure Y

     Dim B As Y

End Structure

ففي الحالة الأولى ستحتوي الفئة X على مرجع لنسخة أخرى من نفس نوع الفئة X وستكون قيمة المتغير A في البداية Nothing.

بينما في الحالة الثانية سيحتوي السجل Y على نسخة كاملة جديدة من نفس نوع السجل سيتم حجزها في الذاكرة ووضعها في المتغير B، الذي بدوره سيحتوي على نسخة كاملة جديدة من نفس نوع السجل سيتم حجزها في الذاكرة ووضعها في المتغير B، وهو بدوره سيحتوي على نسخة كاملة جديدة من نفس نوع السجل سيتم حجزها في الذاكرة..... وهكذا في دائرة مغلقة، لن تنتهي إلا حينما يتم استهلاك مساحة الذاكرة بالكامل دون جدوى!.. لهذا لا تسمح لغات البرمجة بهذا الأمر مع السجلات.

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

 

 

صفحة الشاعر