منصة أوراكل جافا اصبحت تجارية

السلام عليكمjava-icon

في خبر قرأناه العام الماضي أن أوراكل سوف توقف الدعم المجاني لمنصة جافا بداية عام 2019 وسوف تقدم دعم تجاري ورخصة تجارية لاستخدام جافا بواقع 25 دولار للمعالج في الشهر أي 300 دولار في العام للمعالج.

قامت شركة صن ميكروسيستمس بإصدار النُسخة رقم 1 من لغة البرمجة جافا ومنصتها عام 1996م، وقامت بفتح مصدرها في نهاية عام 2006، ثم قامت شركة أوراكل بشراء شركة صن ومعها جافا في عام 2010. وفي بداية عام 2019 اصبحت منصة أوراكل جافا غير مجانية للاستخدام التجاري.

يوجد فرق بين اللغة، والمترجم compiler، والمنصة: فاللغة هي عبارة عن معايير قياسية standard specifications تُستخدم لتطبيق تلك اللغة وعمل مترجم لها. مثلاً يمكن لشخص ما أن يقوم بكتابة قواعد لغة برمجة مثلاً على ورق، ثم يقوم آخر بعمل مترجم لها يطبق تلك القواعد. كذلك بالنسبة للغات التي تحتاج لمنصة لتعمل مثل لغة جافا ودوت نت فإنها تحتاج لشيء ثالث يختلف عن اللغة وعن المترجم: وهي المنصة platform والتي تقوم بتشغيل تلك البرامج في أنظمة التشغيل المختلفة.

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

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

بما أن شركة أوراكل من المساهمين في مشروع OpenJDK والتي سوف تكون بديل ومنافس لمنصة أوراكل نفسها فهذا يعني أنها ربما توقف دعمها عن هذا المُنتج المنافس في المستقبل ، لذلك لا نستطيع أن نقول أن مستقبل جافا ومستقبل OpenJDK ليس في خطر.

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

من نظرة اخرى وكمستقبل للغة البرمجة جافا والتي اصبح لها منافسين أقوياء وبدائل مثل لغة بايثون وJava Script  في برامج الويب، ولغة Go في خدمات الويب وغيرها من لغات البرمجة والتي يمتاز كل منها في مجال معين، نرى أن هذا القرار سوف يؤثر سلباً خصوصاً عندما لا يفهم التعقيد في الترخيص عدد من المبرمجين أو من يتخوف من المستقبل أن كل المنصات ربما تصبح غير مجانية، فهذا بالتأكيد سوف يقلل من الاعتمادية عليها في البرامج المستقبلة ويفتح المجال لاستخدام البدائل الأخرى.

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

لا ندري ماذا يحدث في المستقبل لهذه اللغة التي شغلت أكبر حيز في تطوير البرامج بالنسبة لمجال الـ  Enterprise لعقدين من الزمن، فهل سوف يحل محلها لغة برمجة واحدة أم عدة لغات أم سوف تقاول رغم هذا التغيير أو تتراجع شركة أوراكل عن قرارها

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

سبحانك اللهم وبحمد لا إله إلا أنت، نستغفرك ونتوب إليك

المصادر: بُص بصّة على المصادر 🙂

https://en.wikipedia.org/wiki/Java_(programming_language)

https://en.wikipedia.org/wiki/Java_(software_platform)#History

https://en.wikipedia.org/wiki/OpenJDK

https://www.aspera.com/en/blog/oracle-will-charge-for-java-starting-in-2019/

http://pypl.github.io/PYPL.html

https://www.tiobe.com/tiobe-index/

https://www.quora.com/Will-Java-die-because-of-the-new-Oracle-license-update

Advertisements

التطور الطبيعي للمبرمج: العام الثامن

 

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

fpide_1-0-10_de.png

في إطار اﻹجابة عن سؤال طرحته قبل أعوام عديدة عن ماهية التطور الطبيعي للمبرمج، ومحاولة للإجابة عليه في كل عام، هذه هي تدوينة العام الثامن:

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

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

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

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

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

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

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

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

