Sanousy Ali Howari

C++ Garbage Collector عملي من تصميمي ...

17 ردود في هذا الموضوع

ما هو جامع النفايات او الـ Garbage collector

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

من المسائل التي ينزعج منها الكثيرين لدى الانتقال من بيئة #c (بيئة net. بشكل عام) أو Java إلى بيئة ++c هي إدارة الذاكرة...

حيث لا يضطر المطور إلى البحث فيما إذا كان هناك Object في الذاكرة لا يحتاجه ويجب ان يحذفه أو لا فقط يعمل New ... مع ان الإمكانيات موجودة في بيئة net. ولكن قد لا يحتاجها الكثيرين إلا في الـ Unmanaged code، ويتولى جامع النفايات (Garbage collector) المهمة بشكل تلقائي.

في ++c هذة الميزة غير موجوة، ولكن تم ايجاد الكثير من التقنيات لجمع النفايات مثل refcount, smart pointer ولها تطبيقاتها .. ولكن أحيانا تكون الامور معقدة ومزعجة ... أكثر من تنفيذ العملية بشكل يدوي ...

لذلك فقد قمت بتصميم جامع نفايات بسيط لأهداف العمليات والبرمجيات غير المعقدة أدرجه لكم للفائدة ... انقر الرابط للتحميل

(الموضوع الأصلي حيث يمكن اضافة المزيد من المعلومات مستقبلا في مدونتي)

sanoGC.zip

6

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مثال بسيط لو سمحت يشرح كيفية عمل ما تتكلم عنه, المثال الموجود في الموقع غير واضح, ماهي Track؟ كل الفائدة من الـ garbage collectors هي أن لا تقوم بعمل tracking بشكل يدوي أصلاً!

أما بالنسبة للتعقيد فليس هناك تعقيد في ++C من ناحية الذاكرة, و أنا مع فتح النقاش في الموضوع ليتوضح للكثيرين كيف تدار الذاكرة بشكل أتوماتيكي في ++C, و ليس كما في C مع ميزة أن إدارة الذاكرة في ++C عملية deterministic و لا يقتصر الموضوع على الذاكرة فقط و إنما على أي نوع من أنواع الموارد resources و هنا يكون التعقيد في اللغات التي تستخدم الـ GC :)

تحياتي...

4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مثال بسيط لو سمحت يشرح كيفية عمل ما تتكلم عنه, المثال الموجود في الموقع غير واضح, ماهي Track؟ كل الفائدة من الـ garbage collectors هي أن لا تقوم بعمل tracking بشكل يدوي أصلاً!

أما بالنسبة للتعقيد فليس هناك تعقيد في ++C من ناحية الذاكرة, و أنا مع فتح النقاش في الموضوع ليتوضح للكثيرين كيف تدار الذاكرة بشكل أتوماتيكي في ++C, و ليس كما في C مع ميزة أن إدارة الذاكرة في ++C عملية deterministic و لا يقتصر الموضوع على الذاكرة فقط و إنما على أي نوع من أنواع الموارد resources و هنا يكون التعقيد في اللغات التي تستخدم الـ GC :)

تحياتي...

مش مشكلة ... بس بدون أسلحة الله يخليك !! :)

أنا قادم من بيئة جافا و دوت نت ... والأمور سهلة فهيا بس في c++ كل بايت تقوم بحجزه في الذاكرة أنت بحاجة إلى إلغاؤه ...

مع انني عملت في عدة مشاريع c++ صغيرة ... إلا أن إدارة الذاكرة كانت تشغلني دائما عن هدفي الرئيسي ... وكانت هناك دائما مشاكل الـ Multithreading ... وبعد أن عملت على بيئات تعطيك الفرصة للتركيز على ما تريد عمله وليس ان تفتح لك قضية جدل بيزنطية في كيف تضع نموذج لإدارة ذاكرة برامجك ... وكذلك التركيز على تصميم ما تريده من واجهة للبرنامج وليس كيف تصمم GUI Control ظلت معشوقتي الأولى في بالي ... وظللت أحاول الرجوع إليها حيث أن لغة جافا وبيئة دوت نت كالحلم ... ولكن ما أن تواجه الحاجة إلى شيء صغير جدا وسريع جدا ... تجد نفسك تتمنى ان تكون Native وليست MSIL أو ByteCode وفيها تعليمات على مستوى وحدة الذاكرة الأساسية .... فهي اشبه بقناع ولكن c , c++ تتكلم بلغة الجهاز الفعلية وتتعامل مع شرايينه واعصابه بشكل فعلي وليس لعبة للأطفال دون 3 سنوات!!

