التطور الطبيعي للمبرمج: العام السادس

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

بفضل الله هذا هو العام السادس للإجابة على سؤال ماهو التطور الطبيعي للمبرمج والذي طرحته عام 2011.

عام 2015 كان مثل سابقه فيه توجه أكثر للإدارة مع اﻹستمرار في تطوير البرامج والإشراف على بعضها، مع زيادة التركيز على تسويق بعض منتجاتنا.

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

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

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

بعد ذهابي للجامعة في بداية عام جديد لم أجد أحد من الخريجين الجدد، لكن اقترح علي بعض اﻷساتذة أن أقوم بطرح مشروعات تخرج واﻹشراف عليها، وبهذه الطريقة أكون اكثر قرباً للخريجين لفترة تمتد قرابة العام، فقمت بذلك واقترحت مشروع متعلق بمنصة اﻹتصالات Asterisk وقمت فعلاً بالإشراف على هذا المشروع وقد قمت بإرشاد الطلاب لكيفية البداية وطريقة عمل ذلك المشروع، والجدير بالذكر أن اﻹشراف لم يأخذ مني وقت طويل، فقد كانوا -بفضل الله- من الطلبة المجتهدين والمعتمدين على أنفسهم في التعلم، وكانت لديهم خبرة برمجية معقولة قبل بدايتهم لهذا المشروع، وقد استفدت منهم بعد أن اسخدموا تقنيات جديدة لم أكن استخدمها في Asterisk. لذلك كانت اﻹستفادة للطرفين، كذلك قررت اﻹستمرار في طرح مشروعات تخرج ومتابعتها لإفادة الطلبة والجامعة ولكي أستفيد أنا أيضاً من الطلبة ومن الجامعة. كذلك فقد تابعت بعض المشروعات اﻷخرى التي لم أكن اشرف عليها فقامت الجامعة بتعيني قارئاً لأبحاث مشروعات أخرى، فكان هذا العام به نوع جديد من المهام الأكاديمية، وقد كانت مهمة شيقة وقد حدثت تغييرات كثيرة في طريقة كتابة البحث، وطريقة تقديم المشروع مما اعتد عليه قبل عشرات الأعوام. وأرى أن يكون هناك تمازج بين المجتمع العملي واﻷكاديمي حيث أن كل واحد منهما يكمل اﻵخر، كذلك فهي طريقة لأداء ضريبة التعليم لكل شخص تخرج من جامعة أن يعود إليها بعد اكتساب الخبرة، يمكنه أن يعود للتدريس أو للإشراف ومساعدة الطلاب في مشروعاتهم المختلفة. أو حتى لو عاد إليها لدراسة الماجستير او الدكتوراه فهذه يمكن أن تُعتبر إسهام في مشروع التعليم في الجامعة. ومن الجدير بالذكر أن هُناك نقص ليس بهين في هذه المهام الإشرافية بسبب قلة اﻷساتذة أو لإنشغالهم بمهام كثيرة أو لقلة خبرتهم العملية، فتقوم الجامعات بالتعويض ن هذا النقص بزيادة أعباء اﻷستاذ الواحد بتكليفه بعدد كبير من المشروعات، وهذا بالتأكيد يقلل من نوعية المشروعات.

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

بالنسبة لتطوير البرامج فمازلت اعمل على بضع مشروعات متنوعة التقنيات: حيث تتضمن خدمات ويب وبرامج ويب وبرنامج سطح مكتب وهو نظام الحسابات المالية. اﻹستمرار في تطوير البرامج يدفع إلى تعلم تقنيات جديدة واستخدام طرق أفضل، لذلك كان أحد النواتج هو كتابة ونشر اﻹصدار الثاني من كتاب رحلة استكشافية للغة البرمجة جافا، حيث قُمت بالتركيز هذه المرة على الملفات وسلاسل البيانات streams وطرق التعامل المختلف معها بعد أن صارت أوضح بالنسبة لي بعدما استخدمتها مؤخراً بصورة مكثفة في البرامج المختلفة. كذلك كتابة البرامج هي أداة ممتازة لكتابة أوراق جديدة ومقالات عن التصميم وهندسة البرمجيات، حيث لا أريد أن أكتب مقالات عن شيء لم أجربه ولم ينجح عميلاً، لذلك كما قلت سابقاً لابد من المزج بين المجال العملي واﻷكاديمي أو العلمي.

