لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 03/24/15 في كل الموقع
-
هذه كلمة ألقيتها أثناء عشاء Y Combinator للصائفة الأخيرة. عادة لم يكن لنا متحدّث في العشاء الأخير، فهو أقرب ما يكون من الحفلة. لكن يبدو أنّ الأمر يستحق العناء إن استطعتُ إنقاذ بعض الشركات الناشئة من الميتات التي يمكن تجنّبها. ولذلك في الدقيقة الأخيرة أعددتُ هذا الخطاب القاتم. لم أقصد أن يتحّول هذا إلى مقال، فلم أكتبه سوى لأنّه كانت لدي ساعتان فقط قبل العشاء وأنا أفكّر بشكل أسرع لمّا أكتب. منذ أيام قلت لأحد المراسلين إنّنا نتوقّع لثلث الشركات التي نموّلها أن تنجح. في الواقع كُنت متحفّظا حينها. أنا على أمل أنّه قد يكون بمقدار النصف. ألن يكون من المدهش لو حقّقنا نسبة نجاح في حدود الـ 50%؟ طريقة أخرى لوصف الوضع هو أنّ نصفكم مُتّجهون نحو الفناء. أن يوصف الوضع بهذه الطريقة، فلن يبدو جيّدا على الإطلاق. في الواقع، إنّه من الغريب حين تفكّر في الأمر، لأنّ تعريفنا للنجاح هو أن يحقّق المؤسسون الثروة. إذا نجحت نصف الشركات الناشئة التي نموّلها، معناه أنّ نصفكم سيصبحون أثرياء بينما لن يحصل النصف الآخر على شيء. إذا كان فقط بمقدورك تجنّب الفناء، ستصبح ثريًّا. هذا يبدو شبيها بالنكتة، لكنّه في الواقع وصف جيّد لما يحدث لشركة ناشئة أنموذجيّة. أنّه يصف بالتأكيد ما حدث مع Viaweb. قاومنا الفناء حتّى أصبحنا أثرياء. كان ذلك وشيكًا حين كنا في زيارة إلى "ياهو" للحديث عن إمكانية شرائها لشركتنا الناشئة، كان علينا أن نوقف كلّ شيء لاستعارة واحدة من قاعات عرضهم للحديث مع مستثمر كان على وشك التراجع عن دورة تمويليّة كنا بحاجة إليها للبقاء على قيد الحياة. إذن حتى في وسط الثراء كنا نقاتل قابض الأرواح. ربما سمعتم تلك المقولة التي تنص على أن الحظ يحدث لدى التقاء الفُرص مع الإعداد الجيّد لها. أنتم الآن قمت بواجب الإعداد. العمل الذي قمتم به حتى الآن يضعكم في وضعية تسمح لكم بالظفر بالحظّ: يمكنكم تحقيق الثراء الآن من خلال عدم السماح بموت شركاتكم. هذا أكثر مما لدى معظم الناس. إذن دعونا نتحدّث حول كيفية مُقاومة الفناء؟ قمنا بذلك خمس مرات للآن (دورات حاضنة المشاريع). ورأينا عددًا من الشركات الناشئة تموت. حوالي 10 منهم حتى الآن. لا نعرف بالضبط ما الذي يحدث عندما يموتون، لأنهم عادة لا يموتون بشكل ثقيل أو بطولي. في الغالب ينكفئون خارجا ويموتون. بالنسبة لنا المؤشر الرئيس للموت الوشيك هو عندما لا نسمع منك شيئا. عندما كنا لا نسمع من أو عن شركة ناشئة لبضعة أشهر، فهذا مؤشّر سيئ. عندما نرسل لهم رسالة إلكترونية نسألهم ما الخطب ولا يردّون فهذا حقيقة مؤشّر سيّئ. وحتى الآن، هذا يمثل تنبّؤا دقيقا 100% عن الوفاة. في حين عندما تنجز الشركات الناشئة صفقات جديدة أو إصدارات جديدة أو ترسل لنا رسائل إلكترونية أو تحضر فعاليات Y Combinator فإنها ربما سائرة نحو البقاء. أنا أدرك أنّ هذا سيبدو ساذجا، لكن الربط ربما يعمل في كلي الاتجاهين. ربما إن كنت قادرًا على التواصل معنا بشكل مُستمر فقد تتجنّب الفناء. قد لا يكون الأمر ساذجا كما يبدو. لعلّك لاحظت أنّ حضورك للعشاء كل يوم ثلاثاء معنا ومع المؤسسين الآخرين يجعلك تنجز أكثر ممّا يمكنك أن تنجز في حالات أخرى، لأنّ كلّ عشاء هو بمثابة يوم تجريبي مصغّر. كلّ عشاء هو بمثابة موعد نهائي. إذن مجرّد البقاء على اتصال دائم معنا سيدفعك لجعل الأشياء تحدث، لأنّه بخلاف ذلك ستكون محرجا في أن تخبرنا بأنك لم تنجز شيئا منذ المرة الأخيرة التي تحدثنا فيها. إذا نجح هذا، فسيكون حلّا عظيما. وسيكون من الرائع جدًا أنّه بمجرد البقاء على اتصال دوريّ بنا يمكنك أن تصبح ثريّا. يبدو الأمر جنونيًّا، لكن هناك فرصة جيّدة من شأنها أن تنجح. صيغة أخرى هي أن تبقى على اتصال بالشركات الناشئة المموّلة من قبل Y Combinator. يوجد الآن أحياء كاملة لها في سان فرانسيسكو. حين تنتقل إلى هناك فإن ضغط نظرائك الذي سيدفعك للعمل بجدّ طوال الصيف سيجعلك تستمرّ في النشاط. عندما تتعرض الشركات الناشئة للفناء، فإن السبب الرسمي يكون عادة نفاد التمويل أو انسحاب أحد المُؤسّسين، وعادة ما يحدث الأمران في آن واحد. ولكن أعتقد أنّ السبب الكامن هو عادة حين تصاب بالإحباط. نادرًا ما تسمع عن شركات ناشئة تعمل على مدار الساعة وتبرم الصفقات وتُضيف ميزات جديدة ثم تزول بسبب عدم قدرتها على سداد الفواتير أو لأنّ مزوّدي خدمات الإنترنت فصلوا الخطّ عن خواديمهم. الشركات الناشئة نادرًا ما تفنى في منتصف ضغطة زرّ. إذن واصلوا الرقن. إن دلّت إصابة عدد من الشركات الناشئة بالإحباط (بالرّغم من أنه إمكانها إدراك الثروة لو لم تيأس ولم تفشل) على شيء فإنها تدلّ على أنّ إدارة شركة ناشئة يمكن أن يكون مُحبِطا. هذا صحيح بالتأكيد. لقد جرّبت ذلك بنفسي، وهذا هو السبب في أنّي لم أطلق شركة ناشئة أخرى من جديد. الحضيض الذي يُمكن لإدارة الشركات الناشئة أن توصلك إليك منخفض بشكل لا يصدّق. أراهن أنه حتى "غوغل" عايشت فترات كانت فيها الأمور مدعاة لفقدان الأمل. معرفة ذلك يمكن أن يساعد. إذا كنت تعلم أنّ الأمور ستكون كارثيّة في بعض الأحيان، إذن عندما تبدو لك الأمور كارثيّة، فلن تقول: "أوف، الأمور كارثيّة وسوف أستسلم". الجميع يشعرون هكذا. لكن إذا تشبّثت فالأمور قد تسير على ما يرام. التشبيه الذي يستعمله الناس لتصوير مزاج الشركات الناشئة هو roller coaster حيث أنك لست أمام خيار الغرق لوحده وإنّما هناك فرص كثيرة للصعود بعد الهبوط. شعور آخر قد يبدو مقلقا لكنّه في الواقع عادي بالنسبة للشركات الناشئة هو إحساسك أنّ ما تقوم به غير فعّال. السبب الذي يدفعك للشعور بهذا الإحساس هو إمكانية فشل ما تقوم به. من النّادر أن تصيب الشركات الناشئة هدفها منذ المُحاولة الأولى، وفي الكثير من الحالات يُمكن أن تُطلق مُنتجًا دون أن يوليه أحد أيّة اهتمام. لا تعتبر حين يحدث هذا أنّك أخفقت فهو أمر هذا عاديّ بالنسبة للشركات الناشئة. ولكن لا تبق مكتوف الأيدي، أعد الكّرة من جديد (Iterate). يعجبني اقتراح "بول بكهايت" Paul Buchheit المتعلق بإنجاز شيء ينال إعجاب شخص واحد على الأقل ما بحق. طالما كنتم تقدّمون أشياء مُفيدة للبعض فأنتم على الطريق الصحيح. وسيكون من المفيد لكم معنويا أن تجدوا على الأقل مجموعة من المُستخدمين الذي يحبّون مُنتج حقيقة، خاصّة وأن غذاء الشركات الناشئة هو الرّوح المعنويّة. ولكن أيضا سيبيّن لك ذلك ما الذي ينبغي عليك التركيز عليه، وما الذي يحبّونه فيك. وهل بإمكانكم أن توفّروا المزيد منه؟ وأين يمكنكم أن تجدوا المزيد من الناس الّذين يحبون هذا النوع من الأشياء؟ طالما لديك بعض المستخدمين المحوريّين الّذين يحبّونكم، كلّ ما عليكم القيام به هو توسيع دائرة ما تقومون به. قد يستغرق ذلك بعض الوقت لكن طالما واصلتم فتفوزون في النهاية. كلّ من "بلوغر" و"ديليشيوس" مرّا بذلك. كلاهما استغرقا سنوات لتحقيق النجاح. ولكن كليهما بدآ مع مجموعة من المستخدمين المخلصين بشدة. وكلّ ما كان على "إيفان" و"جوشوا" فعله هو تنمية هذه المجموعة تدريجيا. "ووفو" (Wufoo) هي في هذا المسار نفسه الآن. لذلك عندما تقوم بشيء ما ويبدو أن لا أحد يهتمّ به، انظر عن كثب. هل هناك صفر من المستخدمين الذين يحبّونك أو هل هناك على الأقل مجموعة صغيرة تحبك؟ من الممكن جدا أن يكون هناك صفر. في هذه الحالة عدّل على منتجك وحاول مرّة أخرى. كلّ واحد منكم يعمل في مجال يحتوي على مُعادلة مُعيّنة لتحقيق النّجاح. وإذا واصلت المُحاولة فستتوصّل إليها. اسمحوا لي بذكر أشياء لا ينبغي عليك فعلها. الشيء الأول الذي لا ينبغي فعله هو "الأشياء الأخرى". إذا وجدت نفسك تتلفّظ بعبارة تنتهي بـ: "ولكننا سنواصل العمل على الشركة الناشئة"، فأنت في ورطة كبيرة. جُمل من قبيل : "سيرجع بوب إلى الدراسة ولكننا سنواصل العمل على الشركة الناشئة". "نحن عائدون إلى مينيسوتا ولكننا سنواصل العمل على الشركة الناشئة". "سنقوم ببضعة مشاريع جانبية/استشارية ولكننا سنواصل العمل على الشركة الناشئة". في حقيقة الأمر كل الجُمل السّابقة تعني أمرًا واحدًا : " لقد رفعنا الرّاية البيضاء لكنّنا لسنا على استعداد للاعتراف بذلك لأنفسنا". العمل على المشاريع الناشئة صعب جدًا، لا يُمكن بأي حال من الأحوال أن يكون في الجزء الثاني من جُملة بعد "لكن". على وجه الخصوص، لا ترجع إلى الجامعة، ولا تبدأ مشاريع أخرى، التّشتت هو قاتل للمشاريع الناشئة. الذهاب إلى (أو العودة إلى) الجامعة مؤشّر كبير على فناء الشّركة النّاشئة، لأنّه بالإضافة إلى التشتّت فإنّه يقدّم لك "شيئا" لتقول إنّك تقوم به. إذا كنت تعمل على شركتك النّاشئة فقط وفشلت هذه الشّركة النّاشئة فهذا فشلك أنت أيضًا. أمّا ولو كنت في الجامعة وفشلت شركتك النّاشئة فيمكنك أن تقول لاحقا: "أوه، نعم كان لدينا مشروع شركة ناشئة كُنّا نعمل عليه على الهامش حين كنت في الجامعة، لكنّه لم يصل إلى أية نتيجة" لا يمكنك استعمال عبارات ملطفة مثل: "لم يصل إلى أية نتيجة" عن شيء يُعتبر نشاطك الوحيد لأنه وبكل بساطة لن يُسمح لك بالقيام بذلك. واحدة من الأشياء المهمة التي اكتشفناها من خلال العمل في Y Combinator أنّ المؤسسين يكونون أكثر حماسة بدافع الخوف من أن تسوء الأمور ويظهرون في موقف لا يُحسدون عليه أكثر من تحمّسهم بدافع الأمل في الحصول على ملايين الدولارات. إذن إذا كنت ترغب في الحصول على ملايين الدولارات فضع نفسك في وضعيّة حيث سيكون الفشل معلنا ومهينا. عندما التقينا لأوّل مرّة بمؤسسي "اوكتوبارت" (Octopart) بدا لنا أنهما ذكّيان جدًا ولكن لم يظهرا في مظهر الرهان الحقيقي الذي يُمكن أن يُكلّل بالنجاح، لأنهم لم يبدوا ملتزمين بالخصوص. أحد المؤسِّسَيْنِ كان لا يزال في الجامعة. وكانت القصة المعتادة: سينقطع عن الدراسة إذا أقلعت الشركة الناشئة. منذ ذلك الحين لم يتوقّف عن الدراسة فحسب ولكنه ظهر على صفحات "نيوزويك" مع عبارة "ملياردير" مطبوعة على صدره. لم يعد بإمكانه أن يفشل الآن. كان يعلم أنّ الجميع شاهدوا الصورة. الفتيات اللاّئي أسأن إليه في الجامعة شاهدن الصورة. أمّه ربّما علقتها على الثلاجة. سيكون من المهين أن يفشل الآن. عند هذه النقطة فقد صار ملتزما بالقتال حتى الموت. أتمنى لو تظهر كلّ الشركات الناشئة التي نموّلها في مقالات الـ "نيوزويك" واصفين إياهم بأنهم الجيل القادم من المليارديرات، لأنه حينها لا أحد سوف يستسلم منهم. لن أكون مازحًا لو قلت بأن نسبة النجاح حينها ستكون في حدود الـ90%. عندما تعرفنا على الـ "أوكتوبارت" (Octopart) لأول مرة كانوا مرحين مبتهجين. الآن حين نتحدّث إليهم يبدون مصمّمين متجهّمين. موزعو القطع الإلكترونية يحاولون سحقهم لفرض أسعارهم الاحتكارية. (إذا كان يبدو لك من الغريب أن الناس كانول لا يزالون يطلبون القطع الإلكترونية اعتمادًا على كاتالوجات ورقية سميكة في 2007 فهناك سبب لذلك. الموزّعون يريدون منع الشفافية التي تأتي من وجود الأسعار على شبكة الإنترنت). أحس بشيء من الأسى لأنّنا حوّلنا هؤلاء الناس المرحين خفيفي الرّوح إلى أشخاص متجهّمين مصمّمين. ولكنّ ذلك يحدث مع الواقع. إذا نجح مشروع ناشئ فستحصل على ملايين الدولارات ولكنّك لن تحصل على هذا النوع من المال بمجرّد الطلب. عليك أن تقبل أنّه سيكلّف قدرًا من الألم. وأيّا كانت الصعوبات التي ستواجه"أوكتوبارت" فأتوقع لهم النّجاح. ربّما سيتحّوّلون إلى شيء مختلف تمامًا لكنهم لن ينكفئوا جانبا ويزولون. هم أذكياء؛ ويعملون في مجال واعد ولن يستسلموا. كلّكم لديكم المُكوّنين الأولين. كلّكم أذكياء وتعملون على أفكار واعدة. النقطة التي ستُحّدد ما إذا ستكونون في نهاية المطاف مع الأحياء أو في عداد الأموات هي المكوّن الثالث: عدم الاستسلام. لذا، سأقول لكم الآن: المصاعب قادمة. إنها ملازمة للشركات الناشئة. احتمال إطلاق شركة والوصول إلى بيعها دون حدوث كوارث ضئيل جدًا. يجب عليكم أن لا تصابوا باليأس. فقط قولوا لأنفسكم "طيّب هذا ما كان 'بول' (Paul Graham) يتحدّث عنه. ماذا قال لنا أن نفعل؟ ألاّ نستسلم". ترجمة -وبتصرّف- للمقال How Not to Die لصاحبه بول جراهام (Paul Graham) مُؤسس حاضنة مشاريع واي كومبيناتور (Y Combinator). اقرأ المزيد من مقالات بول جراهام بالعربية1 نقطة
-
إنّ أي مُطوّر أو مُصمّم يُحب كتابة الشيفرة البرمجية، ستكون تقسيمات الصفحة layouts المُعتمدة على أوراق الأنماط المُتتالية هي صميم وجوهر عمله. فيما قد تكون هذه المقالة مُراجعة للبعض، أو حتّى تصحيح بعض المفاهيم للبعض الآخر، سيتمّ تناول خاصّيّة التَمَوْضُع position، وكيفيّة استخدامها في تصميم تقسيمات صفحة layouts مُسايرة ومُتوافقة مع المعايير القياسيّة، ولا تعتمد على الجداول. يُساء فهمُ خاصّيّة التَمَوْضُع، ممّا يؤدي في بعض الأحيان عند تصحيح علّة مُعينة في شيفرةٍ ما من المُمْكن أنّ يتمّ استخدام قيم مُختلفة بأسلوب التجربة والخطأ للخاصّيّة position لمُحددٍ ما حتّى يتمّ الحصول على القيمة المطلوبة. إنّ هذه الطريقة المُملّة قد تفي بالغرض، ولكن من المُفترض على المُطوّر معرفة بالتحديد لماذا القيمة position: relative قد استطاعت إصلاح مُشكلة ما في تقسيم الصفحة دون قيمة أُخرى. هدف هذا الشرح هو تعلّم دلالات قيمة الخاصّيّة position وتأثيرها على الصفحة، وبالأخصّ، كيف سوف تؤثّر هذه القيم على بقية أجزاء الصفحة (markup). يُقدم بَيان specification أوراق الأنماط المُتتالية خمس خواصٍّ وهي: ساكن: staticنسبيّ: relativeكامل أو مُطلق: absoluteثابت: fixedمَوروث: inheritكما تمّ إضافة قيم جديدة ولكنها مازالت في مرحلة "مسودة عمل". يُستفاد من كل خاصّيّة لغرضٍ مُعينٍ، لذلك فَهمُ الغرض من كلٍ منها هو الطريق الأمثل لاحتراف تقسيمات الصفحة المُعتمدة على CSS. الخطوات الأولى مع أليّة عمل خواصّ التَمَوْضُعسيتمّ العودة إلى الأساسيّات لفهم الأمور بشكلٍ صحيحٍ. في CSS وبطبيعة الحال، يتمّ العمل ضمن حدود وقواعد ما يهم هُنا هو ما يُدعى بـ "التدفّق الطبيعيّ" normal flow. في العودة إلى بيان مُنظمة رابطة الشبكة العالميّة W3C سيكون تعريف التدفّق الطبيعيّ بالشكل التّالي: يُمكن اعتبار الصندوق المَذكور في البيان السابق كالصندوق الخشبي، والتدفّق الطّبيعيّ كما لو أنّه قانون كما هو قانون الجاذبيّة، التدفّق الطّبيعيّ للمُستند يُعبر عن اصطفاف العناصر فوق بعضها البعض تدريجيًّا من الأعلى إلى الأسفل، لكي تَظهر بالشّكل المُفترض لها أنّ تظهر عليه. يُمكن تشبيه التدفّق الطّبيعيّ بصناديق (مُكعبات) الأحرف الأبجديّة الّتي يُبنى منها ذلك البرج الضخم -الّذي يبنيه الأطفال بشكل مُتسلسل للأحرف- حيثُ أنّ هذه الصناديق الخشبيّة مُقيّدة بفعل الجاذبيّة الأرضيّة، ولا يُمكن إعطائها خصائص تُعارض قانون الجاذبيّة. في الجهة المُقابلة تتبع العناصر بعضها البعض في ترتيب عناصر الصفحة الخاصّة بمُستند HTML. ولكن من المُمكن إعطاء هذه العناصر خصائص لتُعرض بشكلٍ مخالفٍ لترتيبها الطبيعيّ. الخاصيّتان static و relativeتشبه خاصِّيَّات التَمَوْضُع "ساكن" static و "نسبيّ" relative سلوك صناديق الأبجديّة، حيثُ أنّها تصطفّ فوق بعضها البعض كما هو مُتوقعٌ لها. مع الانتباه إلى أنّ الخاصّيّة static هي القيمة الافتراضيّة للخاصّيّة position لأي عنصر. وعندما يكون هناك ثلاثة عناصر تحمل الخاصّيّة static فإنّها سوف تصطفّ فوق بعضها البعض. في المثال التّالي يوجد ثلاثة عناصر جميعها تحمل القيمة static. #box_1 { position: static; width: 200px; height: 200px; background: #ee3e64; } #box_2 { position: static; width: 200px; height: 200px; background: #44accf; } #box_3 { position: static; width: 200px; height: 200px; background: #b7d84b; } يُلاحظ من المثال السابق كيف أنّ هذه الصناديق تصطفّ فوق بعضها البعض. هذه الفكرة على بساطتها تعتبر أساسيات بناء الكتل block building ومن المُهم جدًا إدراكُها. يُمكن استخدام القيمة static لإنشاء تقسيمات صفحة مُبسّطة بعمود واحد single-column، حيثُ كل عنصر يتموضع فوق العنصر الّذي يليه. وعند الرغبة في نقل هذه العناصر فيما بينها باستخدام خواصّ الإزاحة offset مثل: الأعلى top، اليمين right، الأسفل bottom، اليسار left ستكون النتائج غير مُرضيةٍ أبدًا، حيثُ لا تؤثر هذه الخواصّ على عنصر ساكن static (أي يقوم بتجاهلها). كما لا يستطيع العنصر الساكن إنشاء نسق إحداثيَّات جديد للعنصر الابن. ولكن ما هو نسق الإحداثيَّات، هذا ما سيتمّ توضيحه باستخدام القيمة نسبيّ relative. تتصرّف العناصر المُتموضعة بشكل نسبيّ relative كما هي العناصر المُتموضعة بشكل ساكن static، حيثُ تتوافق فيما بينها بشكل مُتناسق، من دون أنّ تسبب أي مشاكل. قد يبدو الأمر غريبًا، ولكن عند تطبيق القيمة relative على المثال السابق ستكون النتائج مُشابهة للمثال السابق: #box_1 { position: relative; width: 200px; height: 200px; background: #ee3e64; } #box_2 { position: relative; width: 200px; height: 200px; background: #44accf; } #box_3 { position: relative; width: 200px; height: 200px; background: #b7d84b; } يُبرهن المثال السابق كيف أنّ العناصر المُتموضعة بشكل نسبيّ relatively تسلك سلوك العناصر المُتموضعة بشكل ساكن statically. لكن ما هو غير واضح أنّ هذه العناصر الّتي تحمل القيمة relative تختلف بمَيْزة هامة جدًا عن العناصر الّتي تحمل القيمة static. يكمُن الاختلاف الأوَّليّ في أنّ العناصر المُتموضعة بشكل نسبيّ من المُمكن تعديل مَوضعها باستخدام خاصِّيَّات الإزاحة: top و right و bottom و left. سيتمّ استخدام المثال السابق، ولكن بإضافة تَمَوْضُع الإزاحة على الصندوق الثاني “box_2”: #box_2 { position: relative; left: 200px; width: 200px; height: 200px; background: #44accf; } يُظهر المثال السابق التَمَوْضُع النسبيّ بشكلٍ عمليٍّ. حيثُ أنّ الصناديق الثّلاثة مُتموضعة فوق بعضها ماعدا الصندوق الثّاني فقد تمّ دفعه 200px من اليسار. في هذا المثال قد تمّ كسر قانون الجاذبية بناءً على رغبتنا. ومازال الصندوق الأزرق ينتمي إلى التدفّق العام الخاصّ بمُستند HTML، حيثُ أنّ الصندوق الأخضر يأتي أسفل الصندوق الأزرق على الرغم من أنّ الصندوق الأزرق ليس فوقه بشكل مُباشر. عند استخدام خاصِّيَّات الإزاحة لنقل عنصر مُتموضع بشكلٍ نسبيٍّ، فإن ذلك لا يؤثّر على العنصر أو العناصر التّالية، حيثُ أن الصندوق الأخضر مازال مُتموضعًا كما لو كان الصندوق الأزرق غير مُزَاح. وهو أمرٌ لا ينطبق على التشبيه الخاصّ بصناديق الأبجديّة. يُعتبر إنشاء نسق إحداثيَّات للعنصر الابن مَيْزةً أُخرى من ميزات خاصيّة التَمَوْضُع النسبيّ. حيثُ يُمثل هذا النسق نقطةً مرجعيّةً لخاصِّيَّات الإزاحة. سيتمّ العودة إلى المثال السابق لتوضيح هذه الفكرة، حيثُ أنّ الصندوق الأزرق لا يتموضع داخل أيًا من العناصر، لذلك نسق الإحداثيَّات المُستخدم لإزاحة نفسه 200px من جهة اليسار يعود إلى المُستند نفسه. ولو تمّ وضع الصندوق الثّاني داخل الصندوق الأول، سيتمّ الحصول على نتائج مُختلفة، حيثُ أنّ الصندوق الثّاني سيتموضع نِسْبَة إلى نسق الإحداثيّات من الصندوق الأول (الأحمر). في المثال التّالي سيتمّ التعديل على مُستند HTML دون التعديل على التنسيق CSS، وذلك بنقل الصندوق الثّاني داخل الصندوق الأول: <div id="box_1"> <div id="box_2"></div> </div> يُظهر المثال السابق ترميز مُستند HTML الجديد. وبسبب نسق الإحداثيّات الجديد، يقيس الصندوق الأزرق إزاحته 200px من جهة اليسار نسبةً إلى المكان الّذي كان سيكون عليه الصندوق الأزرق لو لم يكن مُتموضعا بشكلٍ نسبيٍّ. القيمة Absoluteتُمثّل القيمة absolute درجة عالية من الأهمية وأكثر من سابقتها relative، حيثُ التخصيص هو ما يُميز هذه القيمة. يُسحب العنصر المُتموضع بشكلٍ نسبيٍّ من التدفّق الطّبيعيّ، وذلك عكس ما يتمّ في العناصر الّتي تحمل القيمة relative و static. ويمكن التحكم بالعنصر بطريقةٍ مرنة عندما يتمّ سحبه من التدفّق الطّبيعيّ، حيثُ يُمكن وضعه في أي مكان من دون أنّ يؤثّر أو يتأثّر بباقي العناصر المُنتمية إلى هذا التدفّق. يُمكن التفكير بهذه العناصر كما لو أنّ لها على الجهة الخلفية قطعة كبيرة من مشبك velcro، حيثُ يُمكن إلصاق هذه العناصر في أي مكان حسب الرغبة والحاجة. تَستجيب العناصر المُتموضعة بشكل مُطلق (كامل) absolutely إلى خاصِّيَّات الإزاحة. حيثُ يُمكن تحديد القيم top: 100px و left: 200px للعنصر ليتوضع العنصر بالضَّبط 100px من الجهة العلوية و200px من الجهة اليُسرى للمُستند. سيتمّ التوضيح بالمثال التّالي وباستخدام أربعة صناديق: #box_1 { position: absolute; top: 0; left: 0; width: 200px; height: 200px; background: #ee3e64; } #box_2 { position: absolute; top: 0; right: 0; width: 200px; height: 200px; background: #44accf; } #box_3 { position: absolute; bottom: 0; left: 0; width: 200px; height: 200px; background: #b7d84b; } #box_4 { position: absolute; bottom: 0; right: 0; width: 200px; height: 200px; background: #ebde52; } يُظهر المثال السابق أربعة صناديق تتموضع في زَوايا المُتصفّح الأربع، وذلك بسبب أنّ كل صندوق يحمل القيمة absolute للخاصيّة position، بكلماتٍ أُخرى تمّ إلصاق هذه الصناديق في كل زاوية من زوايا نافذة المُتصفّح. ستبقى هذه الصناديق بالزاوية الخاصّة بها عند تغيير حجم المُتصفّح. وإنّ تصغير حجم المُتصفّح بحيثُ تتداخل أو تتشابك هذه الصناديق مع بعضها لن يُحدث أي تفاعل فيما بينها على الإِطْلاق، أي لن يزيح أحدها الآخر، وكأنّ كل صندوق في طبقةٍ مُختلفة، وذلك لأنّ هذه الصناديق قد أصبحت خارج التدفّق الطبيعيّ للمُستند. تُنشئ العناصر المُنسّقة بالقيمة absolute نسق إحداثيَّات جديد للعناصر الأبناء الخاصّة بها. المثال التّالي يوضّح كيف أنّ الصناديق البرتقاليّة الصغيرة تتموضع داخل الصناديق الآباء الخاصّة بها، وإحداثيّات الإزاحة مُرتبطة بالعناصر الآباء لا بنافذة المُتصفّح. <div id="box_1" class="box"> <div class="orange"></div> </div> <div id="box_2" class="box"> <div class="orange"></div> </div> <div id="box_3" class="box"> <div class="orange"></div> </div> <div id="box_4" class="box"> <div class="orange"></div> </div>} .box { position: absolute; width: 200px; height: 200px; } #box_1 { background: #ee3e64; top: 0; left: 0; } #box_2 { background: #44accf; top: 0; right: 0; } #box_3 { background: #b7d84b; bottom: 0; left: 0; } #box_4 { background: #ebde52; bottom: 0; right: 0; } .orange { background: #f95b34; position: absolute; top: 39%; left: 41%; width: 40px; height: 40px; } تُقدم القيمة absolute خصائص مُميّزة عند استخدام قيم الإزاحة معها، حيثُ سيُصبح من المُمْكن تَمْديد العنصر من دون تحديد أيًا من أبعاد العَرض width أو الارتفاع height، والّتي ستكون مُختلفة بناءً على حجم نافذة المُتصفح أو قياس الشاشة. وعليه فإنّ العنصر الابن سيكون مُقيّدًا بالعنصر الأب الخاصّ به، أو المُستند نفسه. المثال التّالي سيُوضح الفكرة: a { position: absolute; top: 10px; right: 10px; bottom: 10px; left: 10px; background: #44accf; } #box_b { position: absolute; top: 20px; right: 20px; bottom: 20px; left: 20px; background: #ff9c34; } يُوضّح المثال السابق كيف أنّ العناصر قد أصبحت أكثر مُرونة fluid، حيثُ يَتغيّر حجمها مع تَغيّر حجم الصفحة. ويوضّح المثال التّالي كيفيّة إنشاء صفحة بعمودين وبارتفاع الصفحة بالكامل. #box_1 { position: absolute; top: 0; right: 20%; bottom: 0; left: 0; background: #ee3e64; } #box_2 { position: absolute; top: 0; right: 0; bottom: 0; left: 80%; background: #b7d84b; } يُظهر المثال السابق تقسيم صفحة بعمودين، والّذي يُوضّح ما يُمكن عمله باستخدام القيمة absolute. أخذًا بعين الاعتبار أنّ هذا الأسوب ليس أفضل طريقة في إنشاء تقسيم صفحة بعمودين. يُمكن استخدام بعض الحِيَل في إيجاد تطبيقات عمليّة لهذه الخاصّيّة. على سبيل المثال: #box_1 { width: 200px; height: 200px; background: #ee3e64; } #box_2 { position: absolute; left: 100px; width: 200px; height: 200px; background: #44accf; } عند التركيز في المثال السابق والصندوق الثّاني بالتحديد، سيتمّ مُلاحظة كيفيّة استخدام قيمة إزاحة واحدة left: 100px;، وهذا ما يَسمح للصندوق الثّاني في الحفاظ على حافته العلوية في مكانها مع مقدرته على الانتقال 100px من جهة اليسار، ولكن عند تطبيق قيمة إزاحة ثانية إلى الجهة العلوية، سيتمّ سحب الصندوق الأزرق إلى أعلى المُستند: #box_2 { position: absolute; top: 0; left: 100px; width: 200px; height: 200px; background: #44accf; } القيمة ثابت Fixedيُشارك العنصر الّذي يحمل التنسيق position: fixed جميع الأحكام والقواعد الّتي يحملها العنصر المُتموضع بشكل مُطلق absolutely، حيثُ أنّ العنصر يُسحب من التدفّق الطّبيعيّ للمُستند. ويكمُن الاختلاف في أنّ العنصر الثّابت fixed يتمَوضع نسبة إلى المُستند، وليس إلى عنصر أب مُعيّن. كما لا يتأثر العنصر الثابت بالتدرّج، فيبقى في مجال الرؤية مهما تمّ النزول أو الصعود في الصفحة. #box_2 { position: fixed; top: 0; left: 0; right: 0; } يُظهر المثال السابق شريطًا عُلويًّا يحتوي على نصّ، وذلك كعنصر fixed، من المُلاحظ عدم تحرك هذا الشريط عند التدرّج في الصفحة. أيضًا من المُلاحظ أنّ خاصِّيَّات الإزاحة left وright تحمل القيمة صفر. باعتبار أنّ القيمة fixed تنتهج سلوكًا مشابهًا لسلوك القيمة absolute، فمن المُمكن أنّ يتمّ تمديد عرض العنصر ليتناسب مع مجال الرؤية عند تثبيت العنصر أعلى الصفحة باستخدام top: 0;. القيمة Inheritتمّ في بداية المقالة الإشارة إلى وجود خَمس قيم مُتوفّرة للخاصيّة position. القيمة الخامسة هي مَوروث inherit والأقل أهميّة. تعمل هذه القيمة كما يدلّ الاسم الخاصّ بها، حيثُ أنّ العنصر يرث القيمة الخاصّة بالعنصر الأب. علمًا أنّه في الأساس، عناصر الخاصّيّة position لا ترث قيمتها من العنصر الأب الخاصّ بها، وتكون القيمة static هي القيمة الافتراضيّة. الفرق بين relative وabsoluteيُظهر هذا التشبيه الفرق بين التنسيقين "نسبيّ" و "مُطلق". يُزاح دائمًا العنصر الّذي يحمل التنسيق "نسبيّ" نسبةً إلى موضعه الأصليّ في التدفّق الطّبيعيّ، بمعنى أنّ هذا العنصر يتحرك نسبة إلى المكان الّذي كان سيكون عليه في الظروف العاديّة. وهذا الانتقال لا يؤثّر على تقسيم الصفحة أو العناصر المُحيطة، أي كأنّ هذا العنصر قد أصبح شبحًا قد ترك جسمه خلفه. هذا الجسم له عرض وارتفاع ويؤثّر على محيطه ولكنه غير ظاهر. ويستطيع الصندوق الشبح التحرك ولكنه مازال مُرتبطًا بجسمه القديم، بمعنى أنّ موقعه الحاليّ يُقاس بناءً على موقعه القديم. أمّا العنصر الّذي يحمل التنسيق "مُطلق" فهو لا يؤثّر على محيطه أبدًا، وذلك لأنّه قد تمّ سحبه من التدفّق الطّبيعيّ. وبذلك فهو أيضًا شبح ولكنه لم يترك جسمه خلفه كما فعل الشبح النسبيّ. وبالنسبة للعناصر المُحيطة فإنّ هذا العنصر غير موجود. يحصل الشبح المُطلق على موضعه بعد النظر عبر جميع الآباء الخاصّة به حتّى يجد واحدًا منها يتموضع إما بشكلٍ "نسبيّ" أو "مُطلق" ليكون نسق إحداثيَّات لهذا العنصر. وعندما لا يجد هذا الشبح أيًا من الآباء يتموضع بشكلٍ "نسبيّ" أو "مُطلق"، ستكون نقطته المرجعيّة هي المُستند العام. تطبيقٌ عمليّسيتمّ تَوظيف الشرح السابق في مثالٍ عمليّ يجعل من الأمور أكثر وضوحًا لهذه الخاصِّيَّات. المثال هو للتوضيح فقط، ولا يُعتبر تطبيقًا مثاليًا لاستخدامه في الواقع العمليّ. <div id="container"> <div id="nav"> <a href="#">Link</a> <a href="#">Link</a> <a href="#">Link</a> <a href="#">Link</a> <a href="#">Link</a> </div> <div id="content"> <div id="callout"> <p>...</p> </div> <p>...</p> <p>...</p> <p>...</p> <p>...</p> <p>...</p> <p>...</p> <p>...</p> <p>...</p> <p>...</p> </div> <div id="footer"> <p>Copyright © 2015 - webtuts Web Sites</p> </div> </div> تُظهر الصورة السابقة تقسيم صفحة شائع الاستخدام في الكثير من المواقع، شريط تنقل علوي navigation، المحتوى content، ذيل الصفحة footer. سيتمّ مُناقشة كل عنصر، وخاصيّة التَمَوْضُع الخاصّة به، ولماذا تمّ اختيار كلٍ منها. سيتمّ استخدام #container لجعل بقية العناصر مُتمركزة في المُنتصف. العنصر #nav سيكون العنصر الأول داخل العنصر #container. لم يتمّ تخصيص العنصر #nav بالخاصيّة position، لذلك ستكون القيمة static هي المُعَيَّنة. وستفي القيمة الافتراضيّة بالغرض على اعتبار أنّه لن يتمّ إزاحة هذا العنصر، أو استخدامه في إنشاء نسق إحداثيَّات جديد. على الجهة الأُخرى سيتمّ تخصيص العنصر التّالي وهو #content بخاصيّة التَمَوْضُع position بالقيمة relative. لا تؤثر قيمة التَمَوْضُع position على العنصر #content عند عدم استخدام أيًا من قيم الإزاحة، ولكن قد تمّ تخصيصها بالتنسيق position: relative; لتُكوّن نقطة الإحداثيَّات للعنصر #callout. كما تمّ تنسيق العنصر #callout بالتنسيق position: absolute. أخذًا بعين الاعتبار أنّ العنصر الأب وهو #content الخاصّ بهذا العنصر قد تمّ تنسيقه بشكل نسبيّ relative، فإنّ خاصِّيَّات الإزاحة المُطبقة على العنصر #callout ستكون مُعتمدة على الإحداثيَّات المُنشأة من قبل العنصر الأب #content. كما تمّ تخصيص العنصر #callout بإزاحته -80px إلى جهة اليمين بهدف سحبه خارج العنصر الأب. علاوةً على ذلك، تمّ تخصيص العنصر #callout بإزاحته من الجهتين العلويّة والسفليّة بالقيمة 100px، وبذلك سيحافظ هذا العنصر على ارتفاع شبه كامل منقوصًا 200px مهما كان حجم الصفحة. لا يؤثّر العنصر #callout على باقي العناصر بما أنّ له القيمة absolute، ولذلك يجب إضافة بعض الحشو padding للعنصر #content وذلك كي لا تختفي الفَقْرات paragraphs أسفل العنصر #callout. كما سيتمّ تخصيص ذيل الصفحة بخاصيّة التَمَوْضُع مع القيمة fixed مما يجعله ثابت ضمن مجال الرؤية viewport عند التدرّج في الصفحة نزولًا أو صعودًا. كما سيتمّ إضافة حشو إلى العنصر #content ومن الناحية السفلية وبقيمة 60px وذلك لعدم اختفاء الفقرة الأخيرة تحت ذيل الصفحة. الخاتمةتُعتبر خواصّ التَمَوْضُع من المواضيع الّتي لا بُد على أي مُطوّر الإلمام بها بشكل مُعمّق، وذلك كي لا يتمّ الاعتماد على أسلوب التجربة والخطأ trial and error في التعامل مع هذه الخاصّيّة. يعطي فهم هذه الخاصّيّة احترافيّة عالية للمُطوّر ويزيد من إنتاجيّته عن باقي المُطوّرين الّذين يعتمدون على أسلوب التجربة والخطأ. ترجمة -وبتصرّف- للمقال CSS Positioning 101 لصاحبه Noah Stokes1 نقطة
-
مقدّمةChef هو عبارة عن أداة مفتوحة المصدر مكتوبة بلغة Ruby، يُستخدم كإطار عمل يسمح لك بأتمتة مهام إدارة خواديم الوب الخاصة بك، كما يسمح لك بنشر خواديم افتراضية خاصة (VPS) مُعدّة مسبقًا دون الحاجة إلى تذكّر كيفية ضبطها بالضبط. هذا الأمر مهم للغاية وتزداد أهميته تدريجيًا خاصةً أنه من الشائع امتلاك خواديم خاصة للاختبار، التطوير وإدارة قواعد البيانات بالإضافة لخواديم بيئة العمل الإنتاجية. كل واحدٍ منها له موارده وإعداداته الخاصة. إنّ عملية تثبيت وإعداد وتحديث وصيانة خادوم افتراضي خاص (VPS) منفرد تُعتبر عملية مُستهلكة جدًا للوقت. Chef يسمح لك أن تقوم بسهولة بأتمتة هذه المهام وتعديلها بحيث تناسب كل خادومٍ على حدى أوتوماتيكيًا. باختصار، Chef يسمح لك أن توفر الوقت والمال عن طريق توفير نظام يسهُل إعادة استخدامه لاحقًا. مطوروا Chef قاموا بتوفير سكربت (Script) سهل الاستخدام لتثبيته على توزيعة Ubuntu، ولكن المشكلة هي أن السكربت الذي قاموا بصناعته ليس قابلًا للاستخدام جيدًا مع إطار عمل Ruby on Rails، هذا الدليل سيرشدك إلى طريقة تثبيت بيئة Ruby حقيقية كاملة. ربما تتوقع أن نقوم بتثبيت Ruby عن طريق هذا الأمر: sudo apt-get install rubyولكن هذه الطريقة ليست مُستحسنة في الواقع، لأنه حتّى وإن كنتَ لا تستخدم أكثر من إصدار Ruby على نفس الخادوم الافتراضي الخاص (VPS)، فستواجه مشاكل بالتعامل مع تعارض أحجار روبي (Ruby gems) أو بعض المشاكل بالتعامل مع المشاريع التي تتطلب إصدارًا معينًا من حجر روبي (gem). مدير إصدارات روبي (RVM) يستطيع أن يحلّ هذه المشاكل بسهولة. ملاحظة: يمكنك استخدام rbenv عوضًا عن RVM أيضًا. اُختيرَ RVM لهذا الدليل لأنهما يتساويان بكل الأشياء التي نحتاجها حاليًا، من الأفضل أن تمتلك قوة إضافية ولا تحتاجها بدلًا من أنّ تكتشف أنك بحاجتها ولكن لا تستطيع الحصول عليها. الخطوة الأولى - كيفية تثبيت روبي مع مدير إصدارات روبي (RVM)يعتمد RVM على ثلاث أمور: Bash, Curl و Git. صدفة Bash مثبّتة افتراضيًا على توزيعة أوبونتو، لذا فإنه يتوجب عليك تثبيت كلٍ من Git و Curl فقط حاليًا عن طريق تطبيق الأمر التالي في الطرفية (Terminal): sudo apt-get install git-core curl الآن يمكنك تثبيت مدير إصدارات روبي (RVM) عن طريق الأمر: sudo \curl -L https://get.rvm.io | bash -s stable --ruby=1.9.3ستستغرق هذه العملية حوالي 5 إلى 10 دقائق تقريبًا (اعتمادًا على سرعة اتصالك بالوب بالإضافة إلى الوقت المُستَغرَق ريثما يتم بناء الشفرة المصدرية لروبي). ملاحظة: Chef يتعارض مع روبي 1.9، ولهذا فإننا نقوم بتثبيت روبي 1.9.3. يجب أن ترى الرسالة التالية عندما تكتمل العملية: * To start using RVM you need to run `source /usr/local/rvm/scripts/rvm` in all your open shell windows, in rare cases you need to reopen all shell windows. افعل ما يطلبه منك، فقط طبّق الأمر: source /usr/local/rvm/scripts/rvmالآن، تأكد من أن روبي تم تثبيتها بشكلٍ صحيح عن طريق الأمر: ruby -vإذا كانت توزيعتك من معمارية 32 بت فيجب أن ترى: ruby 1.9.3p448 (2013-06-27 revision 41675) [i686-linux]إمّا إذا كانت من معمارية 64 بت، فيجب أن ترى شيئًا مثل: ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]الآن، تأكد من أنّ أحجار روبي (Ruby gems) مثبّتة بشكل صحيح عن طريق الأمر: gem -vيجب أن يتم عرض رقم الإصدار المثبّت مثل: 1.8.25إذا لم تكن مطور روبي أو إطار عمل Rails، فحينها قد ترغب بجعل الإصدار 1.9.3 من روبي هو الافتراضي حاليًا عن طريق الأمر: rvm use 1.9.3 --defaultملاحظة: هذا الأمر سيقوم بتجاهل أي إصدار مثبّت من قبل من روبي. الخطوة الثانية - كيفية تثبيت Chefتثبيت Chef الآن أصبح بالإمكان تنفيذه بسهولة وسرعة عن طريق الأمر: gem install chef --no-ri --no-rdoc وللتأكد من أنّ Chef مثبّت بالفعل طبّق: chef-solo -vوهو ما سيقوم بطباعة رقم الإصدار الحالي من Chef: Chef: 11.4.4 سنقوم أيضًا بتثبيت بعض الإضافات المفيدة ألا وهي: Knife-Solo, Berkshelf و Foodcritic. Knife-Solo هي مُلحق (plug-in) لأداة Knife الخاصة بـChef تجعل عملية إعداد الخواديم المفردة ممكنة باستخدام chef-solo. حيث أنّها تجعل عملية نشر الخواديم الصغيرة سهلة لأنها توفر عليك عناء تشغيل عميل Chef (يدعى chef-client) والذي بدوره يتطلب خادوم chef (يدعى chef-server). لتثبيته، طبّق الأمر التالي: gem install knife-solo --no-ri --no-rdoc Berkshelf هو مُلحَق يساعدك على كتابة وتحزيم كتب الطبخ (cookbooks وهي ملفات الإعداد الخاصة بإعدادات الخواديم) أو تحميلها باستخدام ملفاتٍ محلية أو مستودع Git أو خادوم Chef. عليكَ أولًا تثبيت بعض الاعتماديات التي يحتاجها Berkshelf ليتمكن من العمل: sudo apt-get install libxslt-dev libxml2-dev الآن لتثبيت Berkshelf، طبّق الأمر: gem install berkshelf --no-ri --no-rdoc وللتأكد من أنّ عملية التثبيت تمت بشكل صحيح، طبّق الأمر: berks -v وهو ما يجب أن يعطيك رقم الإصدار المثبّت مثل: Berkshelf (2.0.7) مُلحق Foodcritic يساعدك عن الكشف عن المشكلات في كتب الطهي الخاصة بـChef (تُدعى Chef Cookbooks). لتثبيته، طبّق الأمر: gem install foodcritic --no-ri --no-rdoc وكالمعتاد، للتأكد من عملية التثبيت: foodcritic -V ستحصل على: foodcritic 2.2.0ملاحظة: في حال كنتَ تتساءل، الخيارات --no-ri –no-rdoc هي ليتم تجنّب إنشاء الوثائق الخاصة بالمُلحقات. الخطوة التاليةهذا الدّرس شرحَ لك كيفية تثبيت Chef على بيئة روبي حقيقية لتكون مناسبة لعملية تطوير البرمجيات. كل شيء تقريبًا أصبحَ جاهزًا للبدء بعملية الأتمتة عن طريق إنشاء وصفاتِكَ الخاصة (recipes) أو باستخدام وصفاتٍ من طرفٍ ثالث (3rd party). ترجمة -وبتصرّف- للمقال: How To Install Chef and Ruby with RVM on a Ubuntu VPS1 نقطة