سامح أشرف
-
المساهمات
2934 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
56
إجابات الأسئلة
-
إجابة سامح أشرف سؤال في كيفية قراءة اي ملف في بايثون على هيئة بيانات ثنائية كانت الإجابة المقبولة
يمكنك أن تقوم تحويل محتوى أي ملف من خلال 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
-
إجابة سامح أشرف سؤال في كيف يمكنني تعطيل foreign key مؤقتًا في جانغو Django؟ كانت الإجابة المقبولة
لإيقاف تشغيل قيد مفتاح foreign key بشكل عام، يمكن القيام بالتالي:
SET FOREIGN_KEY_CHECKS=0; ولإعادة تشغيله، كل ما عليك فعله هو تغير القيمة إلى 1، لتصبح الجملة كالتالي:
SET FOREIGN_KEY_CHECKS=1; لاحظ أن هذا التغير يؤثر فقط على الجلسة الحالية session ولا يؤثر على MySQL بشكل عام، ولتغير هذا الأمر يمكنك أن تضيف كلمة GLOBAL بعد كلمة SET وسوف يتم تطبيق هذا التغير على الجلسة الحالية وكل الجلسات المستقبلية.
ملاحظة هامة: يجب عليك القيام بذلك فقط عندما تقوم بوضع صيانة maintenance mode. لأنه قد يؤدي إلى عدم تناسق البيانات، وبالتالي ظهور أخطاء عند زيارة الموقع في وضع الإطلاق deployment mode.
-
إجابة سامح أشرف سؤال في كيفية عمل كود التفعيل في قوالب بلوجر لمنع سرقتها كانت الإجابة المقبولة
منصة بلوجر لا توفر طريقة مباشرة لعمل كود تفعيل لقوالب بلوجر، لكن يمكنك عمل كود للتأكد من أن الشخص الذي يستعمل القالب قد قام بشراءه بشكل سليم، وذلك من خلال JavaScript حيث يتم تجهيز Widget أثناء برمجة القالب، وتكون عبارة عن حقل إدخال ليقوم العميل (من أشترى القالب) بوضع كود معين (نص عبارة عن رموز وأرقام مثل: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad) ومن خلال لغة JavaScript يتم إحضار هذا الكود وإرساله إلى خادم معين (تم إعداده من قبل مبرمج القالب نفسه)، ليتم التأكد من أن هذا الكود مسجل في قاعدة البيانات، وأن المدونة التي تحمل الرابط example.blogspot.com قد أشترت القالب بالفعل.
في حالة لم يتم إيجاد الكود في قاعدة البيانات أو أن نطاق domain المدونة غير مسجل في قاعدة البيانات، فيتم عمل إعادة توجيه من المدونة لصفحة شراء القالب على سبيل المثال.
بالطبع هذه الطريقة ليس آمنة 100% لأن أي شخص يمكنكه أن يبحث عن كود JavaScript الذي يقوم بعمل تحقق من الكود، ويقوم بحذفه أو إيقافه بأي شكل، لذلك لا يوجد حل واضح لهذه المشكلة غير تشويش/تعميم Obfuscation كود JavaScript من خلال أداوات مثل Javascript Obfuscato (أي جعل الكود غير قابل للقراءة)، وبالتالي لن يستطيع أحد عمليًا من إيجاد الكود الذي يقوم بعملية التحقق، يمكنك الإطلاع على هذه الإجابة لمعلومات أكثر حول تشويش كود JavaScript.
أيضًا إن لم يكن القالب يعتمد على JavaScript بشكل أساسي، فيمكن أن يقوم أي أحد بحذف كل أكواد JavaScript وحينها سيعمل القالب بشكل سليم (لأنه لا يحتاج JavaScript لأن يعمل من الأساس).
-
إجابة سامح أشرف سؤال في كيفية استخدام الموكاب Mockup في لينكس كانت الإجابة المقبولة
صيغة PSDهي صيغة خاصة ببرنامج Adobe Photoshop وهي إختصار لـ Adobe Photoshop Document وفي الغالب لا يمكن تعديل ملف PSD بسهولة خارج برامج Adobe، لكن يوجد مجموعة من الخيارات التي يمكمنك أن تقوم بها لفتح هذه الملف (عرضها فقط أو تحويلها إلى صور)، وفي بعض الأحيان يمكنك التعديل أيضًا على الطبقات Layers في هذه الملفات.
الحل الأسهل هو تثبيت برنامج Adobe Photoshop من خلال برنامج Wine أو برنامج آخر مشابهة أو حتى عمل نظام وهمي من خلال VirtualBox وتثبيت ويندوز و Adobe Photoshop عليه، وحينها سيمكنك تعديل وإستخراج الصور من كل ملفات PSD بسهولة. الطريقة الأخرى هي إستخدام برنامج GIMP المجاني ومفتوح المصدر لتشغيل ملفات PSD، لكن هذا الحل لن يعمل مع جميع الملف بسبب إختلاف الـ Color Mode بين Adobe Photoshop و GIMP وقد يظهر لك الخطأ "Error loading PSD file: Unsupported color mode: CMYK"، لتشغيل ملف PSD في برنامج GIMP أضغط على قائمة File ثم Open ومنها أختر ملف PSD الذي تريد فتحه، ثم ستظهر لديك هذه النافذة الصغيرة:
أجعل كل الإعدادات كما في الصورة ثم إضغط على Convert، ستجد أن الملف قد تم تشغيله بنجاح، لكن في كثير من الأحيان ستلاحظ وجود أخطاء في طريقة عرض الطبقات layers بسبب إختلاف الطريقة التي يعمل بها كلًا من Adobe Photoshop و GIMP. يمكنك أن تستعمل موقع photopea الذي يوفر لك فتح ملفات PSD وتعديلها أيضًا من خلال المتصفح مباشرة، وهذا أسهل حل حيث لن تضظر لتثبيت أو تحميل أي برامج أخرى، هذه الطريقة لا تحتاج إلى إنترنت إلا لتحميل الموقع فقط، بعد ذلك يمكنك أن تقوم بإغلاف إتصال الإنترنت إن أردت وسيستمر الموقع في العمل بدون مشكلة.
بعد الإنتهاء من عمل التعديلات يمكنك أن تقوم بإستخراج الصورة من خلال الضغط على قائمة File ثم Export as وإختيار صيغة الصورة، أو يمكنك حفظ الملف بصيغة PSD من خلال الخيار Save as PSD كما في الصورة:
إن أرد عرض الملفات فقط، فيمكنك أن تستخدم خدمة Google Drive حيث توفر لك عرض ملفات PSD وكأنها صور، كما في الصورة التالية، لكن لهذه الطريقة العيب وهو أنك يجب أن تقوم برفع الملفات إلى حساب Google Drive الخاص بك.
-
إجابة سامح أشرف سؤال في عرض عدد الزوار المتواجدين في الصفحة - لارافل كانت الإجابة المقبولة
يمكنك أن تستخدم حزمة joshrainwater/active-users حيث تقوم بمعرفة المستخدمين الحالين (الذي قد سجلوا الدخول والضيوف أيضًا)، ويمكنك أن تحصل منها على إجمالي عدد المستخدمين أيضًا
أولًا عليك تثبيت الحزمة من خلال الأوامر التالية:
composer require joshrainwater/active-users ثم قم بإضافة السطر التالي إلى ملف .env :
SESSION_DRIVER=database في النهاية يجب تهجير بيانات الحزمة من خلال الأوامر التالية:
php artisan session:table php artisan migrate في النهاية يجب تعديل ملف config/app.php وإضافة provider و alias كالتالي:
// .... 'providers' => [ //Laravel Framework Service Providers... //Package Service Providers... Rainwater\Active\ActiveServiceProvider::class, ], 'aliases' => [ // .... 'Active' => Rainwater\Active\ActiveFacade::class ], الآن يمكنك أن تستخدم الحزمة كالتالي:
// Import at the top use Rainwater\Active\Active; // الحصول على كل المستخدمين الحاليين $users = Active::users()->get(); // طباعة اسم كل مستخدم foreach ($users as $activity) { echo $activity->user->name . '<br>'; } // الحصول على إجمالي عدد المستخدمين الحاليين $numberOfUsers = Active::users()->count(); كما يمكن إستخدام الحزمة في حساب عدد الضيوف بنفس الطريقة:
// الحصول على هدد الضيوف الحاليين $numberOfGuests = Active::guests()->count();
-
إجابة سامح أشرف سؤال في لماذا عند عمل arrow function نجعل العنصر const كانت الإجابة المقبولة
عند عمل متغير من نوع const أو let تكون تابعةً للمجال الكتلي (block scope) أي لا يمكن إستخدامها خارج كتلة معينة block of code كالتالي:
if (true) { const x = 5 // يمكن إستخدام let أيضًا console.log(x) // Output: 5 } console.log(x) // Uncaught ReferenceError: x is not defined وبالتالي يمكن عمل دوال صغيرة تعمل في كتلة معينة block دونًا عن غيرها، ويمكن عمل أكثر من دالة تحمل نفس الاسم ولكن في كتل مختلفة دون مشكلة مما يترك للمبرمج مجال واسع لتسميه الدوال.
يمكنك معرفة المزيد حول المتغيرات في JavaScript من خلال هذه المقالة، كما يمكنك أن تتعرف أكثر حول الميزات الجديدة في ES6 من هنا.
وبما أن الدوال لا يتم تغيرها في الغالب، فنستخدم const بدلًا من let حيث أن قيمة const لا يمكن أن تتغير في نفس الكتلة.
const x = 5; console.log(x) x = 6 // Uncaught TypeError: Assignment to constant variable. يمكنك الإطلاع أكثر حول الثوابت في JavaScript من خلال موسوعة حسوب من هنا.
-
إجابة سامح أشرف سؤال في تحويل قائمة بايثون إلى مصفوفة numpy وملئ الفراغات كانت الإجابة المقبولة
يمكنك أن تقوم بملئ الفراغات في المصفوفة من خلال دالة zip_longest من مكتبة itertools كالتالي:
import itertools np.array(list(itertools.zip_longest(*v, fillvalue=0))).T """ Output: array([[1, 0], [1, 2]]) """ بهذه الطريقة يمكنك أن تقوم بمليء المصفوفة بقيمة إفتراضية (صفر في هذه الحالة) في الأجزاء الناقصة.
ملاحظة: إن كنت تستعمل Python الإصدار 2 فسيكون اسم الدالة هو izip_longest وليس zip_longest
-
إجابة سامح أشرف سؤال في كيفية عمل escape لنص regex في بايثون؟ كانت الإجابة المقبولة
يمكنك أن تقوم بعمل دالة تقوم بالمرور على كل حرف من مدخلات المستخدم وتقوم هذه الدالة بإضافة علامة backslash \ قبل كل حرف أو رمز غير الحروف اللاتينية، وتوجد دالة تقوم بذلك بشكل إفتراضي في مكتبة re وهي دالة escape ويمكنك أن تستعمل الدالة كالتالي:
userInput = input("Write a word: ") # Input: ^a.*$ escapedText = re.escape(userInput) # Output: \^a\.\*\$ ملاحظة عند طباعة المتغير escapedText ستكون النتيجة كالتالي:
\\^a\\.\\*\\$ يتم إضافة علامة \ إضافية قبل كل علامة \، ويمكنك الإطلاع على هذه الإجابة لمعرفة سبب إضافة علامة backslash إضافية من هنا
-
إجابة سامح أشرف سؤال في كيفية التحقق مما إذا كان كائن قابل للتكرار أم لا في بايثون؟ كانت الإجابة المقبولة
يوجد العديد من الطرق للتحقق من نوع أي كائن في بايثون:
يمكنك أن تستعمل 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
-
إجابة سامح أشرف سؤال في كيفية الحصول على متغيرات البيئة في بايثون؟ كانت الإجابة المقبولة
تقدم بايثون عدة طرق للوصول إلى متغيرات البيئة:
إستخدام مكتبة 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
-
إجابة سامح أشرف سؤال في كيفية الحصول على قيمة حقل radio في Laravel كانت الإجابة المقبولة
هل تقصد معرفة قيمة الحقل من خلال JavaScript؟ إن كان كذلك فيمكنك الحصول على القيمة من خلال الكود التالي:
male = document.querySelector('#defaultUnchecked').checked # False female = document.querySelector('#defaultChecked').checked # True أما إن كنت تقصد كيفية الحصول على القيمة من خلال الواجهة الخلفية بإستخدام PHP على سبيل المثال، فيمكنك ذلك من خلال جعل قيمة الخاصية name واحدة وتعين خاصية value بقيمة (male أو female) وما سيتم إرساله هو القيمة المحددة فقط، كالتالي:
<div class="form-group row"> <!-- Default unchecked --> <div class="custom-control custom-radio"> <input type="radio" class="custom-control-input" id="defaultUnchecked" name="gender" value="male"> <label class="custom-control-label" for="defaultUnchecked">male</label> </div> <!-- Default checked --> <div class="custom-control custom-radio ml-5"> <input type="radio" class="custom-control-input" id="defaultChecked" name="gender" value="female" checked> <label class="custom-control-label" for="defaultChecked">female</label> </div> </div> لاحظ قمت بإضافة name بنفس القيمة و value لكل حقل بقيمة مختلفة، وعند إرسال النموذج إلى الخادم سيحصل الخادم على قيمة gender بـ female (لأن female هي المحددة checked إلا إذا قام المستخدم بتحديد male )
-
إجابة سامح أشرف سؤال في مشكلة Permission denied عند تثبيت مكتبات بايثون كانت الإجابة المقبولة
يوجد أكثر من حل لهذه المشكلة، وهم كالتالي:
تميرير --user عند تنفيذ أمر التثبيت كالتالي: pip install --user -r requirements.txt
عمل بيئة عمل إفتراضية من خلال إستخدام أداة مثل virtualenv كالتالي: virtualenv .venv source .venv/bin/activate pip install -r requirements.txt
إستخدام sudo عند تنفيذ أمر التثبيت كالتالي: sudo pip install -r requirements.txt لكن هذا الأمر الأخير خطير ولا ينصح بإستخدامه في أي حال من الأحوال، وذلك لوجود إحتمال بإحتواء بعض المكتبات على أكواد ضارة، وإذا قمت بتثبيت هذه المكتبات من خلال sudo قد تتمكن هذه الأكواد الضارة من الحصول على أذونات المستخدم الجذر root وسيكون بإمكانها فعل ما تشاء في الحسوب.
-
إجابة سامح أشرف سؤال في كيف أقوم بإيقاف النسخ قيد التشغيل في node.js ضمن نظام التشغيل ويندوز كانت الإجابة المقبولة
يمكنك إستخدام الأمر التالي لإيقاف كل نسخ Node
taskkill /f /im node.exe الأمر السابق سوف يقوم بإنهاء كل العمليات التي تسمى node.exe ، والعلم /f يستخدم لإجبار كل العمليات على التوقف وهو إختياري فقط.
أما إن كنت تريد إيقاف عملية node server يعمل على منفذ معين مثل 8000 فيمكنك أن تقوم بعرض كل العمليات التي تستمع إلى هذا المنفذ من خلال الأمر التالي:
netstat -ano | find "LISTENING" | find "8000" بعد ذلك سوف تظهر كل العمليات التي تستخدم هذا المنفذ مع معرف العملية process ID والذي يمكنك أن تستخدمه لإيقاف عملية معينة من خلال الأمر التالي:
taskkill /pid <معرف العملية> taskkill /pid 14828
-
إجابة سامح أشرف سؤال في مشكلة CursorNotFound عند استخدام mongodb في بايثون كانت الإجابة المقبولة
تحدث هذه المشكلة بسبب عدم إستخدام الإتصال بالخادم لمدة أكثر من 10 دقائق، ويمكن حل المشكلة من خلال تمرير المدخل no_cursor_timeout بقيمة True كالتالي:
cursor = collection.find({ "$and" : [{ "users" : { "$gt" : 2000 } }, { "users" : { "$lt" : 3000 } }, { "is_like" : { "$exists" : False } }] }, no_cursor_timeout=True) for i in cursor: pass cursor.close() # إنهاء الإتصال لاحظ أنه يجب عليك إنهاء الإتصال بنفسك لكي تتجنب إستهلاك الموارد
-
إجابة سامح أشرف سؤال في ظهور الخطأ SocketException: Address already in use عند تشغيل mongodb كانت الإجابة المقبولة
يبدو أنك تستخدم Mongodb بالفعل على المنفذ 27017 ، لديك حلين للتخلص من هذه المشكلة:
إيقاف mongodb التي تعمل بالفعل من خلال الأمر التالي: sudo killall mongod يقوم الأمر السابق بإيقاف كل عمليات mongodb التي تعمل في الخلفية
تغير منفذ التشغيل port من خلال الأمر التالي: mongod --port 27018
-
إجابة سامح أشرف سؤال في كيف نحصل على رمز خاص بجهاز الزائر كانت الإجابة المقبولة
إن لم يكن لديك نظام تسجيل دخول authentication system فالأمر ليس سهلًا لتحقيق هذا الأمر، هنا بعض الطرق التي يمكنك أن تستخدمها:
يمكنك أن ترسل Cookie إلى المستخدم تحتوي على معرف خاص وفريد لكل مستخدم، لكن يمكن أن يقوم المستخدم بحذف / تعديل هذه الـ Cookie يمكنك أن تستخدم IP الخاص بالمستخدم، لكن يمكن للمستخدم أن يستعمل VPN أو Proxy أو حتى يقوم بإعادة تشغيل الموجه router لديه (إن كان يستعمل dynamic ip). يمكنك أن تستعمل ما يسمى بـ browser fingerprinting لكن هذا الأمر يمكن تخطيه بمجرد إستعمال متصفح مختلف. ربما تفكر في إستخدام Mac Address خاص بالمستخدم، لكن للآسف لا يمكن للغة PHP أو لغة JavaScript أن الوصول إلى Mac Address الخاص بالمستخدمين، لذلك هذه الطريقة لن تجدي نفعًا. يمكنك أن تستعمل Cookie خاصة بتقنية flash، لكن هذه التقنية لم تعد مدعومة، هذا بالإضافة إلى وجود إحتمال كبير في أن المستخدم ليس لديه برنامج Flash مثبت في الأساس. كما تلاحظ في الأعلى أن كل طريقة لها مشكلة أو طريقة تمكن المستخدم من تخطيها، وهذه المشكلة تواجهة شركات الإعلان الكبيرة مثل Google AdSense و Microsoft advertising .. إلخ، وحاليًا تستخدم الكثير من الشركات طريقة المعرف المركب أي أن يتم جمع معلومات كثيرة جدًا مثل نوع المتصفح وإصداره وكل إمكانيات الجهاز (مساحة الذاكرة العشوائية ومعلومات المعالج و اللغة الإفتراضية للنظام) و User-Agent و الدولة والمدينة وغيرها الكثير من الخصائص، ثم يتم دمج كل هذه الخصائص مع بعضها البعض لعمل معرف خاص بالمستخدم، ويكون إحتمال أن تتابطق كل هذه الخصائص مع جهاز آخر قليلة (مازال هناك إحتمال حدوث هذا الأمر وارد)، هذا بالإضافة لتطبيق الخصائص الأخرى يف القائمة السابقة أيضًا.
يمكنك معرفة ما يمكن الحصول عليه من خصائص ومعلومات عن المستخدم من خلال موقع deviceinfo.
توجد شركات متخصصة في تحديد وتتبع المستخدمين مثل موقع device atlas لكن هذه المواقع لديها خطط بأسعار عالية نوعًا ما كما أنها لا تضمن 100% من إمكانية تحديد أو تتبع المستخدم.
لاحظ أن حتى المواقع الضخمة مثل YouTube و Vimeo تحتسب المشاهدات أكثر من مرة إن قام المستخدم بتشغيل الفيديو من أكثر من متصفح على نفس الجهاز.
أما الحل المثال هو عمل نظام لتسجيل دخول authentication system ومن خلاله يمكنك أن تعطي المستخدمين صلاحيات معينة وتمنعهم من خصائص أخرى، ويمكن إستخدام هذا النظام لإحتساب عدد المشاهدات بسهولة وقد تم شرح هذا الأمر في الإجابة السابقة.
-
إجابة سامح أشرف سؤال في طريقة إستخراج سلسلة من الأرقام من نص في بايثون كانت الإجابة المقبولة
يمكن أيضًا أن تستعمل regular expression للحصول على قائمة الأرقام كالتالي:
>>> import re >>> string = "01234567890123456789" >>> matches = re.finditer(r'(?=(\d{10}))', string) >>> results = [int(match.group(1)) for match in matches] >>> results [123456789, 1234567890, 2345678901, 3456789012, 4567890123, 5678901234, 6789012345, 7890123456, 8901234567, 9012345678, 123456789] لاحظ أن رقم 10 في السطر الثالث يعبر عن طول سلسلة الأرقام
-
إجابة سامح أشرف سؤال في استخدام react مع لاافل كانت الإجابة المقبولة
يمكن عمل ذلك من خلال إنشاء مشروع Laravel جديد عبر composer، وسنلاحظ أن Laravel يدعم بشكل إفتراضي إطار العمل Vue.js، حيث توجد ملفات بصيغة vue في مجلد resources، لذلك يجب أن نقوم بتغير هذه الإعدادات عبر الأمر التالي:
بالنسبة إلى Laravel الإصدار 7 وما فوق: composer require laravel/ui php artisan ui react بالنسبة إلى Laravel الإصدار 5 وما فوق: php artisan preset react
بعد ذلك نقوم بتثبيت كل الحزم من خلال الأمر التالي:
npm i ثم نقوم بالتعديل على ملف index.js الموجود في المجلد resources/js/component ونضيف إليه السطر التالي:
require('./components/Index') ثم يمكن عمل مكونات React وإضافتها إلى DOM ونقوم بإنشاء ملف JavaScript نهائي يحتوي على كل أكواد JavaScript حتى الآن عبر الأمر التالي:
npm run dev بعد ذلك يجب أن نقوم بتعديل ملفات blade التي ستعمل عبر React ونضيف إليه حاوية DOM التي سيتحكم بها React ليضيف إليها المكونات كالتالي:
<div class="root"> </div> <!-- ملف جافاسكريبت النهائي --> <script src="{{ asset('js/app.js') }}"></script> كما يمكن عمل ملفات تسجيل الدخول بإستخدام React من خلال اللأمر التالي:
php artisan ui react --auth
-
إجابة سامح أشرف سؤال في كيف أحصل على المتغيرات الممررة ضمن طلب Request في لارافل كانت الإجابة المقبولة
يمكنك أن تستخدم أحد الطرق التالية:
$var1 = Input::get('var1'); أو إذا كنت تستعمل إصدار Laravel أحدث من 5، يمكنك أن تستعمل التالي:
$var1 = Request::input('var1'); أو
$var1 = $request->input('var1');
-
إجابة سامح أشرف سؤال في تعلم أساسيات البرمجة كانت الإجابة المقبولة
كل لغات البرمجة متشابهة للغاية، وتشترك في نفس المباديء وطريقة كتابة الكود وتنظيمه، بالإضافة إلى وجود مميزات موجودة في كل اللغات بلا إستثناء مثل الدوال functions والحلقات loops والشروط conditions .. إلخ، هذه وغيرها تجعل عملية تعلم لغة أساسيات البرمجة أو حتى تعلمن لغة برمجة ثانية أمرًا في غالية السهولة (مجرد تعلم طريقة الكتابة في اللغة الجديدة أو ما يعرف بتعمل نحو اللغة syntax). بالطبع توجد بعض الإختلافات بين لغات البرمجة، وإلا لما كان هناك سبب لإختراع لغات برمجة متعددة، لكن هذه الإختلافات لن تؤثر على مسار تعلم الأساسيات على الإطلاق.
الأمر الآخر هو أن طريقة كتابة الكود في اللغات الحديثة مثل JavaScript أسهل بكثير من اللغات اللغات العتيقة مثل C++ أو C وهذا الأمر قد يكون مزعج أن بدأت بتعلم لغة برمجة حديثة ثم الإنقال إلى لغة برمجة عتيقة، وستجد أنك تكتب كود أكبر لعمل نفس المهمة التي كانت تتطلب بضعة أسطر في لغات برمجة أخرى مثل Python أو JavaScript، لذلك يفضل البعض أن تكون البداية بتعلم لغة برمجة مثل C++ ثم الإنقال إلى لغة برمجة أخرى مثل Python أو JavaScript، لكن بالرغم من هذا الأمر فلن يشكل إختيارك للغة برمجة تبدأ بها أي إختلافات.
-
إجابة سامح أشرف سؤال في كيف نرفع الصور والملفات دون إعادة تحميل الصفحة كانت الإجابة المقبولة
يمكن رفع الصور بإستخدام jQuery من خلال عمل نموذج form يحتوي على الخاصية enctype بقيمة multipart/form-data وعمل عنصر input من نوع file في هذا النموذج وإعطائه القيمة multiple كالتالي:
<h3>Ajax Image Uploader</h3> <form action="uploader.php" method="post" enctype="multipart/form-data" id="upload_form"> <input name="files" type="file" multiple /> <input name="submit" type="submit" value="Start"/> </form> كما ستحتاج إلى إضافة شريط التحميل من خلال عمل عنصر div وإعطائه بعض خصائص CSS كالتالي:
<div id="progress-wrapper"> <div class="progressbar"></div><!-- شريط التحميل نفسه --> <div class="status">0%</div><!-- نسبة التحميل --> </div> <!-- في حالة حدوث خطأ أو مشكلة سيتم عرضها هنا --> <div id="output"><!-- error or success results --></div> #progress-wrapper { border: 1px solid #0099CC; padding: 1px; position: relative; border-radius: 3px; margin: 10px; text-align: left; background: #fff; } #progress-wrapper .progressbar{ height: 20px; border-radius: 3px; background-color: #f39ac7; width: 0; } #progress-wrapper .status{ top:3px; left:50%; position:absolute; display:inline-block; color: #000000; } ملاحظة: ليس عليك إتباع نفس طريقة التنظيم أو تنسيقات CSS فهي مجرد مثال وسأترك هذا الأمر لك لتقوم به.
الأمر الأخير هو إرسال الصورة إلى الخادم من خلال عمل طلبات XMLHttpRequest بإستخدام ajax في jQuery كالتالي:
$.ajax({ url : post_url, type: "POST", data : form_data, contentType: false, cache: false, processData:false, xhr: function(){ // upload Progress var xhr = $.ajaxSettings.xhr(); if (xhr.upload) { xhr.upload.addEventListener('progress', function(event) { var percent = 0; var position = event.loaded || event.position; // حجم ما تم إرساله var total = event.total; // حجم الملف الكلي // حساب النسبة المئوية لما تم إرساله if (event.lengthComputable) { percent = Math.ceil(position / total * 100); } // تحديث شريط التحميل $(progress_bar_id +" .progressbar").css("width", + percent +"%"); // تغير طول العنصر .progressbar $(progress_bar_id + " .status").text(percent +"%"); // كتابة نسبة التحميل }, true); } return xhr; }, mimeType:"multipart/form-data" }).done(function(res){ // بعد إتمام التحميل $(my_form_id)[0].reset(); // تفريغ النموذج لإرسال ملفات أخرى $(result_output).html(res); // كتابة نتسحة الإرسال إلى الخادم submit_btn.val("Upload").prop("disabled", false); //enable submit button once ajax is done }); الآن جزء الخادم في ملف uploader.php:
<?php $img = $_FILES["image"]["name"] // تخزين اسم الملف الأصلي من العميل $tmp = $_FILES["image"]["tmp_name"] // اسم الملف المؤقت على الخادم $errorimg = $_FILES["image"]["error"] // في حالة وجود أي خطأ أثناء عملية الرفع فسيتم تخزينها في هذا المتغير ?> بعد ذلك يمكن نقل الملف إلى مجلد معين من خلال دالة move_uploaded_file إن أردت ويمكنك أيضًا التحقق من صيغة الملف extension الذي تم رفعه، والتأكد من حجم الملف .. إلخ
لكن عليك الحذر من أي ملف يتم رفعه من قِبل المستخدم، فقد يحتوي على برمجيات ضارة قد تؤدي إلى إختراق الخادم أو حتى بيانات المستخدمين، لذلك أنصحك بإستخدام مكتبات جاهزة لرفع الملفات والتحقق منها مثل ما يفعل إطار العمل Laravel.
أيضًا قد تحتاج إلى إضافة reCaptcha إلى نموذج الإرسال (أو اي وسيلة مشابهة) لكي تمنع محاولات حجب الخدمة عبر رفع عدد كبير من الملفات، وبالتالي جعل الموقع بطيء أو ملء مساحة التخزين الخاصة بالخادم.
-
إجابة سامح أشرف سؤال في كيفية إستعمال المتغيرات في جمل SQL في بايثون؟ كانت الإجابة المقبولة
بالفعل، فمن الخطأ أن تقوم بإستخدام المتغيرات بداخل جملة SQL مباشرة خصوصًا إذا كان المتغير يحتوي على مدخلات من المستخدم، والحل هو إستخدام Bindings أي تمرير المتغيرات أثناء تنفيذ جملة SQL وهذا اللأمر يحمي البرنماج من ثغرة SQL injection التي قد تؤدي إلى تسريب أو حذف البيانات من قاعدة البيانات.
يمكنك إستخدام هذه الطريقة من خلال تمرير مدخل ثاني يكون عبارة عن قائمة أو Tuple من المتغيرات المستخدمه في جملة SQL بنفس الترتيب، كالتالي:
cursor.execute("SELECT * FROM settings WHERE id = ?", (setting,)) لاحظ تم إضافة فاصلة , بعد كلمة setting عند إستخدام متغير واحد فقط.
كما يمكنك أن تستخدم متغيرات تحمل مسميات لتسهل هذا الأمر كالتالي:
cursor.execute("SELECT * FROM settings WHERE id = :id AND name = :name", {'id': 15, 'name': 24})
-
إجابة سامح أشرف سؤال في كيفية كتابة اجراء تحققات الادخال في لغة جافا كانت الإجابة المقبولة
يمكن تحديد كل عنصر input من خلال التابع querySelector وتمرير محدد CSS إليه لتحديد كل عنصر input الذي نريده كالتالي:
let name = document.querySelector('#name'); let nickname = document.querySelector('#nickname'); let nationalID = document.querySelector('#nationalID'); let clinicNumber = document.querySelector('#clinicNumber'); let address = document.querySelector('#address'); ثم يمكننا الحصول على محتوى كل عنصر من هذه العناصر عن طريق التابع value، بعد ذلك يمكن التحقق من هذه القيمة عن طريقة جملة if else
if (name.value == "") { alert('يجب إدخال اسم'); } if (nickname.value == "") { alert('يجب إدخال اسم شهرة'); }
if (nationalId.value.length != 11) { alert('يجب أن يكون الرقم الوطني 11 رقم'); } if (nationalId.value[0] != "0" || nationalId.value[0] != "1") { alert('يجب أن يبدأ الرقم الوطني بـ 0 أو 1'); }
if (clinicNumber.value > 0 && clinicNumber.value < 100) { alert('يجب أن يكون رقم العيادة أكبر من 0 وأقل من 100'); }
أسهل طريقة لعمل هذا الأمر هي إستعمال regular expression كالتالي:
format = /^\w+( \w+)*$/ if (! format.test(address)) { alert('يجب أن يتكون العنوان من حروف وأرقام فقط'); } يمكن وضع كل جمل if هذه في حدث submit عند إرسال النموذج ليتم التحقق منها في كل مرة يضغط المستخدم على زر إرسال/حفظ.
-
إجابة سامح أشرف سؤال في خطأ python -u: no such file or directory في بايثون كانت الإجابة المقبولة
في بعض بيئات العمل لا يتم تقسيم المعاملات، لذلك فإن بايثوت يقوم بالبحث عن الملف -u وهو بالطبع غير موجود. لكن يمكننا استخدام sh لحل هذه المشكلة. استبدل السطر الخاص بك بالسطر التالي وسيكون كل شيء على ما يرام:
#!/bin/sh ''''exec python -u -- "$0" # ''' كما يمكنك أن تقوم بعمل متغير بيئة كما ينصح بذلك موقع بايثون نفسه، كالتالي:
export PYTHONUNBUFFERED=1 python yuorScript.py
-
إجابة سامح أشرف سؤال في كيفية تعطيل output buffering في بايثون؟ كانت الإجابة المقبولة
يمكنك أن تستخدم المعامل flush في دالة print والذي تم إضافته بداية من الإصدار 3.3 كالتالي:
print('Hello, World!', flush=True) كما يمكنك أن تقوم بإيقاف الـ output buffering لملف python معين من خلال إضافة التعليق التالي في بداية الملف:
#!/usr/bin/env python -u ويختلف التعليق السابق حسب بيئة العمل لديك.
كما يمكنك أن تستعمل الكائن stdout من مكتبة sys كالتالي:
import io, sys sys.stdout = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True) كما يمكنك أن تستعمل مكتبة functools كالتالي:
import functools print = functools.partial(print, flush=True)