حسب عنوانك في الموقع اتوقع انك قد فهمت المغزى من سطور البرنامج ... وهي وضع جدول في الذاكرة بكل Object أريد متابعته آليا دون العناء بل وأي متغير يشير إليه كذلك وجميع الـ Children Objects

أعرف أنه بإمكاني ضبط الكود ليقوم بهذه العمليات بشكل يدوي Delete وهو ما أقوم به حاليا ... ولكن واجهتني حالات مثل برنامج كنت اعمل عليه في لغة Java لقراءة XML ونشر الـ Nodes الخاصة به كـ Linked List .... حاولت تنفيذه بلغة C++ ولكن صار معقدا بما يكفي ولم يكن الـ Destructor هو الحل ...

كذلك هناك مفاتيح لكل لغة ... فلم أعلم وقتها انني عندما أُلغي Object يجب ان اضع في المؤشر الخاص به NULL أو صفر لضمان عدم انهيار البرنامج لدى محاولته إلغاء Object قد تم إلغاؤه سابقا

في لغة C++ أشعر بأن هناك تعديلا خفيفا يجب ان يتم على الـ Pointer Syntax بحيث يتم تعريف الـ Pointer بالشكل المعتاد مثلا :

Point * pnt1,pnt2;

ولكن عند استخدامه يجب ان تكون :

pnt1.x = 100;

pnt2.y = 100

[left/]

بدلا من

(*pnt1).x = 100;

pnt1->y = 100;

وكنت احاول نسخة معدلة من الـ Compiler لعكس الرمزية الخاصة بالتعامل مع الـ Pointers ولكن هو أشبه بتغيير التخصص!!

في نهاية طرحي الصغير هنا ... لا زلت اشعر بأن C++ ولا شيء سواها يستحق ان يكون مميزا وأن من لا يعرف الكثير عنها فهو لا يعرف معنى علم الكمبيوتر ... من الجيد ان نعرف جافا ودوت نت وSQL وبايثون ولكن كمن يتقن لغة ثانية غير لغته الأم :)

تحياتي وبانتظار فيضك !!!

بالمناسبة ما معنى deterministic هنا؟

تم تعديل بواسطه sanousy.howari
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي خالد ... لقد اعدت قراءة ردك ... واعتقد بأنك تمتلك معلومات ممتازة فهلا تشاركني بها بخصوص ادارة الذاكرة في C++ ... وأرجو ان لا تكون وظائفي المتعددة قد ضيعت علي الكثير في C++!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي للأسف عندما تأتي بأسلوب لتطبقه في ++C يتعارض مع أساليبها المجربة, فأنت تخذل نفسك قبل أن تخذل اللغة. ربما هناك بعض الأمور المزعجة في السابق و لكن مع Cpp11 فأنا لا أرى إلا جوانب معينة لم تتكلم عنها حضرتك مثل عدم توفر module system حقيقي. أنصحك بمشاهدة هذه المحاضرات فهي لـ Herb Sutter النار على علم :)

http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-835T

http://channel9.msdn.com/Shows/The+Knowledge+Chamber/C-A-Language-for-Modern-Times

http://channel9.msdn.com/posts/C-and-Beyond-2011-Herb-Sutter-Why-C

http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/-Not-Your-Father-s-C-

تم تعديل بواسطه Khaled.Alshaya
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

كتابة GC ليست بالأمر البسيط لإنك تحتاج لأن تكون على دارية بالعديد من المفاهيم أهمها قدرات اللغه نفسها - ++C فى هذه الحاله.

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

Memory Management Algorithms and Implementation in C++

Garbage Collection Algorithms For Automatic Dynamic Memory Management

أيضا يمكنك البحث داخل جوجل عن مقالات تخص الـ GC للـ Byte Code Languages مثل Dot Net او Java: إستخدم الكلمه dot net GC in depth.

يمكنك ايضا تحميل كود الـ CLR و التى تحتوي على كود الـ VM.

ايضا يمكنك تحميل مكتبة Dot Net Micro Framework و الموجهه للـ Embedded Devices و تحتوى على كود VM مكتوب بالـ ++C أحد أجزائه بالطبع Memory Manager بسيط و سريع ليتناسب مع طبيعة الأجهزة التى ستعمل عليها.

