أهم أقسام المدونة

الصفحات

الثلاثاء، 27 فبراير 2018

الأنف الشامخ


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

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

CsHtml5


أحد أسباب تأخري عن إصدار كتاب عن ASP .NET طوال عشر سنوات مضت، هو عدم اقتناعي بالطريقة التي تتم بها برمجة الويب حاليا، والتي تجبرك على تعلم عشرات الأجزاء غير المتجانسة لكتابة مشروع يحتوي على أكواد:
-      فيجوال بيزيك أو سي شارب متخللة كود ASP أو HTML
-      Java Script / Ajax / JQuery / AngularJS / Knockout.js / Type Script.
-      CSS / Bootstrap.
هذا يجعل المشروع أشبه بالإسباجيتي، كما أن الكتابة عن كل هذه المكونات أمر معقد ومجهد وممل!
لهذا أنا أنتظر منذ سنوات أن تتحول ASP .NET إلى لغة عالية المستوى، وكنت أرى أن Silver Light يعتبر طريقة رائعة للتخلص من ASP .NET وكتابة مشاريع الويب بكود Xaml وسي شارب فقط.. لكن للأسف، تخلت ميكروسوفت عن سيلفر لايت عام 2012 بعد إصدار HTML5!!
ولكن كانت هناك عدة مشاريع مفتوحة المصدر منها JSIL لكتابة كود جانب العميل Clint Side باستخدام سي شارب أو فيجوال بيزيك، وترجمته إلى كود Java Script، وأهم هذه المشاريع مشروع JSIL.. ويبدو أن شركة فرنسية دمجت هذا المشروع مع طريقة سيلفر لايت في تصميم صفحات الويب، وأنشأت CsHtml5 وهو امتداد يمكن إضافته لفيجوال ستديو لإنشاء مشاريع ويب يتم فيها تصميم صفحات الويب باستخدام كود XAML وسي شارب فقط، حيث يتم تحويلها بعد ذلك إلى كود HTML5 وجافا سكربت دون أي تدخل منك ودون أن تحتاج إلى أي خلفية معرفية عن HTML5 و JavaScript.
هذا معناه أنك تستطيع تصميم مشاريع الويب بمجرد امتلاك خلفية عن WPF أو UWP أو Silver Light.
مع ملاحظة أن ما تفعله الشركة الفرنسية ليس توجها فرديا، فنحن نترقب بشغف صدور تقنية WebAssembly، التي ستتيح كتابة أكواد صفحات الويب بأي لغة برمجة وترجمتها بعد ذلك إلى ما يشبه لغة الآلة للويب، وهذا سيرحمنا من التعامل مع جافا سكربت ومشتقاتها مباشرة.

الأحد، 18 فبراير 2018

الكود المصدري لمحرر الفديو والترجمة VASE


الكود المصدري لبرنامج محرر الفديو والترجمة VASE

 

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

رابط تحميل كود المشروع كاملا من هنا (كود المشروع موجود في المجلد src ):


 

وقد سبق أن شرحت بعض الأكواد التي أضفتها للبرنامج.. معظم مساهماتي في المشروع كانت في المجلد Controls والمجلد Forms.. وسأحاول أن أشرح لاحقا بإذن الله نموذج تقطيعات الفديو وكيف قمت بتقطيع الفديو وحفظ الفديو الجديد.

أرجو أن يفيدكم هذا المشروع وهذه الشروح، هذه روابط المواضيع التي شرحتها:

 










عيناي عيد


تساءلتِ يوما:

وهل يُزهرُ الحبُّ دوما؟

وهل يَصمدُ الزهرُ بينَ الجليدْ؟

أنا قادمٌ مثلُ فجرٍ جديدْ

أنادي عليكِ وعينايَ عيدْ

معي الدفءُ والنورُ، عندي المزيدْ

أنا بحرُ عشقٍ إذا شئتِ عوما

أنا الحلمُ، هيا انفضي عنكِ نوما

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

 

عروسة ماريونيت


رقي لقلبي سلمي مخطوطك

خليني اوصّل حلم عمرك بين خطوطك

واستسلمي من غير شروطك

عايزك عروسة ماريونيت بإيدي انا ماسك خيوطك

فمتهربيش

مهرب مفيش

هفضل أنا محاصر شطوطك

لو حتى أبقى إخطبوطك!

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

 

تحديث لبرنامج محرر الفديو الترجمة

تحديث لبرنامج محرر الفديو الترجمة


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

DataTableCollection Class

فئة مجموعة الجداول DataTableCollection Class
 
تحتوي هذه المجموعة على عناصر من نوع الفئة DataTable.. ويمكن الحصول على هذه المجموعة باستخدام الخاصيّة DataSet.Tables.
والكود التالي يعرض كلّ أسماء الجداول الموجودة في مجموعة البيانات Ds:
For Each Tbl As DataTable In Ds.Tables
MsgBox(tbl.TableName)
Next
ولا تمتلك هذه المجموعة أي خصائص ووسائل جديدة غير ما تمثله من عناصر واجهة المجموعة ICollection، ولكنها تضيف بعض الصيغ إلى بعض هذه العناصر، مثل:
 

