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

سامح أشرف

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

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

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

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

    56

كل منشورات العضو سامح أشرف

  1. يحدث هذا الأمر لأن التابع collidepoint يستخدم في الأساس للتحقق مما إذا كانت نقطة معينة موجودة داخل مربع الشكل ، فعلى سبيل المثال، النقط الزرقاء في الشكل التالي تقوم بإرجاع True بينما النقط الخضراء تقوم بإرجاع False لأنها خارج مربع الشكل: ويستخدم هذا التابع في حالة أردت حدوث شيء ما عندما يكون مؤشر الفأرة قريب من الشكل على سبيل المثال، ويقترح توثيق pygame الرسمي أن تستعمل التابع clipline والذي يقوم بالتأكد من وجود خط كامل داخل الشكل.
  2. لتعلم برمجة تطبيقات الهواتف الذكية يجب عليك تحديد نظام التشغيل الذي ستقوم بإنشاء التطبيقات له (أندرويد أم iOS أم كلاهما معًا)، ولكل من الإختيارات الثلاثة السابقة لها لغات وتقنيات خاصة بها، كالتالي: أندرويد: ستحتاج إلى تعلم لغة مثل Java أو Kotlin لإنشاء تطبيقات أندرويد، وكذلك ستحتاج حساب مطور في متجر جوجل للتطبيقات (إن كنت تريد نشر تطبيقاتك في متجر Play) والذي يكلف 25$ تدفع مرة واحدة. iOS: اللغة الأكثر إستعمالًا لعمل تطبيقات iOS هي Swift ويمكنك أن تستعمل لغة object-c أيضًا، ولرفع تطبيقك على apple store ستحتاج إلى إنشاء حساب مطور بتكلفة 99$ سنويًا. Cross Platform: تطبيقات متعددة المنصات، أي أنه يمكنك أن تقوم بإنشاء تطبيق بلغة معينة وإطار عمل معين ومن ثم إستخدام التطبيق على كلا المنصتين (Android و iOS) وهذا الأمر يقلل تكلفة إنشاء التطبيقات، لأنك سوف تكتب كود واحد فقط، وسوف يعمل على كلا النظامين. تتزايد شعبية Flutter وReact Native حاليًا في إنشاء تطبيقات cross platform كما يمكنك أن تقوم بإنشاء تطبيقات هجينة عبر تقنيات الويب من خلال إستخدام لغات مثل HTML, CSS, Javascript وهي نوع من أنواع cross platform أي أنك تكتب كود واحد ويعمل على أكثر من نظام تشغيل، ويستخدم إطار العمل Cordova كثيرًا في هذا المجال. يمكنك التعرف أكثر حول الفرق بين أنواع التطبيقات من خلال هذا الفيديو: كما تحتوي الأكاديمية على الكثير من المقالات في كل مجال من المجالات السابقة، مثل مقالات حول لغة Java، ولغة kotlin، وبرمجة الأندرويد بشكل عام. أما بالنسبة للأمن السيبراني cyber security فسوف تحتاج إلى تعلم كل أساسيات البرمجة وكيفية إستخدام لغات مثل Python لإنشاء الأداوات المناسبة التي سوف تساعدك في إختبار الإختراق، كما أنه عليك تحديد المجال الذي تريد التخصص فيه (إختبار إختراق المواقع، أو أنظمة التشغيل أم إختبار إختراق شبكات .. إلخ)، بعد ذلك عليك دراسة كيف تعمل الأهداف التي تحاول حمايتها (مواقع، برامج، تطبيقات، ألعاب .. إلخ) حسب المجال الذي حددته. عليك أيضًا تعلم كيفية إستخدام نظام التشغيل Linux حيث أنه النظام الأكثر إستعمالًا في إختبار الإختراق، وأغلب خوادم الويب والشركات الكبيرة في العالم تستخدمه. تحتوي الأكاديمية على بعض الكتب التي قد تساعدك كثيرًا في مرحلة التعلم، مثل كتاب "البرمجة بلغة بايثون" و كتاب "دليل إدارة خواديم أوبنتو" (في حالة أردت أن تتخصص في مجال الويب)، بالإضافة إلى كثير من المواضيع المتقدمة في شكل مقالات في لغة Python.
  3. لا تحتوي الأكاديمية على دورة مخصصة للأمن الإلكتروني أو Cyber Security، ولكن تحتوي على الدورات الأساسية في عالم البرمجة مثل دورة علوم الحاسوب التي يجب على أي مهتم بالأمن الإلكتروني الإلمام بها، حيث أن الدورة تبدأ من أساسيات الحاسوب وعلومه والتفكير المنطقي وما هي الخوارزميات وهياكل البيانات Data Structure، وأساسيات لغة البرمجة JavaScript وتطبيق المفاهيم التي تم شرحها باستخدامها، والتوسع في شرح التطبيقات العملية للغات البرمجة، وأساسيات أنظمة التشغيل المختلفة، وأساسيات سطر الأوامر في نظام لينكس، وشرح تفصيلي للغة SQL للتعامل مع قواعد البيانات من نوع Relational Database، وأنظمة قواعد البيانات NoSQL، ومفاهيم أساسية في الشبكات والخوادم، بالإضافة إلى تعلم لغة Python وتطبيق المفاهيم البرمجية المتقدمة من خلالها، وفي النهاية مبادئ الحماية والأمان في الويب. يمكنك أن تقرأ أكثر حول هذه الدورة من خلال الصفحة المخصصة لها من هنا (دوة علوم الحاسوب).
  4. يمكنك أن تستخدم نفس الطريقة من خلال تمرير معامل ثالث إلى اللون، كالتالي: import pygame def draw_rect_alpha(surface, color, rect): shape_surf = pygame.Surface(pygame.Rect(rect).size, pygame.SRCALPHA) pygame.draw.rect(shape_surf, color, shape_surf.get_rect()) surface.blit(shape_surf, rect) def draw_circle_alpha(surface, color, center, radius): target_rect = pygame.Rect(center, (0, 0)).inflate((radius * 2, radius * 2)) shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA) pygame.draw.circle(shape_surf, color, (radius, radius), radius) surface.blit(shape_surf, target_rect) def draw_polygon_alpha(surface, color, points): lx, ly = zip(*points) min_x, min_y, max_x, max_y = min(lx), min(ly), max(lx), max(ly) target_rect = pygame.Rect(min_x, min_y, max_x - min_x, max_y - min_y) shape_surf = pygame.Surface(target_rect.size, pygame.SRCALPHA) pygame.draw.polygon(shape_surf, color, [(x - min_x, y - min_y) for x, y in points]) surface.blit(shape_surf, target_rect) pygame.init() window = pygame.display.set_mode((250, 250)) window.fill((255, 255, 255)) # نقوم بتحديد الألوان هنا # يمكنك تغير رقم 127 لكي تغير الشفافية YELLOW = (255, 255, 0, 127) BLUE = (0, 0, 255, 127) RED = (255, 0, 0, 127) draw_rect_alpha(window, BLUE, (55, 90, 140, 140)) draw_circle_alpha(window, RED, (150, 100), 80) draw_polygon_alpha(window, YELLOW, [(100, 10), (100 + 0.8660 * 90, 145), (100 - 0.8660 * 90, 145)]) في الكود السابق ثلاث دوال كل منها تقوم برسم شكل معين، وتأخذ إحداثيات مكانه ولونه وحجمه.
  5. يمكنك أن تستعمل التابع exclude كالتالي: User.objects.exclude(nickName__isnull = True) إذا كنت بحاجة إلى استبعاد القيم الفارغة أيضًا، فبإمكانك القيام بذلك من خلال تجميع الشروط معًا مثل: User.objects.exclude(nickName__exact = "").exclude(nickName__isnull = True) في الكود السابق سوف يتم إستبعاد كل القيم الفارغة أو التي تساوي Null يمكنك أيضًا أن تستعمل التابع Filter كالتالي: User.objects.filter(nickName__isnull = False, nickName__gt = "") يقوم الكود السابق بنفس الشيء وستحصل على نفس النتيجة
  6. يمكنك أن تتحكم في الشفافية الخاصة بلون أي خط من خلال تمرير قيمة Alpha كعنصر ثالث عند كتابة لون الخط، كالتالي: import pygame pygame.init() # تحديد خصائص النافذة size = [600, 600] screen = pygame.display.set_mode(size) screen.fill((255, 255, 255)) vertical_line = pygame.Surface((100, 600), pygame.SRCALPHA) vertical_line.fill((0, 0, 255, 50)) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 screen.blit(vertical_line, (0, 0)) horizontal_line = pygame.Surface((600, 100), pygame.SRCALPHA) horizontal_line.fill((255, 0, 0, 50)) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 screen.blit(horizontal_line, (0, 0)) يقوم الكود السابق بعمل خطين أحدهما أحمر والثاني أزرق وعندما يتلاقى الخطين (في أعلى اليسار) ستجد مربع لونه بنفسجي، كما في الصورة: أو يمكنك أن تستعمل التابع set_alpha أيضًا للحصول على نفس النتيجة كالتالي: vertical_line = pygame.Surface((100, 600), pygame.SRCALPHA) vertical_line.set_alpha(50) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 vertical_line.fill((0, 0, 255)) screen.blit(vertical_line, (0, 0)) horizontal_line = pygame.Surface((600, 100), pygame.SRCALPHA) horizontal_line.set_alpha(50) # يمكنك أن تقوم بتغير رقم 50 إلى أي رقم بين 0 و 255 horizontal_line.fill((255, 0, 0)) screen.blit(horizontal_line, (0, 0)) الأمثلة السابقة للتوضيح وبالتأكيد سوف تحتاج إلى حلقة لكي لا تغلق النافذة تلقائيًا. مكتبة Pygame ليست معدة لعمل تطبيقات أندرويد بل لعمل الألعاب البسيطة على أنظمة التشغيل الخاصة بالحسوب مثل Windows و Linux و MacOS، كما أنه لا ينصح إستعمال لغة Python على العموم في عمل تطبيقات الهاتف، حيث أن هناك تقنيات أخرى أفصل وأسهل ومعدة خصيصًا لهذا الأمر مثل Flutter أو React Native أو حتى إستعمال لغات مثل Java و Swift لعمل تطبيقات أندرويد و iOS ، لكن هذا لا يمنع أنه يمكن إستخدام لغة بايثون لعمل تطبيقات الأندرويد، حيث يمكن إستعمال مكتبات مثل Kivy (التي تدعم شاشات اللمس، وتعدد الأصابع على الشاشة) لعمل تطبيقات أندرويد. نعم، يمكنك أن تستعمل مكتبات مثل arabic-reshaper للكتابة باللغة العربية في نافذة Pygame، أولًا يجب أن تقوم بتثبيت المكتبة عبر الأمر التالي: pip install --upgrade arabic-reshaper وإن كنت تستعمل anaconda فيمكنك أن تستعمل الأمر: conda install -c mpcabd arabic-reshaper بعد تثبيت المكتبة يجب أن تقوم بتثبيت حزمة python-bidi أيضًا من خلال الأمر التالي: pip install python-bidi وأخيرًا ستحتاج إلى خط يدعم العربية مثل خط Cairo ويمكنك تحميله من خلال خطوط جوجل من هنا، وفي النهاية يجب أن تقوم بتمرير النص إلى التابع reshape من مكتبة arabic-reshaper ثم يجب تمرير النتيجة إلى الدالة get_display من حزمة python-bidi وأخيرًا تستطيع عرض النص في النافذة: import pygame import arabic_reshaper from bidi.algorithm import get_display pygame.display.init() pygame.font.init() win = pygame.display.set_mode((500, 500)) font = pygame.font.Font('Cairo-Regular.ttf', 20) # اسم ومسار الخط وحجم الخط # هنا النص الذي ترغب بعرضه text_to_be_reshaped = 'نص باللغة العربية' # عملية تحويل النص reshaped_text = arabic_reshaper.reshape(text_to_be_reshaped) bidi_text = get_display(reshaped_text) print(reshaped_text) text = font.render(bidi_text, True, (255, 255, 255)) win.fill((0, 0, 0)) win.blit(text, (0, 0)) النتيجة:
  7. يبدو أنك تستعمل إصدار قديم نوعًا ما من مدير الحزم pip، لذلك لا يتم تحديث مطلبات Django أيضًا، ولحل هذه المشكلة يجب عليك أولًا تحديث pip عبر الأمر التالي: pip install --upgrade pip وإن كنت تستعمل ويندوز فيمكنك أن تستعمل الأمر التالي: python -m pip install --upgrade pip بعد ذلك يمكنك تحديث كل الحزم من خلال الأمر التالي: pip install -r requirements.txt --upgrade وإن أردت تحديث حزمة Django فقط (وإعتماديات الحزمة dependencies) ففي الإصدار الحديث من pip يقوم بذلك تلقائيًا عبر الأمر التالي: pip install Django --upgrade أما إن لم تكن ترغب في تحديث الإعتماديات فيمكنك أن تضيف العلم --upgrade-strategy إلى الأمر الأخير، ولكن لا ينصح بعمل هذا الأمر لأنه قد يسبب الكثير من المشاكل لاحقًا.
  8. تقوم الخاصية related_name بتحديد اسم العلاقة العكسية بين النموذج Answer و النموذج Question، وإذا لم تقم بتحديد هذه الخاصية سوف يقوم Django بتوليد اسم من خلال إضافة _set إلى اسم النموذج لتصبح النتيجة Answer.question_set على سبيل المثال، إذا كان لديك كائن مستخدم first_answer، فيمكنك استخدام first_answer.questions.all () للحصول على جميع مثيلات نموذج السؤال التي لها علاقة بالسؤال الأول. بالطبع بإمكانك إستخدامه بعده أشكال كعادة باقي العلاقات العادية: q = answer.questions.all().order_by('-creation_time')
  9. في لغة SQL يُعد هذا هو السلوك الذي يجب اعتماده عند حذف الكائن المشار إليه. وهذه ليست خاصة في Django نفسه. بل هو جزء من SQL. يتم استخدام on_delete لإخبار Django بما يجب فعله مع النموذج التي تعتمد على كائنات أخرى الذي قمت بحذفه. (على سبيل المثال، علاقة ForeignKey)، مثلًا المنشور الواحد في مدونة ما قد يكون له علاقة ForeignKey مع جدول comments لعرض التعليقات الخاصة بمنشور معين، وهذه الخاصية هي التي تحدد ما الذي سيحدث في حالة حذف المنشور، هل سيتم حذف التعليقات أم إبقائها أم ربما تريد إظهار خطأ يمنعك من حذف أي منشور لديه تعليقات عن طريق الخطأ. وهناك سبعة إجراءات يمكن اتخاذها عند وقوع مثل هذا الحدث (أي عند حذف كائن من جدول ما): CASCADE: عند حذف الكائن المشار إليه، احذف أيضًا الكائنات التي لها مراجع (عندما تقوم بإزالة منشور من مدونة ما على سبيل المثال، قد ترغب في حذف التعليقات الخاصة بهذا المنشور أيضًا).في لغة SQL يتم إستعمال كلمة CASCADE PROTECT: منع حذف الكائن المشار إليه (إن كان هناك أي إشارات له من كائنات أخرى). ولحذفه، سيتعين عليك حذف جميع الكائنات التي تشير إليه يدويًا، في لغة SQL يتم إستعمال كلمة RESTRICT RESTRICT: (تم إضافتها في الإصدار 3.1 من Django)، تشبه الخيار السابق، ولكنها تتبع معيار لغة SQL بشكل أدق، وفي حالة حدوث خطأ يتم عرض خطأ من نوع RestrictedError ، بخلاف PROTECT، تسمح بحذف الكائن المشار إليه إذا كان يشير أيضًا إلى كائن مختلف يتم حذفه في نفس العملية، ولكن عبر علاقة CASCADE. SET_NULL: يتم تعيّن المرجع إلى NULL (يتطلب أن يكون الحقل nullable أي أن قيمة null تساوي True). على سبيل المثال، عندما تحذف مستخدمًا، قد ترغب في الاحتفاظ بالتعليقات التي نشرها في منشورات المدونة، ويتم عرض التعليقات من قِبل مستخدم مجهول أو تم حذفه. في لغة SQL يتم إستعمال كلمة SET NULL SET_DEFAULT: يقوم بتعيين القيمة الافتراضية default. في لغة SQL يتم إستعمال كلمة SET DEFAULT SET(): تقوم بتعيين قيمة معينة. هذا ليس جزءًا من معيار SQL ويتم التعامل معه بالكامل بواسطة Django فقط، وهنا مثال لكيفية إستخدامها من توثيق Django الرسمي: from django.conf import settings from django.contrib.auth import get_user_model from django.db import models def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), ) DO_NOTHING: يتم إستخدامها للإشارة إلى كائن غير موجود بالفعل، وقد تسبب الكثير من المشاكل في قاعدة البيانات مما ينتج عنه مشاكل وأخطاء تظهر للمستخدمين، في لغة SQL يتم إستعمال NO ACTION يمكنك الوصول إلى توثيق كل الخيارات السابقة في وثائق Django من هنا. في أغلب الحالات، CASCADE هو الخيار الأكثر إستخدامًا، ولكن بالنسبة لكل مفتاح ForeignKey، يجب أن تسأل نفسك دائمًا ما هو السلوك المتوقع في هذا الموقف. أحيانًا ما يكون PROTECT و SET_NULL مفيدًا في بعض الحالات. تحتوي الأكاديمية على مقالة (النماذج Models والاستعلام عن البيانات في Django) تمكنك من تجهيز وإعداد نماذج في Django وتتضمن أيضًا عمل علاقة ForeignKey بين النماذج.
  10. يمكنك الحصول على أي Query Parameter من خلال التابع get كالتالي: // URL: localhost:8000/posts?id=123 request.GET.get('id', '1') # Output: 123 يتم تمرير اسم الـ Parameter إلى التابع get والقيمة الثانية هي القيمة الإفتراضية التي سوف يتم إستخدامها في حالة لم يتم إيجاد اي parameter باسم id. على العموم إن كنت تريد إستخدام regex، فيمكنك أن تستخدم re_path كالتالي: from django.urls import path, re_path from . import views urlpatterns = [ path('posts/2003/', views.special_case_2003), re_path(r'^posts/(?P<year>[0-9]{4})/$', views.year_archive), ] وعليك أن تقوم بتجهيز views.py كالتالي: def post_page(request, year): # Rest of the method
  11. بإمكانك قراءة توثيق أي مكتبة من خلال الدالة help والتي قد تساعدك كثيرًا في فهم كيفية عمل المكتبة من خلال توثيق مكتوب باللغة الإنجليزية، مما يعطيك لمحة حول الدوال والمتغيرات والأصناف الموجودة في هذه المكتبة، يمكنك أن تقوم بإستخدام الدالة help كالتالي: >>> help('numpy') Help on package numpy: NAME numpy DESCRIPTION NumPy ===== Provides 1. An array object of arbitrary homogeneous items 2. Fast mathematical operations over arrays 3. Linear Algebra, Fourier Transforms, Random Number Generation How to use the documentation ---------------------------- Documentation is available in two forms: docstrings provided with the code, and a loose standing reference guide, available from `the NumPy homepage <https://www.scipy.org>`_. We recommend exploring the docstrings using `IPython <https://ipython.org>`_, an advanced Python shell with TAB-completion and introspection capabilities. See below for further instructions. The docstring examples assume that `numpy` has been imported as `np`:: >>> import numpy as np -- More -- لاحظ أن توثيق أغلب المكتبات كبير للغاية لذلك يتم عرض جزء صغير فقط ويمكنك أن تقوم بعرض المزيد من خلال الضغط على Enter. كما يمكنك أن تستعمل نفس الدالة لقراءة توثيق دالة ميعنة أو صنف معين من خلال كتابة اسم المكتبة ثم اسم الدالة أو الصنف ويفصلهما نقطة، كالتالي: >>> help('numpy.array') Help on built-in function array in numpy: numpy.array = array(...) array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None) Create an array. Parameters ---------- object : array_like An array, any object exposing the array interface, an object whose __array__ method returns an array, or any (nested) sequence. dtype : data-type, optional The desired data-type for the array. If not given, then the type will be determined as the minimum type required to hold the objects in the sequence. copy : bool, optional If true (default), then the object is copied. Otherwise, a copy will only be made if __array__ returns a copy, if obj is a nested sequence, or if a copy is needed to satisfy any of the other requirements (`dtype`, `order`, etc.). order : {'K', 'A', 'C', 'F'}, optional Specify the memory layout of the array. If object is not an array, the newly created array will be in C order (row major) unless 'F' is specified, in which case it will be in Fortran order (column major). If object is an array the following holds. ===== ========= =================================================== -- More -- للخروج من التوثيق يمكنك الضغط على q أو Ctrl + c فقط. ولطباعة محتوى مكتبة معينة يمكنك أن تستعمل دالة open والتابع __file__ لقراءة ملفات المكتبة ثم طبعاتها، كالتالي: >>> import flask >>> f = open(flask.json.__file__, 'r') >>> content = f.read() >>> print(content) بالتأكيد فتح ملفات المكتبة وتصفحها سيكون أفضل وأسهل وأكثر عملية، ويمكنك الحصول على مسار أي مكتبة من خلال التابع __file__ أيضًا كالتالي: >>> flask.__file__ 'C:\\Python38\\lib\\site-packages\\flask\\__init__.py'
  12. إذا أردت عرض سهم جانبي عندما تقوم بالتحرك إلى الأعلى (عند قراءة الرسائل القديمة)، فيمكنك أن تقوم بذلك من خلال التابع scroll كالتالي: var div = $('#div1') $(window).scroll(function() { // إذا كان موضعنا في الصفحة فوق نهاية العنصر div if (div.prop("scrollHeight") > window.scrollY) { $('#toBottom').fadeIn(); } else { $('#toBottom').fadeOut(); } })
  13. يحتاج Laravel مجموعة من المتطلبات لكي يعمل بشكل سليم، ومن ضمنها تثبيت وإعداد mbstring extension لتعمل مع php، ويمكنك أن تتأكد من تثبيتها من خلال الأمر التالي: php -m | grep mb إذا لم تظهر mbstring، فيجب أن تقوم بتثبيتها من خلال الأمر التالي: sudo apt-get install php-mbstring أما إذا ظهرا في نتيجة الأمر الأول، فيجب أن تقوم بتعديل ملف php.ini لكي تقوم بتشغيل الإضافة، وذلك من خلال البحث عن كلمة mbstring في ملف php.ini ومن المفترض أن تجدها بالشكل التالي لكي تعمل: extension=mbstring ملاحظة في حالة كان السطر يبدأ بـفاصلة منقوطة ; فيجب حذف هذه العلامة لكي تعمل الإضافة. في حالة لم يكن بإمكانك تنفيذ الأوامر على الإستضافة الحالة فيجب عليك التواصل مع مقدم خدمة الإستضافة لكي يقوم بتفعيل هذه الإضافة. يمكنك الإطلاع على هذه المقالة من هنا (تثبيت Laravel وإعداده على Windows وUbuntu) لمعرفة كل متطلبات Laravel لكي يعمل بشكل سليم.
  14. يمكنك أن تقوم تحويل محتوى أي ملف من خلال bytearray كالتالي: >>> path = "C:\\Users\\sameh\\OneDrive\\Desktop\\image.png" # مسار أي ملف >>> file = open(path, mode='rb') >>> content = file.read() >>> allBytes = bytearray(content) >>> eightBytes = [ allBytes[i:i+8] for i in range(0, len(allBytes), 8) ] >>> binaryList = [] >>> for chunk in eightBytes: ... eightBytesChunk = '' ... for i in chunk: ... eightBytesChunk += bin(i)[2:].zfill(8) ... binaryList.append(eightBytesChunk) >>> binaryList ['1000100101010000010011100100011100001101000010100001101000001010', '0000000000000000000000000000110101001001010010000100010001010010', '0000000000000000000000111000010000000000000000000000001001010001', '0000100000000110000000000000000000000000000111011100101001111001', '0001001100000000000000001000000000000000010010010100010001000001', '0101010001111000110110101110110010111101100001110111101100011011', '1101100101110101111111101111111111111101011001110111111010001001' .... ] لاحظ أنه يجب قراءة الملف بوضع rb (read binary) في الدالة open ولإعادة كتابة كود الـ binary إلى ملف جديد يمكنك أن تقوم بالتالي: >>> # نقوم بتقسيم كل أكواد Binary إلى Bytes >>> finalBinary = [] >>> lst = [] >>> for i in binaryList: ... lst.append([ i[x:x+8] for x in range(0, len(i), 8) ]) ... >>> for i in lst: ... for j in i: ... finalBinary.append(j) ... >>> finalBinary[0] '10001001' >>> # الدالة التالية تقوم بكتابة أرقم الـ Binary في ملف جديد >>> def writer(stuff): ... blob = int(stuff, 2).to_bytes(1, byteorder='big') ... with open("C:\\Users\\sameh\\OneDrive\\Desktop\\image2.png", "a+b") as file: ... file.write(blob) ... >>> for strings in finalBinary: ... writer(strings) >>> بالطبع هذه الطريقة ليست عملية في نسخ الملفات لأنها تستغرق الكثير من الوقت، وفي الحالات العادية نستخدم المكتبات مجهزة مسبقًا لنسخ الملفات مثل دالة copyfile في حزمة shutil
  15. يمكن تقسيم المصفوفة بعد عملية التحويل إلى 8 Byte كالتالي: _8_bytes = [binary_list[x:x+8] for x in range(0, len(binary_list), 8)] أو يمكن تقسيم النص من البداية إلى قائمة list من النصوص والمرور على كل جزء على حدى كالتالي: >>> string = 'hello world' >>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ] >>> list_of_string ['hello wo', 'rld'] >>> for item in list_of_string: ... print([format(ord(x), 'b') for x in item]) ... ['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111'] ['1110010', '1101100', '1100100'] بعد ذلك يمكنك أن تقوم بجمع عناصر القائمة الناتجة في النهاية لتكون على شكل نص، كالتالي: >>> string = 'hello world' >>> list_of_string = [ string[i:i+8] for i in range(0, len(string), 8) ] >>> list_of_string ['hello wo', 'rld'] >>> for item in list_of_string: ... print("".join([format(ord(x), 'b') for x in item])) ... 1101000110010111011001101100110111110000011101111101111 111001011011001100100
  16. يمكن تحويل النص إلى قائمة من أرقام Binary من خلال تحويل كل حرف إلى رقم ascii عبر دالة ord وإستخدام دالة format لتحويل هذا الرقم إلى كود ثنائي Binary كالتالي: >>> string = "hello world" >>> binary_list = [format(ord(x), 'b') for x in string] >>> binary_list ['1101000', '1100101', '1101100', '1101100', '1101111', '100000', '1110111', '1101111', '1110010', '1101100', '1100100'] ولإعادة تحويل القائمة السابقة إلى نص مرة أخرى يمكن أن تقوم بالتالي: >>> ascii_string = "" # هنا سيتم تخزين النص النهائي >>> for binary_value in binary_list: ... an_integer = int(binary_value, 2) # تحويل كود Binary إلى النظام العشري (ascii code) ... ascii_character = chr(an_integer) # تحويل الحرف من ascii code إلى حرف نصي string ... ascii_string += ascii_character # إضافة الحرف إلى المتغير الأساسي ... >>> print(ascii_string) hello world
  17. لإيقاف تشغيل قيد مفتاح foreign key بشكل عام، يمكن القيام بالتالي: SET FOREIGN_KEY_CHECKS=0; ولإعادة تشغيله، كل ما عليك فعله هو تغير القيمة إلى 1، لتصبح الجملة كالتالي: SET FOREIGN_KEY_CHECKS=1; لاحظ أن هذا التغير يؤثر فقط على الجلسة الحالية session ولا يؤثر على MySQL بشكل عام، ولتغير هذا الأمر يمكنك أن تضيف كلمة GLOBAL بعد كلمة SET وسوف يتم تطبيق هذا التغير على الجلسة الحالية وكل الجلسات المستقبلية. ملاحظة هامة: يجب عليك القيام بذلك فقط عندما تقوم بوضع صيانة maintenance mode. لأنه قد يؤدي إلى عدم تناسق البيانات، وبالتالي ظهور أخطاء عند زيارة الموقع في وضع الإطلاق deployment mode.
  18. يمكنك أن تقوم بزيادة عدد الإعجاب بقيمة واحد عند إتمام الطلب إلى الخادم، كالتالي: this.setState((prevState, props) => ({ likes: prevState.likes + 1 })); وبالتالي يوف يزداد عدد الإعجابات في الصفحة دون الحاجة إلى إعادة تحديث الصفحة.
  19. يبدو أن تحاول أن تقوم بفتح ملف مضغوط داخل برنامج Adobe illustrator، وبالطبع البرنامج لا يدعم فتح الملفات المضغوط، ويجب عليك أن تقوم أولًا بإستخرج الملفات من الملف المضغوط من خلال براج مثل Winrar أو 7-zip. بعد إتمام عملية الإستخراج ستجد الصور التي يمكن لبرنامج Adobe illustrator التعامل معها. قد لا تحتوي الملفات على الملف المصدري للصورة (ملف بصيغة ai او EPS)، وبدلًا من ذلك سيكون هناك اللمف النهائي للمشروع (صورة بصيغة png أو jpg .. إلخ)، وذلك على حسب الصورة المرفوعة علىموقع Freepik، فليست كل الصور تحتوي على الملف المصدري للمشروع.
  20. بالتأكيد حجم المنافسة على الكلمات يُعد عاملًا مهمًا، حيث أن الكلمات التي لديها منافسة كبيرة سيكون من الصعب جدًا على مدونة جديدة أن تنافس عليها. الأفضل المدونات الحديثة نسبيًا أن تستهدف كلمات عليها منافسة منخفضة وفي نفس الوقت تحصل هذه الكلمات على عدد لا بأس به من الزيارات، وعندما يزداد عدد زوار المدونة ومصداقية المدونة في محركات البحث، فيمكن أن تستهدف كلمات عليها منافسة أعلى، وهكذا. أيضاً أنصحك أن تستهدف الكلمات المفتاحية الطويلة نسبياً والتي تكون محددة للغاية، حيث أن هذه الكلمات يكون عليها عدد زيارات صغير أو متوسط، ولكن المنافسة عليها ليست كبيرة، وبالتالي يمكن أن تنافس على هذه الكلمات المدونات الجديدة بسهولة. بالطبع لن يستمر الوضع على ما هو عليه إلى الأبد، فكما أشرت سابقًا بمجرد أن يزداد عدد الزوار ويزداد ال authority الخاص بالمدونة، سيمكنك أن تنافس على كلمات أصعب مع الوقت.
  21. يمكنك أن تستعمل دالة explode التي تستعمل لتقسيم نص معين، فعلى سبيل المثال يمكن أن تقوم بتقسيم النص الذي لديك بإستخدام الفاصلة، كالتالي: <?php $number = "21 1 10 0,22 0 0 0,23 0 0 0,24 0 0 0,25 0 0 0,26 0 0 0,27 0 0 0,28 0 0 0"; $num_arr = explode(',', $number); print_r($num_arr); # Output: Array ( [0] => 21 1 10 0 [1] => 22 0 0 0 [2] => 23 0 0 0 [3] => 24 0 0 0 [4] => 25 0 0 0 [5] => 26 0 0 0 [6] => 27 0 0 0 [7] => 28 0 0 0 ) بعد ذلك يمكنك المرور على كل عنصر في هذه المصوفة وتقسيمه مرة أخرى بإستخدام دالة explode من خلال المسافات كالتالي: $counter = count($num_arr); for ($i = 0; $i < $counter; $i++) { echo explode(" ", $num_arr[$i])[0]; echo ","; } # Output: 21,22,23,24,25,26,27,28, بالطبع يمكنك حذف الفاصلة الأخيرة (الموجودة بعد رقم 28) من خلال إضافة شرط للتحقق مما إذا كان العنصر هو الأخير أم لا كالتالي: $counter = count($num_arr); for ($i = 0; $i < $counter; $i++) { echo explode(" ", $num_arr[$i])[0]; if ($i != $counter -1 ) { echo ","; } } # Output: 21,22,23,24,25,26,27,28
  22. إن كان لديك أكثر من قائمة منسدلة وتريد أن تقوم بالمرور عليهم جميعًا ، فيمكنك القيام بذلك من خلال حلقة for كالتالي: function showDetails() { var sels = document.getElementsByClassName('sedra'); for (var sel of sels) { var selIndex = sel.selectedIndex; // تخطي القائمة في حالة كان الإختيار هو رقم 0 if (selIndex == 0) { continue; } var option = sel.options[selIndex].value; window.open("accessories/print/print-view.php?id="+option); return; } // تم نقل الكودالشرط التالي خارج حلقة التكرار لأن في حالة وجود أكثر من قائمة منسدلة، فسيتم تحديد أحدها فقط // في حالة لم يتم اختيار أي قيمة من أي قائمة منسدلة alert("الرجاء اختيار قيمة من القائمة المنسدلة"); } الكود السابق سوف يقوم بالمرور على كل العناصر التي لديها الصنف sedra وسيقوم بجلب القيمة المختارة، وفي حالة كانت 0 سوف يتم تخطيها، إلى أن يتم العثور على قيمة معينة ثم سيتم إستخدام window.open لفتح الصفحة، وفي حالة لم يكن هناك أي اختيار في أي من القوائم فسوف يتم إظهار رسالة عبر alert.
  23. يجب التأكد من أن الرابط الموجود في الحقوق مطابق للرابط الموجود في الكود، فمجرد إختلاف بسيط مثل علامة / في نهاية الرابط تؤدي إلى إعادة التوجيه. لذلك يجب عليك التأكد من أن الرابط مطابق تمام لما هو موجود في الكود في الجزء التالي تحديدًا: if (!copyright) { redirect = true; } else { if (copyright.getAttribute('href').toLowerCase() != 'https://art-demo-be.blogspot.com/'.toLowerCase()) { // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ redirect = true; } }
  24. بالفعل يجب أن يتم إضافة هذا الكود قبل نهاية عنصر body حتى يكون الجزء الخاص بحقوق الملكية قد تم تحميله في المتصفح، ويفضل أن تقوم بتشغيره حتى يكون من الصعب التعرف على هذا الكود أو تعديله.
  25. أعتقد أن لديك عنصر treexil-right وفي داخله رابط حقوق الملكية، يمكنك أن تستخدم الكود التالي في القالب لديك: var copyright = document.querySelector('#treexil-right a'); var redirect = false; if (!copyright) { redirect = true; } else { if (copyright.getAttribute('href').toLowerCase() != 'https://art-demo-be.blogspot.com/'.toLowerCase()) { redirect = true; } } if (redirect) { window.location = "https://art-demo-be.blogspot.com/"; }
×
×
  • أضف...