مواضيع برمجة متقدمة « مغامرات برمجية

تصنيفات: مواضيع برمجة متقدمة

تعديل ما لا يمكن تعديله باستخدام Extension Methods

نّشر في: 2012/10/30
تعليقات: تعليق واحد

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

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

أحدها كان الإجراء GetAllReports التابع للكلاس ReportDAL والذي يعطيني جميع التقارير قي سنة معينة. المشكلة كانت تكمن في أن هناك عملية تتكرر كثيراً وهي تصفية الناتح كثر بنوع التقرير. العملية ليست صعبة. سطرين أو ثلاثة باستخدام Linq كان كفيلاً بهذا. ولكن هذا الكود بدأ يتكرر بكثرة في أنحاء البرنامج، لذا أصبح من اللازم أن يصبح هذا الكود الجديد هو الآخر جزئاً من الـDAL. ولكن الكود لا يمكن تعديله (دون دفع نقود).

الحل الكلاسيكي كان أن نطور كلاي جديد يرث الـClass القديم ويضيف الدالة الجديدة. ولكن هذا مزعج حيث أنه علي تعديل البرنامج كله ليستخدم الكلاس الجديد. هنا تأتي فائدة الـExtension Methods.

(اقرأ المزيد …)

Post to Twitter

تصميم قواعد بيانات التقارير فائقة السرعة

نّشر في: 2012/10/08
تعليقات: 3 تعليق


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

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

هناك عدة حلول سريعة، يعرفها معظمنا. وضع الاستعلام داخل Stored Procedure مثلاً، للاستفادة من سرعتها. إضافة index مناسبة للجداول التي يتم الاستعلام منها. وطبعاَ تحسين أداء الاستعلام بالتدقيق في الاستخدام الصحيح لعمليات Join وGroup وغيرها من العمليات المكلفة (إلقاء نظرة على الـexecution plan الخاصة بالاستعلام مقيد جداً).

ولكن أحياناً كثيرة كل ما سبق لا ينجح في تسريع الاستعلام بشكل مقبول. بالذات عندما يكون لدينا كم هائل من البيانات التي يجب أن نقوم بعمليات Join وGroup عليها.

عندها علينا أن نفكر في استخدام حل آخر. تطوير قاعدة بيانات رديفة خاصة فقط بالتقارير.

(اقرأ المزيد …)

Post to Twitter

مشروع: تطبيق Ray Tracing باستخدام C‎#‎ – الحلقة 3 – الظلال والانعكاسات

في الدرس السابق وصلنا إلى الصورة بعاليه. وهي صورة فيها مقدار لا بأس به من الواقعية ولكن هناك حتماً مجال للتحسين. يمكننا أن نرى من التظليل أن مصدر الضوء قادم من الأعلى، مما يعني أنه من المفترض أن يكون هناك ظل أسفل الكرتين في السطح الأخضر. وسنضيف أيضاً أحد أشهر خواص الصور المنتجة بواسطة الـray tracing وهي الانعكاسات (كما يحدث في المرايا). وكما وعدتكم سنضيف مصدر ضوئي جديد هو الـpoint light. لدينا ما يكفي لدرس جديد إذن! جهزوا أدوية الصداع وهلموا معي.

 
(اقرأ المزيد …)

Post to Twitter

مشروع: تطبيق Ray Tracing باستخدام C‎#‎ – الحلقة 2 – الإضاءة والتظليل


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

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

(اقرأ المزيد …)

Post to Twitter

مشروع: تطبيق Ray Tracing باستخدام C‎#‎ – الحلقة 1 – الأساسيات البحتة

الرسوم ثلاثية الأبعاد بواسطة الكمبيوتر هو موضوع مشوق وله شجون. لذا اخترته ليكون الموضوع الاستهلالي لتصنيف جديد في المدونة، أنوي من خلاله تقديم مشاريع كاملة “من طق طق لسلام عليكم” كمجموعة دروس تطبيقية. المشروع التالي سيكون تطبيقاً لما يسمى بالـRay Tracing باستخدام لغة C‎#‎. لماذا C‎#‎ بالذات؟ لا يوجد سبب معين. مزاجي كان ميالاً نحو C‎#‎ عندما بدأت المشروع. ولكن ما سأقدمه هنا يمكن بسهولة تطبيقه في أي لغة. الصورة بالأعلى هي نتيجة لعملية Ray Tracing باستخدام برنامجي.

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

(اقرأ المزيد …)

Post to Twitter

لماذا أكره Java و ‎C‎+‎+‎ و ‎C‎#‎ (كلغات تعليمية)