في الآونة اﻷخيرة أصبح لدي شغف حول الشبكات بدأت بمشكلة في أحد برامج الويب التي طورناها حيث حدث اختناق في الشبكة، فقمت بشراء كتاب عن الشبكات اسمه the art of computer networking وهو كتاب رائع تكلمت عنه في تدوينة سابقة. لكن هذا العام طلب مني المبرمجون أن أقوم بتدريسهم الشبكات بشكل عملي حيث لايرغبون في حضور كورس أكاديمي مطول وهم لديهم خبرة جيدة في الشبكات لكنهم يريدون تطويرها، فقمت بعقد ورشة ليوم واحد تجمع بين العملي واﻷكاديمي، حيث قمنا بتغطية مفهوم الشبكات وطبقات الـTCP  والفرق بين البروتوكولات المختلفة، و وظيفة كل طبقة، ثم قمنا بعمل تجارب عملية إبتداءً بتوصيل جهازين بكيبل، ثم استخدام switch للربط بين اﻹجهزة ثم استخدام router وربط أكثر من شبكة وعمل NAT و port forwarding، ثم انتهت عن الكلام عن الـ socket وعمل تجارب محادثة بين جهازين.

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

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

إعادة استخدام الكود

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

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

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

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

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

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

المستوى الثاني: الوحدات والمكتبات: وهي كتابة وحدة أو مكتبة كاملة بطريقة مجردة ليس فيها أي ارتباط بوحدات خاصة في مشروع معين ، فيتم كتابتها بصورة عامة ليتم استخدامها في أي مشروع، ويوجد نوعان: النوع اﻷول هي الوحدات المصدرية الخاصة بلغة برمجة معينة، مثل header files في لغة سي، و units في لغة باسكال، وclass library في لغة جافا: في هذه الحال يحتاج المبرمج المستفيد من هذه الوحدة لمصدر هذا الكود ليقوم بتضمينه داخل البرنامج المستفيد، وفي حالة إنتاج برامج طبيعية Native يتم تضمين هذه الوحدات داخل الملف التنفيذي. النوع الثاني: وهو استخدام مكتبة، حيث تتم ترجمتها إلى مكتبة بصورة ثنائية حسب نظام التشغيل ويتم استدعائها بصورة خارجية من أي برنامج، ويتم الربط في وقت التنفيذ ولا يتم تضمينها ضمن الملف التنفيذي للبرنامج المستفيد. هذا المستوى يحقق إعادة استخدام الكود بأفضل الطرق، حيث يمكن الإستمرار في تطور تلك المكتبات بصورة منفصلة، أحياناً يكون المطور لهذه المكتبات طرف ثالث كما يُسمى هدفه هو فقط تطوير هذه المكتبة، وكمثال لها: مكتبات التشفير، والربط مع قواع البيانات، أو الربط مع البريد. أما المبرمجون فيقومون بتحميل هذه المكتبة سواءً في شكل ملف مصدري أو ثنائي لإستخدامها في برامجهم المختلف. وهي تُمثل أعلى درجات التجريد وذلك حسب نجاحها في اﻹستخدام في أغراض مختلفة. يُمكن استخدام هذه الطريقة كذلك لتقسيم المشروع الواحد إلى عدة أقسام : قسم متخصص في إجراءات البيانات، وقسم آخر للربط مع اﻷنظمة اﻷخرى، وقسم  متخصص في واجهة المستخدمة، وبذلك يمكن إيكال كل مبرمج لتطوير جزئية معينة بناءً على تخصصه والمجال الذي يتميز فيه. من عيوب هذا المستوى هو الحاجة لإعادة ترجمة كل البرنامج التي تستخدم تلك الوحدة في حال تغيير صفة ما في احد اﻹجراءات، أما إذا كان التغيير في صفة في مكتبة تم ربطها خارجياً فلا تتطلب إعادة الترجمة إلا إذا تم تغيير واجهة نداء اﻹجراء procedure interface.