MathF Class


الفئة MathF

من الطبعة القادمة من كتاب: من الصفر إلى الاحتراف: برمجة إطار العمل.. تصدر قريبا بإذن الله:

تعرفون طبعا الفئة  Math التي تحتوي على الدوال الرياضية.. هذه الفئة تتعامل مع أعداد مزدوجة الدقة العشرية Double، وهذا مناسب للحسابات العلمية الدقيقة، لكن ثمنه هو بطء التنفيذ.. لهذا أضيف إلى دوت نت مؤخرا فئة جديدة اسمها MathF.. الحرف F هو اختصار Float وهو الاسم الآخر للأعداد مفردة الدقة العشرية Single في عائلة لغات C.. الفئة MathF نسخة طبق الأصل من الفئة Math لكنها تتعامل مع أعداد مفردة، وهذا يجعلها أسرع في التنفيذ، مع خسارة بعض الدقة العشرية، التي لا تهم كثيرا في التطبيقات التجارية وتطبيقات الألعاب والرسوم وغيرها.

المشكلة حاليا أن هذه الفئة لا تظهر في مشاريع إطار العمل، وإنما تظهر في مشاريع .Net core 2 فقط.. لو شئت تجربتها، افتح أي مشروع دوت نت كور مثل مشروع Console Application وجرب الكود.. ستجد أن استخدام MathF يوفر تقريبا نصف الوقت! 

C#:

الخميس، 8 فبراير 2018

بأي ذنب قتلت


إذا الطفولةُ سُئلَتْ = بأيِّ ذنبٍ قُتلَتْ
فقُلْ بذنبِ عميلٍ = وأُمّةٍ قد ثُكِلَتْ
وثُـلّةٍ كذئابٍ = على الجرائمِ جُبلِتْ
وعالَمٍ ملعونٍ = بلا ضمائرَ خَجِلتْ
محمد حمدي، 2018

الأربعاء، 7 فبراير 2018

إنقاذ ابن الكلب!


المهمة المستحيلة: إنقاذ ابن الكلب!
 

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

الأحد، 4 فبراير 2018

بحبك موت


أنا مخاطر عشان خاطر بحبك موت
وإيه العمر لو هيفوت
ما بين أشواق وخوف وسكوت
وحبك في الفؤاد مكبوت؟

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

 

تمثيل الأعداد السالبة


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

تصحيح الفقرة الخاصة بالأعداد الموجبة والأعداد السالبة:
يمكن تمثيل الأعداد السالبة في النظام الثنائيّ بتخصيص أقصى خانة على اليسار للإشارة، فلو كانت قيمتها صفرا كان العدد موجبا، ولو كانت قيمتها 1، كان العدد سالبا.. فكيف يمكن التفريق بينهما؟
هذا يرجع إلى طريقة تعاملك أنت مع العدد.. تذكر أنّ المتغيّر من النوع Byte يحمل فقط أعدادا موجبة، لهذا يُكتب العدد في 8 خانات، أي أنّ أكبر عدد يستوعبه هو 255.. أمّا المتغير من النوع SByte، فيمكن أن يحتوي على أعداد سالبة، ممّا يعنى أنّ هناك خانة مخصّصة للإشارة، وبهذا يُكتب العدد في 7 خانات فقط، أي أنّ أكبر عدد يستوعبه هو (2 أس 7) – 1 = 127.. لاحظ أنه لا يوجد سالب صفر، لهذا تم اعتبار هذه القيمة -128..  هذا هو السبب الذي يجعل النوع SByte يقبل أعدادا ما بين -128 و 127.
لكن كيف يتم تمثيل قيمة العدد الثنائي السالب؟
لا يكفي مجرد وضع 1 في أقصى خانة على اليسار لتمثيل العدد السالب، لأن العدد السالب يجب أن يحقق القاعدة التالية:
ناتج جمع العدد السالب مع القيمة الموجبة له = صفرا.
فمثلا، حينما نجمع 1 و -1 نحصل على صفر.. نحن نمثل الواحد في النظام الثنائي هكذا: 0000 0001.. لنحصل على تمثل العدد -1، يمكن أن نستخدم عملية الطرح 0 - 1:
0000 0000 - 0000 0001 = 1111 1111
في عملية الطرح هذه افترضنا استعارة 1 من الخانة الوهمية التالية لأقصى خانة.
لاحظ أن هناك طريقة أسهل من الطرح، وهي عكس قيمة كل خانات العدد، ثم إضافة 1.. عكس 0000 0001 يعطي 1111 1110، وإضافة 1 عليها يعطي نفس النتيجة 1111 1111 التي حصلنا عليها من الطرح!
أعرف أن هذه النتيجة غريبة، لكن الرقم الثنائي 1111 1111 هو تمثيل العدد -1 في نظام العد الثنائي.. وحينما تجمعه مع تمثيل العدد 1 تحصل على صفر:
0000 0001 + 1111 1111 = 0000 0000
لاحظ أيضا أن الواحد الباقي من الجمع في آخر خانة تم إهماله لخروجه عن نطاق الخانات المسموح بها.
إذن كقاعدة: لتمثل أي عدد سالب في نظام العد الثنائي، اطرح التمثيل الثنائي لقيمته الموجبة من صفر.
لاحظ أن هذه الطريقة في التمثيل تقول شيئا غريبا: إن ملء جميع الخانات بالآحاد في المتغيرات التي تقبل أعدادا سالبة يعطي الرقم -1!.. انظر الجدول التالي: 