يبدو أن مقالات “أنا أكره” ستصبح روتيناً جديداً هنا! ما علينا. أولاً دعوني أوضح ماذا أقصد بلغات تعليمية. ما أقصده هي اللغات التي تستخدم (عادةً في المنشآت الأكاديمية) لتعليم مبادئ البرمجة. 90% من طلاب الجامعة الذين يدخلون أقسام الحاسب لم يبرمجوا سطراً في حياتهم من قبل. ومواد مثل “مبادئ برمجة 101″ و مستنسخاتها هي المقدمة التي تستخدمها المنشأة الدراسية لإعطائهم بصيص ضوء إلى عالم البرمجة.

رغم أنني تركت مقاعد الدراسة منذ أيام كان رجال الكهف يصارعون الديناصورات من أجل حفنة دراهم، إلا أنني أحب من وقت لآخر متابعة ما يجري في الجامعات وتطور التعليم الحاسوبي بها. وهناك توجه مقلق نحو اعتماد لغات Java و ‎C‎+‎+‎ و ‎C‎#‎ كلغات تعليمية. أنا لا أنقص من قدر هذه اللغات الجليلة والمخضرمة، ولكنني أسلط الضوء على ما أراه غير مناسباً لها.

(اقرأ المزيد …)

Post to Twitter

لماذا أنا أكره الـStored Procedures

نّشر في: 2012/04/01
تعليقات: 11 تعليق

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

(اقرأ المزيد …)

Post to Twitter

Python Tools for Visual Studio: سلاحي الجديد ضد مشروع أويلر!

أولاً وقبل كل شئ: عيد مبارك وكل عامٍ وأنتم بخير!

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

ولكن قبل بضعة أيام جائني خبر عن طريق موقع Slashdot بإصدار مايكروسوفت لما يدعى بـPython Tools for Visual Studio. كلمتان رنانتان أحبهما في عبارة واحدة!

Python Tools for Visual Studio (اقرأ المزيد …)

Post to Twitter

البرمجة الوظيفية في ‎.‎‎NET‎ – لماذا؟ (الجزء الثاني)

نّشر في: 2011/06/22
تعليقات: لا تعليقات

استكمالاً لما كنت أتحدث عنه في التدوينة السابقة، سأتحدث هنا قليلاً بضعة أسباب أخرى تجعل للبرمجة الوظيفية مكان مهم في خارطة عالم التطوير. توقفنا وقتها ونحن نتكلم عن أن اللغات الوظيفية تفضل الـrecursion (الدوال التي تنادي نفسها) على الـiteration (الحلقات loop العادية). ولكن لماذا؟

(اقرأ المزيد …)

Post to Twitter

البرمجة الوظيفية في ‎.‎‎NET‎ – لماذا؟ (الجزء الأول)

نّشر في: 2011/06/18
تعليقات: تعليق واحد

في تدوينة سابقة تحدثت قليلاً عن ما هية البرمجة الوظيفية. أذكر أنه عندما بدأت أتعلم هذا الأسلوب الفريد في البرمجة كان أول سؤال لي بعد أن ذهبت غشاوة الانبهار هو: لماذا؟ مالذي قد يجعلني أترك طرقي الـimperative وأتجه إلى الـfunctional؟ بسبب سنوات طويلة من البرمجة الـimperative أصبح عقلي يعمل بهذه الطريقة. عندما أحل مشكلة ما برمجياً يقوم عقلي تلقائياً بترتيب مجموعة من الأوامر والحلقات، وليس مجموعة من الدوال الرياضية. لذا، على ما أعتقد، يحق لي (ولمن هم في نفس وضعي) أن يتساءلوا عن الفائدة المرجوة من التكلفة التي حتماً ستتبع تغيير طريقة تفكيرنا. جمال اللغة ودغدغة الدماغ كلها أمور جميلة، ولكن كمبرمجين محترفين تُحسب علينا ساعات عملنا نقدياً فإن أموراً مثل الـROI (العائد من الاستثمار) هي أشياء من العبث تجاهلها.

لكن لا بد أن هناك سبب ما لاستخدامها. هناك استخدام مضطرد لها في الآونة الأخيرة. ‎.‎‎NET‎ أصبحت تدعمها. ورغم أن فيسبوك حولت كودها من PHP إلى العتيقة المتينة ‎C++‎ إلا أنها آثرت استخدام Erlang (وهي لغة وظيفية) لجزئية الـchat. وهي ليست وحدها. مؤشر TIOBE يوضح اهتماماً متزايداً في Lisp وHaskell و‎‎F#‎ وكلها لغات وظيفية.

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

(اقرأ المزيد …)

Post to Twitter

page 1 of 2 »
Project Euler
أحدث التدوينات
تصنيفات
الأرشيف
منوعات
System Down على Twitter

مرحباً , تاريخ اليوم هو الثلاثاء, 2017/02/21