المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : رسائل الأخطاء و فضح الأسرار


المـهاجر
29-10-2014, 10:34 AM
السلام عليكم ورحمة الله وبركاته
الجزء الأول
درسنا اليوم سيكون عن رسائل الأخطاء
أداة هامة تتيحها الأوتوبلاى ليتعرف المبرمج على مكان الخطأ

لكنها تصبح كارثة عندما تظهر للمستخدم أثناء عمل البرنامج
فقد تبوح له بأدق أسرار البرنامج خصوصا لو كان تجارى

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

كذلك يمكن للمخترق تتبع الرسالة بمنقح و معرفة مكان سطر الحماية من بين عشرات الآلاف من الأسطر بكل سهولة
و تكون بذلك كأنك قد أهديت اللص مفتاح منزلك ليدخله بكل سهولة
كيف نتعامل بشكل آمن و نتجنب هذا المأزق ؟؟
هناك حلان
1-الحل التقليدى::
توقع جميع الأخطاء و تجهيز رسالة خاصة لكل إجراء (قد تنسي توقع أحد الأخطاء)
2- الحل الغير تقليدى::
عمل دالة عامة تتعامل مع اى خطأ مهما كان سببه و تظهر رسالة موحدة تكتبها بنفسك

انتهى الجزء الأول

الجزء الثانى
سنبدأ بمسالة بسيطة جدا
x = "almohager"
Dialog.Message("Notice", x);

ما نتيجة هذا الكود ؟؟
رسالة بها نص سابق التعيين فى المتغير إكس
جميل

ما نتيجة هذا الكود
y = "almohager"
Dialog.Message("Notice", x);

طبعا ستكون رسالة خطأ
لآن المتغير x لم يتم تعيينه
سؤال الحلقة
كيف نضع كود يجعل البرنامج يعطى رسالة خطأ معينة
و من دالة أخرى من خارج الكود
و نقل دفة التحكم إلى منطقة بعيدة عن مكان تنفيذ الكود
على أن يكون نظاما عاما و لا يعتمد على نوع و طبيعة الخطأ
و يمكن إستخدامه فى أى إجراء من البرنامج ليعطى رسالة "حدث خطأ راجع إجراءك الأخير" مثلا
نهاية الجزء الثانى

الجزء الثالث
يبدو ان عدم التفاعل يرجع لعدم وضوح الموضوع
حسنا سننحرف قليلا عن الموضوع و سنرجع لاحقا

س:: كيف تعطينا اللوا رسالة الخطأ ؟؟
:: هل يمكننا مقاطعة رسالة خطأ صدرت من اللوا (محرك الأوتوبلاى) و إستبدالها ؟؟
:: هل الرسائل التى تعطينا اياها الأوتوبلاى هى من محرك اللوا أم أنها قد أمليت على اللوا قسرا بواسطة الأوتوبلاى من خلال جدول أخطاء أعدته مسبقا شركة إنديجوروز ؟؟
::هل يمكننا إنتهاج نفس الأسلوب و إنتاج رسائل مشابهة بنفس التكتيك ؟؟

حسنا
سرعان ما سنعرف ذلك من هذا المثال
سنضع هذا الكود فقط فى زر و ننفذه
error ("Yes we can add ouer error messages")

http://im87.gulfup.com/fC1SNc.jpg
الأن السؤال ::
::بم تخبرنا هذه الرسالة و ما هو الخطأ الذى حدث ؟؟
::هل حدث خطأ فعلا أم أننا أجبرنا اللوا على الشعور بخطأ ؟؟؟
::هل ما شاهدناه هو الشكل الطبيعى للرسائل ؟؟
::هل كانت Dialog.Message أم Debug.Meassage ؟؟؟؟

::هل عرفتم نوعية الرسائل التى نحن بصدد منعها ؟؟؟
::هل أصبح موضوع الدرس واضح ؟؟
::هل أكمل ؟؟

نهاية الجزء الثالث

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

أقول لهم
إعتقادكم خاطئ 100 %
و علينا من الأن فصاعدا أن نثق بأنفسنا و لا نشكك بقدراتنا


نأتى للفائدة
أقصد نأتى للكود

نضع فى الجلوبال
function err()
Dialog.Message("Notice", "حدث خطأ راجع إجراءك الأخير", MB_OK, MB_ICONINFORMATION, MB_DEFBUTTON1);
end
طبعا محتوى الرسالة المكتوب بالأزرق إختيارى و ستكتبه على هواك

نضع فى الزر

function mohager()
y = "almohager"
Dialog.Message("Notice", x);
end
xpcall (mohager, err)
بداية نحن حولنا الكود لدالة
و لمن لا يعرف
فالمكتوب بالأزرق هو الدالة و إسمها
الدالة و إسمها إختيارى و ستغيره حسب أكوادك (كل ماهو بالأزرق إختيارى)

هكذا لن تظهر سوى رسالة الخطأ "حدث خطأ راجع إجراءك الأخير"
مهما كان نوع الخطأ
للتأكد
جرب أكواد مختلفة بأطوال مختلفة و بنوعيات أخطاء مختلفة

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

هل كان ما سبق معقدا ؟؟
ان كان كذلك أعطيتكم بليجن من برمجتى تكتب فيه إسم الدالة و محتوى رسالة الخطأ فيقوم بكل المطلوب

تم بحمد الله
شكرا لكل من ساهم أيا كانت مساهمته
و تحية خاصة للأستاذ [you]
أترككم فى حفظ الله

ثامر أبو بلقيس
29-10-2014, 01:13 PM
السلام عليكم ورحمة الله وبركاته

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

---------------------------------------------------------------
ليس بالضرورة التنقيح يتطلب تعقب رسائل الخطأ

موفق :abc_138:

المـهاجر
29-10-2014, 07:27 PM
السلام عليكم ورحمة الله وبركاته

و أنا واحد ممن يحبون التعلم

و عليكم السلام و رحمة الله و بركاته
مرحبا بك


- أن نكتب أكواد في مشروعنا من الاساس لا تعطي أخطاء


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

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


ليس بالضرورة التنقيح يتطلب تعقب رسائل الخطأ


لكنها لا زالت احد اسهل واشهر الطرق (تدرس فى kg1 كراك)


- أن نغلق التجميعية عند ظهور أي رسالة خطأ بدون الدخول في تفاصيل ما كتب فيها

من المخاطبون بهذا الكلام المبرمجون ام المستخدمون ؟؟
هل سيقوم المستخدمين بذلك ؟؟؟

abohmam
29-10-2014, 09:36 PM
جزاك الله خيرا اخانا المهاجر

الشرح رائع ماشاء الله

نفع الله بك وبعلمك وفى إنتظار المزيد ان شاء الله

المـهاجر
29-10-2014, 11:14 PM
جزاك الله خيرا اخانا المهاجر

الشرح رائع ماشاء الله

نفع الله بك وبعلمك وفى إنتظار المزيد ان شاء الله

مرحبا بك اخى الكريم :abc_152:

عبود عبود
30-10-2014, 02:50 PM
::هل كانت Dialog.Message أم Debug.Meassage ؟؟؟؟




مرحبا أخى هى Debug.Meassage وليست Dialog.Message


أكمل أخى حتى يستفيد من يمر على الموضوع أو القسم

..... أنا أعرف ولكنى أفضـــل المتابعة معك .....

:abc_152::abc_152::abc_152:

المـهاجر
30-10-2014, 04:42 PM
..... أنا أعرف ولكنى أفضـــل المتابعة معك .....

مرحبا اخى
ماذا تقصد ؟؟
هل تقصد انك تعرف ما ذكرته انا حتى الآن ام تعرف ما سأذكره لاحقا ؟؟

ثامر أبو بلقيس
30-10-2014, 05:01 PM
السلام عليكم ورحمة الله وبركاته

هي ليست Dialog.Message لأنها لو كانت كذلك لظهرت
كما سيحيل له ناتج هاته الرسالة

status, err = pcall(Dialog.Message,"Test")
if not (status) then
Dialog.Message("Error","I forgot to put in argument 2\n\n"..err)
end

عبود عبود
31-10-2014, 12:14 AM
مرحبا اخى
ماذا تقصد ؟؟
هل تقصد انك تعرف ما ذكرته انا حتى الآن ام تعرف ما سأذكره لاحقا ؟؟

أعتقد أنى أعرف ما سوف تذكره أما ما ذكرته انت إلى الآن أعتقد أنك لم تذكر شيئ .

ربما سيكون مشابه لما أعرفه أو يختلف أو أفضل وفى كل الأحوال أفضل أن أستفيد منك أخى .

:abc_138:

أبو صخر
31-10-2014, 12:25 PM
شكرا أخي الكريم على هذه المعلومات

ثامر أبو بلقيس
31-10-2014, 02:04 PM
السلام عليكم ورحمة الله وبركاته

إلى غاية أن أقرأ من إخواني ما يعرفون :

