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

الصفحات

السبت، 24 يونيو 2017

برنامج لعرض المتصلين بالشبكة


برنامج لعرض المتصلين بالشبكة

 
هدية العيد من الصفحة لأصدقائها الكرام، وكل عام وأنتم بخير:

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

بدأ الأمر بمحاولة مني لإجابة سؤال من أحد الأصدقاء عن معرفة الأجهزة المتصلة بالشبكة.. كان الأامر يبدو بسيطا للغاية، فكل المطلوب هو عمل أزيز Ping لكل عناوين ال IP المحتملة داخل الشبكة.. هذه العملية ترسل بعض البيانات غير الهامة لعنوان IP وتنتظر الرد.. فإذا تأخر الرد عن وقت معين Timeout فمعنى هذا أنه لا يوجد جهاز متصل له هذا العنوان.. أما إذا جاء الرد، فمعناه أن هذا عنوان جهاز متصل بالشبكة.
تحديد عناوين الشبكة سهل.. فلو طلب المستخدم العناوين في الشبكة 10.0.0.x فستكون محصورة بين 10.0.0.1 و 10.0.0.254.
ويمكن عمل Ping في دوت نت باستخدام الفئة Ping كالتالي:
Dim p As New Ping()
Dim reply = p.Send("10.0.0.1", 1000)
If reply IsNot Nothing AndAlso reply.Status = IPStatus.Success Then
   // هذا العنوان  متصل
End If
إلى هنا والأمر بسيط وجميل ولا يحتاج جهدا.. أليس كذلك؟
لكن المشكلة ظهرت عند التجربة العملية.. فعملية فحص كل عنوان في الشبكة تستغرق وقتا خاصة أن العناوين غير الموجودة تعطل البرنامج لمدة تساوي مدة وقت الانتظار Timeout.. في الكود السابق جعلت هذا الوقت 1000 مللي ثانية (= ثاتية واحدة).. هذا معناه أن فحص 254 عنوانا ستستغرق أكثر من 254 ثانية أي حوالي 4 دقائق!.. ولم يفد كثيرا تقليل وقت الانتظار إلى 100 مللي ثانية!
كما أن بعض الشبكات قد تحتوي على عناوين تصل إلى 255 × 255 عنوانا (أكثر من 65 ألف عنوان!!).. ولا داعي للحديث عن الشبكات الأكبر من هذا!
إذن فاستخدام هذه الطريقة غير عملي على الإطلاق!
وكان الحل هو تنفيذ عمليات الـ Ping بطريقة غير متزامنة Asynchronous، لأن هذا معناه أن البرنامج سيرسل كل عملية Ping ولا ينتظر نتائجها، بل يرسل التالية والتالية... إلخ مباشرة.. ثم يقرأ النتائج حينما تصل.. هذا سيجعل تنفيذ البرنامج أسرع بشكل كبير، لأن هذه العمليات تتم على التوازي لا التوالي، وبالتالي سيكون الوقت الكلي للبرنامج مساويا تقريبا لوقت تنفيذ عملية Ping واحدة أو أكبر بفروق طفيفة!
ولحسن الحظ تمتلك الفئة Ping وسائل غير متزامنة مثل SendAsync.. رائع جدا.. على بركة الله.
لكني عندما جربت هذه الوسيلة، فوجئت أنها لا تعمل بشكل صحيح في مشاريع تماذج الويندوز، ووجدت آخرين يشتكون من نفس الأمر!
وهذا معناه أنني مضطر لتنفيذ العمليات غير المتزامنة بنفسي يدويا باستخدام العمليات الفرعية Threads، وهذا احتاج الكثير من الكود لحل مشاكل التصارع على البيانات بين العمليات الفرعية!
على سبيل المثال:
لكي أعلم أن تنفيذ كل العمليات الفرعية قد انتهى (لأعرض النتائج للمستخدم)، حاولت استخدام متغير أزيد قيمته في نهاية كل عملية فرعية، وعند فحص قيمته لو ساوى 254 إذن فالمهمة قد انتهت.
لكن هذا فشل تماما، بسبب تصارع العمليات الفرعية على تغيير قيمة هذا المتغير في نفس اللحظة، وبالتالي ظل يأخذ قيما متضاربة غير حقيقية!.. ولم تنجح جملة SyncLoc (أو lock في سي شارب) في منع المشكلة لسبب غير واضح لي حتى الآن!
وقد حللت هذه المشكلة بجعل كل عملية فرعية عند انتهائها تضيف عنوان الـ IP الذي تفحصه إلى قائمة List.. فهنا لا يوجد تصارع على القراءة، وإنما كل عملية فرعية تضيف عنصرا جديدا إلى نهاية القائمة.
على كل حال الكود لديكم، وفيه أفكار كثيرة مهمة، وقد جعلته عاما، بحيث يمكن للمستخدم اختيار عدد العناوين التي يريد فحصها بدءا من IP معين.. فمثلا: لو اختار العنوان 10.0.0.10 وطلب فحص 1000 عنوان، فسأفحص هذا العنوان ثم أضيف 1 عليه وأفحصه ثم أزيد 1 آخر.. وهكذا، حتى لو انتقلت من خانة إلى أخرى من خانات العنوان (كأن أصل إلى 10.0.10.100).. والحقيقة أنني سمحت للمستخدم ـ إذا أراد ـ أن يفحص العناوين حتى 10.255.255.254.. هذا غير عملي، لكنه للتعميم.
البرنامج سريع، يمكنه أن يفحص أول 254 عنوان في أقل من 4 ثوان.. إلا إذا اختار المستخدم زيادة زمن الانتظار Timeout، فالوقت الكلي دائما سيكون أكبر من أو يساوي زمن الانتظار.
من الفوائد أيضا التي ستجدونها في المشروع، الأداة التي يكتب فيها المستخدم عنوان IP.. ليست من برمجتي، لكني وجدتها على الإنترنت، وهي موجودة في الملف IPAddressControlLib.dll (والكود الكامل الخاص بها موجود على الإنترنت لمن أراده.. لكتها تعمل بشكل مستقر ولا تحتاج لتطوير).
أرجو أن يفيدكم هذا البرنامج كمبرمجين ومستخدمين أيضا.. وبالمناسبة: أنا كتبته بدقة لأستخدمه بنفسي، لأن لدي برنامج Advanced IP Scanner وحينما قارنت نتائج برنامجي به فوجئت أن Advanced IP Scanner كان يخدعني وأن بعض العناوين لا تظهر لسبب ما!!.. فعمليا برنامجي أدق منه.
ولا تبخلوا بمشاركة المنشور، ليستفيد به أصدقاؤكم، حتى من غير المبرمجين.

