اذهب إلى المحتوى

Hassan Hedr

الأعضاء
  • المساهمات

    2852
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    38

كل منشورات العضو Hassan Hedr

  1. هذه فرصة لتنمي مهارة البحث لديك، ابحث في محرك البحث أو يوتيوب عن "مهارات البحث" افتح الموضوع للمناقشة في حسوب I/O ابحث هناك أيضا عن مواضيع مشابهة مثلا أحدهم نشر هناك كتاب عن الموضوع يمكنك مراجعته لكن لا تحصر علمك بالتلقي فقط، التجريب أفضل معلم
  2. مهارة البحث تصقل بالتدريب، لا يقتصر الأمر على محرك البحث Google فمع كثرة البحث ستتعلم كل نوع من المعلومات أين وكيف تبحث عنه مثال المشاكل البرمجية لن تبحث عن حلها في Youtube بل بداية تبدأ من Google نهاية إلى نشر سؤالك على الأكاديمية هنا مثلا قد تتعلم بعض تقنيات البحث مثل ضع اشارتي اقتباس" " على الكلمة التي تبحث عنها بحرفيتها وضع اشارة سالب - وبعدها موضوع لا تريده الظهور في نتائج البحث وضع الكلمة insite وبعدها نقطتان : ثم موقع حصري تريد البحث فيه هذه تقنيات للبحث يمكن أن تتعلمها من دورة أو السؤال، لكن صلب البحث هو التمرين ومواجهة المشاكل ومحاولة البحث عنها ستجد نفسك بعد فترة أسرع في جلب وإيجاد المعلومة
  3. بعض لغات البرمجة كـ C تمر بمرحلة تحويل من الشيفرة المصدرية إلى لغة الآلة وينتج ملفات مكتوبة بلغة الآلة يمكن تنفيذها مباشرة، من يريد تنفيذ البرنامج فقط يحتاج للوصول الى البرنامج التنفيذي المكتوب بلغة الآلة وتنفيذه مباشرة ويمكنك ابقاء الشيفرة المصدر لديك دون مشاركتها هذه اللغات تسمى Compiled Languages يقابلها لغات أخرى مثل PHP, Python, Javascript لا تترجم وانما يقوم المفسر الخاص باللغة (Interpreter) عند التنفيذ بالمرور على الشيفرة المصدرية سطر سطر وتنفيذها، أي من يحتاج لتنفيذ البرنامج (في حالتك العميل) سيحتاج للوصول للشيفرة المصدرية حتى يتمكن من تنفيذها هذه اللغات تسمى Interpreted Languages الحلول المقترحة في حالتك: الحماية القانونية إن أمكن بكتابة عقد مع العميل بمنع البيع او النسخ أو الإفصاح عن الشيفرة المصدرية للنظام (حماية ممتازة إن توفرت) قم بتمويه الشيفرة المصدرية قبل تسليمها للعميل ما أمكن أي جعلها غير قابلة للقراءة بالاستعانة بمموه (حماية متوسطة) استئجار استضافة على حسابك الشخصي وتنصيب النظام عليها وتوفير الوصول للعميل فقط الى الواجهة الأمامية للموقع أو أي خدمات يستفيد منها (حماية ممتازة)
  4. حلقة ال for تبقى تدور طالما الشرط التالي محقق في كل دورة أنت تقوم بالتالي إضافة 1 إلى قيمة المتحول i إضافة قيمة i (بعد الزيادة) إلى قيمة المتحول num التحقق من الشرط // بافتراض تمرير التالي addUp(5) i num حالة الشرط 0 5 0 < 5 صحيح يكمل 1 6 1 < 6 صحيح يكمل 2 8 2 < 8 صحيح يكمل 3 11 3 < 11 صحيح يكمل . . ... إلى لا نهاية قيمة num دائما أكبر من i لذلك لن تقف الحلقة وضح ما الغرض من الدالة الذي تريده لكي أقوم بالمساعدة
  5. أولًا تأكدي من إضافة السطر التالي داخل مصفوفة providers في الملف config/app.php $providers = [ // ... Cartalyst\Sentinel\Laravel\SentinelServiceProvider::class, ] سطر الاستخدام يجب أن يكون إما كالتالي use Cartalyst\Sentinel\Native\Facades\Sentinel; أو يمكن تسجيل الصف كواجهة ساكنة Facade ولا داعي حينها لكتابة سطر الأستخدام use بل تستخدمين الصف مباشرة، نضيف السطر التالي إلى مصفوفة aliases في الملف config/app.php $aliases = [ // ... 'Sentinel' => Cartalyst\Sentinel\Laravel\Facades\Sentinel::class, ]
  6. تأكد من تعيين القيمة الصحيحة لـ MAIL_DRIVER داخل ملف .env
  7. جرب الضغط باليمين على الصورة واختيار "Open image in new tab" وملاحظة ال URL للصفحة الجديدة من أين مصدر الصورة
  8. عليك أولًا مراقبة حجم ملف "storage/framework" حسب استخدام تطبيقك وتأثير الحجم على الأداء ومعرفة المدة الزمنية الأنسب لتفريغ التخزين المؤقت (مع أن التخزين المؤقت هو لمساعدة التطبيق على رفع توقيت الاستجابة) مثلا قد يكفي تطبيقك كل يوم مرة أو كل 12 ساعة مرة حسب المشكلة التي تواجهها مع التخزين المؤقت لا يوجد قياس واحد مناسب لجميع المشاريع
  9. الخاصية title في قاعدة البيانات لا يمكن أن تكون Null الحل: إما أن تسمح بالقيمة Null من قاعدة البيانات لها أو أن تضع لها قيمة افتراضية في المصنع كالتالي: class EmailFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = email::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ 'email' => $this->faker->unique()->safeEmail(), 'title' => $this->faker->sentence(), // قيمة افتراضية ]; } }
  10. يمكن تمرير حزمة الايميلات التي تريد الارسال لها إلى ComanyMail كالتالي class CompanyMail implements ShouldQueue { public $details; public $emails; public function __construct($details, $emails) { $this->details = $details; $this->emails = $emails; } public function handle() { // إرسال البريد الإلكتروني إلى حزمة البريد الالكتروني المحددة أو للجميع $emails = $this->emails ?? Email::all(); $input['title'] = $this->details['title']; $input['message'] = $this->details['message']; foreach ($emails as $email) { $input['email'] = $email->email; Mail::send( 'email.CompanyMail', ['input' => $input], function ($message) use ($input) { $message->to($input['email'])->subject($input['title']); } ); } } } وتقوم بتقسيم الحزمة وتمريرها الى عدة نسخ من العمل نفسه داخل ال Controller كالتالي public function storemail(Request $request) { $request->validate([ 'title' => 'required', 'message' => 'required', ]); $details = [ 'title' => $request->input('title'), 'message' => $request->input('message') ]; // نقسم النتيجة الى دفعات وننشئ عملا لكل منها Email::chunk(25, function ($emails) use ($details) { dispatch(new CompanyMail($details, $emails)); }); return redirect()->back()->with('message', 'mail have successfully sent'); }
  11. قم بالدخول إلى الجدول failed_jobs في قاعدة البيانات، ستجد هناك سطر فيه العمل الخاطئ في العمود exception ستجد نص الخطأ أضفه هنا لأتمكن من مساعدتك
  12. الصيغة الرسمية لخصائص UML هي على الشكل التالي: [الظهور] ['/'] اسم الخاصية [ ':' نوع الخاصية ] [ '[' التعددية ']' ] [ '=' القيمة الافتراضية ] [ صفات تعريفية ] حيث مابين القوسين المربعين [ ] هو عنصر اختياري أحد الصفات التعريفية وهي ما تحتاجينه هنا هي "readOnly" يمكن صياغة خاصية نهائية ثابتة final بالأشكال التالية // أبسط شكل age {readOnly} // مع تعيين نوع المتحول age:integer {readOnly} // مع تعيين القيمة الافتراضية age = 20 {readOnly} // مع تعيين القيمة الافتراضية والنوع age:int = 20 {readOnly} ولسهولة القراءة يمكن الاتفاق مع الفريق على كتابة الخواص الثابتة بأحرف كبيرة (كما الاتفاق على كتابتها بأحرف كبيرة داخل الكود) AGE {readOnly} AGE:integer {readOnly} AGE = 20 {readOnly} AGE:int = 20 {readOnly}
  13. المشكلة تكمن في العبارة التالية استخراج نوع المتحول Layout من الغرض layouts، المفتاح يجب أن من النوع نص const key: string = "..." // مفتاح من النوع نص layouts[key] // صحيح const key: any = ... // مفتاح من نوع غير محدد layouts[key] // خطأ يمكن تصحيح الخطأ بالتصريح عن نوع المتحول layout داخل المكون Component بالنوع string
  14. لا علاقة للخوارزميات بالمكتبات والمنصات التي ستستخدمها، الخوارزميات هي طريقة لحل مشكلة ما السؤال الأفضل يكون: "في <المشكلة كذا> ما هي الخوارزمية الأنسب لأحصل على <النتيجة كذا>؟" هنا أنت تسأل عن الخوارزمية المناسبة لمشكلة معينة
  15. يمكنك الاستفادة من انشاء Seeder مجهز بالبيانات التي تريد انشاءها او تعديلها وتنفيذه على المخدم ايضا عن طريق اوامر artisan
  16. هل الاوامر التي تريد تنفيذها متعلقة بعمل التطبيق ؟ اذا كان كذلك يفضل انشاء Console Commands خاصة داخل مشروعك وتنفيذها من سطر الاوامر مثل اوامر artisan
  17. تقنيا يمكنك ويجب ربط الدالة الجديدة sendmails بال route الصحيح داخل web.php مع الطريقة post لكن دوما عندما تبتعد عن دوال للمتحكم الرئيسية index - show - create - store - edit - update - destroy هذا مؤشر لإمكانية انشاء متحكم جديد بمسؤولية جديدة محددة بالالتزام بالدوال الاساسية فقط، هذا يجعل الشيفرة اوضح للقراءة لاحقا
  18. إذًا مسؤولية هذا المتحكم هو ادارة المشتركين في النشرة البريدية صحيح يجب انشاء متحكم جديد مسؤوليته ارسال البريد الالكتروني واستخدام الدالة store الخاصة به نعم يجب اضافة الحقول الجديدة message - title الى Email model واضافتها الى المصفوفة fillable وانشاء تهجير جديد لاضافة الحقول الى الجدول اذا كنت تريد تخزين البيانات ضمن قاعدة البيانات
  19. في هذه الحالة يجب ان تنشئ متحكم جديد يتم فيه استخراج العنوان ومحتوى البريد الالكتروني والتحضير والارسال لكن يجب انت تسأل نفسك ما مسؤولية المتحكم الحالي المختلفة عن المتحكم الجديد، قد تجد انه بجب استخدام متحكم واحد مسؤول عن ارسال البريد الالكتروني ويعمل بطريقتين اما ترسل اليه المحتوى فقط (كما هو حاليا) واما ترسل معه العنوان ايضا اختياريًا (وهي الحالة الجديدة التي تريدها) قد تحتاج لحذف الخاصية email حيث انها نفسها الخاصية message
  20. المطلوب هو إرسال محتوى البريد الالكتروني (العنوان - الرسالة) من حقلين كالتالي Title: <input name="title"/> Message: <input name="message"/> إذا اردت إرسال البيانات عن طريق طلب POST أي ستكون البيانات في جسم الطلب تقوم بتحديد نوع الطلب والوجهة على العنصر form <form action="/path/to/email/send" method="POST"> @csrf <!-- لادخال حقل الحماية من الطلبات من مواقع خارجية --> Title: <input name="title"/> Message: <input name="message"/> <button type="submit">Send Email</button> </form> عند ارسال الطلب سيصل الى المتحكم الذي عينته في ملف ال web.php داخل المتحكم في الدالة store تقوم باستخراج القيمتين من متحول الطلب، وتحضير بريد الكتروني جديد (من model ال Email) وإتمام عملية الإرسال public function store(Request $request) { $title = $request->title; $message = $request->message; // تحضير وارسال الإيميل عن طريق القيم المستخرجة من الطلب ... }
  21. باستخدامك لمكتبة Redux لإدارة الحالة داخل تطبيقك تنشئ عادة مخزن store وهو مخزن يعبر عن حالة التطبيق الحالية، هذا المخزن ليس إلا متحول عادي يخزن في الذاكرة العشوائية RAM عند عمل التطبيق ويتم حذفه من الذاكرة عند انتهاء عمل التطبيق مكتبة redux-persist تمكنك من تخزين حالة التطبيق في الذاكرة الدائمة واستعادتها عند بدء التطبيق كلمة persist تعني هنا الإبقاء أو الحفظ دالة مسؤولة عن تحديد مكان تخزين كل قطعة من بنية الحالة من مخزنك وتمييزها بمفتاح معين، عادة تقوم بتخزين المخزن ككل في قطعة واحدة كما التالي import { persistStore, persistReducer } from 'redux-persist' import storage from 'redux-persist/lib/storage' import rootReducer from './reducers' const persistConfig = { key: 'root', // مفتاح للتمييز storage, // مكان التخزين } const persistedReducer = persistReducer(persistConfig, rootReducer) تعني حفظ المخزن وهي دالة مسؤولة عن حفظ المخزن واستعادته عند بدء التطبيق // مخزن عادي يخزن في الذاكرة let store = createStore(persistedReducer) // تعزيز المخزن العادي بحفظه واستعادته let persistor = persistStore(store) const App = () => { return ( <Provider store={store}> /* نمرر المخزن المعزز */ <PersistGate loading={null} persistor={persistor}> ...
  22. تستخدم المكتبة داخليا مكتبة csrf وهي تتولى عملية توليد التوكن والتحقق منها باستخدام ال Hashing إذا كنت تستخدم Angular فهو سيتعرف تلقائيا على ال Cookie بالاسم "XSRF-TOKEN" ويقوم بارسالها مع كل طلب لاحق عند توليد الطلبات (يمكنك تجاهل هذه الطريقة إذا كنت تستخدم منصة أو مكتبة أخرى) هذا هو الرمز الافتراضي التي ترسله المكتبة وفيه التوكن المولدة يمكنك كما أشرت سابقًا تغيير اسم هذا الرمز اذا أردت عن طريق csrf({ cookie: { key: '...', // اسم الرمز الافتراضي } })
  23. تقوم المكتبة بإنشاء وإرسال التوكن للزبون وعند إرسال الزبون لطلب يجب ان يحتوي على التوكن المرسلة من المخدم، وتقوم المكتبة بالتحقق منها هل هي مولدة من مخدمك أم لا (دون الحاجة لتخزين واسترداد أي توكن) بما انك تستخدم SPA يمكنك ارسال اتوكن مع ال Cookie للمتصفح عندما يطلب الموقع، وبذلك سيقوم المتصفح بارسال كل ال Cookie التي استلمها مع كل طلب يقوم به تلقائيا بدون الحاجة لأن تبرمج ذلك يدويا كالتالي app.all('*', function (req, res) { res.cookie('XSRF-TOKEN', req.csrfToken()) // تعيين التوكن في الـ Cookie ... // نقوم الآن بإرسال ملفات الموقع }) يمكنك تعديل خصائص ال Cookie بتمرير غرض عوضًا عن true كالتالي csrf({ cookie: { key: '...', //اسم ال Cookie httpOnly: true, // تفعيل httpOnly } })
  24. يجب التوضيح أكثر في سؤالك، أرفق الشيفرة المقصودة لكي أتمكن من مساعدتك
  25. طالما انك في مرحلة التطوير محليا يفضل أن لا تعتمد على خدمات خارجية فهي ستعيق عملك وتزيد من مدة التطوير يمكنك تخديم مشروعك باستخدام مخدم Laragon (أعتمده شخصيًا) يمكن تحميله من هنا يوجد دليل هجرة من WAMP و XAMPP يحتوي على ميزة Mail Catcher سيلتقط أي بريد الكتروني صادر من مشروعك محليا وينبهك ويقوم بحفظ النسخة المرسلة كما هي ضمن المجلد "laragon\bin\sendmail\output" لا يبدو هناك مشاكل في الشيفرة، لكن بعد القيام بتنصيب المخدم والتجربة تابع شرح المشكلة (إن حدث أي مشاكل)
×
×
  • أضف...