-
المساهمات
2064 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
13
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Chihab Hedidi
-
لحل المشكلة يمكنك استخدام useEffect ، حيث نستعمله عندما نريد إجراء تعديل على حالة ال component بعد ال render و هذا الكود بعد التحديث: import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import HeaderProfile from './HeaderProfile'; import Alert from './Alert'; function PhotoProfile({ profile }) { const user = JSON.parse(localStorage.getItem("user")); let profilePhoto = profile?.avatar ? require(`../../assets/profile/${profile.avatar}`) : avatar; const [profileAvatar, setProfileAvatar] = useState(null); const [profileImage, setProfileImage] = useState(profilePhoto); const [data, setData] = useState([]); const [name, setName] = useState(profile.name || ""); const [bio, setBio] = useState(profile.bio || ""); const [status, setStatus] = useState(profile.status || ""); const [error, setError] = useState(""); const navigate = useNavigate(); useEffect(() => { // تحديث معلومات البروفايل let profilePhoto = profile?.avatar ? require(`../../assets/profile/${profile.avatar}`) : avatar; setProfileImage(profilePhoto); setName(profile.name || ""); setBio(profile.bio || ""); setStatus(profile.status || ""); }, [profile]); const handleFileChange = (e) => { if (e.target.files && e.target.files[0]) { setProfileImage(URL.createObjectURL(e.target.files[0])); setProfileAvatar(e.target.files[0]); } }; const handleSave = (e) => { e.preventDefault(); const formData = new FormData(); formData.append('name', name); formData.append('bio', bio); formData.append('status', status); if (profileAvatar) { formData.append('avatar', profileAvatar, profileAvatar?.name); } axios .post("/api/users/profile", formData, { headers: { "Content-Type": "multipart/form-data", "x-auth-token": user.data?.token, }, }) .then((res) => { setData(res.data); navigate('/'); }) .catch((error) => setError(error.response.data.msg)); }; return ( <div className="photo-profile"> <HeaderProfile title="Public profile" paragraphe="Add information about yourself." /> <div className="photo-profile-img"> <img alt="" src={profileImage} /> </div> <form encType="multipart/form-data" className='form-container' onSubmit={handleSave} > {error && <Alert error={error} />} <input className="photo-profile-input" type="file" name="avatar" accept="image/*" onChange={handleFileChange} /> <input type="text" className="profile-iput-info" placeholder="name" value={name} name="name" onChange={(e) => setName(e.target.value)} required /> <input type="text" className="profile-iput-info" placeholder="bio" value={bio} name="bio" onChange={(e) => setBio(e.target.value)} required /> <input type="text" className="profile-iput-info" placeholder="status" value={status} name="status" onChange={(e) => setStatus(e.target.value)} required /> <button className="submit" type="submit"> Save </button> </form> </div> ); } export default PhotoProfile; يمكنك الإطلاع اكثر على هذه العناصر من خلال المقالات التالية:
-
في هذه الحالة الايرور يظهر لك أنو الملف غير موجود، حاول تجنب استخدام اللغة العربية في تسمية هذه الملفات لأنه يمكن ان تكون غير مدعومة و في نفس الوقت تأكد من أن الملف app.exe موجود في المسار المكتوب، اذا كان غير موجود حاول تسوي compile مرة ثانية للكود.
- 5 اجابة
-
- 1
-
مرحبا، يوجد حل آخر يمكنك تجربته و هو استخدام font آخر يدعم العربية، جربي هذا الكود الذي اشتغل معي ايضا: # -*- coding: UTF-8 -*- from tkinter import * from awesometkinter.bidirender import add_bidi_support # Create Object root = Tk() frame2 = Frame() frame2.pack(pady=10) address = Text(frame2,width=37,height=10) address.pack() add_bidi_support(address) Font_tuple = ("Courier New", 12 ) address.configure(font=Font_tuple) root.mainloop()
-
قبل كل شيء أخي دائما حاول إخفاء المعلومات الحساسة الخاصة بالبوت و استخدم ملف .env، بحيث تضع فيه ال token وال api key، يعني حاليا انصحك بتعديل المنشور و حذفهم و ترك الكود. اما بخصوص فكرتك يمكنك القيام بنفس الطريقة التي أنشأت بها الزر الأول و تطبيق نفس الأمر مع الرسالة الجديدة التي ستظهر مثل ما نشوف هنا هذا هو الكود المسؤول عن إنشاء الأزرار: markup = types.ReplyKeyboardMarkup(row_width=2) itembtn1 = types.KeyboardButton(u"\U0001F355"+'Pizza') itembtn2 = types.KeyboardButton(u"\U0001F32E"+'Tacos') itembtn3 = types.KeyboardButton(u"\U0001F414"+'chicken') itembtn4 = types.KeyboardButton(u"\U0001F356"+'meat') markup.add(itembtn1, itembtn2, itembtn3,itembtn4) و هنا يتم اضافة الزر للرسالة : @bot.message_handler(commands=['start', 'help']) def exemple_keyboard(message): cid = message.chat.id bot.send_message(cid, "Choose a Categorie :",reply_markup=markup) الحين اذا اردت اضافة ازرار لرسالة أخرى يمكنك تعريف الزر الجديد عن طريق هذا الكود: markup1 = types.ReplyKeyboardMarkup(row_width=2) itembtn1 = types.KeyboardButton("new button") markup1.add(itembtn1) و بعدها تضيفه عن طريق ال argument الذي اسمه reply_markup: bot.send_message(message.chat.id, "Hello," +str(message.from_user.first_name)+str(message.from_user.last_name)+" I'm the merchant bot." " I can sell you a pizza or tacos or everything in our store." " Use /start to buy, /terms for Terms and Conditions",reply_markup=markup2)
- 1 جواب
-
- 1
-
يشير مصطلح دالة callback إلى دالة تمرر كوسيط إلى دالة أخرى. عندما تنتهي الدالة الرئيسية من تنفيذ مهمتها الرئيسية، يتم استدعاء الدالة callback لتنفيذ إجراءات إضافية. يمكنني توضيح الفكرة أكثر بمثال بحيث إذا كنت تعمل على تطبيق ويب وتحتاج إلى تنفيذ مهمة معينة بعد انتهاء عملية معينة مثل تحميل ملف، يمكنك استخدام callback function لذلك. ستمرر الدالة الرئيسية كوسيط عندما تقوم بتشغيل عملية تحميل الملف، وعند اكتمال التنفيذ (بعد اكتمال تحميل الملف)، سيتم تنفيذ ال callback function. لمعرفة أن الدالة غير مزامنة، نفرض أنه لدينا دالتين الأولى بإسم alpha و الثانية بإسم beta، في مرحلة ما من البرنامج نسوي استدعاء للدالة alpha و نمرر الدالة beta as argument مثلا EventListener في هذه الحالة سننتظر حتى تنتهي الدالة alpha من العمل و بعدها ستعمل الدالة beta اي مثل الموضح في هذه الصورة: اما في حالة ان تكون الدالة متزامنة ستنتظر الى انتهاء الدالة beta بعدها تكمل alpha العمل الخاص بها مثل الموضح في الصورة:
- 3 اجابة
-
- 1
-
مع كل المجالات التي ذكرها الأخ مصطفى يوجد ايضا مجالين أرى أنهم مربحين و لكن القليل من يتجه لهم، لا أقول انه يتم الإعتماد عليهم كعمل رئيسي و لكن يمكنك الكسب من خلالهم بالقيام بمشاريع بسيطة الى أن تتقنهم بالشكل الجيد و هما ال webscraping و automation: من ناحية استخدام ال webscraping يمكن استخراج البيانات من عدة مواقع لتستخدمها في مجال معين، و يوجد الكثير من المشاريع في موقع مستقل الذي يطلبون فيه هذا العمل. تحتاج في هذا المجال تعلم بعض المكتبات في بايثون و أهمها مكتبة Beautiful Soup. اما من ناحية ال automation او الأتمتة، حاليا يوجد الكثير من الأعمال المتكررة في المواقع و التي تأخذ وقت في بعض الأحيان بالرغم من أنها بسيطة، في هذه الحالة نستخدم الأتمتة ليقوم السكريبت او الكود البرمجي بالقيام بالعمل بدل عن المستخدم. يمكنك الدخول الى المجال عبر مكتبة Selenuim التي أراها سهلة للتعلم و لن تستهلك منك الوقت و الجهد. https://io.hsoub.com/tech/150826-أتمتة-المهام-باستخدام-مكتبة-selenium-ولغة-البايثون
-
واجهت هذه المشكلة من قبل، الحلول تختلف من كمبيوتر لآخر، أحد الحلول التي اشتغلت معي هي تغيير طريقة التشفير لواحدة تقبل اللغة العربية و المستخدمة حاليا هي UTF-8: يمكنك تجربة الكود التالي مع التغيير البسيط الذي أحدثته لأنه اشتغل معي بهذه الطريقة: # -*- coding: UTF-8 -*- from tkinter import * from awesometkinter.bidirender import add_bidi_support # Create Object root = Tk() frame2 = Frame() frame2.pack(pady=10) address = Text(frame2,width=37,height=10) address.pack() add_bidi_support(address) #address root.mainloop()
- 3 اجابة
-
- 1
-
و يمكنك التحسين أكثر على الكود بحيث يصبح شغال مع أي رقم و ليس فقط مع الرقم 7، بحيث تضيف متغير آخر ليكون على سبيل المثال بإسم goal و تكون المقارنة بالطريقة التالية: num =int(input("Please enter a number:")) goal=7 if num==goal: print("You Won") elif num ==goal+1 or num== goal-1: print("So Close") else: print("You Lost") و يمكنك تغيير goal بأي رقم تريد.
-
من خلال تجربتي كنت دائما استخدم venv، و لكن مؤخرا وجدت انها تستهلك الكثير من حجم التخزين، حيث انهم يكون لكل مشروع بيئة افتراضية خاصة به، و إن كنت تعمل على العديد من المشاريع سيكون عليك تحميل المكتبات لكل مشروع لوحده، حتى اذا كانت هناك مكاتب مشتركة بين المشاريع سيتعين عليك تحميل عدة مرات خاصة بكل مشروع. أحد الحلول التي وجدتها هي استخدام البيئة الإفتراضية الخاصة ب anaconda و التي تكون بإسم conda مع برنامج pycharm بحيث لا تحتاج في كل مرة لإنشاء بيئة إفتراضية او إعادة تحميل نفس المكاتب، في هذه الحالة ستربح الوقت و تربح ايضا مكان للتخزين. لتثبيت Conda قم بتنزيل أحدث نسخة من Anaconda من الموقع الرسمي، بعد تثبيته و من داخل برنامج pycharm انقر على Python Interpreter في اللوحة اليمنى، ستظهر لك قائمة بالمفردات والبيئات المتاحة لـ Python. في أعلى النافذة، يمكنك اختيار Conda من القائمة المنسدلة.
-
في Express.js، يمكن استخدام الشرط الذي يحتوي على return كجزء من middleware. Middleware في Express.js هو وظيفة تأخذ ثلاثة معاملات: request (طلب), response (استجابة), و next (وظيفة للانتقال إلى middleware التالي في السلسلة). الـ return يمكن استخدامه لإيقاف تنفيذ middleware والرد على العميل مباشرة دون الحاجة للمرور إلى middleware التالي. بالنسبة للاستبدال، يمكن استخدام middleware لتنفيذ العديد من الأشياء مثل التحقق من الصلاحيات، تنقية البيانات، إعداد البيئة، وغيرها. إذا كنت بحاجة إلى تنفيذ تفاصيل محددة داخل شرط if، يمكنك استبداله بمشتق middleware واستخدامه في التطبيق بنفس الطريقة. و هذا مثال بسيط للكود: // Middleware الأصلي بشرط if function customMiddleware(req, res, next) { if (someCondition) { return res.status(403).send('تم رفض الوصول'); } next(); } // استبدله بمشتق middleware function customMiddleware(req, res, next) { // تنفيذ الشرط هنا if (someCondition) { return res.status(403).send('تم رفض الوصول'); } next(); } يعني يمكنك استبدال شرط if بمشتق middleware إذا كان هذا الشرط يناسب احتياجات تطبيقك بشكل أفضل.
- 3 اجابة
-
- 1
-
يلزم تضيف python ل PATH ايضا عشان يتم استخدام الأمر الخاص به. لإضافة Python إلى متغير PATH في نظام Windows ، يمكنك اتباع الخطوات التالية: ابدأ بفتح نافذة موجه الأوامر (Command Prompt). اكتب الأمر التالي للعثور على مكان تثبيت Python على جهاز الكمبيوتر الخاص بك: where python سيقوم هذا الأمر بعرض مسار تثبيت Python. انسخ المسار الذي تم عرضه. على سبيل المثال، قد يكون المسار شيئا مشابها لـ "C:\Users\YourUsername\AppData\Local\Programs\Python\PythonXX" حيث XX هو إصدار Python الذي تستخدمه. 4. الآن، قم بإضافة المسار إلى متغير PATH باستخدام الأمر التالي. يجب عليك استبدال <PythonPath>`بالمسار الذي نسخته في الخطوة السابقة: setx PATH "%PATH%;<PythonPath>" على سبيل المثال: setx PATH "%PATH%;C:\Users\YourUsername\AppData\Local\Programs\Python\PythonXX" بعد تشغيل الأمر أعلاه، ستحتاج إلى إعادة تشغيل نافذة موجه الأوامر أو أي تطبيق آخر تستخدم Python لتحديث متغير PATH. يجب أن يكون Python مضافا إلى متغير PATH الخاص بك، وبالتالي يمكنك تشغيل الأوامر والبرامج التي تستخدم Python من أي مكان في نظام الويندوز.
-
سيقومُ الشخص الذي يقابلك في نقطة ما من اللقاء بتقديم مشكلة/تمرين برمجي وسؤالك عن كيفيّة حلّه، أو سيطلب منك أن تشرح له كيفَ تعمل خوارزميّة ما أو ما هو مبدأ هيكل بيانات معيّن، لذا وبطبيعة الحال يجبُ أن تكونَ مستعدًّا لجميع الأسئلة الممكنة، وأن تقومَ بالتدرّب على بعض الخوارزميات الهامّة والمستخدمة بكثرة ومن أهم هذه الخوارزميات ما يلي: خوارزميات الـ Graph: Breadth First Search (BFS) Depth First Search (DFS) Dijkstra خوارزميات البرمجة الديناميكيّة (Dynamic Programming): أطول سلسلة جزئيّة مشتركة (Longest Common Subsequence) أطول سلسلة جزئيّة متزايدة (Longest Increasing Subsequence) مشكلة حقيبة الظهر 1/0 Knapsack Problem خوارزميات البحث والترتيب (Sorting & Searching Algorithms): البحث الثنائي (Binary Search) الترتيب السريع (Quick Sort) الترتيب الدمجي (Merge Sort) خوارزمية نوث-برات-نوريس (Knuth-Morris-Pratt Algorithm) هياكل البيانات (Data Structures): شجرة فنويك/ الشجرة الثنائية (Fenwick tree/ Binary Tree) الشجرة الإحصائية (Segment Tree) المخطط (Graph) جدول التجزئة (Hash Table) المكدسات والأرتال (Stacks & Queues) بالطبع، هناكَ المزيد والمزيد ولكنّني قمتُ بذكر أهمّها. المقابلات التقنية تتضمن عادة عدة مراحل تهدف إلى تقييم مهارات وقدرات المرشحين. هذه المراحل تشمل: مقابلة مباشرة عن بعد: في هذه المرحلة، يتحدث المتقدم مع ممثل من الشركة عادة مدير الفريق أو موظف من قسم الموارد البشرية. الهدف من هذه المرحلة هو التعرف على المرشح وتقديم نظرة عامة على خلفيته وتجربته. اختبار من المنزل: يُطلب من المرشح حلاً لمشكلة برمجية أو مهمة تقنية تقوم بإرسالها عادة عبر الإنترنت. يتيح هذا الاختبار للشركة تقييم مهارات البرمجة والقدرة على حل المشكلات لدى المرشح. مقابلة تقنية مباشرة: في هذه المرحلة، يتم إجراء مقابلة وجهاً لوجه في مبنى الشركة. يمكن أن تتضمن هذه المرحلة عدة مقابلات تقنية حيث يتم تقديم مشاكل برمجية وتحديات تقنية للمرشح لحلها أو شرح مفاهيم تقنية. الجوانب الرئيسية التي يتم تقييمها تشمل: الجانب التقني: يُطلب من المرشح حلاً لمشكلة برمجية أو شرح كيفية عمل تقنية أو خوارزمية معينة. يجب أن يكون المرشح على دراية بالخوارزميات والهياكل البيانية وغيرها من المفاهيم التقنية. الجانب السلوكي: يتم تقييم سلوك المرشح وقدرته على التواصل والتعامل مع الفريق. يُطلب من المرشح الإجابة عن أسئلة حول تجاربه السابقة وكيفية تعامله مع التحديات والصراعات. الجانب المنطقي: يتم تقييم قدرة المرشح على حل المشكلات والتفكير الإبداعي. يمكن أن تتضمن هذه المرحلة أسئلة تحتاج إلى تحليل منطقي واستخدام التفكير النقدي. في النهاية، بعد اجتياز مراحل المقابلات التقنية، يُخبر المرشح بالنتيجة وقد يتم تقديم عرض وظيفي إذا تم اختياره. كيف تحضر لمقابلة عمل لوظيفة مهندس برمجيات؟
-
رسالة "could not find or load main class" تعني أن نظام التشغيل لا يمكنه العثور على الصنف الرئيسي (Main Class) الذي يجب أن يتم تنفيذه عند تشغيل البرنامج. هناك العديد من الأسباب التي يمكن أن تؤدي إلى هذه المشكلة. لحل المشكلة: 1. انقر بزر الماوس الأيمن على مشروعك في مستكشف المشروع (Project Explorer). 2. انقر على الخصائص (Properties). 3. انقر على تشغيل (Run). 4. تأكد من أن الصنف الرئيسي (Main Class) هو الصنف الذي تريد أن يكون نقطة الدخول لبرنامجك. (تأكد من استخدام الاسم الكامل للصنف، على سبيل المثال mypackage.MyClass). 5. انقر على موافق (OK). 6. قم بتنظيف وبناء مشروعك (Clean and Build your project). 7. قم بتشغيل المشروع (Run Project). باستخدام هذه الخطوات، يجب أن تتمكن من تصحيح مشكلة "could not find or load main class" وتشغيل برنامجك بنجاح.
-
إذا كنت تواجه هذه المشكلة عند محاولة تشغيل الأمر "taskaty" في Visual Studio Code او command line، فهذا يشير عادة إلى أن النظام لا يعرف ماهية الأمر الذي تحاول تنفيذه. لحل هذه المشكلة، قم بالتحقق من PATH environment variable للتأكد من أنه يتضمن المجلد الذي يحتوي على البرنامج أو الأمر الذي تحاول تشغيله. إذا لم يكن هذا المجلد مدرجا في PATH، يجب عليك إضافته.
- 7 اجابة
-
- 1
-
يمكنك إنشاء تطبيق HR يخزن بيانات الموظفين في Google Sheets باستخدام لغة البرمجة Python وGoogle Sheets API. إليك مثال على كيفية البدء: قبل أن تبدأ عليك تثبيت المكتبة اللازمة، تأكد من أنك قمت بتثبيت المكتبة الخاصة بـ Google Sheets API باستخدام pip: pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib من ثم يجب إعداد مشروع Google API بالخطوات التالية: 1. قم بالانتقال إلى موقع https://console.developers.google.com/ وأنشئ مشروع جديد. 2. انقر على "مشروع" ثم "إعداد مشروع" لتمكين Google Sheets API. 3. انشئ مفتاح API وقم بتنزيله. احتفظ به بشكل آمن. الآن سنقوم بالبرمجة باستخدام Python للوصول إلى Google Sheets. يفترض أن لديك ملف JSON يحتوي على مفتاح API الذي قمت بإنشائه. import gspread from oauth2client.service_account import ServiceAccountCredentials # تكوين التفويض scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] creds = ServiceAccountCredentials.from_json_keyfile_name("اسم_ملف_JSON.json", scope) client = gspread.authorize(creds) # اختيار وفتح ورقة العمل worksheet = client.open("اسم_ورقة_العمل").sheet1 # إضافة موظف جديد new_employee = ["اسم الموظف", "العنوان", "رقم الهاتف", "البريد الإلكتروني", "الوظيفة"] worksheet.append_row(new_employee) # قراءة البيانات data = worksheet.get_all_records() print(data) هذا الكود يمكنك من إضافة موظف جديد إلى ورقة العمل وقراءة البيانات منها. يمكنك تخصيص الأعمدة والصفوف وفقا لاحتياجاتك. تأكد من استبدال "اسم_ملف_JSON.json" بمسار ملف JSON الذي قمت بتنزيله من مشروع Google API الخاص بك، واستبدال "اسم_ورقة_العمل" باسم ورقة العمل التي تريد استخدامها.
-
حاليا لا تستطيع العمل بعمر 14 سنة في مستقل بسبب شروط الاستخدام التي يمكنك الاطلاع عليها من هنا: https://mostaql.com/p/terms بحيث يتطلب ان يكون عمر المستخدم أكبر من 18 سنة.
- 7 اجابة
-
- 1
-
المشكلة التي تواجهينها يمكن ان تكون لعدة أسباب،سأحاول طرح الحلول الممكنة لحل المشكل و تجنب هكذا مشاكل في المستقبل. تأكدي من أنك قمت بتعديل عنوان الرابط الثابت بشكل صحيح وأنه لا يحتوي على أي أخطاء أو مسافات فارغة، يجب أن يتضمن الرابط أحرفا وأرقاما فقط ومسطرة (_) أو علامات تحت السطر (-). بعد تعديل الرابط الثابت، قومي بالتحقق مما إذا كانت هناك أية روابط أو صفحات أخرى تشير إلى المقال السابق باستخدام الرابط القديم. إذا كان هناك، قم بتحديث تلك الروابط لتشير إلى الرابط الجديد. بعد ضمان أن جميع الروابط تشير إلى الرابط الجديد، قومي بالذهاب إلى لوحة تحكم بلوجر واختاري المقال الذي قمت بتعديله. ثم، قومي بالنقر على "تحرير" وتأكدي من أن الرابط الثابت الجديد تم تحديده بشكل صحيح. إذا ما زالت المشكلة قائمة، قد تحتاجين إلى تجربة إعادة بناء ملف sitemap لموقعك وتقديمه إلى محركات البحث مثل جوجل لضمان ارشفة المقال الجديد وربطه بالرابط الثابت الجديد. في حال استمرت المشكلة، يمكنك البحث يمكنك التواصل مع الدعم الفني لبلوجر ليوضحو حلهم المقترح في مثل هكذا حالات.