-
المساهمات
1388 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
16
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Sam Ahw
-
مرحباً هبة، هل يمكنك إضافة صور من الكود التي تتعلق بهذه العمليات؟ أو رفع الكود الخاص بذلك لنتمكن من مساعدتك بشكل أفضل.
- 17 اجابة
-
- 1
-
مرحباً سوسن، بالنسبة للسؤال الأول: إن ذلك ممكن فالمطور بدوره لا يستطيع فرض التقنية التي سيستخدمها في بناء الموقع للعميل بل يقترح عليه الأفضل، وفي حال كان العميل لديه بعض الخبرة أو يفضّل موقع معين وما يستخدمه من تقنيات وبذلك يفضّل أن يكون موقعه كذلك. أما بالنسبة للسؤال الثاني: نعم، حالياً يوجد العديد من القوالب المستخدمة في ووكومرس التي تدعم اللغة العربية وجهة الكتابة من اليمين إلى اليسار ويمكن أيضاً تعريب بعض القوالب الأخرى أو العمل على تصاميم باللغة العربية.
-
يمكنك أيضاً وضع الاتصال بقاعدة البيانات بملف منفصل ثم استدعائه في الملفات الأخرى كالتالي: var db = require("./connectMysql");
-
مرحباً عبد الواحد، هذه القيم تدعى بأنماط البيانات أو Data Types ومن الأنواع الأساسية لها: البيانات الرقمية (العددية) - Numeric Data Types: وهي تمثل الأعداد (الأرقام)، وكما تعلم فإن الأرقام نوعان إما رقم صحيح وإما رقم عشري (كسور)، ويتم تسمية البيانات كالتالي الأرقام الصحيحة: Integer - Long - Short - int الأرقام العشرية: Double - float - Single - Decimal البيانات الحرفية (النصية) - Character Data Type وهي عبارة عن الحروف (عربية أو إنجليزية أو غير ذلك من الحروف)، الأرقام (في حالة إستخدامها للكتابة وليس لإجراء عمليات حسابية)، الرموز (مثال: #$%&). ويطلق على أي مما سبق كلمة (رمز)، ويتم التعامل مع هذه البيانات بطريقتين حروف: وتمثل رمز واحد سواء كان ذلك الرمز يعبر عن حرف أو رقم أو أي رمز آخر، ولكن رمز واحد فقط ويسمى في هذه الحالة Character - char نصوص: وتمثل سلسلة من الرموز، أي مجموعة من الحروف أو الأرقام أو حروف وأرقام معا وهي مكونات الكلمة أو الجملة، وتسمى String البيانات الأخرى (المتنوعة) - Other Data Types ويطلق عليها أحيانا Miscellaneous Data Types، وتمثل أي بيانات لا تعتبر حرفية أو رقمية، فمثلا من أهم أنواع البيانات في البرمجة هي البيانات المنطقية والتي تعبر عن صحيح True أو خطأ False ويسمى هذا النوع من البيانات Boolean Data Type، ويمكن أيضا دمج مجموعة من البيانات معا لتكوين نوع بيانات جديد ويسمى ذلك النوع بـ غرض أو Object، حيث قد تختلف رموزها من لغة لأخرى ولكنها ستعبر عن نفس القيم. وبالإضافة لما سبق، يوجد في لغات البرمجة عالية المستوى High Level Languages وهي التي ستتعامل معها غالباً أنواع بيانات للتاريخ Date، وللوقت Time.وغيرها..
- 4 اجابة
-
- 1
-
نعم لقد قمت بتعديل التعليق السابق ليشمل ذلك، بالتوفيق
-
إن التعامل مع طلبات HTTP ستتم عن طريق Express الذي قمت بتعريفه ضمن الكود، لذلك الآن عند استقبال طلب معيّن من طرف الزبون وليكن على route محدد، سيتم عندها تنفيذ الإجراء الخاص بذلك على قاعدة البيانات وإرسال النتيجة إلى الزبون، مثال لإضافة مستخدم إلى قاعدة البيانات: router.post('/new', function(req, res) { // أولاً نقوم بتحضير الإجراء كالتالي let sql = `INSERT INTO users(name, gender) VALUES (?)`; ثم نقوم بجلب القيم من الطلب let values = [ req.body.name, //هنا نضع اسم المستخدم الذي تم استقباله عن طريق http req.body.gender // هنا نضع جنس المستخدم الذي تم استقباله عن طريق Http ]; \\ الآن نقوم بتنفيذ الإجراء على قاعدة البيانات db.query(sql, [values], function(err, data, fields) { if (err) throw err; res.json({ status: 200, message: "New user added successfully" }) }) }); //و عند اكتماله سيتم إرسال الرسالة السابقة إلى المستخدم مع الرمز 200 والذي يشير إلى الاكتمال SUCCESS والآن لجلب المستخدمين من قاعدة البيانات، بشكل مشابه للسابق نقوم بالتالي: router.get('/list', function(req, res) { let sql = `SELECT * FROM users`; db.query(sql, function(err, data, fields) { if (err) throw err; res.json({ status: 200, data, message: "User lists retrieved successfully" }) }) }); حيث قمنا بتعريف routes خاصة بكل طلب والذي سيقوم السيرفر عند تلقي الطلب بإجراء الاستعلام الموافق لها. ملاحظة: *في حال ليس لديك خبرة سابقة بالتعامل مع Express، قمنا هنا باستخدام الغرض router لسهولة التعامل معها وبالتالي يمكننا تصديرها فيما بعد إلى ملف خارجي. مثلاً نضع الكود السابق ضمن مجلد routes ضمن ملف خاص ولنسميه users.js وبالتالي يصبح الكود فيه كالتالي: const express = require('express'), router = express.Router(); router.get('/list', function(req, res) { let sql = `SELECT * FROM users`; db.query(sql, function(err, data, fields) { if (err) throw err; res.json({ status: 200, data, message: "User lists retrieved successfully" }) }) }); router.post('/new', function(req, res) { let sql = `INSERT INTO users(name, gender) VALUES (?)`; let values = [ req.body.name, req.body.gender ]; db.query(sql, [values], function(err, data, fields) { if (err) throw err; res.json({ status: 200, message: "New user added successfully" }) }) }); module.exports = router; والآن نقوم بتضمينه في الملف الرئيسي للمشروع، وفي ملفاتك يدعى index.js كالتالي: const usersRouter = require('./routes/users'); ونخبر السيرفر بأن هذا الـ route موجود ويمكنه استخدامه عند تلقي الطلبات كالتالي: app.use('/users', usersRouter); وبذلك يمكننا إنشاء route خاص بكل كيان نريد التعامل معه في قاعدة البيانات. واستدعاء فقط الملف الخاص للسهولة. بالتوفيق
-
مرحباً حنان، بما أنك قد استمعلت قاعدة بيانات من نوع Mysql فلقد عرّفت الاتصال مع القاعدة بشكل صحيح، الآن لإنشاء قاعدة بيانات جديدة باسم mydb مثلاً، نقوم بالتالي: con.connect(function(err) { if (err) throw err; console.log("Connected!"); con.query("CREATE DATABASE mydb", function (err, result) { if (err) throw err; console.log("Database created"); }); }); وبذلك يتم طباعة Database created بعد إنشاء القاعدة بنجاح. الآن لإنشاء جدول customers مثلاً، نقوم بالتالي: con.connect(function(err) { if (err) throw err; console.log("Connected!"); var sql = "CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))"; con.query(sql, function (err, result) { if (err) throw err; console.log("Table created"); }); }); لإضافة عناصر للجدول السابق نقوم بالتالي: con.connect(function(err) { if (err) throw err; console.log("Connected!"); var sql = "INSERT INTO customers (name, address) VALUES ('Company Inc', 'Highway 37')"; con.query(sql, function (err, result) { if (err) throw err; console.log("1 record inserted"); }); }); أما للقيام بالاستعلامات، فهي كالتالي: con.connect(function(err) { if (err) throw err; con.query("SELECT * FROM customers", function (err, result, fields) { if (err) throw err; console.log(result); }); }); وهكذا تتم بقية العمليات. أقترح عليك قراءة المرجع الرسمي الخاص لاحتوائه على الكثير من المعلومات المفيدة والتي قد تختلف بناءً على متطلباتك، أو قراءة بعض المقالات للتعامل مع Mysql ضمن Node Js (مثال) بالتوفيق
-
مرحباً أحمد، بالنظر إلى نوعية البيانات المرفقة في الصورة نجدها مصفوفة أغراض يتم جلبها من API بحيث يكون لكل عنصر من هذه المصفوفة عدد من الصفات التي يمكنك الوصول إليها وطباعتها أو التعامل معها. ولكن يجب عليك توضيح ماهي لغة البرمجة التي تقوم باستعمالها لمعالجة هذه البيانات، وما هي المشكلة التي تواجهها بالتحديد لنتمكن من مساعدتك.
- 3 اجابة
-
- 1
-
مرحباً محمد، لقد تمت الإجابة عن سؤال مشابه لسؤالك هنا، كما يمكنك الإطلاع على العديد من المصادر الموجودة من الدروس والمقالات و الكتب و الدورات، وكما تمت إجابتك هنا على سؤالك هذا، تستطيع طرح أي سؤال أثناء تعلمك في حال واجهتك أي مشكلة برمجية. بالتوفيق،
-
مرحباً طاهر، في حال كنت تقصد: (الحساب 4 * 3 * 2 * 1) بدلاً من (الحساب 4 * 3 * 2 * 7)، أي لضرب العدد بجميع الأعداد السابقة له دون الصفر، فيمكن تنفيذ ذلك عن طريق وضع حلقة تكرارية كالتالي: n = int(input('Enter a number: ')) result = 1 for i in range(1, n): result *= i print(result)
- 2 اجابة
-
- 1
-
مرحباً جوزيف، يمكنك تنفيذ ذلك عن طريق إضافة observer كالتالي: NotificationCenter.default.addObserver(self, selector: #selector(preventScreenRecording), name: NSNotification.Name.UIScreenCapturedDidChange, object: nil) ثم نقوم بإنشاء view بداخل ال main view الرئيسية للتطبيق كالتالي: (void) preventScreenRecording { if (@available(iOS 11.0, *)) { BOOL isCaptured = [[UIScreen mainScreen] isCaptured]; if (isCaptured) { self.blockView.hidden = false; } else { self.blockView.hidden = true; } } ملاحظة: أيضاً يمكنك استخدام screen.isCaptured ببساطة لاختبار في حال كانت الشاشة قيد التسجيل أو لا، ومن ثم إضافة عملية المعالجة التي ترغب بها، مثال: func isRecording() ->Bool { for screen in UIScreen.screens { if (screen.isCaptured) { print("screen is recorded") return true } } return false } بالتوفيق
-
يتم استخدام props بداخل المكونات Components وذلك عند تمرير قيمة معينة للمكون الذي يتم تضمينه، مثال: عند تعريف مكون blog-post نمرر له القيمة عنوان المنشور كالتالي: <blog-post post-title="hello!"></blog-post> ثم ضمن المكون نفسه نقوم بتعريف القيمة التي سيستقبلها كالتالي: Vue.component('blog-post', { //هنا يتم تمرير القيمة props: ['postTitle'], template: '<h3>{{ postTitle }}</h3>' }) أما عند تعريف المتحولات ضمن data، فبذلك تبقى هذه المتحولات خاصة بالمكون نفسه، مثال: <div id="app"> <span v-text="message"></span> </div> var app = new Vue({ el: '#app', data: { message: 'هذه الرسالة سيتم طباعتها ضمن العنصر span' } })
-
نعم يمكنك الاطلاع على مكتبة javax.speech.recognition في جافا والتي تتعامل مع الأوامر الصوتية وتعالجها. مثال: يوضح الكود التالي كيفية إنشاء أداة التعرف ، وتحميل القواعد ، ثم الانتظار حتى يقول المستخدم شيئًا يطابق القواعد. عندما تحصل على تطابق: import javax.speech.*; import javax.speech.recognition.*; import java.io.FileReader; import java.util.Locale; public class HelloWorld extends ResultAdapter { static Recognizer rec; // Receives RESULT_ACCEPTED event: print it, clean up, exit public void resultAccepted(ResultEvent e) { Result r = (Result)(e.getSource()); ResultToken tokens[] = r.getBestTokens(); for (int i = 0; i < tokens.length; i++) System.out.print(tokens[i].getSpokenText() + " "); System.out.println(); // Deallocate the recognizer and exit rec.deallocate(); System.exit(0); } public static void main(String args[]) { try { // Create a recognizer that supports English. rec = Central.createRecognizer( new EngineModeDesc(Locale.ENGLISH)); // Start up the recognizer rec.allocate(); // Load the grammar from a file, and enable it FileReader reader = new FileReader(args[0]); RuleGrammar gram = rec.loadJSGF(reader); gram.setEnabled(true); // Add the listener to get results rec.addResultListener(new HelloWorld()); // Commit the grammar rec.commitChanges(); // Request focus and start listening rec.requestFocus(); rec.resume(); } catch (Exception e) { e.printStackTrace(); } } } أما في C++ فابحث عن طرق استخدام SAPI SDK والتي تهتم بالأمور المتعلقة بالصوت والكلام أيضاً. بالتوفيق
-
قد يكون ذلك نتيجة لعدة أسباب، بعض الحلول: 1- تأكد من أنك ضمن نفس الملجد تشغيل المشروع 2- في حال كنت تستخدم محرر لا يدعم التضمين التلقائي، حاول تنفيذ الأمر التالي: flutter pub get أو: flutter packages get 3- تأكد من وجود الملفات ضمن: .packages، وفي حال لم تكن موجودة يجب عليك تحميلها مجدداً 4- أعد تشغيل المحرر الذي تستخدمه (VS Code أو Android Studio)
- 4 اجابة
-
- 1
-
بدايةً يمكن تشغيل تطبيقات Node Js على السيرفر دون الحاجة لاستخدام Nginx بما أنك تستخدم Express فهو بحد ذاته مخدم ويب، ولكن لسهولة ربط النطاق وتوجيهه إلى ملفات المشروع وأيضاً إضافة Proxy لتحويل المنفذ 80 إلى أي منفذ port آخر تقوم باستعماله من الممكن استخدام Nginx. الخطوات هي كالتالي (وبافتراض أن نظام التشغيل لينكس): أولاً ، تحتاج إلى تثبيت NodeSource PPA من أجل الوصول إلى محتوياته ولتتمكن من تنفيذ الأوامر. تأكد من أنك في المسار الرئيسي: cd ~ واستخدم curl للتثبيت كالتالي: curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh انتظر قليلاً حتى يكتمل التحميل، ثم قم بتثبيت التحديثات إلى ملفات الخصائص configuration عن طريق الأمر التالي: sudo bash nodesource_setup.sh ثم قم بتحميل البكج: sudo apt-get install nodejs الآن وبعد اكتمال التحميل، أصبح يمكنك استخدام NPM ضمن السيرفر. مثال لإنشاء تطبيق بسيط من ملف واحد وربطه: cd ~ nano hello.js وكتابة التالي ضمن الملف: #!/usr/bin/env nodejs var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(8080, 'localhost'); console.log('Server running at http://localhost:8080/'); ملاحظة: يمكنك تغيير 8080 في حال كنت تستخدم منفذ آخر. الآن يمكنك تجربة الخطوات السابقة أنها تخلو من أي مشكلة ببساطة عن طريق جعل الملف السابق ملف تنفيذي كالتالي: تأكد من أنك ضمن نفس المجلد الذي يحوي الملف وقم بتفيذ الأمر التالي: chmod +x ./hello.js فسيطبع لك الناتج التالي: Output Server running at http://localhost:8080/ أي أن السيرفر يعمل ويستمع للطلبات على المنفذ 8080 أو أي منفذ آخر قمت باختياره. ملاحظة: في حال أردت إبقاء سيرفر Node يعمل في الخلفية بشكل دائم، سوف تحتاج أن تستخدم PM2 لإدارة العمليات ويجب عليك تحميله عن طريق الأمر التالي: sudo npm install -g pm2 ثم توجه مجدداً إلى المجلد الذي يحوي ملف تشغيل التطبيق واكتب التالي: pm2 start hello.js وأخيراً أصبح تطبيقك يعمل ضمن العمليات التي يديرها PM2 وسيطبع لك الناتج التالي: Output [PM2] Spawning PM2 daemon [PM2] PM2 Successfully daemonized [PM2] Starting hello.js in fork_mode (1 instance) [PM2] Done. ┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐ │ App name │ id │ mode │ pid │ status │ restart │ uptime │ memory │ watching │ ├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤ │ hello │ 0 │ fork │ 3524 │ online │ 0 │ 0s │ 21.566 MB │ disabled │ └──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘ Use `pm2 show <id|name>` to get more details about an app يمكنك قراءة العمليات التي يدعمها PM2 كإعادة التشغيل وحذف العملية وغيرها من العمليات عبر الموقع الرسمي له. وأما ضمن Nginx، فقط قم بتعديل محتوى location التالي لتحويل المنفذ كما شرحت مسبقاً: location / { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } بالتوفيق والمسار (الافتراضي) للدخول وتعديل الخصائص ضمن Nginx هو: /etc/nginx/sites-available/default
- 1 جواب
-
- 1
-
النمط المعاد من استخدام مكتبة OS هو object وبالتالي يمكنك استخدامه مباشرة أو تحويله إلى النمط String أيضاً في حال كان سؤالك عن ارسال النتيجة وعرضها للمتصفح، بالكود لا يحوي ذلك. للإضافة: const http = require("http"); const os = require("os"); var result = os.cpus(); http.createServer(function (request, response) { response.writeHead(200, {'Content-Type': 'text/plain'}); // هنا يتم ارسال الخرج كغرض ويمكنك تحويله إلى نمط نصي كما ذكرنا سابقاً response.end(result); }).listen(3000);
-
يرمز JSON إلى JavaScript Object Notation. هو تنسيق خفيف الوزن لتخزين البيانات ونقلها. غالبًا ما يتم استخدام JSON عند إرسال البيانات من خادم إلى صفحة ويب. أما لاستخدامه مع Node JS بفرض لديك البيانات التالية: let obj = { "name": "Sara", "age": 23, "gender": "Female", "department": "History", "car": "Honda" } ,وبالتالي: var json_obj = JSON.parse('{ "name":"Sara", "age":23, "gender":"Female", car: "Honda}'); وفي حال كنت تستعملين Express، يمكنك إرسال غرض عن الطريق التالي: res.json({data: obj}) حيث يشير obj إلى المتحول الذي قمنا بإنشاءه في الخطوة السابقة. وفي حال كانت البيانات ضمن ملف Json خارجي يمكنك استدعاؤها عبر تضمينها ضمن الملف كالتالي: let jsonData = require('./student.json'); //ثم يمكنك إرسالها أو استخدامها ضمن الكود
-
لإنشاء اتصال بقاعدة البيانات باستخدام Sequelize: const { Sequelize } = require('sequelize'); const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' }); database : اسم قاعدة البيانات التي ترغب بالاتصال بها username: اسم المستخدم password: كلمة المرور فقط كم بتغيير localhost إلى اسم نطاق أو IP Address في حال كانت القاعدة موجودة على سيرفر خارجي. أما لإنشاء صف أو ما يدعى Model لجدول ما ضمن قاعدة البيانات: const { Sequelize, DataTypes } = require('sequelize'); const User = sequelize.define('User', { firstName: { type: DataTypes.STRING, allowNull: false }, lastName: { type: DataTypes.STRING } });
- 3 اجابة
-
- 1
-
في معظم الأوقات يتم استخدام Python لتطوير blockchain. ومع ذلك، مع انتشار لغة جافا سكريبت أصبح من الممكن تنفيذ ذلك عن طريق Node Js، ولكن يجب عليك أولاً أن تعود لبعض المراجع لفهم آلية عمل Blockchain، وبالتالي يمكنك تطبيقها بأي تقنية أو لغة برمجة. الفكرة الأساسية هي أنه يتم تسجيل أي بيانات معاملات صالحة في شبكة blockchain ، والتي تحكمها قواعد نظير إلى نظير أو Peer to Peer التي يحددها المشاركون. على سبيل المثال ، يمكن أن تحتوي هذه البيانات على "قيمة" الكتلة كما هو الحال في العملات الرقمية ، أو سجل المعاملات (مثل عندما تتبادل الأطراف السلع والخدمات) ، أو امتيازات الاستحقاق مثل عندما تسجل السلسلة معلومات الملكية. إلى جانب بيانات المعاملة ، قد تحتوي كل كتلة على تجزئة التشفير الخاصة بها (معرف فريد أو بصمة رقمية) ، وقيمة nonce الخاصة بها (رقم عشوائي يستخدم مرة واحدة في حسابات التشفير) ، وتجزئة الكتلة السابقة ، وطابع زمني للأحدث المعاملات المصدق عليها. إن أي مشارك في شبكة blockchain يجب أن يجد صعوبة في تحديد هذا الرقم ولكن يمكن التحقق منه بسهولة. وبالتالي ، فإنه لا يشجع البريد العشوائي والعبث بهيكل blockchain. في حالة معظم العملات المشفرة ، تتطلب إضافة كتلة جديدة إلى blockchain حل معادلة رياضية معقدة ، والتي تزداد صعوبة بمرور الوقت مع نمو blockchain. وبالتالي ، فإن أي شخص يثبت أنه قام بعمل من خلال حل هذه المشكلة يتم تعويضه بعملة رقمية ، في عملية يشار إليها باسم "التعدين". المبدأ هو كالتالي: لإنشاء Block يمكنك استخدام مكتبة في جافاسكريبت تدعى: crypto-js const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } } حيث يدل precedingHash على تجزئة الكتلة السابقة لكل كتلة حالية وهكذا، و data: مثل تفاصيل المرسل وتفاصيل المستلم والكمية المتبادلة. أما دالة computeHash: فتقوم بحساب hash للبلوك اعتماداً على المعلومات المزودة ضمنه. وبعد ذلك يمكنك إنشاء صف آخر لل blockchain كالتالي: class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } } وإضافة البيانات كالتالي: let smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); ملاحظة: الموضوع أعقد من ذلك بكثير ويجب عليك البحث بشكل واسع في التشفير والتقنيات الأخرى المستخدمة
- 2 اجابة
-
- 1
-
لقد غيّر Gulp 4.0 الطريقة التي ينبغي بها تحديد المهام إذا كانت المهمة تعتمد على مهمة أخرى ليتم تنفيذها. تم إهمال القائمة أثناء التعريف واستبدالها. سابقاً أثناء التعريف على سبيل المثال: // Starts a BrowerSync instance gulp.task('server', ['build'], function(){ browser.init({server: './_site', port: port}); }); بدلاً من list قاموا بإدخال gulp.series () و gulp.parallel (). وبالتالي يجب تغييرها إلى: // Starts a BrowerSync instance gulp.task('server', gulp.series('build', function(){ browser.init({server: './_site', port: port}); }));
-
يمكنك تحميل نسخة جديدة من PHP على السيرفر عن طريق التالي: أولاً: قم بتحميل مستودع جديد Repository على نظام التشغيل Ubuntu بالأمر التالي: sudo apt-add-repository ppa:ondrej/php ثانياً: قم بتحديث الفهرسة: sudo apt update ثالثاً: قم بتحميل نسخة PHP التي تريدها ولتكن 7.4: sudo apt install -y php7.4 php7.4-cli php7.4-common php7.4-fpm رابعاً: في حال أردت تحميل بعض الإضافات المهمة لعمل ووردبريس أو لارافيل قم بتحميل التالي: sudo apt install -y php7.4-mysql php7.4-dom php7.4-simplexml php7.4-ssh2 php7.4-xml php7.4-xmlreader php7.4-curl php7.4-exif php7.4-ftp php7.4-gd php7.4-iconv php7.4-imagick php7.4-json php7.4-mbstring php7.4-posix php7.4-sockets php7.4-tokenizer خامساً: قم بتعديل إعدادات Nginx لربط النسخة الجديدة من PHP كالتالي: location ~ .php$ { .... fastcgi_pass unix:/run/php/php7.0-fpm.sock; حذف هذا السطر fastcgi_pass unix:/run/php/php7.4-fpm.sock; وإضافة السطر التالي } وأخيراً: قم بإعادة تشغيل النظام: sudo systemctl reload nginx
- 1 جواب
-
- 1
-
في الواقع لا يوجد عدد محدد، وإنما يجب عليك الانتباه للمساحة التخزينية على السيرفر وقدرات المعالج والذاكرة RAM بالنسبة للمواقع التي ستستضيفها
- 3 اجابة
-
- 1
-
أولاً يجب عليك وضع ملفات موقع الويب الخاص بك ضمن السيرفر في مكان ما داخل /var/www ولنفترض داخل /var/www/subdomain.test.com sudo nano /etc/nginx/sites-available/subdomain.test.com ثم يجب عليك ضبط إعدادات DNS للنطاق الأساسي الذي ترغب بإضافة نطاق فرعي له عن طريق إضافة سجل من نمط A وربطه مع النطاق الفرعي الجديد والآن يجب عليك ضبط إعدادات Nginx الخاص بك لاستقبال طلبات HTTP وتحويلها للمجلد الذي يحوي ملفات موقعك server { listen 80; root /var/www/subdomain.test.com; index index.html index.htm index.nginx-debian.html; server_name sub.test.com www.subdomain.test.com; location / { try_files $uri $uri/ =404; } } حيث يجب عليك تعديل root لتشير إلى ملفات الموقع وكذلك server_name باسم النطاق الجديد وأخيراً قم بإعادة تشغيل سيرفر الويب: service nginx restart
- 3 اجابة
-
- 1
-
يمكنك متابعة الدروس والمقالات ضمن المنصة هنا على الرابط التالي: https://academy.hsoub.com/programming/ruby/ وبالإضافة لذلك يمكنك زيارة الموقع الرسمي للغة روبي للاطلاع على المرجع الرئيسي للغة (باللغة الانكليزية) للمزيد من التفاصيل.
- 3 اجابة
-
- 1
-
في روبي يمكنك كتابة وتنفيذ الكود ضمن قوالب مثل ERB. يشبه قالب ERB مستند نصي عادي يتخلله علامات تحتوي على تعليمات برمجية Ruby. عند التقييم ، يمكن لهذه التعليمات البرمجية ذات العلامات تعديل النص في القالب. يقوم Puppet بتمرير البيانات إلى القوالب عبر كائنات ومتغيرات خاصة ، والتي يمكنك استخدامها في كود Ruby للتحكم في إخراج القوالب. تستخدم على سبيل المثال الوسوم التالية، بدون طباعة: <% %> أما الوسم التالي يقوم بالتنفيذ مع طباعة أو إخراج ناتج التنفيذ: <%= %> مثال لطباعة خصائص كتاب ضمن جدول: <h1>Listing Books</h1> <table> <thead> <tr> <th>Title</th> <th>Content</th> <th colspan="3"></th> </tr> </thead> <tbody> <% @books.each do |book| %> <tr> <td><%= book.title %></td> <td><%= book.content %></td> <td><%= link_to "Show", book %></td> <td><%= link_to "Edit", edit_book_path(book) %></td> <td><%= link_to "Destroy", book, method: :delete, data: { confirm: "Are you sure?" } %></td> </tr> <% end %> </tbody> </table> <br> <%= link_to "New book", new_book_path %> حيث @books.each تقوم بدور الحلقة على مجموعة الكتب الممررة، ثم يتم إظهار كل خاصية على حدى ضمن خانات الجدول بالتعليمات: book.title , book.content، كما ويمكنك وضع روابط أو تنفيذ دوال عند الضغط أو كتابة أي كود ضمن هذه الوسوم كأي لغة أخرى مشابهة يتم تضمينها في قوالب.
- 3 اجابة
-
- 1