السبت، 30 يونيو 2012

الـjvm تتصرف بغرابة !

الـjvm تتصرف بغرابة !

في مشروعي الذي أعمل عليه هذه الأيام أستخدم لغة الـjava للعديد من الأسباب التي تجعلها الأفضل بلا منازع في الوقت الحالي.
لكن الغريب أنني لاحظتُ منذ فترةٍ أن آلة الـjava الوهمية JVM تتصرف بشكلٍ غريبٍ في بعض الأحيان !؛ حيث أنه من الممكن عند اختباري لعمل البرنامج في مرةٍ من المرات يعمل بشكلٍ طبعيٍ جداً بدون أي مشاكل، و حينما أقوم بعدها بتجربته مرةً أخري يظهر استثناء exception في المكتبات الخاصة بمكتبة الـjava القياسية !
و هذه صورةٌ لإحدي تلك المرات:

و قد تكرر هذا الأمر بشكلٍ غير صغيرٍ في الأيام الماضية. و عن نفسي لا أظن أنها مشكلةٌ في المكتبة القياسية، بل أظن أنها ناجمةٌ عن مشاكل في نظام التشغيل عندي و إن كنتُ لا أدري كيف هذا !
و عامةً هو أمرٌ غريبٌ شاذٌ يستحق البحث عن أسبابه فيما بعد بإذن الله تعالي.

الخميس، 28 يونيو 2012

واجهة رسومية احترافية لبرنامج youtube-dl

بنك الأفكار الخاص:
واجهة رسومية احترافية لبرنامج youtube-dl



youtube-dl هو برنامجٌ متميزٌ لتحميل الفيديوهات من موقع الـyoutube و بعض المواقع الأخري، و أستخدمه أنا شخصياً منذ فترةٍ طويلةٍ نسبياً و مستمتعٌ به جداً.
و من ميزاته المتعددة أنه:
  • مجانيٌ و مفتوح المصدر.
  • يدعم الاستكمال.
  • يمكن أن يتم تحميل الفيديو بنفس اسمه المنشور به في الموقع.
  • يُمكن تحميل العديد من الفيديوهات إذا ما كُتبت روابطها في ملفٍ نصيٍ و تم تمرير مساره إلي البرنامج.

    و غيرها من الإمكانيات الأخري.

الفكرة:
البرنامج متميزٌ بالفعل، و لكنه يعمل فقط من خلال سطر الأوامر، و لتسهيل الأمر علي المستخدم يُفضل أن تكون الواجهة من النوع الرسومي GUI، صحيحٌ أن هناك واجهتان رسوميتان له تسميان youtube-dl-gui و uuntube إلا أنهما واجهتان ضعيفتان فيما أري و لا تتماشيان مع كل إمكانيات البرنامج الأصلي.

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





الثلاثاء، 26 يونيو 2012

انقطاع التيار الكهربائي كوسيلةٍ للتنقيح

انقطاع التيار الكهربائي كوسيلةٍ للتنقيح

كل يومٍ يتأكد لي بتجاربٍ عمليةٍ أن الابتعاد عن الكود و دقائقه و تفصيلاته يعتبر من أهم طرق التنقيح debugging؛ ففي المرة الأولي كنتُ قد ذكرتُ أنني جربت النوم كطريقة تنقيحٍ لا تخيب :) و ها أنذا اليوم أذكر انقطاع التيار الكهربائي كوسيلةٍ أخري.

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


الأحد، 17 يونيو 2012

تعلم فن التنقيح debugging

تعلم فن التنقيح debugging
منذ البارحة و أنا مشغولٌ بغلطةٍ bug في غاية التخفي (رغم توقعي المسبق بأن سببها بسيطٌ للغاية)، و لم أعثر عليها إلا بعد محاولاتٍ جاهدةٍ متعبة.
بعد التجارب العملية المرهقة (التي مررت بها في تنقيح كود التطبيق الأول في مشروع البرمجة بإبداع) أجد أنه من اللازم جداً بالنسبة لي أن أُفرِّغ جزءاً من وقتي و مجهودي في الفترة القادمة بإذن الله تعالي لدراسة ما كتبه المبرمجون المخضرمون عن فن التنقيح و مهاراته المختلفة.



السبت، 16 يونيو 2012

اكتب برامجك الخاصة

 اكتب برامجك الخاصة


