لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 12/10/21 في كل الموقع
-
الإصدار 1.0.0
76187 تنزيل
هذا الكتاب ليس وصفةً سريعةً للثّراء! وهو لا يَعِدُكَ بجنيِ آلافِ الدولاراتِ منْ خلالِ بقائكَ نائمًا في البيت. لا يُقدّم الكتاب وَصفاتٍ سحريّةً للحُصولِ على 500$ خلالَ ساعتين من خلال مواقعَ خطيرة. ولا يعرض نماذجَ لأناسٍ حصلوا على مليون دولار في عامهم الأوّل بعد قراءة الكتابْ! هذا الكتاب، كتابٌ واقعيٌّ. يلامسُ الحقيقةَ الصعبة بأنّهُ مِن الصّعبِ الحُصولُ على وظيفة في الكثير من الدُّولِ العربيّة. ويخبرك بأن هناكَ أملًا وبديلًا. بل بديلًا قويًّا قَد يكون أفضل من الوظيفة بمراحل. ويبرهن على ذلك بعرض قصص نجاحٍ لأشخاصٍ مثلك، عاشوا ظروفك نفسها، ومن بلدك، ويعانون من جميع المصاعب التي تعاني منه، وبدأوا بمؤهِّلاتٍ قريبةٍ جدًا من مؤهلاتك، وامتلكوا بعضَ المهاراتِ التي تَمتلكها، ولربما كنتَ تُحسِنُها أكثر مِنْ بَعضِهم. ولكنَّ الفرقَ الوحيد (ليس طبعا أنّهم قرأوا الكتاب)، الفرقُ الوَحيدُ أنّهُم وَجَدوا طَريقَهُم للعملِ عَبْر الأنترنت وتحقيقِ مصدرِ دخلٍ كافٍ ومستمرٍّ لأنفسهم، بعضهم – بل الكثير منهم – يحقِّقُ ضِعف الرّاتِبِ الّذي تَحلُمُ بِه شَهريا. يَستعرضُ الكِتابُ قِصصَ النَّجاح بغرضِ إلهامكَ ومَنحِكَ الدَّافِع لتنجح كما نَجحُوا. ويؤكد أنّهم نجحوا ليس لأنّهم تعلّموا المُعادلة السِّحرية للنَّجاح، وليس لأنّهم وجدوا الوصفة السّرية لعصيرِ النّجاح فأعدّوه وشربوه، وليس لأنّ هناك (واسطةً) أخدتْ بأيديهم وعبرت بهم إلى طريقِ النّجاح. إنّما نجَحوا لأنّهم عَمِلوا وتَعبوا وصَابروا وواصَلوا حتّى وَصَلوا. يعرض عليك الكتابُ فرصةَ أنْ تنجح كَما نجحوا، بَل ويَضَعك في ظروفٍ أَفضَل مِن ظُروفهم. وذلك بشرحِ الخُطواتِ اللّازمِ اتّخاذها لبدءِ عملكَ عبر الأنترنت. فالكثير مِنهم لم تُتَح لَه فرصة الحصول على تلك المعلومات، وإنما جرّبوا فأخطأوا فتعلّموا فجرّبوا ثانيةً فنجحوا. وهنا – في هذا الكتاب – نختصر عليك الطّريق، فنعرضُ لكَ تجارِبَهم وأخْطاءَهُم وأَفْضلَ ما حقَّقُوه. يبدأ الكتاب بتعريفِ العمل الحرّ، ومجالاتِه، ومُميّزاتهِ وعُيوبِه. ثمّ يُرشِدُكَ إِلى الكيفيّةِ التي تَبدأُ بِها عملكَ الحُرّ بخطواتٍ بسيطةٍ وسهلةِ التّطبيق. ويُتابِع معك هذِه الخُطوات خُطوة بخطوة. فيقدّم لكَ النَّصائِحَ حولَ إِنشاءِ ملفِّكَ الشّخصيّ، ويُحدثك عَن الطّريقة التي تُقدّمُ بها عروضَ العمل، ويُعلّمكَ كيفيّة تحديدِ السِّعرِ المُناسِب للمشروع، وكيفيّة تَقدير الزّمن اللّازِم لتنفيذه. ويُواسيكَ في حال عدمِ حُصولِكُ عُلى مَشاريع. يَعرضُ الكتابُ عَددًا مِنَ المَهاراتِ اللّازِمة للعَملِ الحُرّ عبرَ الأنترنت، فيستعرضُ مهاراتِ التّواصلِ معَ الزّبائن، ومهاراتِ التّفاوُضِ والإِقْناعْ، ومهاراتِ إدارةِ وتنظيمِ الوقتْ. الكتابُ لا يَدّعي أنّهُ المرجعُ الشاملُ لكلِّ ما لهُ علاقةٌ بالعملِ الحُرّ، إنَّما يرجو مُؤلّفُ الكتابِ أنْ تَكونَ كلماتُهُ قُد لامستْ مَواطنَ الإرادةِ فِي قَلبك. وفُصولَه قدْ شَقّتْ لكَ طريقًا واضحًا للعملِ الحرِّ عبر الأنترنت. وأن يَكونَ ركيزةَ البدايةِ والخُطوة الأولَى في عملكَ عبْر الأنْترنَت. أُمنِيَتُنا في هَذا الكِتاب، أَنْ تَكونَ قِصّةَ نجاحٍ ملهمةً يُحتَفَى بِها، وتُذكَرُ في إصْداراتٍ لاحقةٍ مِنَ الكِتاب. ضَعْ ذَلكَ نُصبَ عَيْنيكْ خِلالَ قِراءتِكَ للكِتابْ.1 نقطة -
اريد رفع بضعة صور باستخدام المكتبة multer ولكن يظهر لى هذا الخطأ D:\1-Node JS\Projects\E-Commerce\node_modules\mongoose\lib\query.js:4545 const castError = new CastError(); ^ CastError: Cast to ObjectId failed for value "gallery-images" (type string) at path "_id" for model "User" هذا هو كودى const express = require("express"); const { ProductModel } = require("../model/product"); const multer = require("multer"); const router = express.Router(); const FILE_TYPE_MAP = { "image/png": "png", "image/jpeg": "jpeg", "image/jpg": "jpg", }; const storage = multer.diskStorage({ destination: function (req, file, cb) { const isValid = FILE_TYPE_MAP[file.mimetype]; let uploadError = new Error("invalid image type"); if (isValid) { uploadError = null; } cb(uploadError, "public/uploads"); }, filename: function (req, file, cb) { const fileName = file.originalname.split(" ").join("-"); const extension = FILE_TYPE_MAP[file.mimetype]; cb(null, `${fileName}-${Date.now()}.${extension}`); }, }); const uploadOptions = multer({ storage: storage }); router.put( "/gallery-images/:id", uploadOptions.array("images", 10), async (req, res) => { const files = req.files; let imagesPaths = []; const basePath = `${req.protocol}://${req.get("host")}/public/uploads/`; if (files) { files.map((file) => { imagesPaths.push(`${basePath}${file.filename}`); }); } const product = await ProductModel.findByIdAndUpdate( req.params.id, { images: imagesPaths, }, { new: true } ); if (!product) return res.status(500).send("the gallery cannot be updated!"); res.send(product); } ); module.exports = router;1 نقطة
-
لدي في قاعدة البيانات جدول users على سبيل المثال وأريد أن أحذف أحد المستخدمين من خلال id المستخدم وقمت بعمل الكود التالي للقيام بهذه المهمة: user = User.query.get(user_id) db.session.delete(user) ولكني أريد أن تتم عملية الحذف بدون تنفيذ إستعلام لجلب بيانات المستخدم، أي حذف المستخدم مباشرة من خلال id مثل جملة Delete في SQL تمامًا كيف أقوم بهذا الأمر؟1 نقطة
-
أضفت اعلانات facebook audience network على تطبيق flutter قمت تحميله على جوجل بلاي ويوم أمس تمت الموافقة عليها وعندها أضفت رابط التطبيق على facebook audience network اليوم تمت الموافقة عليه بالفعل ولكن مع الأسف قمت بتحميل التطبيق على أكثر من جهاز حقيقي ولم تظهر الاعلانات مع العلم هي تظهر على جهازي بشكل طبيعي والذي قمت باضافته كجهاز اختبار أما الأجهزة الأخرى فلا تظهر عليها وفي الفيسبوك تظهر حالة الاعلانات كما ترون في الصور1 نقطة
-
لا اعدت تحميله من المتجر ومن عدة اجهزة لا من جهاز واحد1 نقطة
-
لدي سؤال، هل قمت بتحميل التطبيق من متجر بلاي بعد رفعه على اجهزتك و التجريب، أم من النسخة التي قمت ببنائها محليا1 نقطة
-
كيف يمكننا معرفة مرادفات و مضادات كلمة، أعرف أنه يمكننا القيام بذلك من خلال NLTK و WORDNET لكن لم أستطع القيام بذلك؟1 نقطة
-
أعمل على بناء خوارزمية في ال NLP وأحتاج إلى طريقة يمكنني من خلالها تصنيف كل كلمة حسب نوعها (اسم علم، اسم، اسم جمع, فعل،..إلخ) هل تحتوي NLTKعلى دالة أو طريقة للقيام بذلك؟ فعلى فرض لدي النص التالي: "Life is like riding a bicycle. To keep your balance, you must keep moving." كيف يمكنني تحديد الصنف القواعدي لكل كلمة فيه؟ على سبيل المثال keep هي فعل و MUST هي شرط... أيضاً أريد حذف كلمات التوقف.1 نقطة
-
أعمل على مشروع تحليل مشاعر معتمد على الجانب لإحدى الشركات، وفي هذا النوع من المشاريع فإن الخطوة الأساسية هي تقسيم النص إلى جمل بعد ذلك استخراج وحدات الرأي من النص. لذا ما أحتاجه هنا هو دالة تقوم بتقسيم النص إلى جمل؟1 نقطة
-
أريد أن أقوم بإعادة كود xml عندما يتم طلب أحد المسارات، ولكن كيف يمكنني تغير نوع المحتوى المرجع، أي كيف أقوم بتغير قيمة الترويسة content-type إلى text/xml؟ هل يمكن التحكم في الـ headers في فلاسك Flask؟1 نقطة
-
هناك فرق بين إستخدام session و JWT ولكل منها إستخداماته، في بعض الحالات يكون إستخدام الجلسات session مثل المواقع البسيطة التي تستخدم خادم واحد فقط ولا تحتاج إلى عمل API خاص يحتاج إلى عملية مصادقة. على الجانب الآخر فإن إستخدام JWT يكون مفيد عندما يكون للموقع أكثر من خادم (مثل كل المواقع الكبيرة التي تقوم بتخزين ملفاتها وبياناتها في أكثر من دولة)، وبالتالي لا يمكن التحقق من session id الخاص بالمستخدم لأنه يتم تخزينه على خادم واحد وسيكون من الصعب مشاركته إلى أكثر من خادم، وهنا يأتي دور JWT حيث يتم تشفير بعض البيانات بإستخدام Secret Key ويتم تخزين هذا الرمز token على جهاز العميل (في المتصفح في شكل Cookies أو Local Storage) وكلما قام المستخدم بطلب أحد الصفحات يتم التأكد من الرمز token من خلال فك تشفيره. هنا شرح لكيف تعمل الجلسات Session، وكذلك تقينة Json-Web-Token (JWT): الجلسات Sessions يمكنك أن تتخيل أن الجلسة session عبارة عن مصفوفة من البيانات كالتالي: $session = [ "session_id" => "123456", "user_id" => "q1w2e3", "user_name" => "Sameh" ]; من الكود السابق يتضح أن الجلسة عبارة عن مجموعة من البيانات (مثل اسم المستخدم والمعرف الخاص به id) ويتم توليد id لهذه الجلسة session id بشكل عشوائي، وعندما يقوم أحد المستخدمين بتسجيل الدخول إلى الموقع، يقوم الخادم بتوليد هذه المصفوفة من البيانات (الجلسة session) ويقوم بحفظها في أحد الأماكن (ملف أو قاعدة بيانات أو memcached / redis أو حتى في مصفوفة في الذاكرة)، ثم يتم إرسال معرف الجلسة session id إلى المستخدم ليتم تخزينة في المتصفح في أحد الـ Cookies (تتم هذه العملية تلقائيًا في أغلب الأحيان). الآن يوجد لدينا session في الذاكرة ويوجد لدى العميل session id يتم إرساله بشكل تلقائي مع كل طلب، ويقوم الخادم بالتأكد من وجود جلسة session بهذا الـ id وإذا وجدها يقوم بالسماح بإكمال الطلب وإذا لم يجد أي جلسة لها هذا المعرف id يتم تحويل المستخدم لصفحة تسجيل الدخول ليحصل على جلسة جديدة. هنا صورة قد توضح كيف تتم العملية بالكامل بشكل مبسط: الآن ماذا سوف يحدث إذا قام أحد المخترقين بسرقة معرف الجلسة من متصفح العميل وقام بزراعة هذه البيانات في المتصفح الخاص به (متصفح الهاكر) ثم قام بإرسال بعض الطلبات إلى الخادم على أساس أنه هو العميل الحقيقي؟ سوف تتم كل الطلبات بشكل سليم وسوف يستطيع المخترق بأن يقوم بكل العمليات بدون أي صعوبة، وهذه الطريقة تم إستخدامها على نطاق واسع خلال الأشهر الماضية لسرقة العديد من قنوات اليويتيوب الكبيرة، وذلك من خلال إختراق المتصفح الخاص به (عبر تثبيت أحد البرامج أو الإضافات) والحصول على الـ Cookies الخاصة ببعض المواقع، تسمى هذه الطريقة في الإختراق بـ session hijacking. ماذا سوف يحدث إذا كان لدى الموقع أكثير من خادم لحفظ البيانات مثل المواقع الكبيرة التي تحتاج إلى أكثر من خادم لحفظ البيانات؟ لن يمكننا إستخدام الجلسات بشكل مباشر لأن بيانات الجلسة الواحدة يتم تخزينها في ذاكرة أحد الخاودم (أو في قاعدة البيانات) ولا يمكن أن تتم مشاركتها إلى كل الخوادم، وبالتالي يجب أن يكون هناك خادم خاص بتخزين بيانات الجلسات ويقوم كل خادم بالإتصال به والتأكد من الجلسة في كل طلب مما سوف يؤثر على أداء التطبيق بشكل عام. يمكنك معرفة المزيد عن الجلسات Session من خلال موسوعة حسوب من هنا (الجلسات في Laravel) و من هنا (الدالة session_start في php) رمز JWT رمز JWT يعمل بطريقة مختلفة بعض الشيء، فعندما يقوم المستخدم بتسجيل الدخول، يقوم الخادم بتوليد رمز Token ويرسله إلى المستخدم وفي كل طلب يرسله العميل يجب أن يرسل معه هذا الرمز ليقوم الخادم بفك تشفير هذا الرمز والتحقق من المستخدم، وتتم هذه العملية بالكامل بدون تخزين أي رموز token في الذاكرة أو في قاعدة بيانات. هنا صورة توضح الطريقة التي تعمل بها رموز JWT: ما هي مكونات رمز JWT يتكون الرمز من ثلاثة أجزاء على النحو التالي: رأس Header: يحتوي على الخوارزمية المستعملة في التشفير ونوع الرمز: { "alg": "HS256", "typ": "JWT" } حمولة payload: تحتوي على بيانات المستخدم (بدون كلمة المرور): { "user_id": "1234567890", "name": "John Doe", "iat": 1516239022 } توقيع signature: يحتوي على ناتج تشفير كلًا من الرأس header والحمولة payload بإستخدام خوارزمية مثل HMAC-SHA256 بإستخدام Secret Key (يمكن إعتبارها كـكلمة سر خاصة بالخادم فقط، ولا يتم الكشف عنها بأي شكل من الأشكال) ويكون الناتج في النهاية بالشكل التالي: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c وإذا تم تغير أي جزء من البيانات سوف تحصل على رمز مختلف كليًا، وهذا الأمر يضمن سلامة البيانات وأنه لم يتم التلاعب بها قبل إرسالها. يمكنك إستخدام الموقع jwt.io لتجربة كيف يعمل JWT وتجربة تغير أي جزء من البيانات وملاحظة الرمز الذي يتم توليده. عندما يستقبل الخادم هذا الرمز يقوم بإستخدام نفس الخوارزمية ولكن لفك تشفير الرمز بإستخدام Secret Key، وإذا تمت عملية فك التشفير بنجاح نكون قد نجحنا في التحقق من المستخدم. الآن ماذا سوف يحدث إذا كان الموقع يستعمل أكثر من خادم لإدارة البيانات؟ سوف يعمل كل شيء على مايرام لأن الخادم يقوم بفك تشقير الرمز الذي يصل إليه من المستخدم ولا يحتاج إلى قاعدة بيانات مشتركة لتخزين بيانات الجلسة أو أي شيء من هذا القبيل. ماذا سوف يحدث إذا قام أحد المخترقين بالوصول إلى رمز JWT الموجود لدى أحد المستخدمين؟ سوف يكون بأمكان المخترق عمل كل الطلبات وكأنه هو المستخدم الحقيقي، ولحل هذه المشكلة يتم جعل الرمز صالح لفترة قصيرة للغاية (بضع دقائق فقط) ويتم إنشاء Refresh Token (رمز يستخدم للحصول على رمز Token جديد) وكلما إنتهت هذه الفترة يتم إستخدام الـ refresh token للحصول على رمز جديد (بعض المواقع تقوم بإرسال رمز refresh token جديد أيضًا في هذه العملية، ولا يكون الرمز refresh token صالح للإستخدام مرة أخرى)، ويكون للـ refresh token فترة صلاحية أيضًا ولكن أكبر من رمز token العادي (قد تكون عدة أيام أو حتى أسابيع)، بعد إنتهاء هذه الفترة يجب على المستخدم أن يقوم بتسجيل الدخول مرة أخرى. ماذا سوف يحدث إذا قام المخترق بالوصول إلى كلٍ من رمز Token وكذلك Refresh Token؟ سوف يكون بإمكانه توليد رموز Token جديدة ويقوم بإستعمالها وكأنه المستخدم الحقيقي إلى أن تنتهي صلاحة الـ refresh token ويحتاج إلى تسجيل الدخول مرة أخرى. ملاحظة: إذا إستطاع أحد المخترقين الوصول إلى بيانات تسجيل الدخول الخاصة بالمستخدم (البريد الإلكتروني وكلمة السر) فسيكون بإمكانه توليد رموز token و refresh token كذلك إلى أن يقوم المستخدم بتغير كلمة السر الخاصة به. ملاحظة: الـ refresh token قد يتم تخزينه على الخادم، وعندما يقوم أحد المستخدمين بطلب رمز token جديد عبر الـ refresh token الخاص به، يقوم الخادم بالتحقق من أن الـ refresh token l موجود بالفعل لديه، وبالتالي يمكن التحكم في الـ refresh token وحذفه في حالة تم إستخدامه مرة واحدة أو قام المستخدم بتغير بياناته، أو قام بطلب رمز token من عنوان ip مختلف .. إلخ، مما يوفر أمان أكبر للـ refresh token من الإستخدام حتى بعد سرقته. يجب أن تعلم أيضًا أنه توجد دائمًا طريقة لإختراق أحد المستخدمين وإرسال بعض الطلبات على أساس أن المستخدم الحقيقي هو من طلبها، ويتوقف الأمر على العميل نفسه وفي عادات الحماية التي يتبعها مثل عدم تحميل ملفات من مواقع غير أمنة أو عدم إستخدام http لإرسال أي طلبات أو إستخدام كلمة سر مختلفة لكل موقع وتغيرها كل فترة من الزمن .. إلخ. ويمكن للموقع مساعدة المستخدمين في هذا الأمر من خلال إجبار المستخدم على إختيار كلمة سر قوية وإجباره على تغيرها كل فترة من الزمن وعدم إستقبال أي طلبات من نوع http تأتي إلى الخادم .. إلخ.1 نقطة
-
شكرا لك، يمكنك إضافة الحل إن وجدته1 نقطة
-
1 نقطة
-
هل تأكدت من تعديل real Banner Ad ID بدل test Ad ID قبل بناء التطبيق ورفعه على المتجر؟ وجدت هذا التعليق، هل يفيدك في شيء؟1 نقطة
-
أرجو إرفاق الملفات من الصعب قراءة الشيفرة، بل يجب أن أعدلها لدي لأتأكد من الحل..1 نقطة
-
1 نقطة
-
أعتقد أن سبب المشكلة هو اختير العنصر عن طريق id آخر، أي تحديد العنصر الذي يعرض بشكل غير صحيح. اولا حاول التأكد من id العنصر ،وفي حال لم تستطع حل المشكلة، أرجو إرفاق الشيفرة البرمجية.1 نقطة
-
إن كان هذا حساب إعلان، ماذا يظهر لك في حقل ad accounts من فضلك. أحيانا بعض الكاش يسبب مشاكلؤ حاول عمل clean and rebuild و flutter clean هل إعلانات فيسبوك متاحة في الدولة التي تجرب عليها التطبيق (الأجهزة الأخرى) حاول تشغيل تطبيق vpn وتغيير الدولة1 نقطة
-
1 نقطة
-
يبدو أنه مازال وضع الاختبار قيد التفعيل، راجع الخطوات من التوثيق الرسمي.1 نقطة
-
أعتقد يوجد أكثر من نقطة تتطلب المراجعة، هل يحوي التطبيق حاليا على شيفرة مثل التالية التي تخص عرض الإعلان للاختبار؟ if (BuildConfig.DEBUG) { AdSettings.setTestMode(true); } سيتم تنفيذها في حال كان DEBUG ضمن BuildVonfig ب true. ثانياً من لوحة تحكم فيسبوك، عليك تحديد الخيار لتصبح مثل live أو Active إطفاء الاختبار: ثم و1 نقطة
-
السلام عليكم ورحمة الله وبركاته قمت بعمل اضافه سابقا تقوم بعمل un set لحقول ووكومرس وردبريس وتزيل الحقول الغير مرغوبه كما يريد المستخدم كما اري في معظم اضافات وردبريس السؤال هنا جميع اضافات وردبريس تحتوي علي ملف index.php هذا الملف يحتوي فقط علي عباره >php? // sillince is golden فقط تابعت العديد من الشروحات الاجنبيه لم اجد سوي انه يتم وضع هذا الملف فقط لانه معروف ان اي متصفح يقرا ملف index اولا ........... وبذلك يجبر مستخدم لو فتح اي ملف بدوم قصد ان يفتح هذا الملف هل هذا هو امان اضافات وردبريس فقط . حتي الاضافات الاساسية في وردبريس تحتوي علي هذا الملف ك hello dolly https://github.com/mahmoudsamyhosein/checkout_page_edit_By_mshm1 نقطة
-
توفير صفحة index.php فارغة هو ليس من باب الأمان بل فقط كما ذكرت حتى إذا تم زيارة مسار مجلد الإضافة (عن طريق الخطأ أو القصد) لن يظهر للعميل خطأ 404 أي أنه لا يوجد مثل هذا الملف بل نضع ملف index.php فارغ فقط كعُرف. لاحظ أن إضافة hello dolly ليست سوى ملف واحد وليست موجودة ضمن مجلد خاص بها، ملف index.php نضعه عندما تكون إضافتك عبارة عن عدة ملفات موجودة ضمن مجلد خاص. يمكنك أيضا وضع ملفات إضافتك ضمن مجلد خاص وكتابة شيفرة الإضافة داخل index.php نفسه وعدم تركه فارغًا، الأمر مجرد تفضيل ليس أكثر.1 نقطة
-
بتقدر تستخدم مكتبة لايف واير Livewire1 نقطة
-
عند تسجيل المستخدم الدخول سيقوم بارسال بيانات تسجيل الدخول الى الخادم ويمكن مثلا ان تكون بريد الكتروني وكلمة سر أنت تتحقق من البيانات التي تم ارسلها لك اذا كان حقا هناك مستخدم بالمعلومات التي تم ارسالها لك اذا وجدت مستخدم مسجل ستستخرج بياناته من قاعدة البيانات ويمكن ان تكون بالشكل التالي { "id":1, "username":"salah" } عن استخراج البيانات ستقوم بتشفيرها وانتاج jwt وسيكون من الصعب قراءته مثلا sdf1sd1ffF12f12F21f12F12f1212F12DS1F1F1S هذا تقوم بارساله للواجهة حيث مطور الواجهة سيستخدمه في المستقبل في طلبات المستخدم أي أنه سيتم ارسال لك التوكن مرة أخرى بافتراض مثلا أن المستخدم salah أراد تغيير كلمة السر الخاصة به سيرسل لك البيانات الجديدة مرفوقة بالتكوكن التي أرسلته اليه لتفك التشفير عن التوكن وتتاكد من هوية المستخدم1 نقطة
-
السلام عليكم ممكن استفسار انا بدي ابلش اتعلم برمجة وحابه ابلش من الخوارزميات هسا تمرينات من لغة جافا انا ماعندي لابتوب بصير انزل تطبيق لجافا واطبق من هاتف الاندرويد ؟1 نقطة
-
هذه الخاصية تسمى autoescaping وهي موجودة بشكل إفتراضي لحماية الموقع من ثغرات مثل XSS ، ولكن تدعم قوالب jinja إيقاف هذه الخاصية في جزء معين من خلال إضافة المرشح safe| إلى اسم المعامل، على النحو التالي: {{ htmlcode|safe }} وإن كان لديك العديد من المتغيرات التي تريد عرضها فيمكنك أن تقوم بإيقاف الخاصية autoescaping في جزء من القالب على النحو التالي: {% autoescape false %} {{ something }} <p>{{ something_else }}</p> <b>{{ something_important }}</b> {% endautoescape %} الطريقة الأخرى هي إستخدام MarkupSafe، حيث توفر الدالة Markup التي تقوم بنفس مهمة المرشح safe| السابق، يمكنك تحميل المكتبة من خلال الأمر التالي: pip install -U MarkupSafe ثم يمكنك أن تستعملها على النحو التالي from markupsafe import Markup htmlcode = Markup('<p>HTML Content</p>') الآن يمكنك تمرير المتغير htmlcode إلى أي قالب وسوف يتم عرض محتواه بدون مشكلة وبدون إستعمال المرشح safe| ملاحظة: لا تقم بإستخدام هذه الطرق إلا إذا كنت متأكد من محتوى htmlcode السابق، وذلك لكي لا يتعرض الموقع لهجمات cross-site scripting (XSS)1 نقطة
-
الدالة url_for تستقبل معاملات keywords حيث يمكنك أن تقوم بتمرير قيمة user_id مباشرة كمعامل للدالة url_for وسوف يتم توليد العنوان بالكامل: @app.route('/foo') def foo(): print(url_for('index', user_id = 123)) # /users/123 return "Foo Page" سوف يتم تعويض قيمة المتغير user_id في المسار بالقيمة 123، وإذا كان المتغير user_id إختياري فليس عليك أن تقوم بتمرير أي قيمة. يمكنك معرفة المزيد عن الدالة url_for من خلال هذه المقالة:1 نقطة
-
يوفر فلاسك Flask إمكانية الوصول إلى http headers من خلال الكائن request حيث يحتوي على قاموس بإسم headers ويمكنك أنت تستخدمه للوصول إلى الترويسات headers: from flask import request @app.route('/') def index(): print(request.headers['authorization']) return "hello, world" ملاحظة: إذا لم يكن الـ authorization header موجود ضمن الترويسات المرسلة فسوف تحصل على خطأ KeyError، ولكي تتخطى هذا الخطأ يمكنك أن تستعمل التابع get للحصول على الترويسة وإذا لم يكن موجود سوف تحصل على None: from flask import request @app.route('/') def index(): print(request.headers.get('authorization')) return "hello, world" أو يمكنك التأكد من خلال إستخدام المعامل in في جملة شرطية كالتالي: from flask import request @app.route('/') def index(): if 'authorization' in request.headers: print(request.headers['authorization']) return "hello, world"1 نقطة
-
جرب أضف القيمة C:\Program Files\Java\jdk-رقم الإصدار إلى متغير PATH أخر السطر , بهذه الطريقة تقوم وضع أخر السطر فاصلة منقوطة ; ثم المسار ثم تحفظ ذلك و تعيد تشغيل جهاز الحاسوب.1 نقطة
-
يبدو أن هنالك مكتبة غير مثبتة لديك، npm install expo-cli --global npm install npm install react-native npm install react-native-web أرجو تنفيذ هذه الأوامر بالترتريب، ثم إعادة تشغيل المشروع، إن ظهر نفس الخطأ لمكتبة ثانية فيتوجب عليك تثبيتها بنفس الأوامر السابقة مع تغيير الاسم إن كنت مشترك في دورات حسوب، أرجو طرح السؤال أسفل الدرس/الفيديو في قسم التعليقات1 نقطة
-
1 نقطة
-
الصداع هو أمر ستواجهه أثناء العمل المكتبي وخصوصًا الذي يحتاج لجلوس لفترات طويلة، سببه الأساسي هو وضعية الجلوس الخاطئة وخاصة احناء الرأس إلى الأمام دون الشعور بذلك لفترات طويلة أنصحك بتعديل وضعية جلوسك وخاصة الانتباه لانحناء الرأس إلى الأمام وتعديلها دوما بحيث يكون مستوى الأذنين فوق الكتفين مباشرة طوال الوقت ما أمكن إلى أن تعتاد على وضعية الجلوس الصحيحة تلك. هناك تمارين خاصة بالعمل المكتبي يجب عليك الاعتياد على تنفيذها مع الوقت ستشعر بالراحة أثناء الجلوس لفترات طويلة. راجع دليل حسوب لوضعية الجلوس الصحيحة، و دليل الإعداد الصحيح لمكان العمل. راحتك الجسدية والنفسية ليست من الكماليات، بل هي أساس عملك المكتبي كمطور، حاول الاهتمام بها قدر الإمكان وسينعكس ذلك على انتاجيتك.1 نقطة
-
يمكنك نقل الملفات والمجلدات عبر الأمر التالي: cp old/path/filename new/path/filename cp old/path/dirname new/path/dirname -r يجب أن تستخدم r- عندما تحاول نقل مجلد ما أيضًا، يمكنك محاولة إنشاء/نقل المشروع في مجلد downloads (في الذاكرة الداخلية) والدخول إلى المشروع عبر الأمر التالي: cd storage/downloads/my-project ثم تنفيذ أوامر composer مرة أخرى1 نقطة
-
يمكنك الحصول على طول النص عبر التابع length حيث يقوم هذا التابع بإرجاع طول النص من خلال قيمة من نوع unsigned int: #include <iostream> #include <string> int main() { std::string str; std::cout << "Enter your name: "; std::getline(std::cin >> std::ws, str); std::cout << str.length() << '\n'; return 0; } ثم يمكنك المرور على كل الحروف عبر عمل حلقة for، كالتالي: #include <iostream> #include <string> int main() { std::string str; std::cout << "Enter your name: "; std::getline(std::cin >> std::ws, str); for (int i = 0; i < str.length(); ++i) std::cout << str[i] << '\n'; return 0; } لاحظ كيف تم إستخدام المتغير i للوصول إلى أحد الحروف في النص str1 نقطة
-
في الغالب ليس لديك صلاحيات للتعديل على مجلد المشروع، لذلك أرجو منك تنفيذ الأمر التالي: termux-setup-storage سيطلب منك صلاحيات الوصول إلى الملفات، ويجب أن تقوم بالسماح للتطبيق من خلال الضغط على "سماح allow" بعد ذلك حاول مرة أخرى تحميل المكتبة عبر composer في مجلد المشروع1 نقطة
-
يتم تحميل المكتبة في المكان الحالي في سطر الأوامر، ويمكنك التأكد من هذا الأمر من خلال تنفيذ الأمر التالي: ls وستجد أنه يوجد كل الملفات والمجلدات الخاصة بـ composer (مثل composer.json و vendor .. إلخ). أما إن أردت تثبيت المكتبة (وملفات composer) في مشروع موجود، فعليك أن تذهب إلى مجلد المشروع أولًا من خلال الأمر cd، على النحو التالي: cd path/to/my-project مع تغير المسار إلى مسار المشروع الخاص بك.1 نقطة
-
يمكنك أن تقوم بذلك من خلال : query = forms.CharField(label = 'search', widget = forms.TextInput(attrs = {'placeholder': 'Search'})) حيث تقبل widget كائن من نوع TextInput والذي بدوره يمكنك من الحصول على قيمة أي خاصية مثل placeholder على سبيل المثال. والطريقة الأخرى لعمل نفس الشيء هي إستخدام صنف Meta، كالتالي: from django import forms from .models import SearchModel class SearchForm(forms.ModelForm): class Meta: model = SearchModel widgets = { 'name': forms.TextInput(attrs={'placeholder': 'Search'}), }1 نقطة
-
تم إزال الموديول django.core.urlresolvers من جانغو بداية من الإصدار 2.0، وبدلًا من ذلك تم يجب إستخدام django.urls، لذلك يجب تغير كل جمل import لكي تبدو على النحو التالي: from django.urls import reverse لاحظ أن الإصدار 2.0 من جانغو Django يزيل بعض الميزات التي كانت موجودة سابقًا في django.core.urlresolvers، لذلك قد تضطر إلى إجراء المزيد من التغييرات قبل أن يعمل الكود الخاصة بك. يمكنك أن تستخدم توثيق جانغو Django لمراجعة الميزات التي تم إيقاف العمل بها في الإصدار 1.9 للحصول على تفاصيل حول هذه التغييرات الإضافية.1 نقطة
-
بشكل افتراضي، يكون كائن التاريخ والوقت في Python من نوع naive، لذلك تحتاج إلى جعل كلاهما إما كائنات naive أو aware. ويمكن القيام بذلك باستخدام: import datetime import pytz utc = pytz.UTC post.datetime_start = utc.localize(post.datetime_start) post.datetime_end = utc.localize(post.datetime_end) # الآن كلا الحقلين من نوع aware, ويمكن المقارنة بينهما كما أن جانغو Django يقدم طريقة سهلة لكي تحصل على الوقت والتاريخ الحاليين بنفس الصيغة التي يستعملها من خلال التبع datetime.datetime.now، على النحو التالي: from django.utils import timezone now = timezone.now() كما يمكنك أن تقوم بتحويل الوقت والتاريخ من صيغة UNIX من خلال الكائن datetime.datetime، كالتالي: unix_time = int(unix_timestamp) d = datetime.datetime.utcfromtimestamp(unix_time) d_with_tz = datetime.datetime( year = d.year, month = d.month, day = d.day, hour = d.hour, minute = d.minute, second = d.second, tzinfo = pytz.UTC)1 نقطة
-
يمكنك أن تستخدم أي محرر ترغب به، ولكن أنصحك بإستخدام VS Code، خصوصًا لبرمجة flutter بشكل خاص و Dart بشكل عام، وذلك بسبب وجود إضافتين لكل منهما تساعدك على عمل كل ما يقوم به Android studio. كما أن هذا المحرر يستهلك موارد أقل بكثير من Android studio. أيضًا يفضل أن تقوم بإستخدام هاتف حقيقي بدلًا من محاكي emulator لكي لا تستهلك موارد الجهاز على المحاكي فقط، ويمكنك عرض شاشة الهاتف على الحاسوب من خلال برنامج scrspy أو برنامج مشابه، وبالتالي سوف تظهر لك شاشة الهاتف على الكمبيوتر وكأنها محاكي.1 نقطة
-
Django سيجبرك على إدخال كل الحقول التي لا تحتوي على الخاصية blank=True أو null=True وبالتالي يجب أن تضيف الخاصية blank=True إلى حقل many-to-many، على النحو التالي: class Group(models.Model): events = models.ManyToManyField(Event, blank=True) ملاحظة: الخاصية null=True ليس لديها أي تأثير على العلاقات من نوع many-to-many، لذلك قمنا بإستعمال الخاصية blank=True، حيث أنها تستعمل في عملية التحقق validation في Django بينما الخاصية null=True تستخدم على مستوى قاعدة البيانات (جعل الحقل nullable)، وبالتالي يكون من المنطقي أن نتسعمل الخاصية blank=True فقط.1 نقطة
-
لاحظ أن في جميع الطريق السابقة، يتم جلب كل الكائنات التي لديها الخاصية role بقيمة admin، بينما يتم إستخدام فقط الأول كائن، ولا حاجة لطلب كل الكائنات الأخرى من قاعدة البيانات، لذلك يوفر Django التابع first والذي يقوم بجلب أول كائن فقط من قاعدة البيانات، وفي حالة لم يستطع العثور على أي منها سوف يقوم بإرجاع None، وهو ما ترغب به بالضبط. يتم إستخدام التابع first على النحو التالي: users = User.objects.filter(role = 'admin').first() كما يوفر Django التابع last والذي يقوم بنفس وظيفة التابع first بإستثناء أنه يعيد آخر كائن من قاعدة البيانات وليس الأول. users = User.objects.filter(role = 'admin').last() كما يمكنك جلب كل الكائنات من قاعدة البيانات (في حالة كنت بحاجة إليها في وقت لاحق)، وفي نفس الوقت تستطيع إستخدام التابع first بالشكل التالي: users = User.objects.filter(role = 'admin').all() firstUser = users.first() بهذه الطريقة سيكون لديك كل كائنات النموذج User وفي نفس الوقت تستطيع الحصول على أول كائن منهم بدون عمل إستعلام جديد في قاعدة البيانات، وفي حالة لم يتم العثور على أي كائنات سوف يتم إعادة None.1 نقطة
-
يوجد عدة طريق للقيام بهذا الأمر في Django. الطريقة الأولى: إن كان إصدار Django لديك 2.1 أو أحدث، فستجد أن Django يوفر لك json_script لكي تمرر القواميس بشكل كود json، كالتالي: {{ value|json_script:"hello-data" }} وستكون النتيجة في المتصفح بالشكل التالي: <script id="hello-data" type="application/json">{"hello": "world"}</script> ويمكنك إستخدام هذه البيانات على النحو التالي: const value = JSON.parse(document.getElementById('hello-data').textContent); ملاحظة: هذه الطريقة أمنة من ثغرات XSS لأن Django يقوم بتحويل الرموز الخطيرة مثل (< , > , &) ، كالتالي: <script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script> الحل الأخر (يعمل مع جميع إصدارات Django)، وهو استخدام حقل الإدخال المخفي في القالب، كالتالي: <input type="hidden" id="myDict" name="variable" value="{{ myDict }}"> <script> var myDict = document.getElementById("myDict").value; </script> ملاحظة: لا تحاول أبدًا أن تقوم بإسناد قيمة أي متغير إلى كود JavaScript على النحو التالي: <script type="text/javascript"> var x = "{{someDjangoVariable}}"; </script> الكود السابق خطير للغاية لأنه سعرض الموقع لثغرة XSS مما قد يؤدي إلى تنفيذ أكود JavaScript خبيثة لدى زوار الموقع، مما يؤدي إلى سرقة بياناتهم مثل بطاقات الإئتمان والبريد الإلكتروني وكلمات السر أيضًا.1 نقطة
-
لاحظ أنك تستعمل الصيغة scss بدلًا من less في الخاصية test، وسيكون الكود الصحيح، كالتالي: module.exports = { module: { rules: [ { test: /\-theme.less$/i, // لاحظ صيغة الملفات loader: [ // compiles Less to CSS "style-loader", "css-loader", "less-loader", ], }, ], }, };1 نقطة
-
إذا كان الخطأ يظهر عند محاولة تثبيت حزمة MySQL-python من خلال الأمر التالي: pip install MySQL-python فيمكنك تثبيتها بطرق أخرى، مثل إستخدام easy_install على النحو التالي: easy_install MySQL-python في حالة كان الخطأ الذي يظهر لديك بعد تثبيتها هو من نوع EnvironmentError كالتالي: EnvironmentError: mysql_config not found فسوف تحتاج إلىى تثبيت بعض البرمجيات الإضافية على النحو التالي: sudo apt-get install python-mysqldb libmysqlclient-dev python-dev1 نقطة
-
الإصدار 1.0.0
19182 تنزيل
لا يخفى على أي مطور ويب خصوصًا مطوري واجهة المستخدم الأمامية (front end developers) أهمية إضفاء بعض الحيوية على المواقع التي يصممونها عبر الحركات، إذ هنالك عدة فوائد يمكن تحصليها من إضافة الحركات إلى صفحات الموقع أهمها الابتعاد عن السكون الممل، ولفت الانتباه، وتحسين التواصل مع الزائر أو المستخدم وغيرها؛ لذلك، أصبحت الحركات أمرًا جوهريًا في مواقع الويب لا يمكن الاستغناء عنها. جاء هذا الكتاب لشرح مفهوم الحركة وكيفية تحريك العناصر باستخدام CSS فقط بدءًا من الحركات البسيطة وحتى الحركات المعقَّدة المُتقدِّمة بالإضافة إلى التَطرُّق إلى مناقشة مسألة متى يجب إضافة الحركات ومتى يجب الابتعاد عنها. هذا الكتاب مترجم عن كتاب «CSS Animation 101» لصاحبه Donovan Hutchinson، ونأمل أن يكون إضافةً نافعةً للمكتبة العربيَّة وأن يفيد القارئ العربي في الإلمام بموضوع التحريك عبر CSS. هذا الكتاب مرخص بموجب رخصة المشاع الإبداعي Creative Commons «نسب المُصنَّف - غير تجاري - الترخيص بالمثل 4.0». يمكنك قراءة فصول الكتاب على شكل مقالات من هذه الصفحة، «المرجع الشامل إلى التحريك عبر CSS»، أو من مباشرةً من الآتي: الفصل الأول: ما هي استخدامات الحركات؟ الفصل الثاني: تجهيز بيئة العمل لإنشاء الحركات الفصل الثالث: مدخل إلى الإنتقالات: التنقل بين الحالات الفصل الرابع: مدخل إلى الحركات: مفهوم الحركة القصل الخامس: تطبيق عملي: الانتقالات الفصل السادس: خاصيات الانتقالات الفصل السابع: دوال التوقيت الفصل الثامن: الانتقالات المتعددة الفصل التاسع: الانتقالات وجافاسكربت الفصل العاشر: تطبيق عملي: التحريكات الفصل الحادي عشر: خاصيات الحركات الفصل الثاني عشر: تطبيق عملي: الإطارات المفتاحية الفصل الثالث عشر: الحركات المتعددة المتزامنة الفصل الرابع عشر: موجز الحركات الفصل الخامس عشر: رواية القصص عبر الحركات الفصل السادس عشر: حرب النجوم (Star War) الفصل السابع عشر: إظهار المحتوى أثناء التمرير الفصل الثامن عشر: سهولة الوصول الفصل التاسع عشر: نهاية الرحلة1 نقطة -
أرجو أن تبدأي بكتابة البرنامج و سنساعدك إن حصل معك أخطاء.1 نقطة
-
جزاك الله خيرا على هذا الدليل الشامل المتكامل لتعلم البرمجة.. فعلا النصائح الأخيرة التي ذكرتها مهمة جدًا، ونابعة من رجل ذو خبرة في المجال.. يؤخذ على المقال أن المصادر كانت مركزة على "حسوب" ومنتجاتها فقط، والواقع أنها ليست أفضل المصادر لتعلم البرمجة، خاصة لذوي الدخل الضعيف والمعدوم.. وحتى "الموسوعة" فتصلح كمرجع عند الحاجة لا كمصدر للتعلم.. وأمر آخر أنها باللغة العربية مما يصعب فهم البرمجة برأيي.. لا لأنها بالعربية لكن بسبب ترجمة المصطلحات وطبيعة لغات البرمجة نفسها؛ إذ هي مكتوبة بالإنجليزية.. ومن هنا أنبّه على ضرورة تعلم الإنجليزية ولو بمستوى أوّل لأن المصادر المحدَّثة أغلبها بالإنجليزية.. ملحوظة أخرى وددت لو ذُكرَت في المقال هي الخطة المفصلة لتعلم البرمجة؛ مثلا: HTML5 ثم CSS3 ثم JAVASCRIPT ثم التدريب على مشاريع، ثم PHP7 مثلا وهكذا... على كل مقال موفق، ومرة أخرى جزاك الله خيرا على مجهوداتك الجبارة. حياك الله.1 نقطة