-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Wael Aljamal
-
يوجد عدة طرق لتحقيق المطلوب وهذا يعتمد على نوع مخدم قاعدة البيانات وما يدعمه. في SQL Server يوجد الكلمتين المفتاحيتين: OFFSET وتعني تطبيق إزاحة skip وتجاهل عدد من السجلات (نبدأ جلب السجلات التي رقمها من بعد قيمتها) FETCH NEXT تفيد في تحديد عدد الأسطر التالية المطلوبة SELECT col1, col2, -- تحديد الأعمدة FROM ... -- تحديد الجدول WHERE ... -- كتابة شرط الفلترة ORDER BY -- يفضل وبشكل ضروري ترتيب البيانات حسب حقل معين ليتم جلبهم بطريقة صحيحة -- الجزء التالي يحدد الإزاحة وعدد السجلات الذي سيعيده الاستعلام OFFSET 10 ROWS -- تخطي عشر سجلات 10 rows FETCH NEXT 10 ROWS ONLY; -- جلب العشر سجلات التالية 10 rows يمكن تعريف متغيرات وتمرير قيمة لها ثم استخدامها في الاستعلام DECLARE @Skip TINYINT = 10 , @Fetch TINYINT = 10; كما يمكن تطبيقها بواسطة ROW_NUMBER التي تعيد رقم السطر ضمن النتيجة وبهذا نقوم بفلترة النتائج select * -- جلب أعمدة from ( select *, ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM -- جلب ترقيم النتائج بترتيب حسب المعرف from table_name ) table_x WHERE -- تحديد شرط الفلترة RowNum >= 10 AND RowNum <= 20 ORDER BY RowNum -- إعادة ترتريب حسب رقم السطر وفي MySQL يمكن استخدام LIMIT + OFFSET LIMIT + OFFSET => SELECT column FROM table LIMIT 10 OFFSET 10 LIMIT 2 params => SELECT * FROM table LIMIT 10, 50 -- النتيجة هي الأسطر 11-60 skip 10, take 50 تجاهل أول 10 أسطر وجلب 50 سطر التالي لجلب كل القيم بعد النتيجة 10، نضع الوسيط الثاني قيمة كبيرة جدا SELECT * FROM tbl LIMIT 10,18446744073709551615; وباستخدام المتغيرات SET @skip=1; SET @numrows=5; PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?, ?'; EXECUTE STMT USING @skip, @numrows;
- 2 اجابة
-
- 1
-
لتنصيب المكتبة على نظام لينوكس / اوبنتو علينا استخدام sudo مع تنفيذ الأوامر: sudo apt update sudo apt install ffmpeg للتأكد من الإصدار ffmpeg -version استعمالاتها، تغيير نمط الفيديو vedio / صيغة الفيديو وملفات الصوت audio: مثلا من mp4 إلى webm من mp3 إلى ogg ffmpeg -i vedio.mp4 vedio.webm ffmpeg -i audio.mp3 audio.ogg تدعم استخدام ترميز خارجي مثل libopus , libvorbis التحكم بمعدل البيانات bitrate: 64 kbit/s: ffmpeg -i vedio.avi -b:v 64k -bufsize 64k vedio.avi التحكم بمعدل عد الإطارات: frame rate / FPS to 24 fps: ffmpeg -i vedio.avi -r 24 vedio.avi كما يمكن تعديل بيانات توصيف الفيديو metadata بتغيير العنوان أو اللغة ffmpeg -i in.avi -metadata title="my title" out.flv ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT **** وضمن المشروع بافتراض استعمال php require 'vendor/autoload.php'; $ffmpeg = FFMpeg\FFMpeg::create(); إنشاء غرض $video = $ffmpeg->open('video.mpg'); تحديد ملف الفيديو # اقتطاع أول 10 ثواني $video ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10)) ->save('frame.jpg'); # تصدير الفيديو لعدة صيغ مختلفة $video ->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4') ->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv') ->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm'); قطع قسم من الفيديو باستخدام CLIP $clip = $video->clip(FFMpeg\Coordinate\TimeCode::fromSeconds(30), # بداية 15 FFMpeg\Coordinate\TimeCode::fromSeconds(15)); # المدة 30 $clip->save(new FFMpeg\Format\Video\X264(), 'video.avi');
- 2 اجابة
-
- 1
-
يمكنك التوجه لموقع خمسات بالإضافة لموقع مستقل وتوظيف مبرمج أو مهندس برمجيات لشرح المقرر، اذكري في العرض كامل التفاصيل والطريقة التي تفضلينها في أخذ الدرس، إن كان لديك أسئلة محددة يمكن طرح أسئلة في قسم أسئلة / البرمجة
-
إن كنت تريد استخلاص حقول محددة من المصفوفة يمكن المرور على المصفوفة باستعمال الدالة map ثم قراءة البيانات التي تريدها وهذه ستعيد الحقول مع تحكم أكثر لعمليات الدمج والفلترة وغيرهم echo json_encode( array_map(function($x) { return $x['first_name'] . " " . $x['last_name'] ; }, $original_array)); ,وإن كنت تستعمل لارافل يمكن استخدام الصنف collections للتحويل بين المصفوفات Arrays وكائنات JSON التضمين: use Illuminate\Support\Collection; الدالة البانية: collect مثال $collection = collect([1, 2, 3]); $collection->all(); // [1, 2, 3] مثال: $collection = collect(['name' => 'Desk', 'price' => 200]); $collection->toJson(); // '{"name":"Desk", "price":200}' //--------------------- $collection = collect(['name' => 'Desk', 'price' => 200]); $collection->toArray(); /* [ ['name' => 'Desk', 'price' => 200], ] */ توثيق: laravel / collections
-
الحل الأمثل، هو وضع الشيفرة التي تقوم بحساب الوقت ضمن الدالة function ومن ثم استدعاء هذه الدالة ضمن run في المؤقت الزمني. يمكنك تعريف المصفوفة أولا خارج الدالة، ثم تكتب تعريف الدالة، ثم شيفرة المؤقت String[] salahNames = { "الفجر", "الصبح", "الظهر", "العصر", "المغرب", "العشاء" }; function calculate_logic() { // منكطق الشيفرة } Timer timer = new Timer(); timer.schedule( new TimerTask() { public void run() { // إعادة الحساب وتحديث الواجهة calculate_logic() } }, 0, 60*1000); // كل دقيقة
-
تبديل تررتيب الجداول يؤثر على نتيجة استعلام LEFT - RIGHT _ FULL حيث أن فيهم الربط يعتمد على عرض جميع بيانات أحد الجدولين (حسب جهة العرض) ثم البحث عن عنصر مقابل في الجدول الآخر، لذلك البيانات تختلف. أما في الربط الداخلي INNER JOIN نحصل على نفس النتيجة لكن ترتريب الأعمدة يختلف باختلاف ترتيب الدمج Table col1 col2 A a1 a2 B b1 b2 select * from A, B => a1, a2, b1, b2 select * from B, A => b1, b2, a1, a2 ولتثبيت ترتريب الأعمدة علينا تحديدهم في عبارة SELECT select a1, b1, b2, a2 from B, A => a1, b1, b2, a2 بالنسبة للدمج اليساري: سوف نثبت جدول الزبائن، ولكل زبون نبحث عن الطلبية التي تعود له LEFT JOIN Example SELECT cust_id, cust_name, order_num, order_date FROM customer LEFT JOIN orders ON customer.cust_id = orders.order_id WHERE order_date < '2020-04-30'; بالنسبة للدمج اليميني: سوف نثبت جدول الطلبيات، ولكل طلبية نبحث عن الزبون صاحبها الذي يعود إليها RIGHT JOIN Example SELECT cust_id, cust_name, occupation, order_num, order_date FROM customer RIGHT JOIN orders ON cust_id = order_id ORDER BY order_date; عندما لانجد بيانات من الجدول الثانوي سيعيد NULL وفي حال عمل FULL JOIN سنلحظ ربما وجود قيم فارغة في كلا الحقلين لأنه ليس شرطا تقابل القيم من كلا الجدولين
- 3 اجابة
-
- 1
-
أرجو التواصل مع مركز المساعدة واسأل عن كوبون خصم.. مركز مساعدة حسوب
-
نعم بالطبع يمكن دمج أي عدد من الجداول باستخدام الكلمة المفتاحية JOIN مع الأخذ بالملاحظات ليكون الأداء سريع: نحاول عمل الدمج مع المفاتيح الثانوية للجداول الأخرى نحاول عمل الدمج بالاعتماد على الحقول التي تم عمل فهرسة لها ربط الجداول بتسلسل منطقي بين بعضها لدينا المثال التالي حيث نريد جلب بيانات الزبائن الذين استخدموا خدمة الدفع الالكتروني في الموقع: جدول sales يحوي جميع المبيعات (رقم الفاتورة وقيمتها)، جدول online_customer يحوي معلومات الزبائن المسجلين بالطريقة الاكترونية، وجدول الطلبيات (رقم الزبون ورقم الطلبية) نربط جدول بينات الزبائن الإلكترونية مع جدول الطلبيات (حسب معرف الزبون) نربط جدول الطلبيات مع جدول المبيعات (حسب معرف الطلبية) نستخدم اسم مستعار لكل جدول SELECT oc.customer_Name, oc.city, oc.email, s.total FROM online_customer AS oc INNER JOIN orders AS o ON oc.customerid = o.customerid INNER JOIN sales AS s ON o.orderId = s.orderId إن عملية الدمج تتم على مراحل، كل عملية JOIN نتج عنها جدول فرعي مؤقت، لذلك إن استطعت دمج الجداول الصغيرة في أول العلاقة هذا يقلل من عدد العمليات المطلوبة للخطوات التالية
- 1 جواب
-
- 3
-
إن قواعد البيانات العلائقية والتي تعتمد على SQL مبنية بطريقة مٌحسّنة لعمل دمج بين الجداول وبطريقة سريعة وأقل استهلاك للموارد، مثلا قواعد البيانات لديها مفهوم الفهرسة وتعمل بحث وربط القيم بسرعة كبيرة وأفضل من البحث الخطي في لغة البرمجة بعد جلب الاستعلام كما أن الربط بالمفتاح الأجنبي بين الجداول يسرع الدمج كما يوجد query optimizer يأخذ الاستعلام الذي يكتبه المبرمج ويعدل عليه ليصبح أسرع. بالإضافة لذلك، الحصول على النتيجة النهائية من قاعدة البيانات تقلل من حجم البيانات المرسل عبر الاتصال و الشبكة في حال أن المخدم الخاص بالمشروع (مخدم الويب web server) بعيد عن مدير قاعدة البيانات RDBM أي يحتاج لاتصال انترنت. ولا يوجد داعي لتحميل كامل البيانات في ذاكرة المخدم أو العميل ثم عمل فلترة للنتائج، لأن هذا يضعف الأداء. نقاط مهمة للأداء: حجم ذاكرة مدير قاعدة البيانات (إن كانت صغيرة أو استضافة مشتركة يمكن عمل الربط في المخدم) سرعة الشبكة بين قاعدة البيانات والسيرفر (إن كان حجم الجداول الفعلي صغير يمكن نقلهم عبر الشبكة للمخدم ثم الربط) إن كان أداء مخدم قاعدة البيانات سيئاً وأدى لأن تصبح قاعدة البيانات لديك bottleneck لابأس من نقل المعالجة للمخدم
- 2 اجابة
-
- 2
-
لن تكون المسارات لدي مثل عندك، ربما يكون لديك ضمن sdk أو مجلد المشروع نفسه الافتراضي: C:\Users\<you>\. gradle\gradle. طبعا مع اسم المستخدم لديك وليس كلمة you قد يكون مخفي (أي مجلد يبدأ اسمه بنقطة) من متصفح الملفات اضغط على العرض ثم أظهر الملفات المخفية
-
نعم صحيح، الصور مرفقة بالترتيب أعد تحديث الصفحة اضغط على شعار الدرع لديك - الحماية من أنشطة الفيروسات و التهديدات -
-
إن عملت المعالجة بدون مشكلة فهذا جيد، مضاد الفيروسات يتفحص التعديلات على مجلد المشروع، يمكنك الدخول ل windows defender / security له وعمل تحديد لبرنامج محرر الأوامر و مجلد المشروع لكي لا يتفحصهم Exclude إن كان لديك متسع من الذاكرة RAM قم بزيادة حجم gradle deamon max heap size إلى 4 غيغابايت مثلا يوجد خيار آخر لتعديل حجم الذاكرة ل gradle على مستوى المشروع: (حاليا نفذ هذه الخطوة) ضمن ملف gradle.properties أضف السطر: org.gradle.jvmargs=-Xmx4096m على مستوى جميع المشاريع: توجه لمسار تثبيت gradle ربما لديك مع android sdk: C:\Users\user\.gradle وأضف نفس السطر السابق للملف واحفظ التغييرات، ************************************************* إعداد مضاد الفيروسات لكي لايتفحص ملفات المشاريع ويعمل على هدر الذاكرة و المعالجة: كيف نمنع windows defender من تفحص مشروع برمجي:
-
إن FTP هو اختصار ل File Transfer Protocol الذي هو بروتوكول نقل الملفات ويعمل عبر الشبكة بين حاسوبين محلي أو بعيد، أما SFTP فهو الإصدار الأحدث من FTP الذي يعتمد على بروتوكول التشفير SSH أي يصبح SFTP (اختصار لـSecure File Transfer Protocol أو SSH File Transfer Protocol) أي بروتوكول نقل الملفات الآمن. يمكن استخدام FTP فقط في الشبكات الآمنة لأنه لا يدعم التشفير، أما SFTP يمكن استخدامه في جميع الحالات (مستحسن). يعمل على المنفذ port 22 حتى تستخدم بروتوكول SFTP يجب أن تكون قمت بتهيئة SSH لديك للاتصال عن طريق SFTP نكتب اسم المستخدم مع عنوان الحاسوب البعد: sftp username@remote_hostname_or_IP sftp wael@hsoub.com أو sftp wael@14.5.1.98 إن كان الحاسوب البعيد قد غير المنفذ 22 الافتراضي مكن الاتصال بمنفذ مختلف بتمريره كالتالي: sftp -oPort=custom_port wael@hsoub.com sftp -oPort=1234 wael@hsoub.com الآن ومثل SSH يصبح لدينا وصول لمحرر الأوامر البعيد، لمعرفة المسار الحالي واستعراض الملفات ضمنه نكتب الأمر: pwd => Remote working directory: /home/wael ======== ls => Summary.txt info.html temp.txt testDirectory كما يمكن أيضاً استخدام الأمر cd للتنقل بين المسارات، والأمرين chgrp و chown لتعديل الصلاحيات.. لاستخدام نفس الأوامر لكن على الحاسوب المحلي نكتب حرف ل قبلها مثل lcd lls lpwd أي يمكن تنفيذ أي أمر من نظام لينوكس.. لأن SFTP يشغل بالأصل SSH مع FTP تحميل ملف من الحاسوب البعيد للحاسوب المحلي: نستخدم الأمر get لرفع ملف من الحاسوب المحلي للحاسوب البعيد: نستخدم put مثال get get remoteFile ^^^^^^^^^^ تحميل الملف بالاسم المكتوب من الحاسوب البعيد get remoteFile localFile ^^^^^^^^^ اسم الملف المحفوظ محليا get /home/wael/remoteFile افتراضيا يحفظ الملف بنفس الاسم مثال put put local-File ^^^^^^^^^^ رفع الملف بالاسم المكتوب من الحاسوب المحلي get remoteFile localFile ^^^^^^^^^ اسم الملف المحفوظ على الحاسوب البعيد put /home/local-wael/remoteFile افتراضيا يحفظ الملف بنفس الاسم يمكن تمرير r- في كل من get - put للعمل تحميل أو رفع مجلدات مع محتوياتها recursive محررات أكواد تدعم SFTP للتعديل المباشر: filezilla Aptana Sublime SFTP نستخدم SFTP بدل البرتوكول SCP, ويعمل SFTP بالإصدار 6 حاليا مقالة
- 1 جواب
-
- 1
-
إن SSH هو Secure Shell (SSH) أي صدفة آمنة، وهو بروتوكول شبكي مشفّر يعمل على خلق نفق اتصال يتم فيه نقل البيانات وتنفيذ الأوامر عبر الشبكة وخاصة على استضافات لينوكس مهما كان أمان الشبكة التي يتم الاتصال عبرها. يستخدم SSH التوثيق Authentication بطريق منها: Public-Key Authentication: استعمال مفتاح خاص Key عوض اسم المستخدم وكلمة السر. Host-Key Authentication: هي الطريقة الأكثر انتشارا عند الاتصال بسيرفر، كتابة اسم المستخدم وكلمته السرية. يعمل SSH بواسطة TCP و وفق هرمية زبون-عميل client–server architecture للاتصال بالحاسوب البعيد، نحتاج اسم المستخدم و IP للحاسوب: ssh -p 22 username@remote_host ssh -p 22 waelaljamal@12.23.45.58 في هذا الجزء يطلب اسم المستخدم الذي تريدين الاتصال من خلاله و الاستضافة user@host نستبدل user باسم المستخدم و host إما بعنوان IP أو domain مثل example.com. ولاتظهر كلمة السر عند كتابتها (مخفية) حتى لانعلم عدد الأحرف التي نكتبهم. بعد تحقيق الاتصال (قد يطلب كلمة سر الاستضافة) يمكن نقل الملفات وتنفيذ أي أمر من خلال مدير الأوامر المحلي cmd أو حتى terminal عن بعد. قبل الاتصال علينا إنشاء مفاتيح الاتصال/التشفير أي نستخدم الأمر: ssh-keygen مما يولد مفتاحين: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. ssh/id_rsa./~ : المفتاح الخاص. لا تنشر هذا الملفّ! ssh/id_rsa.pub./~ : المفتاح العام المُرتبط. هذا الملفّ يمكن مشاركته بحرية. مثلا نضعه في حساب github لنستطيع رفع الملفات للمستودع البعيد.. لتجنب فقطع اتصال SSH يمكنك استخدام أداة autossh أي auto ssh والتي تبقي الخدمة نشطة وتنفذ بالأمر: autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C يستخدم خوارزميات التشفير التالية: Algorithms EdDSA,[27] ECDSA, RSA and DSA for public-key cryptography.[28] ECDH and Diffie–Hellman for key exchange.[28] HMAC, AEAD and UMAC for MAC.[29] AES (and deprecated RC4, 3DES, DES[30]) for symmetric encryption. AES-GCM[31] and ChaCha20-Poly1305 for AEAD encryption. SHA (and deprecated MD5) for key fingerprint. يتم العمل حالياُ بالإصدار 2 من SSH التي يرمز لها ب SSH-2. مقالات أكاديمية حسوب عن SSH
- 1 جواب
-
- 1
-
ما هو السيرفر الذي تستخدمه؟ وما الرابط الذي تطلبه وأي وضعت ملف PHP؟ إن كنت تستخدم wamp تأكد من وضع الملف ضمن: C:\wamp64\www ثم في المسار: c:\wamp\alias\phpmyadmin.conf أو c:\wamp64\alias\phpmyadmin.conf لاتقم بتعديل السطر الأول تأكد من التالي: <Directory "c:/wamp64/apps/phpmyadmin5.0.2/"> Options +Indexes +FollowSymLinks +MultiViews AllowOverride all هذا Require local وهذا </Directory> تحت سطر options استبدل الذي لديك ب AllowOverride all Require all granted حل آخر: <Directory "c:/wamp22/apps/phpmyadmin3.5.1/"> Options Indexes FollowSymLinks MultiViews AllowOverride all Order Deny,Allow Deny from all Allow from localhost 127.0.0.1 ::1 </Directory> احفظ الملف وأعد تشغيل المخدم
- 1 جواب
-
- 1
-
إن SCP هو Secure copy protocol أي بروتوكول النسخ الآمن يستخدم لنقل الملفات بين الحواسيب يستخدم على الشبكة network. يفيد في: نقل ملفات بين الحاسوب المحلي والحاسوب البعيد local host and remote host أو بين حاسوبين بعيدين remote hosts يعمل باستخدام البروتوكول TCP port 22 يسمح برفع ملف مع الاحتفاظ بالخيارات permissions, timestamps الصلاحيات و التوقيع الزمني تم بناء هذا البروتوكول على Secure Shell protocol (SSH) ويعتمد عليه ويستخدم نفس طريقة المصادقة authentication مما يضمن موثوقية و سرية البيانات authenticity and confidentiality. يعمل خلال وضعين: source mode: قراءة ملف من القرص الصلب وإرساله عبر الشبكة sink mode: استقبال ملفات من الشبكة وكتابتهم على القرص كيفية نسخ ملف: من حاسوب محلي للحاسوب البعيد (على الشبكة) scp LocalSourceFile user@remotehost:directory/TargetFile LocalSourceFile مسار ملف محلي user@remotehost اسم المستخدم في الاستضافة directory/TargetFile مسار نسخ البيانات/الهدف أما بين حاسوبين على الشبكة: scp user@remotehost:directory/SourceFile LocalTargetFile يستخدم الوسيط r لجعل عملية النسخ عودية لتشمل جميع الملفات ضمن مجلد scp -r user@host:directory/SourceFolder LocalTargetFolder ^^ في حال كان الحاسوب المستقبل يشغل برمجية SCP على منفذ غير 22 يمكن تمريره كوسيط scp -P 2222 user@host:directory/SourceFile TargetFile ^^^^^^^ port مشكلة في البروتوكول: تسمح بالمرسل بالكتابة فوق ملفات موجودة مسبقاً عند المستقبل مما يمسح الملفات القديمة ويعدلها. overwrite arbitrary files بالإضافة لمشاكل في إرسال البيانات النصية. تم إيقاف التعامل معه في عام 2019 واستبدل مع البروتوكولين sftp and rsync
- 1 جواب
-
- 1
-
نعم هذا، لاحظ فشل مزامنة غرادل، ربما السبب هو اتصال الانترنت، حاول إغلاق android studio ثم تشغيل أحد برامج vpn ثم أعد فتح المشروع واضغط على مزامنة غرادل. يوجد جدول يحدد كل إصدار من Gradle version و Android Gradle plugin لاحظ علينا تحديد 4.2.0+ Android Gradle plugin لكي تعمل مع gradle 6.7.1 وأحدث Plugin version Required Gradle version 1.0.0 - 1.1.3 2.2.1 - 2.3 1.2.0 - 1.3.1 2.2.1 - 2.9 1.5.0 2.2.1 - 2.13 2.0.0 - 2.1.2 2.10 - 2.13 2.1.3 - 2.2.3 2.14.1 - 3.5 2.3.0+ 3.3+ 3.0.0+ 4.1+ 3.1.0+ 4.4+ 3.2.0 - 3.2.1 4.6+ 3.3.0 - 3.3.3 4.10.1+ 3.4.0 - 3.4.3 5.1.1+ 3.5.0 - 3.5.4 5.4.1+ 3.6.0 - 3.6.4 5.6.4+ 4.0.0+ 6.1.1+ 4.1.0+ 6.5+ 4.2.0+ 6.7.1+ 7.0 7.0+ إن كنت في سوريا مثلا لايعمل بدون VPN
-
عفواً، يبدو أنها غير مثبتة لديك، أحياناً إصدارات rc لاتأنتي بالتريبت.. المهم افتح الملف: gradle-wrapper.properties ثم في رابط gradle غير الإصدار: مثلاُ.. distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip ثم اعمل مزامنة ليتم تحميلها. كما يمكن تحميلها من الموقع الرسمي ثم فك ضغط الملف ثم من الخيارت Go to File > Settings > Builds,Execution,Deployment > Build Tools > Gradle >Gradle home path تحديد المسار المطلوب.
-
الآن علينا تجهيز قواعد البيانات والجدار الناري للمساح بتشغيل التطبيق مع تثبيت مخدم الويب nginx #نحدث المكتبات في النظام apt update && apt upgrade #تعديل الجدار الناري apt install ufw && ufw allow 22 && ufw logging off && ufw enable && ufw status #تثبيت مخدم ويب و قواعد بيانات apt install curl git nginx postgresql libpq-dev ^^^^^ ^^^^^^^^^^ Installing NGINX & Passenger حيث أن passenger هي الحزمة التي تشغل تطبيق ريلز للاستجابة، لأنه لايتعامل مباشرة مع طلبيات HTTP #(a) تثبيت مفتاح PGP key sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 #(b) تثبيت passenger من APT repository sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' sudo apt-get update #(c) Install Passenger and Nginx module sudo apt-get install -y libnginx-mod-http-passenger #(d) تحقق من ملف التكوين configuration files exist if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi sudo ls /etc/nginx/conf.d/mod-http-passenger.conf ثم تخصيص ملف التكوين نضيف ملف الإعداد passenger.conf ننشيئ sudo nano /etc/nginx/conf.d/mod-http-passenger.conf نضيف له passenger_ruby /home/deploy/.rbenv/shims/ruby; نحذف الإعداد الافتراضي sudo rm /etc/nginx/sites-enabled/default نضيف إعدادات مخصصة sudo nano /etc/nginx/sites-enabled/my_rails_app بعد تهيئة ملف الإعدادات نضع به القالب التالي مع التخصيص المناسب مثل المنفذ الذي سيعمل عليه التطبيق والمجلد الجذر للمشروع مع تفعيل passenger server { listen 80; listen [::]:80; server_name _; root /home/deploy/sample_rails_app/current/public; passenger_enabled on; passenger_app_env staging; } ونشغل nginx sudo service nginx start نثبت أداة Ruby Version Manager (RVM) مدير إصدارات لغة روبي، نحمل المفتاح: gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB ثم نثبت روبي وريلز install ruby and rails: \curl -sSL https://get.rvm.io | bash -s stable --rails ثم للتحقق من إصدار روبي: $ ruby --version ruby 2.7.2p137 // ريلز gem $ gem list rails rails (6.0.3.4) يمكن تثبيت نسخة مخصصة عن طريق rvm بتحديدها كما في الأمر: rvm install ruby-2.7.2 rvm use 2.7.2 // تثبيت ريلز بطريقة مختلفة gem update --system && gem install bundler rails ثم نرفع الملفات على الاستضافة إما كملف مضغوط أو من خلال رفعهم على github ثم نثبت المكتبات الخاصة بمشروعنا بتنفيذ الأمر التالي في مجلد المشروع الرئيسي: bundle install ثم نعمل على تهجير قواعد البيانات وتشغيل المخدم تجهيز قواعد البيانات (تثبيت قاعدة بيانات و إنشاء مستخدم خاص بالمشروع) أحد الخيارين: postgres sudo apt-get install postgresql postgresql-contrib libpq-dev sudo su - postgres createuser --pwprompt deploy createdb -O deploy myapp exit mysql sudo apt-get install mysql-server mysql-client libmysqlclient-dev sudo mysql_secure_installation # Open the MySQL CLI to create the user and database mysql -u root -p CREATE DATABASE IF NOT EXISTS myapp; CREATE USER IF NOT EXISTS 'deploy'@'localhost' IDENTIFIED BY '$omeFancyPassword123'; CREATE USER IF NOT EXISTS 'deploy'@'%' IDENTIFIED BY '$omeFancyPassword123'; GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'localhost'; GRANT ALL PRIVILEGES ON myapp.* TO 'deploy'@'%'; FLUSH PRIVILEGES; \q ننشئ ملف إعدادات البيئة ونضع فيه بيانات قاعدة البيانات # For Postgres DATABASE_URL=postgresql://deploy:PASSWORD@127.0.0.1/myapp # For MySQL DATABASE_URL=mysql2://deploy:$omeFancyPassword123@localhost/myapp RAILS_MASTER_KEY=ohai SECRET_KEY_BASE=1234567890 STRIPE_PUBLIC_KEY=x STRIPE_PRIVATE_KEY=y # etc... بقي تهجير قواعد البيانات وبدء المخدم بالأمرين: bin/rake db:migrate bin/rails s
- 1 جواب
-
- 1
-
شرح إضافي: Software Requirements Specification (SRS): هي عبارة عن وصف دقيق لما ينبغي أن يكون عليه النظام (النظام يتألف من برنامج أو أكثر وربما يتضمن قاعدة بيانات وموقع الكتروني..)، وماذا يقوم به النظام (إدارة دوام مدرسة)، وماهي قيود تطويره، وطبعاً هناك متطلبات وظيفية، ومتطلبات غير وظيفية، فبالنسبة للمتطلبات الوظيفية، لنفرض أن نظامك هو موقع لتواصل طلاب الأكاديمية مع المدربين، فمن هذه المتطلبات أن يستطيع المستخدم أن يسجل في هذا الموقع، أيضاً يستطيع المشاركة، وإلا فما فائدة المنتدى من دون أن يستطيع المستخدم أن يقوم بالتسجيل (يعني الأشياء التي يعملها بالتفصيل الممل)، أو يقوم بأي مشاركة (طرح الأسئلة - كتابة أجوبة)، وأما بالنسبة للمتطلبات غير الوظيفية فهي عبارة عن الخصائص التي تطرأ على النظام، وليس ما يفعله النظام (أي قيود تطوير النظام) ، فمثلاً يجب أن تذكر أن النظام الذي ستقوم بعمله يدعم سرعة عالية، مرن، سهل الاستخدام، ... إلى غيرها من الأوصاف التي تتعلق بأداء النظام ككل. مثل مرحلة تحويل تصميم قاعدة البيانات لشيفرة برمجية، أو تعريف الأصناف CLASS التي تمثل عناصر النظام (مدير - تلميذ) بالنسبة للاختبار، هنالك نوعين مشهورين unit test: اختبار على مستوى الوحدة مثل اختبار دالة أو صنف أي مجال محدود من المشروع integration test: اختبار على مستوى النظام ككل. يشمل عدة مراحل من عمل النظام (أكثر من وحدة unit بنفس الوقت)