المستوى اﻷول: اﻹجراءات البعيدة، مثل خدمات الويب: ومن أهم أشكالها خدمات ويب يمكن نداءها من أي برنامج مكتوب بأي لغة برمجة. ويتم نداءها تُستخدم هذه الطريقة لربط اﻷنظمة مع بعضها البعض. ويتم توفير الإجراءات بصورة حية online من أي برنامج مستفيد، كذلك يتم تعديل ويتم تطوير اﻹجراءات في هذه الخدمات دون الحاجة إلى إعادة ترجمة البرامج المستفيدة، واحياناً لا نحتاج حتى لإغلاق تلك البرامج، بل  لا يتم إخبار مطور البرنامج المستفيد بهذه التغييرات في بعض اﻷحيان. وتُمسى هذه الطريقة بنداء اﻹجراءات البعيدة و تصبح خدمة الويب هذه مورد تتم صيانتها ودعمها من قبل جهة أخرى أو مبرمج آخر مسؤوليته هذا الإجراء. هذه الطريقة تمثل نقطة مركزية حية لكافة البرامج، فإذا تم أي تعديل لا نحتاج لإعادة ترجمة كما في المستوى الثاني. وهو يُمثل البرمجة متعددة الطبقات، ويحقق سرية وعزل كبيرين في تطوير البرامج – وهذا موضوع آخر ليس ضمن حديثنا اليوم- إلا أنه أقل تجريداً من المستوى الثاني، حيث أن مطور خدمات الويب لا يكون طرف ثالث في معظم اﻷحيان، بل هو مطور النظام الذي نريد التخاطب معه، كذلك فأن خدمات الويب لا تُمثل إجراءات عامة، بل هي خاصة بمؤسسة معينة يتم تطوير خدمة الويب لها فقط، أو يمكن أن تكون خاصة بمشروع معين يتم تطويرها لصالح هذا النظام فقط، مثل أنظمة ERP. وبخلاف المكتبات والوحدات في المستوى الثاني فإن خدمات الويب تعتمد على مكتبات أو أجزاء كود خاصة وليست عامة. توجد أشكال أخرى غير خدمات الويب تحقق نفس اﻷهداف لكنها أكثر قدما وأقل استخداماً ومن تقنياتها: CORBA, RMI, COM+

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

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

تلف ذاكرة راسبري باي 2

memory-card

السلام عليكم

بعد حوالي ستة أشهر من استخدام راسبري باي 2 وذلك باستخدامه للنسخ اﻹحتياطي لعدد من البيانات المهمة واستخدامه كذلك كمخدم أقوم بالدخول عليه من الخارج باستخدام اﻹنترنت. قُمت بتثبيت قاعدة بيانات mysql و subversion

لكن في اليوم الثاني تفاجأت بأن البرامج التي قمت بتثبيتها قبلها بيوم والملفات التي قُمت بإعدادها كلها قد رجعت إلى سابق عهدها، فقمت بإعادة تثبيت تلك البرامج والملفات مرة أخرى ثم قمت بإعادة تشغيله، فوجدت أنه رجع لحالته السابقة قبل التثبيت، وكان أحدث ملف يشير تاريخه إلى 1 نوفمبر، أي قبل إسبوعين تقريباً، بعدها تحول كرت الذاكرة للقراءة فقط. لكن الغريب أنه يقبل التغيير، حيث يمكنك تثبيت أي برنامج، مثلاً mysql ثم إعداده وتشغيل قاعدة بيانات به والكتابة فيها، وكتابة ملفات جديدة ولا يحدث أي خطأ أثناء ذلك، لكن إعادة التشغيل تلغي كل هذه التعديلات ويرجع إلى يوم 1 نوفمبر.

