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

Chihab Hedidi

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

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

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

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

    13

كل منشورات العضو Chihab Hedidi

  1. مرحبا اخي، بخصوص المشكلة اللي عندك اسبابها كثيرة و لكن أكثر سبب منتشر وجدته هو ان نسخة البيثون التي عندك غير مدعمة من طرف هذه المكتبة. حيث بعد اطلاعي على الموقع الخاص بالمكتبة تبين ان النسخة المدعمة للبيثون هي التي بين 3.7 - 3.11 و هذا بخصوص نسخة Kivy 2.2.1 يمكنك التأكد اولا من النسخة ثم محاولة التجربة مرة أخرى اذا كانت عندك النسخة المدعمة يمكنك اعادة التجربة بهذه الأوامر: >> py -3.10 --version >> pip install virtualenv >> py -3.10 venv .venv >> .venv\Scripts\activate >> pip install kivy او هذين الأمرين اللذان يسمحان لك بالتحميل مباشرة من موقع المكتبة: python -m pip install kivy --pre --no-deps --index-url https://kivy.org/downloads/simple/ python -m pip install "kivy[base]" --pre --extra-index-url https://kivy.org/downloads/simple/
  2. مرحبا أخي كريم، جميل جدا انك اختر هذا المجال الذي اصبح حاليا من أكثر المجالات المطلوبة، حيث يتداخل مجال الإعلام الآلي في كل المجالات الأخرى. يمكنك و قبل كل شيء ان تتعلم اساسيات الحاسوب حتى تكون لديك فكرة كاملة على المجال الذي انت فيه و كيف ستتعامل معه، أنصحك بالبدأ بالكورس الموجود هنا في أكاديمية حسوب حيث يغطي الكورس اساسيات هذا المجال بالإضافة الى مدخل لبعض لغات البرمجة مثل ال javascript يمكنك الإطلاع على المزيد من التفاصيل من هنا: بعد تعلمك لهذه الأساسيات اختر طريق معين لتكمل فيه دراستك، و هذا اهم شيء لأي مبرمج حاليا، حيث اذا كنت تنتقل من مجال لآخر ستضيع العديد من الوقت و تجد نفسك تعرف أساسيات كل المجالات و لكن لا تحترف اي واحد منهم. المجالات كثيرة جدا مثل :تطوير المواقع الإلكترونية، تطوير تطبيقات الهاتف، تطوير تطبيقات سطح المكتب، الذكاء الإصطناعي و تعلم الآلة، برمجة الروبوتات و غيرها. يوجد هنا كورسات ايضا لتعلم بعض هذه المجالات فبعد انتهائك من الكورس و اختيارك للمجال الذي وجدت اهتمامك فيه، يمكنك الإطلاع على الكورسات الأخرى لتتقدم أكثر في مسارك.
  3. حل الأسئلة الإختبارية ممنوع و لكن سأقدم لك شرح لتفهم طريقة الحل، لدينا جدول يمثل عمليات مختلفة، ونحن نريد حساب متوسط وقت الانتظار لكل من ثلاثة خوارزميات جدولة مختلفة، الجدول يحتوي على معلومات مثل وقت الوصول، وقت الانفجار ، وقت الدورة، ووقت الانتظار لكل عملية. بخصوص شرح كل خوازمية لدينا : Round Robin (RR): يتم تقسيم الوقت بين العمليات بحيث تحصل كل عملية على قطعة محددة من الوقت ثم تتحول العملية إلى العملية التالية. يتم حساب وقت الانتظار كفارق بين وقت الدورة ووقت الانفجار. Shortest Remaining Time First (SRTF): تقوم بتشغيل العملية ذات الوقت المتبقي الأقل أولا. في كل مرة يتم تغيير العملية إذا كانت هناك عملية جديدة تصبح بأقل وقت متبقي. Priority Scheduling: تعطى الأولوية لكل عملية وتبدأ بتشغيل العملية ذات أعلى أولوية. يتم حساب وقت الانتظار بناء على الفرق بين وقت الدورة ووقت الانفجار. اعتقد ان هذا الشرح كافي لتقوم بحساب متوسط الوقت لكل واحدة، اذا كان لديك سؤال آخر لا تترد في طرحه.
  4. يجب عليك توفير رابط المشكلة لنفهم اكثر لكن في رأيي و حسب فهمي للأمثلة التي طرحتها فإن حل المشكلة هو اكبر substring من دون ان يتكرر الحرف فيه. في المثال الاول الامر واضح اكبر substring هو abc نفس الشيء في المثال الثاني لاننا لا نحتسب تكرار الحروف. اما في المثال الأخير فيوجد اثنين substrigs يوجد wp و wke و بما ان الثاني اطول من الأول فالحل هو wke.
  5. يوجد بعض البرامج التي توفر هذه الخاصية و تتجنب عناء التجربة في كل المتصفحات، احد هذه البرامج المعروفة هو برنامج browserstack حيث يقدم بيئات اختبار افتراضية لتحقيق توافق موقع الويب أو التطبيق عبر مجموعة واسعة من المتصفحات والأنظمة، و حتى يمكنك اختبار تطبيقات الهواتف الذكية على متصفحات مختلفة وأنظمة تشغيل مثل iOS وAndroid. و لكن هذا البرنامج مدفوع و يقدم مهلة مجانيو لتجربته، اذا كان لديك حساب جامعي في github يمكنك الحصول على حزمة المبرمجين في github و من بين الامتيازات تحصل على مدة تجربة اكثر لبرنامج browserstack. اما اذا كانت تبحث عن برامج مشابهة و مجانية يمكنك البحث في قوقل على free cross browser testing و ستجد أمثلة مشابهة لذلك.
  6. لحل المشكلة يمكنك استخدام 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; يمكنك الإطلاع اكثر على هذه العناصر من خلال المقالات التالية:
  7. في هذه الحالة الايرور يظهر لك أنو الملف غير موجود، حاول تجنب استخدام اللغة العربية في تسمية هذه الملفات لأنه يمكن ان تكون غير مدعومة و في نفس الوقت تأكد من أن الملف app.exe موجود في المسار المكتوب، اذا كان غير موجود حاول تسوي compile مرة ثانية للكود.
  8. مرحبا، يوجد حل آخر يمكنك تجربته و هو استخدام 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()
  9. قبل كل شيء أخي دائما حاول إخفاء المعلومات الحساسة الخاصة بالبوت و استخدم ملف .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)
  10. يشير مصطلح دالة callback إلى دالة تمرر كوسيط إلى دالة أخرى. عندما تنتهي الدالة الرئيسية من تنفيذ مهمتها الرئيسية، يتم استدعاء الدالة callback لتنفيذ إجراءات إضافية. يمكنني توضيح الفكرة أكثر بمثال بحيث إذا كنت تعمل على تطبيق ويب وتحتاج إلى تنفيذ مهمة معينة بعد انتهاء عملية معينة مثل تحميل ملف، يمكنك استخدام callback function لذلك. ستمرر الدالة الرئيسية كوسيط عندما تقوم بتشغيل عملية تحميل الملف، وعند اكتمال التنفيذ (بعد اكتمال تحميل الملف)، سيتم تنفيذ ال callback function. لمعرفة أن الدالة غير مزامنة، نفرض أنه لدينا دالتين الأولى بإسم alpha و الثانية بإسم beta، في مرحلة ما من البرنامج نسوي استدعاء للدالة alpha و نمرر الدالة beta as argument مثلا EventListener في هذه الحالة سننتظر حتى تنتهي الدالة alpha من العمل و بعدها ستعمل الدالة beta اي مثل الموضح في هذه الصورة: اما في حالة ان تكون الدالة متزامنة ستنتظر الى انتهاء الدالة beta بعدها تكمل alpha العمل الخاص بها مثل الموضح في الصورة:
  11. مع كل المجالات التي ذكرها الأخ مصطفى يوجد ايضا مجالين أرى أنهم مربحين و لكن القليل من يتجه لهم، لا أقول انه يتم الإعتماد عليهم كعمل رئيسي و لكن يمكنك الكسب من خلالهم بالقيام بمشاريع بسيطة الى أن تتقنهم بالشكل الجيد و هما ال webscraping و automation: من ناحية استخدام ال webscraping يمكن استخراج البيانات من عدة مواقع لتستخدمها في مجال معين، و يوجد الكثير من المشاريع في موقع مستقل الذي يطلبون فيه هذا العمل. تحتاج في هذا المجال تعلم بعض المكتبات في بايثون و أهمها مكتبة Beautiful Soup. اما من ناحية ال automation او الأتمتة، حاليا يوجد الكثير من الأعمال المتكررة في المواقع و التي تأخذ وقت في بعض الأحيان بالرغم من أنها بسيطة، في هذه الحالة نستخدم الأتمتة ليقوم السكريبت او الكود البرمجي بالقيام بالعمل بدل عن المستخدم. يمكنك الدخول الى المجال عبر مكتبة Selenuim التي أراها سهلة للتعلم و لن تستهلك منك الوقت و الجهد. https://io.hsoub.com/tech/150826-أتمتة-المهام-باستخدام-مكتبة-selenium-ولغة-البايثون
  12. واجهت هذه المشكلة من قبل، الحلول تختلف من كمبيوتر لآخر، أحد الحلول التي اشتغلت معي هي تغيير طريقة التشفير لواحدة تقبل اللغة العربية و المستخدمة حاليا هي 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()
  13. و يمكنك التحسين أكثر على الكود بحيث يصبح شغال مع أي رقم و ليس فقط مع الرقم 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 بأي رقم تريد.
  14. من خلال تجربتي كنت دائما استخدم venv، و لكن مؤخرا وجدت انها تستهلك الكثير من حجم التخزين، حيث انهم يكون لكل مشروع بيئة افتراضية خاصة به، و إن كنت تعمل على العديد من المشاريع سيكون عليك تحميل المكتبات لكل مشروع لوحده، حتى اذا كانت هناك مكاتب مشتركة بين المشاريع سيتعين عليك تحميل عدة مرات خاصة بكل مشروع. أحد الحلول التي وجدتها هي استخدام البيئة الإفتراضية الخاصة ب anaconda و التي تكون بإسم conda مع برنامج pycharm بحيث لا تحتاج في كل مرة لإنشاء بيئة إفتراضية او إعادة تحميل نفس المكاتب، في هذه الحالة ستربح الوقت و تربح ايضا مكان للتخزين. لتثبيت Conda قم بتنزيل أحدث نسخة من Anaconda من الموقع الرسمي، بعد تثبيته و من داخل برنامج pycharm انقر على Python Interpreter في اللوحة اليمنى، ستظهر لك قائمة بالمفردات والبيئات المتاحة لـ Python. في أعلى النافذة، يمكنك اختيار Conda من القائمة المنسدلة.
  15. نعم نفسه عبارة عن java IDE و لكن من خلال تجربتي مع البرنامجين اراه افضل من netbeans.
  16. المشكلة هذي دائما تصير مع netbeans، اذا تقدر افضل تنتقل لبرنامج intellij
  17. العفو اخي
  18. في 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 إذا كان هذا الشرط يناسب احتياجات تطبيقك بشكل أفضل.
  19. تمام أخي، العفو و بالتوفيق ان شاء الله في باقي الكورس.
  20. يلزم تضيف 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 من أي مكان في نظام الويندوز.
  21. كنت اقصد الملف الآخر اللي داخل الباكاج اللي اسمه Firstproject.java و تسوي بهذه الطريقة
  22. سيقومُ الشخص الذي يقابلك في نقطة ما من اللقاء بتقديم مشكلة/تمرين برمجي وسؤالك عن كيفيّة حلّه، أو سيطلب منك أن تشرح له كيفَ تعمل خوارزميّة ما أو ما هو مبدأ هيكل بيانات معيّن، لذا وبطبيعة الحال يجبُ أن تكونَ مستعدًّا لجميع الأسئلة الممكنة، وأن تقومَ بالتدرّب على بعض الخوارزميات الهامّة والمستخدمة بكثرة ومن أهم هذه الخوارزميات ما يلي: خوارزميات الـ 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) بالطبع، هناكَ المزيد والمزيد ولكنّني قمتُ بذكر أهمّها. المقابلات التقنية تتضمن عادة عدة مراحل تهدف إلى تقييم مهارات وقدرات المرشحين. هذه المراحل تشمل: مقابلة مباشرة عن بعد: في هذه المرحلة، يتحدث المتقدم مع ممثل من الشركة عادة مدير الفريق أو موظف من قسم الموارد البشرية. الهدف من هذه المرحلة هو التعرف على المرشح وتقديم نظرة عامة على خلفيته وتجربته. اختبار من المنزل: يُطلب من المرشح حلاً لمشكلة برمجية أو مهمة تقنية تقوم بإرسالها عادة عبر الإنترنت. يتيح هذا الاختبار للشركة تقييم مهارات البرمجة والقدرة على حل المشكلات لدى المرشح. مقابلة تقنية مباشرة: في هذه المرحلة، يتم إجراء مقابلة وجهاً لوجه في مبنى الشركة. يمكن أن تتضمن هذه المرحلة عدة مقابلات تقنية حيث يتم تقديم مشاكل برمجية وتحديات تقنية للمرشح لحلها أو شرح مفاهيم تقنية. الجوانب الرئيسية التي يتم تقييمها تشمل: الجانب التقني: يُطلب من المرشح حلاً لمشكلة برمجية أو شرح كيفية عمل تقنية أو خوارزمية معينة. يجب أن يكون المرشح على دراية بالخوارزميات والهياكل البيانية وغيرها من المفاهيم التقنية. الجانب السلوكي: يتم تقييم سلوك المرشح وقدرته على التواصل والتعامل مع الفريق. يُطلب من المرشح الإجابة عن أسئلة حول تجاربه السابقة وكيفية تعامله مع التحديات والصراعات. الجانب المنطقي: يتم تقييم قدرة المرشح على حل المشكلات والتفكير الإبداعي. يمكن أن تتضمن هذه المرحلة أسئلة تحتاج إلى تحليل منطقي واستخدام التفكير النقدي. في النهاية، بعد اجتياز مراحل المقابلات التقنية، يُخبر المرشح بالنتيجة وقد يتم تقديم عرض وظيفي إذا تم اختياره. كيف تحضر لمقابلة عمل لوظيفة مهندس برمجيات؟
  23. لا لا الملف اللي تحت Firstproject.java
  24. جرب اضغط بالزر الأيمن للفأرة على الملف و سوي run file
×
×
  • أضف...