-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
إجابات الأسئلة
-
إجابة Wael Aljamal سؤال في لدي مشكلة ndk-bundle did not have a source.properties file مما يعطي خطأ FAILURE: Build failed with an exception. كانت الإجابة المقبولة
حاولي عمل
flutter clean من Terminal ثم أعيدي تشغيل التطبيق
-
إجابة Wael Aljamal سؤال في الفرق بين دورتي تطوير تطبيقات الجوال باستخدام تقنيات الويب ودورة تطوير التطبيقات باستخدام لغة JS؟ كانت الإجابة المقبولة
كلاً من الدورتين تعمل على تقنيات مختلقة ولكن لغة جافاسكربت مشتركة بينهما،
تطوير تطبيقات الجوال باستخدام تقنيات الويب: برمجة تطبيقات هاتف تعمل باستخدام تقنية cordova (كوردوفا) وهي طريقة لتجميع موقع الكتروني على شكل تطبيق حاتف يعمل بواسطة webView حيث يكون مكون من صفحات HTML - CSS - JS دورة تطوير التطبيقات باستخدام لغة Js: يتم فيها تعليم كل مايتعلق بلغة جافاسكربت ومكتباتها React لبرمجة المواقع، node لبرمجة المخدم، و React Native لبرمجة تطبيقات الهواتف يمكنك قراءة الإجابة التالية فيها المزيد من التفاصيل:
-
إجابة Wael Aljamal سؤال في مشكلة في تشغيل الموقع على الاستضافة كانت الإجابة المقبولة
تأكد هل البيئة المحلية لديك فيها نفس إصدار لغة البرمجة؟
-
إجابة Wael Aljamal سؤال في ما هو أنسب باك إند لتطبيق تواصل اجتماعي؟ كانت الإجابة المقبولة
طالما ذكرت أنه يوجد realtime أي مثل رسائل الدردشة والإشعارات فالأفضل أن تختار NodeJs لأنها تدعم ذلك مع web sockets و socket.io وتقدم سرعة استجابة عالية.
كذلك هنا مجموعة إجابات لنفس السؤال، حيث وضع كل مدرب رأيه.
NodeJs تعتمد على لغة جافاسكربت، فإن كنت تعرف أساسيات جافاسكربت فهذا جيد، ولكن بشكل عام يمكن تطبيق جميع المفاهيم البرمجية المطلوبة باستخدام أي لغة برمجة وأي قواعد بيانات، يفضل أن تختار ما تعلمته مسبقاً إن لم يكن لديك متسع من الوقت في تعلم تقنيات جديدة.
-
إجابة Wael Aljamal سؤال في إضافة صورة شخصية للمستخدم في تطبيق Nodejs كانت الإجابة المقبولة
لدعم استعمال الصور في مشروع يوجد عدة خطوات للقيام بها، هذا الموضوع متغير حسب نوع مدير قواعد البيانات ولغات البرمجية المستخدمة ..
يمكن الاعتماد على الأفكار التالية:
لا يتم تخزين الصور في قاعدة البيانات نضع في قاعدة البيانات اسم الصورة فقط ليكون حجم قاعدة البيانات أقل وبالتالي أخف عبئ على مدير قواعد البيانات يتم رفع ملف الصورة بشكل منفصل كملف يتم تمريره على المخدم نربط بين ملف الصورة وقاعدة البيانات عن طريق إما مسار الصورة أو اسمها يتم تخزين الصورة على المخدم كملف ضمن نظام إداة الملفات File Sytem مثلما ترى الصور ضمن مجلدات لديك.. إن كنت تستخدم مكتبة تعتمد أسلوب/هيكلية النماذج نضيف خاصية الصورة كسلسلة نصية لاحظ حقل avatar في بنية وثيقة المستخدم
const ModelSchema = new mongoose.Schema({ name: { type: String, required: true, maxlength: 20 }, username: { type: String, required: true, unique: true, maxlength: 20 }, password: { type: String, required: true }, about: { type: String, maxlength: 100 }, avatar: String, }); ثم يصبح له حقل في قاعدة البيانات، وباقي الأمور هي عملية رفع الصورة، ممكن نستخدم مكتبة multer في قسم back end
const multer = require('multer'); /** * Handel multipart/form-data. الوصول للتخزين */ const storage = multer.diskStorage({ destination: 'public/uploads/', filename: function (req, file, cb) { cb(null, Date.now() + path.extname(file.originalname)) } }); /** * User profile middleware. رفع الصورة */ const upload = multer({ limits: { fileSize: 1024 * 1024 }, storage: storage , fileFilter: (req, file, cb) => { let fileTypes = /jpeg|jpg|png/; let mimeType = fileTypes.test(file.mimetype); let extname = fileTypes.test(path.extname(file.originalname).toLowerCase()); if (mimeType && extname) return cb(null, true); cb(new Error('غبر مسموح رفع هذا الملف')); }, }); أما
في Front end نستخدم form data + axios يحدد المستخدم رابط ملف الصورة نضيف مسار الصورة لحالة التطبيق يتم تقسيم الملف لأجزاء صغيرة وإرفاقه مع الطلبية onImageChange = e => { if (e.target.files && e.target.files[0]) { this.setState({ image: URL.createObjectURL(e.target.files[0]), avatar: e.target.files[0] }); } }; /** * Change form handler * @param e */ onChange = e => this.setState({[e.target.name]: e.target.value, error: null}); /** * Form submit handler. * @param e */ onSubmit = e => { e.preventDefault(); const data = new FormData(); data.append('name', this.state.name); data.append('about', this.state.about); if (this.state.avatar) data.append('avatar', this.state.avatar, this.state.avatar.name); axios.post('/api/account', data) .then(this.props.toggle) .catch(err => this.setState({ error: err.response.data.message })); }; يمكنك الاستفادة من السؤال:
أي بيانات غير نصية نخزنها خارج قاعدة البيانات. يوجد أكثر من طريقة برفع الملف مثل multer وغيرها من المكتبات -
إجابة Wael Aljamal سؤال في كيف العمل مع حسوب كانت الإجابة المقبولة
تقوم شركة حسوب بطرح المشاريع خاصتها للمستقلين على موقع مستقل.
تم شرح آلية المشاركة في الأكاديمية لكتابة المقالات من خلال صفحة: اكتب معنا، حيث يتم التوظيف على موقع مستقل.
يوجد أيضاً موقع بعيد للتوظيف عن بُعد.
-
إجابة Wael Aljamal سؤال في تحويل كود حلقة تكرارية إلى لغة بايثون كانت الإجابة المقبولة
لدينا تعليمتين برمجيتين هما الحلقة و الطباعة
for x in range(a, b, c): print(x) حيث أن range تأخذ الوسطاء بالترتيب:
a بداية المجال b نهاية المجال c الخطوة (القفزة) step حالات خاصة:
في حال تمرير a فقط، سيتم العد من 0 حتى a-1 أي مثلا range 6 سيعطي 0,1,2,3,4,5 في حال تمرير a,b ستكون قيمة الخطوة الافتراضية 1 -
إجابة Wael Aljamal سؤال في [php] كيف تعمل دالة unlink وكيفية ضبطها كانت الإجابة المقبولة
ربما المشكلة في مسار الصور الممررة للدالة unlink أي المسار يتم استدعائه من سياق مختلف..
وربما ليس لديك صلاحية لحذف الملف..
لعمل تغيير الصلاحية نستخدم chown
$path = '.path/image.png'; chown($path, 666); // تعديل الصلاحية if (unlink($path)) { echo 'success'; } else { echo 'fail'; } وإن ظهر خطأ مثل
Warning: unlink() expects parameter 1 to be a valid path, resource Resource id #3 cannot be deleted due to an error حاول تجهيز مؤشر على الملف كالتالي:
$file_pointer = fopen('abcd.txt', 'w+'); if (!unlink($file_pointer)) { echo ("$file_pointer خطأ لم يتم الحذف"); } else { echo ("$file_pointer تم الحذف); } كما يمكنك الاستفادة من سؤالين لنفس المشكلة:
يمكنك التأكد من أن الملف موجود قبل الحذف لمعرفة هل المسار سليم أم لا:
$Path = './path/image.png'; if (file_exists($Path)){ if (unlink($Path)) { echo "تم الحذف"; } else { echo "فشل حذف"; } } else { echo "مسار خطأ"; }
-
إجابة Wael Aljamal سؤال في ما هي التعابير النمطية RegEx؟ كانت الإجابة المقبولة
regex أو regexp هي طريقة لمطابقة السلاسل النصية بشكل كامل أو جزئي بالاعتماد على خليط من المحارف والأرقام و رموز الاستبدال والتكرار التي تمثل مجتمعة هيكلية لعمل نمط تطابق مع نصوص لاستخراج الكلمات المتشابهة التي تنتمي لنفس نمط البحث.
يطلق عليها باللغة العربية التعابير النمطية أو التعابير المنتظمة أو أحرف البدل. في حال التعامل معها للبحث في نص باللغة الإنكليزية نستخدم محارف جدول ASCII أي الحروف الإنكليزية
abcd ... a-z ABCD ... A-Z 123 0-9 !@#$%^&*() .. أما في حال البحث في لغات أخرى، تختلف قيم المحارف حسب اللغات الطبيعية فمثلاً للبحث في نص باللغة العربية نستخدم مجال محارف Unicode وغيره حسب اللغة.
محارف التحكم الأساسية:
محرف (أو) بشكل محرف العمود ( "|" ) المنطقي Boolean ويُستخدم لإيجاد ناتج بحث من أحد خيارين ويكثر استخدامه في الكلمات التي يمكن أن تُكتب بشكلين أو أكثر مثل الكلمة الإنكليزية للون الرمادي gray | grey فوجود هذا التعبير، يعمل على البحث عن أحد الشكلين للكلمة. التجميع Grouping باستخدام ( ) الأقواس المدورة / الدائرية حيث نقوم بالتعبير عن مجموعة بحث جزئية مثلاً وضع gr(a|e)y هنا سيتم عمل مطابقة لأول حرفين g - r ثم مجموعة اختيارية من a - e ثم y محددات الكميات / التكرارات:
إشارة الاستفهام ? وهي محرف تحكم، نكتبها بعد النمط الجزئي أو الحرف مثلاً وهي تقبل ظهور محرف أو عدم ظهوره ضمن سلسلة نصية (أي يكون لدينا محرف اختياري) أي يمكن للمحرف أن يتواجد 0 أو 1 مرة ليتم قبول النمط مثل كلمة اللون باللغة الإنكليزية colou?r حيث يمكن كتابتها بشكلين مع أو بدون حرف u وكلاً من ناتجي البحث مقبول النجمة * تقبل وجود النمط / المحرف بعدد تكرارات من 0 أي يمكن ألا يظهر، إلى اللانهاية (أي بدون تحديد عدد أعظمي لتكرار النمط الجزئي) مثلا النمط ab*c ووجود النجمة بعد حرف b أي يمكن أن يتكرر b من 0 إلى عدد غير محدد من المرات حيث يقبل السلاسل التالية مثلًا ac, abc, abbc, abbbc عدد مرات ظهور b غير محدد.
إشارة الجمع أو زائد + تقبل وجود النمط / المحرف بعدد تكرارات من 1 أي يمكن أن يظهر المحرف مرة واحدة على الأقل، إلى اللانهاية (أي بدون تحديد عدد أعظمي لتكرار النمط الجزئي) مثلا النمط ab+c ووجود زائد بعد حرف b أي يمكن أن تم تكرار b من 1 إلى عدد غير محدد من المرات حيث يقبل السلاسل التالية مثلًا abc, abbc, abbbc عدد مرات ظهور b مرة على الأقل، أي على عكس النجمة الحد الأدنى هو تكرار واحد على الأقل. مجال تكرار محدد، يمكن استعمال الأقواس المجعدة curly brackets { } مع وضع رقمين بينهما فاصلة يمثلان الحد الأدنى والأعلى للتكرار المسموع به للمجموعة الجزئية أو المحرف {n} تكرار بالضبط n مطابقة {min,} تحديد الحد الأدنى {,max} تحديد الحد الأعلى {min,max} تحديد مجال بين حد أدنى و حد أعلى مثلاً للبحث عن hello يمكن كتابة
hel{2}o => hello ^^ سيتم البحث عن تطابق للنمط مع حرفين L
النقطة "." وتعبر عن محرف وحيد غير محدد أي محرف ممكن أن يظهر مثلا
a.c يمكن أن يظهر بين a و b أي محرف آخر مثل
aac abc acc aec adc aoc ^ متغير
قبول محرف من عدة محارف باستخدام الأقواس المربعة [ ] مثلا في حال كتابة
[abc] => سيتم قبول أحد الرموز التالية
a أو b أو c
تحديد مجال من المحارف المتتالية أبجدياً أو رقميا
المطابقة لأحد الأحرف <= المجال a-c => a b c b-e => b c d e A-D => A B C D A-Z => جميع الأحرف بشكل كبير capital a-z => جميع الأحرف بشكل صغير small 0-9 => أي رقم .
عدم انتماء لمجال، لا نريد للحرف الحالي أن يكون abc نكتب
[^abc]
يختلف تطبيقه من لغة برمجة لأخرى بشكل بيسط وحسب المكتبة التي تريد استعمالها لكل منها
يمثل المحرف ^ بداية النمط ويمثل $ نهايته
مثال لاختبار هل النص التالي يمثل بريد الكتروني
"^ [a-zA-Z0-9_.+-]+ @ [a-zA-Z0-9-]+ \. [a-zA-Z0-9-.]+ $" ^ ^^^^^^^^^^^^^^^^ ^ ^^^^^^^^^^^^^ ^^ ^^^^^^^^^^^^^^ ^ 1 2 3 4 5 6 7 حيث نلاحظ
محرف بداية ^
مجال من أحرف ومحارف مكرر على الأقل مرة واحدة (كل حرف إما يتبع لمجال أو يكون _ + - .)
محرف @
مجال مثل 2
النقطة نفسها مع محرف هروب
مجال محارف آخر
محرف النهاية $
-
إجابة Wael Aljamal سؤال في مشكلة في برنامج OpenGL كانت الإجابة المقبولة
مكتبة kivy متوافقة كحد أدنى مع openGL الإصدار 2.
هل أنت متأكد من تثبيت openGL بطريقة صحيحة؟
لاحظ أنها مرتبطة بنوعية كرت الشاشة: opengl#Windows
يمكنك تثبيت برنامج OpenGL Extensions Viewer لمعرفة معلومات أكثر عن الإصدار الذي تستخدمه
-
إجابة Wael Aljamal سؤال في طباعة مربع باستخدام النجوم وبداخله نص في #C كانت الإجابة المقبولة
لنحاول تبسيط البرنامج،
سيكون لدينا 3 أسطر، الاول و الثالث فيه عدد من النجوم، والسطر الثاني يبدأ وينتهي بنجمعة، وفيه كلمة في المنتصف. نستخدم المحرف n\ للانتقال لسطر جديد اثناء الطباعة في console يمكنك استخدام حلقة for لطباعة عدد محدد من النجوم لكل سطر شارك معنا الشيفرة البرمجية لمساعدتك في إصلاح الأخطاء، عليك البدء بنفسك ومن ثم نساعدك،
-
إجابة Wael Aljamal سؤال في إضافة مقال في أكاديمية حسوب كانت الإجابة المقبولة
تم شرح آلية المشاركة في الأكاديمية لكتابة المقالات من خلال صفحة: اكتب معنا، حيث يتم التوظيف على موقع مستقل.
-
إجابة Wael Aljamal سؤال في عند تشغيل تطبيق فلتر يتأخر في عملية البناء Building كانت الإجابة المقبولة
أحيانا اختيار توافقية مع نظام تشغيل قديم، كما في المشكلة السابقة، تحديد ios ليتوافق مع الإصدار 10 يتطلب عمليات أكثر عند بناء المشروع، لذلك حدد إصدار ادنى متوافق مع هاتفك + المحاكي.
ويمكنك تجريب تعديل السطر التالي في pubspec.yaml في الخاصية environment: نحدد sdk: '>=2.12.0 <3.0.0'
-
إجابة Wael Aljamal سؤال في للأسف سألغى اشتراكي في دورة حسوب كانت الإجابة المقبولة
يمكنك التواصل مع مركز مساعدة حسوب وإخبارهم بالتفاصيل.
مع العلم أنه معك وقت بالتعلم في الدورة حتى بعد إنتهائك من التعلم في الدورة وحصولك على الشهادة ب 6 أشهر لإلغاء الاشتراك إن لم يتم قبولك بعمل واستطعت تحقيق أرباح.
يمكنك قراءة الأسئلة الشائعة في قسم الشهادات المتخصصة.
عليك التحلي بالصبر، بالتوفيق
في مسار بناء واجهة مستخدم تشبه موقع YouTube
في مسار تطوير متجر الكتروني
git يتم شرحها لتعليم كيفية رفع مشروع على مستودع github وهي ليست مسار منفصل.
Bootstrap يتم تطبيقه في عدة مشاريع.
-
إجابة Wael Aljamal سؤال في كيف أعطي رتبة RANK أو ترتريب جزئي لنتيجة استعلام SQL كانت الإجابة المقبولة
يمكن إعطاء رتبة لكل سطر من الاستعلام باستخدام دالة ()RANK في SQL فهي تعيد ترقيم تصاعدي بدءاً من 1 ولأعلى لكل سطر حسب شرط الترتيب.
وتعتبر هذه الدالة من دوال النافذة window function وتعمل مع دالة OVER لتحديد المجالات الجزئية للترقيم وعلاقة الترتيب.
لعمل ترقيم شامل لكل الموظفين حسب ترتيب الراتب، لن نقوم بعمل تجزئة للبيانات، أي بدون PARTITION
سوف نمرر لدالة OVER علاقة الترتيب حسب الراتب فقط:
SELECT *, RANK() OVER (ORDER BY salary) salary_rank FROM employees; والنتيجة:
أما لعمل ترتيب جزئي حسب كل قسم، علينا تجزئة البيانات باستخدام PARTITION مع تمرير رقم القسم ثم علاقة الترتيب:
لاحظ التجزئة حسب رقم الفرع:
SELECT *, RANK() OVER ( PARTITION BY department_id ORDER BY salary ) salary_rank FROM employees والنتيجة:
-
إجابة Wael Aljamal سؤال في اتصال بapi service يتطلب vpn كانت الإجابة المقبولة
بافتراض أن خدمة API service التي تعتمد عليها في مشروعك ويتصل تطبيق لارافل عليها محظورة في بلدك (بلد المطور) ولا تستطيع طلب الخدمات بدون VPN أثناء التطوير بسبب IP جهازك حالياً، فهذا الأمر بسبب البلد، أي بعد رفع المشروع على استضافة لدولة غير محظورة من هذه الشركة سيتصل تطبيق لارافل من استضافتك على الخدمة بدون مشكلة.
تطبيق لارافل يتعمد على نظام التشغيل في إدارة الاتصال مع الشبكة، فهذا الموضوع غير متعلق بالمشروع نفسه.
الكلام السابق صحيح حسب وصفك للمشكلة، حيث أن المستخدم العادي لايطلب الخدمة بشكل مباشر من بلد محظور.
-
إجابة Wael Aljamal سؤال في ما هي توابع النافذة SQL Window Functions كانت الإجابة المقبولة
تقسم توابع النافذة window functions في SQL إلى 3 أقسام.
توابع التجميع Aggregate functions مثل: COUNT AVG SUM MAX MIN توابع التصنيف أو الترتيب Ranking functions مثل: RANK ROW_NUMBER DENSE_RANK. توابع التحليل Analytic functions مثل: FIRST_VALUE LAST_VALUE LEAD LAG بشكل عام، تعمل توابع التجميع على إعادة قيمة واحدة كنتاتج معالجة قيم عمود ما، وعند استخدامها مع الدالة OVER مع عمل تقسيم الناتج لأجزاء أي نوافذ، يصبح عمل توابع التجميع بشكل مختلف حيث تعيد قيمة لكل مجموعة أسطر حسب التقسيم:
إقراء عن دوال النوافذ في:
دوال النافذة Window Functions:
-
إجابة Wael Aljamal سؤال في ما فائدة الدالة OVER و PARTITION BY في SQL كانت الإجابة المقبولة
تستخدم الدالة OVER لانتقاء الأسطر من ناتج الاستعلام التي نريد تطبيق عليهم دالة معينة (دالة تجميع aggregation function)، وتفيد في عمل ترتيب أو حسابات عليهم، من خلال تقسيمهم إلى أجزاء partitions ولذلك تستخدم مع window functions.
الشكل العام لها:
<function> OVER ( [PARTITION BY clause] [ORDER BY clause] [ROWS or RANGE clause]) حيث نمرر لها غلاقة clause نحدد فيها الأسطر المستهدفة.
في حال لم يتم تمرير غلاقة يكون استعلام على كامل الجدول في حال تم تمرير عبارة التقسيم يتم تطبيق العملية على الأسطر / السجلات المختارة مثلا يمكن جلب إجمالي أرباح شركة ثم حساب المجموع الجزئي حسب الفرع بعمل تقسيم حسب الدولة
SELECT year, country, product, -- المنتج profit, -- ربح النتج SUM(profit) OVER() AS total_profit, -- ربح إجمالي يجمع الأرباح SUM(profit) OVER(PARTITION BY country) AS country_profit -- تقسيم الربح حسب الدوالة FROM sales ORDER BY country, year, product, profit; والنتيجة:
أصبح باستطاعتنا تحديد ربح منتج الحاسوب بالنسبة لأرباح فرع فنلندا الإجمالية مثلا.. 1500/1610 في سنة 2000
مثال آخر،
حساب قيم أعمدة جدول من خلال عمل حسابات جزئية على ناتج الاستعلام، في مدرسة نريد عمل تحليل حسب متوسط العمر و عدد الطلاب والنتائج يتم فرزهم حسب الجنس.
SELECT id, name, gender, -- عدد الطلاب حسب الجنس COUNT(gender) OVER (PARTITION BY gender) AS Total_students, -- متسوط العمر حسب الجنس AVG(age) OVER (PARTITION BY gender) AS Average_Age, -- مجموع الدخل حسب الجنس SUM(total_score) OVER (PARTITION BY gender) AS Total_Score FROM student والنتائج:
-
إجابة Wael Aljamal سؤال في حل مشكلة flutter ودعم التطبيقات ios 12 does not support 32-bit programs كانت الإجابة المقبولة
يوجد معماريتين لأنظمة التشغيل الخاصة بالحواسيب والهواتف وهي 32 بت و 64 بت.
إن كان ipad حاصتك حديث وله نظام تشغيل أحدث من 10.3 فعليك تعديل إعدادات مشروعك لدعم تشغيله على 64 بت. هنا يجب تحديد targets an iOS حديث. نحتاج دعم 64-bit architecture تعديل Architectures build setting إلى Standard Architectures support the 64-bit runtime environment وإلا فالمشكلة بسبب توقف دعم أنظمة ios لتطبيقات 32 بت، تأكد أن ipad خاصتك من ضمن قائمة 64 بت: iOS devices are 64-bit: iPhone 5s/SE/6/6s/7 iPad Air and iPad Air 2 iPad mini 2, iPad mini 3 and iPad mini 4 Sixth-generation iPod touch 12.9-inch iPad Pro and 9.7-inch iPad Pro 9.7-inch iPad (2017) كان نظام iOS 10.3 آخر من يدعم تطبيقات 32 بت.
حاول عمل التوافقية لدعم الإصدارات الأقدم:
minimum iOS version as 10.0 or 10.2 or 10.3.
-
إجابة Wael Aljamal سؤال في كيفية إنشاء فهرس لأكثر من عمود في جدول SQL كانت الإجابة المقبولة
بشكل عام هي حسب الاستعلامات لديك والحقول في الجدول، لنفرض أنك تقوم باستعلام يبحث عن العمر و رقم الهاتف فنقوم بعمل فهرسة مزدوجة أي فهرس لحقلين معاً.
فإذا كان لديك استعلام بالشكل التالي:
SELECT * FROM USERS WHERE age > 17 AND phone = xxxxxxxxx سيكون الفهرس المناسب بهذا الشكل، مثال:
Create Index My_IndexName On TableName_USERS (phone Asc, age Asc) فنقوم بإنشاء فهرس لأكثر من عمود Multi-column Indexes كما أن ترتيب الأعمدة يهم في الفهرس فوضع رقم الهاتف أولاً أفضل من العمر لأنه قيمة غير مكررة فرضاً بينما ملايين الأشخاص لهم نفس العمر (ضمن مشروعك مثلاً كل عمر له مئة مشترك.. فالفهرسة للرقم أسرع لأنه على الأغلب فريد )
يمكن الاستفادة من السؤال:
-
إجابة Wael Aljamal سؤال في كيفية عمل خطوات النسخ الاحتياطي في Docker مع الاحتفاظ بالبيانات data volume كانت الإجابة المقبولة
لعمل نسخ احتياطي لحجم تخزين نستخدم العلم volumes-from-- مثال لإنشاء مساحة تخزين باسم my_application_backup:
docker run -v /dbdata --name my_application_backup ubuntu /bin/bash مثال لعمل نسخة احتياطية:
docker run --rm --volumes-from my_application_backup -v $(pwd):/backup ubuntu tar cvf /backup/my_application_backup.tar /dbdata لاسترجاع البيانانت restore
docker run --rm --volumes-from my_application_backup -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/my_application_backup.tar --strip 1" كما يوجد العديد من الإضافات التي يمكن استخدامها لإدارة حجوم البيانات data volume في حاويات وتقنيات Docker ويمكن الوصول لها من البحث عن Docker volume plugins التي يمكن تثبيتهم من خلال Docker
يمكن تثبيت الإضافة من خلال:
docker plugin install --grant-all-permissions xxx/yyy اسم الإضافة ثم اتباع التوثيق الخاص بهم لتعلم استخدامهم.
-
إجابة Wael Aljamal سؤال في كيفية عمل خطوات النسخ الاحتياطي لبيانات حاويات Docker Container Backup كانت الإجابة المقبولة
يمكن تثبيت التعديلات التي قمنا بها ضمن الحاوية إلى صورة جديدة باستعمال commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] مثال:
docker commit c3f2xxxd17e0a my_application/test_3_image:version3 ينتج لنا صورة جديدة مع التعديلات new image.
لتصدير حاوية لملف مضغوط نستخدم الأمر export الشكل العام docker export [OPTIONS] CONTAINER التصدير لملف docker export my_application > my_application_bk.tar أو docker export --output="my_application_bk.tar" my_application لاستيراد حاوية من ملف مضغوط نستخدم import الشكل العام docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]] من الويب docker import https://example.com/my_application_bk.tar من ملف cat my_application_bk.tar | docker import - my_application:new
-
إجابة Wael Aljamal سؤال في كيفية عمل خطوات النسخ الاحتياطي لحاويات Docker image Backup كانت الإجابة المقبولة
لعمل نسخ احتياطي لصورة docker image نستخدم الأمر save
docker save [OPTIONS] IMAGE [IMAGE...] مثال:
docker save my_application > my_application_bk.tar لتحميل صورة نستخدم load
docker load [OPTIONS] مثال:
docker load < my_application_bk1.tar
في حال الرغبة بعمل ضغط للملفات باستخدام خوارزيمة gzip ننفذ الأمر التالي
docker save my_application:latest | gzip > my_application_bk.tar.gz docker save my_application > my_application_bk.tar
-
إجابة Wael Aljamal سؤال في ما الفرق بين docker image و docker container كانت الإجابة المقبولة
docker image
هو عبارة عن مجموعة ملفات تحوي التعليمات المسؤولة عن تشغيل الحاوية وليس لديها أي حالة، تحوي التعليمات البرمجية والملفات المصدرية والمكتبات والتبعيات والأدوات والملفات الأخرى اللازمة لتشغيل التطبيق/الحاوية .. source code, libraries, dependencies, tools.. وهو ملف غير قابل للتعديل فقط للقراءة.
docker container
الحاوية هي بيئة تشغيل التطبيق virtualized run-time environment أي هي الكائن النشط الذي ينتج عن docker image بعد تشغيلها. يمكن ل docker image واحد أن نقوم بإنشاء أكثر من نسخة نشطة منه التي هي حاوية docker container وتمثل كل منها عملية ضمن نظام التشغيل process
صورة توضيحية:
يتم بناء docker image عن طريق الأمر build للملف Dockerfile # تحميل اوبنتو FROM ubuntu:18.04 # نسخ ملفات COPY . /app # إنشاء مجلد RUN make /app # تشغيل بايثون CMD python /app/app.py أمر بناء:
docker build -t my_image dir_with_dockerfile my_image اسم صورة التطبيق dir_with_dockerfile مسار الملف
يتم تشغيل docker container بالأمر run مثل docker run image_name docker run my_image docker run hello-world
لتوضيح المفهوم برمجياً، docker image تمثل Class بينما docker container تمثل Object.
docker image مثل ملفات نظام التشغيل قبل تشغيل تثبيته وتشغيله ليصبح بعد التشغيل مثل
docker container
-
إجابة Wael Aljamal سؤال في ما هو الفرق بين Dockerfile و docker-compose.yml؟ كانت الإجابة المقبولة
Dockerfile
هو ملف نصي عادي، يحوي الأوامر التي تمكن المستخدم من تجميع image والتي هي بنية الحاوية نفسها أي فعلياً اسم وإصدار نظام التشغيل مع الأدوات البرمجية والمكتبات وبيئات العمل المطلوبة لعمل التطبيق.
مثال لتنصيب nginx مع PHP لمشروع ما:
FROM nginx:latest MAINTAINER wael wael@hsoub RUN apt-get -y update && apt-get -y upgrade && apt-get install -y php
أما
docker-compose
هي أداة لتعريف و تشغيل تطبيق متعدد الحاويات، يتم من خلاله تعريف الخدمات التي ستعمل في بيئة منعزلة والسماح بتشغيل التطبيق من خلال أمر واحد docker-compose up
مثال لضبط إعداد mysql:
تحديد الخدمات للتطبيق تحديد منفذ كل خدمة تحديد معلومات البيئة تحديد أي صورة خدمة سنعمل بها version: '3' services: back_end: ports: - "8080:80" db: image: mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=root-password - MYSQL_USER=wael - MYSQL_PASSWORD=wael-password - MYSQL_DATABASE=my-database