نوع المتغير
تمثيل العدد -1
SByte
1111 1111
Int16
1111 1111 1111 1111
Int32
1111 1111 1111 1111 1111 1111 1111 1111

هذا معناه أن أقصى قيمة ثنائية يمكن أن يحملها متغير يقبل أعدادا سالبة هي -1!.. هذه الحقيقة ستؤثر على كيفية حساب متمم العدد Complement، لكن لا علاقة لها بقواعد النظام العشري.. فما زال أكبر رقم عشري يمكن وضعه في المتغير SByte هو 127.
وهنا يجب أن تنتبه لما يلي:
إذا كنت تتعامل مع متغير يقبل قيما سالبة، ووجدت 1 على أقصى يسار التمثيل الثنائي للعدد، فهذا معناه أنه عدد سالب، وفي هذه الحالة لتحويله إلى القيمة العشرية، اطرحه طرحا ثنائيا من الصفر أولا للحصول على العدد الموجب، ثم حول العدد الموجب إلى عدد عشري بالطريقة التي شرحناها سابقا، وضع بجوارها الإشارة السالبة. 

وفي الفقرة "ليس" NOT:
بخصوص إجراء العملية Not على العدد الثنائي للحصول على معكوسه.. قلنا إن هذا المعكوس يسمى بالمتمم Complement، ويمكن حسابه بمجرد النظر بالقاعدة:
معكوس المتغير = أقصى عدد يمكن أن يحمله المتغيّر – قيمة المتغيّر.
وقد كتبت ملاحظة أن دوت نت تؤدي هذا بشكل عجيب مع المتغيرات التي تحمل قيمة سالبة.. لكن بعد أن صححت معلوماتي عن أن أقصى عدد يمكن أن يحمله المتغير السالب هو -1 اتضح كيف يتم حساب هذه النتائج:

عليك الانتباه أن أكبر رقم يمكن وضعه في المتغيرات السالبة هو -1 !!.. ألم نذكر من قبل أن 11111111 هو تمثيل العدد -1 عند وضعه في متغير من النوع sbyte؟ لهذا ستصير معادلة المعكوس لكل الأنواع التي تقبل أعدادا سالبة هي:
المعكوس = -1 - العدد.
جرب مثلا:
C# Code:

static void Main(string[] args) {
   int X = 0;  Console.WriteLine(~X); // – 1
   X = 2;        Console.WriteLine(~X); // – 3
   X = 5;        Console.WriteLine(~X); // – 6
   X = -1;       Console.WriteLine(~X); // 0
   X = -2;       Console.WriteLine(~X); // 1
   X = -5;       Console.WriteLine(~X); // 4
   Console.ReadLine( );
} 

VB.NET Code:

 Sub Main( )
        Dim X As Integer = 0
        Console.WriteLine (NOT X) ' – 1
        X = 2 : Console.WriteLine (NOT X) ' – 3
        X = 5 : Console.WriteLine (NOT X) ' – 6
        X = -1 : Console.WriteLine(Not X) ' 0
        X = -2 : Console.WriteLine(Not X) ' 1
        X = -5 : Console.WriteLine(Not X) ' 4
        Console.ReadLine( )
End Sub
 

السبت، 3 فبراير 2018

خافي من خوفك


أنا نقطك وأنا حروفك = يا خايفة خافي من خوفك

أنا نصك وأنا عشقك = ونفسي إني بقى اشوفك

وحبي أحلى من قلقك = مانا خاطفك ومخطوفك

محمد حمدي، 2017

 

الدالة Val

التحويل باستخدام دالة القيمة Val:
لتحويل النص إلى عدد، يمكنك أيضا استخدام دالة اسمها Val (اختصار الكلمة Value).. هذه الدالة تستقبل نصا String كمعامل، وتعيد عددا صحيحا Integer يمثل قيمة هذا النص.. مثال:
Dim X As String = "5"
Dim Y As Integer = Val(X) + 3
MsgBox(Y) ' 8
وتعيد هذا الدالة صفرا إن كان النص فارغا أو يحتوي على نص لا يصلح كرقم.. مثال:
Dim X As String = ""
Dim Y As Integer = Val(X) + 3
MsgBox(Y) ' 3
هذا معناه أنه إذا لم يكن النص رقميا، فلا تسبب الدالة Val خطأ في البرنامج، وهذا ما يميزها عن الوسيلة Parse.
 
من كتاب المبرمج الصغير للصف الثالث الإعدادي (الفصل الدراسي الثاني).. للتنزيل كاملا: