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

لوحة المتصدرين

  1. Ali Haidar Ahmad

    Ali Haidar Ahmad

    الأعضاء


    • نقاط

      5

    • المساهمات

      1068


  2. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      4

    • المساهمات

      2934


  3. Hafsa Aly

    Hafsa Aly

    الأعضاء


    • نقاط

      3

    • المساهمات

      340


  4. ريم المهدي

    ريم المهدي

    الأعضاء


    • نقاط

      3

    • المساهمات

      127


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 07/15/21 في كل الموقع

  1. السلام عليكم ان شاء سأبدأ في مجال تطوير الويب ولكن أنا محتار في أي شئ أبدء أولا مسار تطوير واجهات المستخدم أم تطوير تطبيقات الويب باستخدام لغة PHP وأيهما الأفضل للبدء فيه
    2 نقاط
  2. سلام عليكم ,, احد يعرف تطبيق او برنامج او اضافة يخليني افتح ملفات الPDF من الواتساب ويب او التيلقرام ويب او اي موقع بدون ما احمل ملف الPDF ؟
    1 نقطة
  3. اذا كان عندي قائمة من الاشخاص في لجنة عليمية واريد عرضهم بترتيب الpriority اي ع حسب الدرجة العلمية الاكبر وهذا الfield هو priority في قاعدة البيانات فماذا اكتب
    1 نقطة
  4. السلام عليكم و رحمة الله تعالى و بركاته, لم يتبقى لي الا القليل لاكمال اساسيات html و قد استفدت كثيرا حقا و اعجبت بطريقة الشرح المقدمة لكن بعد ان انتهي من اساسيات html لا اريد البدء في اساسيات css الا بعد ان اصبح متمكنا جدا من لغة html فاي الطرق تنصحونني بها لتطوير مستواي بهذه اللغة و شكرا.
    1 نقطة
  5. ما الفرق بين GitHub - GitLab وايهم افضل ؟
    1 نقطة
  6. لدي كود كالتالي: import pandas as pd import numpy as np dff = pd.DataFrame(np.random.randn(1,2),columns=list('AB')) واحصل على النتيجة التالية: A B 0 -1.284531 1.923908 وعندما أقوم بكتابة : dff.mean(axis=1) أحصل على النتيجة التالية: 0 0.319689 dtype: float64 كنت أعتقد أن axis=1 تشير إلى الأعمدة، لذا ما الذي تعنيه axis عند إستعمال مصفوفة numpy مع pandas؟
    1 نقطة
  7. السبب لهذا الخطأ هو أخطاء في إصدار pandas الذي لديك. تم إطلاق نسخة أحدث من dask للتعامل مع هذا الخطأ قم بتحديث dask. في حال كنت تستخدم بيئة أناكوندا: conda update dask أو: pip install --upgrade dask أو قم بتحديث pandas إلى الإصدار الجديد: conda update pandas # أو pip install --upgrade pandas
    1 نقطة
  8. تطوير واجهات المستخدم أو php دورات وليس مسارات وهذه الدورات تتكون من مسارات لذلك يمكنك التقدم للإختبار بعد الخطوات السابقة
    1 نقطة
  9. طريقة عمل العلاقة بين 2models العلاقة بينهم many to many
    1 نقطة
  10. شكرا لك ولكن لم افهم الخطوة السادسة
    1 نقطة
  11. بإمكانك أن تقوم بإضافة صف جديد للإجمالي من خلال كود جافاسكريبت عند الضغط على زر "البدء بتعبئة الطلب" من خلال الكود التالي: addTotalRows = () => { row_html = `<tr class="total-row"> <th scope="row" style="border: 1px solid #373838;background-color: #bec1c3;"> الإجمالي </th> <td scope="row" class="total" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-m" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-l" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-xl" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-xxl" style="border: 1px solid #373838;"> </td> </tr>` tbody = document.querySelector('tbody') tbody.innerHTML = tbody.innerHTML + row_html } تقوم الدالة السابقة بإضافة صف يحتوي على بعض الخانات إلى جسم الجدول tbody ونقوم بتنفيذ هذه الدالة عند الضغط على زر "البدء بتعبئة الطلب" من خلال حدث submit لنموذج البيانات .needs-validation-create-table كالتالي: document.getElementsByClassName('needs-validation-create-table')[0].addEventListener('submit', addTotalRows) بعد ذلك يجب عمل دالة لتغير قيم هذا الخلايا في الصف الذي قمنا بإنشائه للتو، كالتالي: calcTotal = () => { rows = document.querySelectorAll('tbody tr:not(.sizes-names):not(.total-row)') total = 0 size_m = 0 size_l = 0 size_xl = 0 size_xxl = 0 rows.forEach((row)=>{ inputs = row.querySelectorAll('td input') total += isNaN(parseInt(inputs[0].value)) ? 0 : parseInt(inputs[0].value) size_m += isNaN(parseInt(inputs[1].value)) ? 0 : parseInt(inputs[1].value) size_l += isNaN(parseInt(inputs[2].value)) ? 0 : parseInt(inputs[2].value) size_xl += isNaN(parseInt(inputs[3].value)) ? 0 : parseInt(inputs[3].value) size_xxl += isNaN(parseInt(inputs[4].value)) ? 0 : parseInt(inputs[4].value) }) changeTotal(total, size_m, size_l, size_xl, size_xxl) } changeTotal = (total, size_m, size_l, size_xl, size_xxl) => { document.querySelector('.total').innerText = total document.querySelector('.size-m').innerText = size_m document.querySelector('.size-l').innerText = size_l document.querySelector('.size-xl').innerText = size_xl document.querySelector('.size-xxl').innerText = size_xxl } تقوم دالة calcTotal بأخذ القيم من الحقول من الجدول وجمع قيمة كل عمود على حدى ثم تخزين هذه القيم في المتغيرات total, size_m, size_l, size_xl, size_xxl وفي النهاية تقوم بتمرير هذه المتغيرات إلى الدالة changeTotal المسئولة عن إضافة الأرقام إلى صف الإجمالي الذي قمنا بإنشائه في الخطوة الأولى، لكن هذه الدوال يجب أن تعمل بعد إضافة الألوان إلى الجدول وذلك من خلال إضافة حدث submit آخر إلى النموذج .needs-validation-create-table كالتالي: document.getElementsByClassName('needs-validation-create-table')[0].addEventListener('submit', () => { felids = document.querySelectorAll('td.color-sizes-count') felids.forEach((felid) => { felid.addEventListener('change', calcTotal) }) }) يقوم الكود السابق بإنتظار الضغط على زر "البدء بتعبئة الطلب" ثم يقوم بإضافة حدث change على كل حقل إدخال موجود في الجدول ليتم تنفيذ الدالة calcTotal عند حدوث أي تغير في قيم الحقول في الجدول وبهذا سيتم تغير القيم في صف الإجمالي كما في الصورة: وهنا الكود الكامل: addTotalRows = () => { row_html = `<tr class="total-row"> <th scope="row" style="border: 1px solid #373838;background-color: #bec1c3;"> الإجمالي </th> <td scope="row" class="total" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-m" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-l" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-xl" style="border: 1px solid #373838;"> </td> <td scope="row" class="size-xxl" style="border: 1px solid #373838;"> </td> </tr>` tbody = document.querySelector('tbody') tbody.innerHTML = tbody.innerHTML + row_html } document.getElementsByClassName('needs-validation-create-table')[0].addEventListener('submit', addTotalRows) calcTotal = () => { rows = document.querySelectorAll('tbody tr:not(.sizes-names):not(.total-row)') total = 0 size_m = 0 size_l = 0 size_xl = 0 size_xxl = 0 rows.forEach((row)=>{ inputs = row.querySelectorAll('td input') total += isNaN(parseInt(inputs[0].value)) ? 0 : parseInt(inputs[0].value) size_m += isNaN(parseInt(inputs[1].value)) ? 0 : parseInt(inputs[1].value) size_l += isNaN(parseInt(inputs[2].value)) ? 0 : parseInt(inputs[2].value) size_xl += isNaN(parseInt(inputs[3].value)) ? 0 : parseInt(inputs[3].value) size_xxl += isNaN(parseInt(inputs[4].value)) ? 0 : parseInt(inputs[4].value) }) changeTotal(total, size_m, size_l, size_xl, size_xxl) } changeTotal = (total, size_m, size_l, size_xl, size_xxl) => { document.querySelector('.total').innerText = total document.querySelector('.size-m').innerText = size_m document.querySelector('.size-l').innerText = size_l document.querySelector('.size-xl').innerText = size_xl document.querySelector('.size-xxl').innerText = size_xxl } document.getElementsByClassName('needs-validation-create-table')[0].addEventListener('submit', () => { felids = document.querySelectorAll('td.color-sizes-count') felids.forEach((felid) => { felid.addEventListener('change', calcTotal) }) })
    1 نقطة
  12. هي تطوير لفكرة الشبكات العصبية المتكررة RNNs بأنواعها المختلفة والفرق هو أن الشبكات العصبية المتكررة ثنائية الاتجاه تربط طبقتين مخفيتين في اتجاهين متعاكسين بنفس الإخراج. وبالتالي يمكن لطبقة الإخراج الحصول على معلومات من حالات الماضي والمستقبل في وقت واحد، وهذا مايجعلها أقوى ولاسيما في التقاط معنى السياق. ويمكن تطبيقها على أي نوع من أنواع الشبكات العصبية المتكررة أحادية الاتجاه مثل RNN أو LSTM أو GRU. ويمكن استخدامها عن طريق تمرير الطبقة أحادية الاتجاه لها فقط كما سأوضح في المثال التالي. 1. مثال لاستخدامها مع LSTM: # تحميل البيانات وتجهيز الداتا from keras.datasets import imdb from keras.preprocessing import sequence from keras import layers from keras.models import Sequential max_features = 10000 maxlen = 500 (x_train, y_train), (x_test, y_test) = imdb.load_data( num_words=max_features) x_train = [x[::-1] for x in x_train] x_test = [x[::-1] for x in x_test] x_train = sequence.pad_sequences(x_train, maxlen=maxlen) x_test = sequence.pad_sequences(x_test, maxlen=maxlen) # بناء النموذج model = Sequential() model.add(layers.Embedding(max_features, 100)) # لاحظ كيف يكون استخدامها حيث نقوم بتمرير الطبقة التي نريدها لها بالشكل التالي model.add(layers.Bidirectional(layers.LSTM(64))) model.add(layers.Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) history = model.fit(x_train, y_train, epochs=8, batch_size=64, validation_split=0.2) 2.مثال لاستخدامها مع GRU بشكل مشابه أيضاً: from keras.models import Sequential from keras import layers from keras.optimizers import RMSprop model = Sequential() model.add(layers.Bidirectional(layers.GRU(32), input_shape=(None, float_data.shape[-1]))) model.add(layers.Dense(1)) model.compile(optimizer=RMSprop(), loss='mae') history = model.fit_generator(train_gen, steps_per_epoch=500, epochs=40, validation_data=val_gen, validation_steps=val_steps) إن الطبقات ثنائية الاتجاه تعطيك أداء أفضل من ناحية الدقة لكنها تستهلك زمن كبير جداً مقارنة بالطبقات أحادية الاتجاه.
    1 نقطة
  13. استخدام أحدث أدوات التطوير: Bootstrap 4 و jQuery و Sass التعامل مع خدمة استضافة المشاريع البرمجية GitHub و GitLab نشر صفحات الموقع على الإنترنت لم اجد sass او bootsrapاو GitHub و GitLabاو كيف ننشر صفحات الموقع على الإنترنت
    1 نقطة
  14. مصفوفة تقوم بجمع الصف لوحده والعمود لوحده وتطبع العناصر بلغة الجافا وكيفية الطباعة بشكل هرمي ملاحظة:يقوم المستخدم بادخال العناصر
    1 نقطة
  15. نقوم بمعالجة البيانات قبل تمريرها للنموذج بعدة طرق منها التطبيع normalizing والتي تقوم بتطبيع القيم لوحدة محددة بإستخدام بيانات الصف (هنالك أيضاً StandardScaler والذي يتعامل مع البيانات بصورة عمودية). يتم تطبيق التطبيع في sklearn إما بإستخدام Normalizer أو preprocessing.normalize اللذان يعطيان نفس الناتج في حال تمرير نفس القيم لكليهما. والناتج يختلف حسب نوع التطبيع المطبق على البيانات و قد ينتج قيم أقل من صفر إذا كانت البيانات الممررة تحتوي على قيم سالبة، لاحظ المثال التالي: from sklearn.preprocessing import Normalizer X = [[4, 1, 2, 2], [-1, -3, -10, -3], [5, 7, 5, 1]] Normalizer(norm='l1').fit_transform(X) والذي ينتج: array([[ 0.44444444, 0.11111111, 0.22222222, 0.22222222], [-0.05882353, -0.17647059, -0.58823529, -0.17647059], [ 0.27777778, 0.38888889, 0.27777778, 0.05555556]]) وهي ايضاً نفس القيم الناتجة في حال إستخدام preprocessing.normalize: import sklearn sklearn.preprocessing.normalize(X, norm='l1') لابد أن تتذكر بالقيام بعمليات معالجة القيم المفقودة قبل مناداة الدالة لانها تنتج خطأ، راجع المثال التالي: from sklearn.preprocessing import Normalizer import numpy as np X = [[4, 1, 2, 2], [1, 3, np.nan, 3], [5, 7, 5, 1]] Normalizer().fit_transform(X) والذي يتنج عنه: ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
    1 نقطة
  16. قد تكون المشكلة في التعامل مع البيانات بنوع قوائم وليس مصفوفات وهي النوع التي تستقبل من قبل النموذج عند نداء الدالة fit، يمكنك تحويل بيانات التدريب و التحقق إلى مصفوفات بالطريقة التالية: import tensorflow.keras as keras train_x = np.asarray(train_x) train_y = np.asarray(train_y) validation_x = np.asarray(validation_x) validation_y = np.asarray(validation_y) أو قد يكون هذا الخطأ ناتج من التعامل مع المكتبات القديمة والتي تحتاج إلى ترفيع upgrade، مثلاً بدلاً من مناداة keras بالصورة: import keras والتي تتعامل مع keras الإصدار الأول له، يمكنك مناداة: import tensorflow.keras as keras والتي تتعامل مع الإصدار الثاني لكيراس. نفس الطريقة تنطبق على الدوال المستخدمة مثل sequence.
    1 نقطة
  17. الخطأ كما وضح @Ali Haidar Ahmad ناتج لإختلاف النسخ، بالإضافة للحل المقترح يمكنك تطبيق عمليات preprocessing على البيانات بإستخدام keras.preprocessing وبالتالي يحصل توحيد بين مصادر البيانات المختلفة، لاحظ المثال التالي والذي يقوم بإستخدام sequence من preprocessing والتعامل مع tensorflow.python.keras و keras مباشرة: from tensorflow.python.keras.layers import Dense,Embedding,LSTM from tensorflow.python.keras.models import Sequential from keras.preprocessing import sequence from keras.datasets import imdb from keras.optimizers import SGD max_features = 1000 maxlen = 20 batch_size = 64 (input_train, y_train), (input_test, y_test) = imdb.load_data(num_words=max_features) input_train = sequence.pad_sequences(input_train, maxlen=maxlen) input_test = sequence.pad_sequences(input_test, maxlen=maxlen) model =Sequential() model.add(Embedding(max_features, 64)) model.add(LSTM(16)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer=SGD(lr=0.01), loss='binary_crossentropy', metrics=['acc']) history = model.fit(input_train, y_train, epochs=2, batch_size=64, validation_split=0.2)
    1 نقطة
  18. تعد خدمات إدارة المستودعات للتحكم في الإصدار مكون رئيسي في سير عمل تطوير البرامج ، وضع GitHub و GitLab نفسيهما كمساعدين مفيدين للمطورين ، خاصة عند العمل في فرق كبيرة, وللحديث عن الاختلافات والتشابهات بين GitLab و GitHub ، نحتاج إلى النظر إلى ما وراء مستودعات الكود وإلقاء نظرة على العملية بأكملها, كلا من GitLab و GitHub عبارة عن مستودعات Git على شبكة الإنترنت ما هو مستودع Git؟ الهدف من Git هو إدارة مشاريع تطوير البرمجيات وملفاتها ، لأنها تتغير بمرور الوقت. يخزن Git هذه المعلومات في بنية بيانات تسمى المستودع, حيث يعتبر المستودع مكان مركزي يقوم المطورون بتخزين مشروعات الويب ومشاركتها واختبارها والتعاون فيها, أما بالنسبة للاختلافات الرئيسية وأوجه التشابه بين GitLab و GitHub, باستخدام GitLab ، يمكنك تعيين أذونات الأشخاص وتعديلها وفقا لأدوارهم. أما في GitHub ، يمكنك تحديد ما إذا كان شخص ما سيحصل على حق الوصول للقراءة أو الكتابة إلى المستودع, يوفر GitLab ، بالإضافة إلى GitHub ، أداة تعقب بسيطة للمشكلات تتيح لك تغيير الحالة والمسؤول عن مشكلات متعددة في نفس الوقت. أيضا عندما يتعلق الأمر بتصدير البيانات ، يبدو أن GitLab يقوم بعمل قوي جدا ، حيث يوفر لك القدرة على تصدير مشاريعك بالإضافة الى المزيد من البيانات عن المشروع، أما بالنسبة ل GitHub فهو أكثر تقييدا عندما يتعلق الأمر بميزات التصدير لمستودعات GitHub الحالية, بناء على هذه التشابهات والاختلافات يمكنك اختيار أحدهما, ولكن أنصحك ب GitHub لأنه لديه مجتمع كبير جدا وبالتالي من السهل حل المشاكل التي ربما تواجهك
    1 نقطة
  19. هل بإمكاني نقل دورتي هذي من هذا الحساب الى حسابي الاخر ؟
    1 نقطة
  20. بالنسبة للحجم نعم هناك قيود على gmail حيث لا يمكن أن تكون المرفقات أكبر من 25 ميجابايت. يمكنك القيام بماتطلبه من خلال الكود التالي باستخدام مكتبة django: #لمرفقات البريد الإلكتروني from django.core.mail import EmailMessage def attachment_email(request): email = EmailMessage( 'Hello', #subject: موضوع البريد الإلكتروني 'Body goes here', #body: النص الأساسي 'MyEmail@MyEmail.com', #from: عنوان المرسل ['SendTo@SendTo.com'], #to: قائمة أو مجموعة من عناوين المستلمين ['bcc@example.com'], #bcc: قائمة أو مجموعة من العناوين المستخدمة في عنوان "Bcc" عند إرسال البريد الإلكتروني reply_to=['other@example.com'], headers={'Message-ID': 'foo'}, ) email.attach_file('/my/path/file') email.send() تتم تهيئة الصف EmailMessage بالمعلمات التالية subject و body و from_email و to و bcc و connection و attachments و headers و cc و reply_to . جميع المعلمات اختيارية ويمكن ضبطها في أي وقت قبل استدعاء التابع send(). headers: قاموس من الرؤوس الإضافية لوضعها على الرسالة. المفاتيح هي اسم الرأس ، والقيم هي قيم الرأس. الأمر متروك للمتصل للتأكد من أن أسماء الرأس والقيم بالتنسيق الصحيح لرسالة بريد إلكتروني. السمة المقابلة هي extra_headers. أما reply_to: قائمة أو مجموعة من عناوين المستلمين المستخدمة في عنوان "اreply-to" عند إرسال البريد الإلكتروني. أيضاُ يمكنك أن تمرر له الوسيط attachments وهو قائمة المرفقات المراد وضعها مع الرسالة. هذا الكلاس لديه التابع attach_file() الذي ينشئ مرفقًا جديدًا باستخدام ملف من نظام الملفات الخاص بك. استدعها بمسار الملف المراد إرفاقه ، واختيارياً ، نوع MIME المراد استخدامه للمرفق. إذا تم حذف نوع MIME ، فسيتم تخمينه من اسم الملف. وأيضاً التابع send لإرسال الرسالة. وتدعم هذه المكتبة العديد من العمليات الأخرى أيضاً لذا يمكنك الذهاب إلى توثيق المكتبة والإطلاع عليها، سيكون ذلك مفيداً لك. يمكنك أيضاً القيام بذلك كالتالي: import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from os.path import basename def send_mail(send_from: str, subject: str, text: str, send_to: list, files= None): send_to= default_address if not send_to else send_to msg = MIMEMultipart() msg['From'] = send_from msg['To'] = ', '.join(send_to) msg['Subject'] = subject msg.attach(MIMEText(text)) for f in files or []: with open(f, "rb") as fil: ext = f.split('.')[-1:] attachedfile = MIMEApplication(fil.read(), _subtype = ext) attachedfile.add_header( 'content-disposition', 'attachment', filename=basename(f) ) msg.attach(attachedfile) smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587) smtp.starttls() smtp.login(username,password) smtp.sendmail(send_from, send_to, msg.as_string()) smtp.close() ولاستخدامه: username = 'my-address@gmail.com' # اسم المستخدم password = 'top-secret' # كلمة المرور default_address = ['my-address2@gmail.com'] # العنوان الافتراضي # إرسال الإيميل send_mail(send_from= username, subject="test", text="text", send_to= None, # المرسل إليه files=Path # مسار ملفاتك ) للاستخدام مع أي مزود بريد إلكتروني آخر ، ما عليك سوى تغيير تكوينات SMTP.
    1 نقطة
  21. اعتقد أنه يمكنك استخدام os.path.realpath كالتالي : import os dir_path = os.path.dirname(os.path.realpath(__file__))
    1 نقطة
  22. أولاً يجب أن تعلم أن أي كائن يمكننا المرور عليه بحلقة" looped over" هو كائن قابل للتكرار "iterable". على سبيل المثال ، كائن القائمة قابل للتكرار وكذلك كائن str. وللتأكد فيما إذا كان كائن ما قابل للتكرار في بايثون أم لا فهناك عدة طرق: أولها التابع __iter__ : s = 'Ali' if hasattr(s, '__iter__'): print(f'{s} is iterable') else: print(f'{s} is not iterable') # الخرج # Ali is iterable أو يمكنك تجربة __contains__ حيث تعتمد فكرتها على اختبار فيما إذا كان ال object يقبل المعامل in أو لا: hasattr(obj, '__contains__') # hasattr("adccads", '__contains__') True أو بنفس الفكرة مع التابع len: hasattr([8,2], "__len__") # True الطريقة الثانية هي بجعل مولد يحاول المرور على الكائن فإذا أخفق لن يكون قابل للتكرار : s="Ali" def iterable(a): try: (x for x in a) return True except TypeError: return False iterable(s) # True الطريقة الثالثة تعتمد على اختبار فيما إذا كان الكائن يمثل instance من الصف Iterable : from collections.abc import Iterable s = 'Ali' if isinstance(s, Iterable): print(f"{s} is iterable") else: print(f"{s} is not iterable") # Ali is iterable هناك طريقة أخرى خطرت لي وهي أن كل الكائنات القابلة للتكرار تمتلك التابع __getitem__ في ال dict الخاص بها: def is_attr(arg): return '__getitem__' in dir(arg) is_attr([5,8]) #True يمكنك أيضاً استخدام التابع iter لأنه في Python، المكرر هو أي كائن يدعم بروتوكول المكرر. جزء من هذا البروتوكول هو أن الكائن يجب أن يحتوي على طريقة __iter __ تقوم بإرجاع كائن المكرر لذالك أيضاً هنا نستطيع التحايل في استخدامها للاختبار : name = "ِAli" try: iter(name) print("{} is iterable".format(name)) except TypeError: print("{} is not iterable".format(name))
    1 نقطة
  23. السلام عليكم @Fahmy Mostafa حسب ما فهمت , إنك تريد طريقة لكيفية تشغيل السكربت الخاص بك من خلال ال terminal بغض النظر عن مكان وجوده ,إن كان كذلك الطريقة سهلة , أنشأ مجلد سيحتوي على سكربتات البايثون التي تريد ان تشغلها من اي مكان , فليكن الإسم myscript في المسار C:\Users\fahmy بعد ذلك ما سنقوم به هو إضافته كمسار عام من خلال الذهاب إلى جهاز الكمبيوتر ثم "Properties" ثم "Advanced system settings" ثم "Advanced" بعدها "Environment Variables" ثم قم بإختيار "Path" بعدها إضغط على زر "Edit" من النافذة التي ظهرت إضغط على زر "New" من الجزر الأيمن ثم نقوم بإضافة المسار الكامل إلى المجلد الذي قمنا بعمله مسبقاً أي هكذا C:\Users\fahmy\myscript بعدها إضغط تطبيق او موافق ثم أغلق اي واجهة اوامر او terminal كانت مفتوحة واعد تشغيل واجهة الأوامر مرة أخرى وجرب تشغيل السكربت الخاص بك من خلال الأمر مع اسم السكربت مثال test.py وسيعمل السكربت بدون مشاكل من اي مكان ,أما إن كان تريد معرفة مسار وجود ملف معين يمكنك إستخدام الأمر dir مع جزء او اسم الملف كاملاً هكذا وسيظهر لك الملف ومساره على جهاز الكمبيوتر dir script.py /s /p
    1 نقطة
  24. يمكنك أن تقوم بعمل دالة تقوم بالمرور على كل حرف من مدخلات المستخدم وتقوم هذه الدالة بإضافة علامة backslash \ قبل كل حرف أو رمز غير الحروف اللاتينية، وتوجد دالة تقوم بذلك بشكل إفتراضي في مكتبة re وهي دالة escape ويمكنك أن تستعمل الدالة كالتالي: userInput = input("Write a word: ") # Input: ^a.*$ escapedText = re.escape(userInput) # Output: \^a\.\*\$ ملاحظة عند طباعة المتغير escapedText ستكون النتيجة كالتالي: \\^a\\.\\*\\$ يتم إضافة علامة \ إضافية قبل كل علامة \، ويمكنك الإطلاع على هذه الإجابة لمعرفة سبب إضافة علامة backslash إضافية من هنا
    1 نقطة
  25. التفحص ب __iter__ يعمل على الأنواع المتسلسلة ولكنه سيفشل على سبيل المثال في السلاسل النصية في بايثون 2 ولكن لديك عدة حلول أخرى from __future__ import print_function # تجربة إذا كان الكائن قابل للتكرار try: some_object_iterator = iter(some_object) # طباعة نص إذا ظهر خطأ أن الكائن غير قابل للتكرار except TypeError as te: print(some_object, 'is not iterable') وايضا يمكنك تجربة تنفيذ حلقة كالآتي # تجربة حلقة في الكائن try: _ = (e for e in my_object) # طباعة نص عند ظهور خطأ أن الكائن غير قابل للتكرار except TypeError: print my_object, 'is not iterable'
    1 نقطة
  26. كما تم شرحه فيمكنك استخدام الوحدة os والحصول على متغيرات البيئة من environ ولكن هنا لديك الوصول الى متغيرات البيئة الخاصة بالنظام اما إذا اردت إنشاء متغيرات بيئة محلية تكون خاصة بمشروع بعينه فيمكنك استخدام حزمة python-decouple وتثبيتها $ pip install python-decouple وبعد تثبيت الحزمة قم بإنشاء ملف وقم بتسميته ب env. وضعه في المجلد الرئيسي أو جذر المشروع ومن ثم قم بإضافة متغيرات البيئة فيه على سبيل المثال USER=alex KEY=hfy92kadHgkk29fahjsu3j922v9sjwaucahf ملاحظة : تذكر إذا كنت تستخدم git فقم بوضع الملف في gitignore. والآن للوصول لمتغيرات البيئة المحلية في بايثون كالآتي from decouple import config # الحصول المتغير المحلي USER API_USERNAME = config('USER') # الحصول على المتغير المحلي KEY API_KEY = config('KEY')
    1 نقطة
  27. يوجد العديد من الطرق للتحقق من نوع أي كائن في بايثون: يمكنك أن تستعمل collections كالتالي: from collections.abc import Iterable if isinstance(myObj, Iterable): # myObj هو كائن قابل للتكرار else: # غير قابل للتكرار كما يمكن أن تستعمل جملة try ... except كالتالي: try: iterator = iter(myObj) except TypeError: # الكائن myObj غير قايل للتكرار else: # iterable كما يمكنك أن تستعمل الدالة iter كالتالي: try: iter(myObj) # في الغالب هذا الكائن قابل للتكرار except TypeError: print('not iterable') طريقة أخرى وهي إستعمال الدالة getatter للتحقق من وجود الخاصية __iter__ في الكائن والتي تكون موجودة في الكائنات القابلة للتكرار، كالتالي: if getattr(myObj, '__iter__', False): print("myObj is iterable") بالطبع يمكن عمل دالة isiterable لتقوم بتطبيق أي طريقة من الطرق السابقة وترجع قيمة منطقية Boolean
    1 نقطة
  28. تقدم بايثون عدة طرق للوصول إلى متغيرات البيئة: إستخدام مكتبة os كالتالي: import os print(os.environ['USERPROFILE']) # Output: C:\Users\sameh ولعرض كل متغيرات البيئة يمكنك طباعة القائمة بالكامل كالتالي: print(os.environ) كما يمكنك أن تستعمل التابع get للحصول على قيمة متغير بيئة معين، وفي حالة عدم وجودة سوف يتنم إعادة None بدلًا من إطلاق خطأ KeyError: print(os.environ.get('NOT_EXISTS')) # None يمكنك أن تستعمل الدالة getenv من مكتبة os للحصول على قيمة متغير بيئة أيضًا كالتالي: import os print(os.getenv('KEY_EXIST', default_value)) في حالة عدم وجود متغير البيئة سوف يتم إعادة القيمة الإفتراضية default_value وللتحقق من وجود متغير بيئة معين يمكنك أن تستخدم المعامل in كالتالي: 'USERPROFILE' in os.environ # True or False
    1 نقطة
  29. من خلال os.environ يمكنك الحصول على متغيرات البيئة من خلال import os print(os.environ['VARIABLE_NAME']) ويمكنك التحقق من وجود المتغير من خلال الشرط التالي 'VARIABLE_NAME' in os.environ حيث سيتم إرجاع true أو false على حسب وجود المتغير
    1 نقطة
  30. وأخيرا اقتنعت بفلسفة المصادر المفتوحة، أو أنك أخيرا وجدت الوقت للمُساهمة في أحدها، وربما ما دفعك إلى الأمر هو استفادتك من مشروع مفتوح المصدر وأردت أن ترد الجميل بالمساهمة فيه بدورك، لكن لا تدري كيف تقوم بذلك؟ الأمر بسيط، كل ما تحتاجه هو جهاز محلي يكون Git مُنصبا عليه، حساب على Github وبعض الوقت، ومن ثم اتباع بضع خُطوات بسيطة. تجدر الإشارة إلى أنك لا تحتاج إلى أن تكون مُبرمجا للمُساهمة في المشاريع مفتوحة المصدر، يُمكنك المُساهمة في إنشاء أو تحسين توثيق المشروع، حيث يُعتبر التوثيق الجيد أحد أهم عوامل نجاح المشاريع مفتوحة المصدر، وانتشار بعضها على حساب الآخر. لنفرض أن المشروع الذي تود المُساهمة فيه هو "git – الدّليل البسيط". 1. قم باستنساخ المشروع إلى حسابك الخاص وذلك بالنقر على زر Fork الموجود في الزاوية العُلوية اليُمنى لصفحة المشروع. هذه العملية من شأنها أن تُنشئ نُسخة مُطابقة للمُستودع الأصلي على حسابك على Github. 2. بعد ذلك قم باستنساخ هذا المُستودع الجديد على جهازك المحلي. ادخل إلى المجلد الذي تود استنساخ المُجلد فيه (cd path/to/folder) وقم بتنفيذ الأمر git clone متبوعا بعُنوان المُستودع. ستجد العُنوان أسفل القائمة اليُمنى في صفحة المُستودع. بالنسبة لي سيكون الأمر على النحو التالي: git clone https://github.com/djug/simple-guide.git 3. الآن وبعد أن حصلت على هذه النُسخة، قم بإدخال التعديلات التي ترغب فيها واحفظ تلك التعديلات. قبل أن نقوم بإيداع تلك التعديلات، يُنصح دائما التحقق من حالة المُستودع، وإن تم أخذ التعديلات بالحسبان أو إن قمنا بتعديل ملف لم نكن نرغب في تعديله، حيث يكفي أن ننفذ الأمر git status لمعرفة حالة المُستودع (النسخة المحلية): git status On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: index.ar.html4. تبدو الأمور طبيعية. لنقم بإرسال التغييرات إلى منطقة الإدراج: git add .ومن ثم إيداعها (commit): git commit -m "Your commit Message Here"بطبيعة الحال ستحتاج إلى وضع وصف مُناسب للتغييرات التي قمت بها. بإمكانك أيضا تنفيذ الأمر commit لوحده من دون أية رسائل: git commitوسيقوم git بفتح مُحرر النصوص المُفضل لديك لكتابة الوصف (في حال ما إذا قمت بتحديد اسم هذا المُحرر في إعدادات git). سنحتاج الآن إلى إرسال هذه التغييرات إلى المُستودع (الشخصي وليس مُستودع المشروع الذي نشارك فيه) على Github عبر تنفيذ الأمر: git push origin masterسيطلب منك Git اسم المُستخدم الخاص بك على Github وكلمة السر، وبمُجرد أن يتم التحقق منهما سيتم دفع التغييرات إلى مُستودعك الخاص. 5. الآن لو عدنا إلى صفحة المُستودع الشخصي على Github سيظهر لنا تاريخ آخر تحديث للملفات المُعدلة ووصف له. وكل ما نحتاج إلى فعله الآن هو إرسال "طلب سحب" pull request -أي سحب التغيرات- إلى المُستودع الأصلي للمشروع وذلك بالنقر على الزر الأخضر الذي يظهر في الزاوية العُلوية اليُمنى للمُستودع ستظهر لك صفحة لتلخص من جديد التغييرات التي تمت 6. الخطوة الأخيرة هي النقر على زر Create Pull request، إضافة أية تعليقات ترغب فيها على الطلب، ومن ثم النقر على زر Send pull request: ستصل صاحب المشروع رسالة بخصوص التغييرات التي قمت بها، وفي حال قبولها سيصلك إشعار بها وستظهر تغييراتك على المستودع الأصلي: هذا كل ما في الأمر. أنت الآن بطريق… أقصد مُشارك في مشاريع مفتوحة المصدر بشكل رسمي. نصائح عامة لدى المساهمة في المشاريعاجعل نص الإيداع commit معبّرا أو ملخصا للتغيرات التي قمت بها، لا تجعله مبهما أو عاما.افصل طلبات السحب "pull request" حسب الغرض، أو اجعل لكل تغير تقترحه في branch لوحده حسب الغرض، مثال: لا ترسل طلب سحب يحتوي تغيرات مرئية في الـ html و css وفيه أيضا ترجمة النصوص إلى العربية، هكذا تصعب المهمة على من يقوم بعملية الدمج في حال كان يريد قبول الترجمة لكنه غير راض عن التغيرات التي طرأت في الـ html/css. في هذه الحالة سيكون من الأنسب:طلب سحب للتغيرات المرئية لوحده.طلب سحب آخر للملفات الترجمة إلى العربية.في حال كانت مساهمتك تحل علة ما تم التبليغ عنها في قسم الـ issues في مستودع المشروع على github، أو لها علاقة به، فإنه يمكنك الإشارة إلى تلك العلة في نص الإيداع فقط بوضع رقم العلة مسبوقا بعلامة #، مثال:git commit -m "fix for some bug (issue #23)"ستلاحظ عند زيارة واجهة Github أن الرقم 23# في نص الإيداع، قد أصبح رابطا يحول مباشرة إلى صفحة تلك العلة. في حال قمت بعمل Fork وساهمت في المشروع، وأردت مرة أخرى أن تساهم في ذاك المشروع مجددا، فلا تنس أن تجعل مستودعك الشخصي من ذاك المشروع محدّثا، يعني اجلب التغيرات الجديدة التي طرأت على المستودع الأصلي، قبل المساهمة مجددا وعمل أي commit أو pull request، هذا يخفض من نسبة التعارض conflicts، ويسهّل عليك وعلى القائمين على المشروع عمليات الدمج، قد تكون التغيرات التي قمت بها، قد قام بها آخر، أو ربما تم حذف الملف الذي تعمل عليه أصلا من المشروع الأصلي، فيضيع جهدك هباءا منثورا.من المحبذ أيضا، استعمال صيغة الأمر في نص الإيداع، مثال، استعمل "add something to file x" عوض "adding|added something to file x".
    1 نقطة
×
×
  • أضف...