-
المساهمات
1690 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
2
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
أجوبة بواسطة شرف الدين حفني
-
-
مرحبًا احمد
من اين مصدر هذا السطر؟ هل هذا سطر في شفرة برمجية؟ إن كانت الإجابة بنعم برجاء تحديد اللغة
-
بتاريخ 5 ساعات قال Salih Othman:
هل استكشاف الاخطاء فيها اسهل..لاني سمعت ان اكتشاف الاخطاء بلغة مثل البي اتش بي متعب بعض الشي، ورغم ذلك البي اتش بي لغة مشهورة ...ماهي مميزات وعيوب وايهما تفضل بين النود والبي اتش بي او بصيغة اخرى هل هناك ما يميز PHP على النود كلغة في الباك اند ؟
php تتميز بشهرتها الواسعة وإنتشارها مما يؤدي إلى فرص عمل أكبر بالphp ومجتمع أكبر في حالة واجهتك مشكلة أثناء التعلم سيكون الدعم في php أكبر من نظيره في node js
-
النص بالفعل موضوع في منتصف ال.content المشكلة نفسها أن ال.content غير موضوعة في المنتصف, يمكنك زيادة العرض إلى 100% وحينها سيصبح الكلام النصي في منتصف الصفحة أو يمكنك إستخدام flex-box وإعطاء الصنف الأعلى من ال.content الخاصية display:flex ومن ثم عمل justify-content:center للصنف الأعلى ووقتها سيصبح الكلام في المنتصف
إن لم تفلح معك الحلول بالأعلى برجاء نسخ الشفرة البرمجية لصفحة الhtml ولصقها في تعليق
-
بتاريخ 1 دقيقة مضت قال Salih Othman:
هذا يعني ان اقصر طريق للتعلم الباك اند هو النود لانك ستكون قد تعلمت الجافا سكربت مسبقا...هل ممكن استخدام النود مع كل قواعد البيانات سواء علا ئقية وغير علائقية وهل تكامل النود مع قواعد البيانات ممتاز ام هناك عجز مع بعض قواعد البيانات؟
هذا يعني ان اقصر طريق للتعلم الباك اند هو النود لانك ستكون قد تعلمت الجافا سكربت مسبقا...هل ممكن استخدام النود مع كل قواعد البيانات سواء علا ئقية وغير علائقية وهل تكامل النود مع قواعد البيانات ممتاز ام هناك عجز مع بعض قواعد البيانات؟
لكل تقنية مميزاتها ولكن صحيح من ضمن مميزات نود أن من السهل تعلمها أو كما قلت أنت طريقها أقصر نسبيًا, ونود تعمل مع جميع قواعد البيانات لا يوجد مشكلة
-
النود ليست إطار عمل للجافاسكريبت وإنما هي بيئة عمل للجافا سكريبت
ما المقصود ببيئة عمل؟
في العادي لا يمكن تشغيل شفرات الجافاسكريبت خارج المتصفح, حيث أن لغة جافاسكريبت تعمل على المتصفحات فقط , بيئة عمل نود تقوم بتوفير المكاتب اللازمة والأدوات اللازمة من خلال ما يُعرف بمحرك v8 وهو الذي يقوم بتشغيل شفرة الجافاسكريبت خارج المتصفح سواء كان على الحاسب الشخصي لإنشاء تطبيقات سطح مكتب أو على الخوادم لبرمجة الواجهات الخلفية
-
مبدأ open-closed أو (مفتوح للإمتداد - مغلق للتعديل) هو ثاني مبدأ من مبادي SOLID وهي المبادئ الخمسة الأساسية لتصميم نظام كائني التوجه بشكلٍ سليم, لنفهم المبدأ من خلال المثال التالي:
نفترض أن لدينا واجهة تُسمى Shape ويقوم بعمل implement لها أصناف مثل Square, Circle ولدينا صنف يُسمى AreaCalculator يحتوي على دالة تُسمى sum مسؤلة عن أخذ مجموعة من الأشكال وحساب مساحتها كما يتضح لنا في الشفرة التالية
interface ShapeInterface { public function area(); } class Square implements ShapeInterface { public int length; public function Square(int length) { this.length = length; } public function area() { return Math.pow(this.length, 2); } } class Circle implements ShapeInterface { public int radius; public function Circle(int radius) { this.radius = radius; } public function area() { return Math.pow(this.length, 2); } } class AreaCalculator { protected ShapeInterface[] shapes; public function AreaCalculator() { this.shapes = []; } public function sum() { foreach (this.shapes : shape) { if (shape instanceof Square) { area+ = Math.pow(shape.length, 2); } elseif (shape instanceof Circle) { area+ = Math.pi * Math.pow(shape.radius, 2); } } return area; } }
الأن لدينا مشكلة في تلك الشفرة, إن أردنا مثلًا إضافة شكل أخر مثل المثلث أو المستطيل أو أي شكل سنحتاج إلى الرجوع والتعديل مرة أخرى في الدالة sum وهذا سيؤدي إلى شفرة برمجية أكثر تعقيدًا وأكثر عرضة للأخطاء, لذا من الأفضل أن نجعل دالة المساحة موجودة في الأصناف المتوارثة من ShapeInterface وتقوم الدالة sum بنداء الدالة المسؤلة عن المساحة مباشرةً ليُصبح الشكل النهائي لشفرتنا كالتالي
interface ShapeInterface { public function area(); } class Square implements ShapeInterface { public int length; public function Square(int length) { this.length = length; } public function area() { return Math.pow(this.length, 2); } } class Circle implements ShapeInterface { public int radius; public function Circle(int radius) { this.radius = radius; } public function area() { return Math.pow(this.length, 2); } } class AreaCalculator { protected ShapeInterface[] shapes; public function AreaCalculator() { this.shapes = []; } public function sum() { foreach (this.shapes : shape) { area+=shape.area(); } return area; } }
- 2
-
إختيار اللغة لن يؤثر بشكلٍ كبير على أداء التطبيق حيث يوجد عوامل أهم يجب أخذها في الحسبان
- الإستعلامات التي يتم إستخدامها في قاعدة البيانات, فإن قاعدة البيانات من أكبر مشاكل الأداء فيجب تنفيذ إستعلامات سريعة
- كثرة الإستعلامات إلى قاعدة البيانات
- كثرة البيانات الغير مفيدة والتي يمكن الإستغناء عنها
- كثرة الطلبات التي تقوم بها الصفحة, كلما زادت الطلبات التي ترسلها الصفحة في نفس ذات الوقت أثر على أداء التطبيق
- حجم الملفات , حاول بقدر المستطاع ضغط الصور والملفات بوجهٍ عام حتى يقل حجم البيانات التي يستقبلها العميل
- تخزين البيانات في هياكل بيانات مناسبة
- عدم القيام بأي عمليات حسابية حساسة عند العميل وإستبدالها عند الخادم
- 1
-
برجاء وضع الشفرة البرمجية التي تظهر بها المشكلة في تعليق بدلًا من إرفاق المشروع حتى يكون من السهل توفير إجابة على سؤالك
- 1
-
بالإضافة إلى المقالات والأسئلة التي أشار إليها أسامة يوجد أيضًا موسوعة حسوب, وهي موسوعة غنية بالمعلومات والتوثيقات عن مختلف التقنيات واللغات البرمجية
ستلاحظ عند دخولك إلى الموسوعة أن المواضيع مقسمة حسب اللغة أو التقنية, ويوجد خانة إدخال البحث, من خلالها يمكنك كتابة ما تبحث عنه وستظهر لك مواضيع ذات علاقة بموضوع البحث, على سبيل المثال إن أردت قراءة التوثيق الخاص بالتابع promise.all يمكنك كتابة promise.all في خانة البحث وستظهر لك في النتائج التوثيقات المتعلقة بتلك الكلمة البحثية, ويمكنك تصفح الموسوعة عبر النقر هنا
-
لكلٍ منهما مميزاته وعيوبه وحالات يُفضل الإستخدام فيها
بالنسبة للeager loading
- ميزته أنك لا تحتاج لعمل أكثر من إستعلامة لقاعدة البيانات حيث تكتب إستعلامة واحدة تحصل فيها على البيانات جميعها
- عيبه أن في حالة كان هناك كثير من البيانات من الممكن أن لا تكون تحتاجها كلها وبالتالي ستشغل الذاكرة ببيانات لا فائدة لها
ما الحالات التي يُفضل إستخدامه فيها؟
إن إفترضنا وجود علاقة one-to-many نقوم بإستخدام الeager لل many أي إن مثلًا كنا نتعامل مع علاقة مؤلف مع المقالات, وأردنا الحصول على مقالة ما , في تلك الحالة نستخدم الeager loading لنحصل معها على المؤلف
بالنسبة للlazy loading
- ميزته أنه يقوم بجلب عدد قليل من البيانات وبالتالي يشغل مكانًا أقل في الذاكرة وفي حالة إحتجنا لباقي البيانات يمكننا الإتيان بها في وقتٍ أخر
- عيبه أنه في حالة كان تواجد البيانات الأخرى ضروري وأمر محتوم أننا سنقوم بجلبها فحينئذ سنكون هنا د إضطررنا إلى عمل إستعلامين إلى قاعدة البيانات وكان من الممكن إختصارهما في إستعلامة واحدة
الحالات التي يُفضل إستخدامه فيها
إن إفترضنا وجود نفس علاقة الone-to-many التي تحدثنا عنها بالأعلى فنقوم بإستخدام الlazy من طرف الone أي إن مثلًا كنا نتعامل مع علاقة المؤلف مع المقالات ولكننا هنا نستعلم عن المؤلف, في تلك الحالة نستخدم الlazy loading حتى لا نحصل على المقالات الخاصة بالمؤلف بل نحصل على المؤلف فقط إلى حين إحتياجنا للمقالات
- 1
-
بتاريخ 2 دقائق مضت قال Samer Alashqar:
هذا ما اقوم به :
res.cookie('access-token' , accessToken)
تلك المشكلة تحدث لك لأنك لا تقوم بتحديد عمر الcookie وبالتالي يتم تحديده بشكلٍ إفتراضي أن تنتهي مع إنتهاء الجلسة, الحل أن تقوم بتزويد الدالة بعمر الcookie كما بالمثال التالي
res.cookie('token', 'bla bla', { expires: new Date(Date.now() + 1000*60*60) })
بالمثال الأعلى يكون عمر الcookie ساعة, لأننا نقوم بتزويد تاريخ الإنتهاء بالmillesecond وبالتالي نقوم بكتابة 1000(أي ثانية واحدة) ونضربها في 60(لتصبح دقيقة) ونضربها في 60 لتصبح ساعة
- 1
-
هل يمكنك أن ترينا الشفرة البرمجية التي تحاول من خلالها تخزين الcookies ?
-
بالإضافة إلى إجابة حسن يمكننا توضيح تعددية الأوجه عبر المثال التالي
نفترض أننا أردنا إنشاء دالة تقوم بوظيفة ما على جهاز التحكم remote_control أيًا كان نوع هذا الجهاز سواء كان reciever_remote او tv_remote أو حتى نوع ثالث, وبغض النظر عن الشركة المصنعة لهذا الجهاز
على سبيل المثال دالة تقوم بحساب أقصى مدى يستطيع الوصول إليه هذا الجهاز, بدون تعددية الأوجه سنحتاج إلى إنشاء دالة لكل جهاز
function getTvRemoteHealth(TV_REMOTE $remote){ echo $remote->getHealth() } function getRecieverRemoteHealth(RECIEVER_REMOTE $remote){ echo $remote->getHealth() }
بينما عبر تعددية الأوجه يمكننا كتابة دالة أكثر عمومية كالأتية
function getRemoteHealth(remotecontroll $remote){ echo $remote->getHealth() }
بما أن جميع أجهزة التحكم تقوم بعمل implement للواجهة البرمجية remotecontrol لذا بالتالي يمكننا كتابة دالة واحدة كالسابقة تقوم بإستقبال كائن من نوع remotecontrol بغض النظر عن صنفه ومن ثم مناداة الدالة الخاصة بالوظيفة التي نريدها أيًا كان نوع جهاز التحكم tv_remote, reciever_remote, etc
- 1
-
الفرق أن الطريقة الأولى مثل التي في المثال
const user = await User.findOne({ where: { name: "Sharaf eldeen" } }); const books = await user.getBooks();
عبارة عن lazy loading أي أن يتم أولًا كتابة إستعلام للحصول على المستخدم ومن ثم نقوم في وقتٍ أخر عندما نحتاج الكتب بإرسال إستعلامة أخرى للحصول على الكتب
بينما الطريقة الثانية كاللتي في المثال
const user = await User.findOne({ where: { name: "sharaf" }, include: Book });
عبارة عن Eager loading أي يتم كتابة إستعلامة واحدة فقط من خلالها نحصل على كلٍ من المُستخدم والكتب الخاصة به عن طريق الربط بإستعلامة join فلا نحتاج إلا إلى إستعلامة واحدة فقط
-
لمعرفة عدد الخانات في عددٍ ما في لغة جافا يوجد عدة طرق مثلًأ
-
تحويل العدد إلى نص من خلال الدالة String.valueOf ومن ثم الحصول على طول النص كما يظهر لنا في المثال
int length = String.valueOf(number).length();
-
أخذ لوغاريتم العدد للأساس عشرة مع إضافة 1 , فإن كان مثلًا العدد 5520 , فإن اللوغاريتم للأساس عشرة بعد التقريب سيكون 3, نضيف 1 يصبح 4 وهو عدد الخانات
int length = (int) (Math.log10(number) + 1);
بالنسبة لتمثيل الأعداد فيمكنك تمثيلها في مصفوفة أو قائمة حسب الرغبة, المصفوفة أسرع في الوصول بينما القائمة تمكنك من إضافة العناصر دون تحديد الطول, حيث في المصفوفة تكون محكومًا بطول المصفوفة فإن إفترضنا المصفوفة طولها 5 لا يمكنك إضافة أكثر من 5 عناصر, بينما القائمة غير محكومة بطولٍ معين ولكنها على الجانب الأخر أبطأ من المصفوفة
- 1
-
تحويل العدد إلى نص من خلال الدالة String.valueOf ومن ثم الحصول على طول النص كما يظهر لنا في المثال
-
بالنسبة لل triggers يمكنك إنشاؤها من خلال طريقتين
-
عبر كتابتها ك raw query كالتالي
import { Sequelize } from "sequelize"; const sequelize = new Sequelize({ host: "localhost", port: 3306, dialect: "MySQL", username: "username", password: "password", database: "dbname", logging: false,}); sequelize.query('CREATE TRIGGER test AFTER INSERT ON users' + ' FOR EACH ROW' + ' BEGIN' + ' insert into logs (UserId) values(new.id);' + 'END;')
-
ومن الممكن أيضًا إنشاؤها من خلال الhooks كما يظهر في المثال التالي حيث نقوم بإنشاء trigger عند إنشاء مُستخدم جديد(insert query)
module.exports = function(sequelize, DataTypes) { var User = sequelize.define('User', { name : DataTypes.STRING(255), email : DataTypes.STRING(255), username : DataTypes.STRING(45), password : DataTypes.STRING(100), }, { classMethods : { associate : function(models) { User.hasOne(models.Config) } }, hooks: { afterCreate: function(user, options) { models.Config.create({ UserId: user.id }) } } }); return User; };
ويمكن إستبدال afterCreate بأي hook أخر حيث يتوفر العديد من الhooks مثل afterUpdate, afterDestroy , beforeUpdate, beforeCreate, beforeDestroy فيمكنك إذًا وضع hook حسب الحدث الذي تريد تنفيذ الشفرة البرمجية بعده
بالنسبة إلى الشق الثاني من السؤال غير واضح هل يمكنك رجاءًا توضيحه بشكلٍ أكبر؟
-
عبر كتابتها ك raw query كالتالي
-
ماهي المشكلة التي تقابلك تحديدًا؟ برجاء إرفاق رسالة الخطأ التي تظهر لكِ ووصف المشكلة بوضوح
-
إطار عمل flask يُطلق عليه لفظ microframework ليس بسبب ضعفه, وإنما في الحقيقة بسبب أنه يأتي بالقليل من المميزات والتي يمكنك لاحقًا الحصول عليها عبر الإضافات, حيث يأتي إطار عمل flask بخصائص بسيطة مثل الrouting ومعالجة الطلبات(request handling) بينما مميزات أخرى مثل الtemplate engine و ORM و caching جميعها يجب إضافتها من قِبل مكتبات خارجية بنفسك, على عكس إطار عمل مثل django الذي يحتوي على كل تلك المميزات, لهذا السبب يتم إطلاق لفظ microframework على flask , ولكنها في النهاية يُمكنك إنشاء مشاريع كبيرة بها حيث المشكلة عادةً لا تكون في إطار العمل وإنما تكون في كتابتك لإستعلامات فعالة لقاعدة البيانات وتطبيق تقنيات مثل caching
- 1
-
يمكنك توليد رمز uuid (Universally unique identifier) وهو عبارة عن رمز مكون من 128 بيت , مما يعني أنه إن قمنا بتوليد 10تريليون رمز سيكون إحتمالية وجود رمزين متشابهين هي 0.00006
ولتوليد رموز uuid في flutter يمكننا إتباع الخطوات التالية
-
تثبيت مكتبة uuid
flutter pub add uuid
-
عمل import للمكتبة
import 'package:uuid/uuid.dart';
-
نقوم بإنشاء كائن من الصنف uuid
var uuid = Uuid();
-
نقوم بعد ذلك بتوليد الرمز عبر مناداة الدالة v4 والتي تقوم بتوليد رمز من الإصدار الرابع وهو أخر إصدار موجود حاليًا للuuid ويعتبر أكثرهم أمانًا وأقلهم عرضةً للتكرار
uuid.v4()
- 1
-
تثبيت مكتبة uuid
-
تلك المشكلة تحدث بسبب أنك قمت بإغلاق قوس الwhile بعد إغلاق وسم table, بالإضافة أنك بدأت الحلقة قبل بدأ الوسم tbody وبالتالي يتم إغلاق الجدول وكتابة باقي الحقول خارجه, الحل أن تقوم بوضع الحلقة التكررية داخل tbody وتقوم بإغلاقها قبل إغلاق الجدول ليكون شكل الشفرة البرمجية لديك كالتالي
<tbody> <?php while($row=fetch_data($query)){ ?> <tr> <td><?php echo $row['FirstName'].$row['LastName'?></td> ////باقي الحقول </tr> <?php } ?> </tbody>
- 1
-
برجاء إرفاق المشروع حتى نتمكن من معاينته بشكلٍ أفضل
-
يوجد لديك مشكلتان
-
قمت بوضع مسار ملف الجافا سكريبت بشكلٍ خاطئ حيث قمت بكتابة
<script src="../New folder (7)/main.js"></script>
وهذا المسار غير موجود حيث أنك قد وضعت ملف الجافاسكريبت في نفس مجلد ملف الhtml مما يعني أن يجب أن يكون وسم الإستيراد كالتالي
<script src="main.js"></script>
-
في ملف جافا سكريبت قمت بكتابة
var inp = document.getElementById("input");
ولا يوجد في ملف html عنصر يحمل id بإسم input بل يحمل class بهذا الإسم فبرجاء تغيير العنصر في ملف html ووضع الid بقيمة input ليصبح شكل العنصر في صفحة الhtml كالتالي
<input type="text" id="input">
-
-
قمت بوضع مسار ملف الجافا سكريبت بشكلٍ خاطئ حيث قمت بكتابة
-
تحتاج أولًا إلى تثبيت المكتبة التالية , pbkdf2 عبر إستخدام أداة pip
pip install pbkdf2
ومن ثم نقوم بعمل إستيراد لهم
import pbkdf2, os
ومن ثم نقوم بإضافة salt وهو عبارة عن كلمة يتم إضافتها للشفرة لتزويد صعوبتها وتعقيدها ونقوم بتوليدها عبر توليد رموز عشوائية كما بالشفرة التالية
passwordSalt = os.urandom(16)
ومن ثم نقوم بتوليد المفتاح عبر الشفرة التالية باستخدام مكتبة pbkdf2
key = pbkdf2.PBKDF2(password, passwordSalt).read(32)
لتصبح في النهاية شفرتنا البرمجية شبيهة بتلك الشفرة
import pbkdf2, os password = "sharafeldeen" passwordSalt = os.urandom(16) key = pbkdf2.PBKDF2(password, passwordSalt).read(32)
-
يمكنك تنفيذ المطلوب عبر إستخدام الدالة COUNT , حيث في حالتنا هنا نريد الحصول على عدد المُعجبين والذي يمكن تنفيذه كالتالي بإستخدام sql
select COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId
وفي حالة أردنا عرض المنشور وبجانبه عدد المعجبين يمكننا إستخدام الدالة count مع الدالة group by لأن بدون إستخدام group by سيتم عرض فقط المنشورات التي لديها معجبين, ويمكننا تمثيل ذلك بكود sql كالتالي
select Post.*, COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId group by Post.id
حيث يتم عرض جميع المنشورات حسب الid الخاص بهم بالإضافة إلى عدد المُعجبين, ويمكننا تنفيذ الشفرات السابقة إلى أكواد sequelize كالتالي
-
const posts = await Post.findAll({ attributes:[ [Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"] ], include:{model:User,as:"UserLikes" , attributes:[]}, group: ['Post.id'], subQuery: false, limit: limit, offset: limit * pageNo })
كما تلاحظ قمنا في خانة attributes بوضع attribute واحد فقط وهو مجموع الحقل UserLikes.id لنعلم كم إعجاب لكل منشور حسب ظهور المُعرف الخاص بالمُعجب, كما إستخدمنا أيضًا subQuery ب false حتى نجعل الشفرة تعمل كما بالأعلى حتى لا يتم إستبدال الjoin ب subquery
-
const posts = await Post.findAll({ attributes:{ include:[[Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"]] }, include:{model:User,as:"UserLikes" , attributes:[]}, group: ['Post.id'], subQuery: false, limit: limit, offset: limit * pageNo })
الفرق الوحيد أننا قمنا بتغيير خاصية attributes بدلًا من وضعها على هيئة مصفوفة قمنا بوضعها على هيئة كائن, حيث إن وضعناها على هيئة مصفوفة سيقوم بجلب العناصر التي في المصفوفة فقط, بينما إن قمنا بوضعها على هيئة كائن سيقوم بجلب العناصر جميعها بالإضافة إلى الحقل في الخاصية include
-
معنى علامة ~ لغة C#
في أسئلة البرمجة
نشر
تلك العلامة تُسمى compliment bitwise ,ما معنى ذلك؟
إن إفترضنا لدينا الرقم الثنائي 0110110 فإن الcompliment يقوم بتحويل جميع الأصفار إلى أحاد وجميع الأحاد إلى أصفار فيصبح الرقم 1001001
يمكن تطبيق ذلك بنفس الطريقة على الأرقام العشرية إن إفترضنا قمنا بكتابة الشفرة التالية
الرقم 16 في النظام الثنائي يساوي 10000 , إن قمنا بإستخدام المعامل ~ سيتم تحويله إلى 01111 أي يصبح المتغير result يساوي 15