مدونة المُظلي

كلام عن تطوير البرمجيات والمبرمجين وما حولهما

Saturday, November 20, 2010

تشيلي الواحة الفتـيّة لرواد الأعمال التقنية

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

 

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

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

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

250px-South_America_location_CHIشيلي يمكن ألا تكون الحصان الأسود في التعهيد الخارجي. لكنها يمكن أن تكون درّة أمريكا الجنوبية بقدرتها على التحول إلي الواحة الجديدة للمهاجرين بشكل عام ورواد الأعمال التقنية الذي يشكل التصدير محور أعمالهم. وضعت الحكومة الشيلية تشكيلة من الحوافز الخرافية للشركات التي تشكل التقنية عمودها الفقري والتي تصدر منتجاتها. الحكومة تريدك أن تستثمر 500,000 دولار خلال خمس سنوات لكنها مرنة جداً في آلية تحقيقك لذلك.

ماذا بعد استثمارك 500,000 دولار، ما الذي ستحصل عليه بالمقابل؟ كبداية، سيمنحوك تأشيرة دخول. يمكنك البقاء كيفما يحلو لك – حتى بشكل دائم. عليك أن تقدم خطة عمل لكنك تتمتع بحرية كبيرة في الاختيار من باقة الأعمال التي يدعمونها. أي عمل يقدم منتجات عالية التقنية، منتجات طبية، منتجات تكنولوجيا حيوية، منتجات تكنولوجيا خضراء غير مضرة تحصل على ختم الموافقة، وكذلك صناعات تطوير البرمجيات أو حتى تطوير ألعاب الويب أو تطوير شبكات التواصل الاجتماعية. حتى لو كنت ستنشأ مركز اتصالات أو مركز دعم فني يبيع خدماته للشركات الأجنبية ويظنون أنك مؤهل، ستحصل على التأشيرة.

لكن قبل ذلك، تريد التحري عن البلد أليس كذلك؟ ستمنحك الحكومة 60% من تكاليف التحري أو ما قد يصل إلي 30,000 دولار لزيارة واستكشاف شيلي. وسيضمنون لك 30,000 دولار أخرى لبدء شركتك في شيلي. إن قررت العمل داخل أحد المراكز التقنية الخاصة بهم، ستتكفل الحكومة بدفع الإيجار لمدة خمس سنوات (قد يصل إلي مليون دولار) نيابة عنك أو ستقتسم معك التكاليف إن أردت أن تستقر في أي مكان آخر في هذا البلد الرائع.

ماذا عن حوافز القوى العاملة؟ شيلي قد أمّنت ظهرك بالفعل. فستدفع الحكومة لك (كرائد أعمال تم قبوله) ما قد يصل إلي 25,000 دولار للسنة الأولى "كمصاريف تدريب" لأي مواطن شيلي تعيّنه. بالمناسبة شيلي تملك بعض مدارس الهندسة المتميزة لذا فانتقاء مبرمج جافا أو C# لن يكون عملاً شاقاً، الواحد منهم يتقاضى من 15,000 إلي 30,000 دولار في السنة، أمازلت لا تجد أي مواطن موهوب؟ ستدعم شيلي مجهوداتك لاستقدام من تريد من سانيفيل في مومباي أو من أي مكان قد تجدهم فيه. ويمكنك تدريب هؤلاء الناس على حساب شيلي أيضاً. وإن قررت شراء بعض الأراضي وبناء معاملك أو مكاتبك الخاصة، سيدفعون لك 40% من تكاليفك حتى 2 مليون دولار. ماذا عن المهاجرين المؤقتين أو الموهوبون الذين يرغبون في الانتقال إلي شيلي؟ بسيطة. وفر وظيفة تقنية مناسبة وستحصل على التأشيرات، بدون طرح أي أسئلة. هل بدأت تشعر بما أشعر به؟ (ملاحظة: إن حصلت شيلي على ربع المهاجرون المؤقتون العاملون بوظائف تقنية في أمريكا الآن، فستكون قريبة من مضاعفة القوى العاملة في التقنية داخلها)

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

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

أتتوق لتتحرر من التكاليف والقيود التي تفرضها طبيعة التكنولوجيا في أمريكا الشمالية؟ عليك بالجنوب أيها الفتى التقنيّ

Saturday, July 10, 2010

مرحلة المراهقة البرمجية – التمرد على المشاريع

هل خطر في بالك مرة أسئلة من هذه النوعية :

- سئمت هذا المشروع وهذا العميل

- المبرمجون في الخارج يبرمجون بطريقة متقدمة عنا بسنين ضوئية

- أنا مبرمج غير كفء

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

مررت شخصياً بهذه المرحلة، وهي مرحلة المراهقة البرمجية كما أسميها

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

وبعد تكرار عملي في أكثر من مشروع، بدأت اعتقد ان المشكلة في أنا فليس من الطبيعي ان كل مشروع اعمل فيه يكون فيه هذا القدر من المشاكل المتكررة،

فكل المشاريع التي اعمل فيها تبدأ ولا أراها تنتهي أبداً

وكل مشروع أعمل فيه هو متأخر تكنولوجياً عن أحدث ما نزل من تكنولوجيا تطوير البرمجيات

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

وكنت سأظل في هذه المرحلة لو أن من الله علي بحضور جلسة من جلسات التعريف بال Agile Development  أو البرمجة المرنة

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

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

بل الأهم من ذلك أني شعرت أني لست وحدي في صحراء مشاكل تطوير البرمجيات

وزادت قناعتي بأني لست وحدي عندما بدأت متابعة اللقاءات المسموعة على الانترنت Podcasts  والتي يتحدث فيها المطورون الأجانب عن متاعبهم في تطوير البرمجيات

وبعد فترة من الزمن بدأت انتقل لمرحلة أخرى في اثناء عملي في أي مشروع

وهي مرحلة قبول التحدي كما أسميتها

وأول شئ بدأت بتصححيه في هذه المرحلة هو فهمي لمشاكل المشاريع، فلم أعد أطلق عليها مشاكل بل استبدلتها بتحديات

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

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

ال .NET Framework عود على بدء

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

  • البنّاء
  • المؤرخ
  • النصوح
  • المفتش
  • وهي بالطبع بجانب دوره كمبرمج ، ودعنا نفصل كل دور من الأربعة السابقة

    1- يحتاج المبرمج أيامها أن يكون بنّاء لأنه سيبني بنفسه طريقة لإدارة الذاكرة وأخرى لإدارة الأخطاء بالإضافة لبناء كل سطر كود سيحتاجه البرنامج فلو قررت مثلاً بناء لعبة فعليك أن تبني نظام يتأكد من أن الذاكرة ليس فيها كائنات Objects غير مستعملة ونظام آخر لإدارة الأخطاء التي يمكن أن تنتج من اللعبة بالإضافة إلي بنائك لمحرك اللعبة ونظام الرسم على الشاشة وغير ذلك من مهام .

    2- ولن يستقيم دوره كبناء بدون أن يكون مفتش جيد يعرف كيف يفتش عن خصائص نظام التشغيل الذي سيعمل عليه ونظام بناء نظام التشغيل فمثلاً إن كان 32-bitأم 64-bit وإن كان البرنامج سيعمل على أكثر من نظام تشغيل فيجب عليه أن يحيط علماً بكل الفروقات بين نظم التشغيل المختلفة فما يمكن عمله في Windows ME لا يمكن عمله في Windows NT فأبسط شئ يمكن ذكره هو عبارة عن اسماء مكتبات النظام System DLL التي يمكن ان يتغير اسمها من نظام تشغيل إلي نظام تشغيل آخر فبالتالي عليك أن تكون ملم بكل أسم لكل نظام تشغيل

    3- يجب عليه دائما أن يكون ناصحا لزملائه بإتباع أساليب قياسية لتنفيذ برامجهم حتى يتسنى له التكامل مع برامجهم فاختلاف لغات البرمجة واختلاف طريقة بناء البرامج سببت مشكلة وهي عدم وجود اسلوب قياسي تستطيع من خلاله البرامج أن تتكامل مع بعضها البعض والأسلوب الأكثر شهرة هو ما يعرف بال COM (Component Object Model)

    4- أخيراً لزاماً عليه أن يكون مؤرخاً لكل إصدارة من برنامجه ومكتبات النظام System DLL التي استعملها وتواريخ إصدار هذه المكتبات DLL حتى يمكنه نسخها إلي كل نظام تشغيل سيعمل عليه لأنه ياويل برنامجه إن بدل أحد المبرمجين غيره ملف من ملفات مكتبات النظام System DLL بملف آخر مختلف في تاريخ إصداره عن تاريخ إصدار ملف صاحبنا – هذه العملية عرفت بجحيم المكتبات DLL Hell -

    أي أن ملخص هذا الكلام في أنه كان هناك عبء كبير ملقى على عاتق أي مبرمج نظراً لتوليه إنجاز كل هذه الأمور وأكثر بنفسه
    - الحياة بعد ال .NET Framework
    جاء ال .NET Framework حاملاً هدايا إلي ثلاث
    1- إلي المبرمج فصدق أو لا تصدق فقد حمل عن كاهل المبرمج الأدوار الأربع هل تذكرهم أنهم:
        · البناء : فقد أعتمد ال .NET Framework في إراحة المبرمج من هذا الدور على مكونين أساسين

    أ - نظام جديد لإدارة الذاكرة هو ال CRL (Common Language Runtime) وليس هذا فقط فقد تعدى هذه المرحلة إلي مرحلة أكبر وهي إدارة التشغيل بالكامل أي أنه منذ بداية تشغيل برنامجك وحتى إغلاقه فقد تولى ال CLR جميع مهام التشغيل من إدارة للذاكرة وإدارة للأخطاء وترجمة إلي لغة الآلة وغير ذلك.

    ب - مكتبة جاهزة فيها تقريباً كل ما يحتاجه المبرمج لإنجاز مهامه وهي تعرف باسم FCL (Framework Class Library) أو BCL (Base Class Library) كلاهما صحيح ففي هذه المكتبة بنت مايكروسوفت فئات Classes جاهزة للاستعمال تتولى هي تنفيذ المهام التي كان على المبرمج أن يبنها بنفسه سابقاً مثل إدارة الاتصال مع قاعدة البيانات والرسم على الشاشة وغير ذلك من المهام

    · أما عن دور المفتش فلم يعد له حاجة بعد ظهور أداة جديدة داخل ال CLR وهي ال JIT Compiler (Just In Time Compiler) ،

    ودعنا نستوضح قليلاً دور المفتش هذا فقد كان ذا أهمية كبيرة سابقاً لأنه كان لزاماً علي أن أخرج البرنامج من تحت يدي وهو جاهز للتشغيل المباشر على أي نظام تشغيل يدعمه البرنامج أي أن ترجمة البرنامج من لغة البرمجة التي أعمل بها إلي لغة الآلة Machine Language تتم على جهاز المبرمج ثم توزع هذه النسخة المترجمة إلي لغة الآلة على الأجهزة المستهدف لتعمل عليه

    ا أما بعد ال .NET Framework فقد اختلف الأمر حيث مازال يتم ترجمة البرنامج من لغة البرمجة إلي لغة أخرى على جهاز المبرمج ولكن هذه المرة لا يُترجم إلي لغة الآلة بل إلي لغة جديدة وهي ال MSIL(Microsoft Intermediate Language)

    وهي لغة وسيطة يمكن لأي لغة برمجة تدعم ال .NET Framework أن يتم ترجمتها إلي MSIL ثم يتم توزيع البرنامج بعد ترجمته إلي MSIL لكن ال MSIL هي لغة لا يمكن تشغيلها بشكل مباشر على الحواسيب لذا يأتي دور ال JIT Compiler حيث يستطيع أن يترجم أي برنامج مكتوب بال MSIL إلي ال Machine Language

    وفي هذه النقطة سؤال وهو طالما سيتم التحويل في النهاية إلي Machine Language فلماذا لم يتم هذا على جهاز المبرمج والأجابة هي "لرفع حمل دور المفتش" لأن من روائع ال JIT Compiler أن الترجمة التي تخرج منه بلغة ال Machine Language هي ترجمة تناسب نظام التشغيل الذي يعمل عليه ال JIT Compiler

    أي أني لو بنيت برنامج وترجمته إلي MSIL ووزعته على ثلاثة من أصحابي أحدهم يشغل Windows XP والآخر Millennium ً Windows والثالث Windows Server 2003 وكل واحد منهم قد ركب .NET Framework على جهازه فإن ال JIT Compiler سيترجم لكل واحد منهم Machine Language تناسبه وبالتالي لن أحمل هم الإصدارات المختلفة من نظام التشغيل بعد الآن -

    أما عن دور النصوح

    فلن يعود صديقنا المبرمج بعد الآن إلي حمل هم نصح أصدقائه فقد جمعهم ال .NET Framework على منصة واحدة لها نفس المقاييس ويعود الفضل في توحيد أسلوب العمل بين كل المبرمجين الذين يبنون تطبيقاتهم باستخدام

    ال .NET Framework إلي أن ال .NET Framework يخضع لمعايير تسمى

    ال(Common Language Infrastructure) CLI وهذه المعايير وضعتها مايكروسوفت بنفسها وتم نشرها على www.ecma-international.org بحيث يجب على أي طرف يريد تطوير لغة تدعم الدوت نت أن يتبعها حيث لم تضيق مايكروسوفت نطاق تطوير لغات تدعم بيئية الدوت نت عليها وحدها بل فتحته لأي طرف يريد تطوير لغة يمكنها العمل على .NET Framework وبعد أن وضعت مايكروسوفت هذه الاشتراطات بدأت هي نفسها بتباعها لتبني أول نظام إدارة تشغيل متوافق مع معايير ال CLI وهو نظام إدارة التشغيل الذي يعرف باسم ال CLR ومن ضمن المعايير التي وضعها ال CLI معيار اسمه ال CLS (Common Type System) يخدم في المقام الأول معيار بناء لغة برمجة يمكن أن تعمل على .NET Framework وعكفت مايكروسوفت على بناء أول لغة يمكن أن تعمل على .NET Framework ومتوافقة مع معيار ال CLS وكانت C#.NET ثم اتبعتها مايكروسوفت بشقيقتها ال VB.NET وهما الاثنتين يمكن ترجمتها إلي MSIL

    · ودور صديقنا المبرمج كمؤرخ

    لم يعد يحتاجه بعد أن ظهر مكون من أهم مكونات ال .NET Framework تحدثنا عنه سابقا وهو ال (Base Class Library) BCL فكل ما ستحتاجه بعد الآن أن يستعمل الفئة Class التي تناسب عمله وعند توزيع البرنامج على أي عميل سيجد نفس الفئة Class موجوده على ال .NET Framework المركب عن العميل.

    · كانت هذه الهدايا التي حملها ال .NET Framework إلي المبرمج فماذا في جعبته أيضاً

    2- هدايا إلي أي مستخدم عادي لبرنامج تم بناءه بأي لغة تعمل على .NET Framework وهي كالتالي :

    · ضمان مستوى أمنى محترم فالبرامج سابقاً كان مسموحاً لها أن تدير ذاكر الحاسوب بنفسها فماذا لو أن أحد المخربين استطاع أن يركب برنامج على جهاز مستخدم عادي وبدلاً من أن يدير الذاكرة بدء يملئها بما لا يفيد مما سينعكس بالطبع على سرعة الجهاز بالسلب، هذه المشاكل تم حلها تماماً لأن من تولى زمام إدارة الذاكرة الآن هو ال .NET Framework بنفسه وتحديداً ال CLR داخل ال .NET Framework

    · لن يقع المستخدم في حيرة من أمره إن ظهر له رسالة تحذير من أن هناك برنامج يحاول تبديل واحدة أو أكثر من مكتبات النظام System DLL بواحدة أخرى أقدم ، فجميع برامج الدوت نت تستعمل ال BCL وهي موحدة على جميع الأجهزة ولا تختلف من جهاز لآخر

    3- الهدية الثالثة حملها إلي البرنامج نفسه فلم يعد البرنامج يخزن بداخله جميع مكوناته فهو يحمل فقط الكود الذي كتبه المبرمج بيديه فقط أما كود إدارة الذاكرة فسيجده أينما يتم تركيبه موجود في ال .NET Framework وكود الفئات Classes التي يستخدمها من ال BCL سيجده أيضاً أينما تم تركيبه موجودا في ال .NET Framework

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

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

    احتجت في تطبيق ويب أبنيه أن اتأكد من ان المستخدم لن يستخدمه من أكثر من نافذة واحدة فقط حتى لا تتضارب ال Sessions ids

    وكان هذا أبسط كود وصلت له

     1: public partial class _Default : System.Web.UI.Page


     2: {


     3: protected void Page_Load(object sender, EventArgs e)


     4: {


     5: // without this step asp.net 2.0 will always generates new session id


     6: if (Session["ActiveSessionID"] == null)


     7: {


     8: Session["ActiveSessionID"] = Session.SessionID;


     9: }


     10:  


     11: HttpCookie activSessionCookie = Request.Cookies["ActiveSessionID"];


     12: if (activSessionCookie == null)


     13: {


     14: HttpCookie cookie = new HttpCookie("ActiveSessionID", Session.SessionID);


     15: cookie.Expires = DateTime.Now.AddDays(1);


     16: Response.Cookies.Add(cookie);


     17: }


     18: else if (activSessionCookie.Value != Session.SessionID)


     19: {


     20: Response.Write("this is new window");


     21: }


     22: }


     23: }


    أسهل طريقة لمنع المستخدم من تشغيل أكثر من نسخة من البرنامج

     1: static class Program


     2: {


     3: private const string concurrencyMtxNameM = @"onlyOne"; 


     4: static bool firstInstance = false;


     5: static Mutex concurrencyMtxM;


     6:  


     7: [STAThread]


     8: static void Main()


     9: {


     10: concurrencyMtxM = new Mutex(true, concurrencyMtxNameM, out firstInstance);


     11:  


     12: if (!firstInstance)


     13: {


     14: MessageBox.Show("Only one instance allowed");


     15: return;


     16: }


     17: Application.EnableVisualStyles();


     18: Application.SetCompatibleTextRenderingDefault(false);


     19: Application.Run(new Form1());


     20: }


     21: }




    المصدر : . NET - How to prevent running multiple instances of the same application


    ملاحظة: الوصلة باللغة الإيطالية يمكنك استخدام مترجم جوجل لقراءتها باللغة الانجليزية

    يوم في حياة صفحة ASP.NET

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

    لا تبادر أي صفحة ASP.NET ببدء يومها من نفسها بل يعتمد بداية يومها على طلب المستخدم لها وعلى الرغم من عدم قدرتها على التنبؤ بالوقت الذي ستبدأ فيها يومها – أو قل وقت استيقاظها – إلا إنها تعرف تمام المعرفة الأماكن التي عليها أن تمر عليها كل يوم، واستحييت أن أكون أنا مبرمجها ولست على نفس درايتها بالأماكن التي تمر فيها والغرف التي تقضي فيها وقتها ففضلت البدء بمعرفة الغرف التي تقضي الصفحة فيها وقتها ثم استطلع كل غرفة جيدا ثم بعد ذلك أعطي لها أمر بالاستيقاظ وأراقبها أثناء مرورها على كل هذه الأماكن  لأتعرف بالتفصيل على رحلتها اليومية وسأبدأ بسرد ما علمته عن الغرف التي تقضي فيها وقتها وهي كالتي : [MORE]

    1- غرفة ال IIS

            وعزمت في هذه الغرفة إلا أخرج إلا بعد أن أفهم الآتي :

            - نظرة عامة

            - ماذا يحدث تحت الغطاء

    أما عن النظرة العامة

    فهذه الغرفة هي المكان المختص باستقبال طلبات تشغيل صفحة ويب معينة والمسئول عن خدمة هذه الطلبات هو خادم   Internet Information Services (IIS) وهو يعتبر الوسيط الذي لا غنى عنه بين المستخدم وبين موقع الانترنت وذلك لأنه يستطيع التعامل مع المستخدم وطلباته ويعرف كيفية الرد عليه بالأسلوب الذي يفهمه المستخدم وفي نفس الوقت قادر على التعامل مع ملفات موقع الانترنت بما يناسبها ونقل نتيجة تشغيلها إلي المستخدم ، ولا تقتصر خدماته على صفحات ASP.NET فقط بل تمتد إلي Classic ASP و HTML وأي تقنيه تدعم IIS وأولى ملاحظاتي على هذه الغرفة كانت كما يلي :

    -    لن يتمكن أي طلب لصفحة ويب من المرور إلا عن طريق توجيه طلبه إلي IIS  وإلا فلا يمكن خدمته.

    -    ليس هناك إلا طريق واحد فقط لطلب تشغيل صفحة عن طريق IIS وهو ما يطلق عليه ال HTTP Request يكون محدد فيه عنوان الصفحة المستهدفة بالإضافة إلي معلومات أخرى.

    -    أي نتيجة تخرج من IIS إلي المستخدم يجب أن تخرج في HTTP Response يحتوى نتيجة طلب المستخدم

    -    تعمل جميع إصدارات IIS التي تسبق IIS 6.0 تحت اسم inetinfo.exe أما في حالة IIS 6.0 فأنه يعمل تحت اسم w3wp.exe

    أما عن ما يجدث تحت الغطاء فكان كالتالي

    يستطيع ال IIS تمييز الصفحات عن طريق الامتداد الخاص بها مثل .html  .asp .aspx وبالتالي تغيير طريقة تعامله مع الصفحة بما يناسب التقنية المبنية بها، وتغيير طريقة تعامله هي أكثر من مجرد ثلاث كلمات لذا استوقفني قليلاً فقد سألت نفسي أربع أسئلة وهم كالتالي

         1-    ماذا لو ظهرت لغة جديدة ولتكن XSP لتطوير صفحات ويب فكيف سيغير IIS طريقة تعامله مع الصفحات المبنية بهذه اللغة وهو لم يكن يعرف بها من قبل

    2-     ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟

    3- هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده  ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟

          4- كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET 2.0

    وإجابة السؤال الأول "ماذا لو ظهرت لغة جديدة " كانت كالتالي

    علمت مايكروسوفت أنها لن تستطيع أن توفر كل الدعم المطلوب لجميع لغات البرمجة الموجودة والمستحدثة لذا فقد طورت مايكروسوفت نظام Internet Server Application Programming Interface (ISAPI) Extension وهو نظام يهدف إلي إكساب IIS القدرة على توسعة إمكانياته ، بحيث يمكن لأي مبرمج تطوير ISAPI Extension جديد والحاقة بال IIS بحيث يكسب IIS القدرة على التعامل مع أنواع ملفات جديدة لم يكن ال IIS يعلم عنها شيئاً قبل ذلك، وأوضح الأمثلة العملية على ذلك هي ال ASP.NET نفسها فال.NET Framework أثناء تركيبه يلحق ISAPI Extension خاص بال ASP.NETوهو aspnet_isapi.dll بحيث يكسب ال IIS القدرة على معالجة الصفحات المبنية بتقنية ال .NET ويمكن توضيح الفرق قبل تركيب aspnet_isapi وبعد تركيبه وأثر تركيبه على IIS عن طريق الشكلين التاليين :

    IIS_Without_ISAPI_Extentsion_2
    ------------------------------------------------------------------------------------------------
    IIS_With_ISAPI_Extentsion_2

    لعل وظيفة ISAPI Extension تكون قد اتضحت الآن فهو من أكسب IIS القدرة على التعامل مع ملفات ASP.NET والوافد الجديد علينا في الشكل الثاني هو aspnet_wp وهو عبارة عن المحرك الرئيسي لتشغيل ASP.NET فكل ما يفعله aspnet_isapi بعد استلامه أمر تشغيل صفحة معينة أن يناول هذا الأمر إلي العملية المسماة ASP.NET Worker Process (aspnet_wp ) بحيث تتولى هي كل ما يلزم فعله حتى يتم خدمة هذا الطلب وسنتعرض لها بالتفصيل في المقالة القادمة إن شاء الله لأنها هي الغرفة الثانية التي تدخلها أي صفحة ASP.NET

    أما عن "ما هي الخطوات التي يتبعها IIS لمعالجة طلبات تشغيل الصفحات المختلفة ؟" فإجابته كالتالي :

    1- عن طريق HTTP Request يحدد IIS امتداد الصفحة المطلوبة سواء كان aspx , asp , html ويحدد أيضاً اسم الموقع الموجود به هذه الصفحة

    2- يُعلم IIS جميع ال ISAPI Filters الملحقة به بوصول HTTP Request جديد ويمرر هذا الطلب على جميع المرشحات ISAPI Filters

    3- يذهب IIS إلي ScriptMaps خاصة بالموقع المطلوب ويعرف من هذه الخرائط ال ISAPI Extension المناسب لتشغيل هذا الامتداد داخل هذا الموقع

    4- يوجه IIS طلباً مباشراً إلي ISAPI Extension المستهدف بتشغيل الصفحة المرادة عن طريق أمر مثل هذا Http://Server_Name/MyISAPIExtension.dll?TargetURL

    5- بعد استقبال نتيجة تشغيل الصفحة من ال ISAPI Extension يُعلم IIS جميع ال ISAPI Filters بأن هناك HTTP Response على وشك الإرسال إلي المستخدم ويمرره عليهم جميعاً

    6- يرسل IIS نتيجة تشغيل الصفحة في HTTP Response إلي المستخدم

    ولعل هناك تساؤل عن كلمتين جديدتين وهما ISAPI Filters و ScriptMaps وكل واحدة من منهما هي إجابة للسؤالين الثالث والرابع ، لذا لنستعرض كل سؤال

    فالسؤال الثالث كان "هل يستطيع IIS حجب بعض الصفحات أو الملفات عن المستخدم حتى وإن كانت موجودة عنده  ؟ وهل يمكنني أن أضبطه بحيث يحجب ملفات خاص بي لا أرغب في أن يطلع عليها المستخدم ؟"

    فإجابة هذا السؤال هي نعم يستطيع IIS حجب ما يشاء من صفحات وملفات عن مستخدم بعينه أو حتى كل المستخدمين وذلك عن طريق ISAPI Filters فكما سبق توضيحه فإن أي HTTP Request & HTTP Response  داخل أو خارج يمر على جميع ال HTTP Filters الملحقة ب IIS وإن قرر أحد تلك المرشحات أن يحجب النتيجة عن المستخدم فلن يتم إرسال أي نتيجة إليه ولا يمرر IIS طلب المستخدم دفعة واحدة على كل المرشحات بل يمرر الطلب على مرشح تلو الآخر على حسب الأولوية المسجل بها هذا المرشح وإن تساووا في في الأولوية فأنه يمرر على  على حسب ترتيب تسجيل هذا المرشح داخل IIS  وإن كان هناك حاجة لحجب محتويات معينة عن المستخدمين يمكن بسهولة أن نطور ISAPI Filter خاص بنا يتولى ترشيح الطلبات قبل وصولها إلي موقعنا ويمكن إضافة وحذف وتعديل ترتيب التسجيل لأي ISAPI Filter عن طريق هذه الشاشة 
    ISAPI_Filters_2
    والتي يمكن الحصول عليها بإتباع المسار التالي

    Control Panel >Administrative Tools > Internet Information Services > [Server Name] > Default Websites > Mouse Right Click > Properties > ISAPI Filters Tab

    [Server Name] هو اسم الحاسوب المركب عليه IIS

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

    *** عنوان قادم من المستخدم مكتوب فيه HTTP://www.MySite.com/MyPage.aspx/UserName/Ahmed يمكن للمرشحات أن تعيد كتابة العنوان بالشكل التالي

    HTTP://www.MySite.com/MyPage.aspx?UserName=Ahmed وبالتالي سيأخذ IIS هذا العنوان الجديد ويناوله إلي ال ISAPI Extension المناسب لمعالجة هذا العنوان

    *** المثال الآخر هو في حالة إرسال عنوان صفحة في HTTP Response فالطبيعي أن يكون العنوان المرسل إلي المستخدم كالتالي HTTP://www.MySite.com/YourPage.aspx وقد نحتاج إن لا نعلم المستخدم بالتقنية المستخدمة في تطوير الموقع فيمكننا عن طريق ISAPI Filter أن نعيد كتابة العنوان قبل إرساله إلي المستخدم ليصبح HTTP://www.MySite.com

    ويمكن تلخيص وظيفة ISAPI Filters في هذ الشكل

    IIS_Without_ISAPI_Extentsion_And_Filters_2

    ننتقل الآن لتوضيح ال ScriptMaps وفي نفس الوقت الإجابة على السؤال الرابع والأخير والذي كان  "كيف سيتصرف IIS إذا تعرف على امتداد صفحة وكان .aspx وعرف أنها ستعمل على ASP.NET وكان هناك نسختين مركبتين منها وهما ASP.NET 1.1 & ASP.NET "

    قبل أن يوجه IIS طلب المستخدم للتشغيل عليه أن يقرأ أولاً ال ScriptMaps الخاصة بالموقع الذي تعمل بداخله الصفحة المرادة لأن كل موقع له ScriptMaps توضح امتدادات الملفات المدعمة من قبله وال ISAPI Extension المناسب لتشغيل كل امتداد لذا فلو كان هناك موقعين يعملان ب ASP.NETولكن لكل موقع إصدارة مختلفة من إصدارات ال ASP.NET فهذا يعني أن لكل موقع ScriptMaps مختلفة عن الآخر وهذا ما سيمنع تضارب تشغيل الصفحات بين الموقعين وعملية تسجيل هذه البيانات في ال ScriptMaps تسمى Script Mapping أو Application Mapping أيهما صحيح ويمكنك الإطلاع على ScriptsMaps الخاصة بكل موقع عن طريق هذه الشاشة 
    Application_Mapping_2

    والتي يمكن الحصول عليها بإتباع المسار التالي

    Control Panel >Administrative Tools > Internet Information Services > [Server Name] > Default Websites > [Any Web Site] > Mouse Right Click > Properties > Virtual Directory Tab > Configuration Button

    أما عن ماذا يحدث بعد أن يوجه IIS أمر تشغيل مباشر إلي  aspnet_isapi Extension وكيف يناوله aspnet_isapi إلي aspnet_wp.exe وماذا يحدث داخل aspnet_wp فهذا ما سنتعرف عليه في المقالة القادمة إن شاء الله "داخل غرفة aspnet_wp"

    --------------------------------------------------------------------------------------------------

    ملاحظة

    على الرغم من الكلام في المقال أنصب على IIS فقط إلا أنه ينطبق على أي خادم ويب يدعم ASP.NET

    مصادر للاستزادة عن IIS (كل وصلة مربوطة بمقال عن IIS و علاقته ASP.NET)

    نظرة عامة على IIS 6.0 ، صفحة IIS الرئيسية على مايكروسوفت ، www.iis-resources.com، msdn.microsoft.com

    Tuesday, May 11, 2010

    استحواذ ينقصه الفاعلية

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

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

    استحواذ ينقصه الفاعليه323052823868

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

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

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

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

    - ليس عندي مهارات الكتابة والمشاركة: لو كان اسلوبك في الكتابة بديعا وتعرف كيف تسرد المعلومات لكنت رحمت نفسك واشتغلت كاتبا صحفيا أو شاعراً، أما وأن كلنا مبرمجون فهذا دليل على اننا كلنا في الهوا سوا :) وهل من تعلم ان يكتب بلغه ليست من لغات البشر مثل C#, JAVA, PHP, Paython ليس قادر على ان يتكلم لغته العربية أو حتى الانجليزية، أكتب بأي لغة وبأي أسلوب فالأهم هو المعلومة أما الأسلوب فدعه للشعراء والأدباء

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

    والجانب الآخر، كم منا في بداية الطريق بعد أن علم أن ال unserializable objects cannot be inserted in ASP.NET ViewState أو حتى غيرها ثم نسيها ووقع ليها إلى أن ترسخت من كثرة نسيانه، ألم تكن هذه أولى بأن تسجل ملاحظات لنفسك بدل من أن تغرق عقلك بكثير من المعلومات التي تنسي بعضها بعضا ولن تساعدك في Getting Things Done 

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

    وأرجوا منك ذلك أيضا، والله المستعان