وداعا عاشق القمر


وداعا عاشق القمر

يا ساكنَ الشِّعرِ إن الشِّعرَ قد سَكَنَا
................ منذُ اصطفيتَ جِنانًا في العُلا سَكَنا

يا باسمَ الوجهِ ما للضِحْـكِ فارقَنا
................ وفي غيابِكَ قد أَبدلتَنا شَجَنا؟

يا "عاشقَ القمرِ" البدرُ اختفى أَسِفا
................ مُذ غابَ شِعرُكَ أَهْمَى لم يَجِدْ وطنا

يا (حاتمَ) الكَرَمِ الوضّاءَ غُرّتُهُ
................ ما لي أراكَ بخيلا بِعتَ صحبتَنا؟

فَزُرتَني مُسرعا في الحُلمِ تُخبرُني
................ أنَّ الصداقةَ تَبقى تُشهِدُ الزمنَا

حتى بموتِكَ لم تَزدَدْ سِوَى أدبٍ
................ لم تَرضَ لي صاحبي ضُرًّا ولا حَزَنا

إنَّ الذي رُوحُهُ بالطِّيبِ تَنفَحُنا
................ ذِكراه ما فارقتْـنا لو فَنَى بدنا

في كلِّ سجدةِ قلبٍ للإلهِ دعا
................ أن يجتبيكَ بفضلٍ رَحمةً و سَنَا 

محمد حمدي غانم
21/6/2017

أهديها إلى روح صديقي الحبيب الراحل الشاعر أ. حاتم يحيى طه، رحمه الله وغفر له وجعله من المكرمين.

 

32 بت أم 64 بت؟


س: كيف أعلم برمجيا إن كان نظام التشغيل الذي يعمل عليه برنامجي 32 بت أم 64 بت؟ 

ج: يمكن استخدام دوال API لاكتشاف ذلك، لكن هناك طريقة أبسط هي فحص الخاصية IntPtr.Size، فإن كانت قيمتها 4 فالنظام 32 بت، وإن كانت قيمتها 8 فالنظام 64 بت:

VB.NET

If IntPtr.Size = 4 Then
   ' 32 bit Windows