بحثت في اﻹنترنت ووجدت أن هذه المشكلة شائعة وأن ذاكرة الـ SD card تتلف بكثرة الكتابة عليها، حيث أن نظام التشغيل يقوم بالكتابة بصورة مستمرة مثل ملفات الـ log، وقد كان يعمل الجهاز كمخدم طوال ستة أشهر دون توقف. قمت بعدها بإستبدال كرت الذاكرة القديم بذاكرة جديدة ذات سعة 32 قيقا، على اﻷقل لدي ستة أشهر أخرى حتى تتكرر هذه المشكلة أو نعرف أصلها وتفاصيلها بالضبط. في هذا الرابط وجدت نصائح لإطالة عمر الذاكرة بعمل بعض الإعدادات لتغيير مسار الدليل الموقع /tmp مثلاً إلى ذاكرة الرام بدلاً من كرت الذاكرة الخارجية، كذلك اﻹستغناء عن الـ swap file وتغيير مسار الـ log إلى الذاكرة المؤقتة أيضاً، لكن هذا لم ينجح مع كل البرامج، على العموم هذا هو الرابط لأخذ الفكرة العامة:

https://raymii.org/s/blog/Broken_Corrupted_Raspberry_Pi_SD_Card.html

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

حاولت عمل فورمات لهذه الذاكرة في اللابتوب وفي الكاميرا، لكن دون فائدة، في النهاية ترجع نفس ملفات يوم 1 نوفمبر، فكأنما توقف الزمن لهذه الذاكرة عند هذه اللحظة:

damaged-card

خشيت أن يكون القرص من نوع SSD مشابه لذاكرة SD Card ، لكن أتمنى أن تكون التقنية مختلفة، القرص المغناطيسي العادي له سمعة جيدة وأثبت نجاحه في الحفاظ على الملفات لأطول فترة مقارنه بمنافسيه الـ SD Card والـ SSD

كيف نتخلص من النفايات اﻹلكترونية

السلام عليكم

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

lithium-batteries

خلايا بطارية ليثيوم – لابتوب توشيبا

بعد أن قُمت بفك هذه اﻷجهزة المتعطلة لم أعرف كيف اتخلص منها، ولا أذكر بالضبط كيف تخلصت من اﻷجهزة التالفة السابقة، لكن لايزال يوجد لدي عدد منها احتفظ به ولا أدري ماذا أصنع بها وماهو أفضل طريق للتخلص منها.

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

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

 أعتقد أن التنقيب الجديد عن المعادن يجب أن يولي اﻹهتمام بهذا المصدر الجديد – والذي ربما يكون أقل تكلفة- لإعادة تدوير المواد.

التخلص من الجهازالتالف وهو مازال مغلق أسهل من التخلص من جهاز تم فكه وتناثرت أجزاءه الداخلية.

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

الدار السودانية للكتب

السلام عليكم ورحمة اللهaldar-alsudaniya

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

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

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

كُنت أنوي الكتابة عن موضوع بعنوان “الكتب بديلاً للتلفاز” والموضوع يتضمن هذه المكتبة، فأحببت أن أتكم عن المكتبة أولاً في موضوع منفصل نسبة لأهميتها وحتى يكون العنوان فقط يتكلم عن تلك المكتبة

bookshop

.

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

http://wikimapia.org/#lang=en&lat=15.603942&lon=32.530453&z=16&m=b

التجريد في البرمجة

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

التجريد (abstraction) في عالم هندسة البرمجيات من المواضيع المهمة، حيث يحقق عدة أهداف سوف نتحدث عنها لاحقاً بإذن الله في هذه المقالة. لكن قبل أن نتكلم عنها من ناحية برمجية دعونا نشرحها كمفهوم عام للتجريد في حياتنا اليومية.

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

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

