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

عبدالله عبدالرحمن11

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

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

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

أجوبة بواسطة عبدالله عبدالرحمن11

  1. في نظام وندوز

    يمكنك تنفيذ الأمر التالي لإنهاء جميع عمليات node التي تكون قيد التشغيل

    taskkill /im node.exe

    اما إذا بقي هناك بعض العمليات قيد التشغيل فيمكنك إضافة f لإجبار الإغلاق كالآتي

    taskkill /f /im node.exe

    في نظام ماك

    العملية مشابهة للسابقة حيث يمكنك إنهاء جميع عمليات Node التي تكون قيد التشغيل عبر تنفيذ هذا الأمر

    killall node

    أو يمكنك إستخدام lsof للعثور على PID الخاص بالعمليات التي تستمع الى منفذ معين كما في المثال

    $ lsof -Pi :8080
    COMMAND   PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
    node     1073    urname   22u  IPv6  bunchanumbershere      0t0  TCP *:8080 (LISTEN)

    والآن يمكنك إنهاء العملية 1073 الخاصة ب node كالآتي

    $ kill 1073

    اما إذا العملية رفضت الإغلاق فيمكنك إضافة 9- لفرض الإغلاق

    $ kill -9 1073

    في نظام لينكس

    وهنا ايضاً العملية مشابهة للسابقة ، لإنهاء جميع عمليات Node

    killall node

    أو يمكنك إستخدام netstat للبحث عن العملية التي تستمع الى منفذ معين

    $ netstat -nlp | grep :8080
    tcp        0    0 0.0.0.0:8080     0.0.0.0:*     LISTEN    1073/node

    ومن ثم إنهائها كالآتي

    $ kill 1073

    اما إذا رفضت الإغلاق ، فيمكنك فرض الإغلاق هكذا

    $ kill -9 1073

     

  2. لقد تلقيت هذا الخطأ لأن المؤشر تنتهي مهلته على الخادم (بعد 10 دقائق من عدم النشاط).

    من توثيق pymongo

    اقتباس

    يمكن أن تنتهي مهلة المؤشرات في MongoDB على الخادم إذا كانت مفتوحة لفترة طويلة دون إجراء أي عمليات عليها. يمكن أن يؤدي هذا إلى ظهور استثناء CursorNotFound عند محاولة تكرار المؤشر.

    عندما تستدعي دالة collection.find  ، فإنه يستعلم مجموعة collection  ويعيد المؤشر إلى المستندات. 

    للحصول على المستندات ، تقوم بتكرار المؤشر. عندما تقوم بالتكرار عللا المؤشر ، يقوم التعريف driver بالفعل بتقديم طلبات إلى خادم MongoDB لجلب المزيد من البيانات من الخادم.

     يتم تحديد مقدار البيانات التي يتم إرجاعها في كل طلب بواسطة دالة ()batch_size .

    من توثيق mongo بخصوص دالة ()batch_size

    اقتباس

    يحد من عدد المستندات التي تم إرجاعها دفعة واحدة. تتطلب كل دفعة رحلة ذهابًا وإيابًا إلى الخادم. يمكن تعديله لتحسين الأداء والحد من نقل البيانات.

    سيساعدك تعيين حجم الدفعة إلى قيمة أقل في أخطاء انتهاء المهلة ، ولكنه سيزيد من عدد المرات التي ستتمكن فيها من الوصول إلى خادم MongoDB للحصول على جميع المستندات.

    حجم الدفعة الافتراضي batch size :

    اقتباس

    بالنسبة لمعظم الاستعلامات ، تقوم الدفعة الأولى بإرجاع 101 مستند أو مستندات كافية فقط لتتجاوز 1 ميغا بايت. لن يتجاوز حجم الدفعة الحد الأقصى لحجم مستند BSON (16 ميجابايت).

    لا يوجد حجم دفعة قياسي "صحيح".

    لهذا يجب عليك الاختبار بقيم مختلفة ومعرفة القيمة المناسبة لحالة الاستخدام الخاصة بك ، أي عدد المستندات التي يمكنك معالجتها في إطار 10 دقائق.

    سيكون الملاذ الأخير هو تعيين no_cursor_timeout=True. 

    لكن عليك التأكد من إغلاق المؤشر بعد الانتهاء من معالجة البيانات.

    كيفية تجنبها بدون try/except :

    cursor = collection.find(
         {"x": 1},
         no_cursor_timeout=True
    )
    for doc in cursor:
        # do something with doc
    cursor.close()

     

  3. يمكنك إصلاح هذه المشكلة  عن طريق حذف ملف mongodb-27017.sock. 

    ثم قم بتشغيل الخدمة بعد حذف هذا الملف ، والتي ستعمل بشكل جيد. 
    ومُخرج الأمر

    ls - lat /tmp/mongodb-27017.sock

    الآن يكون مثل هذا

    srwx------ 1 mongodb nogroup 0 Apr 23 06:24 /tmp/mongodb-27017.sock

    وهناك حل آخر للمشكلة عبر تغيير صلاحيات ملف sock. الى المستخدم الحالي كالآتي

    sudo chown `whoami` /tmp/mongodb-27017.sock

     

  4. يمكنك إستخدام prefix عند تنفيذ أمر التثبيت من NPM كما في المثال

    npm install react --prefix ./vendor/node_modules

    حيث سيتم تثبيت react في هذا المسار

    ./vendor/node_modules

    وايضاً يمكنك إضافة متغير البيئة NODE_PATH لإضافة المسار الجديد كما في المثال

    export NODE_PATH='yourdir'/node_modules

     

  5. يمكنك إنشاء دالة بسيطة لإيجاد النص المكرر في نص معين بكل سهولة بدون الحاجة الى التعابير الإعتيادية regular expression أو إستيراد دالة خارجية ، وهذا كود الدالة ، حيث ستحصل على فهرس أماكن الكلمة الذي تبحث عنها

    def find_all(a_str, sub):
        start = 0
        while True:
            start = a_str.find(sub, start)
            if start == -1: return
            yield start
            start += len(sub) 
    
    list(find_all("hello, world! Hi! hello!", "hello")) # [0, 18]

    أويمكنك استخدام دالة finditer من وحدة re لإيجاد النص المكرر

    import re
    [m.start() for m in re.finditer('test', 'test test test test')]

     

    • أعجبني 1
  6. هناك عدة طرق لربط السلاسل النصية string مع الأرقام int 

    في الإصدارات القديمة من بايثون 2 يمكنك إستخدام الرمزين `` backsticks كما في المثال

    string = 'string'
    for i in range(11):
        string +=`i`
    print string

    ولكن هذه الطريقة تم إزالتها من إصدرارات بايثون الحديثة ومن بايثون 3 ولهذا يجب عليك إستخدام الدالة ()str بدلاً من الطريقة القديمة كما في المثال

    string = 'string'
    for i in range(11):
        string +=str(i)
    print string

    أو كما في الكود الخاص بك ، يمكنك إضافة دالة ()str كالآتي

    age= 18
    print("I have " + str(age) + " years old")

     

  7. سنقوم بشرح سلوك اثنين من العوامل المنطقية and و or. وفقاً للتوثيق الرسمي لبايثون

    العامل المنطقي and سيقوم بإرجاع القيمة الخاطئة الأولى إذا وُجدت ، وإلا سيقوم بإرجاع القيمة الآخيرة في التعبير expression

    العامل المنطقي or سيقوم بإرجاع القيمة الصائبة الأولى إذا وُجدت ، وإلا سيقوم بإرجاع القيمة الآخيرة في التعبير expression

    العامل الوحيد الذي يقوم بإرجاع قيمة منطقية بغض النظر عن قيم معاملاته هو العامل المنطقي not

  8. تستخدم with للتعامل مع الموارد مثل الوصول الى الملفات وجعل الكود قابل للقراءة بشكل أفضل ، فعلى سبيل إذا أردت فتح ملف وتعديله بالطريقة التقليدية

    file = open('file_path', 'w')
    try:
        file.write('hello world')
    finally:
        file.close()

    أما إذا إستخدمت with مع as ومعناها "ك" أي فتح ملف معين ك file (اسم متغير) كما في المثال التوضيحي

    with open('file_path', 'w') as file:
        file.write('hello world !')

    فكما ترى في المثال الأول قمنا بإستدعاء ()close بينما في المثال الثاني لم نقم بذلك لأن with ستقوم بإغلاق الموارد تلقائياً 

  9. نعم انه من الممكن تعطيل SSR كما في التوثيق الرسمي

    import dynamic from 'next/dynamic'
    
    const DynamicComponentWithNoSSR = dynamic(
      () => import('../components/hello3'),
      { ssr: false }// تعطيل SSR في الصفحة الرئيسية
    )
    
    function Home() {
      return (
        <div>
          <Header />
          <DynamicComponentWithNoSSR />
          <p> الصفحة الرئيسسة </p>
        </div>
      )
    }
    
    export default Home

     لكن هذا ليس ما تم تصميمه من أجله وستجد صعوبة في الاحتفاظ به كتطبيق صفحة واحدة SPA.

    توجيه Next routing والتكوينات المضمنة الأخرى مخصصة خصيصًا لـ SSR إنشاء موقع ثابت.

    create-react-app وأشياء مثل React Router تم تصميمها خصيصًا لـ SPA (على الرغم من أنها تتجه نحو SSR بشكلٍ أفضل).

    لذلك قم بإختيار الأداة المناسبة للعمل ، فإذا كنت تريد تطبيق الصفحة الواحدة SPA فعليك إستخدام create-react-app

    اما إذا أردت SSR فعليك إستخدام Nextjs ، اما إذا أردت SSG توليد الصفحات الثابتة بإستخدام React فعليك إستخدام Next أو Gatsby

  10. يستخدم Next.js المكون App لتهيئة الصفحات. يمكنك إبطاله والتحكم في تهيئة الصفحة.

    على الرغم من أن هذا المثال التوضيحي خاص بـ next.js ، إلا أنه يجب أن يعمل مع nextjs-starter.

    قم بتثبيت next-redux-wrapper:

    npm install --save next-redux-wrapper

    أضف ملف _app.js  إلى مسار pages/. :

    // pages/_app.js
    import React from "react";
    import {createStore} from "redux";
    import {Provider} from "react-redux";
    import App, {Container} from "next/app";
    import withRedux from "next-redux-wrapper";
    
    const reducer = (state = {foo: ''}, action) => {
        switch (action.type) {
            case 'FOO':
                return {...state, foo: action.payload};
            default:
                return state
        }
    };
    
    
    const makeStore = (initialState, options) => {
        return createStore(reducer, initialState);
    };
    
    class MyApp extends App {
    
        static async getInitialProps({Component, ctx}) {
    
            /*
            * يمكننا عمل
            * dispatch
            * من هنا
            */
          
            ctx.store.dispatch({type: 'FOO', payload: 'foo'});
    
            const pageProps = Component.getInitialProps ? await Component.getInitialProps(ctx) : {};
    
            return {pageProps};
    
        }
    
        render() {
            const {Component, pageProps, store} = this.props;
            return (
                <Container>
                    <Provider store={store}>
                        <Component {...pageProps} />
                    </Provider>
                </Container>
            );
        }
    
    }
    
    export default withRedux(makeStore)(MyApp);

    وبعد ذلك ، يمكن توصيل مكونات الصفحة الفعلية ببساطة: هذا العرض التوضيحي حول كيفية اتصال index.js بالصفحات.

    import Link from "next/link";
    import React from "react";
    import {
      Container,
      Row,
      Col,
      Button,
      Jumbotron,
      ListGroup,
      ListGroupItem
    } from "reactstrap";
    import Page from "../components/page";
    import Layout from "../components/layout";
    
    import { connect } from "react-redux";
    
    class Default extends Page {
      static getInitialProps({ store, isServer, pathname, query }) {
        store.dispatch({ type: "FOO", payload: "foo" }); // المكون سيتمكن من قراءة حالة المخزن عند تصييره
        return { custom: "custom" }; // يمكننا تمرير بعض الخيارات المُخصصة من هنا
      }
      render() {
        return (
          <Layout>content...</Layout>
        );
      }
    }
    
    export default connect()(Default);

    راجع التوثيق الرسمي للحصول على مزيد من المعلومات: next-redux-wrapper

  11. يمكنك تعريف حقل _id يدويًا أثناء مرحلة المخطط Schema ، مثل:

    const DocumentSchema = new Schema({
      _id: String // أو رقم أو دالة زيادة تدريجياً
      ...
    })

    لتجاوز _idحقل أو تعريفه يدويًا في المخطط ، استخدم هذا المثال:

    /**
     * extends Document
     * هو عبارة عن
     * Mongoose Document
     * من
     * 'mongoose'
     */
    @Schema()
    export class Key extends Document { 
      @Prop()
      _id: string;
    
      @Prop({ required: true })
      secret: string;
    }

     

  12. ستحتاج إلى إنشاء خادم مخصص ، ومع ذلك ، لا يمكنك النشر في vercel ، وستحصل على تطبيق nodejs عادي. يمكنك استخدام موفري السحابة cloud providers للتعامل مع المقابس sockets نيابة عنك ، أو مثلما انت قلت ، يمكنك تقسيم تطبيقك إلى تطبيق next.js عادي ونشر تطبيق المقبس socket الخاص بك بشكل منفصل.

    مثال لخادم مخصص من التوثيق الرسمي

    // server.js
    const { createServer } = require('http')
    const { parse } = require('url')
    const next = require('next')
    
    const dev = process.env.NODE_ENV !== 'production'
    const app = next({ dev })
    const handle = app.getRequestHandler()
    
    app.prepare().then(() => {
      createServer((req, res) => {
        /*
        	تأكد من تمرير
            true
            كمُدخل ثاني الى
            parse(req.url, true)
            هذا يُخبر الدالة لقراءة جزء ال
            query
            من
            URL
        */
        const parsedUrl = parse(req.url, true)
        const { pathname, query } = parsedUrl
    
        if (pathname === '/a') {
          app.render(req, res, '/a', query)
        } else if (pathname === '/b') {
          app.render(req, res, '/b', query)
        } else {
          handle(req, res, parsedUrl)
        }
      }).listen(3000, (err) => {
        if (err) throw err
        console.log('> Ready on http://localhost:3000')
      })
    })

     

  13. في بايثون الإصدار 2 هذا ليس مضمونا كما أنه من الممكن ل True و  False أن يعاد تعيينهما ومع ذلك ، حتى في حالة حدوث ذلك ، لا يزال يتم إرجاع الصحيح المنطقي والخطأ منطقي بشكل صحيح لإجراء مقارنات.

    في بايثون 3 ،  True و False هما كلمتان محجوزتان، وسيكونا دائما يساوين 1 و  0.

    الكائن False من نوع bool هو صنف فرعي من int:

    object
       |
     int
       |
     bool

    هذا هو السبب الوحيد الذي يجعل ['hello', 'world'][False] في مثالك يعمل.

    لذلك يتم اعتبار القيم المنطقية  كأعداد صحيحة int في بايثون 2 و 3.

    • أعجبني 2
  14. دالة التنظيف clean هي دالة تقوم بوضعها في إرجاع دالة useEffect لكي تقوم بإزالة بيانات سابقة أو أحداث سابقة كما في هذا المثال

    useEffect(() => {
        API.subscribe()
        return function cleanup() {
            API.unsubscribe()
        }
    },[])

    وهذا مثال آخر يوضح ذلك

    const Loading = () => {
      const [loadingStatus, setLoadingStatus] = useState(".");
    
      useEffect(() => {// إنشاء فترة وحفظ رقمها  
        const intervalId = setInterval(() => {
          setLoadingStatus(ls => ls + ".");
        }, 1000);
    
        return () => clearInterval(intervalId);// إزالة الفترة التي أنشئناها من خلال دالة التنظيف
      }, []);
    
      return <p>{`Loading ${loadingStatus}`}</p>;
    };

     

  15. يمكنك تفحص إذا كان كائن الطلب موجود فإذن انت في جانب الخادم server-side اما إذا لم يكن موجود فانت في جانب العميل client-side كما هو موضح في الكود

    async getInitialProps (appContext) {
    
        if (appContext.ctx.req) // server? 
        {
            // جانب الخادم
        }
        else {
            // جانب العميل
        }
    }

     

  16. يجب عليك وضع dynamic خارج المكون ، وسيعمل بشكلٍ جيد

    const getDynamicComponent = (c) => dynamic(() => import(`../components/${c}`), {
      ssr: false,
      loading: () => <p>Loading...</p>,
    });
    
    const Test = () => {
      const router = useRouter();
      const { component } = router.query;
      
      const DynamicComponent = getDynamicComponent(component);
    
      return <DynamicComponent />
    }

     

  17. استخدم أداة تحميل Next.js CSS المدمجة بدلاً من أداة التحميل  @zeit/next-sass.

    1. استبدل حزمة @zeit/next-sass بـ sass.
    2. أزل next.config.js. أو لا تغير تحميل CSS فيه.
    3. انقل CSS العام global كما هو مقترح في رسالة الخطأ.
    /pages/_app.js
    import '../global-styles/main.scss'
    
    export default function MyApp({ Component, pageProps }) {
      return <Component {...pageProps} />
    }

    لم يكن لديك هذا الخطأ من قبل لأن Next.js أسقط دعم CSS العام global في ملفات غير /pages/_app.js فقط في الإصدارات الأخيرة

    لإضافة التنسيقات إلى مكون أو صفحة معينة فقط ، يمكنك استخدام الدعم المدمج لوحدات CSS . التوثيق الرسمي لدعم CSS المُدمج

    على سبيل المثال ، إذا كان لديك مكون ، Button.js فيمكنك إنشاء ملف Sass button.module.scss وإدراجه في المكون.

  18. كما يوضح الخطأ ، سيتعين عليك استخدام عنوان URL مطلق absolute من أجل fetch الذي تقوم بإستخدامه.

    يبدوا أن المشكلة له علاقة بالبيئات المختلفة (العميل والخادم) التي يمكن تنفيذ التعليمات البرمجية الخاصة بك عليها. عناوين URL النسبية relative ليست واضحة وموثوقة بدرجة كافية في هذه الحالة.

    تتمثل إحدى طرق حل هذه المشكلة في كتابة عنوان الخادم يدوياً في طلب fetch .

    وطريقة أخرى عبر إعداد وحدة config والتي تتفاعل مع بيئتك:

    /config/index.js
    const dev = process.env.NODE_ENV !== 'production';
    
    export const server = dev ? 'http://localhost:3000' : 'https://your_deployment.server.com';

    وفي الكود الخاص بك

    import { server } from '../config';
    
    // ...
    
    Products.getInitialProps = async function() {
    
      const res = await fetch(`${server}/api/psts`)
      const data = await res.json()
    
    
      return {
        products: data
      }
    }
    

     

  19. للتحويل من بايثون datatime الى datetime64 و Timestamp

    >>> dt = datetime.datetime(year=2017, month=10, day=24, hour=4, 
                       minute=3, second=10, microsecond=7199)
    >>> np.datetime64(dt)
    numpy.datetime64('2017-10-24T04:03:10.007199')
    
    >>> pd.Timestamp(dt) # أو pd.to_datetime(dt)
    Timestamp('2017-10-24 04:03:10.007199')

    للتحويل من numpy datetime64 الى datetime و Timestamp

    >>> dt64 = np.datetime64('2017-10-24 05:34:20.123456')
    >>> unix_epoch = np.datetime64(0, 's')
    >>> one_second = np.timedelta64(1, 's')
    >>> seconds_since_epoch = (dt64 - unix_epoch) / one_second
    >>> seconds_since_epoch
    1508823260.123456
    
    >>> datetime.datetime.utcfromtimestamp(seconds_since_epoch)
    >>> datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)

    تحويل الى Timestamp

    >>> pd.Timestamp(dt64)
    Timestamp('2017-10-24 05:34:20.123456')

    تحويل من Timestamp الى datetime و datetime64

    >>> ts = pd.Timestamp('2017-10-24 04:24:33.654321')
    
    >>> ts.to_pydatetime()   # بايثون Datetime
    datetime.datetime(2017, 10, 24, 4, 24, 33, 654321)
    
    >>> ts.to_datetime64()
    numpy.datetime64('2017-10-24T04:24:33.654321000')

     

    • أعجبني 1
  20. بتاريخ 4 ساعات قال علي العبسي:

    الانتنه شغال تمام عند اضافة الماك ادرس يدويا اضيف العدد الذي بدي اياه وكل شي تمام الصورة رقم 1يقول ان هناك خطاء 

     الخطأ الذي يظهر لا يدل على أن هناك خطأ في الكود

    ولكن الخطأ يقوم أنه حدث خطأ ما عند 172.16.0.210

  21. حل سريع لذلك هو عبر إستخدام دالة ()str كالآتي

    ObjectId = str(ObjectId('5f4351948e86c20b1d1c0d3c'))

    اما إذا كنت تستخدم Flask فيمكنك إستخدام دالة jsonify

    @app.route('/')
    def home():
        docs = []
        for doc in db.person.find():
            doc.pop('_id') 
            docs.append(doc)
        return jsonify(docs)

    أو يمكنك التحويل من BSOM الى JSON كالآتي

    from bson import json_util
    import json
    
    @app.route('/')
    def index():
        for _ in "collection_name".find():
            return json.dumps(i, indent=4, default=json_util.default)

     

  22. npm prune

    سيقوم بإزالة المكتبات الغير مدرجة في package.json وليس غير المُستخدمة

    فإذا أردت حذف المكتبات الغير المستخدمة فيمكنك تثبيت حزمة depcheck فهي تقوم بتحليل المكتبات أو التبعيات dependecies وكيف يتم إستخدام كل واحدة منهن وأيٌ منهن غير ضروري و أيٌ منهن مفقود في package.json

    يمكنك تثبيتها هكذا

    npm install -g depcheck

    أو هكذا

    npx depcheck

    ويمكنك إستخدامها كالآتي

    depcheck [directory] [arguments]

    حيث تستبدل [directory] بجذر مسار المشروع والذي يكون فيه الملف package.json فإذا لم تقم بتحديد المسار فسيتم تحديد المسار الحالي بشكل افتراضي

    و [arguments] هي عبارة عن المُدخلات وهي اختيارية

×
×
  • أضف...