برجاء تسجيل الإعجاب بالصفحة لتصلك كتاباتي على فيسبوك

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

الأربعاء، 23 أغسطس، 2017

بنات كتير



بنات كتير 

في بنات كتير أجمل منك
مغرورة ليه ما تعيشي سنك
هو عشان شايفك قمري
قلبك عليا هـيتّـنّك؟ 

في بنات كتير حلوين زيك
وانا واد حليوة ومتتشيك
لو واحدة حلوة تغمز لي
انا ممكن ابعد عن ضيك 

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

في بنات كتير حلوين طعمين
بس انتي ليا أغلى الغاليين
من يوم ما شفتك يا حبيبتي
بهواكي وانتي حبيبك مين؟ 

في بنات كتير ناصبين لي شِباك
باصين عليا من الشّباك
وأنا قلبي لسة ف صنارتك
صادني الغرام وهواك شبّاك 

في بنات كتير وأنا هعمل إيه
ما تجيبي قلبي أهواهم بيه
يا أحبّهم يا تحبّيني
أنا هاعمل اللي تقولي عليه 

في بنات كتير وكتير ياما
وأنا قلبي في الحب يمامة
بس انتي قصقصتي جناحي
وبقيتي نفسي اللوامة 

في بنات كتير وأنا ما لي بيها
دي حبيبتي بس، بموت فيها
لما جمالها ملا عيني
علطول بقيت مخلص ليها 

محمد حمدي غانم
16/8/2017 


نقد قصة رجل وامرأتان



جمالية التشظي والمرآة والبوح الحكيم وأزمة الطيبين
في قصة (رجل وامرأتان)
بقلم: خالد جودة
 

النص: رجل وامرأتان! بقلم: م. محمد حمدي غانم.
التعليق: جمالية التشظي والمرآة والبوح الحكيم وأزمة الطيبين في قصة (رجل وامرأتان) بقلم: خالد جودة. 

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

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

 


الثلاثاء، 22 أغسطس، 2017

حب في أغسطس



حب في أغسطس 

يا ساكنةً طيَّ الذاتْ
سأزيدُ أغسطسَ لكِ لهبا بمئاتِ الدرجاتْ
فالشوقُ الجامحُ في قلبي بركانٌ عاتْ
يَرميكِ بعشقٍ نَزِقٍ مُتّقدِ الجمراتْ
فانسَيْ هيهاتْ
لن تَنفعَكِ مَراوحُ أو تكييفاتْ!
وحذارِ أذيقُكِ يومًا قيظَ الغيرةْ
حارًّا كالشطَّةْ
يَندلعُ بصدرِكِ كلهيبٍ
يُحرقُ أفدنةَ النبضاتْ
فاجتنبي أن أُوغِرَ غيظَكْ
ما منّي سيلطّفُ قيظَكْ
إلا عَصْـفُ التنهيداتْ
مهما كانت ساخنةً تتسامى
ستَضمُّكِ بردًا وسلاما
وتُحَوِّمُ مِن حولِكِ وَلْهَى
وتَبوسُكِ مثلَ فراشاتْ
لن يُثلجَ صدرَكِ يا شَغَفي
من ثَغري غيرُ الهمساتْ
فاختاري واحةَ أشعاري
لا تَخْشَيْ شيئا مِن ناري
فنَعيمُكِ فيها فاتنـتي
إن شئتِ، فحِضني الإثباتْ
محمد حمدي غانم
6/8/2017


الطبقات المتعددة N-Tier Applications:



الطبقات المتعددة N-Tier Applications:

لعل المشروع السابق يكشف لك أهمية تقسيم مشاريع قواعد البيانات إلى طبقات Layers مستقلة عن بعضها..  هذا يسهل عليك تطوير أي طبقة دون تغيير أي شيء في الطبقات الأخرى.. فمثلا نحن عدلنا كود الفئة MyDbConnector دون أن نغير أي شيء تقريبا في الكود الذي يستخدمها، وهي ميزة تتضح فوائدها الهائلة في المشاريع الضخمة، التي تريد الاستفادة من التطويرات التي تحدث في تقنيات قواعد البيانات، دون إعادة كتابة الكود كله منذ البداية.. فلو أن هذه المشاريع مقسمة إلى طبقات، فسينحصر التطوير على طبقة الاتصال بقاعدة البيانات للاستفادة من التقنيات الجديدة، بينما ستظل الطبقة التي تعرض البيانات للمستخدم كما هي بدون تغيير يذكر.. وتسمى البرامج التي تستخدم هذا التنظيم باسم التطبيقات متعددة الطبقات Multi-Tier Applications أو n-Tier Applications، وتسمى أيضا باسم التطبيقات الموزعة Distributed Applications لأنها مقسمة على أكثر من طبقة.. والشهير أن تكتب مشاريع قواعد على ثلاث طبقات:

1- طبقة البيانات Data Tier:
وهي الطبقة التي توجد فيها قاعدة البيانات بما فيها من جداول وعلاقات وإجراءات مخزنة، ومستخدمين وصلاحيات وقواعد سرية وحماية وصيانة وحفظ نسخ احتياطية من البيانات.. إلخ.. وفي الشركات الكبيرة يكون هناك موظفون مسئولون عن إدارة هذه الطبقة.

2- طبقة التعامل مع البيانات Data Access Tier:
في هذه الطبقة، يوجد الكود الذي يتصل بقاعدة البيانات ويحضر النتائج منها.. والفئة MyDbConnector هي مجرد مثال مبسط على هذه الطبقة، لكن دوت نت تمنحك إمكانيات أقوى لتصميم هذه الطبقة مثل مجموعة البيانات محددة النوع وموصلات الجداول التي سنتعرف عليها في الفصل القادم، ومثل LinQ-To-SQL وغير ذلك.
وتمتاز هذه الطبقة بأنك تستطيع استخدامها في أكثر من مشروع، ما يوفر لك الوقت والجهد، كما يمكنك تطويرها دون الحاجة إلى إعادة كتابة المشاريع التي تعتمد عليها.

3- طبقة عرض البيانات Data Display Tier:
في هذه الطبقة يوجد الكود الذي يعرض البيانات للمستخدم، والمفروض ألا يوجد في هذه الطبقة أي كود يتصل بقاعدة البيانات. 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

 


تهديد



وما قلبي لكِ العبدُ الأسيرُ = أنا ليثٌ على جُرحي أسيرُ
إذا لم تَحضُني قلبي بشوقٍ = عقابُكِ في الهَوَى عِندي عسيرُ!
محمد حمدي غانم، 2017


رجل وامرأتان


رجل وامرأتان!
 
كان بالنسبة لها أشياء كثيرة متضاربة..
هذا لأنه كان لها كل شيء!
***
أحبت فيه براءتها..
لكنها كرهت فيه سذاجتها!
تلك الفتاة الجميلة التي أحبت الدنيا بسلامة نية، ثم اكتشفت أنه لا مكان فيها للطيبين.
لكنه آخر الطيبين، وهو يجاهد لكي لا يفقد مكانه الصغير في قلبها الحانق على الحياة!
***
قال لها "أحبُّكِ" كثيرا..
سنواتٍ تلو سنوات، وهو يرسمها نفس تلك الفتاة البريئة الساذجة.
وهذا يملؤها بالسعادة.. والغضب!
***
قالت له بسخط:
* لا تحبها هي.. أحببني أنا.
- أحبكِ أنتِ وهي.. كلاهما أنتِ.
* لقد تغيرتُ.. صرتُ أكرهها.
- لا تكرهيني.
* أكره حبَّك لها.
- أحبيها لتحبيني.
* لا أستطيع.. فقد سبَّـبَتْ لي الكثير من الآلام.. كانت تحب كل الناس، فطعنها كل الناس.
- حتى أنا؟
* أنت كنتَ أولَ وأقسى طعنة!
- سامحيني.. لم أَخُنكِ يوما.


الثلاثاء، 15 أغسطس، 2017

نبع البطولة