Else
   ' 64 bit Windows
End If
 

C#
if (IntPtr.Size == 4)
   // 32 bit Windows
else
   // 64 bit Windows
وإليكم التوضيح:
تعلمون أن 32 بت = 4 بايت
و أن 64 بت = 8 بايت
في نظام 32 بت يتم إنشاء عناوين للذاكرة طولها 32 بت (4 بايت).. هذا يفر في مساحة الذاكرة المستخدمة لحفظ عناوين الكائنات المخزنة في الذاكرة، لكنه على الناحية الأخرى يسمح فقط بالتعامل مع ذاكرة بأقصى سعة تخزين = 2 أس 32 بت وهو ما يساوي تقريبا 4 جيجا بايت.. لهذا لو شغلت نظان ويندوز 32 بت على جهاز يحتوي على ذاكرة سعتها 8 جيجا بايت مثلا، فلن يستطيع الويندوز التعامل إلا مع أول 4 جيجا بايت فقط من هذه الذاكرة (في الحقيقة سيتعامل مع 3.2 جيجا فقط والباقي سيحجزه لعناوين كارت الشاشة والأجهزة الأخرى)!
لهذا من المتوقع اختفاء ويندوز 32 بت مع انتهاء عمل آخر جهاز يعمل بذاكرة 4 جيجا أو أقل.
أما بالنسبة لنظام ويندوز 64 بت، فهو يستخدم عناوين ذاكرة طولها 8 بايت.. هذا يهدر مساحة أكبر لحفظ عناوين الكائنات، لكنه يسمح بالتعامل مع ذاكرة سعتها القصوى مهولة (حوالي 16 مليون تيرا بايت!!.. وأرجو ألا يفغر أحدكم فاه ويقول إن من المستحيل الوصول إلى ذاكرة بهذا الحجم.. فهذا نفس ما كان يقال عن الذاكرة التي سعتها 4 جيجا من 20 عاما :).. أول ذاكرة اشتريتها عام 2000 كانت سعتها 16 ميجا بايت!! )
وبالنسبة للفئة IntPtr فهي تمثل مؤشرا Pointer يحمل عنوان أحد الكائنات في الذاكرة.. طبيعي إذن أن سعتها ستكون 4 بايت على ويندوز 32 ، و 8 بايت على ويندوز 64 بت.

الوطن والحدود


الوطن والحدود



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

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

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

-      فلترجع مصر إلى اليونان والرومان الذين حكموها ألف عام.. ستقول لكنها لم تكن ملكهم.. إذن على الأقل أرجع إليهم الإسكندرية التي بناها الإسكندر الأكبر وما زالت تحمل اسمه إلى اليوم!

-      ولترجع مصر القديمة إلى السعودية أيضا لأن عمرو بن العاص ومن خلفه من الولاة هم من أنشأوها!

-      ولترجع القاهرة إلى المغاربة (فمن هناك جاء الفاطميون الذين بنوها) ولتسلم الأزهر إلى الشيعة الذين بنوه!

-      ولتقتطع النوبة للنوبيين لإقامة دولتهم!!

-      ولا تستخسر حلايب وشلاتين في السودانيين.

-      ولتعط للنصارى دولة بدورهم، وهم يدعون أن مصر كلها ملكهم وأن 90% من سكانها غزاة (متى سيطردوننا إلى السعودية؟.. لماذا تأخروا كل هذا الوقت؟!)

-      ولتعط الساحل الشمالي الغربي والواحات لليبيا ففيهما قبائل ليبية وأمازيغ والإنجليز هم من رسم هذا المستطيل على الورق فقطعهم عن قبائلهم!

-      أما سيناء فمن الواضح أنها ستباع أصلا فلا داعي للحديث عنها.

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

هذه هي لغة الحقوق في التاريخ والجغرافيا.. وكما هو واضح هي تصلح فقط لتمزيق الأوطان!!

أما في الواقع، فوحده المهزوم هو من يتنازل غضبا عن أرض وطنه، ووحده الخائن هو من يبيعها بغير هزيمة ليشتري أيامه في السلطة، ووحده القوي المنتصر هو من يجعل وطنه أكبر!

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

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

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

عدد سطزر مربع النص


س: كيف يمكن معرفة عدد السطور الحقيقية، وعدد السطور التي يراها المستخدم فعليا في مربع النص المنسق RichTextBox؟

