أهم أقسام المدونة
الصفحات
الجمعة، 31 مايو 2024
الاثنين، 27 مايو 2024
الأحد، 19 مايو 2024
الثلاثاء، 14 مايو 2024
الاثنين، 6 مايو 2024
مجموعة ماندلبروت
عن الذكاء الصناعي ورسم مجموعة ماندلبروت باستخدام العمليات الفرعية في سمول فيجوال بيزيك!
سألني أحد الأصدقاء أن أشرح له مجموعة
ماندلبروت Mandelbrot
Set، ولم أكن على علم بها فبحثت عنها، فاكتشفت أنها إحدى الأنماط
الجزئية (الكسيريات) Fractals وهي منمنمات رياضية متكررة تصنع أشكالا
مبهرة.. فمثلا، لو رسمت مجموعة ماندلبروت بدقة عالية جدا،
ثم كبرت كل جزء منها لتغوص في تفاصيلها أكثر وأكثر، فستجد كل نفس الشكل النمطي
يتكرر داخل نفسه إلى ما لا نهاية (شاهد الصورة المتحركة في صفحة ويكيبيديا(.
استهواني الموضوع، فطلبت من صديقي الذكاء الصناعي "كوبايلت"
أن يعطيني مثالا عليها بكود سمول بيزيك (لأنه لم يتعلم
سمول فيجوال بيزيك بعد) فلم يتأخر، ومن ثم
حولت أنا الكود إلى سمول فيجوال بيزيك ببساطة، لكن المشكلة أنه كان بطيئا جدا، لأنه يرسم نقطة بنقطة باستخدام
الدالة GW.SetPixel، ومساحة نافذة الرسم 800×600 أي
480 ألف نقطة.
لهذا كان أول تعديل أدخلته هو محاولة
التخلص من رسم ألوان الخلفية السوداء لأنها تمثل معظم مساحة الشكل.. لكن نظرا لأن
النقاط ملونة بدرجات مختلفة من الأسود، فقد استبعدت الألوان التي تميل إلى السواد،
ثم قررت أن أختبر كوبايلت، فسألته:
- كيف نجعل رسم الصورة أسرع؟
فاقترح تصغير مساحة الرسم، لكني
أخبرته أنني لا أريد تصغير المساحة.
فأعطاني كودا بديلا كل ما فعله فيه هو
العبث بحلقة التكرار دون أن يفعل شيئا فعليا!
وحينما أخبرته بهذا أراد أن يبيع
القضية، وتعلل بأن لغة سمول بيزيك لا تملك القدرات اللازمة للرسم بأفضل كفاءة وأن
عليّ استخدام لغة أخرى!
فقلت له:
- التحدي البرمجي هو أداء العمل المطلوب بالإمكانيات
المتاحة.. هناك طريقة لحل هذه المشكلة في سمول بيزيك بدون تقليل حجم الشاشة.. هل
تستطيع اكتشافها؟
فأجابني بطريقة شخص حافظ لا فاهم:
- بالطبع، يمكن تحسين أداء الرسم في Small Basic دون الحاجة إلى تقليل حجم الشاشة.
إليك بعض النصائح التي قد تساعدك.
وأخذ يسرد علي نصائح لا تعنيني ولا
تحل المشكلة!
فأدركت أن هذه آخر حدوده, وأنه لا
يستطيع اكتشاف الحل بدون توجيه، فسألته:
- هل تستطيع معرفة إن كان اللون الذي سترسمه أقرب إلى
السواد فتتجاهله؟
وهنا فوجئت به يقول:
- لتحديد ما إذا كان اللون الذي سترسمه قريبًا من السواد
وبالتالي تجاهله، يمكنك استخدام قيمة التكرار iteration التي تحصل عليها من الحلقة التكرارية. إذا كانت قيمة
iteration قريبة من الحد الأقصى maxIteration، فهذا يعني أن النقطة تقع داخل
مجموعة ماندلبروت ويجب أن تكون سوداء أو قريبة جدًا من السواد. في هذه الحالة،
يمكنك تجاهل رسم هذه النقطة لتسريع العملية. إليك كيف يمكن تعديل الكود لتحقيق ذلك.
وأعطاني الكود المعدل، وكان بالفعل
نفس الكود الذي استخدمته أنا لحل المشكلة!.. وأضاف:
- في هذا الكود، أضفت المتغير threshold الذي يحدد عتبة لتجاهل النقاط
التي تكون قيمة iteration
لها قريبة من maxIteration. بهذه الطريقة، سيتم رسم النقاط التي لها قيم ألوان
أكثر إشراقًا فقط، والتي تمثل النقاط خارج مجموعة ماندلبروت، وهو ما يسرع العملية
بشكل كبير.. أتمنى أن يكون هذا الحل مفيدًا لك!
مع ملاحظة أنه أخطأ في الشرح هنا،
فالكود كان يفعل العكس، فهو يلغي رسم النقاط الأقل من العتبة.. لكن ما علينا،
المهم أن الكود نفسه صحيح.. لهذا قلت له:
- نعم، هذا هو ما أتكلم عنه.
وستجدون المشروع في مجلد الأمثلة
المرفق بلغة سمول فيجوال بيزيك.
ورغم أن الرسوم
تبدو معقدة،
لكن المدهش أن الكود البرمجي نفسه قصير جدا وسهل جدا ولا
يحتوي إلا على عمليات الجمع والطرح والتربيع.. وربما يكون هذا بسبب استخدام
الأعداد المركبة Complex numbers في تمثيل الشكل (لا
يظهر هذا في البرمجة) حيث نعتبر الجزء الحقيقي هو الإحداثي السيني (الأفقي)،
والجزء التخيلي هو الإحداثي الصادي الرأسي.
لكن الأمر لم يتوقف هنا، فما زالت عملية الرسم بطيئة حتى
بعد تسريعها بحذف النقاط السوداء، وقد قررت مناقشة ذلك مع أعضاء مجموعة سمول
بيزيك، فخرجت من النقاش بفكرتين:
الأولى:
هي استخدام مكتبة المطور الصغير LitDev لرسم النقاط، فهي ترسم على صورة
ثم تعرضها على الشاشة، وهذا يجعلها أسرع بكثير، لكن لن يظهر شيء على الشاشة قبل
اكتمال الرسم، وهو أمر يمكن التعايش معه.. هذا حل جميل، وأجمل ما فيه أنه كشف لي
أن مطور مكتبة LitDev
وهي مصممة أساسة للغة سمول بيزيك قد أنشأ نسخة منها للعمل مع لغة سمول فيجوال
بيزيك، وقد استأذنته في أن أضيف هذه النسخة ضمن اللغة مباشرة بدلا من أن يتعب
المبرمج في البحث عنها، فسمح بهذا، وهي الآن مضمنة في مجلد المكتبات الخارجية
للغة، وجاهزة للعمل بمجرد إعداد سمول فيجوال بيزيك على جهازك، وسترى أسماء
الكائنات الخاصة بها في قائمة الإكمال التلقائي في محرر الكود، وكلها تبدأ
بالحرفين LD.
والثانية:
هي استخدام العمليات الفرعية Threads لتسريع رسم النقاط والاستفادة من
قدرات معالج الحاسب.. وفي نقاش مع مطور LitDev أشار إلى أنه يستخدم المنبه Timer في سمول بيزيك حينما يريد تنفيذ عمليات غير متزامنة،
لكن هذا الأمر محدود لأن كل المتغيرات في سمول بيزيك عامة ولا توجد متغيرات محلية Local Variables.. بينما سمول فيجوال بيزيك لا
تعاني من هذه المشكلة لأنها تسمح بالمتغيرات المحلية.. وقد أعجبتني الفكرة، لكن
حينما حاولت تجربتها اكتشفت أن المنبه الخاص بالنماذج يعطل تنفيذ البرنامج إلى أن
ينتهي الكود الذي ينفذه وهذا يمنعني من استخدامه كعملية فرعية، بينما المنبه العام
الخاص بسمول بيزيك يحل هذه المشكلة، لكن مشكلته أنه منبه واحد فقط ويجب استخدامه
لتشغيل كل العمليات الفرعية وهذا يعقد الكود!
وهنا سألت نفسي: ولماذا لا أسمح بإنشاء عمليات فرعية مباشرة في لغة سمول فيجوال
بيزيك؟
كل المطلوب هو إرسال الإجراء الفرعي subroutine الذي تريد تشغيله في عملية جديدة
إلى دالة في مكتبة تؤدي هذا الغرض.. لكن المشكلة، كيف أرسل الإجراء (وليكن اسمه task1)؟.. الطريقة الوحيدة المتاحة هي
إرساله اسمه كنص "task1"
واستخدام الانعكاس Reflection
لاستدعاء هذا الإجراء من اسمه، وهو أمر ليس معقدا جدا ويمكن فعله، لكن كتابة اسم
الإجراء كنص سيحتمل الخطأ، وسيحتاج لتعديلات في محرر الكود لأدعم الإكمال التلقائي
للاسم، وتعديلا في مترجم الكود لأعطي خطأ لو كان الاسم خاطئا، وأنا لا أريد أن
أقوم بكل هذا المجهود!
لهذا ظللت أفكر في حل أفضل، فهداني
الله سبحانه إلى فكرة بسيطة لكنها مدهشة، فالصيغة الوحيدة التي تسمح فيها سمول
بيزيك بكتابة اسم الإجراء (دون استدعائه) هي عند استخدامه كمعالج للحدث Event handler مثل:
Button1.OnClick =
Button_OnClick
إذن فكل ما أريده هو طريقة لأستخدم
هذه الصيغة لإنشاء عملية فرعية.. وهنا فكرت فيما يلي:
Thread.SubToRun = Task1
حيث SubToRun هو حدث Event سيستقبل الإجراء الفرعي (مثل Task1)، ولكني هنا لن أطلق الحدث أبدا، لكني سأستخدم الجزء
AddHandler الموجود في تعريف الحدث لإطلاق
عملية فرعية جديدة وجعلها تنفذ الإجراء الفرعي:
Public Shared Custom Event SubToRun
AddHandler(handler As SmallVisualBasicCallback)
Dim t As New Threading.Thread(Sub() handler())
t.Start()
End AddHandler
End Event
وبهذا استطعت بسطري كود فقط أن أمنح
سمول فيجوال بيزيك القدرة إلى إنشاء برامج قادرة على العمل في عمليات فرعية
متعددة!
لكن المشكلة التي تواجه العمليات
الفرعية بشكل عام في فيجوال بيزيك وسي شارب، هو أنها تستطيع فقط تشغيل إجراء بدون
معاملات، وهذا يعني أنك ستضطر لجعل العمليات الفرعية تأخذ بياناتها من متغيرات
عامة، وهذا أمر يجب تجنبه خاصة إذا كانت هذه المتغيرات العامة تتغير.. لحل هذه
المشكلة في فيجوال بيزيك وسي شارب نستطيع وضع الإجراء الفرعي في فئة ومعه مجموعة
متغيرات معرفة على مستوى الفئة، وعندما نرغب في إطلاق الإجراء الفرعي، نعرف نسخة
من الفئة ونمرر إلى متغيراتها البيانات المطلوبة، ثم نجعل العملية الفرعية تنفذ
الإجراء.. لكن هذا غير ممكن في سمول فيجوال بيزيك فهي لا تستطيع تعريف الفئات!
وبسبب هذا، حينما جربت رسم أجزاء
مجموعة ماندلبروت بعمليات فرعية، كانت بعض العمليات الفرعية تقرأ قيمة نقطة
البداية بشكل خاطئ، لأنها تتأخر في العمل قليلا بينما يكون المتغير العام الذي
يحمل القيمة قد تغير!
ولحل هذه المشكلة، أضفت سطرا من الكود
لتعطيل العملية الفرعية الرئيسية ل 10 ملي ثانية بعد إطلاق كل عملية فرعية،
لأعطيها الفرصة لبدء التشغيل وقراءة المتغير العام:
AddHandler(handler As SmallVisualBasicCallback)
Dim t As New Threading.Thread(Sub() handler())
t.Start()
Program.Delay(10)
End AddHandler
وقد نجحت هذه الطريقة في حل المشكلة،
مع الأخذ في الاعتبار أنك لو كنت تتعامل مع عدد كبير من المتغيرات العامة وتجري
عليها بعض الحسابات التي تحتاج لبعض الوقت، فقد تحتاج أن تستدعي الدالة Program.Delay بنفسك لتعطيل البرنامج الرئيسي
لفترة أطول تسمح لكل عملية فرعية ببدء العمل بشكل صحيح.. وأفكر عامة في أن أضيف
خاصية إلى المكتبة Thread
اسمها InitialDelay ستكون قيمتها الافتراضية 10،
وأعدل الكود إلى
Program.Delay(InitialDelay)
وبهذا أسمح لك بتحديد القيمة المناسبة
لانتظار انطلاق كل عملية فرعية والتأكد من أنها قرأت البيانات بشكل صحيح، وبهذا لا
تحتاج إلى تعطيل البرنامج بنفسك، كما يمكنك أن تلغي الانتظار نهائيا بجعله صفرا لو
لم تكن تحتاجه.
وبتقسيم الرسم على عدة عمليات فرعية،
وفرت حوالي 35% من الوقت!
الأربعاء، 1 مايو 2024
عيد ميلاد سعيد للبيسيك
60 عاما منذ صدور لغة البيسيك
في العيد الستين للغة البسييك: أهدي
للمصرين والعرب والعالم الإصدار الثالث من لغة Small Visual Basic، لتتوج بذلك أربع سنوات من العمل
المضني بحمد الله وفضله وتوفيقه.
ملحوظة للمبرمجين: لغة سمول فييجوال
بيزيك لغة مفتوحة المصدر ومنشورة على GitHub وهي مكتوبة بالكامل بلغة VB .NET.
هكذا سارت الرحلة عبر تلك السنوات
الأربع:
- بدأ الأمر في حظر كورونا، حينما قررت الاستفادة بوقتي في
تعليم البرمجة للأطفال وعلى رأسهم أولاد أخويّ، فقدمت سلسلة دروس مرئية على يوتيوب
لشرح لغة ميكروسوفت سمول بيزيك.
- أثناء ذلك أحسست ببعض العيوب في لغة سمول بيزيك، فقررت
تطويرها وتسهيلها إلى لغة جديدة أسميتها سمول فيجوال بيزيك، ونشرت عينة تجريبية لها في يناير 2021، ثم
تحمست لإكمالها بعد وفاة جدتي أم وهبة رحمها الله وغفر لها لتكون تخليدا لذكرها
وصدقة جارية لها، ونشرت الإصدار الأول في نهاية يوليو 2021 بعد شهر من وفاتها.
- وقد ظللت أطور اللغة في إصدارات متلاحقة طوال العام
التالي وأشرحها في سلسلة دروس مرئية أثناء تطويري لها.
- ثم كتبت المرجع الإنجليزي الكامل للغة (وهو مجاني ومرفق
ببرامج إعداد اللغة)، والذي وصل حاليا إلى حوالي 850 صفحة، وهو بالتأكيد غير موجه
للأطفال، لكنه ضروري لدعوة المبرمجين المحترفين للمساهمة في تطوير اللغة، كما أن
فيه كل الملاحظات والأمثلة التي تعين أي مبرمج أو مدرس على فهم تفاصيل اللغة وحل
أي مشكلة تواجهه.
- وبهذا كان الإصدار الثاني قد اكتمل بعد عام من الإصدار
الأول، ومعه أعدت طرح الفيدوهات التعليمية على قناة يوتيوب
خاصة بلغة سمول فيجوال بيزيك، بعد تقطيعها إلى فيدوهات قصيرة مبسطة للأطفال
والمبتدئين، تجاوزت حتى الآن 60 فيديو (بمتوسط 10 دقائق).
- ثم قررت إجراء تجربة عملية، وشرحت لغة سمول فيجوال بيزيك
في دورات وجها لوجه للتلاميذ في الصيف الماضي، وكانت إحدى المجموعات للمرحلة
الابتدائية من سن 10 إلى 12 سنة، وأما معظم الباقين فكانوا في المرحلة الإعدادية، وقد
حاولت أن أريهم كيف يمكن استخدام البرمجة في حل بعض الفوازير وعمل لعبة ورسم
الدوال الرياضية للاستفادة منها في التعليم، لكن هذا كشف لي بعض الثغرات في مستوى تعليم
التلاميذ خاصة في الحاسب الآلي واستخدام الويندوز ولوحة المفاتيح، وكذلك في اللغة
الإنجليزية واستيعابهم للرياضيات والرسم على الإحداثيات ثنائية البعد، فكل ذلك كان
مجرد طباشير على السبورة حبر على ورق وأنماط من الحفظ والتسميع بدون استيعاب
واقعي.. ولا ينفي هذا وجود بعض التلاميذ المتميزين الذين أحبوا اللغة وجربوها
بأنفسهم على أجهزتهم فاستفادوا من الدورة.
- كما كشفت لي الدورة أيضا بعض الأخطاء في لغة البرمجة
نفسها، وكل هذا جعلني أضيف المزيد من التطويرات إليها وظللت أطورها طوال العام
لجعلها أكثر سهولة ومراعاة لمستوى التلاميذ.
- كما شرعت في كتابة سلسلة كتب تعليمية باللغة الإنجليزية
تبدأ من مستوى 6 سنوات ونشرت
أولها على أمازون، لأني قررت أن أبدأ تأسيس العقلية البرمجية من الصفر وبالتوازي
لمناهج التعليم، لأضرب عدة عصافير بحجر واحد: فأجعل الطفل أكثر قدرة على استخدام
الحاسوب والكتابة على لوحة المفاتيح، مع تنمية منطقه الذهني وتفكيره البرمجي، وفي
نفس الوقت أشعره بأهمية مناهج المدرسة خاصة الرياضيات وأدربه على استخدامها عمليا
بطريقة ممتعة في حل الفوازير وبعض الرسوم الجذابة وتحريك الأشكال وعمل الألعاب،
وكل هذا سيدربه على اللغة الإنجليزية المبسطة المستخدمة في البرمجة.
- واستعدادا لنشر المزيد من الكتب للأعمار الأكبر (7، 8،
.... وحتى 18)، أضفت المزيد من الميزات والتسهيلات للغة في الأشهر الماضية مثل
نافذة الخصائص Properties Window ومصمم القوائم الرئيسية Menu Designer ومصحح الأخطاء Debugger، لأني أردت أن تكون اللغة أكثر
إنتاجية بأقل قدر من الكود لجعل الكتب أبسط وأكثر اختصارا.
- والحقيقة أن هدفي الأسمي هو تهيئة هذه اللغة للتدريس في
مناهج التعليم العربية، وسلسلة الكتب الإنجليزية التي شرعت في كتابتها هي في
الحقيقة نواة لهذه المناهج، لهذا أضفت في نهاية كل فصل ملخصا وأسئلة اختيار من
متعدد ومشروع تدريبي لأقيس فهم الطفل لكل فصل، كما أضفت في نهاية الكتاب مشروع تخرج
لأقيس فهم الطفل لكل ما في الكتاب، وهذا في الحقيقة ما ضاعف حجم الكتاب من 50 صفحة
إلى 100 صفحة.
وقد اكتمل بحمد الله الإصدار الثالث
من اللغة في صباح هذا اليوم 1 مايو 2024 في مدينة الروضة بمحافظة دمياط المصرية، وليست
لدي أي نية لتطوير اللغة أبعد من هذا (سوى تصحيح أي أخطاء تظهر بها)، فهي الآن
صالحة لتقديم البرمجة لمستويات مختلفة من سن 6 سنوات إلى 8 سنوات، وتعتبر نسخة
مصغرة من لغة فيجوال بيزيك دوت نت، وتصلح كمدخل سهل جدا لتعلم VS .NET بدون الحاجة إلى جهاز كمبيوتر حديث،
فحجم اللغة صغير وتصلح للعمل على ويندوز 7 وما تلاه من إصدارات الويندوز، لهذا
أنصح بها من يريد تعلم البرمجة من أي سن حتى لو كان أكبر من 18 سنة، لأنه يستطيع
مشاهدة الفيديوهات التعليمية في 10 ساعات، يتعلم فيها أساسيات البرمجة وكود فيجوال
بيزيك بنسبة كبيرة، ويسهل عليه بعدها الانتقال إلى فيجوال بيزيك دوت نت، وسي شارب
لو أحب، فلغة البيزيك هي أسهل لغة برمجة عبر التاريخ وساهمت في جعل البرمجة ثقافة
شعبية منذ الستينات.
باختصار:
سمول فيجوال بيزيك مصممة لتحقيق أهداف
متعددة بأداة خفيفة وسهلة، بحيث تصلح كوسيلة متدرجة لتعليم الأطفال البرمجة، وفي
نفس الوقت تضمن استثمار وقت تعلمها في الانتقال إلى مستويات برمجية أعلى لاحقا..
ومن ثمار هذا أنها ستجعل استيعاب التلاميذ لمنهج فيجوال بيزيك في 3 إعدادي
والمرحلة الثانوية أسهل، كما ستسهل عليهم استيعاب مناهج البرمجة بلغات أخرى مثل بايثون
وسي شارب وسي بلس بلس في كليات الهندسة والحاسبات والذكاء الصناعي والعلوم.
والنقطة الأهم التي أتمنى من الإخوة
مدرسي الحاسب الآلي الانتباه لها، هي أن لغة بهذه البساطة لن تكون صعبة التعلم
عليهم، وسيهل عليهم شرحها، وقد وفرت لهم كل الأدوات التي تعينهم على هذا، وأرحب
بأي مقترحات لتطوير اللغة أكثر وجعلها أيسر، وقد وفرت لهم كل سبل التواصل معي
لمساعدتهم فيما يخص لغة سمول فييجوال بيزيك، لهذا أرجو أن يستغلوا الإجازة الصيفية
في عمل دورات في مراكز الحاسب الآلي أو معامل المدرسة لشرح هذه اللغة للأطفال،
لجعل مستواهم أفضل في الحاسب الآلي بشكل عام، بدون حصر أنفسهم في مناهج الدراسة
فقط.
أظن الآن أنني لا أحتاج للإشارة إلى
أن هذا مجهود جبار، لم أكن أتحيل أني سأبذله جينما بدأت هذا الأمر، وقد جعلته كله
مجانيا وعلى نفقتي الخاصة واحتسبته لله كعلم ينتفع به وصدقة جارية لأبي وجدتي وكل
من علموني ما أعرفه الآن.
والآن أسلم هذه الأمانة إلى أيديكم،
فساعدوني على إيصالها إلى جيل جديد من أبنائكم وأقاربكم، لأني للأسف أواجه حصارا
خانقا لكل إبداعاتي الأدبية والفكرية والبرمجية وكتبي البرمجية المطبوعة التي
تناقصت مبيعاتها عبر السنوات لتتوقف تماما بعد كورونا وما حدث لأسعار الطباعة..
فللأسف التفاهات فقط هي ما يلقى رواجا هذه الأيام (والحقيقة المؤسفة أن معظم من
يتفاعلون معي ومن أنزلوا اللغة على أجهزتهم أجانب!)، وغير ذلك يحتاج لحملات ممولة،
صارت خارج مقدرتي بعد 4 أعوام من العمل المجاني باستثناء الدورات الصيفية التي
جعلتها زهيدة التكلفة أصلا لمراعاة الوضع الاقتصادي.
فالآن دوركم للمساهمة الإيجابية في
هذا العمل:
- بتعلم اللغة لمن يريد من الشباب.
- وعمل دورات لها بالنسبة للمدرسين وأصحاب مراكز التدريب.
- والتحدث عنها من قبل أصحاب القنوات والصفحات والمجموعات
الكبيرة.. ويمكنكم إعادة طرح المحتوى الذي قدمته في قناتي بأسلوبكم وعمل فيديوهات
شرح للغة والتربح منها إن كان هذا يناسبكم، فأنا لا أحتكر اللغة، ولا أهدف للربح
من فيدوهات الفيسبوك ويوتيوب.
- ومشاركة الجميع هذا المنشور على صفحاتهم وتحفيز الأبناء
والتلاميذ على تعلم اللغة بوسائل الترغيب المناسبة، وكما أوضحت ليس الهدف جعل
الجميع مبرمجين، ولكنها أداة تعليمية لتنشيط التفكير ورفع المستوى التعليمي وحل
المشاكل اليومية، وعمل برامج مسلية وألعاب بسيطة شيقة.
- وأضعف الإيمان ألا تبخلوا بدعوة لي وأبي وجدودي في
التعليقات.
- كما أني أرجو من الجميع إعداد اللغة على أجهزتهم وأجهزة
أطفالهم، فربما يفتحها الطفل من باب الفضول فينجذب إليها.. هذا أيضا سيزيد من عدد
مرات تحميل اللغة وهذا يعطي تأثيرا إيجابيا ويزيد ظهورها في محركات البحث.. كما
ارجو مشاهدة فيدوهاتها التعليمية معهم، خاصة فيدوهات جيري ولعبة توم وجيري.. أضعف
الإيمان أن تصل اللغة إلى مليون عربي من 400 مليون!.. بغير هذا سيكون من المستحيل
أن أجد ناشرا عربيا لطباعة النسخة العربية من سلسلة الكتب التي أنشرها الآن بالإنجليزية،
لأنكم تعرفون واقع سوق النشر العربية بالتأكيد!
وختاما: علمني الله وإياكم ما ينفعنا،
ونفعنا بما علمنا، وزادنا علما، ونفع به الإسلام والمسلمين.
م. محمد حمدي غانم
1/5/2024