لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 06/26/18 في كل الموقع
-
تعرفنا في المقالات السابقة على مفهوم قواعد البيانات، وعرضنا مقدمة عن لغة الاستعلام البنائية SQL وأنواع الجمل فيها، وتعرفنا أيضا على كيفية بناء الجدول في قاعدة البيانات والتعديل على هيكله. سنتطرق في هذا المقال إلى مفهوم القيود الموجودة في قواعد البيانات، وسنتكلم عن أنواع البيانات التي يمكن استخدامها. أنواع البيانات Data Types في قاعدة البيانات يُحدّد نوع البيانات طبيعة وشكل القيمة التي من الممكن أن يأخذها العمود في الجدول، ويجب علينا أن نحدد اسم العمود ونوع بياناته عند إنشاء هذا الجدول وذلك في جملة إنشائه. توجد أنواع بيانات معيارية حدّدتها مؤسسة ANSI، ولكن ليس كل أنظمة إدارة قواعد البيانات توفر هذه المعايير وتطبقها على نحو كامل. يلخص الجدول التالي أهم وأشهر الأنواع المستخدمة هناك أنواع معيارية أخرى مثل XML، ARRAY، MULTISET ولكنها غير متداولة على نطاق واسع، ويجب الانتباه إلى أن نظم إدارة قواعد البيانات تختلف في تسمية وتعريف بعض أنواع البيانات، فمثلاً، نوع البيانات الرقم يسمى في قواعد بيانات أوراكل بـ Number ولكن في قواعد البيانات MySQL وPostgreSQL يسمى Int أو Integer. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن القيود يعدّ موضوع القيود من المواضيع الهامة جدا في قواعد البيانات، ويجب على المبرمج ومسؤول قواعد البيانات الإلمام بأنواع القيود وكيفية تعريفها والتعامل معها. الهدف العام من القيود هو الحفاظ على سلامة البيانات Data integrity ودقتها. نستطيع أن نُعرّف القيد على أنه شرط يحكم العمود أو الجدول ويُتأكد من الالتزام بهذا الشرطعند إجراء عمليات مثل الإضافة والتعديل والحذف (على سبيل الذكر لا الحصر)، وفي حال لم يُحترَم الشرط فإن العملية مصدر الأمر تُرفَض ويوقَف تنفيذها ويُتراجع عن أي أثر أحدثته. مجال القيود تُطبَّق القيود على مستويين: مستوى العمود: يُعَرَّف القيد ضمن تعريف العمود ويطبق القيد على مستوى هذا العمود فقط. مستوى الجدول: يُعَرَّف القيد منفصلا عن أي عمود (عادة في نهاية تعريف الجدول)، ويمكن أن يطبق القيد على واحد أو أكثر من الأعمدة. أنواع القيود قيد “العمود غير الفارغ” Not Null Constraint: نستطيع إعطاء قيمة فارغة لعمود ما لم نُعرف هذا القيد عليه، والذي نقصد به منع إدخال أو إعطاء العمود قيمة فارغة Null عند إجراء عمليات مثل الإضافة أو التعديل على السجلات. يعرف المثال التالي جدولًا Persons مع تطبيق قيد العمود غير الفارغ على أول ثلاث أعمدة (طبقنا المثال على MySQL 5.7 وOracle XE): CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255) NOT NULL, Age int ); قيد القيمة الفريدة UNIQUE Constraint: مهمة هذا القيد هي ضمان عدم تكرار قيمة عمود في أي من سجلات الجدول، بحيث تكون هذه القيمة فريدة ومختلفة. نستطيع تعريف أكثر من قيد فريد في الجدول على أكثر من عمود، كما أن قيد المفتاح الرئيسي (انظر بالأسفل) يقدم ضمان القيمة الفريدة للعمود بجانب القيد الفريد. يُعرَّف القيد الفريد بالطريقة التالية: CREATE TABLE Persons ( ID int NOT NULL UNIQUE, LastName varchar(255) NOT NULL, FirstName varchar(255) NOT NULL, Age int ); أو CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, UNIQUE (ID) ); وفي حال أردنا أن نعرف القيد على مستوى أكثر من عمود: CREATE TABLE Persons ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CONSTRAINT UC_Person UNIQUE (ID,LastName) ); قيد المفتاح الرئيسي Primary Key Constraint: يُطبَّق هذا القيد على عمود أو أكثر بحيث تكون قيمة العمود أو قيمة الأعمدة مجتمعة تُعَرِّف كل سجل على نحو فريد عن السجلات الأخرى في الجدول. يُعدّ قيد المفتاح الرئيسي قيدًا فريدًا أضيف إليه قيد غير فارغ. خصائص قيد المفتاح الرئيسي: يمكن تعريف قيد مفتاح رئيسي واحد على مستوى الجدول. لا يمكن تعريف قيد المفتاح الرئيسي على أعمدة من نوع BLOB،CLOB،NCLOB،ARRAY. قيم العمود المطبق عليه قيد المفتاح الرئيسي لابد أن تكون فريدة لكل سجل وألا تأخذ قيمة فارغة. تُعَرف قيود المفتاح الأجنبي بأخذها مَرجِعاً من مفتاح قيد رئيسي في جدول آخر، وذلك لبناء علاقة بين جدولين. يُعرَّف قيد المفتاح الرئيسي كالتالي: CREATE TABLE Persons ( ID int PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int ); أو CREATE TABLE Persons ( ID int , LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (ID) ); نعرّف في ما يلي قيد مفتاح رئيسي على أكثر من عمود ونعطيه الاسم PK_Person: CREATE TABLE Persons ( ID int , LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, CONSTRAINT PK_Person PRIMARY KEY (ID,LastName) ); قيد المفتاح الأجنبي Foreign Key Constraint: يعرّف قيد المفتاح الأجنبي عمودًا - أو أكثر - في الجدول على أنه مرجع من عمود يوجد في جدول آخر، بحيث تكون قيمة العمود مأخوذة من هذا العمود المرجعي بشرط أن يُعرَّف عليه قيد فريد أو قيد مفتاح رئيسي (في الجدول الآخر). يعدّ هذا القيد وسيلة لربط جداول قاعدة البيانات وبناء علاقات بينها، ومن الممكن تعريف أكثر من قيد أجنبي في الجدول الواحد. نستطيع أن نعرف القيد الأجنبي في الجدول كالتالي: CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), FOREIGN KEY (PersonID) REFERENCES Persons(ID) ); لإعطاء القيد الأجنبي اسما مخصَّصا نستخدم الطريقة التالية: CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID) REFERENCES Persons(ID) ); إن أردت الاستزادة، فارجع إلى توثيق أنواع البيانات في لغة SQL من موسوعة حسوب.1 نقطة
-
إن بحثًا سريعًا في جوجل عن "Working from home” سيعطيك نتائج متباينة من شخص جالس على الأرض محاطًا بحيوانات أليفة إلى أشخاص يحملون أطفالهم أثناء تلقي مكالمات هاتفية، أو يرتدون ملابس النوم أثناء العمل. وصحيح أن كثيرًا من هذه الأمور ﻻ يمكنك فعلها دومًا في شركة عادية ذات مكتب تقليدي، إﻻ أن ما تحاول هذه الصور أن ترسمه هو أن الناس تربط العمل عن بعد بالحرية، سواء حرية ارتداء ما تريد، أو حرية قضاء وقت أكثر مع عائلتك، أو حتى حرية التواجد حول حيوانات أليفة، إن كان هذا ما تريده! وأميل إلى أن العمل عن بعد وخاصة من المنزل يتيح حرية أكبر من المكتب التقليدي، لكن من منظور آخر، فإن ذلك النمط يحتاج إلى تحكم في النفس وحدودًا للعمل، على عكس العمل من مساحات العمل المشتركة أو المقاهي حيث يمكنك الفصل بين المنزل والعمل. أضف إلى هذا أن العمل من المنزل يعني أن من السهل قضاء اليوم كله في السرير، وهذا ما يفعله بعض الناس وفقًا لدراسة وجدت أن 80% من العاملين الشباب يعملون وهم في أسرّتهم. وقد تجنبت ذلك النمط طيلة حياتي المهنية حتى الآن، فوضعت قاعدة لنفسي حين بدأت العمل في Buffer أني لن أعمل أبدًا في السرير، وسأوضح لك في هذا المقال ثلاثة أسباب لهذا. 1. غرفة النوم لن تكون مريحة من الجيد أن تأكل في مكان ﻻ ترتاح فيه، وتنام في مكان ﻻ تعمل فيه، فقد عملت فترة من شقتي واستطعت أن أخصص مساحات مختلفة للأكل والعمل والنوم، رغم أن العمل وتناول الطعام في مكان واحد كان ليكون أسهل بكثير. ويؤكد قسم طب النوم في هارفارد فكرة أن العمل يجب ألا يكون من نفس المكان الذي تنام فيه، فيقولون "إبقاء الحواسيب وأجهزة التلفاز ومواد العمل خارج غرفة الراحة سيزيد من العلاقة بين النوم وغرفة النوم في ذهنك". ذلك يعني أنك إن كنت تعمل من سريرك فسيصبح من الصعب عليك أن تنام بينما ﻻ يزال عقلك يظن أنك في مكان للعمل. 2. الفصل بين العمل والمنزل قد يصعب التفرقة بين عملك وحياتك العادية إن كنت تعمل من المنزل ما لم تغادره إلى مقهى أو مساحة عمل مشتركة، ذلك أن مكان العمل والراحة قريبان من بعضهما، فمن السهل أن تخلط الاثنين معًا، رغم أن الأفضل طبعًا ألا تفعل. فوفقًا لدليل من مراجعات أعمال هارفارد HBR لزيادة إنتاج الفرد العامل:“قد تبدأ في الإحساس أنك دومًا في العمل، وتفقد مكانًا تخصصه كبيت لك". ذلك أن كونك "دومًا في العمل" ليس فكرة سديدة لحياة متوازنة، فهذا سبب آخر لكي تبقى بعيدًا عن السرير أثناء العمل، مع الحفاظ على تخصيص مساحة للعمل وأخرى للراحة. 3. قلة جودة النوم إن عملي من السرير يعني أني أصطحب حاسوبي المحمول أو هاتفي أحيانًا إلى السرير، وأكاد أجزم أن هذا يحدث لكثير من الناس من أمثالي أيضًا، لكن هذا سيؤثر سلبًا على جودة نومي، فالعمل قبل النوم مباشرة -خاصة مع النظر إلى شاشة زاهية- يقلل الميلاتونين الذي تحتاجه للنوم، هذا يعني أنك ستعاني أكثر من أجل نوم أفضل، ومن ثمّ سيتأثر إنتاجك في اليوم التالي. فهذه تعد معادلة خاسرة من كلا الطرفين، إذ أنك ستخسر حياتك العملية بسبب قلة إنتاجك، وراحتك في المنزل بسبب سوء نومك. ما يجب أن تفعله بدلًا من العمل من السرير هناك الكثير من الأمور التي يمكننا فعلها لتجنب العمل من السرير مع الحفاظ على نوم صحي وضمان إحساسنا بالراحة في منازلنا، ولزيادة إنتاجنا في اليوم التالي، إليك اثنين من هذه الأمور: 1. احفظ أجهزتك بعيدًا عن السرير ﻻ تحضر هاتفك أو حاسوبك المحمول إلى سريرك كي ﻻ تضطر إلى العمل من هناك، ذلك يعزز في نفسك أهمية خلق مساحة لسريرك وغرفة نومك ﻻ ينازعها العمل. وهكذا تنام بشكل أفضل وتفصل بين العمل والمنزل، كي ﻻ تشعر أنك تعمل طول اليوم. 2. أنشئ مساحة خاصة للعمل بما أن العمل ﻻ يجب أن يكون في سرير نومك كما ذكرنا مرارًا هنا، فإن المنطق يقتضي أن يكون له مساحة خاصة به، ولو كانت في منزلك، فقد تكون منطقة في المنزل أو مجرد منضدة، وإن كان الفصل صعبًا عليك في حالتك، فربما يحسن بك أن تبحث في مقهى قريب أو مساحة عمل مشتركة كي تساعدك على تحقيق هذا العازل بين المنزل والعمل. مزيد من نصائح العمل عن بعد لقد صممنا هذا المقال ليكون مصاحبًا لدليل تريللو : كيف تقدّر العمل عن بعد، فألق نظرة عليه للاطلاع على خطط جديدة لتنظيم العمل عن بعد. واعلم أن نومًا سليمًا يعني إنتاجية أكثر في اليوم التالي ونشاطًا أكبر كذلك، إضافة إلى أن ذلك أساسي لمن يعملون عن بعد على المدى البعيد لتحقيق هذا العازل الذهني والجسدي بين المنزل والعمل. هل جربت أن تعمل من سريرك أنت أيضًا؟ أحب سماع خواطرك حول الأمر، وعن أي طريقة تتبعها للفصل بين راحتك وعملك في التعليقات هنا! ترجمة -بتصرف- لمقال The Science Behind Why We Should Never Work From Bed لصاحبته Hailley Griffis حقوق الصورة البارزة محفوظة لـ Freepik1 نقطة
-
عندما اشتريت حوض استحمام ساخن قبل بضع سنوات، كان مندوب المبيعات ودودًا للغاية، ومتعاونًا، كما أنّه تابع التٌواصل معي لعدّة مرّات من خلال المكالمات الهاتفيّة. وقد قمت بتوفير أموالي لأكثر من سنة لكي أتمكّن من شراء حوض لطيف وكنت متحمّسًا للحصول عليه، فقضاء الوقت في المياه هو من الأمور المفضّلة عندي، لقد قمت بالبحث كثيرًا لكي أعرف أيّ حوض هو الأفضل وأيّها يستهلك أقلّ كميّة ممكنة من الطّاقة وأيّها تدوم علامته التجاريّة لأطول وقت ممكن. وعندما عزمت على شراء الحوض، كل ما كان عليّ فعله هو التّحدث إلى مندوب المبيعات لإتمام شرائه، والذي كان بدوره سعيد بما يقوم به. ولكن بعد ذلك حدث أمرٌ ما، فقد لاحظت أمرًا ما و لأكثر من مرة قبل وخلال عملية الشراء. قمت بدفع المبلغ للحصول على حوض الاستحمام السّاخن ولكنّ المندوب اختفى تمامًأ، وفجأةً أصبح مشغولًا جدًا في محاولاته لأن يبيع الشّخص التّالي. وبعد كلّ ذلك وصل الطّلب متأخرًا، ولم أتمكّن من تركيبه بالشّكل الصّحيح، وعندما حاولت تثبيته تسبب بتضرّر بعض الأشياء المحيطة به أثناء التّركيب وتأخّرت عمليّة الإصلاح لأكثر من ستّة أشهر. أين كان مندوب المبيعات الودود والمتعاون الذي اشتريت منه؟ وكيف يمكن أن يكون متجاوبًا معي في يوم ما ويتجاهلني تمامًا في اليوم التّالي بعد أن حصل على أموالي؟ أنا أخبركم بهذه القصة لتوضيح جانب غير متوقّع في إدارة العمل، فمن المحتمل أن ننسى النّاس الذين أعطونا أموالهم في بعض الأحيان. كما أنّ نسيانهم يكون أسهل عند التّعامل معهم في الإنترنت والمنتجات الرقميّة، وخاصّة عند إطلاق منتج ما حيث يكون هناك عدد كبير من النّاس التي تشتري في نفس الوقت منا، وعندما يكون تركيزنا يتمحور حول الحصول على المزيد من الزّبائن المرتقبين الجدد. وفي بعض الأحيان نحن لا نقابل هؤلاء الناس المهتمّين بمنتجاتنا أو حتّى لا نتحدّث إليهم. ووفقًا لبعض إحصاءات المنتجات الخاصة بي والتي تمّ بيعها فقد كنت بحاجة إلى محادثة واحدة في البريد الإلكتروني مع أكثر من 10 % من النّاس الذين قاموا بالشراء مني. وهذا لا يعني أمرًا سيئًا بالضّرورة، وإنّما يعني أن منشوراتنا أو رسائلنا الإخباريّة تعمل بشكل جيّد، ولكنّها تكون سيّئة عند عدم وجود علاقات سابقة مما يقود إلى علاقات أسوأ على الجانب الآخر من البيع. مع أخد قصة مندوب حوض الاستحمام في عين الاعتبار، فأنا أريد أن أتحدّث إليكم حول كيفيّة القيام بعمل أفضل فيما يتعلّق بعملكم التّجاري الخاص، فيما يلي ثلاثة مسارات من المحتمل أن تسوء فيها الأمور بعد أن يكون شخص ما متشجّعًا بما فيه الكفاية لشراء شيء ما منك: دعم العملاء لو كنت مشغولًا جدًا بأمور البيع بهدف أن تكون متجاوبًا مع الطّلبات، فأنت تفعل الأمر الخطأ. نعم، لقد حصلت بالفعل على أموال هذا الشخص، لذلك فإنّ رسائل البريد الإلكترونيّ الأخرى الخاصّة بالمبيعات قد تعني المزيد من المال، ولكن ليس على المدى البعيد. إنّ معظم الّشركات التي تتعامل بعدم الاحترام مع العملاء لا تدوم طويلًا، هذا الأمر لا يقتصر على عدم عودة العملاء لك في المرّة القادمة عندما يحتاجون خدمة ما، (مثلًا أنا لن أعود لشراء حوض الاستحمام من ذلك الرّجل مرّة أخرى) ولكن هناك أمور سيّئة أخرى من الممكن أن تحدث، الأمر الأول أن القضيّة يمكن أن لا تشمل جميع المنتجات، ربما البعض منها،على سبيل المثال: فإن حوض الاستحمام الساخن سوف يتطلب مني شراء طن من المواد الكيميائيّة بشكل شهري ما دام موجودًا، هل تعلم كم مرّة كنت سوف أشتري تلك المواد الكيميائيّة (التي ربّما تكون قيمتها أكبر من حوض الاستحمام نفسه)؟ على امتداد عمر الحوض من الممكن أن أنفق الآلاف، أو أنفق أكثر من سعر الحوض، والأمر الثّاني والذي ينطبق على جميع المنتجات هو أن التّعامل مع العميل بشكل سيّء لا يعني فقط أنّه لن يشتري منك، بل من الممكن أن يخبر جميع من حوله أن يفعلوا الشيء نفسه، لذلك أنت لن تفقد عميل واحد بل من المحتمل أن يكون العملاء على اتصال مع بعضهم. لذلك يجب أن يكون دعم العملاء مماثلًأ لمستوى الاتّصالات الخاصّة بالمبيعات أو أفضل منها، لكي تنطلق بشكل جيد يتوجّب عليك أن تضع توقّعات العملاء ضمن خدمات الدعم. التّعليم إنّ جميع ما يشتريه أيّ شخص تقريبًأ يحتاج إلى القليل من التّعليم لكي نضمن أنّهم يفهمون كيف يعمل الشيء الذي اشتروه، وكيف يحصلون على أقصى استفادة منه، فالنّاس ينفقون أموالهم لأنهم يعتقدون أنّ ما يشترونه سوف يجعلهم أفضل أو أكثر سعادة راحة. حتى لو كنت تبيع “yo-yos” (تفسير النفس الجميلة)، يمكنك أن تبيّن لشخص ما كيفية استخدامها بشكل أفضل، أو حتى الحيل التي يمكن أن يتعلّمها، عندها سوف يكون أكثر سعادة ورضى تجاه المنتج الذي اشتراه. عندما يكون الأمر أعظم من ذلك بكثير، مثل دورة على شبكة الإنترنت، إذا لم تعلّمهم كيفية استخدامها بأفضل شكل أو كيف يمكنهم الاستفادة منها بأقصى شكل ممكن، فهناك احتمالات بعدم اتباعهم للدورات والدروس وعدم قيامهم بأي عمل. إنّ أشياء مثل إجراء ندوات للعملاء الحاليين على الإنترنت سوف تحدث فرقًا كبيرا في عمليّة دفع النّاس لشراء المنتج الخاص بك، لأنّهم لو استخدموا المنتج وقدّم لهم خدمات جيدة فسوف يخبرون الجميع عنك وعن روعة منتجك. المتابعات إن معظم الموظّفين مثل مندوب حوض الاستحمام لديهم مشاعر الحب والجفاء تجاه العملاء، وينطبق الشّيء نفسه على الأشخاص الذين يبيعون السّيارات (أنا أعلم لأنني قضيت سنوات في البحث عن السّيارات والتّحدث إلى مندوبي مبيعات السيّارات). وسوف يتّصلون ويتّصلون، ويتابعون معك مرارًأ وتكرارًأ قبل عمليّة الشرّاء، وهذا عندما تفكّر في أن تشتري، ولكن بعد ذلك، في اللّحظة التي تقوم فيها بالشّراء، فلن تسمع صوتهم مرّة أخرى، على الرّغم من ذلك، وعلى غرار معظم الأشياء الأخرى، فإنّها لن تكون المرّة الأخيرة التي ستشتري فيها حوض استحمام أو سيارة. في الواقع، إذا كنت تتمتّع بتجربة شراء ودعم مقدّم بعد البيع، فإنك لن تحتاج للتّسوق بعيدًا في المّرة القادمة، كل ما عليك فعله هو التّوجه مباشرة إلى متجر حوض الاستحمام الساخن أو مركز بيع السّيارات التي اشتريت منه من قبل والشرّاء مرة أخرى. وينطبق الشيء نفسه على الأعمال التّجارية عبر الإنترنت: تريدُ منهم القدوم إليك بشكل مباشر لأنك فعلت ذلك بشكل جيّد في المرّة الأولى، وكنت قد كسبتهم مرة أخرى… خاتمة هذه النّصيحة لا تقتصر على مجرّد كيفيّة أن تكون رجل أعمال مثير أو حول إدارة الأعمال التي تقدّم الرّعاية لعملائها لأنّه “الشيء الصحيح الذي عليك القيام به”. بل إنّها تقودك إلى التّفكير في المدى القريب لما قبل عمليّة البيع، وكيفيّة كسب شخص ما من خلال حثّه على الشرّاء منك مرّة واحدة وجعله معجبا بأيّ شيء تفعله أو تقوم ببيعه للأبد، حتى لو كنت منطويًا، لا يزال بإمكانك إيلاء الاهتمام بالعملاء الحالييّن عن طريق طرح الأسئلة عليهم. أنا لا أدّعي أنّي أعرف كل النماذج التّجارية المحدّدة من متاجر أحواض الاستحمام السّاخنة، ولكني أعرف أنّ شراء حوض استحمام ساخن هو الحدث الفردي الذي يؤدي إلى مزيد من المشتريات (تقريبا كل شهر) للحوض وعلى طول عمر الحوض، لأنه يتطلّب مجموعة من المواد الكيميائيّة والأجزاء المختلفة مع مرور الوقت، كلّ المتاجر تبيع أحواض الاستحمام، كما أنّها تبيع هذه المواد الكيميائيّة. بالتّأكيد، أنّ بيع منتج واحد قوي هو أمر فعّال جدًا، ولكن المبيعات الإضافيّة تضيف ما قد يصل إلى سنوات أو عقود من إمكانيّة الاستخدام، وهذه المواد ليست رخيصة أيضاً، ومن المحتمل أن تجد بعضها يحمل أسماء ماركات معروفة في بعض مراكز البيع بالتّجزئة، إنها لن تعني لهم أيّ شيء بعد بيعهم تذكرة تحتوي على بند ضمان على مستوى العمر المتوقّع لحوض الاستحمام لشراء تلك المواد الكيميائيّة والتي تصل قيمتها إلى الآلاف من الدولارات على مدى عقد من الزمان، وبما أن هذه الأحواض لن تكون الأحواض الأبدية التي يقتنيها أي شخص، لذلك عندما يقرّر شخص ما أن يتسوّق للحصول على واحدة جديدة فلا تحكم على نفسك بسبب قراره. لذلك فإنّ الأمر لا يقتصر على العبارات المنمّقة وتقديم الاهتمام بالناس الذين يؤيّدون عملك بالرغم من أنّ هذا قد يثير السّخرية بشكل واضح، بل إنّ الأمر يتعلق ببناء علاقات تشجّع على المزيد من التّجارة في المستقبل، يمكنني أن أذهب إلى المتجر الخاص بمندوب حوض الاستحمام كلّ بضعة أسابيع لشراء المنتجات منه، ولكن بدلًا من ذلك سأتوجّه إلى متجر آخر، وأمنحهم أموالي. لا يمكنك قضاء كلّ وقتك في ممارسة الأعمال التّجارية، يتوجّب عليك قضاء بعض الوقت في العمل على منتجك أيضّا. ويتضمّن ذلك البحث عن سبل للتفاعل مع مجموعتين رئيسيّتين من النّاس وهم: العملاء والأشخاص الذين لم يصبحوا عملاء بعد، . وهذا يعني التّحدث معهم، وعمل مسح لهم، ومتابعتهم، والتّفاعل معهم حتى تتمكّن من معرفة السبب الذي دفعهم للشراء أو عدم الشرّاء، ومعرفة ما يحصلون عليه من قيمة مضافة في منتجاتك الخاصة (أو ما لا يحبّون وجوده في المنتج)، فضلًا عن النّجاح الذي يلمسونه من في استخدام المنتج. لا تتجاهل العملاء الحالييّن، فإذا ما شاهدوا نجاحًا في استخدام منتجك فيمكن أن تستخدم هذه القصّة في بيع منتجك بشكل أكثر فعاليّة مع دراسة الحالات أو قصص النّجاح أو حتى الشهادات. العديد من الشّركات تتوقّف عن الاهتمام بالعميل بمجرد أن يقوم شخص ما بالضّغط على الزر ويشتري، إنهم يقضون أغلب وقتهم في عملية البيع ولا يخصّصون أي جزء من وقتهم لكسب رضى العميل والاحتفاظ به. لذلك لم أكن أريدك أن تكون بمنزلة مندوب حوض الاستحمام لعملائك وإلا سوف يتحدّثون عنك، ولكن ليس بطريقة جيّدة، كما فعلت للتو. ترجمة -وبتصرّف- للمقال Never ignore existing customers لصاحبه Paul Jarvis1 نقطة
-
تعلمت في الماضي عن الأشياء التي يجب أنْ تفعلها عندما ترغب في إغلاق مدونتك التابعة “affiliate blog”. على أيّة حال، فاستعدادك لترك موقعك الإلكتروني لا يعني أنْ تتخلى عنه مطلقًا. قد تكون قادرًا على بيع موقعك لتحقيق بعض الأرباح. تسليم موقع إلكترونيّ لشخصٍ آخر ليس معقّدًا جدًّا. بمجرّد أنْ يتمّ الاتفاق على السعر ودفعه ،سيصبح نقل إمكانيّة الوصول إلى جميع الحسابات المتعلقة به أمرًا سهلًا. إذا كان موقعك الإلكتروني متوسّط النجاح ولديك القليل من الصبر، فإن بيع موقعك التابع “affiliate website” لن يشكّل مشكلة. في هذا المقال، ستتعلّم كيفيّة عمل آليّة بيع المواقع بشكلٍ عام، وكيفيّة تقرير ما إذا كان ينبغي عليك بيع موقعك أمْ لا. ثمّ سنتحدث عن آليّة بيع الموقع التابع، بما في ذلك كيفيّة تحديد السعر المناسب. فلننتقل إلى ذلك! هل يقوم الناس حقًا ببيع مواقعهم الإلكترونية التابعة (وهل ينبغي عليك ذلك)؟ تباع بعض المواقع الإلكترونيّة مقابل مئات الآلاف من الدولارات، لكنّ هذه الأسعار استثنائية. نعم، يقوم الناس بالفعل ببيع المواقع الإلكترونية التابعة. حتّى لو كان بيع موقعك الإلكتروني مجرّد احتمال. المواقع الإلكترونية مثلها مثل أيّ ممتلكات أخرى، بمعنى أنّه يمكنك تسليمها لشخص آخر لقاء أيّ مقابل تريده. مئات من المواقع تنتقل من شخص إلى آخر كلّ يومٍ على منصاتٍ مخصصةٍ لبيع المواقع الإلكترونيّة. أولًا، تقوم بعرض موقعك للبيع. تضع قائمة توضّح الأشياء الموجودة فيه. ويمكنك أنْ تجد مشترٍ خاصّ بدلًا من ذلك. وبمجرّد الموافقة على سعر البيع النهائي، يتوفّر لك خيار استخدام خدمة الضمان للإشراف التلقائيّ على الصفقة. تساعدك المنصات المماثلة ل “Empire Flippers” و “Flippa” بالقيام بعملية التوضيح والتسليم بأكملها لقاء رسوم محددة. على أيّة حال، هل ينبغي عليك أنْ تبيع موقعك الإلكتروني؟ هذه قائمة من الأسئلة السريعة التي ستساعدك في تقرير ما إذا كانت هذه الفكرة جيّدةً أم لا: هل لديك الوقت الكافي لقضائه في العمل على الجوانب الضروريّة لموقعك؟ هل لا تزال متحمّسًا لعملك أو لإنتاج محتوىً له؟ هل تشعر بالحماس حول إمكانية التركيز على مشروع جديد عوضًا عنه؟ هل تشعر بأنّ أرباحك مستقرّة؟ إذا كان الجواب لمعظم هذه الأسئلة هو “نعم”، فقد حان الوقت لتقرر أنْ تبيع مدونتك التابعة. خذ وقتك في القرار. بيع موقع إلكتروني هو خطوة دائمة، فبمجرّد أنْ تأخذ استراحةً قصيرةً ستكون قادرًا على بناء موقع ٍجديدٍ بنشاطٍ متجدد. وهناك حل بديل، يمكنك أن تستعين بكتّاب مستقلّين آخرين في بعض أعمالك. تعمل هذه الفكرة فقط إذا كان لديك موقع إلكترونيّ ذو دخل معقول، وذلك لأنّ أسعار الكُتّاب المستقلين الجيدين ليست رخيصة. ومع ذلك، يتيح لك هذا النهج الحفاظ على مدخولك من دون أنْ تتحمّل كافّة أعباء العمل بنفسك. وبمجرّد أنْ تقرّر بيع مدونتك التابعة، سيكون وقت الحديث عن الأرقام قد حان! كيفية تسعير مدوّنتك التابعة هناك صيغة تنطبق على كافّة المجالات عند بيع الأعمال التجاريّة. قم بجمع دخلك لفترة معينة من الزمن، ثم قم بحساب المتوسط، ثم قم بمضاعفتها حسب رغبتك. وهكذا دواليك، وعلى سبيل المثال: إذا كنت تعتقد أنّ الأمر مازال مبهمًا بعض الشيء، فأنت محقّ. تدخل العديد من العوامل في عمليّة تحديد قيمة الموقع الإلكترونيّ. فعلى سبيل المثال، قد يكون لديك موقعًا إلكترونيًا يحقق لك ربحًا قدره KaTeX parse error: Expected 'EOF', got 'ش' at position 5: 500 ش̲هريًا، ولكن لم … في الشهر سيكون سعره الأولي ما يقرب من 10,000$. وفي معظم الأحيان لا تباع المواقع التابعة التي ليس لديها أكثر من سنة في القِدم بمبالغ كبيرة. لأن معظم المشاريع التابعة تستغرق عده أشهر دون أن تحقق إيرادات، وتلك الأشهر القليلة الأولى دون إيرادات سوف تخفّض متوسط الدخل الخاصّ بموقعك الإلكتروني. بمجرد التماس بعض النتائج الإيجابية، يجب عليك المواظبة على تطوير المشروع حتى يستقرّ، ومن ثم يمكنك البدء بالبحث عن أشخاصٍ قد يكونون مستفيدين من شرائه. عندما تصبح متأكدًا من أنّ موقعك جاهزٌ للبيع، يمكنك البحث في نطاق عملك عن أيّ أحدٍ قد يكون مهتمًّا به. ومن المحتمل بعد ذلك أنْ تجد أحدًا مهتمًا بأنْ يشتريه لكي يضع أعماله فيه. من ناحية أخرى، إذا كنت تفضّل استخدام خدمة للقيام بعملية العثور على العملاء عوضًا عنك والتفاوض على أفضل سعرٍ ممكن، فسيكون موقع “Empire Flippers” الخيار الأفضل لك. ماذا ينبغي عليك أنْ تفعل بعد بيع موقعك الإلكتروني التابع من الناحية المثالية، يجب أن يكون لديك خطةٌ احتياطيةٌ لما عليك القيام به بعد بيع موقعك التابع. إذا كان كل شيء يسير بسلاسة، فستدّخر بعض المال وستحصل على وقت فراغ كبير. وبأخذ ذلك بعين الاعتبار، في ما يلي بعض الاقتراحات حول كيفية تحقيق أقصى استفادة من ظروفك الجديدة: ضع جزءًا من أرباح مبيعاتك في شبكة أمان والتي يمكنها أن تغطي مصاريفك في كل مكان لمدّة ثلاثة أو ستة أشهر. ابدأ العمل على موقعٍ تابعٍ جديد، يفضّل أن يكون بمجال عملٍ تكون ملمًا به، لتجنّب الإرهاق. إن لم تكن جاهزا لبدء مشروع كتابة جديد بنفسك، قم بتوظيف كتّاب مستقلين عبر مواقعٍ مختصّةٍ بوظائف التدوين. على أية حال، إنْ كنت قادرًا على إنشاء موقعٍ تابعٍ وتطويره من الصفر بنجاح، فهذا يعني أنّك تمتلك مهارةً ثمينةً جدًا لا يجب عليك هدرها. خلاصة بيع الموقع التابع ليس قرارًا سهل الاتخاذ. يجب أنْ تتاكّد من أنّك انتهيت منه قبل تسليمه، حتى لا تندم على قرارك بعد فوات الأوان. يلعب السعر دورًا هامًّا أيضًا لأنّك لا تتمنى أنْ يُبخس حقّك. وهناك قاعدة صغيرة لتسعير موقعك الإلكتروني، وهي أنْ تأخذ متوسّط الأشهر الثلاثة الماضية على الأقلّ وتضربه بالعدد اثنا عشرة. كلّما طالت مدّة وجود الموقع كلّما ازدادت أرباحه، وبالتالي سيزيد السعر الذي يمكن أنْ تطلبه لقاءه. للحصول علي أفضل النتائج الممكنة، ستحتاج إلى استخدام وسيط حسن السمعة، مثل “Empire Flippers”. ترجمة -وبتصرّف- للمقال The Beginner’s Guide to Selling Your Affiliate Website لصاحبه Alexander Cordova1 نقطة
-
أن تكون مصمم ويب ناجح لا يعني مجرد اكتساب بعض المهارات على برنامج فوتوشوب وأحدث إطار CSS. إن التحدي الذي يمكّن الهواة من أن يصبحوا محترفين هو الإدارة الفعالة لحياتهم المهنية كمستقلين. على الرغم من أن بعض هذه المهارات لا يمكن تعلمها بين عشية وضحاها، لكننا سنورد هنا عدد قليل من الأمور التي يمكن القيام بها الآن ليعتقد العملاء بأنك شخص محترف وللقيام أيضًا ببعض التغييرات على مهنتك كمصمم ويب مستقل. 1- لا تهمل العميل: التواصل الفعال هو المفتاح متى كانت آخر مرة قمت فيها بالعمل في شركة حيث وعدتك بالاتصال بك ولم تفعل ذلك أبدًا؟ أو أنها قامت بتجاهل رسائل البريد الإلكتروني عند محاولة حل إحدى المشاكل؟ إن الاتصال الفعال يمكن أن يؤثر سلبًا أو إيجابًا على المهنية في العمل ضمن أي مجال، ولكنه يتمتع بأهمية خاصة في مجال تصميم المواقع الإلكترونية. ويدرك المصممون المحترفون أن التواصل هو الذي سيصنع نجاح المشروع. تساعد التحديثات المنتظمة على التأكد من أن العميل راض عن العمل. وفي حال وجود خلل ما، ستكون في وضع يمكّنك من ضبط الجداول الزمنية والتوقعات وفقًا لذلك. إذا قمت بإهمال العملاء ولم تتواصل معهم بانتظام، فإن ذلك سيؤدي إلى عدم الالتزام بالمواعيد النهائية ولن يتحدث الزبون حول خدمات تصميم الويب لدي لأي شخص. 2- قم دائمًا بتحديد توقعات واضحة لتجنب المشاكل إن لم تكن قد وضعت التوقعات في وقت سابق، فإنك ستواجه بعض المشاكل في الفرص لاحقًا! هناك نوعان من الوثائق المهنية التي يقوم مصممي الويب باستخدامها لضمان فهم عملائهم لعملهم: قم بتوقيع عقد إن مصمم الويب المحترف لا يعمل بدون توقيع عقد. ليس فقط لحمايته، ولكنه يساعده على وضع توقعات واضحة لعملائه. لذا حاول أن تتأكد من أن العقد يحتوي على ما يلي: مخطط للعمل، بما في ذلك عدد المراجعات التي يمكن السماح بها. من يملك حقوق المنتج النهائي. المواعيد النهائية، التكاليف بالمتوسط، رسوم إنهاء العمل المبكر، رسوم التأخير وتواريخ الدفع. إنشاء ملف للأهداف قبل البدء في العمل على مشروع، قم بالاتفاق مع العميل على الأهداف وقم بوضعها ضمن ملف. عندما تأخذ الوقت اللازم لإنشاء هذا الملف، سيكون لديك دليل لطلب المزيد من المال في حال قرر العميل تغيير طبيعة العمل بعد بدء المشروع. وتذكر، في حال قمت أحيانًا بالتساهل مع العميل فلا تجعل من ذلك عادة دائمة. تجنب وضع التوقعات التي ستجعلك تعمل في وقت متأخر من الليل أو في عطلة نهاية الأسبوع فقط لأنك عامل مستقل. 3- قم فقط بالعمل الباهر الذي سيميز محفظتك لن يتطور عملك ولن تنتقل من هاوٍ إلى محترف إن لم تفخر بعملك. في حين أن هذه النصيحة تبدو وكأنها بديهية، إلا أن هناك عدد من المصممين الذين لا يلتزمون بها ويعملون لصالح العميل غير “المثير”. بما أنك ترغب في السعي لبناء قاعدة من العملاء التي تتلاءم مع أهداف حياتك المهنية، فإنك قد تحتاج إلى العمل ضمن مشاريع قد لا تكون هي اختيارك الأول، ولكن يجب ألا تتعامل معها على هذا الأساس. أي شيء يظهر اسمك عليه يجب أن يكون باهرًا ليجعل العميل المقبل حريص على العمل معك. يجب أن تكون أولى أولوياتك هي تقديم أفضل ما لديك، وخاصة إن كنت ترغب بجذب أولئك العملاء الذي يدفعون مبالغ أكبر ويساهمون في تطوير حياتك المهنية كمستقل. 4- لا تتوقف عن البحث ضمن الشبكات عن عملاء جدد يقوم بعض المصممين بخطأ كبير وهو الاعتماد على عدد قليل من العملاء لكسب لقمة العيش. إن مصمم الويب المحترف والناجح يدرك بأن هناك فائدة أكبر في حال وجود قاعدة عملاء متنوعة حيث تتحدث الإحصاءات عن نفسها. وأظهرت إحدى الدراسات التي أجريت مؤخرًا من قبل كونتنتلي أن نصف المستقلين الذين لا يبحثون عن عملاء جدد يكسبون عائدًا أقل من 20000 $ سنويًا. من خلال تخصيص الوقت للبحث عن عملاء جدد بشكل منتظم، يمكنك تجنب الاعتماد على عميل أو اثنين، ففي حال فقدان عميل بشكل غير متوقع، يكون بإمكانك الحصول على عميل جديد خلال شهر. إلى جانب التقدم للحصول على وظائف ضمن شبكة الإنترنت، قم بالابتعاد عن جهاز الكمبيوتر والعودة إلى أساسيات الشبكات. قم بحضور المناسبات الاجتماعية في مدينتك، قم بحضور المؤتمرات، واكتشف العملاء المحتملين. حيث يعتبر ذلك طريقة فعالة للبدء في صنع اسم لنفسك واتصالات تجارية شخصية. 5- قم بعرض عملك ضمن محفظة مهنية على الانترنت إن لم يكن لديك محفظة يتم تحديثها دائمًا أو لم يكن لديك تواجد فعال على وسائل التواصل الاجتماعية فإنك مجرد هاو فقط. يدرك مصممو المواقع المحترفون بأنه يمكن العثور على العملاء بأي مكان، ويدركون أيضًا مدى أهمية عرض تجاربهم، أي ما هي الشركات التي عملت معها والمشاريع التي عملت عليها. وتعرض المحفظة للعملاء المحتملين مدى نشاطك في عالم التصميم وتعطيهم أدلة قوية بشأن قدراتك. عندما تضمن بأن محفظتك مليئة أيضًا بالعمل الذي ترغب في القيام به، فإنك ستجذب العملاء المناسبين وتخطو خطوة نحو العمل على المشاريع التي تلهمك وتجعلك تشعر بالإنجاز. فيما يلي بعض الجوانب الرئيسية التي يجب أن تغطيها محفظة تصميم مواقع الويب على الإنترنت: نماذج إدارة المحتوى التركيب الطباعة الألوان التقنيات مبررات التصميم 6- تصفية العملاء المحتملين للتخلص من العملاء السيئين في مرحلة ما من حياتك المهنية كمستقل، ستضطر للتعامل مع عميل سيء. سواء كان يريد التحكم بعملك أو حتى التواصل بشكل سيء، يمكن أن تكون تجربتك معه محبطة وقد تؤدي إلى فقدان دخلك وحتى وقتك. يقوم مصممو الويب المحترفون بتجنب هذا النوع من العملاء لأنهم لا يريدون من خلال ابتكار عملية فحص لهم. فبدلًا من قبول أي عميل، اسأل نفسك فيما إذا كانت أذواقهم تتفق مع مبادئ التصميم الخاصة بك. إذا كان بإمكانك تقبل العميل الذي يكره الإبداع، ويفضل استخدام الحد الأدنى من التصاميم التي تحبها، فإنك تسعى بنفسك نحو الفشل. من الأمور التي يجب مراعاتها أيضًا خلال هذه العملية فيما إذا كان بإمكان العميل تحمل المبلغ الذي ستطلب به، هل ستحتاج إليه، وفيما إذا كان المشروع متوافقًا مع أهدافك المهنية. عندما تركز على جذب عملاء المميزين في وقت مبكر من حياتك المهنية، سينتهي بك الأمر بالقيام بالمزيد من العمل الذي تحب القيام به. 7- مواكبة أحدث الأفكار وعدم التوقف عن التعلم حتى يكون مصمم الويب المستقل ناجحًا، يجب أن يكون مطلعًا تقنيًا على أهم التغييرات ضمن هذا المجال. يمكن للمحترفين الذين يتعلمون بسرعة أمور أو تقنيات جديدة أن يتميزوا عن المنافسين ليتم طلب خدماتهم بشكل أكبر من قبل العملاء المحتملين. حاول أن تخصص بعض الوقت خلال يوم عملك أو خلال الأسبوع لتعلم أمور جديدة في مجال عملك. قم بقراءة بعض التدوينات عن تصميم المواقع الإلكترونية لمعرفة ما هو جديد، أو قم بالاستثمار في التعليم المستمر عن طريق الاشتراك في ورش العمل، والحصول على الشهادات، أو عن طريق حضور صفوف معينة. تذكر بأنه ليس هناك سن متقدم لتعلم الأشياء الجديدة، وأنك لست بحاجة لامتلاك أحدث المهارات من كل شيء للبقاء على اطلاع، بل تحتاج لتشذيب مهاراتك وتجنب العمل على التقنيات القديمة التي لم تعد مستخدمة. خاتمة ما يميز مصمم الويب الهاو عن المحترف ليس الوقت الذي أمضيته كمستقل، بل هو المواقف التي تعرض لها وطريقة التعامل مع مختلف الأعمال والعملاء. إن الطريق نحو الاحترافية في تصميم الويب ليست سهلًا. إنها صناعة صعبة تتطلب التفاني والعديد من المهارات مثل خدمات العملاء والحفاظ على التواصل وحتى الطلب. ترجمة -وبتصرّف- للمقال How to Quit Acting Like an Amateur Freelance Web Designer لصاحبه Shawn Parrotte حقوق الصورة البارزة محفوظة لـ Freepik1 نقطة
-
يحتوي مشروع الملف الشخصي الخاص بنا على صفحة واحدة حتى الآن. من الواضح أنّ معظم مواقع الويب تمتلك أكثر من صفحة. سنُضيف في هذا الدرس صفحات إضافيّة. إنشاء صفحة جديدة سننشئ ثلاث صفحات جديدة، صفحة من أجل مدوّنة الموقع Blog، وصفحة من أجل المشاريع Projects وأخرى من أجل معلومات التواصل Contact. ستكون هذه الصفحات الرئيسيّة في الموقع. يجب أن نتذكّر دائمًا أنّه يمكن أن نضيف صفحات فرعيّة أخرى لاحقًا. فمثلًا سيكون هناك صفحة فرعيّة لكل تدوينة ضمن المدوّنة. لامتلاك بنية جيّدة ضمن الموقع من الأفضل إنشاء مجلّدات فرعيّة من أجل كلّ صفحة. سيكون لكل مجلّد فرعي ملف index.html خاص به يُعرَض افتراضيًّا عندما يفتح المتصفّح هذا المجلّد. يُعتبر إنشاء صفحة جديدة أمر سهلًا للغاية. من الأفضل نسخ ملف index.html الذي أنشأناه مسبقًا بحيث يكون لدينا البنية الأساسية جاهزة. بعد ذلك نُجري بالطبع بعض التعديلات المناسبة لكلّ صفحة جديدة. ملاحظة: يجب أن نتأكّد بأنّنا لا نستخدم أيّ رمز خاص أو فراغات عند تسمية أي مجلّد فرعي أو ملف. يجب أن نستخدم الأحرف القياسيّة ويُفضّل أن تكون بحالة صغيرة lower case، ومن الجيّد أيضًا فصل الكلمات عن بعضها باستخدام إشارة الناقص (-). صفحة المدونة أنشئ مجلّدًا فرعيًّا ضمن مجلّد portfolio وسمّه blog. انسخ الملف index.html إلى هذا المجلّد الفرعي الجديد. يجب الآن أن تبدو بنية الملفات لديك على الشكل التالي: افتح الملف المنسوخ blog/index.html في المتصفّح (إذا كنت تستخدم Brackets انقر زر Live Preview). ستلاحظ وجود أمرين لا يعملان بشكل صحيح: صور الصفحة لا تظهر. الألوان المعرّفة ضمن ملف css غير مُطبّقة في هذه الصفحة. يعود السبب في ذلك هو أنّنا ضمن مجلّد فرعي، فالمسار الخاص بملفات الصور لم يعد صحيحًا. لكي نسمح للصور بالظهور يجل أن نستخدم المسار marco.jpg/.. بدلًا من marco.jpg ضمن السمة src لعنصر الصورة img. ولكن من المؤكّد أنّنا لن نريد استخدام نفس الصور ضمن صفحة المدوّنة. لذلك يمكن إزالة العنصر img بشكل كامل. جرت العادة أن نعرّف قواعد css بحيث تكون شاملة لكل صفحات موقع الويب. وهكذا فإنّه من الضروري أن نشير إلى نفس ملف css الذي يحوي هذه القواعد وذلك ضمن ملف المدوّنة. يمكننا ذلك بتغيير عنوان URL من main.css إلى main.css/.. ضمن عنصر link. يوضّح السطر التالي شكل عنصر link بعد تعديل الملف blog/index.html: <link rel="stylesheet" href="../main.css"> سيؤدي تعديل عنوان ملف css ضمن عنصر link إلى تطبيق تنسيقات css الموجودة ضمن الملف main.css على صفحة المدوّنة. سنغيّر الآن عنوان ومحتوى صفحة المدوّنة. blog/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="../main.css"> <title>Blog - Web Portfolio of Marco</title> </head> <body> <h1 class="title">Blog</h1> <p>I write about things I encounter while learning web programming.</p> <h2>Blog Entries</h2> <!-- Here will be a list of all the blog entries. --> </body> </html> يمكننا رؤية بعض الوسوم الجديدة في الشيفرة السابقة وهي <-- و --!> حيث يمكننا أن نكتب تعليق comment بين الرمزين السابقين. الهدف من التعليقات هو كتابة بعض الملاحظات التوضيحيّة لنا فقط، فهي لا تظهر لمستخدم الصفحة. التدوينة كصفحة فرعية تحتاج مدوّنتنا بالطبع إلى بعض المُدخلات (التدوينات). سننشئ صفحة HTML مستقلّة من أجل كل تدوينة. أنشئ مجلّدًا فرعيًّا ضمن المجلّد blog وسمّه first-entry ثمّ انسخ الملف blog/index.html إلى المجلّد الفرعي first-entry: افتح ملف التدوينة وغيّر محتوياته كما يلي: blog/first-entry/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="../../main.css"> <title>First Entry - Web Portfolio of Marco</title> </head> <body> <h1 class="title">First Entry</h1> <p>April 7, 2015</p> <hr> <p>This is my very first blog entry.</p> </body> </html> لقد وضعت في الشيفرة السابقة عنصر HTML جديد وهو <hr> حاول أن تعرف وظيفته بمفردك، حاول مثلًا إزالته ومن ثمّ انظر إلى تأثير ذلك على الصفحة. أو يمكنك البحث عن معلومات عنه في الانترنت. لنبدأ بكتابة التدوينات أنصح دائمًا أن تبدأ فورًا بكتابة تدويناتك. يمكنك كتابة تدوينة قصيرة في كل مرّة تتعلّم شيئًا جديدًا حول البرمجة. يمكنك الاطلاع على بعض الأفكار التالية التي قد تساعدك في البدء بالتدوين: ماذا تعلّمت اليوم؟ أضف صور توضيحية. أضف روابط إلى مواقع مفيدة. ما هي المشاكل التي واجهتها؟ كيف حللت تلك المشاكل؟ ما العمل الذي يتوجّب عليّ إنجازه في المرّة القادمة؟ بمثل هذه التدوينات السابقة ستتقدّم سريعًا في احتراف البرمجة، وأسباب ذلك: ستكون ملّمًا بما تعلّمته بالتدريج. يمكنك أن تبحث عن المعلومات ضمن وثائقك الشخصيّة. ستتدرّب على HTML وCSS بينما تكتب هذه التدوينات. إذا نشرت موقعك على الانترنت يمكنك أن تجعل تدويناتك متاحة للآخرين. وهذا يساعد على مشاركة المعرفة التي اكتسبتها أو حتى أن تطلب من أحد الأشخاص أن يساعدك على حل مشكلة ما. إذا نشرت ملفّك الشخصي سيكون من الرائع مشاركته مع الآخرين للاطّلاع على إمكانيّاتك وأعمالك. التدوينة الثانية تلميح: أنشئ مجلّدًا فرعيًّا من أجل كل ملف تدوينة جديد. سيسمح لك هذا التنظيم بوضع الصور والملفات الأخرى لكل تدوينة بشكل منفصل عن ملفات التدوينات الأخرى. صفحة المشاريع من المفيد الاحتفاظ بصفحة خاصّة للمشاريع والمهام التي ننجزها. سنحضّر صفحة خاصّة لمثل هذه المشاريع على الرغم من عدم وجود أي محتوى بعد. لنكمل كما فعلنا من أجل صفحة المدوّنة ولننشئ مجلّدً فرعيً اسمه projects ضمن المجلّد الرئيسي portfolio ولننسخ الملف index.html إليه. projects/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="../main.css"> <title>Projects - Web Portfolio of Marco</title> </head> <body> <h1 class="title">Projects</h1> <p>Here you will soon find my web projects.</p> </body> </html> صفحة التواصل سننشئ الآن الصفحة الأخيرة من الصفحات الرئيسيّة في الموقع وهي صفحة التواصل Contact. أنشئ مجلّدًا اسمه contact ضمن المجلّد الرئيسي portfolio وانسخ الصفحة index.html إليه. ملاحظة مهمّة: كُن حذرًا فيما يتعلّق بالمعلومات التي ترغب بنشرها للعموم. فمثلًا لا تنشر بريدك الإلكتروني الرئيسي، لأنّه من الممكن أن تستقبل بريدًا مزعجًا. contact/index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" href="../main.css"> <title>Contact - Web Portfolio of Marco</title> </head> <body> <h1 class="title">Contact</h1> <p> You can contact me by email: <a href="mailto:spammails@gmx.ch">spammails@gmx.ch</a> </p> <p> Marco Jakob<br> Switzerland </p> </body> </html> يمكننا أن نلاحظ وجود عنصر HTML جديد بجوار اسم Marco Jakob وهو العنصر <br>. يعمل هذا العنصر على الانتقال إلى سطر جديد ضمن الصفحة. نلاحظ أيضًا الرّابط الخاص mailto الذي يوجد على يسار البريد الإلكتروني (ضمن السمة href). سيعمل هذا الرّابط في حال نقره على فتح برنامج البريد الإلكتروني الافتراضي المثبّت على حاسوبك، مع فتح رسالة جديدة بعنوان البريد الإلكتروني المطلوب. لدينا الآن خمس صفحات HTML: سنزوّد موقعنا في الدرس السادس بوسيلة للتنقّل بين صفحاته. ترجمة -وبتصرّف- للمقال HTML & CSS Tutorial - Part 5: Blog and Other Pages لصاحبه Marco Jakob.1 نقطة
-
في هذا المقال، نقدم لكم لمحة سريعة عن أساسيات لغة البرمجة روبي، ويعتبر هذا المقال مُخصص بالدرجة الأولى للمبتدئين في تعلم اللغة ولديهم أرضية مسبقة عن مفاهيم البرمجة بشكل عام. سنتناول في هذا المقال المواضيع التالية: كتابة التعليقات. المصفوفات. جمل التحكم. معالجة الخطأ. بناء الوظائف. جملة yield. الفئات. ملاحظة: ناتج تنفيذ الأمثلة والأوامر الموجودة في هذا المقال تقع بعد علامة #=> من كل نتيجة أو أمر. كتابة التعليقات # هذا تعليق =begin تعليق من أكثر من سطر =end قبل البدء، لا بد من التنويه أن كل شيء عبارة عن كائن في لغة روبي. الأرقام عبارة عن كائنات، والوظيفة class في السطر التالي تعيد نوع الكائن: 3.class #=> Fixnum 3.to_s #=> "3" العمليات الحسابية والثنائية 1 + 1 #=> 2 8 - 1 #=> 7 10 * 2 #=> 20 35 / 5 #=> 7 2**5 #=> 32 5 % 3 #=> 2 3 & 5 #=> 1 3 | 5 #=> 7 3 ^ 5 #=> 6 العمليات الرياضية سهلة الاستدعاء على مستوى الكائن: 1.+(3) #=> 4 10.* 5 #=> 50 بعض القيم تُعتبر كائنات مثل: nil # تشبه القيمة الفارغة في اللغات الأخرى true # صحيح منطقي false # خطأ منطقي nil.class #=> NilClass true.class #=> TrueClass false.class #=> FalseClass المساواة: 1 == 1 #=> true 2 == 1 #=> false اللامساواة: 1 != 1 #=> false 2 != 1 #=> true تُعتبر القيمة الفارغة مرادفة للقيمة المنطقية الخاطئة: !nil #=> true !false #=> true !0 #=> false المقارنات: 1 < 10 #=> true 1 > 10 #=> false 2 <= 2 #=> true 2 >= 2 #=> true عمليات المقارنة المُجمعة: 1 <=> 10 #=> -1 10 <=> 1 #=> 1 1 <=> 1 #=> 0 العمليات المنطقية: true && false #=> false true || false #=> true !true #=> false يوجد نسخة أخرى من العمليات المنطقية ولكن بتطبيق مفهوم الأولوية المنخفضة، مما يعني استخدامها كبناء للتحكم في التدفقات (Flow Control) وربط الجمل ببعضها حتى تقوم أحدها بإرجاع قيمة منطقية صحيحة أو خاطئة. فمثلا، في السطر التالي تُستدعى do_something_else في حال كان استدعاء do_something ناجحاً. do_something() and do_something_else() وهنا يُستدعى log_error في حال فشل استدعاء: do_someting do_something() or log_error() النصوص النصوص عبارة عن كائنات: 'I am a string'.class #=> String "I am a string too".class #=> String placeholder = 'use string interpolation' "I can #{placeholder} when using double quoted strings" #=> "I can use string interpolation when using double quoted strings" يُفضل استخدام علامة التنصيص المنفردة على المزدوجة وذلك قدر الإمكان. علامة التنصيص المزدوجة تُضيف بعض الحسابات الداخلية الزائدة، ومن الممكن جمع النصوص ببعضها بشرط عدم استخدام الأرقام. 'hello ' + 'world' #=> "hello world" 'hello ' + 3 #=> TypeError: can't convert Fixnum into String 'hello ' + 3.to_s #=> "hello 3" دمج النصوص مع العمليات: 'hello ' * 3 #=> "hello hello hello " الإضافة لنص: 'hello' << ' world' #=> "hello world" لطباعة نص وسطر في النهاية نستخدم وظيفة puts: puts "I'm printing!" #=> I'm printing! #=> nil طباعة نص دون سطر في النهاية: print "I'm printing!" #=> I'm printing! => nil المتغيرات تعريف المتغيرات: x = 25 #=> 25 x #=> 25 استخدام عملية المساواة تُرجع القيمة المستخدمة وهذا يعني أنك تستطيع إجراء عمليات مساواة متعددة كما المثال التالي: x = y = 10 #=> 10 x #=> 10 y #=> 10 من المتعارف عليه استخدام طريقة snake_case في تسمية المتغيرات: snake_case = true حاول أن تستخدم أسماء متغيرات ذات دلالة: path_to_project_root = '/good/name/' path = '/bad/name/' الرموز (Symbols) في لغة روبي عبارة عن كائنات، وهي ثابتة. وتُمَثِّل الرموز ثوابت من الممكن إعادة استخدامها ويتم تمثيلها داخليا بأرقام. وغالبا يتم استخدامها بدلا من النصوص لتوصيل قيم ذات معنى ومحددة: :pending.class #=> Symbol status = :pending status == :pending #=> true status == 'pending' #=> false status == :approved #=> false المصفوفات لتعريف مصفوفة نقوم بالتالي: array = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5] من الممكن أن تحتوي المصفوفة على عناصر ذات أنواع مختلفة: [1, 'hello', false] #=> [1, "hello", false] يتم فهرسة المصفوفات بطريقة أمامية: array[0] #=> 1 array.first #=> 1 array[12] #=> nil ومن الممكن فهرستها بطريقة عكسية: array[-1] #=> 5 array.last #=> 5 ومن الممكن تحديد فهرس البداية والنهاية للحصول على جزء أو شريحة من المصفوفة: array[2, 3] #=> [3, 4, 5] نستخدم وظيفة reverse لإجراء عملية عكس المصفوفة: a=[1,2,3] a.reverse! #=> [3,2,1] من الممكن أيضا أن نستخدم نطاقًا لإجراء عملية الاقتطاع من المصفوفة بالطريقة التالية: array[1..3] #=> [2, 3, 4] لإجراء عملية الإضافة على المصفوفة نقوم بالتالي: array << 6 #=> [1, 2, 3, 4, 5, 6] أو : array.push(6) #=> [1, 2, 3, 4, 5, 6] للتأكد من وجود قيمة في المصفوفة نستخدم الوظيفة include : array.include?(1) #=> true هاش Hash الهاش Hash في لغة روبي هو القاموس الرئيسي باستخدام المفتاح والقيمة، ولتعريف الهاش نستخدم الأقواس المزخرفة: hash = { 'color' => 'green', 'number' => 5 } hash.keys #=> ['color', 'number'] يتم البحث في الهاش باستخدام المفتاح بالطريقة التالية: hash['color'] #=> 'green' hash['number'] #=> 5 في حالة البحث في الهاش باستخدام مفتاح غير موجود فإن النتيجة المرجعة هي nil : hash['nothing here'] #=> nil بعد نسخة روبي 1.9 يوجد طريقة خاصة لاستخدام الرموز كمفاتيح للهاش: new_hash = { defcon: 3, action: true } new_hash.keys #=> [:defcon, :action] لفحص وجود مفتاح أو قيمة في الهاش نستخدم الطريقة التالية: new_hash.key?(:defcon) #=> true new_hash.value?(3) #=> true ملاحظة/ المصفوفات والهاش في الروبي قابلة للعد (Enumerable) ، وكلاهما يحتوي على مجموعة من الوظائف المفيدة. جمل التحكم جملة الشرط: if true 'if statement' elsif false 'else if, optional' else 'else, also optional' end جملة التكرار for: for counter in 1..5 puts "iteration #{counter}" end #=> iteration 1 #=> iteration 2 #=> iteration 3 #=> iteration 4 #=> iteration 5 على الرغم من وجود جملة التكرار وشيوعها، إلا أنه لا يوجد من يستخدمها، وبدلا من ذلك يجب عليك استخدام جملة each وتمرير كتلة من الشفرة البرمجية لها. هذه الكتلة من الشفرة البرمجية تُرادف lambdas أو الوظائف الوهمية. عند استخدام وظيفة each مع نطاق من الأرقام، فإن كتلة الشفرة البرمجية المُمَرَرَة لها تُنفذ مرة واحدة مع كل عنصر من النطاق. يُمرَّر عداد كمعامل لكتلة الشفرة البرمجية،وتُكتَب جملة each بالطريقة التالية: (1..5).each do |counter| puts "iteration #{counter}" end #=> iteration 1 #=> iteration 2 #=> iteration 3 #=> iteration 4 #=> iteration 5 نستطيع إحاطة كتلة الشفرة البرمجية بأقواس مزخرفة: (1..5).each { |counter| puts "iteration #{counter}" } نستطيع استخدام each للمرور على محتويات التراكيب مثل المصفوفات والهاش: array.each do |element| puts "#{element} is part of the array" end hash.each do |key, value| puts "#{key} is #{value}" end إذا كنت تريد الحصول على فهرس العنصر الذي تمر عليه في جملة each تستطيع استخدام جملة each_with_index وتعريف متغير الفهرس من خلالها. انظر المثال التالي: array.each_with_index do |element, index| puts "#{element} is number #{index} in the array" end counter = 1 while counter <= 5 do puts "iteration #{counter}" counter += 1 end #=> iteration 1 #=> iteration 2 #=> iteration 3 #=> iteration 4 #=> iteration 5 توجد مجموعة من الوظائف الأخرى لتنفيذ الحلقات Loops في لغة الروبي، فمثلا توجد map، reduce ، inject والقائمة تطول. Map تأخذ مصفوفة كمعامل، وتقوم بالمرور على عناصرها وإجراء عمليات عليها وترجعها في مصفوفة جديدة، كما المثال التالي: array = [1,2,3,4,5] doubled = array.map do |element| element * 2 end puts doubled #=> [2,4,6,8,10] puts array #=> [1,2,3,4,5] جملة case : grade = 'B' case grade when 'A' puts 'Way to go kiddo' when 'B' puts 'Better luck next time' when 'C' puts 'You can do better' when 'D' puts 'Scraping through' when 'F' puts 'You failed!' else puts 'Alternative grading system, eh?' end #=> "Better luck next time" نستطيع استخدام نطاق مع جملة case بالطريقة التالية: grade = 82 case grade when 90..100 puts 'Hooray!' when 80...90 puts 'OK job' else puts 'You failed!' end #=> "OK job" معالجة الخطأ begin raise NoMemoryError, 'You ran out of memory.' rescue NoMemoryError => exception_variable puts 'NoMemoryError was raised', exception_variable rescue RuntimeError => other_exception_variable puts 'RuntimeError was raised now' else puts 'This runs if no exceptions were thrown at all' ensure puts 'This code always runs no matter what' end بناء الوظائف والدوال def double(x) x * 2 end الوظائف ضمنيا تعيد قيمة آخر جملة في الوظيفة: double(2) #=> 4 الأقواس تُعتبر إضافية، ومن الممكن استدعاء الوظيفة من دونهم: double 3 #=> 6 double double 3 #=> 12 def sum(x, y) x + y end معاملات الوظائف يتم الفصل بينها بواسطة الفاصلة. sum 3, 4 #=> 7 sum sum(3, 4), 5 #=> 12 جملة yield كل الوظائف تمتلك ضمنيا معامل كتلة إضافي خاص بها، وتُستدعى بواسطة كلمة yield : def surround puts '{' yield puts '}' end surround { puts 'hello world' } # { # hello world # } تستطيع تمرير كتلة من الشفرة البرمجية للوظيفة، ونستخدم رمز & لحفظ عنوان كتلة الشفرة البرمجية المُمَرَرَة. def guests(&block) block.call 'some_argument' end تستطيع تمرير أكثر من معامل للوظيفة بشكل غير محدد باستخدام رمز *، وهذه المجموعة من المعاملات تتحول إلى مصفوفة والتي بدورك تستطيع المرور عليها باستخدام جملة each: def guests(*array) array.each { |guest| puts guest } end إذا كانت الوظيفة تُرجع مصفوفة، فإنك تستطيع استخدام المساواة المتعددة لأكثر من متغير في نفس الوقت (unpacking): def foods ['pancake', 'sandwich', 'quesadilla'] end breakfast, lunch, dinner = foods breakfast #=> 'pancake' dinner #=> 'quesadilla' من المتفق عليه أن كل الوظائف التي تعيد قيمة منطقية لابد أن تنتهي بعلامة استفهام عند استدعائها: 5.even? # false 5.odd? # true إذا كانت الوظيفة تنتهي بعلامة تعجب، فهذا يعني أن التغيير الذي يتم على المتغير أو العنصر يكون مباشرا على قيمته، أما بدون علامة تعجب، فإن العملية لا تؤثر على العنصر، ويتم إعادة التغيير في عنصر جديد. انظر للمثال التالي: company_name = "Dunder Mifflin" company_name.upcase #=> "DUNDER MIFFLIN" company_name #=> "Dunder Mifflin" company_name.upcase! # we're mutating company_name this time! company_name #=> "DUNDER MIFFLIN" الأصناف Classes تُعرَّف الأصناف باستخدام الكلمة المحجوزة class: class Human نعرّف في ما يلي متغيرًا على مستوى الصنف، وهو مُشارَك بين الكائنات المتولدة الخاصة بهذا الصنف: @@species = 'H. sapiens' الطريقة الأساسية للاستهلال Initialization : def initialize(name, age = 0) إعطاء قيمة المعامل “الاسم” للمتغير الخاص بالكائن المتولد من الفئة بنفس الاسم @name = name في حالة عدم تمرير معامل باسم “العمر” فإن القيمة التلقائية هي التي ستمرر للمتغير الخاص بالكائن المتولد: @age = age end وظيفة التعديل الأساسية (Setter): def name=(name) @name = name end وظيفة الاسترجاع الأساسية (Getter): def name @name end نستطيع تنفيذ وظيفتي التعديل والاسترجاع بواسطة attr_accessor كالتالي: attr_accessor :name ويمكن فصل العمليتين عن بعضهما. المُسترجِع :getter attr_reader :name المعدِّل setter: attr_writer :name للتمييز بين الوظائف الخاصة بالصنف، والوظائف الخاصة بالكائن المتولد من الصنف، نستخدم كلمة self، وهي خاصة لتعريف الوظائف على مستوى الفئة. def self.say(msg) puts msg end def species @@species end end تعريف كائنين من الصنف Human: jim = Human.new('Jim Halpert') dwight = Human.new('Dwight K. Schrute') استدعاء بعض الوظائف: jim.species #=> "H. sapiens" jim.name #=> "Jim Halpert" jim.name = "Jim Halpert II" #=> "Jim Halpert II" jim.name #=> "Jim Halpert II" dwight.species #=> "H. sapiens" dwight.name #=> "Dwight K. Schrute" استدعاء الوظيفة على مستوى الصنف: Human.say('Hi') #=> "Hi" يُعرَّف مجال المتغيرات في المكان التي عُرِّف فيه المتغيّر، والمتغيرات التي تبدأ ب علامة $ تكون على مستوى النطاق الواسع Global Variable: $var = "I'm a global var" defined? $var #=> "global-variable" المتغيرات التي تبدأ بعلامة @ تكون على مستوى الكائن المتولد: @var = "I'm an instance var" defined? @var #=> "instance-variable" المتغيرات التي تبدأ ب @@ تكون على مستوى الصنف: @@var = "I'm a class var" defined? @@var #=> "class variable" المتغيرات التي تبدأ بحرف كبير تكون ثوابتا: Var = "I'm a constant" defined? Var #=> "constant" المتغير الخاص بالصنف يتشاركه الصنف وكل الأصناف التي تريث منه: # base class class Human @@foo = 0 def self.foo @@foo end def self.foo=(value) @@foo = value end end # derived class class Worker < Human end Human.foo # 0 Worker.foo # 0 Human.foo = 2 # 2 Worker.foo # 2 المتغير الخاص بالكائن المتولد من الصنف غير مشارك أو مرئي في الأصناف التي ترث من الصنف الرئيسي: class Human @bar = 0 def self.bar @bar end def self.bar=(value) @bar = value end end class Doctor < Human end Human.bar # 0 Doctor.bar # nil عند استخدام عملية include لتضمين وحدة Module داخل صنف، فإن الوظائف الخاصة بالوحدة تكون مضمنة في الكائنات المتولدة من الصنف. وعند استخدام عملية extend للوحدة داخل صنف، فإن الوظائف الخاصة بالوحدة تكون مضمنة في نفس الصنف. module ModuleExample def foo 'foo' end end class Person include ModuleExample end class Book extend ModuleExample end Person.foo # => NoMethodError: undefined method `foo' for Person:Class Person.new.foo # => 'foo' Book.foo # => 'foo' Book.new.foo # => NoMethodError: undefined method `foo' تُنفَّذ دوال استرداد Callbacks عندما تُطبَق include أو extend على الوحدة : module ConcernExample def self.included(base) base.extend(ClassMethods) base.send(:include, InstanceMethods) end module ClassMethods def bar 'bar' end end module InstanceMethods def qux 'qux' end end end class Something include ConcernExample end Something.bar # => 'bar' Something.qux # => NoMethodError: undefined method `qux' Something.new.bar # => NoMethodError: undefined method `bar' Something.new.qux # => 'qux' ترجمة – بتصرّف – للمقال Learn X in Y minutes Where X=ruby.1 نقطة
-
المخطط الانسيابي هو رسم بياني يوضّح مراحل عملية ما بترتيب تسلسلي. يتم تمثيل مراحل العملية باستخدام أشكال أو رموز ذات دلالات معيّنة، وتُربط هذه الأشكال باستخدام الأسهم التي توضّح اتجاه سير (انسياب) العملية. سنتعلم في هذا الدرس كيفية رسم المخططات الانسيابية باستخدام الأشكال في PowerPoint بالإضافة إلى طريقة تحريكها لجعل العروض التقديمية أكثر احترافية وأكثر جذبًا لانتباه المشاهدين. دلالات أشكال/رموز المخطط الانسيابي يتكون المخطط الانسيابي من عدد من الأشكال، ويحمل كل شكل منها دلالة معينة ينبغي معرفتها لكي يكون بإمكانك رسم مخطط سهل الفهم وذو مغزى. على سبيل المثال، يُستخدم الشكل البيضوي للدلالة على بداية أو نهاية العملية. ويستخدم الشكل المستطيل لتوضيح العمليات في المخطط. أما شكل المعين فيُستخدم لتوضيح مرحلة قرار، شرط، أو سؤال في المخطط، وهكذا فإن لكل شكل في المخطط يكون ذا معنى محدد. الصورة أدناه توضّح دلالات الأشكال الأكثر استخدامًا: كيفية رسم المخطط الانسيابي في البداية، يجب أن يكون لدينا تصوّر واضح حول مراحل العملية التي نريد تمثيلها بشكل مخطط. ومن الأفضل كتابة مراحل العملية على ورقة على جنب لسهولة الرجوع إليها عند إنشاء المخطط. لنأخذ عملية كتابة مقال كمثال والتي تتكون عمومًا من المراحل التالية: اختيار الموضوع تحديد الهدف والجمهور المستهدف البحث عن أفكار، معلومات، وتفاصيل حول موضوع المقال كتابة الفقرات إضافة العناصر البصرية التدقيق التنقيح (عند الحاجة) النشر لنبدأ بفتح عرض تقديمي جديد وبشريحة ذات تخطيط فارغ: بعد ذلك نقوم بإظهار خطوط الشبكة عن طريق تأشير الخيار Gridlines في تبويب عرض View لتسهيل تحجيم، موضعة، ومحاذاة الأشكال أثناء الرسم: الخطوة التالية هي رسم الأشكال، وسنقوم بذلك في جميع الخطوات عن طريق المسار إدراج Insert> أشكال Shapes> مجموعة Flowchart: يمكنك استخدام تلميح الشاشة الذي يظهر عند تمرير الفأرة فوق أي شكل من مجموعة Flowchart لمعرفة دلالة ذلك الشكل. بما أنّ مرحلة "اختيار الموضوع" تمثل مرحلة البداية، سنختار الشكل البيضوي ونرسمه عن طريق النقر ثم السحب، وحسب الحجم المطلوب: سنلاحظ عند الرسم ظهور تبويب تنسيق Format السياقي، ومنه يمكن التحكم في تنسيق الأشكال ومحاذاتها. لكننا سنؤجل التنسيق إلى حين الانتهاء من رسم جميع أشكال المخطط. نرسم شكلًا مستطيلًا ليمثل مرحلة "تحديد الهدف والجمهور المستهدف"، ولكي نحافظ على الاتساق في أحجام جميع أشكال المخطط، نقوم بإعادة تحجيم الشكل ليتناسب مع الشكل السابق، مستخدمين الدلائل الذي تظهر أثناء التحجيم: بعد ذلك نرسم شكلًا سداسيًا ليمثل مرحلة "البحث"، لأنه يدل على التجهيز أو التحضير: نكمل رسم بقية المراحل، مع الأخذ بنظر الاعتبار اختيار الشكل المناسب لكل مرحلة، وإذا كان هناك شكل يتكرر أكثر من مرة في المخطط، نستخدم مفتاحي الاختصار Ctrl+ D لنسخ الشكل، ومن ثم تحريكه إلى الموضع المرغوب: بعد ذلك نحدد كل شكل على حدة ونبدأ بإدخال عناوين المراحل عن طريق الكتابة بصورة مباشرة: الخطوة التالية هي محاذاة الأشكال التي تقع على مسار واحد (أفقي أو عمودي) حول خط مركزي واحد لكي يكون بإمكاننا رسم كلّ الأسهم الرابطة بشكل مستقيم. نحدد مجموعة الأشكال الأولى ثم نذهب إلى Format> Align> Align Center: نبقي المجموعة الأولى محددة، ونذهب إلى Format> Align> Distribute Vertically لتوزيع المسافة العمودية بين الأشكال بالتساوي: نكرر الخطوتين السابقتين على مجموعة الأشكال العمودية الثانية [كتابة الفقرات-إضافة العناصر البصرية-التدقيق]، وخطوة المحاذاة إلى المركز فقط على المجموعة الثالثة [تنقيح-نشر]. أما مجاميع الأشكال الأفقية [اختيار الموضوع-كتابة الفقرات]، [تحديد الهدف والجمهور المستهدف-إضافة العناصر البصرية]، و[البحث-التدقيق] فنطبق عليها خيار المحاذاة إلى الوسط Align Middle، وكل مجموعة على حدة: بعد ذلك نبدأ برسم الأسهم الرابطة. نختار السهم المناسب من مجموعة Lines في قائمة الأشكال، وعند تمرير الفأرة فوق أحد الأشكال، سنلاحظ ظهور نقاط سوداء عند رؤوس محاور المركز للشكل، يمكننا الاستفادة منها لرسم الأسهم من نقطة إلى أخرى. وطريقة الرسم هي بالنقر على النقطة الأولى وسحب المؤشر إلى النقطة التالية ثم النقر عليها: وبذلك نتأكد أنّ جميع الأسهم مستقيمة لأننا قمنا بمحاذاة الأشكال إلى المركز والوسط مسبقًا. تنسيق المخطط يعتمد تنسيق المخطط بالكامل على تفضيلك الشخصي؛ سواء كنت تفضل المظهر البسيط أو الجذّاب. وجميع أوامر وأدوات التنسيق التي يمكنك استخدامها لتنسيق الأشكال توجد في تبويب تنسيق Format السياقي. نختار اللون المرغوب لتعبئة الشكل من مجموعة الألوان في قائمة Shape Fill، وبالطبع بعد تحديد ذلك الشكل: أو بالطريقة المختصرة، ننقر على الشكل بزر الفأرة الأيمن ثم على أمر Fill: إذا رغبت في تغيير مجموعة ألوان النسق، اذهب إلى تبويب تصميم Design ثم انقر على سهم "المزيد More" في مجموعة Variants واختر مجموعة الألوان المرغوبة من قائمة Colors: بعد ذلك نختار نمط وسمك حدود الشكل من مجموعة الخيارات في قائمة Shape Outline. كما يمكن إضافة تأثيرات أخرى على الشكل كالظل، الانعكاس وغيرها من قائمة Shape Effects: سنقوم بتعبئة كل نوع من الأشكال بلون مخصص، لكننا لن نقوم بهذه الخطوة لكل شكل على حدة، وإنما نختار اللون المرغوب للشكل الأول، ثم نستخدم أداة نسخ التنسيق Format Painter من تبويب الصفحة الرئيسية Home ونلصق التنسيق على الأشكال الأخرى: نطبق نفس خطوات التنسيق على أحد الأسهم كتغيير سمك الحد، أو إضافة تأثير، ثم ننسخ التنسيق ونلصقه على بقية الأسهم: تحريك المخطط الشيء الرائع في إنشاء المخططات الانسيابية على بوربوينت هو أنّه بإمكاننا تحريك كل شيء بشكل مستقل عن الآخر. كما بإمكاننا إضافة حركة مختلفة لكل شكل، مما يتيح لنا إمكانية إضافة الكثير من اللمسات الإبداعية. قبل أن نبدأ بتطبيق الحركات، سنقوم بتجميع كل سهم رابط مع الشكل الذي يليه لأننا نريد أن نحركهما معًا في نفس الوقت. نحدد السهم الأول، نضغط على زر Ctrl ثم نحدد الشكل الذي يليه. وأخيرًا ننقر عليها بزر الفأرة الأيمن ونختار Group: نحدد الشكل الأول ثم نذهب إلى تبويب Animations ونطبّق عليه إحدى حركات الدخول، ولتكن Float In مثلا. ثم نغيّر اتجاه الحركة من الأعلى إلى الأسفل: بعد ذلك نحدد العنصر الثاني (السهم+ الشكل الذي يليه) ونطبق عليه حركة Fade. ولتقليل سرعة الحركة نفتح مربع الحوار الخاص بخيارات التأثير، ثم نختار السرعة 2 دقيقة من قائمة Duration في تبويب Timing. لمعرفة المزيد حول تحريك العناصر في بوربوينت ألق نظرة على الدّرس التّالي: كيفية تحريك العناصر (animation) في Microsoft PowerPoint وسنستخدم الأداة Animation Painter لنسخ الحركة وتطبيقها على بقية العناصر، مع مراعاة ترتيب الظهور المرغوب: بالطبع يمكننا تطبيق حركات مختلفة لكل شكل على حدة، أو لكل نوع من الأشكال، لكننا نفضّل أن تكون الحركة متسقة وغير مبالغ فيها. سنطبق حركة مختلفة على الكلمتين "نعم" و"لا". أولا نحدد مربع النص الخاص بالكلمة "نعم" ثم نطبق عليه حركة Appear من حركات الدخول. ثم نضيف حركة ثانية للتأكيد من قائمة Add Animation> More Emphasis Effects: سنختار الحركة Blink وننقر على OK. وأخيرًا سنقوم بزيادة عدد مرات تكرار حركة Blink إلى 2 مربع الحوار الخاص بخيارات التأثير> تبويب Timing> قائمة Repeat: ننسخ حركة الكلمة "نعم" ونطبقها على الكلمة "لا" باستخدام الأداة Animation Painter. إذا كان هناك خطأ في ترتيب الحركات، بإمكاننا تصحيحه باستخدام Animation Pane عن طريق النقر والسحب إلى الترتيب المرغوب: وبذلك نكون قد انتهينا من إنشاء المخطط الانسيابي، تنسيقه، وتحريكه باستخدام بوربوينت:1 نقطة