اذهب إلى المحتوى

Hassan Hedr

الأعضاء
  • المساهمات

    2852
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    38

كل منشورات العضو Hassan Hedr

  1. بما أنك تستخدم Expo في مشروعك يمكنك الاستفادة من الحزمة expo-asset لجلب مسار الملف المطلق كالتالي // في الأعلى import { Asset } from 'expo-asset'; // لتنفيذ أمر فتح الملف OpenAnything.Pdf(Asset.fromModule(require('../PDF/quran.pdf')).uri)
  2. "==" يدل على التساوي في القيمة بين متحولين، اليك بعض القواعد (مع قواعد قد تجدها غريبة) "1" == 1; // true 0 == false; // true null == undefined // true 0 == null; // false 0 == undefined; // false "===" يعمل نفس عمل المعامل السابق لكن يضاف شرط للتساوي وهو تساوي نوع المتحولين "1" === 1; // false 0 === false; // false null === undefined // false 0 === null; // false 0 === undefined; // false الأفضل دائما استخدام المعامل "===" لتجنب أخطاء كثيرة قد تقع بها
  3. حاول إضافة السطر التالي إلى الملف node_modules/react-native/third-party-podspecs/DoubleConversion.podspec spec.homepage = 'https://github.com/google/double-conversion' وحاول تحديث نسخة react-native إلى أعلى نسخة يمكن لمشروعك قبولها (في حال كنت لا تستخدم Expo) عبر الأمر npm upgrade react-native
  4. التحذير موجود لتنبيهك قد لا تكون بحاجة لزيادة الحد الأقصى بل للانتباه لماذا يضاف الكثير من ال listeners الى مصدر الأحداث لديك، قد يكون في نظامك مكان تريد الاستماع فيه الى حدث معين أو خطأ لنفس الحدث لكنك لا تزيل الدوال الممررة والمنتهي عملها stream.on('data', onData) stream.on('error', onError) stream.on('end', cleanup) // التنظيف عند الانتهاء أيضا // توابع معالجة البيانات و الأخطاء // يمكن الإشارة اليها لاحقا لتنظيفها حال الانتهاء function onData() { cleanup() // .. } function onError(err) { cleanup() // .. } function cleanup() { // إزالة كل التوابع التي أضفناها سابقا لتجنب تسريب الذاكرة stream.removeListener('data', onData) stream.removeListener('error', onerror) stream.removeListener('end', cleanup) } أما في حال كنت متأكد من العدد التقريبي للدوال التي ستستمع للأحداث يمكنك زيادتها كي يكون التنبيه ذا فائدة حين يتكرر stream.setMaxListeners(20)
  5. هل يمكنك إرفاق ملفات مشروعك كي استطيع مساعدتك شكرا
  6. كلاهما مخزنين يستخدمان لتخزين أي بيانات خاصة بنطاق معين، الفرق هو عمر صلاحية هذه البيانات: sessionStorage: تخزن البيانات فقط للتبويب الذي تم داخله حفظ البيانات في هذا المخزن، وعند اغلاق التبويب (أي انتهاء جلسة المستخدم) يتم حذف جميع البيانات localStorage: تخزن البيانات دائما ولا يتم حذفها إلا باستدعاء الأمر removeItem، ويمكن الوصول اليها في وقت لاحق حتى لو تم إغلاق صفحة الموقع // localStorage localStorage.setItem('name', 'خالد'); // بعد إغلاق وفتح المستخدم لصفحة الموقع localStorage.getItem('name'); // 'خالد' // sessionStorage sessionStorage.setItem('name', 'خالد'); // بعد إغلاق وفتح المستخدم لصفحة الموقع sessionStorage.getItem('name'); // null
  7. حاول اعادة تشغيل مخدم التطبيق ومسح التخزين المؤقت باستخدام الأمر npm start -- --reset-cache
  8. هل يظهر لك خطأ أو تحذير ما؟ أرفقه من فضلك أو يمكنك ارفاق ملفات مشروعك بشكل مضغوط بدون ملف node_modules لاتمكن من مساعدتك
  9. DocumentDirectoryPath هو ثابت توفره المكتبة ويدل على جذر ملفات المشروع داخل الهاتف (لا يهم سوى معرفتك أنه جذر كل الملفات لمشروعك)
  10. قيمة grid-template-columns تحدد نمط تنسيق الأعمدة في الشبكة القيمة repeat(auto-fill, minmax(450px, 1fr)) توصف: ()repeat تكرار لنمط معين عدد من المرات، نمرر عدد مرات التكرار ثم القياس عدد مرات التكرار: auto-fill يعني أن نقوم بتكرار القياس اللاحق ليس بعدد ثابت من المرات وانما يكرر بأقصى عدد ممكن لملئ المساحة الأفقية القياس: ()minmax تحدد الحد الأدنى والأعلى للقياس الحد الأدنى: 450px أي لن ينقص عرض العمود الواحد عن 450 بيكسل الحد الأعلى: 1fr أي لا يوجد حد أعلى لعرض العمود يمكن للعمود ملئ كافة المساحة المتبقية الناتج يكون عدد أعمدة تلقائي متناسق مع الأجهزة كافة بحيث كلما استطعنا وضع أعمدة بأقل عرض ممكن 450px يضاف عمود جديد يملئ المساحة المتوفرة
  11. ليس هناك فائدة ربحية مباشرة من مثل هذه المشاريع المجانية، فهي تكون عادة جزء من عدة مشاريع تمتلكها الشركة وفائدتها تقع ضمن الاستراتيجية العامة للشركة لذلك تستثمر فيها الشركة وتقدمها بالمجان، وأحيانا فقط تكون تطوعية خيرية موسوعة حسوب مرجع للمطورين باللغة العربية، الفائدة هي اغناء لغة التخاطب بين المطورين العرب وتسهيل الفهم لشريحة أكبر من المبرمجين لكي يستطيعو الدخول في سوق العمل التي تعمل ضمنه شركة حسوب VSCode أداة مفيدة للمطورين ترفع من انتاجيتهم وبالتالي اغناء السوق البرمجي التي تعمل ضمنه Microsoft
  12. المشكلة أن الدالة تقبل فقط مسار مطلق لمكان الملف ولا تقبل مسار نسبي يمكنك استخدام الحزمة "react-native-fs" لمعرفة المسار المطلق للجذر ثم تضيف اليه المسار النسبي من جذر المشروع للملف المطلوب كالتالي import RNFS from 'react-native-fs'; OpenAnything.Pdf(`${RNFS.DocumentDirectoryPath}/PDF/quran.pdf`)
  13. هناك تعارض بين عمل الإضافة html-webpack-plugin و قواعد التحميل file-loader ل HTML { test: /\.html$/, exclude: /node_modules/, use: { loader: 'file-loader', query: { name: '[name].[ext]' }, }, }, // يتعارض مع new HtmlWebpackPlugin({ template: 'index.html', minify: { removeComments: true, collapseWhitespace: true, removeAttributeQuotes: true }, chunksSortMode: 'dependency' }) جرب إضافة تغيير بسيط لصيغة اسم الملفات في file-loader كالتالي use: { loader: 'file-loader', query: { name: '[name]_.[ext]' }, },
  14. يمكن معرفة نظام التشغيل الحالي عن طريق اختبار قيمة المتحول process.platform فهو يأخذ القيم التالية win32: في حال كان النظام Windows darwin: في حال كان النظام MacOS linux: في حال كان النظام Linux مثال لتنفيذ عملية ما فقط على نظام التشغيل ويندوز if(process.platform === "win32"){ // أوامر تنفذ فقط على نظام ويندوز }
  15. في حال وجود ملف package-lock.json في مشروعك فإن أمر تنصيب الحزم سيقوم تلقائيا بإزالة الحزم الغير المذكورة في package.json npm install أي يمكنك اتباع الخطوات التالية لإزالة الحزم الغير مرغوبة إزالة الحزم يدويا من ملف package.json تنفيذ الأمر npm install أو يمكنك مباشرة إزالة حزمة معينة عبر الأمر التالي حيث سيقوم بحذف ذكرها في ملف package.json ومن ثم حذف ملفات الحزمة من node_modules npm uninstall <package>
  16. لا يوجد فرق تقني يمكنك أستخدام كلا من Put و Post (أو أي طريقة أخرى) كيفما تشاء إما لإرسال بيانات في جسم الطلب لغاية اضافة أو تحديث مورد على نظامك، أو حتى يمكنك استخدامهم كالطريقة Get لجلب البيانات فقط... ما الغاية من وجود الطريقتين إذا ؟ لماذا نضع طريقة أصلا في طلب ال HTTP؟، وجود فعل الطلب أساسا هو عرف فقط نتفق على معناه جميعًا لنبني حوله تطبيقاتنا وأدواتنا بشكل موحد يتكامل مع بعضه العرف الحالي لكلا الطريقتين: POST: تعني إضافة مورد جديد PUT: تعني تحديث بعض قيم مورد موجود سابقا
  17. الكلمة render تعني تصيير وهو أمر ليس مسؤول عن عملية العرض بل مسؤول عن تحويل حالة المكون الحالية مع كافة المعاملات الممررة للمكون إلى شكل عرض ما في React إلى عناصر HTML في React Native إلى تعبير عن شكل الواجهة في تطبيق الهاتف المسؤول المباشر عن عملية العرض هو التابع ReactDOM.render حيث يمرر له المكون الجذر ثم المكان المراد وضع ناتج التصيير داخله ReactDOM.render(<h1>أهلًا بالعالم</h1>, document.getElementById('root'));
  18. إن تنفيذ أي برنامج يعني عمله ضمن إجرائية معينة يقوم نظام التشغيل بتحديد الموارد المتاحة لها وإدارة دورة حياتها، ويمكن لأي اجرائية تنفيذ برامج أخرى وسيقوم نظام التشغيل بتنفيذ البرنامج ضمن إجرائية جديدة تكون إبنًا للإجرائية التي استدعت تنفيذ البرنامج دورة حياة الإجرائية الإبن مرتبطة بالإجرائية التي نشأت منها أي بإغلاق الإجرائية الأب ينتهي عمل الإجرائيات الأبناء الطرفية terminal بحد ذاتها تعمل ضمن إجرائية وعند تنفيذك اي أمر داخلها (npm start مثلا) سيولد اجرائية إبن يعمل ضمنها تطبيقك لذلك عند إغلاقك للطرفية ينتهي عمل تطبيقك فورا أحد الحلول هو استخدام برامج مثل pm2 حيث يتم تشغيله كإجرائية مستقلة وبإعطاء الأوامر له بالتشغيل والمراقبة يدير كافة الإجرائيات ويبقيها تعمل دوما (فهو غير مرتبط بالطرفية نستخدم الطرفية فقط للتواصل وارسال الأوامر) الحل الوحيد هو تنفيذ مشروعك كإجرائية مستقلة مرتبطة مباشرة بنظام التشغيل أو ما يعرف بالخدمات، تكتب مواصفات الخدمة في ملف myapp.service داخل المسار /etc/systemd/system [Unit] # اسم لتطبيقك لتسهل إدارته Description=My app [Service] # ملف بداية التنفيذ ExecStart=/var/www/myapp/app.js Restart=always User=nobody Group=nobody # متحولات البيئة Environment=PATH=/usr/bin:/usr/local/bin Environment=NODE_ENV=production # مسار العمل كما لو أنك تنفذ الأمر من الطرفية عند هذا المسار WorkingDirectory=/var/www/myapp [Install] WantedBy=multi-user.target ملاحظة: ملف بداية التنفيذ يجب أن يبدأ بالسطر التالي لنحددبرنامج البيئة الذي سينفذ الملف وهو node في حالتنا #!/usr/bin/env node تنفذ الأمر التالي ليقوم نظام التشغيل باستكشاف الخدمة الجديدة systemctl daemon-reload وتبدأ عمل الخدمة عبر الأمر التالي حيث myapp هو اسم ملف إعدادات الخدمة بدون اللاحقة systemctl start myapp وفي حال أردت تشغيل هذه الخدمة تلقائيا عند إقلاع الخادم نفذ الأمر systemctl enable myapp
  19. نعم يمكن ذلك عن طريق تحديد النسخة المدعومة ضمن حقل engines في ملف package.json { "engines": { "node": ">=12" } } ولكي تلزم بقية الفريق بهذه النسخة حصرا ولا تجعل وجودها مجرد تفضيل تقوم بإنشاء ملف .npmrc بجانب ملف package.json وتضع فيه السطر engine-strict=true بعد هذا الإعداد سينتج خطأ عند في حال النسخة مخالفة للمواصفات المدعومة التي ذكرتها في package.json
  20. يمكنك تنفيذ الأمر التالي والذي سيقوم بمقارنة اصدارات كافة الحزم في مشروعك والبحث عن الاصدارات الجديدة npm outdated الخرج يكون جدول بتقرير بكافة الحزم الممكن تحديثها حيث Current : النسخة المنصبة الحالية في المشروع Wanted : هي النسخة التي يمكن التحديث اليها Latest : وهي أخر نسخة متوفرة من الحزمة (لا يتم التحديث لها مباشرة قبل مراجعة تغييرات النسخة واستخدام تطبيقك لها) مثال عن التقرير Package Current Wanted Latest Location Depended by glob 5.0.15 5.0.15 6.0.1 node_modules/glob dependent-package-name nothingness 0.0.3 git git node_modules/nothingness dependent-package-name npm 3.5.1 3.5.2 3.5.1 node_modules/npm dependent-package-name local-dev 0.0.3 linked linked local-dev dependent-package-name once 1.3.2 1.3.3 1.3.3 node_modules/once dependent-package-name بعد معرفة الحزم المراد تحديثها يمكن تحديث الكل عبر تنفيذ الأمر npm update أو تحديد مع حزمة معينة مثال npm update glob ويمكن تحديد نسخة معينة تريد التحديث إليها npm update glob@6.0.1
  21. الإجابة المختصرة نعم يصلح، الإجابة المطولة والتي ستجعلك قادرا على تعديل شكل الفاتورة مستقبلا وتعديل أي محتوى طباعي كما ذكرت لك في الإجابة رقم 1 و 3 في طريقة معاينة كيف سيكون شكل الصفحة عند الطباعة الإجابة المختصرة نعم تحتاج لتنفيذ الأمر print، الإجابة المطولة في الإجابة رقم 2 تم شرح مسؤولية الدالة print ومن يتولى مهمة الطباعة واختيار الطابعة والقياس
  22. يمكنك اعتبار قياسات الأوراق الطباعية مثل قياسات مختلفة لنافذة المتصفح ويمكنك استخدام قياسات Bootstrap نفسها للتصميم بالإضافة أنه يمكنك تخصيص ظهور أو اخفاء أي عناصر عند طباعة الفاتورة باستخدام الصفوف // للإظهار عند الطباعة فقط visible-print-block visible-print-inline visible-print-inline-block // للإخفاء عند الطباعة hidden-print الأمر print مهمته إظهار نافذة المعاينة ما قبل الطباعة تنفذ هذه الخطوة في Javascript، وفيها يتم تحديد الطابعة والقياس ومعاينة النتيجة أما باقي العمليه يتولاها المتصفح ونظام التشغيل والطابعة عليك فقط في Javascript استدعاء الأمر print يمكنك معاينة كيف سيكون شكل الفاتورة بالضغط على Ctrl + P والمعاينة بعدة قياسات والتأكد من التصميم وتعديله، ولمحاكاة مظهر الطباعة على نافذة المتصف فورا (في حال استخدامك للصفوف التي تخفي وتظهر عناصر عند الطباعة) يمكنك في Chrome تعيين الأعداد Emulate CSS Media إلى القيمة print كالتالي
  23. نعم هذا في حال عملية الاستعلام لا يوجد بها منطق مثل الخطوة رقم 2، عمليات المنطق (التحقق من البيانات) نقوم بها في لغة البرمجة حصرا يمكنك معرفة الخطأ من رسالة الخطأ أو تحديده من المعرف الخاص به (23505 لخاصية ال unique_violation) لتنفيذ عدة عمليات معا اذا كنت تستخدم مكتبة pg مباشرة كالتالي const { Pool } = require("pg"); const pool = new Pool(); pool.connect((err, client, done) => { const shouldAbort = (err) => { if (err) { console.error("Error in transaction", err.stack); // التراجع عن تنفيذ العمليات client.query("ROLLBACK", (err) => { if (err) { console.error("Error rolling back client", err.stack); } // release the client back to the pool done(); }); } return !!err; }; client.query("BEGIN", (err) => { if (shouldAbort(err)) return; // بداية العمليات // INERT..., UPDATE... // نهاية العمليات client.query("COMMIT", (err) => { if (err) console.error("Error committing transaction", err.stack); done(); }); }); }); اذا كنت تستخدم sequelize فالأمر أبسط try { const result = await sequelize.transaction(async (t) => { // نقوم بالعمليات هنا // مع تمرير الخاصية transaction // مثال const user = await User.create({ name: 'Modhy', }, { transaction: t }); //... }); // الوصول إلى هنا يعني اتمام العمليات بنجاح } catch (error) { // أي خطأ يحدث خلال العمليات يتم التراجع عنه آليا والحصول على الخطأ }
  24. التأكد من البيانات يحتاج إما جلب البيانات و التأكد منها محليًا، أو التأكد منها مباشرة داخل قاعدة البيانات عبر الاستعلام (خطوة ضرورية) للتأكد من عدم تكرار الأسم يمكن الاعتماد على قاعدة البيانات نفسها لضمان ذلك عبر تعيين الخاصية UNIQUE لحقل الإسم داخل الجدول عند إنشاءه (لا حاجة للإستعلام يمكن اختصاره) الإضافة في A وتحديث البيانات في B هما عمليتا كتابة لا يمكن اختصارهما (خطوة ضرورية) لكن: يمكن لهذه العملية أن تفشل بسبب تكرار الاسم (الخطوة 2) هنا نعلم بأن الإسم مكرر عند فشل هذه العملية يجب الرجوع عن البيانات المضافة في كلا الجدولين نستفيد من مبدأ بداية وتأكيد العمليات Transaction في PostgreSQL حيث يقوم بالرجوع عن أي بيانات تمت اضافتها أو تعديلها خلال هذه العمليات BEGIN; -- بداية العمليات INSERT INTO A ... ; UPDATE B ... ; -- نهاية العمليات COMMIT;
  25. من فضلك قم بإرفاق كود الصفحة التي تظهر بها المشكلة
×
×
  • أضف...