يا أمَّنا بحكمةِ الكهولةْ
تكلّمي وعلّمي الرجولةْ
لأن أشباهَ الرجالِ الآنَ عن أوطانِنا مسئولةْ
أُسْـدٌ علينا، في الحروبِ نعامةٌ
جيوشُهم في قتلِنا مشغولةْ
تبيعُ أرضَنا بمنتهى السهولةْ
وتدّعي البطولة!!



محمد حمدي غانم، 2017


استخدام مصانع المزودات



استخدام مصانع المزودات عمليا:

خير طريقة لإدراك عبقرية مصانع المزودات، هي أن نعيد كتابة المشروع DbTasks بطريقة عامة، تسمح بالتعامل مع أي مزود بيانات.. في ذلك المشروع أنشأنا فئة اسمها MyDbConnector تسهل علينا إجراء أي عملية على قواعد بيانات سيكويل سيرفر.. الآن حان الوقت لنعمم هذه الفئة، بحيث نستطيع استخدامها للتعامل مع باقي أنواع المزودات التي يدعمها إطار العمل.. هذا هو ما فعلناه في المشروع Factories، الذي هو نسخة طبق الأصل من المشروع DbTasks، لكنه يعرض على النموذج زري تحويل Radio Buttons ليستطيع المستخدم اختيار التعامل مع قاعدة بيانات آكسيس أو قاعدة بيانات سيكويل سيرفر، والرائع حقا أن كود الأزرار الموضوعة على النموذج ظل كما هو بدون تغيير، بفضل استخدام مصانع المزودات!

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

كما عرفنا دالة اسمها GetProviderName، تستقبل قيمة المرقم Providers، وتعيد النص الذي يمثل اسم هذا المزود، لنرسله إلى الوسيلة DbProviderFactories.GetFactory للحصول على مصنع المزود الذي يريد المستخدم التعامل معه.. بعد هذا يصير من السهل استخدام وسائل هذا المصنع للحصول على كائن الاتصال وكائن الأمر وموصل البيانات اللازمة للتعامل مع قاعدة البيانات.

ولو نظرت إلى كود الفئة MyDbConnector في هذا المشروع، فستجد أن التعديلات التي أدخلناها طفيفة، لكن تأثيرها هائل، فقد صارت لدينا فئة عامة تستطيع أداء معظم ـ إن لم يكن كل ـ الوظائف التي نريدها على أي نوع من أنواع قواعد البيانات، ما يتيح لك استخدامها في مشاريعك لتقليل الكود الذي تكتبه إلى أقل حد ممكن!

لاحظ أننا نغير نوع قاعدة البيانات التي نتعامل معها، في حدث تغير الاختيار CheckedChanged الخاص بزري التحويل، وذلك بالكود البسيط التالي:
If RdSql.Checked Then
    DbBooks = New MyDbConnector(
                        My.Settings.BooksMdfConStr,
                        MyDbConnector.Providers.SqlServer)
Else
   DbBooks = New MyDbConnector(
                       My.Settings.BooksMdbConStr,
                       MyDbConnector.Providers.OleDb)
End If
حيث DbBooks هو متغير معرف على مستوى النموذج، نضع فيه نسخة الفئة MyDbConnector التي نستخدمها لتنفيذ وظائف الأزرار.
لاحظ أيضا أن استخدام الزر "الكتب1" لاستدعاء الإجراء المخزن، يستلزم منك أولا أن تستخدم المشروع AccessStoredProcedure لإضافة الإجراء المخزن GetAuthorBooks إلى قاعدة بيانات الكتب الخاصة بآكسيس. 

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:

 

 


الأحد، 13 أغسطس، 2017

ريم بواحة صمتها



ريم بواحة صمتها
 

كالزهرِ وجهُها الصبوحْ
ريمٌ ـ بواحةِ صمتِها ـ
أبياتُ شعرٍ لا تَبوحْ
وقلبُها اصطفَى سلامَهْ
كلُّ الإجاباتِ ابتسامةْ
أشرودُ عقلٍ حائرٍ أم أنه سُمُوُّ رُوحْ؟
أم تلكَ منتهى البلاغةْ؟
كلماتُها العشرُ التي دُرَرٌ مصاغةْ
في عُرفِها يُغنينَها عن صوتِنا المبحوحْ؟
يا زهرةً بعطرِها تفوحْ
متى بسرِّها تبوحْ؟
محمد حمدي غانم
6/8/2017

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