قصة برنامج للوصول لمخدم في المكتب من اﻹنترنت

السلام عليكم

بدأت هذه القصة في عام 2016م…

لدينا في المكتب خدمة إنترنت من نوع  ADSL وطريقة إتصاله بالإنترنت تختلف عن باقي خدمات اﻹنترنت اللاسلكية مثل 3G والـ 4G حيث أن أهم ما يميزه أن رقم الـ IP المستخدم لدخول النت يمكن الوصول إليه من أي جهاز في النت وهو يمثل رقم الراوتر أي أنه public، ويمكن عمل ما يُعرف بالـ port forwarding لتحويل رقم بورت معين إلى جهاز لابتوب المتصل مع ذلك الراوتر ، وفي حالتي لدي مخدم صغير في المكتب كنت أود الوصول إليه – وباقي زملائا في العمل- من الخارج من أي مكان في اﻹنترنت. لكن المشكلة أن رقم الـ IP الخاص براوتر الـ ADSL هو غير ثابت ، يتغير مع كل إتصال مع النت، أي أنه dynamic وليس static إلا أنه public.

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

لحل هذه المشكلة كان يجب استخدام إسم  domain name بدلاً من استخدام الرقم المتغير، وفي كل مرة يتم ربط هذا الإسم بالرقم الجديد، فبذلك يظل اﻹسم ثابتاً بالنسبة للأجهزة العميلة، مثلاً اﻹسم كان code-server.sd وهو إسم غير موجود في النت، إنما قمت بإضافته في ملف  /etc/hosts في نظام لينكس ، أو ملف

c:\windows\system32\drivers\etc\hosts

  في نظام وندوز. ثم نقوم بكتابة الرقم المتغيير معه، وكلما يتغير الرقم نقوم بتغيير تلك المعلومة في الملف، وبالنسبة للمستخدم لا يحس بأي تغيير لأنه يستخدم الإسم code-server.sd للوصول للمخدم بغض النظر عن رقمه الحالي.

مثلاً هذه محتويات الملف /etc/hosts في جهاز اللابتوب -ونظام تشغيله لينكس- استخدمه اﻵن، لاحظوا السطر اﻷخير به عنوان ورقم المخدم الذي نتكلم عنه:

127.0.0.1       localhost   global.com
127.0.1.1       L40-laptop
#192.168.0.105   L40-laptop
192.168.1.98     raspi2
192.168.0.101  mini-server mini-server.sd
0::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

41.209.65.57          code-server.sd

كانت فكرة الحل هي كتابة برنامج بلغة php في موقع في اﻹنترنت تابع لنا، مثلاً http://www.code.sd ليقوم بندائه المخدم في المكتب كل فترة ليعلمه برقمه الحالي، مثلاً كل ساعة، فيقوم هذا البرنامج أو صفحة php بإنشاء ملف نصي به رقم المخدم الحالي. الخطوة الثانية هي كتابة برنامج أكثر تعقيداً لقراءة هذا الرقم كل فترة ثم تحديث هذه المعلومة في ملف hosts  كما في الشكل التالي:

update-server

قُمت بتسمية البرنامج الذي سوف نضعه في جهاز المستخدم server-update واﻷجهزة هي: لينكس، وجهاز RaspberryPi، ثم لاحقاً بعد كتابة البرنامج تم اﻹحتياج إلى نُسخة تعمل في نظام وندوزأي أنها ثلاث منصات تحتاج لبرنامج تتم كتابته بلغة برمجة متعددة المنصات. كانت الخيارات هي: لغة باسكال، ولغة shell script و لغة جافا، وأخيراً لغة سي أو سي ++

بالنسبة لخيار لغة باسكال متمثلة في FPC/Lazarus كانت موجودة في لينكس وراسبري باي، لكن كانت نُسختان مختلفات من المترجم، ومكتبة التخاطب مع النت HTTP لم تكن موجودة مع المكتبة القياسية للغة، كان لابد من تثبيت ما يُعرف بالـ component وهي تحتاج إلى بيئة لازاراس كاملة أي GUI وبالنسبة لجهاز راسبري باي لم تكن هذه البيئة موجودة فقط المترجم FPC ، لذلك تم استبعادها لعدم إمكانية إنتاج ملف تنفيذي لمنصة RaspberryPi.

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

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

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

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

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

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

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