كنتُ في بدية الأمر أحب أن أكون عالم رياضياتٍ أو فلك ! و لكني ما إن ولجت عالم الحوسبة و أحسست بجماله حتي أصابتني حمي الحوسبة :)
صرت في أكلي و شربي و نومي حاسوبياً، و صرت أنظر للحاسوب علي أنه لعبةٌ جميلةٌ يمكنني أن أجعلها تسليني بآلاف الطرق، و أن تساعدني في القيام بالأعمال المرهقة الطويلة المملة التي أحتاج للقيام بها. و هي ذات النظرة التي ينظرها لينوس تورفالدز إليه، و أظن أنها نظرة كل هاكرٍ hacker حقيقي.


و لذلك فإني أقدم هذه النصيحة المجربة لكل مبرمجٍ مبتدئ: اجعل الحاسوب صديقك، و اكتب كثيراً من البرامج التي تحتاجها بنفسك.

فوائد ذلك:
  • الإحساس بمتعة البرمجة و أنها جزءٌ من الاستمتاع الشخصي لا العمل فقط.
  • زيادة المهارة بكثرة الممارسة.
  • الإحاطة بمجالاتٍ لم يتم التطرق إليها في العمل.
  • ربما: اختبار لغات برمجةٍ جديدة.
  • نشر تلك البرمجيات و مناقشتها مع الآخرين يرفع مستوي المبرمج و سقف طموحه و رؤيته.
  • ربما: تتحول البرامج الشخصية البسيطة إلي مشاريعٍ ضخمةٍ فيما بعد، بكل ما يحمل هذا من معاني.
من أمثة البرامج التي صنعتُها لنفسي ما يلي:
  • برنامج الفهرست:
    و هو برنامجٌ صغيرٌ يجعل قائمة (إرسال إلي send to) في الويندوز شبيهةٌ بتلك الخاصة بواجهة الـKDE. و كذا يمدد قائمة (المفضلة favourite) لتشمل الأماكن التي يريدها المستخدم و تفرعاتها كذلك إن أراد.
  • برنامج لتغيير أرقام الهاتف:
    حيث في الفترة الأخيرة في مصر تم زيادة أرقام الهواتف المحمولة لتصبح 11 رقماً بدلاً من 10 أرقام، و لأن الأرقام عندي كثيرةٌ جداً علي هاتفي و لن يمكنني تغييرها يدوياً بسهولة: فقد كتبت برنامجاً بسيطاً لتغيير الأرقام حسب القواعد المعلنة لذلك. لكني بكل أسف اكتشفت أنه لا يمكنني استعمال ذلك البرنامج لأنني لا أعلم كيف يمكنني الوصول إلي الموارد الداخلية للهواتف المحمولة ! و لا يمكنني أن أقتطع وقتاً أكبر مما تم اقتطاعه بالفعل للبرنامج بسبب انشغالي الشديد بمشروعي الأضخم (البرمجة بإبداع).
  • برنامج محاكي الماتلاب:
    و قد كان في بداية الأمر جزءاً من الدراسة ليس إلا، ثم فيما بعد استولي عليَّ الحماس لتطويره أكثر و أكثر بحيث صار الأمر شخصياً تماماً، بل إن هذا البرنامج هو ما جعلني أحسم القرار بخصوص مستقبلي و المجال الذي أريد التخصص فيه.
  • التطبيق الأول في مشروع (البرمجة بإبداع)، و الذي يحتوي علي ما يزيد علي الخمسٍ و عشرين ألف سطرٍ حتي الآن (بلغة الجافا)، و هو أهم و أجمل و أعقد ما عملت فيه علي الإطلاق حتي الآن (أسأل الله تعالي أن ينفع به).

الاثنين، 11 يونيو 2012

خدمة تحديث لبرنامج الفهرست

بنك الأفكار الخاص:

خدمة تحديث في برنامج الفهرست


برنامج الفهرست * (الذي قمتُ ببرمجته منذ فترةٍ طويلةٍ ثم اضطررت للتخلي عنه لانتقالي إلي نظام القنو/لينوكس) يعاني من قصورٍ شديدٍ في آلية عمله حتي الآن؛ حيث أنك حينما تصنع فهرساً معيناً باستخدامه ثم تقوم بعد ذلك بـ:
  • إنشاء مجلدٍ جديد، أو: 
  • حذف مجلدٍ قديمٍ، أو: 
  • تغيير اسم مجلدٍ موجود.
