لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 05/29/23 في كل الموقع
-
رابط لمشاركه صفحه معينة على الواتس اب او الماسنجر2 نقاط
-
2 نقاط
-
السلام عليكم... كيف يمكنني عمل محرر نصوص يتم اضافت فيه صور بين النصوص و نصوص مثل المتوفر في اكاديمية حسوب و شكرا...1 نقطة
-
ممكن حد يشرحلي دالة WINDOW بتفاصيلها OVER & PARTITION BY & ORDER BY1 نقطة
-
let size = 8 ; for ( let row = 0 ; row < size; row++) { for ( let col = 0 ; col < size; col++) { console . log (row); } } لقد قمت بطباعة col بدلا من row في الكونسول وفهمت الاجابة ,ولكن هنا في المثال الجواب حيرني قليلا ولست متأكدا من فهمي لهذه الحالة!!؟ شكرا.1 نقطة
-
1 نقطة
-
ما الفرق بين الطريقتين التاليتن في الربط بقواعد البيانات mongo db 1. mongoose.connect('mongodb://127.0.0.1:27017/my_db') .then( () => { console.log("connected to db") } ) .catch( (err) => { console.log(err) } ) 2. mongoose.connect('mongodb://localhost:27017/my_db') .then( () => { console.log("connected to db") } ) .catch( (err) => { console.log(err) } ) مع العلم أن الطريقة الثانية لم تنجح معي. شكرا.1 نقطة
-
الفرق بين الطريقتين التاليتين في الربط بقاعدة البيانات MongoDB هو الاستخدام المختلف لعنوان الاتصال بالخادم الذي تستخدمه في كليهما. الطريقة الأولى: mongoose.connect('mongodb://127.0.0.1:27017/my_db') الطريقة الثانية: mongoose.connect('mongodb://localhost:27017/my_db') ففي الواقع، هناك فرق ضئيل بين استخدام "localhost" و "127.0.0.1"، ويتم تعيينهما عادة للإشارة إلى نفس العنوان IP للجهاز المضيف. ولكن يمكن أن يكون لديك تكوين مختلف في بيئة نظام التشغيل الخاص بك يؤثر على الوصول إلى قاعدة البيانات باستخدام احدهما. إذا فشلت الطريقة الثانية في الاتصال بقاعدة البيانات، فمن المحتمل أن هناك مشكلة في تكوين بيئة النظام الخاصة بك. يُفضل استخدام الطريقة الأولى التي تستخدم "127.0.0.1" كعنوان IP للاتصال بالخادم المحلي لتلافي المشكلة وفقط. والأرجح، أن المشكلة هي فقط بخصوص كيفية تفسير localhost و 127.0.0.1 من قبل نظام التشغيل أو التطبيق.1 نقطة
-
الفرق بين الطريقتين هو في عنوان الاستضافة (host) الذي يتم استخدامه للاتصال بقاعدة بيانات MongoDB. في الطريقة الأولى، يستخدم عنوان IP "127.0.0.1" للاتصال بقاعدة البيانات، وذلك العنوان يشير إلى جهاز الكمبيوتر الحالي (local host)، ويشير إلى نفس الجهاز الذي يتم تشغيل السكربت عليه، ودائمًا يعمل بشكل صحيح إذا كنت تقوم بتشغيل قاعدة البيانات على نفس الجهاز الذي تقوم فيه بتشغيل التطبيق. أما في الطريقة الثانية، يستخدم "localhost" كاسم الاستضافة، ويشير "localhost" إلى نفس جهاز الكمبيوتر الذي يتم تشغيل السكربت عليه. وغالبًا ما تكون هذه الطريقة متوافقة وتعمل بشكل صحيح على معظم الأنظمةk ولكن الأفضل هو استخدام عنوان الـ ip. فعند استخدام الـ IP، فإنك تحدد عنوان IP بشكل صريح للاتصال بقاعدة البيانات، بينما عند استخدام "localhost"، يتم تحويلها بشكل ضمني إلى عنوان IP الخاص بجهاز الكمبيوتر الحالي، وبالتالي، في بعض الأحيان يتم تفسيره بشكل خاطيء ولتجنب تلك المشاكل من الأفضل استخدام عنوان الـ IP.1 نقطة
-
كلا `127.0.0.1` و `localhost` يتم استخدامهما للإشارة إلى الكمبيوتر المحلي أو الكمبيوتر الذي تعمل عليه. `127.0.0.1` هو عنوان IP لواجهة الحلقة الداخلية، وهي واجهة شبكة خاصة تستخدمها حاسوبك للتواصل مع نفسه. يتم استخدام مصطلح "localhost" للإشارة إلى الحاسوب المحلي نفسه، ويتم تعريفه في ملف hosts في نظام التشغيل الخاص بك. في سياق الاتصال بـ MongoDB، يمكن استخدام كلا من `127.0.0.1` و `localhost` بشكل متبادل حيث يشير كلاهما إلى نفس الجهاز ولكن في حال لم يعمل الـ localhost فيمكن أن يكون هناك العديد من الأسباب. يمكن أن يكون ملف HOSTS معطوبًا، ويجب حذفه وإعادة إنشائه، وكذلك يمكن أن يتسبب جدار الحماية في حظر الخادم، وقد يؤدي عدم إحالة localhost إلى 127.0.0.1 لهذه المشكلة.1 نقطة
-
بالإضافة للشرح السابق ها هو مثال عملي على توضيح دالة WINDOW: نفترض أن لدينا جدول employees مع الأعمدة التالية: id, name, department, salary بحيث يوجد عدة موظفين في كل قسم لحساب ترتيب الموظفين حسب الراتب داخل كل قسم، يمكننا استخدام الاستعلام التالي: SELECT id, name, department, salary , DENSE_RANK() OVER (PARTITION BY department ORDER BY salary DESC) dr FROM employees الناتج سيكون مثل هذا: id - name - department - salary - dr 1 - John - Marketing - 5000 - 1 2 - Jane - Marketing - 4000 - 2 3 - Tom - Marketing - 3000 - 3 4 - Sue - IT - 6000 - 1 5 - Kent - IT - 5000 - 2 6 - Ben - HR - 7000 - 1 7 - Amy - HR - 6000 - 2 حيث تم ترتيب الموظفين حسب الراتب داخل كل قسم (Marketing, IT, HR) فـJohn لديه أعلى راتب في قسمه Marketing فحصل على الترتيب 1 والخ.. كما يفضل الإطلاع على المصادر التالية1 نقطة
-
بشكل مختصر، الدالة WINDOW في قواعد البيانات تستخدم لتعريف نافذة، والنافذة هي عبارة عن مجموعة محددة من الصفوف (السجلات) في جدول قاعدة البيانات. تسمح لك هذه النافذة بتطبيق وظائف التحليل والتجميع على مجموعة محددة من الصفوف، بدلاً من تطبيقها على الجدول بأكمله. تتكون الدالة WINDOW من ثلاثة أجزاء رئيسية: PARTITION BY: تستخدم لتقسيم الصفوف في النافذة إلى مجموعات فرعية بناءً على قيمة معينة في عمود محدد. في الجملة PARTITION BY، يتم تحديد العمود الذي سيتم تجزئته. ORDER BY: تستخدم لترتيب الصفوف داخل كل مجموعة فرعية في النافذة. يتم تحديد العمود الذي سيتم استخدامه للترتيب. OVER: تستخدم لتعريف المجموعة الكاملة للصفوف المشمولة في النافذة، بما في ذلك المجموعات الفرعية المحددة بواسطة PARTITION BY. يمكنك استخدام دوال التجميع والتحليل مع هذا الجزء لتطبيق الوظائف المعنية على الصفوف داخل النافذة. باستخدام هذه الأجزاء، يمكنك تحديد مجموعة محددة من الصفوف في الجدول وتطبيق وظائف التحليل والتجميع مثل العد، المجموع وغيرها عليها.1 نقطة
-
الدالة WINDOW في SQL تستخدم لتنفيذ عمليات تحويل البيانات في نطاق معين مع الاحتفاظ بالصلة بين الصفوف في الجدول الأصلي، وتتكون الدالة WINDOW من ثلاثة أجزاء رئيسية: OVER ، PARTITION BY ، و ORDER BY. دعنا نشرح كل منها بالتفصيل ونقدم أمثلة لتوضيح الفكرة. 1- OVER تحدد عملية التجميع أو الوظيفة التحليلية التي ستُطبق على مجموعة الصفوف المحددة بواسطة النافذة، ويمكن أن تكون هذه الوظيفة مثلاً SUM ، AVG ، ROW_NUMBER ، وما إلى ذلك. مثال: لنفترض أن لدينا جدولًا يحتوي على أسماء الموظفين ورواتبهم، ونريد حساب المجموعة الكلية للرواتب ومعرفة رتبة كل موظف في الجدول. SELECT Name, Salary, SUM(Salary) OVER () AS TotalSalary, ROW_NUMBER() OVER (ORDER BY Salary DESC) AS Rank FROM Employees; 2- PARTITION BY يُستخدم لتقسيم البيانات في النافذة إلى مجموعات فرعية (بارتشن) استنادًا إلى قيمة محددة في العمود، ويتم تطبيق الوظيفة التحليلية المحددة بواسطة OVER على كل بارتشن بشكل منفصل. مثال: لنستخدم نفس الجدول من المثال السابق ولكن نريد حساب المجموع الكلي للرواتب داخل كل قسم بدلاً من الجدول ككل. SELECT Name, Salary, SUM(Salary) OVER (PARTITION BY Department) AS DepartmentTotalSalary FROM Employees; هنا ، استخدمت PARTITION BY مع عمود القسم (Department) لتقسيم الصفوف في النافذة إلى بارتشنات. 3- ORDER BY تُستخدم لترتيب الصفوف داخل كل بارتشن في النافذة وفقًا للترتيب المحدد، وبالإمكان تحديد الترتيب بناءً على عمود واحد أو أكثر. مثال: لنستخدم نفس الجدول من المثال السابق ونريد حساب مجموع رواتب القسم وترتيب الموظفين في القسم وفقًا للرواتب. SELECT Name, Salary, SUM(Salary) OVER (PARTITION BY Department ORDER BY Salary DESC) AS DepartmentTotalSalary, RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank FROM Employees; استخدمت PARTITION BY مع عمود القسم (Department) لتقسيم الصفوف في النافذة إلى بارتشنات.، و ORDER BY مع عمود الرواتب (Salary) لترتيب الصفوف داخل كل بارتشن بناءً على الرواتب، ثم حساب مجموع رواتب القسم وترتيب الموظفين في القسم وفقًا للرواتب. باستخدام الدالة WINDOW بشكل صحيح مع OVER و PARTITION BY و ORDER BY، تستطيع تنفيذ عمليات تحليلية معقدة وحسابية على البيانات في نطاقات محددة وبشكل مرتب ومجمع.1 نقطة
-
هل من رابط لهذا الكتاب بارك الله فيكم اسمه : الخوارزميّة بواسطة لغة بايثون Algorithmics with Python in Arabic for beginners, Basics of programming in Python اعداد و تاليف الدكتور وليد خليفة الاستاذ خليل ابو شنب1 نقطة
-
بشكل أوضح في هذا المثال، يتم استخدام حلقتين داخل بعضهما البعض لإنشاء مربع مكون من 8 صفوف و8 أعمدة. الحلقة الخارجية تتكرر 8 مرات، وتحتوي الحلقة الداخلية أيضًا على 8 تكرارات. في كل مرة يتم تكرار الحلقة الداخلية، يتم طباعة رقم الصف الحالي. وبما أن الحلقة الخارجية تتكرر 8 مرات، فسيتم طباعة الأرقام من 0 إلى 7 في كل صف. وهذا يعني أنه في كل صف، سيتم طباعة الأرقام من 0 إلى 7. يمكن تصور هذا المثال بأنه يبدأ في الزاوية العلوية اليسرى من المربع، ويتم طباعة الأرقام في كل صف من اليسار إلى اليمين، ثم يتم الانتقال إلى الصف التالي وتكرار العملية حتى النهاية. مثلا، في الصف الأول، سيتم طباعة الأعداد من 0 إلى 7، وفي الصف الثاني، سيتم طباعة الأعداد من 0 إلى 7 مرة أخرى، وهكذا حتى الصف الثامن. وبالتالي، سيتم طباعة مربع مكون من 8 صفوف و8 أعمدة، وكل صف يحتوي على الأرقام من 0 إلى 7.1 نقطة
-
أرجو مشاركة مجلد المشروع لتجربة الكود الخاص بك وتفقد المشكلة.1 نقطة
-
سأشرح لك بشكل بسيط، أنت تستخدم حلقتين متداخلتين للتكرار عبر صفوف وأعمدة في شبكة مربعة، والمتغير "size" يحدد حجم الشبكة. وعند تنفيذ الكود، سيتم طباعة قيمة المتغير "row" داخل الحلقة الداخلية، ولكن لاحظ أن الطباعة تتم في كل دورة من الحلقة الداخلية، حيث يتم تنفيذ الحلقة الداخلية "size" مرات لكل دورة في الحلقة الخارجية أي 8 مرات بدءًا من 0. بمعنى آخر، ستقوم الحلقة الداخلية بطباعة قيمة "row" مرات متتالية بحسب قيمة المتغير "size"، فإذا كانت قيمة "size" تساوي 8، فستتم طباعة القيمة 0 ثم 1 ثم 2 وهكذا حتى 7، وسيتم تكرار هذا النمط "size" مرة في الحلقة الخارجية. لذلك، ستحصل على مجموعة من الأعداد المتتالية من 0 إلى 7 تطبع "size" مرة في الإجمال أي 8 مرات، أي 0 مطبوع 8 مرات و1 يكرر 8 مرات وستجد بجانبه في الكونسول رقم 8 أي تكرر طباعته 8 مرات. والنتيجة هي:1 نقطة
-
ليس بالضرورة ان تحفظ كل التفاصيل التي يتضمنها الفيديوهات والدروس للحصول على شهادة من اكاديمية حسوب. فالأكاديمية لا تمنح الشهادات اعتمادا على الحفظ والتذكر لكل التفاصيل، بل يتم التركيز على فهم المفاهيم الأساسية والقدرة على تطبيقها. ما تحتاجه فقط للحصول على الشهادة هو: فهم المحتوى العام للدورة ومعرفة المفاهيم والأفكار الرئيسية. معرفة كيفية تطبيق هذه المفاهيم وتوظيفها في الممارسة العملية. القدرة على حل أسئلة الاختبار النهائي للدورة التي تشمل على أسئلة حول المفاهيم وأسئلة تطبيقية وفي بعض الأحيان أسئلة حول حل مشكلة معينة. مثال عملي على عدم حاجة الحفظ الدقيق للتفاصيل: مثلا في درس عن نظام التشغيل ويندوز. قد يتضمن الدرس تفاصيل عن الإصدارات المختلفة من ويندوز ومميزات كل إصدار. ولكن ليس من الضروري حفظ اسم كل إصدار وتاريخ إصداره وكل التفاصيل، المطلوب فقط: معرفة أن هناك إصدارات مختلفة لويندوز. الفهم العام للفرق بين الإصدارات الرئيسية. معرفة بعض المميزات الجديدة في الإصدارات الأحدث.1 نقطة
-
إذا كنت ترغب في الحصول على الشهادة، فعادة ما يتوقع منك أن تظهر فهمًا كاملاً وشاملاً للموضوعات المشمولة في الدورة. ومن الأفضل أن تكون قادرًا على استيعاب المفاهيم الرئيسية وفهمها بدقة. على الرغم من ذلك، ليس من الضروري حفظ كل شيء بالكامل حرفيًا من الفيديو. الأهم هو فهم المفاهيم والمعلومات الأساسية وتكون قادرًا على تطبيقها عند الحاجة. إذا كان هناك مفاهيم أو معلومات مهمة، مثل الفروق بين نظامي التشغيل ومواصفاتهما، فمن الجيد أن تركز عليها وتحفظها جيدًا. قد تكون هناك أيضًا تفاصيل مهمة تختلف بين النظامين يجب أن تكون على دراية بها. الأهم في نهاية المطاف هو أن تكون قادرًا على تطبيق المعرفة والمفاهيم التي اكتسبتها من الدورة في الواقع، بغض النظر عن طريقة تعلمك الشخصية، سواء كانت عن طريق حفظ المعلومات الرئيسية أو الرجوع إلى المصادر عند الحاجة. في النهاية، ينبغي أن تستمتع بعملية التعلم وأن تركز على فهم المفاهيم وتطبيقها، وهذا سيساعدك في استيعاب المعلومات بشكل أفضل والاستفادة من الدورة بشكل كامل.1 نقطة
-
مشكلة عدم تطابق العناصر في ملف PDF مع ما هو موجود في صفحة HTML الأصلية قد تحدث بسبب عدة أسباب. إليك بعض الحلول التي يمكنك تجربتها لمعالجة مشكلة CSS عند تحويل صفحة HTML إلى PDF باستخدام Puppeteer في Node.js: تأكد من تضمين ملفات CSS بشكل صحيح: تحقق من أن جميع ملفات CSS المطلوبة مضمنة في صفحة HTML بشكل صحيح. يمكنك استخدام العناصر <link> للربط بملفات CSS الخارجية أو تضمين الأنماط المضمنة <style> مباشرة في صفحة HTML. انتظار التحميل الكامل للصفحة: قد يكون Puppeteer يقوم بتحويل صفحة HTML إلى PDF قبل أن تكتمل عملية تحميل العناصر المرتبطة بها، مثل ملفات CSS. يمكنك استخدام page.waitForNavigation() للانتظار حتى يتم تحميل جميع المكونات المرتبطة قبل تحويل الصفحة إلى PDF. التأكد من أن Puppeteer يقوم بتمثيل CSS بشكل صحيح: بعض الخصائص والتأثيرات قد لا يتم دعمها بشكل كامل في Puppeteer. تحقق من أن CSS الذي تستخدمه معترف به ومدعوم بواسطة Puppeteer. استخدم الخيارات المناسبة لإنشاء ملف PDF: Puppeteer يوفر خيارات متعددة لإعداد ملف PDF الناتج، مثل حجم الصفحة والهوامش والأوضاع والألوان. قد تحتاج إلى ضبط هذه الخيارات للحصول على النتائج المرجوة.1 نقطة
-
ربما ما يحدث هو تحميل الملف CSS بشكل غير صحيح في الصفحة الأصلية عند استخدام Puppeteer، وإذا كان كذلك فتستطيع استخدام خيار "waitUntil" للانتظار حتى يتم تحميل وتنفيذ الملف CSS قبل توليد ملف PDF، بالشكل التالي: await page.goto('http://example.com', { waitUntil: 'networkidle0' }); بوضع networkidle0، Puppeteer سينتظر حتى يتوقف النشاط على الشبكة قبل الاستمرار في عملية التحويل. وبإمكانك أيضًا استخدام خيار "waitFor" في Puppeteer للانتظار حتى يتم تحقيق حالة معينة قبل توليد ملف PDF، مثلاً استخدامه للانتظار حتى يتم تحميل عناصر محددة أو حتى يكتمل تنفيذ أكواد JavaScript معينة. await page.waitForSelector('#my-button'); await page.pdf({ path: 'output.pdf' }); أو استخدام دالة page.evaluate() لتنفيذ سكريبت مخصص في صفحة المستعرض والتحكم في توقيت تحميل العناصر، وتستطيع استخدام هذا السكريبت لتنفيذ أمر window.print() الذي يحاكي طباعة الصفحة، وذلك بعد التأكد من تحميل جميع العناصر بشكل صحيح: await page.evaluate(() => { // تأكد من تحميل العناصر المطلوبة هنا window.print(); }); وعليك تضمين السكريبت في النقطة المناسبة في كودك، حيث يتم تحميل العناصر المطلوبة بشكل صحيح.1 نقطة
-
1- عليك بتثبيت Python على جهاز الكمبيوتر، ويُفضل استخدام Python 3.6 أو إصدار أحدث، وتستطيعي تنزيل Python من الموقع الرسمي للغة. 2- من الأفضل إنشاء بيئة إفتراضية باستخدام لعزل مكتبة TensorFlow Federated وتجنب التعارض مع البيئات الأخرى، عن طريق أدوات مثل virtualenv أو Anaconda لإنشاء بيئة افتراضية جديدة. 3- بعد إعداد البيئة الافتراضية (إذا كنت تستخدم واحدة)، تستطيعي تثبيت TensorFlow Federated باستخدام أداة إدارة الحزم الخاصة بـ Python مثل pip بالأمر التالي: pip install tensorflow-federated وسيقوم هذا الأمر بتثبيت الإصدار المستقر الأحدث من TensorFlow Federated. 4- بعد التثبيت، يمكنك التحقق من نجاحه عن طريق إستيراد الوحدة بالشكل التالي: import tensorflow_federated as tff وإذا تم استيراد المكتبة بنجاح دون أي أخطاء، فهذا يعني أن TensorFlow Federated قد تم تثبيته بنجاح ويمكنك البدء في استخدامه. وانتبهي إلى أنه قد تحتاج إلى تثبيت نسخة محددة من TensorFlow تتوافق مع TensorFlow Federated، ويُفضل استخدام TensorFlow 2.x. وقبل تثبيت TensorFlow Federated، الأفضل بتثبيت TensorFlow على الحاسوب.1 نقطة
-
يمكن تنزيله عن طريق كتابة ما يلي: pip install --upgrade tensorflow-federated1 نقطة
-
-بالنسبة للسؤال الأول: النظم الخبيرة هي نظم المعرفة، حيث أن النظام الخبير هو برنامج ذكي يستخدم القواعد المأخوذة من الخبرة الإنسانية (والمنظمة ضمن قواعد بيانات) على هيئة شروط ونتائج في مجال معين ويستخدم طرق الاشتقاق والاستدلال لاستخراج واستنتاج النتائج المعللة بالأسباب والناتجة عن تطابق هذه الشروط أو النتائج مع شرط أو نتيجة ما والخاصة بمشكلة معينة يراد إيجاد حل لها. هذه الأنظمة لديها قدرات مميزة في مجالات معينة مثل التخطيط و تحليل العوارض وتشخيص الأخطاء diagnostics وتشخيص الأمراض وفي التصميم وفي نظم دعم اتخاذ القرار وغيرها من المجالات المتخصصة التي تم فهم العمليات المطلوبة لها، والتي تتناسب مع القدرات التمثيلية والاستنتاجية لهياكل الأنظمة المستخدمة. ويتم تطوير أي نظام خبير من خلال ثلاثة مراحل أساسية هي : 1. تمثيل المعرفة knowledge representation: يحتاج المصمم في هذه المرحلة لتحديد الطريقة التي سيمثل بها المعارف والقوانين التي تحكم مجال العمل، واشهرها طريقة الاعتماد على القواعد (Rule based) وهي عبارة عن مجموعة من العبارات المنطقية تسمى بif_then Rules. 2. اكتساب المعرفة knowledge Acquisition: في هذه المرحلة يتم تجميع القوانين التي تحكم المجال الذي سيعمل فيه النظام الخبير، وعادة ما يكون مصدر هذه القوانين خبير بشري له معرفة شاملة بميدان العمل ومعرفة عميقة بكل تفاصيله. 3. محرك الاستدلال Inference Engine: يحتاج المصمم بعد اكتساب وتمثيل المعرفة إلى تحديد الطريقة التي يصل بها النظام الخبير إلى النتيجة بناء على مالديه من معلومات، وتعتبر هذه المرحلة أصعب المراحل. - السؤال الثاني: لا حالياً لاتوجد دورة لكن ربما في وقت لاحق. لكن توجد دورات أخرى في مجالات متنوعة يمكنك تصفحها من هنا. - السؤال الثالث: يفضل أن تبدأ مع تعلم لغة برولوغ أو LISP وكتاب مثل: Introduction to Expert Systems, Jackson P. , 3rd edition أو Introduction to Knowledge Systems, Stefik M., Morgan Kaufmann. يمكنك البدء مع أحد هذين الكتابين وكلاهما يعد نقطة انطلاق مناسبة لهذا الحقل.1 نقطة
-
عود على بدءأطلقتُ مشروع Buffer منذ شهرين ونصف تقريبًا (المُترجم: الكاتب نشر المقال بُعيد إطلاقه لشركته النّاشئة)، وقد مدّتني هذه الفترة بالكثير من الخبرات والمهارات بشكل يفوق ما سبقها. ويسعدني أن أخبركم أن لدينا اليوم ما يزيد عن الخمسمئة مستخدم، الكثير منهم نشطون، كما نعمل على زيادة أرباحنا من خلال خطط دفع شهرية، وبمعدل تحويل* يزيد عن 4% من الزبائن. دعونا نعود لبداياتنا الأولى. وميض فكرةفكرتي كانت بسيطة جدًا، رغبتُ بالاستفادة من ميزات الجدولة المتوفرة في عدّة تطبيقات لتويتر ودمجها في ميزة واحدة تكون مدهشة، أعتقد شخصيًا أن ميزةً واحدة فعّالة تستحق أن تملك تطبيقها الخاص، لا سيما عندما تقدّم شيئًا مفيدًا وتجربة ممتعة. كان هدفي الأساسي إيجاد طريقة لنشر التغريدات على تويتر دون أن أجدول يدويًا كلّ واحدة منها على حدى، خطرت لي هذه الفكرة بعد استخدامي لعدّة برامج جدولة؛ حتى لا أغرق المتابعين بخمس تغريدات في وقت واحد بينما أقرأ أخبار الصباح، فيما بعد تملّكت هذه الفكرة على هاجسي ولم أستطع التفكير بسواها، فقدمتها كاقتراح لعدد من أصحاب التطبيقات الموجودة بالفعل، إلا أنّ أحدًا ما لم يتجاوب مع طلبي؛ حينها عرفتُ أن الوقت قد حان لأطبّق هذه الفكرة بنفسي. اجعل النسخة الأولى أصغر ما يمكنيمكنني القول أنني واحدٌ من أشد المدافعين عن ضرورة تعلّم مبادئ Lean Startup التي نظمها ايريك رايس، ومع مشروعي الأوّل، تعلّمت كمًا كبيرًا من المبادئ وحاولتُ جاهدًا تطبيقها كلّها، لكنني وجدت أن التطبيق العملي للفكرة أصعب مما تبدو عليه عندما تكون مجرّد نظريّة. بدأتُ برمجة مشروع Buffer قبل تأكدي حتى من قابلية نجاحه، لكنني توقفت فور انتباهي لهذه النقطة، تنفّستُ بعمق وقلت لنفسي: "هل أقوم بالأمور بالشكل الصحيح؟"، حينها أدركت أنّ ما يجب أنْ أقوم به هو اختبار مدى حاجة الناس للمنتج. في دليل رايس حول البداية بأصغر منتج ممكن MVP، أجاب رايس عن سؤالٍ مفتاحيّ شائع "ما هو الحدّ الأدنى الذي يمكن أن يكون عليه منتجي وفق مبادئ MVP؟" فأجاب: "ربما سيكون أصغر بكثير مما تظن". ورغم أنني قرأتُ هذه العبارة مرات عديدة وكثيرًا ما كنتُ أحدّث الآخرين عنها، إلا أن وقتها بالنسبة لي قد حان على ما يبدو، لأطبقها بنفسي. الاختبار الأصغرإليكم البداية التي انطلقنا منها: كان هدفي من هاتين الصفحتين اختبار مدى اهتمام الناس باستخدام التطبيق. قمتُ ببساطة بنشر الرابط بتغريدة وسألت الناس عمّا يظنّونه حيال هذه الفكرة. بعد قليل تفاعل البعض مع تغريدتي وزودوني بعناوينهم البريدية، كما حصلت على بعض التعليقات المفيدة عبر البريد الالكتروني وتويتر، عندها أدركتُ أنّ فكرتي "محققّة" (validated) حسب تعبير ايريك رايس، لقد كانت تجربتي الأولى لتطبيق "التعلم بالتحققّ" validated learning ** مع الزبائن، وكان هذا وقت القيام بالمزيد من التجارب باستخدام هذا النوع من التعلّم. المزيد من التعلمتحققنا إذًا من أن الناس ربّما يريدون منتجنا، وهنا أتت الخطوة التالية للتأكّد فيما إذا كان هؤلاء الزبائن مستعدين أيضًا للدفع مقابل المنتج. التحقق كان بسهولةِ إضافةِ صفحةٍ تشير إلى أسعار المنتج بين الصفحتين السابقتين، وهكذا يحتاج الزائر إلى نقرة إضافية لاستعراض الأسعار قبل أن يتمكّن من تزويدنا ببريده الإلكتروني للحصول على إشعار بإنطلاق التطبيق. هذه النقرة تعطينا معلوماتٍ مهمّة عن العرض الأكثر رغبة بين العملاء (وضعنا مبدأيًا ثلاثة عروض للمنتج)، كما أنها مؤشر مهمّ على زيادة الطلب (فنقرةٌ إضافيّة واحدة تؤكّد حماس الزبون). توضّح الصور التالية ما قمنا بفعله: استمرّ الناس بعد إضافة هذه الخطوة باستعراض المنتج وتزويدي بعناوينهم الإلكترونية، كما بدأ عددٌ آخر منهم بالنقر على العروض المدفوعة. بعد كلّ هذا، لم يبقَ من داعٍ للتردّد في البدء ببناء النسخة الأولى المتواضعة من المنتج الحقيقيّ الفعال. الانطلاقةتزامن تفكيري ببناء Buffer مع حديث Hacker News حول "سباق نوفمبر لإطلاق المشاريع"؛ حيث يتسابق الكثير من الناس في العمل على إطلاق مشروع ما مع نهاية نوفمبر، وكانت تلك مصادفة جميلة بالفعل. في البداية لم أقدّر بشكل جيّد الزمن الذي يحتاجه بناء المنتج (أخبرتُ البعض أنّه يحتاج إلى أسبوع واحد فقط!)، لكنني أدركتُ أن ذلك غير ممكن، فقررتُ تحديد نهاية نوفمبر كموعدٍ نهائيّ للإنطلاقة، كي يتزامن ذلك مع السباق.عملتُ على النسخة الأولى خلال ليالي وعطل سبعة أسابيع. اضطررتُ لتجاهل رغبتي بإضافة العديد من الميزات المهمّة للمنتج؛ مثل دليل تسجيل المستخدم خطوة بخطوة، لأنني ألزمتُ نفسي بالانطلاق في موعد محدّد وكنت متمسّكًا بهذا الالتزام. وهكذا رأى "buffer" النور في الثلاثين من شهر نوفمبر، وحصلتُ على بعض التعليقات الرائعة على HN. دورة تصحيح المسارلحسن الحظ، كان لديّ قبل Buffer تجربة سابقة في بناء منتج، حيث لم تسر كل الأمور كما يجب، الأمر الذي أكسبني الصبر والتروّي عند تقديم الخدمات، والاستعداد لتغيير الكثير من الأمور إلى حين الوصول لنتيجة ما قد تكون ذات قيمة للعميل. في منتجي السابق لم أستطع الوصول لعددٍ كافٍ من الناس، لذا لم أتمكن من سؤالهم "هل هناك مشكلة تواجهك؟" ولم أتحقّق فيما إذا كانوا يحتاجون المنتج بالفعل. استفدتُ من هذا الدرس وأدركتُ أن توجيه الأسئلة للعملاء والاستفادة من الرسائل الالكترونية الواردة منهم مهمّ للغاية في تنمية المشروع من خلال نصائح الزبائن.بعد إطلاق Buffer شعرت بالحيرة فعلًا، إذ كنت قد توقعت منه الكثير من النجاح الفوري، بينما في الواقع كان عليّ فعل الكثير لإعادة ضبط أشياء عديدة في المنتج من أجل كسب المستخدمين النشطين والزبائن المستعدّين للدفع مقابل الخدمة. بغضّ النظر عن وصولك للهدف قبل أو بعد الوقت المتوقّع، فإن رحلة منتجك في السوق ستتخللها تناوبات عديدة من النشاط والخمول، ما يحتاج منك للصبر، الأمر الذي أثمّنه وأعتبره طريقة التفكير الشاملة في مشروع Buffer. استخلص الفوائد عندما تنجحتجهّزت لتكون الرحلة طويلة ريثما أحقّق ما أريد، إلا أنني كنت محظوظا مع Buffer رغم حصول بعض العقبات التي تطلبت شيئًا من الصبر. إذ كان من الواضح أنني لامستُ وترًا حساسًا عند المستخدمين، وذلك بحلّ مشكلة يعاني منها الكثيرون. تلقّيت إضافة لذلك إشارة واضحة أن الحل يقدّم قيمةً كافية ليكون منتجًا تجاريًا. فقد كسبتُ أول زبائني بعد أربعة أيام من إطلاقي المشروع دون أن أكون راضيًا عنه تمامًا. بعد زبوني الأول عدتُ خطوة إلى الوراء، انتبهتُ إلى أن هذا الأمر سيكون كنقطة علّام رئيسية، واعترفتُ لنفسي بأنّ إجراء تغيير طفيف في التركيز بات مطلوبًا، حيث كان من السهل عليّ كمطوّر أن أضيف مزايا جديدة لمنتجي في ذلك الوقت، لكنني أدركتُ أن عليّ التركيز على التسويق والعمل على تلبية احتياجات الزبائن، لقد حان الوقت للحفاظ على التوازن بين تطوير المنتج، تسويقه، وتنمية العملاء، مع هذا المشروع الذي أثبت أنه "جيّد كفاية". وهنا درسٌ مهمٌّ آخر أودّ توجيهه للجميع: لا تتفق مع أيّ شعور يراودك بأن منتجك بات جيّدًا بما يكفي. ماذا بعد؟هناك دوما المزيد من التحديات. منذ الانطلاقة قمتُ بتسليم دفّة إدارة التسويق والمجتمع لشخص مناسب، طوّرتُ العديد من الواجهات المرئية للبيانات الحالية؛ للحصول على نماذج منطقيّة وقرارت مؤكّدة، حصلنا على تغطية إعلامية كبيرة جدًا، حاولنا الاستمرار بالعمل قريبًا من المستخدمين وعلى مستواهم، أطلقنا عدّة ميزات جديدة للمنتج، غيّرنا خطط التسعير، أشرفنا على سجل نشاطات الزبائن وقمنا بتحليلات جماعية. التذييل: * معدل التخويل Conversion Rate: معدّل التحويل، يعبّر عن النسبة المئوية للزوار الذين يقومون بشراء خدمات موقع ما، ونحصل عليه بقسمة عدد الزوّار المشترين إلى العدد الكلّي لزوار هذا الموقع.** التعلم بالتحققّ validated learning: مصطلح حديث يعبر عن عملية التحقق من فكرة أولية ما عن طريق إخراجها للواقع وقياس استجابة الناس لها، ليتمّ تنفيذ هذه الفكرة بعد تكرار الاختبارات ونجاحها. يحظى هذا النوع من التحقق بشعبية خاصة على شبكة الانترنت، حيث يمكن لبرمجيات معينة أن تتتبّع سلوك زائري المواقع وتحللّه، لتعطي إحصائيّات دقيقة عن تفاعل الزوار مع مزايا محددة بهذه المواقع.ترجمة -وبتصرّف- للمقال idea to paying customers in 7 weeks لصاحبهِ Joel Gascoigne.1 نقطة