في هذه المقالة سوف نقوم بعرض مثال للنوع اﻷخير من التجريد، وهو على مستوى اﻹجراءات. هذا اﻹجراء (بلغة جافا) يقوم بقراءة رسائل مستلمة والتي لم يتم معالجتها بعد من قاعدة بيانات ثم يقوم بوضعها في شكل مصفوفة. وفي المثال هذا اﻹجراء لا يحقق التجريد، حيث أن به بعض التعقيد ويقوم بعمل أكثر من وظيفة: 1 – تجهيز الطلب لقاعدة البينات، 2 – ثم إرسال الطلب، 3- ثم قراءة السجلات ووضعها في المصفوفة:

 

public ArrayList<SMSMessage> getNewMessages(String shortCodeText){

  success = false;
  try
  {
    ArrayList<SMSMessage> messages;
    PreparedStatement statement = connection.prepareStatement("select * from inbox\n" +
    "inner join shortcodes on shortcodes.ShortCodeID = inbox.ShortCodeID\n" +
    "inner join smppconnections on smppconnections.CONNECTIONID = inbox.connectionid\n" +
    "where Lower(shortCode) = ? \n" +
    "and isProcessed = 0");
    statement.setString(1, shortCodeText.toLowerCase());
    ResultSet result = statement.executeQuery();
    messages = new ArrayList<>();
    while (result.next()){

      SMSMessage message = new SMSMessage();
      message.connectionID = result.getInt("connectionID");
      message.operatorID = result.getInt("operatorID");
      message.fromMDN = result.getString("fromMDN");
      message.shortMessage = result.getString("ShortMsg");
      message.shortCodeStr = result.getString("ShortCodeStr");
      message.isProcessed = result.getInt("isProcessed");
      message.messageID = result.getInt("id");
      message.shortCodeID = result.getInt("shortCodeID");
      message.msgTime; = result.getTimestamp("msgTime");
      messages.add(message);
    }

    success = true;
    return(messages);

  }
  catch (SQLException ex) {
    lastError = "Error in getNewMessages: " + ex.toString();
    General.writeEvent(lastError, "");
    return(null);
  }

}

وهو يعتبر مثال بسيط، لكن توجد في الحياة العملية إجراءات أكثر تعقيداً صعبة الفهم إذا لم يتم تطبيق مفهوم التجريد فيها.سوف نقوم بعمل إعادة صياغة للكود وذلك بقسيمه إلى جزئين، حيث نقوم بإستخلاص الجزء الخاص بطلب المعلومات وقراءة السجلات ووضعها في مصفوفة في إجراء منفصل، ثم نقوم بنداء الإجراء الجديد من داخل اﻹجراء القديم.
استفدنا من المحرر حيث يوجد أداة لإستخلاص هذا الجزء تلقائياً، فقط نقوم بتظليل الجزء المراد إستخلاصه، ثم نختار refactor/introduce/method، ثم قمنا بإختيار إسم له وهو readInbox وهو إسم مجرد يعني قراءة أي نوع من رسائل الواردة، حيث يمكننا قراءة رسائل جديدة بها أو رسائل قديمة، بخلاف الإجراء القديم والذي لا يمكن إستخدامه إلا لقراءة الرسائل الجديدة، فأصبح الكود كالتالي:

public ArrayList<SMSMessage> getNewMessages(String shortCodeText){

  success = false;
  try
  {
    ArrayList<SMSMessage> messages;
    PreparedStatement statement = connection.prepareStatement("select * from inbox\n" +
    "inner join shortcodes on shortcodes.ShortCodeID = inbox.ShortCodeID\n" +
    "inner join smppconnections on smppconnections.CONNECTIONID = inbox.connectionid\n" +
    "where Lower(shortCode) = ? \n" +
    "and isProcessed = 0");
    statement.setString(1, shortCodeText.toLowerCase());
    messages = readInbox(statement);

    success = true;
    return(messages);

  }
  catch (SQLException ex) {
    lastError = "Error in getNewMessages: " + ex.toString();
    General.writeEvent(lastError, "");
    return(null);
  }

}

واﻷجراء الجديد هو:

private ArrayList<SMSMessage> readInbox(PreparedStatement statement) throws SQLException {
  ArrayList<SMSMessage> messages;
  ResultSet result = statement.executeQuery();
  messages = new ArrayList<>();
  while (result.next()){

    SMSMessage message = new SMSMessage();
    message.connectionID = result.getInt("connectionID");
    message.operatorID = result.getInt("operatorID");
    message.fromMDN = result.getString("fromMDN");
    message.shortMessage = result.getString("ShortMsg");
    message.shortCodeStr = result.getString("ShortCodeStr");
    message.isProcessed = result.getInt("isProcessed");
    message.messageID = result.getInt("id");
    message.shortCodeID = result.getInt("shortCodeID");
    message.msgTime = result.getTimestamp("msgTime");
    messages.add(message);
  }
  return messages;
}

نلاحظ أن الإجراء اﻷول (getNewMessages) أصبح أصغروأبسط، و سهل القراءة . كذلك فإن اﻹجراء الجديد (readInbox) أيضاً سهل القراءة والفهم ويمكن إعادة إستخدامه مع إجراءات أخرى، مثلاً لقراءة الرسائل القديمة، لا نحتاج لتكرار جزئية القراءة. وبذلك نكون قد سهلنا الصيانة، مثلاً لو قمنا بإضافة حقيل جديد في الجدول Inbox ماعلينا إلا إضافة سطر واحد لقراءته في إجراء القراءة، لكن إذا كان هُناك تكرار للكود ولم يكن هُناك تجريد، فإن أي تعديل أو إضافة لحقل، يتبعها تغييرات كثيرة في أي مكان من الكود يوجد فيه تكرار قراءة هذه الحقول والسجلات، وإذا نسينا تعديل جزء من اﻷجزاء المكررة ربما تحدث مشكلة في البرنامج.أهداف هندسة البرمجيات التي يحققها التجريد في هذا المثال هي:

    إمكانية إعادة إستخدام الكود
    سهولة الصيانة لأي جزء من الكود
    سهولة القراءة والفهم ومن ثم سهولة إيجاد المشكلة
    سهولة التعديل واﻹختبار

مشكلة مفتاح الموتور

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

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

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

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

القدرة = الفولتية * التيار

إذاً

التيار = القدرة مقسومة على الفولتية

مثلاً جهاز له قدرة 1000 واط (أو كيلو واط) فإنه يحتاج إلى تيار 1000/220 = 4.5 أمبير ففي هذه الحال نتشري له توصيلات أو مفتاح 5 أمبير على اﻷقل، لكن بما أن الفولتية يمكن أن تزيد فاﻷفضل أن يكون المفتاح أو التوصيلة أعلى من ذلك، مثلاً 10 أمبير.

1line-switch

burned-switch.jpg

بعد احتراق المفتاح الثاني للموتور قمت بقياس استهلاكه للكهرباء بواسطة العداد، فوجد أن العداد استهلاكه الحالي 1.6 كيلوواط في الساعة، وبدون تشغيل الموتور يكون حوالي 0.6 كيلو واط، أي أن الموتور لوحده يستهلك حوالي كيلو أو ربما أكثر، حيث أن العداد غير دقيق في حساب الاستهلاك. اشتريت مفتاح جديد 10 أمبير وقُمت بتركيبه بدلاً من السابق، وعندما قرأت خصائص المفتاح السابق تفاجأت بأنه 10 أمبير أيضاً، فهُنا تسائلت: هل المفتاح مع مرور الزمن تزيد مقاومته فيصبح يمرر تيار أقل من 10 أمبير، هل يحدث للأجزاء النحاسية فيه إجهاد بسبب الكهرباء كما يحدث إجهاد ميكانيكي للمعادن في السيارات والطائرات؟ وهل لهذه المفاتيح والأسلاك الكهربائية عمر افتراضي، أم أن بعض المصانع تغش في تلك الخصائص، أم توجد عوامل أخرى نقيس بها التيار والقدرة المناسبة للأجهزة الكهربائية!

نتمنى من أهل الفيزياء والكهرباء أن يجاوبونا على تلك اﻷسألة المهمة.