فإنه لا يشعر بأيٍ من ذلك علي الإطلاق و يظل محتفظاً بنفس بنية الفهرس الذي صنعه عند تشغيلك إياه، و لتحديث الفهرس ينبغي عليك أن تعيد تشغيل البرنامج مرةً أخري ليلغي كل ما فات و يقوم بعمل الفهرس من جديد.
صحيحٌ أنه يمكنك أن توفر العناء عن طريق اختيار جزءٍ صغيرٍ من شجرة الفهرس (الجزء الذي حدث فيه التغيير) لكن تظل الحاجة الدائمة لإعادة تشغيله ليُحَدِّث الفهرس القديم !
لذلك كنتُ قد فكرتُ قديماً في عمل خدمة service تقوم بمتابعة المجلدات التي قمنا بضمها للفهرس حينما صنعناه، و حينما يتم إجراء أي تغييرٍ (بالإنشاء أو الحذف أو التعديل) تقوم هذه الخدمة بتطبيق ذلك التغيير علي مكانه الملائم له من الفهرس.
لكن انتقالي المفاجئ لنظام اللينوكس منعني من إكمال هذه النقطة، و لذا أقترح علي من يرغب في التكملة أن يفعل مشكوراً.

 
--------------------------------------------------
* رابط المقال الذي أتحدث فيه عن البرنامج بإجمال:
 http://afkar-abo-eyas.blogspot.com/2011/11/blog-post_25.html




الأحد، 10 يونيو 2012

بنك أفكار خاص

بنك أفكارٍ خاص


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

هل يُعتبر هذا تطبيقاً عملياً لمبدأ المُدارسة ؟ 
أم هو مجرد تشاركٍ للمعرفة ؟
عملياً هو يُعتبر منتمياً للنوعين السابقين؛ فهو مشاركةٌ للأفكار و المعرفة الشخصية مع الناس عن طريق تبادل الآراء التطويرية في المجال الذي نتخصص فيه، و كذلك فمن الممكن أن تدور بين صاحب الفكرة و من يضطلع عليها مناقشاتٌ حول الفكرة يستفيد منها كلاهما فيتحول الأمر إلي مدارسةٍ علميةٍ غايةٍ في الإفادة.
و بالتطبيق علي مجال البرمجيات فمن الواضح جداً أنه (أي بنك الأفكار الشخصي) خطوةٌ تزيد علي منهج البرمجيات المفتوحة المصدر؛ ففي معظم البرمجيات المفتوحة المصدر (إن لم تكن كلها) يتم التشارك في مشاريع موجودة فعلاً، أي أن أصحابها لم يُعلنوا عنها إلا بعد البدء في تنفيذها بالفعل، أما بنك الأفكار الخاص فمعظم زاده سيكون من الأفكار الخام التي لم تتشكل بعد.

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







الأحد، 3 يونيو 2012

أكثر من لغة، و أكثر من بيئةٍ متكاملة.

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

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


و تنقسم اللغات من حيث قوة تعلمي لها إلي عدة فئاتٍ هي:
  • اللغات التي أتقنتها بشكلٍ كبيرٍ جداً، مثل الـ++C و الـjava و الـ#C و VB.NET و إن كنت طبعاً لم أتقن جميع مكوناتها و قواعدها. مع إتقان جزءٍ جيدٍ من مكتباتها القياسية، و ربما مكتباتٍ أخري ذات أغراضٍ خاصة (مثل مكتبة الـOpenCV في حالة لغة الـ++C و مكتبة الـXNA مع لغة الـ#C).
  • اللغات التي أتقنت قواعدها و لكني لم أتعلم مكتبتها القياسية بشكلٍ مماثلٍ نظراً لضيق الوقت و تأجيلي لهذه الخطوة إلي مرحلة تعلم المناهج المختلفة لتصميم المكتبات البرمجية و العلاقة بينها و بين تصميم اللغات ذاتها. و هذا حدث مع لغاتٍ مثل الـpython و الـobject pascal و matlab.
  • اللغات التي تعلمت كثيراً من نحوها syntax و لكن ليس علي نفس مستوي لغات النوع الأول، و كذلك فلم أتعلم مكتبتها القياسية. و منها ruby و fortran90  و shell script (إن اعتبرنا الأخيرة لغة برمجة كاملة).
  • اللغات التي أعلم بعض الأشياء عنها و بعض قراراتها التصميمية، و لكني لم أتعمق فيها مطلقاً، مثل الـeiffel و الـGo و الـobjective C و ربما غيرهن. 