ج: يمتلك مربع النص المنسق القدرة على تقسيم السطر الطويل على أكثر من سطر فيما يعرف باسم الالتفاف Wrap.. لهذا قد يختلف عدد السطور الحقيقي (التي ينتهي كل منها برمز السطر الجديد \n أو VBCr) عن عدد السطور المعروضة عمليا في مربع النص.

ويسمى السطر الحقيقي بالسطر المعين Assigned Line (أي المحدد برمز السطر الجديد).
بينما يسمى السطر المعروض Physical Line.

وتعيد الخاصية Lines مصفوفة تحتوي على السطور الحقيقية، ويمكنك معرفة عدد خاناتها (عدد السطور) باستخدام الخاصية Length كالتالي:
AcualLines = richTextBox1.Lines.Length
لكن كيف يمكنك معرفة عد السطور المعروضة؟
يمتلك مربع النص المنسق وسيلة هامة يمكنك التلاعب بها لمعرفة عد السطور المعروضة، وهي الوسيلة GetLineFromCharIndex التي ترسل إليها موضع أحد الحروف في النص (أول حرف رقمه 0)، فتعيد إليك رقم السطر الذي يوجد فيه هذا الحرف، وهي تعتبر السطور الملتفة سطورا مستقلة داخلة في العد.
فكيف إذن نستخدمها لمعرفة عدد السطور المعروضة؟
الأمر بسيط: أرسل إليها رقم آخر حرف في النص (موجود في السطر الأخير ورقمه يساوي طول النص -1)، وستعيد إليك الوسيلة GetLineFromCharIndex رقم هذا السطر.. ونظرا لأن أول سطر رقمه 0، فإن آخر سطر سيساوي عدد السطور – 1.. إذن كل ما عليك هو إضافة 1 على ناتج هذه الوسيلة:
LastPos = richTextBox1.TextLength - 1
DisplayedLines = richTextBox1.GetLineFromCharIndex(LastPos) + 1;
لكن فيم يفيدنا معرفة عدد السطور المعروضة فعليا في مربع النص؟
إحدى الفوائد هي حساب ارتفاع النص المعروض في مربع النص، حيث يمكننا معرفة ارتفاع كل سطر باستخدام الخاصية Height التابعة للخط الذي يستخدمه مربع النص، عندئذ يمكننا ضرب ارتفاع السطر في عدد السطور، فنحصل على ارتفاع النص:
TextHieght = richTextBox1.Font.Height * DisplayedLines
لو أردت بعد هذا جعل ارتفاع مربع النص مناسبا لمحتوياته بالضبط، فاستخدم السطر التالي:
richTextBox1.Height = TextHieght
ولو كان لمربع النص إطار مجسم BorderStyle = Fixed3D فأضف 4 على القيمة السابقة (2 للإطار العلوي و 2 للإطار السفلي). 

ملحوظة1:
إذا كنت مبرمج سي شارب، فضع أمام أسماء المتغيرات الكلمة var لتعريفها تلقائيا، وفي نهاية كل سطر فاصلة منقوطة ; مثل:
var LastPos = richTextBox1.TextLength – 1;
وإذا كنت مبرمج فيجوال بيزيك، فضع أمام أسماء المتغيرات الكلمة Dim فحسب مثل:
Dim LastPos = richTextBox1.TextLength – 1
وبهذا يصلح الكود للغتين :) 

ملحوظة2:
بنفس الطريقة، يمكنك معرفة إن كان أحد السطور ملتفا على سطرين أم لا. 

للتفاصيل الكاملة عن مربع النص المنسق RichTextBox وخصائصه ووسائله:
من الصفر إلى الاحتراف برمجة نماذج الويندوز:

 

الأحد، 11 يونيو 2017

جدي فؤاد رحمه الله


 
جدي الحبيب الراحل الأسطى فؤاد يوسف عتمان (والد أمي).. توفي من 24 عاما وعمري 16 عاما (هناك جزء من أحفاده لم يروه).

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

كان ماهرا في حرفته ويناديه الناس يا بشمهندس.. وربما ما زالت صنعة يده حية الى اليوم في بعض البيوت.. وما زال تلاميذه وتلاميذ تلاميذه يمارسون الحرفة إلى اليوم.

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

وكان جدي فتوة في شبابه يمتلك قوة عضلية وَهَيبة، فكان مرهوب الجانب لأنه إذا رفع يده لم تنزل "فاضية" كما كان يقول.. يعني انه إذا رفعها فسيضرب بها أحدا ولا يبالي.. لكنه كان عف اللسان طيبا محبوبا.

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

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

- أنا أعطيك بنتي البكر أغلى ما أملك، فهل سأنظر لبعض قطع الأثاث؟

ولهذا كان أبي يتعامل معه كأب لا كحما، ولم أشهد خلافا بينهما طيلة حياتهما إلا مرة واحدة، وكان خلافا بسيطا عابرا لم يستمر طويلا!

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

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

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

ومن المواقف الطريفة التي أتذكرها لجدي رحمه الله كلما هل رمضان، أنني كنت صائما وأنا صغير (ربما كان عمري 9 سنوات) ونجحت في الصوم إلى المغرب، ووضعت جدتي حفظها الله الطعام على الطبلية، وجلسنا ننتظر اذان المغرب، ففوجئت بجدي فؤاد ينفجر ضاحكا، فنظرت له متعجبا وهو مستمر في الضحك بقوة، وسألته عن السبب فقال لي من بين ضحكه:

- أنت تأكل!

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

رحم الله جدي الأسطى البشمهندس فؤاد يوسف عتمان وغفر له وكفر عنه سيئاته وجعله من أهل الجنة.

 

TimeSpanPiker


مشروع أداة اختيار المدة الزمنية
TimeSpanPiker 



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

Download Source Code in C# & VB.NET:

مؤخرا، أردت تصميم مربع حوار يتيح للمستخدم إدخال مدة زمنية.. كانت أمامي هذه الخيارات:

يا عزيزي كلنا أسطوانات


يا عزيزي كلنا أسطوانات

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

بالمناسبة:
هل تعرفون ما أصل كلمة باشمهندس؟
واضحة جدا.. مرة مهندس نزل البحر و باش.. فقال الناس باش مهندس :D
أمزح معكم.. واضح أن أصلها الباشا المهندس واختزل الناس نطقها كعادتهم في العامية.. ولا تنسوا أن أول كلية هندسة أنشأها محمد علي باشا وسماها المهندس خانة.. لهذا ما زالت كليات الهندسة تحتفظ بطابع السلخانة حتى اليوم :D .   

الأربعاء، 7 يونيو 2017

عرض مصمم الفئات


س: لا أستطيع العثور على مصمم الفئات Class Designer في VS.NET 2017.. فما الحل؟ 

ج: هناك عدة مكونات شهيرة لا يتم إعدادها تلقائيا في VS.NET 2017 وعليك أن تختار إعدادها بنفسك، ومنها:

- Class Designer
- Help Viewer
- LinQ To SQL Tools
وغيرها.
يجب أن تختار هذه المكونات أثناء الإعداد، أو يمكنك إضافتها لاحقا في أي وقت تريده.
هناك طريقتان لفعل هذا: 

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

الطريقة الثانية:
فتح برنامج الإعداد الذي استخدمته لإعداد نسختك من فيجوال ستديو (مثل البرنامج vs_Community.exe).. لو كنت حذفته، فأعد تحميله من على الإنترنت (حجمه صغير لأنه يقوم بالإعداد عبر الإنترنت).
حاليا يوجد تحديث لفيجوال ستديو، لهذا سيسألك إن كنت تريد التحديث.. أرى أن توافق وتحدث النسخة أولا.
بعد هذا سترى أسماء الإصدارات الثلاثة لدوت نت.. تحت الإصدار الذي أعددته (وليكن Community) سترى زرا اسمه Modify.. اضغطه.. ستظهر نافذة تعرض مكونات فيجوال ستديو.. لاحظ وجود ثلاث أشرطة أعلى هذه النافذة.. اضغط الشريط الأوسط Individual Components، وتحرك للأسفل إلى العنوان Code Tools وستجد أول عنصر تحته هو Class Designer.. ضع علامة الاختيار عليه.. حاول أن تمر ببصرك عبر باقي الاختيارات في الصفحة فربما تجد عناصر أخرى تهمك لم تقم بإعدادها.. بعد أن تفرغ، اضغط الزر Modify أسفل يمين الصفحة ليبدأ الإعداد.

 

UpDownButtons


أزرار الزيادة والإنقاص
UpDownButtons 

هل احتاج أحدكم يوما في مشاريع نماذج الويندوز إلى أداة تشبه الزرين الصغيرين الموجودين في جانب الأداة الرقمية NumericUpDown لوضعها داخل أداة خاصة به؟

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

لكنني قررت مؤخرا أن أستعير الزرين الخاصين بالأداة NumericUpDown لاستخدامهما في أداة خاصة بي.

لفعل هذا، فحصت كود هذه الأداة NumericUpDown وكود الفئة الأم التي جاءت منها وهي UpDownBase.. لا تنسوا أن دوت نت صارت مفتوحة المصدر الآن، ويمكنكم رؤية كود فئات إطار العمل بل وكود لغات البرمجة نفسها Compilers.. يمكن الاطلاع على كود الفئة UpDownBase هنا.

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

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

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

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

ويمكن استخدام الحدثUpDown الخاص بالأداة UpDownButtons للتفاعل مع ضغطات الأزرار، فالمعامل e الخاص به يمتلك الخاصية ButtonID التي تكون قيمتها 1 أثناء ضغط زر الزيادة، و 2 أثناء ضغط زر الإنقاص.

 

 

القتل بين التكفير والاستهانة بالدماء


القتل بين التكفير والاستهانة بالدماء:

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

في الحقيقة، هناك خلل كبير في فهمنا للتوبة ومغفرة الله في الإسلام.. يقول سبحانه:

(إِنَّ اللَّهَ لَا يَغْفِرُ أَن يُشْرَكَ بِهِ وَيَغْفِرُ مَا دُونَ ذَٰلِكَ لِمَن يَشَاءُ)

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

فالمعصية تكون بمخالفة شرع الله، ويترتب عليها ذنب، يغفره الله لمن شاء إن صحت توبته عنه.

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

-      أن يرد الحق لصاحبه أو أن يعطيه تعويضا عما أصابه أو يدفع دية القتيل.

-      أن يغفر المظلوم لظالمه ويعفو عنه.

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

غير هذا، فسيحكم الله بين الظالم والمظلوم في الآخرة، كما يوضح هذا الحديث الشريف:

"الْمُفْلِسُ مِنْ أُمَّتِي مَنْ يَأْتِي يَوْمَ الْقِيَامَةِ بِصَلاتِهِ وَصِيَامِهِ، وَيَأْتِي قَدْ شَتَمَ هَذَا، وَقَذَفَ هَذَا، وَأَكَلَ مَالَ هَذَا، وَسَفَكَ دَمَ هَذَا، وَضَرَبَ هَذَا، فَيُقْتَصُّ لِهَذَا مِنْ حَسَنَاتِهِ، وَلِهَذَا مِنْ حَسَنَاتِهِ، فَإِذَا فَنِيَتْ حَسَنَاتُهُ قَبْلَ أَنْ يَقْضِيَ مَا عَلَيْهِ، أُخِذَ مِنْ خَطَايَاهُمْ فَطُرِحَتْ عَلَيْهِ ثُمَّ طُرِحَ فِي النَّارِ"

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

إذن.. أين يقع القتل في هذه الصورة؟

لكي تتخيلوا حجم الكارثة، تذكروا أنه (من قتل نفسنا بغير نفس أو فساد في الأرض، فكأنما قتل الناس جميعا)!

أي أن قتل إنسان بريء واحد يعادل قتل ترليونات (ملايين الملايين) من البشر من يوم خلق سيدنا آدم إلى قيام الساعة!

تخيل لو أن القاتل أخذ سيئة واحدة فقط على كل واحد منهم.. من أين له بحسنات تعادل هذا؟!

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

(لو أن أهلَ السماءِ وأهل الأرضِ اشتَرَكُوا في دمِ مُؤْمِنٍ لأكَبَّهُم اللهُ في النَّارِ)

بعد كل هذا يظن الواحد من هؤلاء أنه سيذهب للحج فيعود مطهرا من الذنوب كيوم ولدته أمه (هذا إن قُبِل منه الحج أصلا، لكن هل يقبل الله حجة الملوثين بالدماء؟.. الله أعلم).. صحيح لقد خسرت ذنوبك، لكن هل سقطت عنك مظالم الناس؟.. وهل ما معكم من حسنات الصلاة والصيام والحج ستكفي لرد هذه المظالم يوم القيامة؟

نفس الكلام ينطبق على باقي الكبائر من تعذيب وسرقة وغصب ممتلكات وتشويه سمعة افتراء وكذبا ... إلخ.. لكن أبشعها القتل طبعا.

فليحذر كل إنسان يظلم أو يؤيد ظالما، فهناك دعوة مظلوم تطارده في الدنيا، وذنوب مظالم تتراكم ستلتهم حسناته في الآخرة.