في بداية العام الذي يليه قررت لسبب ما إعادة كتابة نفس البرنامج باستخدام لغة البرمجة Go حيث بدأت تعلمها في هذا الوقت، وكان أول تطبيق عملي هو برنامج server-update . فقمت بالبحث عن قراءة معلومة من صفحة في النت بهذه اللغة، وقد كانت سهلة ولا تحتاج لمكتبة خارجية إنما كل ما احتجت إليه وجدته في المكتبات القياسية لها. ولغة Go بها نفس ميزة لغة سي، حيث أنه ينتج عنها ملف تنفيذي يعمل في منصة التشغيل المستهدفة دون الحاجة لمكتبات إضافية أو منصة إضافية لتشغيل البرنامج. وفي النهاية كان البرنامج أكثر سهولة وأكثر وضوحاً من سابقه المكتوب بلغة سي. وكان أحد الميزات المهمة في مترجم لغة Go أنه يدعم ما يُعرف بالـ cross-compilation أي يمكن إنتاج برامج تنفيذية لمنصات مختلفة من منصة واحدة، مثلاً من بيئة لينكس يمكن إنتاج برامج تنفيذية لبيئة وندوز وراسبري باي وماكنتوش وغيرها، دون أن تقوم بنقل مصدر البرنامج إلى منصة أخرى لترجمتها وهذه الميزة لم أجدها في لغة سي أو لغة باسكال – مع أن مترجم فري باسكال به هذه الميزة لكن عملياً تطبيقها صعب.

بعد هذا البرنامج كانت إنطلاقة بالنسبة لي لاستخدام لغة Go في العمل في برامج صغيرة ثم برامج أكثر تعقيداً ومازلت استخدمها إلى اﻵن وكتبت بها عدد من البرامج التي تعمل اﻵن في ضمن عدد من اﻷنظمة. وكانت بديل جيد لعدد من برامج جافا حيث أن برامج Go أسرع في التنفيذ ولا تستهلك موارد كبيرة مثل الذاكرة إلا أن برنامجها التنفيذي أكبر بكثير من نظيرتها لغة جافا ولغة سي. فقد كان حجم الملف التنفيذي لبرنامج server-update حجمه 15 كيلوبايت فقط أما نظيره المكتوب بلغة Go فكان حجمه حوالي 6 ميغابايت!

لم أرجع أو أفكر للرجوع لاستخدام لغة سي بعد هذا البرنامج ولم أفكر باستخدام لغة سي++ واﻵن كلا اللغتين في تراجع مستمر بالنسبة للاستخدام حيث يميل كل من يريد الدخول للبرمجة لتعلم لغة أكثر سهولة كذلك فإن الشركات تستخدم اللغات الحديثة فقط في المشروعات البرمجية الجديدة. ويتم استخدام لغة سي وسي++ في المشاريع القديمة التي لها عشرات السنين والتي يتعذر نقلها إلى لغة برمجة جديدة، كذلك فإن لغة سي تُستخدم في اﻷنظمة المُدمجة والمعالجات الدقيقة micro-controllers.

وقبل الختام هذا مصدر البرنامج بلغة سي:

/* 
 * File:   main.c
 * Author: motaz
 *
 * Created on February 10, 2016, 1:35 PM
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

char *server;
char *localserver;

function_pt(void *ptr, size_t size, size_t nmemb, void *stream){
    
  //server = malloc(size);
    //strncpy(server, ptr, size);
    server = ptr;
}

// Local net
function_pt_local(void *ptr, size_t size, size_t nmemb, void *stream){
    
    //server = malloc(size);
    //strncpy(server, ptr, size);
    localserver = ptr;
}

int getURL(void){
    
  CURL *curl;
  curl = curl_easy_init();
  if(curl) {
    printf("Reading from site..\n");
    curl_easy_setopt(curl, CURLOPT_URL, "http://code.sd/..file.txt");
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, function_pt);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
  }
    return 0;
}


void copyFiles(){
    
    FILE *fp;
    FILE *output;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;   
    

    fp = fopen("hosts.tmp", "r");
    output = fopen("/etc/hosts", "w");
   
    while ((read = getline(&line, &len, fp)) != -1) {
        
        fputs(line, output);
    }
    fclose(fp);
    fclose(output);    
}

int main(int argc, char** argv) {

    FILE *fp;
    FILE *output;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;   

    char *myserver;
    char* ok = NULL;
    
    getURL();
    myserver = server;

    printf("Server: [%s] \n", myserver);
    fp = fopen("//etc//hosts", "r");
    output = fopen("hosts.tmp", "w");
    int found = -1;
   
    while ((read = getline(&line, &len, fp)) != -1) {
        
        char* ptr=strstr(line, "code-server");
        if (ptr != NULL) {
            fputs(myserver, output);
            fputs("      ", output);
            fputs("code-server.sd\n", output);
            found = 1;
            printf("Found\n");
                    
        }
        else {
          fputs(line, output);
        }
    }
    
    if (found == -1){
       fputs(myserver, output);
       fputs("    ", output);
       fputs("code-server.sd\n", output);
       printf("New\n");
    }
    fclose(fp);
    fclose(output);
    copyFiles();
   
    return (EXIT_SUCCESS);
}

وهذا نفس البرنامج بلغة Go ويزيد عليه إضافة ليعمل في بيئة وندوز

// server-update2 project main.go
package main

import (
	"bufio"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"runtime"
	"strings"
)

func isLinux() bool {

	return runtime.GOOS == "linux"
}

func getTempFileName() string {
	if isLinux() {
		return "/tmp/hosts.tmp"
	} else {
		return "c:\\windows\\temp\\hosts.tmp"
	}
}

func getHostsFileName() string {
	if isLinux() {
		return "/etc/hosts"
	} else {
		return "c:\\windows\\system32\\drivers\\etc\\hosts"
	}
}

func main() {
	ip := getIP("http://code.sd/..file.txt")
	if (ip != "") && (len(ip) < 100) {
		readIntoTemp(ip)
		copyFile(getTempFileName(), getHostsFileName())
	} else {
		println("Unable to read IP")
	}
}

func getIP(url string) string {

	resp, err := http.Get(url)
	if err == nil {

		body, err2 := ioutil.ReadAll(resp.Body)
		if err2 == nil {
			line := string(body[:])
			return line
		} else {
			println("Error: " + err2.Error())
		}
	}
	return ""
}

func readIntoTemp(ip string) {

	file, _ := os.Open(getHostsFileName())
	destfile, _ := os.Create(getTempFileName())

	var found bool = false
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if strings.Contains(line, "code-server.sd") {
			println("Found, IP = " + ip)
			found = true
			line = ip + "          code-server.sd"
		}
		destfile.WriteString(line + "\n")
	}
	if !found {
		println("New entry for code-server.sd")
		destfile.WriteString(ip + "       code-server.sd\n")
	}

	file.Close()
	destfile.Close()
}

func copyFile(source string, dest string) bool {

	sourceFile, err := os.Open(source)
	if err == nil {
		defer sourceFile.Close()
		destFile, err2 := os.Create(dest)
		if err2 == nil {
			defer destFile.Close()
			io.Copy(destFile, sourceFile)
		} else {
			println("Error: " + err2.Error())
		}
	}
	return err == nil
}

الجدير بالذكر أنه بعد فترة تعطل الراوتر، فاشتريت رواتر جديد من نوع DLink فوجدت به خدمة إضافية من الشركة المُنتجة له وهي خدمة Dynamic DNS حيث قمت بعمل حساب عندهم واختيار إسم دومين جديد ثم ربط هذا الحساب بالراوتر، فيقوم الراوتر بتحديث العنوان كلما تغير رقم الـ IP الخاص به، وبذلك اصبح هُناك حل سهل لا يحتاج لبرمجة أو توزيع برنامج للمستخدمين. لكن بقي البرامج الذي قمت بكتابته يعمل ليكون كإحتياطي في حالة تعطل الراوتر أو توقف الخدمة المجانية التابعة لشركة DLink

 

 

رحلة مع زملاء الوظيفة إلى مدينة بورتسودان

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

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

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

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

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

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

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

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

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

نترككم مع بعض الصور والفيدوهات:

تتطلب عرض الشرائح هذه للجافا سكريبت.

وهذه فيديوهات للشعب المرجانية:

 

بعض الأخطاء التي يفعلها الموظفون

السلام عليكم

سمعت اﻵن نصائح جيدة عن اﻷخطاء التي يقع فيها الموظفون في قناة الجزيرة، فاحببت أن أكتبها قبل أن أفقد تلك المعلومات لعلي استفيد منها ويسفيد بها غيري، وهذه النصائح كتبتها خبيرة للتوظيف في جريدة daily mail، هذه النصائح هي:

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

تذكر أن هذه أخطاء يجب تجنبها وليست نصائح!

في الحقيقة لا احب أن أضيف أو اشرح تلك النقاط حتى تحتفظ بمعانيها المجردة، فقط يكفي أن نتأملها بين الحين واﻵخر

إسألو لبيبة: مسلسل ثقافي لكافة الأعمار

السلام عليكم

Meme_Many_Journeys
مصدر الصورة: ويكيميديا:

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

من أمثلة الحلقات والموضوعات التي تتكلم عنها هي:

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

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

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

ثلاث أعوام من استخدام قرص SSD

السلام عليكمssd-pack

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

قمت اليوم بإعادة القياس لنفس البرامج والمهام التي سبق وقستها سابقاً، فكانت النتيجة كالتالي:

  1. تشغيل نظام أبونتو إلى شاشة الدخول استغرق 20 ثانية مقارنة بـ 15 ثانية عندما كان القرص جديد
  2. الدخول إلى سطح المكتب استغرق 13 ثانية مقارنة بثانيتين فقط عندما كان جديداً
  3. تشغيل برنامج NetBeans استغرق 18 ثانية، مقارنة بـ 8 ثواني عندما كان القرص جديد
  4. إغلاق الجهاز استغرق 5 ثواني وهي نفس المدة السابقة

ssd-speed

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

من اﻷشياء المهمة التي أحب ذكرها هي أني قمت بتغيير اللابتوب، لكن لم أغير نظام التشغيل، حيث قمت بشراء لابتوب جديد ثم قمت بفك قرصه الذي أتى معه، مع إنه كان من نوع SSD لكن بسعة قليلة، 100 قيقابابت، مقارنة بالقرص الذي نتكلم عنه ذو 512 قيقابابت، فقمت بتبديل قرصي اللابتوبين، ليعمل اللابتوب الجديد بدون أي مشكلة، فقط طلب مني إعادة إدخال كلمة مرور شبكة Wifi مع أن العتاد مختلف، حيث أن اللابتوب القديم هو من نوع Tushiba والمعالج Core i5 واللابتوب الجديد Dell Core i3، وهذه ميزة في نظام لينكس، أما نظام وندوز فحسب تجربتي معه فإنه يتوقف عن العمل عندما تقوم بتشغيل قرص في لابتوب آخر، على اﻷقل أنا أتكلم عن تجربتي مع وندوز 7

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

ssd-smart

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

من المعلومات المهمة التي تحصلت عليها من النت هو عدم مليء القرص من نوع SSD حتى لا يتلف، لذلك إلى اﻵن استخدم فقط 60% من المساحة و أقوم بحذف الملفات غير الضرورية كبيرة الحجم، وذلك لأنه يقوم بتبديل الأجزاء التي تلفت من كثرة الكتابة بأجزاء أخرى جديدة، فإذا كان القرص ممتليء فإن ذلك يمكن أن يؤدي إلى تلفه المفاجيء لعدم وجود مساحة للتبديل