-
المساهمات
2851 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
38
إجابات الأسئلة
-
إجابة Hassan Hedr سؤال في استفسار عن أفضل اتجاه للتعليم المجدي كانت الإجابة المقبولة
هناك الكثير من الفرص و المهارات المطلوبة في سوق العمل الحر، يجب التركيز على قدارتك ومهاراتك أولًا وتطويرها، ويفضل ان تختار مجالًا تجد نفسك شغوفًا به أو على الأقل تحب العمل به والتعلم والتطوير من نفسك مع الوقت
إذا اخترت مجال البرمجة هناك العديد من الدورات في أكاديمية حسوب لعدة مجالات تؤهلك للدخول في سوق العمل في مجالها إذا كانت لك ميول إبداعية التصميم له طلب سوق العمل، يوجد العديد من مقالات التصميم المنشورة في الأكاديمية الكتابة أو الترجمة أيضًا لها طلب حيث أن المحتوى على الانترنت أغلبه كتابي، أنصحك بقراءة كتاب فن الترجمة والتعريب يمكنك الاستفادة من قراءة المقالات التالية كمدخل للتعرف على مجال العمل الحر والعمل عبر الانترنت
-
إجابة Hassan Hedr سؤال في مشكلة ظهور خطأ بعد تحديث أندرويد استوديو كانت الإجابة المقبولة
يمكنك إضافة الخاصية allowInsecureProtocol ضمن ملف gradle.build للمستودعات الموجودة ليتم تجاوز المشكلة، كالتالي
allRepositories { repositories{ ... maven { url "http://dl.bintray.com/maven/" allowInsecureProtocol = true } } } أو بتبديل بروتوكول http ب htttps ضمن جميع المستودعات المعرفة
-
إجابة Hassan Hedr سؤال في خطأ باستخدام عناصر بوتستراب row و col مع مكونات مصفوفة ضمن map في رياكت كانت الإجابة المقبولة
تأكد من أن مكون السطر row خارج محتوى الكروت جميعها وليس داخل تابع map، لتكون النتيجة شبيهة بالتالي
<!-- الطريقة الصحيحة --> <div className="row"> { data.map(e => (<div className="col card">...</div>)} </div> وليس كالتالي
<!-- طريقة خاطئة --> data.map(e => ( <div className="row"> <div className="col card">...</div> </div> ))
-
إجابة Hassan Hedr سؤال في ما هو الاكثر استخداما فى سوق العمل Express JS أم Loopback 4 ؟؟ كانت الإجابة المقبولة
Express مستخدمة بشكل أوسع يمكنك معرفة ذلك عن طريق مراقبة عدد التحميلات الأسبوعية لكل منها على npm الأرقام الحالية هي:
Express JS حوالي 20 مليون تحميل أسبوعيًا Loopback حوالي 38 ألف تحميل أسبوعيًا يمكنك القراءة عن Express وتعلم مزاياه وكيفيه استخدامه عبر المقال التالي
ويمكنك قراءة سلسلة مقالات مدخل إلى express ومقالها الأول:
-
إجابة Hassan Hedr سؤال في الغرض من ملف index.php الفارغ ضمن إضافات وردبريس كانت الإجابة المقبولة
توفير صفحة index.php فارغة هو ليس من باب الأمان بل فقط كما ذكرت حتى إذا تم زيارة مسار مجلد الإضافة (عن طريق الخطأ أو القصد) لن يظهر للعميل خطأ 404 أي أنه لا يوجد مثل هذا الملف بل نضع ملف index.php فارغ فقط كعُرف.
لاحظ أن إضافة hello dolly ليست سوى ملف واحد وليست موجودة ضمن مجلد خاص بها، ملف index.php نضعه عندما تكون إضافتك عبارة عن عدة ملفات موجودة ضمن مجلد خاص.
يمكنك أيضا وضع ملفات إضافتك ضمن مجلد خاص وكتابة شيفرة الإضافة داخل index.php نفسه وعدم تركه فارغًا، الأمر مجرد تفضيل ليس أكثر.
-
إجابة Hassan Hedr سؤال في كيفية توليد عدد عشوائي داخل البيانات الاختبارية وطريقة تشفير كلمات السر في لارافيل كانت الإجابة المقبولة
يمكنك استخدام التابع mt_rand في PHP لتوليد عدد عشوائي بين قيمتين كالتالي:
mt_rand(0, 999999); // 521866 استخدم نفس التابع لتوليد أعداد بفواصل كالتالي:
mt_rand(0, 10) / 10; // 0.8 تشفير كلمات السر يتم عن طريق خوارزمية Hashing وهي تقوم بتحويل أي نص إلى نص آخر محدد ليس له معنى يتم تخزينه في قاعدة البيانات بدلا من كلمة السر بشكل صريح ويستخدم لمطابقته لاحقا عند محاولات تسجيل الدخول اللاحقة للتأكد من صحة كلمة المرور
-
إجابة Hassan Hedr سؤال في ما الفرق بين Android و Android Compat و AndroidX كانت الإجابة المقبولة
Activity: هو صنف يوفر كل المزايا المتاحة على إصدار أندرويد المستهدف في مشروعك AppCompatActivity: هو صنف يوفر المزايا المتاحة على إصدار أندرويد المستهدف في مشروعك وأيضا يهتم بتوفير تلك المزايا بطريقة ما على الإصدارات الأقدم (لغاية إصدار قديم معين لا يوفر توافقية قبله) AndroidX: مثل AppCompat يهتم بتوفير التوافقية مع الإصدارات الأقدم من أندويد، واختلافه فقط بتنظيم الأصناف داخله حيث يصبح أسهل على المطور اختيار نسخة من صنف معين داخله واستخدامها يفضل دائما تفضيل استخدام الأصناف التي توفر توافقية مع الاصدارات القديمة، هذا سيؤدي أن تطبيقك النهائي سيدعم شريحة أكبر من الأجهزة، حاول ترتيب أولوية الاختيار بينهم بالترتيب التالي:
AndroidX (توافقية أكبر + تنظيم الأصناف داخله أفضل) AppCompat (توافقية أكبر) Android App -
إجابة Hassan Hedr سؤال في فترة حياة broadcast receiver في تطبيقات اندرويد كانت الإجابة المقبولة
المشكلة هي في محاولة اندرويد تحسين الأداء وتوفير الطاقة بشكل عام، حيث قد تكون عدة تطبيقات على الهاتف قد عينت BroadcastReciever لنفس الحدث فعند كل تشغيل أو إغلاق للواي فاي سيتم استدعاء مثلا 30 BroadcastReciever معا مما يؤدي لضعف في أداء الهاتف.
لذا اندرويد (بدءا من API المستوى 26 وفوق) لا يقوم باستدعاء ال BroadcastReciever الخاص بأي تطبيق إذا كان نائما (في حالة Sleep) فقط عندما يكون التطبيق يعمل سيستقبل الحدث
-
إجابة Hassan Hedr سؤال في الـ BroadcastReceiver وتطبيقات اندرويد التي تعمل الخفاء وكيفية التحكم بها كانت الإجابة المقبولة
يمكنك التحقق من حالة ال WIFI في حال كان يعمل أم لا داخل ال BroadcastReciever وتنفيذ المطلوب أو تجاهل التنفيذ كليًا بحسب الحالة المطلوبة كالتالي:
public class bbb extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { int wifiStateExtra = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN); // يعمل WIFI if(wifiStateExtra == WifiManager.WIFI_STATE_ENABLED) { Toast.makeText(context," السلام عليكم ",1).show(); } } }
لا يمكن ذلك تقريبا بشكل مباشر لانه يعتبر تسريب لمعلومات عن المستخدم واستخدامه للتطبيقات الأخرى، لكن قد يمكنك التحقق من التطبيقات التي تعمل حاليًا (أثناء تشغيل تطبيقك) كالتالي:
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses(); for (int i = 0; i < runningAppProcessInfo.size(); i++) { if(runningAppProcessInfo.get(i).processName.equals("com.the.app.you.are.looking.for") { // التطبيق المستهدف يعمل حاليا } } ويجب إضافة الساحية التالية:
<uses-permission android:name="android.permission.GET_TASKS" /> لكن بعد نسخة Android L أصبح من غير الممكن ذلك
-
إجابة Hassan Hedr سؤال في خطأ باستخدام include@ وما الفرق بين asset و secure_asset في Laravel كانت الإجابة المقبولة
لديك خطأ في ذكر الملف admin/theme/css.blade.php فهو يجب أن يذكر كالتالي
<?php @include('admin/theme/css')
نفس الخطأ السابق إضافة إلى خطأ بذكر اسم الملف admin/theme/js.blade.php فهو يجب أن يذكر أيضا كالتالي
<?php @include('admin/theme/js')
الفرق هو بالبروتوكول المستخدم في الرابط الذي سينشأ:
asset: تستخدم إما HTTP أو HTTPS بحسب بروتوكول الطلب الوارد secure_asset: تستخدم حصرًا HTTPS بغض النظر عن بروتوكول الطلب الوارد -
إجابة Hassan Hedr سؤال في ما هو أنسب نظام تشغيل للبرمجة كانت الإجابة المقبولة
هناك ثلاث أنظمة تشغيل رئيسية، ويندوز و ماك و لينكس، بما أن حاسوبك ليس من شركة آبل فلن يكون لديك خيار استخدام نظام ماك،
بقي المقارنة بين ويندوز ولينكس، ويندوز أفضل من ناحية وجود التعاريف والبرامج والأداء مع قطع العتاد، للاستعمال البرمجي ويندوز اختيار ممتاز ولن تواجه مشاكل معه، ومؤخرًا ويندوز أصبح يأتي مع نواة لينكس، أي يمكنك إن احتجت العمل على نظام لينكس أن تقوم بذلك من داخل ويندوز نفسه عبر ما يسمى WSL يتيح لك تثبيت عدة أنظمة لينكس معا وتشغيل برامجها والتطوير داخلها.
ويندوز اختيار ممتاز للمطورين من كافة النواحي.
-
إجابة Hassan Hedr سؤال في كيفية تضمين طباعة البيانات في Laravel كانت الإجابة المقبولة
يمكن عمل ذلك عبر جعل زر الطباعة يدل على رابط لمسار مخصص للطباعة ويدل على البيانات التي يجب طباعتها،
<?php // مسار مخصص للطباعة Route::get('print-data', ...)->name('print-data'); ويُضمّن الزر في ال view مع إضافة البيانات المناسبة للدلالة على البيانات المطلوب طباعتها حسب بنية مشروعك، لنفرض المتغير table يدل على الجدول المطلوب طباعته كالتالي:
<a href="{{ route('print-data', ['table' => '2']) }}"> طباعة الجدول </a> وفي متحكم مسار الطباعة نستخرج البيانات المطلوب طباعتها ونمررها ل view خاصة للطباعة ونعيدها :
<?php class PrintDataController { function index($request) { $table = $request->query('table'); $data = ... استخراج البيانات return view('print-view', compact('data')); } } في ال view الخاصة بالطباعة ننشئ الجدول كما هو مطلوب وننفذ أمر الطباعة عبر JavaScript كالتالي:
<table> ... البيانات </table> <script> // تنفيذ أمر طباعة الصفحة الحالية آليًا window.print(); </script>
-
إجابة Hassan Hedr سؤال في كيفية إنشاء عمود السنة في قاعدة البيانات عبر Laravel كانت الإجابة المقبولة
يمكن ذلك عبر استدعاء الدالة year من الصنف Illuminate\Database\Schema\Blueprint، وستقوم بإنشاء عمود من النوع YEAR، يصبح ملف التهجير كالتالي:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; Schema::table('table_name', function (Blueprint $table) { $table->year('عمود_السنة'); ... });
-
إجابة Hassan Hedr سؤال في أنا استخدم express jwt وانا عندى نوعين من المستخدمين وهما admin و client واريد ان اضيف role ثالث اسميه مثلا vendor كانت الإجابة المقبولة
الخاصية isRevoked تستخدم لتحديد ما إذا كانت ال token الحالية ملغاة أم لا (صاحب الحساب سحب بعض الصلاحيات - قام بتسجيل خروج من الأجهزة الأخرى - الخ...), عبر استدعاء التابع done بداخلها وتمرير المعامل الثاني ك true
اذا كنت تريد تحديد ال token للدور الجديد vendor كملغاة مثل ما تفعل بالدور client يمكنك تضمينه كالتالي:
async function isRevoked(req, payload, done) { if (payload.userRole === "admin") { return done(); } if (payload.userRole === "client") { return done(null, true); } if (payload.userRole === "vendor") { return done(null, true); } }
-
إجابة Hassan Hedr سؤال في خطأ في حساب صافي الأرباح الجديد في NodeJS كانت الإجابة المقبولة
بما أنك تقوم بحساب الايرادات الجديدة: الايرادات القديمة + نسبة الربح × السعر
في المتحول rev في السطر التالي:
const rev = monyState[0].rev + req.body.rev * req.body.price; يجب حساب اجمالي الربح الجديد كالتالي: الايرادات الجديدة (التي تم حسابها سابقا) - المصروفات
ليصبح اجمالي الحساب كالتالي
// const netProf = monyState[0].rev - monyState[0].expens; const netProf = rev - monyState[0].expens;
-
إجابة Hassan Hedr سؤال في خطأ عند محاولة الدفع بالبايال omnipay/paypal كانت الإجابة المقبولة
تأكد من تعيين المتغيرات في الإعدادات التالية ونسخك للمفتاح والمعرّف بشكل صحيح: <?php $this->settings['paypel_client_id']; $this->settings['paypel_secret']; تأكد أيضا أي يكون هذا المفتاح مفعلا Enabled في حساب المطور الخاص بك في باي بال إذا كان مصدر الإعدادات لديك هو متغيرات البيئة Environment variables حاول ايقاف الخادم وتنفيذ الأمر التالي ثم إعادة تشغيله: php artisan config:cache
-
إجابة Hassan Hedr سؤال في خطأ في اندرويد ستوديو "Cause: invalid date string: Unparseable date: "baaa`abccdabGMT+00:00" كانت الإجابة المقبولة
المشكلة هي في القيمة الممررة كنص String والتي يتم محاولة تحويلها إلى تاريخ لكن هي بصيغة خاطئة عبارة عن حروف عشوائية،
يفضل إرفاق الكود المتعلق بالتاريخ في تطبيقك لمتابعة المشكلة.
حاولي تعديل تنسيق التاريخ والوقت في نظام التشغيل وجعل اللغة انجليزية بدل من العربية،
يمكن الاستفادة من الجواب التالي لحل المشكلة
-
إجابة Hassan Hedr سؤال في التعليقات في لارافيل كانت الإجابة المقبولة
التعليق بهذا التنسيق يدعى Docblock، مهمته توفير شرح ومعلومات للمطور عن ما بعده (تابع أو متغير)،
لا يؤثر على عمل التابع أبدا فهو مجرد تعليق متعدد الأسطر يتم تجاهله من قبل ال interpreter،
يفيد بيئة التطوير IDE أو محرر الأكواد للمساعدة في إظهار شروحات عن التابع ومعاملاته وأنوعها أثناء كتابتك للشيفرة،
في VSCode يمكنك وضع المؤشر فوق اسم التابع وسيظهر مربع شرح عن التابع مصدره هو ذلك التعليق، يمكنك تغيير محتواه كما تريد لتقديم شرح أفضل عن مهام التوابع ومعاملاتها في مشروعك
أو عند كتابتك لاستدعاء لتابع ما يمكنك بعد اكمال كتابة اسم التابع الضغط على Ctrl + Space وسيظهر نفس مربع الشرح
-
إجابة Hassan Hedr سؤال في حذف كل تعليقات موضوع من القاعدة في حالة حذف الموضوع كانت الإجابة المقبولة
المشكلة هي في المحرك MYISAM فهو لا يدعم مفاتيح الارتباط، حاولي استخدام InnoDB فهو يدعم شروط المفاتيح على الجداول ليصبح انشاء الجدول كالتالي
CREATE TABLE comments ( ... FOREIGN KEY (`subject_id`) REFERENCES news (`id`) ON DELETE CASCADE ) ENGINE = InnoDB
-
إجابة Hassan Hedr سؤال في ترتيب نتيجة استعلام بناءً على قيمة دالة تجميعية aggregation function في SQL كانت الإجابة المقبولة
نقوم باختيار جميع حقول جدول الشركات، وتجميع تعداد حقل الأسماء في جدول الموظفين وتنفيذ عملية الربط بين الجدولين حسب معرف الشركة كالتالي
SELECT Companies.*, COUNT(employees.name) AS employees_count FROM Companies LEFT JOIN employees ON Companies.id = employees.company_id بعدها نقوم بتجميع أسطر الشركة الواحدة عبر المعرف الخاص بها (لتفادي التكرار الناتج عن عملية الربط)
GROUP BY Companies.id ثم نقوم بترتيب الناتج حسب حقل عدد موظفي الشركة المنشئ سابقا
ORDER BY employees_count DESC
-
إجابة Hassan Hedr سؤال في كيف يمكنني التحكم بإصدارات مشاريعي والتبديل بينها مثل استخدام GIT كانت الإجابة المقبولة
Git هي أنسب أداة لإدارة النسخ وخصوصا في المشاريع البرمجية،
ما هو Git وكيف يعمل
بتبسيط لمفهوم عملها هي أداة تقوم بحفظ نسخة عن كامل ملفات المشروع في كل مرة تأمرها بذلك، وتقوم بحفظ كل نسخة باسم تلقائي، وتربط هذه النسخ ببعضها حسب من اي نسخة تم اشتقاق النسخة الجديدة
عمليًا Git لا يقوم بحفظ نسخة جديدة كاملة عن ملفات المشروع انما يقوم بالمقارنة مع النسخة السابقة ويخزن فقط الملفات التي حدث فيها تغيير لتوفير مساحة التخزين
مزايا Git
ادارة نسخ العديدة للمشروع والحصول عليها عند الحاجة إمكانية إحداث تغييرات على المشروع دون الخوف من تعقيد الرجوع عنها امكانية دمج عدة نسخ للحصول على نسخة جديدة تتضمن كل محتويات النسخ امكانية تعاون عدة مطورين معا على نفس نظام النسخ واضافة ودمج أجزاء عملهم لاحداث نسخ جديدة أهم المصطلحات كما تسمى في Git
commit: النسخة عن الملفات merge: دمج نسختين branch: سلسلة من النسخ المشتقة من بعضها مقالات توضيحية
يمكن الاطلاع على المقالات التالية
-
إجابة Hassan Hedr سؤال في إرسال طلب post api في لارافل كانت الإجابة المقبولة
حاول تعطيل التحقق من شهادة الحماية SSL لهذا الطلب حصرا عبر تمرير التالي: $response = Http::withOptions([ 'verify' => false ]) ->withHeaders(['X-Authorization' => 'ehougO6....' ]) ->post($url, $data); حاول مسح الإعدادات المؤقتة php artisan route:clear php artisan config:clear php artisan cache:clear قد تكون مشكلة في الاتصال بال DNS، أو مشكلة بالاتصال بشكل عام حاول التأكد حاول إعادة تشغيل الخادم المحلي (Apache أو Nginx) -
إجابة Hassan Hedr سؤال في ما هو الكابل المناسب لتوصيل شاشة الكمبيوتر في اللابتوب كانت الإجابة المقبولة
توصيل شاشة إضافية
يمكن ذلك عبر توصيل شاشة خارجية بأحد المآخذ من النوع HDMI - DVI - VGA بحسب المآخذ التي تدعمها الشاشة
مع مأخذ حاسوبك للشاشة الخارجية عادة يكون إما HDMI أو VGA حسب المآخذ التي يدعمها
إذا كان نوعي المآخذ في الطرفين مختلفين يجب شراء كبل خاص أو محول Adapter لأحد الطرفين لتحويله لنوع آخر يمكن وصله
تغيير دوران الشاشة
لعرض الشاشة طوليا أولا وضع الشاشة بشكل طولي وبعد وصلها وتشغيلها يمكنك الدخول الى إعدادات العرض بالضغط بالزر الأيمن على سطح المكتب
ثم اختيار الشاشة الخارجية وتغيير اعدادات التدوير إلى Portrait
-
إجابة Hassan Hedr سؤال في كيف أضيف Textview يحسب الوقت المتبقي من الوقت المعطى الى الوقت الحالي؟ {يفضل استخدام كوتلن او جافا} كانت الإجابة المقبولة
تقوم أولا بتعريف مصفوفة لعناوين المواعيد بنفس الترتيب الذي يرجعه الصف PrayTime ويجب أن يكون تصاعديا (في الشيفرة قد يبدو الترتيب معكوسا بسبب اتجاه اللغة العربية)
String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" }; نقوم بالمرور على كافة المواعيد بالترتيب، ونقارن الوقت الحالي بتوقيت كل موعد، عند أول توقيت لا يكون قد مضى نكون حاليا عند الموعد القادم
for (int i = 0; i < salahNames.length; i++) { // اسم الموعد الحالي String salahName = salahNames[i]; // توقيت الموعد الحالي String salahTimeString = times.get(i); LocalTime salahTime = LocalTime.parse(salahTimeString, DateTimeFormatter.ofPattern("hh:mm a", Locale.ENGLISH)); // التوقيت الآن LocalTime currentTime = LocalTime.now(); // اذا كان الموعد الحالي هو القادم if (salahTime.isAfter(currentTime)) { // نقوم بحساب الوقت المتبقي وننهي الحلقة ... break; } } تقوم بحساب الوقت المتبقي للموعد القادم ابتداءا من الوقت الحالي، وانشاء النص وتحديث الواجهة
if (salahTime.isAfter(currentTime)) { // الوقت المتبقي Duration diff = Duration.between(salahTime, currentTime); // الساعات والدقائق long hours = diff.toHours(); long minutes = diff.minusHours(hours).toMinutes(); // بناء نص الإظهار String timeLeftToNextSalah = ""; if (hours > 0) { // اضافة الساعات فقط اذا كان التوقيت اكثر من ساعة timeLeftToNextSalah += hours + " ساعات"; timeLeftToNextSalah += " و "; } timeLeftToNextSalah += minutes + " دقيقة"; // نحدث الواجهة باسم الموعد القادم والوقت المتبقي findViewById<TextView>(R.id.NextSalahName).text = salahName; findViewById<TextView>(R.id.NextSalahTimeLeft).text = timeLeftToNextSalah; break; } يمكنك إعادة تنفيذ ما سبق والتحديث كل دقيقة عبر استخدام Timer كالتالي
Timer timer = new Timer(); timer.schedule( new TimerTask() { public void run() { // إعادة الحساب وتحديث الواجهة } }, 0, 60*1000); // كل دقيقة
-
إجابة Hassan Hedr سؤال في كيف أقوم بعملية رفع مشروع Node JS على الاستضافة وماهي الأمور التي يجب أن أتأكد منها كانت الإجابة المقبولة
يجب أولا التأكد من تنصيب بيئة NodeJS على المخدم
إذا كنت تستخدم الإستضافة بواسطة CPanel يمكنك مراجعة خطوات التنصيب بالإجابة التالية:
إذا كنت تستخدم مخدم خاص ولديك وصول للمستخدم root نفذ الأمر التالي لتنصيب NodeJS
sudo apt install nodejs ثم تأكد من التنصيب بنجاح بتنفيذ الأمر التالي يجب أن تظهر نسخة NodeJS في الخرج
node –v الان قم بنسخ ملفات مشروعك وتغيير المسار الى مجلد المشروع ونفذ الأوامر التالية لتنصيب الاعتماديات وتشغيل التطبيق كالتالي (بافتراض ملف البداية في مشروعك هو index.js)
npm install & node index.js