Saturday, February 20, 2010

الأداة ServerService


عن الحزمة

تم تصميم هذة الأداة لضمان اداء جيد بكلفة معقولة في مسألة التعامل مع الإتصالات الواردة للخادم وقراءة طلبات العملاء
هذة الأداة عبارة عن بنية تحتية infrastructure لبرامج الخادم servers , وظيفتها الأساسية هو التنصت على طلبات الإتصال القادمة للعتاد الذي تعمل علية , ومن ثم تمرير الطلبات requests القادمة من كل عميل الى واجهة خارجية .
البنية الداخلية :
تستخدم الأداة داخليا 2 threadsفقط , تتزامنان على طابور دائري circular queue
1- تقوم الاولى A بالتنصت على الإتصالات القادمة للعتاد , ووضع كل اتصال جديد في ذيل الطابور الدائري (وهو الموضع الذي يلي اجدد اتصال مفترض).
2- تقوم الثانية B بمسح الطابور بحثا عن اتصال مغلق وتزيلة من الطابور .في حالة وجود اتصال غير مغلق , تقوم بقرائة جميع البيانات الواصلة عبر قناة الإتصال دفعة واحدة , ومن ثم تمررها للواجهة الخارجية.
تستمر العمليتان 1 و2 حتى يتم استدعاء الدالة الخاصة بالإغلاق , حيث يتم اغلاق جميع الإتصالات السابقة , وانهاء التنصت للإتصالات الجديدة , وتحرير جميع الموارد المستخدمة (لا تتضمن موارد الواجهة الخارجية).
الواجهة الخارجية:
وهي من نوع AbstractTask class , هذة الواجهة الخارجية تعمل في الخلفية Background process لمعالجة الطلبات وارسال الردود responses . ولذلك هي مسؤولة عن البروتوكول التخاطبيApplication protocol بين الخادم و العميل.
هذه الواجهة تحتوي على دالتين :
processLater(Message) وهي دالة صلبة concrete
process(Message) وهي دالة مجردة abstract
تستخدم الدالة الأولى لأستدعاء الثانية بشكل غير متزامن Asynchronous
في هذة الأداة يتم استخدام الدالة الأولى لتمرير طلبات العملاء requests حيث يتم معالجتها بشكل منفصل وغير متزامن مع البنية الداخلية للخادم.
اوجة القصور في الأداة:
1- يضطر العميل للإنتظار بينما يتم خدمة عميل أخر.
بسبب استخدام thread واحدة فقط للتنصت على requests فإن كل عميل قد ينتظر مدة اقصاها m * (N-1)
حيث أن N هي العدد الكلي للعملاء و m هي المدة الزمنية المستغرقة لخدمة عميل واحد (استيعاب طلبة وتمريرة للواجهة الخارجية).
نستطيع حساب m بطريقة تقريبية عبر حساب الفرق بين قيمة System.currentTimeMillis() في اللحظة التي يتم فيها معرفة أن الاتصال غير مغلق , واللحظة التي يتم فيها الإنتهاء من تمرير request الخاص بذلك الإتصال للواجهة الخارجية.
وبعد القيام بحساب هذة القيمة اكثر من مرة اتضح الاتي:
عند تشغيل الخادم لأول مرة وخدمة اول اتصال m=31ms
بعد ذلك وعند الطلب الثاني نزلت قيمة m الى 0 وظلت هكذا .
(على المستخدم أن يقوم بتجربة الأمر بنفسة )
يمكن تفسير القيمة العالية لm في البداية هو أن الواجهة الخارجية تستخدم لأول مرة .
(راجع البنية الداخلية لAbstractTask ) .
طبعا m=0 هي قيمة تقريبية وبالتأكيد ليست صفرا مطلقا وإنما تدل على أن المدة المستغرقة لخدمة عميل واحد هي اقل من 1ms (اقل من واحد مللي ثانية) .
إذا افترضنا أن m تساوي 0.5 مللي ثانية, فمن للمكن حساب اقصى مدة قد يستغرقها العميل بينما يتم خدمة عميل اخر من العلاقة *m(N-1):

عدد العملاء    اقصى مدة تأخير (ثواني)  
0.49                          1000

4.9995                    10,000 


