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

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

الاثنين، 13 نوفمبر، 2017

إلقائي لقصيدة علي بابا والأربعين عاما



هذا هو إلقائي لقصيدة "علي بابا والأربعين عاما" التي كتبتها في رثاء صديقي الراحل الشاعر أ. حاتم يحيى طه رحمه الله:

 


ويمكن قراءتها مكتوبة هنا:

 


مراوح



يا حبيبتي م الوقتي ورايح
في العشق لا انا جاي ولا رايح
ركّبت على قلبي مراوح
:D :D :D
محمد حمدي غانم، 2017

 


منتهى العشق



منتهى العشق 

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

محمد حمدي غانم
4/11/2017


خريطة تدفق اسم المستخدم وكلمة السر



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


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

إذا كان اسم_المستخدم خاطئا إذن:
اطبع على الشاشة: "عذرا.. اسم المستخدم غير صحيح".
غادر البرنامج.
نهاية الشرط.
 
إذا كانت كلمة_السر خاطئة إذن:
اطبع على الشاشة: "عذرا.. كلمة السر غير صحيحة".
غادر البرنامج.
نهاية الشرط.

 الخوارزمية بسيطة وواضحة.. وكذلك سيكون مخططها كما هو في الصورة. 

من كتاب المبرمج الصغير، للصف الثالث الإعدادي، للتنزيل مجانا:


الأربعاء، 8 نوفمبر، 2017

لاغيني



ردي يا حلوة لاغيني

هو ليه قلبك لاغيني؟

شكلي هندي ولاّ غيني؟

محمد حمدي، 2017

 


لصة الأفئدة



لصة الأفئدة

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

محمد حمدي غانم
22/10/2017 


مثال على العلاقة الذاتية Self-Relation



مثال على علاقة ذاتية بين الجدول ونفسه Self-Relation:
سنرى الآن مثالا على العلاقة الذاتية Self-Relation.. لفعل هذا، سننشئ مشروعا اسمه SaveTreeNodes، وهو يعرض شجرة ويسمح للمستخدم إضافة العناصر إليها، وتغيير مستوياتها، وهي وظائف تعلمنا كيف ننشئها في المشروع TreeViewSample في كتاب "من الصفر إلى الاحتراف: برمجة نماذج الويندوز"، ولن نكرر شرحها هنا.. وستجد المشروع SaveTreeNodes ضمن أمثلة هذا الكتاب.
ما نريده هو أن نسمح للمستخدم بحفظ فروع الشجرة.. لا نحتاج هنا إلى إنشاء قاعدة بيانات كاملة لمجرد حفظ بعض عناصر الشجرة، فمن الممكن أن ننشئ مجموعة بيانات خاصة Custom DataSet، ونستخدمها لحفظ العناصر في ملف XML.. وبهذا نكون قد استفدنا من قدرات مجموعة البيانات وعلاقاتها، وفي نفس الوقت سنحفظ البيانات في ملف مستقل.
لفعل هذا، أضفنا إلى المشروع SaveTreeNodes مخطط مجموعة بيانات بالطريقة المألوفة، وأسميناه TreeDataSet، وأضفنا إليه جدولا اسمه TreeNodes، وأضفنا إليه الأعمدة التالية: 

اسم العمود
نوع بياناته
وظيفته
ID
Int16
المفتاح الأساسي، وهو يعمل أيضا كترقيم تلقائي.
Text
String
يحفظ نص فرع الشجرة.
ParentID
Int16
المفتاح الفرعي، وهو يشير إلى رقم الفرع الرئيسي للفرع الحالي.

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



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

TreeDs.Clear( )

For Each Node As TreeNode In TreeView1.Nodes

        Dim R = TreeDs.TreeNodes.AddTreeNodesRow(

                        Node.Text, Nothing)

        SaveChildren(Node, R)

Next

TreeDs.WriteXml("C:\TreeNodes.Xml")

في البداية أفرغنا مجموعة البيانات من محتوياتها، ثم مررنا عبر جذور الشجرة لإضافتها إلى الجدول TreeNodes الموجود في مجوعة البيانات.. لاحظ أن مجموعة البيانات محددة النوع قد أضافت الوسيلة AddTreeNodesRow إلى الجدول، لتتيح لنا إضافة صف جديد إليه.. هذه الوسيلة تستقبل معاملين:

- نصا يمثل قيمة الحقل Text في الصف الجديد.

- كائن صف من النوع TreeDataSet.TreeNodesRow، لترسل إليه الصف الرئيسي للصف الحالي.. هذا أسهل من أن تضع بنفسك رقم الصف الرئيسي في الحقل ParentID، وهذه إحدى التسهيلات التي منحتها لك العلاقة الذاتية.. ونظرا لأن جذور الشجرة ليست لها فروع رئيسية، فسنرسل القيمة Nothing إلى هذا المعامل.. هذا سيترك الحقل ParentID فارغا.

بعد هذا، يجب أن نضيف إلى مجموعة البيانات فروع كل جذر، بكتابة إجراء اسمه SaveChildren، وهو يستقبل معاملين:

- كائن الفرع TreeNode الذي سنضيف عناصره الفرعية إلى مجموعة البيانات.

- كائن الصف TreeDataSet.TreeNodesRow الذي يعمل كصف رئيسي، للصفوف التي سنضيفها الجدول.

هذا هو كود هذا الإجراء، مع ملاحظة أنه إجراء ارتدادي Recursive يستدعي نفسه، لأن كل فرع قد يحتوي على عناصر فرعية، كل منها قد يحتوي على عناصر فرعية، وهكذا:

Sub SaveChildren(ByVal ParentNode As TreeNode,

              ByVal ParentRow As TreeDataSet.TreeNodesRow)

       For Each Node As TreeNode In ParentNode.Nodes

            Dim R = TreeDs.TreeNodes.AddTreeNodesRow(

                            Node.Text, ParentRow)

            SaveChildren(Node, R)

       Next

End Sub

وبعد وضع جميع بيانات الفروع في مجموعة البيانات، سيتم تنفيذ آخر سطر في كود ضغط زر الحفظ، وهو يستدعي الوسيلة WriteXML لحفظ محتويات مجموعة البيانات في الملف.

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

TreeDs.Clear( )

TreeView1.Nodes.Clear( )

TreeDs.ReadXml("C:\TreeNodes.Xml")

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

For Each R In TreeDs.TreeNodes

        If R.IsParentIDNull Then

            Dim Node = TreeView1.Nodes.Add(R.Text)

            LoadChildren(Node, R)

        End If

Next

أيضا، يجب أن يكون الإجراء LoadChildren ارتداديا Recursive يستدعي نفسه، لتحميل العناصر الفرعية لكل فرع في جميع المستويات.

ولكن كيف نعرف العناصر الفرعية؟

هذا سهل جدا، بفضل العلاقة الذاتية المعرفة في الجدول، واستخدام الوسيلة GetChildRows لمعرفة الصفوف الفرعية التابعة لأي صف رئيسي.. هذا هو كود هذا الإجراء:

Sub LoadChildren(ByVal ParentNode As TreeNode,

               ByVal ParentRow As TreeDataSet.TreeNodesRow)       

        For Each R As TreeDataSet.TreeNodesRow In

               ParentRow.GetChildRows("Self_Relation")

                   Dim Node = ParentNode.Nodes.Add(R.Text)

                   LoadChildren(Node, R)

        Next

End Sub

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

رائعة هي العلاقة الذاتية؟.. أليس كذلك؟

 

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


الأحد، 5 نوفمبر، 2017

كوني كلَّ نساءِ الدنيا



كوني كلَّ نساءِ الدنيا 

يا سيدتي كوني أَمَتي
كوني أنفاسًا في رئتي
ودماءً تَسكنُ أوردتي
والشهدَ الذائبَ في شَفتي 

كوني أطوعَ لي من نفسي
كوني أمسي كوني شمسي
أو برقًا يَسكنُ صاعقتي
كوني مِن نفسي سارقتي 

كوني ضحكي في مرآتي
كوني الحلمَ النادي الآتي
كوني مُكمِلَتي أو سِمَتي
كوني في مجدي أوسمتي 

كوني ما تعشقُ عينيَّا
كوني كلَّ نساءِ الدنيا
كوني في عشقي واحدتي
كوني عَشْري.. كوني مئتي 

كوني أنتِ البدرَ الهامي
كوني لجنوني إلهامي
كوني بالحَلوَى مُوهِمتي
دُمتِ بِشِعرٍ يا مُلهِمتي 

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


باحبك



باحبّ البحر ف عنيكي = عشان للبحر سر كبير
باحبّ الشمس في خدودك = عشان تطرح ورود وعبير
باحبّ البسمة في شفايفك = عشان شايفك يمام بيطير
باحبّ الحيرة في مشاعرك = عشان قلبك عليا يغير
باحبّ جنوني في غرامك = عشان حبك ملوش تفسير

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


حل آخر لمعرفة اكبر عدد من بين أربعة أعداد:



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

ك = ع1.
إذا كان ع2 > ك إذن: ك = ع2.
إذا كان ع3 > ك إذن: ك = ع3.
إذا كان ع4 > ك إذن: ك = ع4.
اطبع على الشاشة: أكبر عدد هو ك

بسيطة جدا، ومختصرة جدا.. أليس كذلك؟
تعال نجربها على الأعداد 14 و 5 و 20 و 9:
-      في البداية سنضع في ك العدد الأول، لهذا سيكون ك = 14.
-      سنقارن ك بالعدد الثاني فنجد ك أكبر من 5 لهذا لن نفعل شيئا.
-  سنقارن ك بالعدد الثالث فنجد ك أصغر من 20 لهذا سنجعل ك = 20 لأن هذا أكبر عدد وصلنا إليه حتى الآن.
-      سنقارن ك بالعدد الرابع فنجد ك أكبر من 9 لهذا لن نفعل شيئا.
-  انتهت عمليات المقارنة، والمتغير ك الآن يحتوي على أكبر عدد، وهو 20.. يمكننا أن نطبعه على الشاشة.
لاحظ أن هذه الطريقة سهلة التعميم.. فلو أردت مقارنة 5 أعداد فستضيف عملية مقارنة واحدة جديدة مع ك وهذا لا يحتوي على أي تعقيد.. ولو أردت مقارنة 6 أعداد فستصيف عملية مقارنة أخرى.. وهكذا...
وحينما نتعلم المصفوفات Arrays وجمل التكرار Loops في فيجيوال بيزيك ستجد أنك تستطيع تعميم هذه الطريقة لأية مجموعة من الأرقام، ولن يزيد طول الكود الذي ستكتبه عن أربعة أسطر، مهما كان عدد هذه الأرقام!
وخريطة التدفق توضح لك هذه الخوارزمية، مع ملاحظة أن المسار الأحمر السميك هو مسار مقارنة الأعداد 14 و 5 و 20 و 9. 

من كتاب المبرمج الصغير، للصف الثالث الإعدادي، للتنزيل مجانا:

 


صفحة الشاعر