أيضا ابحث داخل Sourceforge.net و codeplex.com على مشاريع GC موجهه للـ ++C و ستجد العديد بإذن الله.

و الله ولي التوفيق

3

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

احترت ماذا اقول ... وما مدى استفادتي من الردود ... توقعت ردودا مختلفة ... ولكن الأكيد: شكرا لاهتمامكم :)

سأرجع للموضوع لاحقا لتقييم ما قدمته بالنسبة إلى ما حصلته من تفاصيل أدق فيه ...

تم تعديل بواسطه sanousy.howari
-1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

أنا قادم من بيئة جافا و دوت نت ... والأمور سهلة فهيا بس في c++ كل بايت تقوم بحجزه في الذاكرة أنت بحاجة إلى إلغاؤه ...

هذا صحيح, و لكن ليس كل شيء يدوياً. كل مساحة تقوم بحجزها لابد أن تعيدها لكي يكون برنامجك well-formed و لكن عندما تبرمج في ++C بشكل سليم عملية الحجز و الإعادة أتوماتيكية و ليست يدوية.

كانت هناك دائما مشاكل الـ Multithreading

وضح أكثر لو سمحت؟! كل المترجمات التي عملت عليها تأتي بـ thread-safe run-time libraries. و يمكن التحويل إلى النسخة الغير آمنة و لكن النسخة الافتراضية هي الأولى في كل المترجمات التي استخدمتها, حتى قبل Cpp11.

كيف تضع نموذج لإدارة ذاكرة برامجك

مثل الخوارزمية, إدارة الذاكرة تعني انتقاء الـ data structure و ليس المقصود هو الـ new/delete pair. يقال أن وجود delete في كودك يعني أنك لا تعرف ++C أصلاً.

كذلك هناك مفاتيح لكل لغة ... فلم أعلم وقتها انني عندما أُلغي Object يجب ان اضع في المؤشر الخاص به NULL أو صفر لضمان عدم انهيار البرنامج لدى محاولته إلغاء Object قد تم إلغاؤه سابقا

غير صحيح, إذا كان كودك سليماً فأنت لا تحتاج إلى وضع NULL أو null_ptr لكل مؤشر بعد إعادة المساحة التي تم حجزها عن طريقه. هل ترى هنا المشكلة؟؟ لماذا تستخدم المؤشرات؟ هذه هي المشكلة أنك تفكر بعقلية الـ by reference في لغة by value بامتياز! خذ المثال التالي, عبارة عن in memory database باستخدام multi_index للتوضيح فقط مع الـ indecies و لن ترى مؤشراً واحداً في المثال؟ لماذا؟ أترك لك البحث!

Maintaining a unique set of elements on different criteria C++ STL

بالمناسبة ما معنى deterministic هنا؟

تعني أنك تعرف تماماً متى سيتم حجز الذاكرة و متى سيتم إلغاؤها, و هذا يعني ربط الـ life-time بالـ scope أي عندما تدخل أي scope فإنه يتم حجز الذاكرة و عندما يتم الخروج من الـ scope يتم إلغاء الذاكرة. لماذا برأيك تحتاج finally بعد try؟ لماذا استحدثت using في #C؟ في ++C هناك RAII و هو اسم مخيف لفكرة أكثر من رائعة لإدارة جميع الموارد "بما فيها" الذاكرة.

تحياتي...

تم تعديل بواسطه Khaled.Alshaya
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخي خالد ... لا أعتقد انه يوجد بيني وبينك شيء شخصي لترد علي بهذا الاسلوب ...

أما اذا كان هذا هو اسلوبك فأنا اقترح ان تقوم بإلغاء ردودك وترك المجال لآخرين لتوصيل المعلومة بشكل لائق رجاءا!!

فأنا لم افهم منك شيئا ... من بين الإهانات والتجريحات المدرجة في ردودك فقط ارتفع ضغطي واحبطتني جدا ...

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

أم فقط بأسنا على بعضنا شديد ؟؟

اسمحلي اقوللك ان خيرك للأجانب وانك متكبر و اسمحلي اتفل من فوق كتفي الأيسر ...

أخي للأسف عندما تأتي بأسلوب لتطبقه في ++C يتعارض مع أساليبها المجربة, فأنت تخذل نفسك قبل أن تخذل اللغة

اسلوب .. لست الوحيد ممن يبحث في هذه المواضيع وهناك الكثير ممن يضيعون وقتهم في تحسين C++ والارتقاء بها لتصبح اسهل ...