49.9995                 100,000 
ستلاحظ أن التأخير المحتمل في حالة خدمة مائة الف عميل في نفس الوقت غير مقبولة حيث انها في اقصاها اقرب لخمسين ثانية كاملة.
في الواقع و من الناحية العملية فإن المدة الزمنية هي اقل بكثير , ولا تتحقق كما في الجدول الا عندما يكون الحوار مع كل عميل يتضمن اكثر من طلب واحد, وواقع ان العميل عادة ما يقضي وقتا في معالجة البيانات القادمة من الخادم اكبر بكثير من الوقت الذي يقضية في تكوين الطلبات, يجعل متوسط مدة التأخير في استيعاب الطلبات اقرب لقيمة m (0.0005 ثانية). مهما كان عدد العملاء .
هذا يعني ان القيم في الجدول ممكنة possible , ولكن غير محتملة unlikely
اذا كنت تعتقد أن مسألة التأخير هذة مؤثرة بشكل غير مقبول بالنسبة للخادم الذي تريد أن تنشأة, فلا تستخدم هذة الأداة (على الأقل في نسختها الحالية).
بقية اوجة القصور متعلقة – بشكل او بأخر – بالواجهة الخارجية حيث انها مسؤولة عن اكثر من 50% من الأداء النهائي للخادم.
نصائح للواجهة الخارجية:
الكود الذي ستكتبة هنا في الواجهة الخارجية ( للدالة process()) هو الذي سيحدد فعالية خادمك النهائية.
تلك الدالة سيتم استدعائها بشكل متتالي مع طلبات العملاء , وهذا لايعني أن تقوم بمعاجة هذة الطلبات بشكل متتالي ايضا ,نصيحتي هي أن تبتعد عن المعالجة المتتالية وتستخدم حوض خيوط fixed thread pool ثم تقوم بتمرير كل طلب للحوض حيث يتم معالجة كل طلب بشكل منفصل.
الفائدة من هذة الطريقة , بغض النظر عن السرعة , فهي ستمكنك من معالجة الطلبات القادمة من نفس قناة الإتصال بشكل متوازي. وهذة ميزة من الصعب اضافتها للخوادم التي تستخدم thread لكل عميل لأنها مكلفة .
قد تقول ماذا لو ارسل العميل طلبات كثيرة وقام بشغل اكثر من thread ؟
واللة هذا – وامور اخرى كثيرة مثل من سيغلق الإتصال انا ام العميل – راجع لك وللهدف من الخادم والبروتوكول الذي تستخدمة .
نقطة أخيرة : قناة الإتصال مع العميل هي للطلبات requests والردود response فقط , يعني خاصة بالبروتوكول التخاطبي بين العميل و الخادم . لا تستخدمها لنقل البيانات الثنائية.
في حالة الحاجة (كإستلام طلب من العميل لرفع ملف مثلا (, قم بإنشاء إتصال جديد مع جهاز العميل واستخدمة لنقل البيانات. (تماما مثل بروتوكول FTP حيث يتم إستخدام قناتي اتصال مع كل عميل, واحدة للأوامرcommands وواحدة للبيانات ).

الأداة NetworkService (بنفس إسم الحزمة)


عن الحزمة

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

البرنامج الذي يستخدم هذة الأداة يصبح عميلا قادرا على تتبع بقية العملاء عبر الشبكة ومن ثم تبادل البيانات معهم بإستخدام بروتوكول UDP وTCP على السواء.

عوضا عن سهولة الإستخدام , فهذة الأداة لا تستهلك موارد الجهاز او الشبكة بشكل كبير مما يجعلها مناسبة للخدمات التي تعمل في خلفية الجهاز ولساعات طويلة وكذلك تطبيقات المستخدم العادية.
يمكن إستخدامها في تطبيقات server-client المختلفة , من برامج المراسلات او المحادثة و التحكم بالأجهزة عن بعد (لمقاهي الانترنت والشبكات الخاصة)وغيرها.















الحزمة NetworkService


عبارة عن حزمة ادوات برمجية بلغة Java خاصة ببرمجة الشبكات من تصميمي.
وهي ادوات عامة الهدف منها تسهيل مسألة التعامل مع sockets و threads في برامج الشبكات المكتوبة بلغة Java


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


اهم مكوناتها :


class NetworkService (بنفس إسم الحزمة)


class ServerService


اخر اصدارة من الحزمة 1.0.0.0.1 للتحميل

Friday, February 12, 2010

قالوا لي تحدث عن بلدك





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


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


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


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


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


الأحد 2006\9\24

في الظهيرة



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

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

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


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

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


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

رغم النقود القليلة التي كانت تحصل عليها ..لم تمد يدها لأحد يوما..رفضت جميع من تقدموا لخطبتها رغم المحاولات المتكررة لإقناعها من بعض نسوة الحارة.
سمع ذات يوم ..الحجة "مريم" –جارتهم العجوز – وهي تجلس بجانب أمة في ساحة البيت واضعة يدها على ركبة أمة تهمس "يا بنتي عادك صغيرة..!" .. يومها سمع أمة تقول "أجيب لعيالي زوج أم يعذبهم!.."
عرف لاحقا أن المرآة العجوز جاءت بإبن أخيها "المُطلّق" خاطبا . وأمه رفضت.

عندما بلغ السادسة عشرة كثيرا ما حاول إقناعها بأن يتوقف عن الدراسة ويبحث عن عمل ليساعدها..كانت
ترفض...بصوت المراهق الأجش يقول "أنا رجال البيت..!" ..عندها كانت تبتسم وتمسح بيدها الحانية على رأسه وتقول "أنت سيد الرجال... إذا تحبني كمَل دراستك..!" ..
رغم تعليمها المتوسط ..كانت تقدس العلم..
عبارة "نفسي أشوفك مهندس قد الدنيا..!"كثيرا ما رددتها على مسامعه..
........
أفاق من شروده على صوت "المُباشِر" يسأله ماذا يطلب..لم يجيبه..

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

الاثنين..2007/1/22