و كذلك كنت لكل لغةٍ من تلك اللغات أُنَصِّب بيئة برمجةٍ متكاملة لها علي حاسوبي لتجربتها قدر الاستطاعة؛ حتي يتسني الاحتكاك العملي لي بها فأدرك نقاط القوة و الضعف فيها عن تجربة واقعية. و كذلك لمعرفة الفروقات بين بيئات البرمجة المتكاملة و التي يعد بناؤها جزءاً هاماً للغاية من هندسة البرمجيات المُساعَدَة حاسوبياً CASE - computer aided software engineering، و لمعرفة تأثير القرارات التصميمية للغة البرمجة علي كيفية عمل و بناء بيئة البرمجة المتكاملة الخاصة بها.
و من ضمن هذه البيئات ما يلي:
  • netbeans
  • monodevelop
  • eric
  • lazarus
  • octave
  • code blocks
  • Gambas
و أعترف أنني لم تتسن لي الفرصة لتجربة أيٍ منها تجربةً حقيقيةً قويةً، إلا بيئة الـNetbeans التي استقر قراري علي استخدامها أثناء البرمجة بالـjava.
     و الجميل أنني بحمد الله تعالي تعودت منذ صغري علي التلخيص الجيد لكل ما أتعلمه، بل و كنت أتسابق في تلخيص الكتب العلمية مع صديقي: ياسين أحمد سعيد، و أدي هذا إلي أنني لم أتعلم شيئاً في حياتي له قيمةٌ إلا و دونت ما تعلمته فيه. و لم يكن تعلمي لهذه اللغات شاذاً عن هذه القاعدة، فاستطعت تكوين تلخيصاتٍ جميلةٍ للغات النوع: الأول و الثاني و الثالث، و هي التي تتكون منها موسوعة الألسن التي تحدثت عنها مسبقاً.


    الآن: ما الغرض من حديثي عن هذه الأمور الشخصية ؟
    بمنتهي البساطة أنا أريد أن أوضح عملياً بعض النقاط التي تخفي علي الكثيرين بكل أسف:
    • الوقوف علي مسافةٍ واحدةٍ من كل الأذواق و المشارب و التقنيات المختلفة التي توجد داخل نطاق تخصصنا، و من ثم دراستها جميعها (أو ما تيسر منها إن كان الكل أو الأغلبية أكبر من اللازم)، و بعد الدراسة المتفهمة الجيدة يمكننا أن ننحاز إلي تقنيةٍ ما علي أنها التي نعتقد فيها القرب أكثر ما يُمكن من الصواب.
      و الحرص علي عدم التبعية و البعد التقليد الأعمي؛ فهناك أناسٌ تعودوا أن يسلموا قيادتهم إلي أحد الهيئات أو المؤسسات أو الشركات علي اعتبار أنها الأفضل تقنياً "دائما" و مهما كان قرارها في فرعٍ من الفروع !.
      فالتقليد و إن كان يُتقبل من بعض الناس فإنه في الأصل مذمومٌ للمتخصصين كل الذم، و ما من متخصصٍ تعصب لمُنتجٍ (بفتح التاء و كسرها) دون الاستناد إلي دليلٍ و برهانٍ لانحيازه إلا كان هذا قدحاً في عقلانيته و قدرته علي اتباع المنهج العلمي من الأساس.
    • الشجاعة في النقد عند وجود مناط الانتقاد، فعلي الرغم من أن هناك من لن يتقبل نقدك للتقنية التي يحبها مهما كانت منطقية النقد أو دوافعه، إلا أنه لا يُمكنك أن تسمح لمثل هذا أن يكبلك و أن يمنعك من استبعاد ما يجب استبعاده أو قبول ما يجب قبوله؛ فعامةًَ أي رأيٍ تقتنع به سيكون هناك من يُعارضك فيه أشد المعارضة، و ربما يري أنك وقحٌ و جاهل !
    • زيادة القاعدة المعرفية قدر الإمكان؛ فمثل هذا الازدياد قادرٌ علي توسيع آفاق تفكير صاحبه جداً، و يجعله قادراً علي الانتباه (نظراً للنظرة الشاملة التي يمتلكها) إلي ما قد يخفي علي الكثيرين و إن كانوا أكثر منه فضلاً و ذكاءاً.
    • التجريب العلمي و المعايشة أمران مهمان للغاية؛ فبإمكانهما أن يهدما كل ما بناه الواحد منا من أفكارٍ نظريةٍ و تحويلها في نظره إلي غبارٍ تذروه الرياح.
      و كلما كان مجال التجريب قريباً من الأصول التي نبني عليها آراءنا و فرعياتنا كلما كانت فائدة التجريب أوضح و أقوي (و ربما أكثر صدمة).

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