فئة مصنع المزود DbProviderFactory Class



فئة مصنع المزود DbProviderFactory Class 

هذه الفئة أساسية مجردة تجب وراثتها، وهي تمتلك العناصر اللازمة للتعامل مع مزود البيانات الذي خصصت للتعامل معه.
وتمتلك هذه الفئة الخاصية التالية: 

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

كما تمتلك هذه الفئة الوسائل التالية: 

 إنشاء باني نص الاتصال CreateConnectionStringBuilder:
تعيد باني نص الاتصال من النوع العام DbConnectionStringBuilder، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.

 

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

 إنشاء كائن أمر CreateCommand:
تعيد كائن أمر من النوع العام DbCommand، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. وأنت تعرف أنك تستطيع الحصول على قارئ البيانات من كائن الأمر باستدعاء الوسيلة ExecuteReader.
لاحظ أن كائن الأمر الذي ستحصل عليه ليس مرتبطا بأي اتصال، لهذا عليك ربطه بكائن الاتصال الذي حصلت عليه من الوسيلة CreateConnection، وهو ما فعلناه في الدالة CreateCommand في المشروع Factories كالتالي:
Dim Command = Fac.CreateCommand
Command.Connection = Cn
ويمكنك أداء نفس وظيفة هذه الوسيلة، باستخدام الوسيلة CreateCommand الخاصة بكائن الاتصال، وفي هذه الحالة ستختصر السطر الثاني من الكود السابق:
Dim Command = Cn.CreateCommand 

 إنشاء معامل CreateParameter:
تعيد معاملا من النوع العام DbParameter، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.
ويمكنك أداء نفس الوظيفة، باستخدام الوسيلة CreateParameter الخاصة بكائن الأمر. 

 إنشاء موصل بيانات CreateDataAdapter:
تعيد موصل بيانات من النوع العام DbDataAdapter، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. وقد استخدمنا هذه الوسيلة في الدالة GetTable في المشروع Factories كالتالي:
Dim Table As New DataTable
Dim Da = Fac.CreateDataAdapter
Da.SelectCommand = Cmd
Da.Fill(Table) 

 إنشاء باني أوامر CreateCommandBuilder:
تعيد باني أوامر من النوع العام DbCommandBuilder، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه. 

 إنشاء عداد مصادر البيانات CreateDataSourceEnumerator:
تعيد عداد مصادر البيانات من النوع العام DbDataSourceEnumerator، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه.. لاحظ أن مزود سيكويل سيرفر هو الوحيد الذي يدعم هذه الإمكانية، لأن قواعد البيانات الخاصة به تعمل على خادم، لهذا ستعيد هذه الوسيلة Nothing إذا استخدمتها مع أي مزود بيانات آخر غير سيكويل سيرفر!
ويمكنك أن تستخدم الخاصية CanCreateDataSourceEnumerator أولا قبل استدعاء هذه الوسيلة، لتعرف إن كان المزود يدعم عداد المصادر أم لا. 

 إنشاء تصريح CreatePermission:
تعيد تصريحا من النوع العام  CodeAccessPermission، لكنه يكون مخصصا للتعامل مع مزود البيانات الذي أنشأت المصنع الحالي للتعامل معه... لاحظ أن الفئة DBDataPermission ترث الفئة CodeAccessPermission، ومنه تشتق فئات التصريح الخاصة بكل مزود بيانات مثل SqlClientPermission.. شرح هذه المواضيع خارج نطاق هذا الكتاب.

وترث الفئات التالية الفئة DbProviderFactory:
- OdbcFactory Class.
- OleDbFactory Class.
- OracleClientFactory Class.
- SqlClientFactory Class.
ولا يوجد جديد في هذه الفئات يستحق شرحه، فهي تملك نفس وسائل الفئة الأم، لكن مع فارق واحد: أنها تعيد أنواعا خاصة بكل مزود، بدلا من الأنواع العامة التي تعيدها وسائل الفئة الأم.

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET.. للتنزيل:


صفحة الشاعر