ضع أخي الكريم في global functions هذا الكود :
function print(...)
local t = {};
for i, v in pairs{...}do
t[#t + 1] = tostring(v);
end
Dialog.Message("Notice", table.concat(t, "\t").."\r\n");
end;
local origCache = {};
local pCallback = false;
function setErrorCallback(f)
if(type(f) == "function")then
pCallback = f;
end
end;
function protectGlobal(state)
for i, v in pairs(_G)do
if(type(v) == "table" and tostring(i) ~= "_G")then
if(type(origCache[i]) ~= "table")then
origCache[i] = {};
end
for j, w in pairs(v)do
if(type(w) == "function")then
if(state)then
if(not origCache[i] or not origCache[i][j])then
origCache[i][j] = w;

_G[i][j] = function(...)
local pres = {pcall(w, ...)};
if(pres[1])then
return unpack(pres, 2, #pres);
else
if(type(pCallback) == "function")then
pCallback(pres[2]);
end
return nil;
end
end;
end
else
if(origCache[i] and origCache[i][j])then
_G[i][j] = origCache[i][j];
origCache[i][j] = nil;
end
end
end
end
end
end
end;



وفي on preload

setErrorCallback(function(message)
print("عندك خطأ عام راجع ما كتبت ", "");
end);

protectGlobal(true);


انتهى جرب الكود الذي وضعه أخي المهاجر في زر :

y = "almohager"
Dialog.Message("Notice", x);

عاين النتيجة بالتوفيق للجميع

أبو يوسف
31-10-2014, 02:43 PM
جزاك الله خيرا اخانا الفاضل وأشكر الإخوة الذين اثروا الموضوع باقتراحاتهم

.

المـهاجر
31-10-2014, 03:13 PM
الأخ الفاضل تامر
بداية شكرا على الكود
هذا حل ممتاز جدا
لكنه للأسف يصلح لحالة واحدة فقط

لاحظ هذا السطر فى أحداث البريلود خاصتك
setErrorCallback(function(message)
أنت هنا إشترطت مقاطعة أخطاء الدالة message فقط لا غير
و لو تذكر كلامى فستجد اننى أتكلم عن خطأ لا نعرف طبيعته و سأقتبس لك من كلامى للتذكير
أنا أناقش طريقة التعامل مع خطأ لا نعلم طبيعته و لا مكانه و سيفاجأ به المستخدم وقت التنفيذ
سنتعامل مع خطأ برمجى مستقبلى محتمل لكنه مجهول تماما لنا وقت البرمجة
ماذا لو كان الخطأ هو ضرب سترنج فى رقم بدون إظهار رسائل ؟؟
ضع هذا الكود فى زر و جرب معه طريقتك
x = 6
y = "five"
z = x*y

شكرا لتفاعلك المثمر

المـهاجر
31-10-2014, 03:31 PM
أعتقد أنى أعرف ما سوف تذكره

ما سأذكره لا يعلمه إلا أنا و علام الغيوب فقط

أما ما ذكرته انت إلى الآن أعتقد أنك لم تذكر شيئ .


:abc_152:... :abc_152:... :abc_152:
:abc_152:لا تعليق :abc_152:
:abc_152:... :abc_152:... :abc_152:



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

الموضوع للمناقشة و تنوع الأفكار مما يجعل الموضوع شامل

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

" أيهما أفضل ؟؟ "
سؤال غير منطقى
سيكون كلاهما ممتاز فى مكانه الصحيح

منتظرك
:abc_152:

المـهاجر
31-10-2014, 04:10 PM
جزاك الله خيرا اخانا الفاضل وأشكر الإخوة الذين اثروا الموضوع باقتراحاتهم

.

مرحبا بك اخى الكريم :abc_152:

ثامر أبو بلقيس
31-10-2014, 04:44 PM
حلى سيمنع كافة الأخطاء مجتمعة (ميزة فى حالة و عيب فى حالة)

:abc_152:

بالتوفيق إن شاء الله متمنيا تخطي أي عيوب في الحل إن أمكن

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

بالتوفيق إخواني :abc_138::abc_138:

المـهاجر
31-10-2014, 04:54 PM
بالتوفيق إن شاء الله متمنيا تخطي أي عيوب في الحل إن أمكن

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

بالتوفيق إخواني :abc_138::abc_138:

إستمتعت جدا بمداخلاتك أخى أبو بلقيس

سيكون الحل بالصيغتين
الأولى كود بالمشاركة
و الآخر بليجن من برمجتى (لم يسبق برمجة مشابه له) لزملائنا القادمين الجدد

بالتوفيق إن شاء الله متمنيا تخطي أي عيوب في الحل إن أمكن

سيكون الحل أبسط مما قد تتصور بكثير و ليس تعديلا لحل سابق


- أرجو أن يصلك ما وددت قوله -
بالتوفيق إخواني :abc_138::abc_138:
طبعا وصلنى ما تريد قوله (الدمج ب themida و أشباهها )

شكرا لك
:abc_022:

المـهاجر
31-10-2014, 05:20 PM
شكرا أخي الكريم على هذه المعلومات
مرحبا بك أخى الكريم
و عذرا فقد ألهتنى المداخلات عن الترحيب بك
للتعويض لك باقتين من الزهر عوضا عن واحدة
:abc_152: :abc_152:

المـهاجر
31-10-2014, 06:19 PM
تم وضع الحلقة الأخيرة
:abc_152:

ثامر أبو بلقيس
31-10-2014, 07:01 PM
بارك الله فيك حل مميز و مفيد أفدتني
جزاك الله كل خير :abc_138:

المـهاجر
31-10-2014, 07:03 PM
بارك الله فيك حل مميز و مفيد أفدتني
جزاك الله كل خير :abc_138:

كذلك انا
استفدت جدا من مشاركتك التى سلطت الضوء على حماية الجلوبال
سيكون لها نقاش مستقل لإستغلالها لاحقا
طبعا ان سمح وقتك ووقتى
شكرا لك
:abc_138:

عبود عبود
01-11-2014, 01:24 AM
جزاك الله خيرا أخى

بالفعل أخى كنت أعرف ذلك ........ كما أن جزءا من هذه العملية يمكن فعلها بــــ assert

ولا تنسى هذه الصفحة التى يمكن لأى شخص أن يكون إستفاد منها وليس بالضرورة أن تدرج الشركة أكواد ظاهرة فى البرنامج لها فهى بالفعل مدرجة مع آلاف التعليمات البرمجية فى البرنامج

http://www.lua.org/manual/5.1/manual.html#5.1

هذه الصفحة معلومة لكل إن لم يكن الجميع فمعظمهم ومن فترات طويلة جداااااااااااااا " المحترفين أو هواة التعلم " وأنا أحتسب نفسى من هواة التعلم .


:abc_152::abc_152::abc_152:

ولو لاحظت أنى قد قدمت شرحا لجزء من هذه الصفحة تحت عنوان موضوع متجدد " بالمختصر المفيـــــــد " (http://www.abc4web.net/vb/showthread.php?t=30173) لذلك لا تتعجب من ردى الذى كان :

أعتقد أنى أعرف ما سوف تذكره

فيوجد من يفهم من مجرد التلميح لشرح ما أو فكرة ما

ففى النهاية المعلومة تصل للباحث عنها وغير مختصرة على شخص واحد ........ نحن أخوة بالتأكيد إن لم تكن أنت أستاذى


:abc_138: تحياتى وتقديرى لك ولجميع من يحب التعلم أو تعليم الآخرين :abc_138:

المـهاجر
01-11-2014, 07:29 AM
من ملايين الأسطر و التعليمات البرمجية التى يعج بها فضاء الإنترنت
فمن الصعب جدا ان تنتقى اكواد معينة وفق شروط محددة لإبراز فكرة محددة بوضوح و إنشاء موضوع منظم وواضح الفكرة و المعالم
و تقديم وجبة برمجية شهية لإخوانك المبرمجين

بينما من السهل جدا انتظار انتهاء الموضوع ثم عمل بحث جوجل بسيط ثم الرد بأن الكود موجود فى موقع اللوا

الآن أنا نقلت الكود من موقع اللوا ؟؟
بأى منطق ؟؟
هل سأحاسب على استخدام أبجدية اللوا الخام ؟؟
و هل وضعتها انا بصورتها الخام ؟؟؟؟

سأقتبس لك نص ما ذكره الموقع المذكور فى رابطك
xpcall (f, err)

this function is similar to pcall, except that you can set a new error handler.

Xpcall calls function f in protected mode, using err as the error handler. Any error inside f is not propagated; instead, xpcall catches the error, calls the err function with the original error object, and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In this case, xpcall also returns all results from the call, after this first result. In case of any error, xpcall returns false plus the result from err.
هل هذه الصيغة كما هى كانت ستنفع الناس ؟؟
هل هى صيغة تنفيذية قابلة للتطبيق العملى ؟؟

هل لو كنت ادخرت معلوماتى لنفسي و لم أنشرها. كنت سأقف كما وقفت الآن فى موقف المدافع ؟؟
الدرس وصلنى و اصبح واضح

فى الأخير كلنا أخوة
فى امان الله

عبود عبود
01-11-2014, 12:10 PM
أعتذر لك أخي فيبدو أن كلامي غير واضح
أو إن كنت أنت فهمته خطأ
لا أقصد به أي إساءه إذا قرء من أول رد إلي آخر رد شكرا لك ولرحابه صدرك

واصل إبداعاتك فهناك من ينتظر أن يتعلم المزيد

غريب يا فؤادي
31-10-2017, 11:00 PM
حقيقةً موضوع يستحق التقدير
فكرة أكثر من رائعه
جزاك الله الجنة