أخي العزيز يصعب التعليق على كل نقطة ذكرتها لأنها نقاط عامة جداً

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

وضح أكثر لو سمحت؟!

يعني انني واجهت مشاكل في Thread ... مع Object تم الغاؤه في Thread آخر ... وقد يكون لقلة خبرتي في اللغة تحديدا ...

يقال أن وجود delete في كودك يعني أنك لا تعرف ++C أصلاً

غير صحيح ... وإلا لو كان هذا صحيحا فلماذا وضعوها ...

http://www.cplusplus.com/forum/general/22889/

يعني انت عارف غير عن كل الناس طريقة ما تستخدم فيها Pointers وNew و Delete إذن ليش كل الدنيا بتسأل عن الموضوع وبتتعلمة؟؟؟

غير صحيح, إذا كان كودك سليماً فأنت لا تحتاج إلى وضع NULL أو null_ptr لكل مؤشر بعد إعادة المساحة التي تم حجزها عن طريقه

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

هذه هي المشكلة أنك تفكر بعقلية الـ by reference في لغة by value بامتياز!

كيف؟ ... وحتى المقالات التي أقرأها في النت تحث على استخدام Reference في C++ والأجانب اصحاب اللغة!! وC++ ليست By Value فقط بل يمكن ان تعمل Call by Reference حتى يمكن استعمال عنوان الدالة لاستدعائها من خلال Pointer أو ما يسمى بالـ Late Binding!!

كذلك التعبير يدل على نوع من التعالي على من يتعاملون بهذه اللغات؟؟

هناك RAII و هو اسم مخيف لفكرة أكثر من رائعة لإدارة جميع الموارد "بما فيها" الذاكرة

مخيف؟؟ وأشهر من نار على علم ومش ناقص إلا المزيد من التعابير (المحلية) ...

تم تعديل بواسطه sanousy.howari
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

سيتم نقل الموضوع إلى قسم ++C.

@sanousy.howari: لماذا كل هذه الحده، هدئ اعصابك و لا تأخذ الكلام بمعني غير لائق.

نظام عمل لغات الـ Byte Code مختلف جدا عن نظام عمل اللغات الـ Native - و أقصد هنا الـ runtime و ليس كيفية عمل المترجم - و بالتالي عندما ترى فكره ما فى لغة الجافا - مثلا - لا تفكر فى اخذها كما هي لتطبقها داخل لغة ++C لإنك و بكل تأكيد ستجد صعوبه كبيره أولا لإن كلا اللغتين له نظام عمل مختلف عن الأخر و ثانيا لأن لغة الجافا لها حدود ضخمه جدا جدا مقارنة بالـ ++C و ثالثا لإن الإمكانيات التى يقدمها لها مترجم الـ ++C أكبر بكثير مما تتخيل لذا قم بدراسة لغة ++C جيدا و اعرف حدود اللغه بالإضافة للمكتبات المساعده و لا مانع من الإطلاع على مكتبات موجوده فى نفس المجال الذى تريده و بعدها ابدء فى تصميم نسختك الخاصه.

الفقره السابقه هي تفصيل لجملة خالد التاليه:

أخي للأسف عندما تأتي بأسلوب لتطبقه في ++C يتعارض مع أساليبها المجربة, فأنت تخذل نفسك قبل أن تخذل اللغة
الموضوع إدارة الذاكرة ... وGC بسيط جدا ... والنقاط هي شرح لوجة نظري وليست سجالا ولا حربا يا أخي!!

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

يعني انني واجهت مشاكل في Thread ... مع Object تم الغاؤه في Thread آخر ... وقد يكون لقلة خبرتي في اللغة تحديدا ...

عندما تستخدم نفس الـ object من خلال أكثر من thread لابد و ان تستخدم Critical section او Mutex.

غير صحيح ... وإلا لو كان هذا صحيحا فلماذا وضعوها ...

أنظر لهذا الكود:


int main()
{
int *iptr = new int [1024];

for(int i=0; i<1024; ++i) iptr[i]=i;

//delete iptr;
}

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

اغلب البرامج تقوم تستخدم Memory Pool و هو يكون المسئول عن إدارة الذاكره و كل ما تحتاجه هو ان تقوم بإستدعاء دالة new للحجز و عملية التحرير تتم بشكل تلقائى منه (هذه احد مهما الـ GC و الـ Handles المتضمنه داخل الـ Pool).

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

