-
المساهمات
20334 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
494
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
Bootstrap يعتمد على المكونات وفي البداية الجميع يحتاج أن يرى نتيجة سريعة ليشعر بالإنجاز، بمعنى في بوتستراب، تكتب nav-bar فتحصل على شريط تنقل كامل وجاهز، أو card فتحصل على بطاقة منسقة، وذلك يسهل فهم مبدأ عمل أطر العمل وكيفية تقسيم الصفحة. بينما Tailwind يعتمد على مفهوم Utility-First، أي لكي تصمم زر في Tailwind، لا يوجد كلاس جاهز اسمه btn، بل يجب أن تكتب كلاسات مختلفة لتنسيق الزر بحيث كلاس يجعل الخلفية زرقاء، وكلاس للخط أبيض، والحواف دائرية، والمسافة الداخلية 4 بيكسل وهكذا، وذلك يتطلب منك فهم عميق لخصائص CSS وهي Padding, Margin, Flexbox, Colors قبل استخدامه. كذلك هناك الكثير من المشاريع القديمة ما زالت تستخدم بوتستراب لذا يجب دراسته. ونفس المهارات ستنتقل معك إلى Tailwind، لن تحتاج سوى بضعة أيام وكل ما سيتغير هو أسماء الكلاسات وطريقة الكتابة. لذا بعد إتقان CSS بنسبة جيدة قم بتعلمه في مراحل متقدمة عند تعلم مكتبات وأطر عمل الجافاسكريبت مثل React أو Next.js.
- 6 اجابة
-
- 1
-
-
الإطار نفسه لا ضرر منه بل مفيد من حيث الإنتاجية، لكن الضرر يقع عند تجاهل أساسيات CSS والإعتماد على الإطار بنسخ ولصق الكلاسات أو المكونات دونّ دراية، وعند مواجهة مشكلة أو الرغبة في تخصيص التصميم لا تستطيع. كذلك الأفضل تجنب استخدام إطار بوتستراب والإعتماد على tailwind فهو الإطار المُعتمد حاليًا لتنسيق الواجهات. في البداية لا تعتمد على أي تقنية وركز على الأساسيات وتعمق بها، ويجب تنفيذ مشاريع متدرجة الصعوبة بحيث تبدأ بنماذج بسيطة ثم الإنتقال تطوير موقع كامل.
- 6 اجابة
-
- 1
-
-
ستحتاج إلى كود HTML و CSS و JavaScript وليس جافاسكريبت فقط، ففي Firebase، سيتم تخزين البيانات بالشكل التالي تلقائيًا عند تشغيل الكود: { "chats": { "village_1": { "message_id_1": { "name": "أحمد", "text": "صباح الخير", "time": 123456 }, "message_id_2": { "name": "محمد", "text": "صباح النور", "time": 123458 } }, "village_2": { } } } أولاً عليك إنشاء ملف جديد باسم index.html وبه الكود التالي، ويجب استبدال جزء firebaseConfig ببيانات مشروعك الخاص من لوحة تحكم Firebase: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>دردشة خدمات المدينة</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f4f9; margin: 0; padding: 20px; } .container { max-width: 600px; margin: 0 auto; background: white; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); overflow: hidden; } /* رأس الصفحة واختيار القرية */ .header { background: #007bff; padding: 15px; color: white; text-align: center; } select { padding: 10px; width: 80%; margin-top: 10px; border-radius: 5px; border: none; } /* منطقة الرسائل */ #messages-container { height: 400px; overflow-y: scroll; padding: 20px; border-bottom: 1px solid #ddd; display: flex; flex-direction: column; gap: 10px; } .message { background: #e9ecef; padding: 10px; border-radius: 10px; width: fit-content; max-width: 80%; } .message strong { display: block; font-size: 0.8em; color: #555; margin-bottom: 3px; } .message .text { font-size: 1em; } .message .time { font-size: 0.7em; color: #888; text-align: left; margin-top: 5px; display: block; } /* صندوق الإدخال */ .input-area { padding: 15px; display: flex; gap: 10px; background: #fff; } input[type="text"] { flex: 1; padding: 10px; border: 1px solid #ddd; border-radius: 5px; } input#username { width: 20%; } button { padding: 10px 20px; background: #28a745; color: white; border: none; border-radius: 5px; cursor: pointer; } button:hover { background: #218838; } </style> </head> <body> <div class="container"> <div class="header"> <h2>مجتمع خدمات المدينة</h2> <select id="villageSelect"> <option value="village_center">اختر المنطقة / القرية</option> <option value="village_north">قرية الشمال</option> <option value="village_south">قرية الجنوب</option> <option value="village_east">حي الشرق</option> <option value="village_west">حي الغرب</option> </select> </div> <div id="messages-container"> <p style="text-align:center; color:#888;">اختر القرية لبدء المحادثة...</p> </div> <div class="input-area"> <input type="text" id="username" placeholder="اسمك" required> <input type="text" id="messageInput" placeholder="اكتب سؤالك هنا..." disabled> <button id="sendBtn" disabled>إرسال</button> </div> </div> <script type="module"> import { initializeApp } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-app.js"; import { getDatabase, ref, push, onChildAdded, query, limitToLast, off } from "https://www.gstatic.com/firebasejs/10.7.1/firebase-database.js"; // إعدادات مشروعك (انسخها من Firebase Console) const firebaseConfig = { apiKey: "AIzaSyDxxxxxxxxx-xxxxxxxxxx", authDomain: "your-app.firebaseapp.com", databaseURL: "https://default-rtdb.firebaseio.com", // تأكد أن الرابط صحيح projectId: "your-app-id", storageBucket: "your-app.appspot.com", messagingSenderId: "123456789", appId: "1:123456789:web:xxxxxx" }; const app = initializeApp(firebaseConfig); const db = getDatabase(app); const villageSelect = document.getElementById('villageSelect'); const messagesContainer = document.getElementById('messages-container'); const messageInput = document.getElementById('messageInput'); const usernameInput = document.getElementById('username'); const sendBtn = document.getElementById('sendBtn'); let currentVillageRef = null; villageSelect.addEventListener('change', (e) => { const villageId = e.target.value; if (villageId === "village_center") { messageInput.disabled = true; sendBtn.disabled = true; return; } messageInput.disabled = false; sendBtn.disabled = false; messagesContainer.innerHTML = ''; if (currentVillageRef) { off(currentVillageRef); } loadMessages(villageId); }); function loadMessages(villageId) { const chatPath = `chats/${villageId}`; currentVillageRef = query(ref(db, chatPath), limitToLast(50)); // جلب آخر 50 رسالة فقط onChildAdded(currentVillageRef, (snapshot) => { const data = snapshot.val(); displayMessage(data.name, data.text, data.timestamp); }); } function displayMessage(name, text, timestamp) { const date = new Date(timestamp); const timeString = date.getHours() + ':' + String(date.getMinutes()).padStart(2, '0'); const msgDiv = document.createElement('div'); msgDiv.className = 'message'; msgDiv.innerHTML = ` <strong>${name}</strong> <span class="text">${text}</span> <span class="time">${timeString}</span> `; messagesContainer.appendChild(msgDiv); messagesContainer.scrollTop = messagesContainer.scrollHeight; } sendBtn.addEventListener('click', sendMessage); messageInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') sendMessage(); }); function sendMessage() { const text = messageInput.value; const name = usernameInput.value || "مجهول"; const villageId = villageSelect.value; if (text.trim() === "") return; push(ref(db, `chats/${villageId}`), { name: name, text: text, timestamp: Date.now() }); messageInput.value = ''; } </script> </body> </html> وللتوضيح دالة onChildAdded لا تجلب البيانات مرة واحدة فقط، بل تبقى تستمع لأي رسالة جديدة تُضاف في قاعدة البيانات وتعرضها فورًا دون الحاجة لتحديث الصفحة. و off() ضرورية عند التبديل بين القرى لإيقاف استقبال رسائل القرية السابقة، بينما push() تقوم بإنشاء مفتاح فريد ID لكل رسالة جديدة تلقائيًا وحفظها. ثم إنشاء قاعدة البيانات بالتوجه إلى Firebase Console ثم Build ثم Realtime Database واضغط Create Database. ولغرض التجربة فقط أثناء التطوير، اجعل القواعد عامة Public، ثم توجه لتبويب Rules في Realtime Database واستبدلها بـ: { "rules": { ".read": true, ".write": true } } ولكن انتبه عند نشر التطبيق للمستخدمين يجب تغيير القواعد لتسمح فقط للمستخدمين المسجلين بالكتابة. وفي كود HTML السابق ابحث عن const firebaseConfig واستبدل القيم الموجودة بالقيم التي تحصل عليها من إعدادات مشروعك من خلال التوجه للتالي Project Settings - ثم General ثم Your apps ثم SDK setup and configuration
-
الاستضافة توفر لوحة تحكم cPanel لذا سترفع المشروع كملفات ثابتة static، بمعنى بناء المشروع وتجهيزه للنشر من خلال الأمر: npm run build وستحصل على مجلد جديد داخل مشروعك باسم build أو dist في حال تستخدم Vite، فقم بضغط محتويات المجلد وليس المجلد نفسه أي ما بداخله في ملف مضغوط بصيغة .zip ثم سجل الدخول إلى حسابك في DZSecurity وانتقل إلى لوحة التحكم cPanel وابحث عن File Manager وادخل إليه واذهب إلى المجلد public_html. واحذف أي ملفات افتراضية قديمة مثل default.cgi أو مجلدات فارغة ثم اضغط على زر Upload من الشريط العلوي واختر ملف الـ .zip الذي قمت بإنشائه، وبعد انتهاء الرفع، عد إلى public_html، اضغط بالزر الأيمن على الملف المضغوط واختر Extract لاستخراج ما به. وفي نفس المجلد public_html، قم بإنشاء ملف جديد وسمه: .htaccess وإن لم يظهر الملف بعد إنشائه، اضغط على Settings في أعلى اليمين وفعل خيار Show Hidden Files لإظهار الملفات المخفية. واضغط بالزر الأيمن على ملف .htaccess ثم Edit وضع الكود التالي داخله واحفظ الملف: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule . /index.html [L] </IfModule>
- 3 اجابة
-
- 1
-
-
الدروس تعمل بشكل جيد، أرجو إعادة تحديث الصفحة بالضغط على CTRL + F5، إن استمرت المشكلة تفقد الدروس من خلال الهاتف، إن عملت بشكل سليم قم بتغيير المتصفح إذن. إن استمرت المشكلة قم بتجربة تغيير الـ DNS إلى cloudflare أو google من خلال الأداة التالية: https://www.sordum.org/downloads/?dns-jumper
-
ستجد أسفل فيديو الدرس في نهاية الصفحة صندوق تعليقات كما هنا، أرجو طرح الأسئلة أسفل الدرس وليس هنا في قسم أسئلة البرمجة حيث نطرح الأسئلة العامة الغير متعلقة بمحتوى الدورة أو الدرس، وذلك لمساعدتك بشكل أفضل.
-
ستحتاج إلى تعديلات في كود HTML بالتوجه إلى ملف الـ HTML الرئيسي مثل index.html أو ملف الـ Layout في حال تستخدم Laravel ومحرك القوالب Blade وقم بتعديل وسم <html> ليصبح كالتالي: <html lang="ar" dir="rtl"> وفي قسم <head>، أنت حالياً تستدعي ملف adminlte.min.css، فيجب استبداله بملف النسخة العربية وتضمين مكتبة Bootstrap الخاصة بالـ RTL. أي استبدل التالي: <link rel="stylesheet" href="dist/css/adminlte.min.css"> بالتالي: <link rel="stylesheet" href="dist/css/adminlte.rtl.min.css"> وتأكد من المسار الصحيح للملف dist/css/ بناءًا على مكان المجلد لديك.
-
من الجيد أنك على علم بنظرية Parkinson's Law، تطبيقها هام بالفعل عن دراسة مجال ما، فما لا يمكن قياسه لا يمكن تحسينه، لذا يجب تحديد مدة زمنية والإلتزام بها قدر الإمكان. حاول الإلتزام بالجدول الزمني التالي المضغوط ويعتمد على تفرغك التام بمعدل 40 ساعة أسبوعيًا وتوظيف ما تعلمته في دورة علوم الحاسوب، والتي ستسمح لك بتجاوز مرحلة الفهم النظري للمفاهيم مثل Data Structures و Algorithms والمرور سريعًا نحو التطبيق المباشر بلغة بايثون. قم بتخصيص الأسبوع الأول لإنهاء مسار أساسيات لغة بايثون بالكامل وجزء كبير من التطبيقات العملية، حيث أن المفاهيم مثل Functions و OOP و Modules ستكون مجرد مراجعة بالنسبة لك، وينبغي التركيز هنا على اعتياد يدك على الـ Syntax الخاص ببايثون، ثم تنتقل في الأسبوع الثاني لإنهاء ما تبقى من التطبيقات العملية، وهي المواضيع التي تتطلب التعامل مع مكتبات خارجية مثل Web Scraping والتعامل مع Excel و Databases، وتلك المهارات تتطلب وقت للتجربة والخطأ أكثر من الحفظ النظري. وبحلول الأسبوع الثالث، تعمق في أساسيات جانغو، حيث ستنتقل من كتابة برامج بسيطة إلى فهم معمق لنمط MVT Architecture وكيفية عمل ORM، هنا تجنب عدم التوقف طويلاً عند الفيديوهات بل التطبيق مع المشاهدة، وفي الأسبوع الرابع والأخير، ستقوم بتوظيف ما سبق لبناء المتجر الإلكتروني. وبالطبع مدة المحتوى لا تعني مدة الدراسة، حيث ستحتاج وقت إلى الاستيعاب والتطبيق والمراجعة والبحث والمشاهدة من مصدر آخر وهكذا، ستجد تفصيل هنا:
- 4 اجابة
-
- 1
-
-
يوفر آلية تحكم ديناميكية أثناء عملية تدريب النماذج من خلال ما يعرف باسم Callbacks، حيث يرث الصنف المعرف EarlyStoppingCallback خصائصه من الصنف الأساسي tf.keras.callbacks.Callback ليسمح بالتدخل البرمجي في نهاية كل حقبة تدريبية Epoch. ويتم ذلك عبر الدالة on_epoch_end التي تستقبل سجلات الأداء logs وتقوم بفحص قيمة الدقة accuracy الحالية، وفي حال وصول النموذج إلى نسبة دقة 98% أو أعلى، فسيتم تفعيل الأمر self.model.stop_training = True لإيقاف التدريب فورًا، وذلك هام لحماية النموذج من مشكلة Overfitting التي قد تحدث عند استمرار التدريب لفترات طويلة بعد الوصول للحل الأمثل، حيث يبدأ النموذج حينها في حفظ البيانات بدلاً من فهم الأنماط العامة. بالتالي توفير الموارد الحسابية والوقت عبر إنهاء العمليات بمجرد تحقيق الهدف المطلوب دون الحاجة لانتظار انتهاء كافة الحقب المحددة مسبقًا.
-
الفرق في الغرض التصميمي والمستوى التجريدي الذي يمثله كل منهما، فمخطط Class Diagram يهتم بتمثيل البنية البرمجية للنظام وتوضيح العلاقات بين الكائنات في إطار Object Oriented Programming، ويشمل ذلك تعريف Attributes و Methods ومستويات الوصول Access Modifiers، وهو ما يجعله مخطط يركز على السلوك والهيكلية معًا. في حين يركز ERD بشكل حصري على تصميم هيكلية البيانات والعلاقات المنطقية بين الكيانات Entities وكيفية تخزينها، وحيث أنه لا يتطرق مطلقًا للعمليات البرمجية أو الدوال الوظيفية، فهو يعد المخطط الأساسي لبناء قواعد البيانات Relational Databases، وبالتالي فاستخدام Class Diagram يكون عند الحاجة لتوثيق الكود وهندسة البرمجيات، بينما يستخدم ERD عند التخطيط لبناء الجداول والعلاقات في قاعدة البيانات. بمعنى الـ Activity داخل بيئة بيئة أندرويد ستوديو تعتبر في الأساس فئة برمجية Java Class أو Kotlin Class ترث خصائصها من مكتبات الأندرويد الأساسية مثل AppCompatActivity، ولذلك يجب بلا شك إدراجها ضمن المخطط وعدم الاكتفاء بالفئات المساعدة فقط، حيث تحتوي Activity على المنطق الخاص بدورة حياة الواجهة UI Lifecycle والتعامل مع تفاعل المستخدم، واستبعادها يؤدي إلى خلل في فهم كيفية عمل التطبيق وتدفقه، فيجب تمثيلها مع توضيح علاقات الوراثة Inheritance والارتباط Association مع الـ Classes الأخرى التي تقوم بمعالجة البيانات أو الاتصال بالشبكة. وبخصوص استخدام ERD لتمثيل قاعدة بيانات مستضافة على Firebase، فالأمر ممكن لغرض توضيح العلاقات بين البيانات، ولكن يجب الانتباه إلى أن Firebase وبالأخص Firestore أو Realtime Database تعتمد على نموذج NoSQL الذي يستخدم Documents و Collections بدلاً من الجداول والصفوف التقليدية، وحيث أن ERD صمم خصيصًا لتمثيل Relational Model، فعند استخدامه مع Firebase سيتم اعتباره تمثيلاً مجازيًا للمنطق وليس تمثيل فعلي للهيكلية الفيزيائية، والأفضل هنا الإعتماد على نماذج مخصصة لـ NoSQL Schema Design لتعكس الطبيعة الشجرية أو الوثائقية للبيانات بشكل أدق. ستستوعب الأمر بشكل أفضل من خلال التالي:
- 4 اجابة
-
- 1
-
-
عند تشغيل WSL ستظهر لكِ نافذة سوداء وهي التيرمنال، هنا تكتبين الأوامر النصية مثل ls, cd, sudo apt install، وهذا هو الشكل الافتراضي للتعامل مع النظام. لكن تتوفر ميزة WSLg مدمجة في الويندوز، وتعني أنه باستطاعتك تثبيت برامج Linux التي لها واجهة رسومية وستعمل كأنها برامج ويندوز عادية. بمعنى تثبيت متصفح ملفات Linux مثل Nautilus أو محرر نصوص مثل Gedit بكتابة الأمر في التيرمينال، وعند تشغيله ستفتح نافذة بصرية عادية يمكنك التعامل معها بالماوس. كذلك لستِ مضطرة للتعامل مع الملفات ونقلها عبر الأوامر النصية فقط، تستطيعي فتح مستكشف الملفات File Explorer في ويندوز، وابحثي عن أيقونة Linux رمز البطريق في القائمة الجانبية اليسرى. وستجدين ملفات نظام Linux هناك ويمكنك النسخ واللصق منها وإليها كأي مجلد عادي، أو اكتبي: explorer.exe . داخل شاشة WSL السوداء، وسيفتح لك المجلد الحالي في نافذة ويندوز عادية.
-
مواقع العمل الحر تشترط أن يتم الشخص الثامنة عشر من عمره، وذلك هو السن القانوني والذي يصبح الشخص عنده مسؤول قانونيًا. بإمكانه الإشتراك في الدورات ودراستها، والإنتظار لعام أو عامين لحين إتمام الثامنة عشر، ثم يستطيع إنشاء حساب على مواقع العمل الحر. لكن شرط استرجاع الاستثمار خلال 6 أشهر، ساري بعد التقدم للإختبار والحصول على الشهادة من الأكاديمية، لذا يجب تأجيل تلك الخطوة لحين إتمام الثامنة عشر، أي يتقدم للإختبار فيما بعد لا مشكلة، فالدورة متاحة له مدى الحياة ويستطيع التقدم للإختبار في أي وقت. لا مشكلة، الدورة تم إعدادها على إفتراض أنّ الدراسين ليس لديهم أي خبرة برمجية، لكن في حال هناك إمكانية للإشتراك في دورة علوم الحاسوب فذلك أفضل بالطبع. لا توجد متطلبات، فقط جهاز كمبيوتر بمواصفات كافية لاستخدام محرر الأكواد والمتصفح، والإلتزام والتحلي بالصبر وتخصيص وقت يوميًا أو شبه يومي للدراسة. يحدث ذلك في الغالب، وفي أوقات مختلفة على مدار السنة، حيث يتم توفير عرض الإشتراك في دورتين بسعر دورة واحدة.
- 4 اجابة
-
- 1
-
-
السيرفر الذي يستضيف تطبيقك يقوم بدور العميل الذي يتحدث مع خادم البريد SMTP Server مثل Gmail أو Outlook أو خدمات مثل SendGrid، كالتالي: المستخدم يضغط تسجيل والمتصفح يرسل طلب لسيرفر Render. تطبيقك يخزن البيانات في SQLite. تطبيقك يحاول فتح اتصال مع خادم الإيميل SMTP عبر الإنترنت. ينتظر الرد من خادم الإيميل، هل تم الإرسال؟ بعد نجاح الإرسال، يعود التطبيق ليرسل رسالة تم التسجيل للمستخدم. أثناء ذلك من الممكن حدوث أخطاء مختلفة، منها حساب Render المجاني يقطع الطلب بعد 30 ثانية تقريبًا، وفي حال الاتصال بـ SMTP يستغرق 30 ثانية ستحدث مشكلة، ولو الكود لديك متزامن Synchronous أي الكود يعمل سطرًا تلو الآخر وينتظر اكتمال الإرسال قبل الرد فسيحدث بطيء. كذلك الإشتراك المجاني يوفر موارد، والسيرفر يدخل في وضع السبات أي النوم بعد 15 دقيقة من عدم الاستخدام، لذا أول طلب بطيء. الأفضل هو استخدام HTTP API، عبر خدمات مثل SendGrid, Mailgun, Brevo والتي توفر مكتبات تسمح لك بإرسال الإيميل عبر بروتوكول HTTP الذي يعمل على Port 80/443. وبدلاً من إعدادات SMTP في settings.py في جانغو أو config في Flask، قم بتثبيت مكتبتهم واستخدم الـ API Key. وبها اشتراكات مجانية لكن الاستخدام محدود.
- 5 اجابة
-
- 1
-
-
أسفل اليمين في برنامج VS Code ستجدي اسم جهاز مكتوب سواء Windows أو Chrome أو No Device، اضغطي على الاسم، وستظهر لكِ قائمة بالأجهزة المتصلة في الأعلى. اختاري الهاتف من القائمة، ثم توجهي إلى ملف lib/main.dart واضغطي على زر F5 من لوحة المفاتيح لتشغيل التطبيق. ولو أردتي التشغيل من خلال منفذ الأوامر، فاكتبي التالي في التيرمنال في vscode: flutter run ولو لديكِ جهاز متصل سيطلب منك اختيار الجهاز من خلال لوحة المفاتيح. وعند التشغيل لأول مرة، سيستغرق الأمر بعض الوقت لبناء التطبيق وتثبيته على الهاتف، لذا يرجى الانتظار حتى تظهر شاشة التطبيق على هاتفك.
-
يجب تثبيت نظام لينكس من خلال: wsl --install وسيتم تنزيل وتثبيت توزيعة Ubuntu بشكل تلقائي. وبعد انتهاء التحميل، سيطلب منك إعادة تشغيل الكمبيوتر، وبعد إعادة التشغيل، ستفتح نافذة سوداء تلقائيًا لتكملة التثبيت وتطلب منك إنشاء اسم مستخدم Username وكلمة مرور Password لنظام لينكس. في حال لم تفتح تلقائيًا فقومي بكتابة wsl في منفذ الأوامر. ولو واجهتي مشكلة، لنتأكد من أنّ ميزة Virtualization مُفعلة بتنفيذ التالي في منفذ الأوامر: systeminfo وابحثي عن قسم Hyper-V Requirements من المفترض أن تجدي Virtualization Enabled In Firmware: Yes في حال Yes فهي مفعلة وفي حال No فجيب تفعيلها من إعدادات اللوحة الأم BIOS.
-
في قرص الـ C أنشأي مجلد باسم flutter ليصبح المسار: C:\flutter ثم بداخل مجلد flutter فكِ ضغط الملف الخاص بـ flutter. ثم في شريط البحث بالأسفل في الويندو ابحثي عن Edit the system environment variables واختاريها وسيظهر لكِ نافذة اختاري منها Environment Variables. وفي القائمة، ابحثي عن كلمة Path في قسم User variables، واضغطي عليها مرتين. ثم اضغطي على browse وتوجهي إلى مكان مجلد flutter وستجدي بداخله مجلد باسم bin ناتج من فك الضغط فاختاريه. ثم اضغطي على ok أكثر من مرة في كل النوافذ للحفظ. بعد ذلك يجب تثبيت Android Studio لأنه يحتوي على أدوات تسمى Android SDK و Build Tools، وهي الأدوات التي تسمح لـ Flutter ببناء تطبيق يعمل على هواتف أندرويد. أيضاً من خلاله ستقومين بإنشاء محاكيEmulator لتجربة التطبيق على شاشة الكمبيوتر وكأنه هاتف حقيقي.
-
كل شخص له أسلوب يُناسبه في الدراسة، لكن المهم هو تجنب المشاهدة السلبية وتخصيص وقت أكبر للتطبيق العملي، فالبرمجة عبارة عن تفكير منطقي لحل مشكلة ثم تنفيذ ذلك من خلال كتابة الكود. بالنسبة لطريقة الدراسة البعض يُفضل كتابة مُلخصات لكل شيء، لكن لا أنصحك بذلك، اكتفي فقط بكتابة ملاحظات ومُلخصات ورسومات للأمور النظرية أو معلومة معينة تريد الإحتفاظ بها للعودة إليها للمراجعة. بينما البرمجة نفسها اكتفي بالتطبيق العملي فهو الأهم وبدونه فلا معنى للمُلخصات النظرية مهما كتبت، ببساطة لن تستطيع قيادة سيارة بمشاهدة فيديو صحيح؟ وحاول تجنب الإنقطاعات المتكررة خاصًة في البداية، حاول الدراسة بإنتظام بحد أدنى ساعتين يوميًا أو شبه يومي. ستجد تفصيل هنا:
-
تحتاجين إلى تعلم مجال التدوين في البداية، والذي يتطلب إتقان الكتابة بشكل جيد وأيضًا إمتلاك أسلوب سلس مرن مناسب لنوعية وخبرة القارئ من أجل أن يهضم المعلومة بالشكل المناسب له وليس لكِ. كذلك يجب إتقان البحث والتحليل وهيكلة المعلومات بطريقة تجذب القارئ وترضي خوارزميات محركات البحث في آن واحد، والكتابة للويب تتطلب استخدام مبدأ Inverted Pyramid أو الهرم المقلوب، حيث توضع المعلومات الأهم في البداية لجذب انتباه القارئ، ثم يتم التدرج في التفاصيل، وعند صياغة المحتوى، يجب الاهتمام بقابلية القراءة عبر استخدام جمل قصيرة ومباشرة، وتقسيم النصوص الطويلة إلى فقرات صغيرة لتجنب إرهاق عين القارئ. ستجدي تفصيل هنا: العمل بكتابة المحتوى بالنسبة للتفريغ الصوتي Transcription فيتطلب مزيج من مهارات الاستماع وقدرة لغوية جيدة بالنسبة للغة التي يتم العمل عليها، وجودة التفريغ الصوتي تنقسم إلى نوعين رئيسيين هما Verbatim الذي يستوجب كتابة كل كلمة وتلعثم وتنهيدة كما وردت في التسجيل الأصلي، والنوع الثاني هو Clean Read أو Non-verbatim الذي يركز على صياغة المعنى وتنقيح النص من التكرار والشوائب اللغوية ليكون صالح للقراءة المباشرة، ولذلك يجب إتقان قواعد Punctuation وعلامات الترقيم لأنها تحدد نبرة النص وسياقه.
-
مسار جلب الإشعارات في الباك إند /api/notification محمي بدور Admin فقط، بينما التذكير يُنشأ لشخص يفترض الطبيب أو منشئ الموعد، ولو المستخدم ليس Admin فلن يُعيد أية إشعارات. والتذكير يُخزن لـ user ثابت وهو user: "6938 في appointmentReminder.ts بالتالي الإشعار لا يرتبط بالمستخدم الذي يسجل الدخول فعليًا، لذلك getUserNotifications لا يجد إشعارات له. لذا يجب توسيع صلاحيات مسار الإشعارات للسماح بالأدوار التي يجب أن تتلقى التذكير Admin و أو Dentist مثلاً حسب ما تريد، مع الإبقاء على isAuthenticate. وفي appointmentReminder.ts اجعل user هو الطبيب المرتبط بالموعد أو المستخدم المنشئ، بدل المعرف الثابت، لتعيد getUserNotifications الإشعارات للمستخدم الحالي.
-
الكود الأول لا مشكلة به لأنك استخدمت الدالة zip التي تقوم بدمج عناصر القائمة capitals مع عناصر المجموعة cpas، وتعمل عن طريق إنشاء أزواج من العناصر وتتوقف تلقائيًا عند انتهاء أقصر مصفوفة أو مجموعة تم تمريرها لها. وهي المجموعة في المتغير cpas الذي يحتوي على عنصرين فقط، وبالتالي سيقوم الكود بطباعة سطرين فقط ولن يلتفت للعنصر الثالث في القائمة، مع ملاحظة أن ترتيب طباعة D و d غير مضمون لأن الـ set لا تحتفظ بترتيب العناصر. بينما الكود الثاني به خطأ لغوي برمجي Syntax error حيث قمت باستدعاء الدالة items() على المتغير capitals والذي هو من نوع list ولا يمتلك تلك الدالة (ميثود) لأنها مخصصة للتعامل مع القواميس dictionaries لاستخراج المفاتيح والقيم، ولذلك لن يتم تنفيذ حلقة التكرار من الأساس.
-
بسبب إعدادات الويب سيرفر سواء Apache أو Nginx فمعظم الاستضافات الحديثة تقوم بوضع قواعد تمنع الوصول لأي ملف يبدأ بنقطة . والتي تسمى Dotfiles لأسباب أمنية بطبيعة الحال. تفقد ملف .htaccess لديك على الخادم في حال تستخدم تستخدم Apache، ستجد كود يمنع الوصول للملفات الحساسة. لكن بعض السيرفرات لا تكون مهيأة بشكل صحيح لمنع الوصول لتلك الملفات، لذا لا يجب أبدًا وضع أية ملفات حساسة في المجلد العام public_html فالمخترقون لا يقومون بتجربة المواقع بأنفسهم، بل من خلال بوتات تقوم بمسح ملايين المواقع يوميًا، وتجربة روابط ثابتة مثل /.env، /config، /.git. ولو استجاب الخادم حتى لو عن طريق الخطأ للحظة، سيقوم البوت بتحميل الملف وسرقة بيانات قاعدة البيانات ومفاتيح التشفير. كذلك في ملف .env لا تنسى تعطيل وضع التطوير: APP_ENV=production APP_DEBUG=false فلو أبقيت على APP_DEBUG=true وحدث أي خطأ في الموقع سيقوم لارافيل بإظهار صفحة خطأ تحتوي على كل المتغيرات في .env بما فيها كلمات المرور للزوار.
- 5 اجابة
-
- 1
-
-
أرجو التواصل مع مركز المساعدة لتفقد طلبك، حيث الأمور المالية أو الأمور المتعلقة باستبدال الدورات أو الشهادات تتم من خلال مركز المساعدة.
-
شكرًا على إهتمامك وحرصك إبراهيم، سأقوم بمراسلتك على الخاص لتوضيح أين تم ذلك.
-
ليس بنفس العمق الذي يحتاجه مهندس البرمجيات ولكن الفهم الجيد للأساسيات ضروري بالطبع، ففي الواقع العملي ستتعتمد بشكل كبير على مكتبات جاهزة ومحسنة مثل Pandas وScikit-Learn. أي لن تقوم بكتابة Binary Search Tree من الصفر، ولن تقوم ببرمجة خوارزمية Sorting بنفسك، فتلك المكتبات مكتوبة بلغات مثل C++ وتم تحسينها لأقصى درجة، ومهمتك هي استخدامها وليس إعادة اختراعها. لكن الجهل التام بأساسيات هياكل البيانات والخوارزميات سيجعلك تكتب أكواد بطيئة وغير قابلة للتوسع، بمعنى عند التعامل مع ملايين الصفوف، فالفرق بين استخدام List و Set للبحث عن قيمة قد يعني الفرق بين كود ينتهي في ثانية وكود ينتهي في ساعة. لذا يجب أن تفهم الفرق بين O(n)O(n) و O(n2)O(n2) لتتجنب كتابة حلقات تكرارية تدمر أداء النموذج. كذلك خوارزميات الـ Machine Learning نفسها تعتمد على هياكل بيانات، ومنها: Decision Trees و Random Forests تعتمد كليًا على مفهوم الأشجار. Neural Networks تعتمد على المصفوفات Matrices والعمليات الخطية. NLP يعتمد بعضها على Graphs. وفي مقابلات العمل سيُطلب منك حل مسائل برمجية كالتي على منصة LeetCode كجزء من المقابلة للتأكد من قدرتك على كتابة كود نظيف ومنطقي. لذا في هياكل البيانات قم بدراسة: Arrays و Lists. Hash Maps وDictionaries. Sets. Tuples. Trees فهم نظري لكيفية عملها لأنها أساس أغلب نماذج الـ ML. وبالنسبة للخوارزميات ادرس أساسيات التالي: Sorting و Searching. Recursion. Dynamic Programming. Big O Notation.
- 5 اجابة
-
- 1
-