"إذا كان كودك سليماً فأنت لا تحتاج إلى وضع NULL أو null_ptr لكل مؤشر بعد إعادة المساحة التي تم حجزها عن طريقه" هذا صحيح 100% و لا اعرف اين توجد الإهانه هنا، السبب الوحيد الذى يجعلك تضع قيمة المؤشر بـ NULL هو معرفتك انك ستحتاج لإستخدام ذلك المؤشر بمكان أخر و تحتاج لمعرفة هل يحتوى على قيمه او لا و هنا تضع NULL داخله كـ signature لمعرفة ان هذا المؤشر لابد من وضع قيمه به.

كيف؟ ... وحتى المقالات التي أقرأها في النت تحث على استخدام Reference في C++ والأجانب اصحاب اللغة!! وC++ ليست By Value كذلك التعبير يدل على نوع من التعالي على من يتعاملون بهذه اللغات؟؟

نعم المقالات تحث على إستخدام الـ Reference عند تمرير المعاملات للدوال و ذلك لحجز مساحه اقل و ايضا ليكون الكود داخل الداله pretty حيث لا تحتاج لعمل dereference للمؤشر و بالتالي تستخدم معامل الدوت بدلا من الـ arrow.

لغة الـ ++C تحتوى على الأنماط الثلاثه لتمرير المعاملات By Value و By Reference و By Pointer و لكل واحد استخدامه و وظيفته التى احيانا لا يمكن حل مشكلة ما بدونه.

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

مخيف؟؟ وأشهر من نار على علم ومش ناقص إلا المزيد من التعابير (المحلية) ...

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

و الله ولي التوفيق

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا يا أخي وقد قرأت ما كتبت بدقة واعلم أن Delete في آخر البرنامج لا داع لها ولكن قلي انها يجب الا تستعمل داخل لعبة أو داخل كنترول Gui أو عمليات اعادة رسم Graphics أو غيره ... مستحيل ماذا يقول ... ولو كان فيه خير لكتب موضوعا متكاملا يبين فيه وجهة نظره لا ان يتهكم على الآخرين ويلدغهم بكلمات جارجة وكأنه هو الوحيد الذي يفهم ؟؟؟

ولكن انا اريد الآن شيئا واحدا ...

أريد إلغاء اشتراكي ومشاركاتي من هذا المنتدى ... وشكرا!!

تم تعديل بواسطه sanousy.howari
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
ولكن قلي انها يجب الا تستعمل داخل لعبة أو داخل كنترول Gui أو عمليات اعادة رسم Graphics أو غيره ... مستحيل ماذا يقول
اغلب البرامج تقوم تستخدم Memory Pool و هو يكون المسئول عن إدارة الذاكره و كل ما تحتاجه هو ان تقوم بإستدعاء دالة new للحجز و عملية التحرير تتم بشكل تلقائى منه (هذه احد مهما الـ GC و الـ Handles المتضمنه داخل الـ Pool).

و تحرير الذاكره هنا يعني إرجاعها إلي الـ Pool و ليس إلي نظام التشغيل.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

افعلوا ما تشاؤون في منتداكم وفي لغتكم ... وفي تفسير معانيكم الخاصة سأعود للمنتديات الغربية فنحن بأسنا بيننا شديد!!

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

Khaled.Alshaya بتزاكر من ورانا !!!! :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

بالهداوة يا جماعة :)

أخي sanousy.howari, لا داعي لمغاردة المنتدى .. لا تأخذ الأمور بهذه العصبية :)

خالد الشايع, محمد علاء الدين, العبارة تُحسن و تُخشن .. أسلوب الكلام مهم جدا في التأثير على نفسية المتلقي.

... لا داعي لكل هذه النقاط السلبية -1 !

متى سنرى حوارا ناضجا بن المبرمجن العرب ؟؟ :)

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخ sanousy.howari, لماذا كل هذه الضجة؟ أنا لا أشارك هنا حتى أهين أحداً, و حتى المشاركة التي تشتكي منها لم أجرح و لم أقصد أصلاً أن أجرح فيها أي شخص و لا أستطيع جرح أي شخص.

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أخ sanousy.howari, لماذا كل هذه الضجة؟ أنا لا أشارك هنا حتى أهين أحداً, و حتى المشاركة التي تشتكي منها لم أجرح و لم أقصد أصلاً أن أجرح فيها أي شخص و لا أستطيع جرح أي شخص.

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

بارك الله فيك أخي خالد

وفيت و كفيت بتعاملك الراقي

تم إيقاف sanousy.howari

90 يوما عن المشاركة

===

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .