דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • ברירת מחדל (ללא עיצוב (ברירת מחדל))
  • ללא עיצוב (ברירת מחדל)
כיווץ
מתמחים טופ
ר

רנדומלי

@רנדומלי
אודות
פוסטים
46
נושאים
10
שיתופים
0
קבוצות
0
עוקבים
0
עוקב אחרי
0

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • מדריך | שימוש במודול ConfigParser של Python על מנת לכתוב ולקרוא קבצי תצורה (ini)
    ר רנדומלי

    תגובה: שאלה | דרך נוחה לשמור הגדרות משתמש בפיתון.

    רקע

    תוכנה שכתובה בפיתון הייתה זקוקה בדחיפות לדרך לשמור הגדרות והעדפות משתמש. כמובן שהייתי יכול לכתוב את כל ההגדרות לקובץ טקסט כלשהו, להמציא פורמט וליישם לו פרוטוקול. אבל כבר למדתי על בשרי בעבר לאחר שעמלתי חודשים על יישום פרוטוקולים חדשים פרי מוחי המבריק, שהיו כאלו שהקדימו אותי – שתלו קוד, ניכשו באגים, עקרו קוצים שיפרו ושיפצו, ואז הפיצו לאחרים חילם – או בקיצור – אל תמציא את הגלגל.

    בעקבות ניסיוני רב השנים ידעתי שיש תוכנות רבות שמשתמשות בקובץ בעל סיומת ini על מנת לכתוב לתוכו את ההעדפות, ההגדרות וכל שאר ירקות התלויים במשתמש ספציפי. לאחר שלא ידעתי בעצמי איך משתמשים בקבצים האלו בפיתון, שאלתי שאלה בפורום, אך לאחר שהתגובה היחידה לשאלה שלי נמחקה עוד לפני שעיניי זכו לשזוף אותה, ניסיתי לחפור בעצמי ברחבי המרשתת למרות שאנגלית היא לא הצד החזק שלי, ואני וגוגל טרנסלייט לא מסתדרים במיוחד.

    והנה מצאתי ספריית פיתון שיודעת להתעסק עם קבצים מהסוג הנ"ל. ולא סתם ספרייה, היא מובנת בתוך פיתון ולא צריך להתקין אותה. היות ולא מצאתי שום מדריך לשימוש בספרייה הזאת בעברית סטנדרטית, נאלצתי לכתוב אותה בעצמי, ואז גמרתי אומר לפרסם אותה כי אני מעריץ של קוד פתוח... המדריך הוא בסיסי בלבד ואינו מתיימר להקיף את כל הארגומנטים והמתודות שיש לספרייה להציע.

    מבנה קובץ תצורה ini

    המבנה של הקובץ הוא בסיסי ופשוט. הקובץ מחולק לפסקאות ולכל פסקה יש כותרת – הכותרת נכתבת בין סוגריים מרובעות. לאחר הכותרת ישנם זוגות של מפתחות וערכים (Keys and values) כשבין המפתח והערך יש תו מפריד (בדרך כלל "=" לפעמים ":").

    [paths]
    user = user/path
    log = log/path
    language_files = language/files/path
    
    [settings]
    language = Hebrew
    background = dark
    

    אם נשווה את זה לפיתון זה ייראה לנו כמו מילון (Dictionary) מקונן, כלומר, מילון ראשי שמכיל מפתחות שהן הכותרות של הפסקאות, ולכל מפתח כזה יש ערך שהוא מילון בעצמו. לא פלא שכך בחרו המפתחים של הספרייה להתייחס לקבצי ה-ini בבואם לכתוב קוד שיפענח אותם.

    יצירת קובץ תצורה באמצעות פיתון

    ראשית נייבא את הספרייה configparser בעצם, אנחנו זקוקים למודול ConfigParser בלבד, לכן נייבא רק אותו כדי להקל על העבודה. לאחר מכן נגדיר את המשתנה שיהיה מעתה "משתנה התצורה שלנו".

    from configparser import ConfigParser
    config = ConfigParser()
    

    עכשיו נוכל להוסיף למשתנה הזה צמדים של מפתחות וערכים, כשהם נמצאים מתחת לכותרת. לדוגמא:

    config['paths'] = {
        'user': 'user/path',
        'log': 'log/path',
        'language_files': 'language/files/path'
    }
    

    שימו לב שאנחנו ניגשים למפתח paths במילון שהוא הכותרת ומגדירים תחתיו מילון של מפתחות וערכים.
    ניתן גם להגדיר תחילה את הכותרת כמפתח שהערך שלו הוא מילון ריק, ולאחר מכן למלא את המילון במפתחות וערכים:

    config['settings'] = {}
    config['settings']['language'] = 'Hebrew'
    config['settings']['background'] = 'dark'
    

    שימו לב, כל הערכים שהגדרנו עד כה, אינם מופיעים בשום קובץ. את כל הערכים הכנסנו לתוך משתנה שהוא בעצם class שיודע לתרגם פיתון לקובץ תצורה תקין.

    אז איך אנחנו כותבים את כל ההגדרות שלנו לקובץ, כדי שהם יישמרו גם לאחר שהסקריפט שלנו יסיים את ריצתו? לשם כך נכתבה המתודה write שאליה נעביר אובייקט קובץ כשהוא פתוח במצב כתיבה:

    with open('config.ini', 'w') as file:
        config.write(file)
    

    לאחר שנריץ את הסקריפט הזה נוכל לחזות בקובץ הנוצר:

    [paths]
    user = user/path
    log = log/path
    language_files = language/files/path
    
    [settings]
    language = Hebrew
    background = dark
    

    חשוב לשים לב, לרוב פשטותו, קובץ תצורה שומר את כל הנכתב בו כטקסט פשוט, הוא לא תומך בשום פורמט אחר. כך שתוכלו לכתוב בפיתון ערכים מסוג int או bool אבל פיתון ימיר אותם לטקסט בבואו לכתוב אותם לתוך קובץ התצורה.

    סקריפט:
    config['different_type'] = {
        'int': 50,
        'float': 1.45,
        'bool': False
    }
    
    קובץ תצורה:
    [different_type]
    int = 50
    float = 1.45
    bool = False
    

    לכן כשאתם משתמשים בקבצי תצורה מסוג זה עליכם לדאוג להמיר את סוגי הערכים בחזרה לפני שאתם מבצעים עליהם מניפולציות.

    הערה נוספת: המפתחות בקובץ התצורה אינן תלויי ראשיות (כלומר אין הבדל בין אותיות קטנות לגדולות) כך שגם אם תכתבו את המפתח בסקריפט באותיות גדולות, המפתחות בקובץ תמיד ייכתבו באותיות קטנות. (זה נכון רק לגבי המפתחות – הכותרות והערכים כן תלויי ראשיות).

    קריאת קובץ ושינוי שלו

    עבור קריאת קובץ תצורה ושינוי שלו נשתמש במתודה rade ונספק לה את הנתיב לקובץ שאותו נרצה לקרוא:

    from configparser import ConfigParser
    config = ConfigParser()
    config.read('config.ini')
    

    לאחר שקראנו את הקובץ הוא נמצא בתוך המשתנה שלנו, ואז נוכל לגשת למפתחות ולערכים שנמצאים בתוכו, לקרוא אותם ולשנות אותם.
    הדרך הפשוטה ביותר לעשות זאת היא באמצעות כתיבת שם הכותרת והמפתח:

    print(config['paths']['user']) # user/path
    

    אבל באופן זה אם הערך לא נמצא פיתון יחזיר לנו שגיאת KeyError (מפתח לא נמצא). אנו יכולים להשתמש במתודה get שמאפשרת לקבל את הערך, ובמקרה שהערך לא נמצא היא תחזיר None או שנוכל לספק בעצמנו ערך ברירת מחדל למקרה שהערך לא יימצא:

    print(config.get('paths', 'user', fallback='C:/Users/USER/'))
    

    נוכל לשלוף את שמות כל הכותרות על ידי המתודה sections ולאחר שיש לנו את שמות הכותרות נוכל לשלוף מקטעים שלמים כמילונים:

    print(config.sections()) # ['paths', 'settings']
    print(dict(config['paths']))
    # {'user': 'user/path', 'log': 'log/path', 'language_files': 'language/files/path'}
    

    אם נרצה להוסיף שורה חדשה תחת כותרת קיימת, ניגש אל הכותרת, ולאחר מכן נוסיף את המפתח בתוך סוגריים מרובעות ונוסיף לתוכו את הערך. אפשר גם להוסיף מקטעים חדשים לגמרי.

    # New value
    config['paths']['icon'] = 'icon/path'
    
    # New section
    config['Usage data'] = {
        'Days': 12,
        'Hours': 8
    }
    

    אם נרצה לשנות ערך קיים, נוכל לגשת אליו על ידי הכותרת והמפתח שלו:

    print(config['paths']['user']) # user/path
    config['paths']['user'] = 'user/new/path'
    print(config['paths']['user']) # user/new/path
    

    אבל שימו לב, כל השינויים שנעשים אינם נשמרים אל הקובץ הם שמורים לעת עתה רק בתוך המשתנה שלנו, כשנרצה לשמור את השינויים לקובץ נקרא שוב למתודה writh ונעביר לה את הקובץ שלנו כשהוא פתוח במוד כתיבה:

    with open('config.ini', 'w') as file:
        config.write(file)
    

    והנה קובץ התצורה המעודכן שלנו:

    [paths]
    user = user/new/path
    log = log/path
    language_files = language/files/path
    icon = icon/path
    
    [settings]
    language = Hebrew
    background = dark
    
    [Usage data]
    days = 12
    hours = 8
    

    בהצלחה.

    עזרה הדדית - Python

  • הצעת ייעול | התקנת חבילות פיתון בנטפרי בלי התקנת תעודות אבטחה
    ר רנדומלי

    תגובה: מדריך | התקנת פייתון וחבילות pip (בדגש לנטפרי)

    אפשר לנסות תחביר זה (להחליף את PACKAGE בשם החבילה הרצויה), תחביר זה מונע את הצורך להתקין תעודת אבטחה ומתקינה את החבילות בצורה תקנית גם בנטפרי:

    pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org PACKAGE
    
    עזרה הדדית - Python

  • שאלה | הודעה מוזרה בקונסולה של Edge
    ר רנדומלי

    @איש-פשוט-מאוד
    צדקת. זה בגלל נטפרי.
    הנה הודעות הקונסולה ב־Chrome:
    71938a37-dd47-4f39-9dc9-cdf1bf273380-image.png
    לעומת ההודעה ב־Edge:
    aa951303-4221-48e8-ae07-a666c5bb682e-image.png
    כנראה שמייקרוסופט יישמו את 418 בדפדפן שלהם (כמו שכשתשלח קוד 404 או 403 ל־Chrome הוא יציג את הודעת השגיאה ברירת המחדל). מלבד זאת, הם החליטו שכנראה זה יהיה מגניב לתרגם את כל הודעות השגיאה לעברית - ויצא העגל הזה.

    כללי - עזרה הדדית

  • הסבר | תגובה חריגה מ- Gemini
    ר רנדומלי

    @עדלאידע
    שאלת: למה שג'מיני יכתוב דבר שלא תכנתו אותו לכתוב?

    אז זהו, פשוט לא מתכנתים אותו לכתוב. אף אחד לא ישב וכתב עץ דו שיח ענק שמכניס אל תוכו את כל השאלות האפשריות ואת כל התשובות הנכונות אליהן.
    הרעיון המנחה של "בינה מלאכותית" כיום הוא, שהמכונה תלמד בעצמה מה נכון לכתוב, או לצייר.

    בקליפת אגוז - מכניסים אל המכונה מיליוני טקסטים, OpenAI, Google וכל שאר חברות הטכנולוגיה קצרו את כל הטקסטים האפשריים מכל רחבי המרשתת והזינו אותן אל המכונה. והמכונה ניתחה את כל הטקסטים האלו והסיקה מהן בעצמה מהי שפה, מה נכון, מה לא נכון, איך שואלים שאלה, ואיך נכון לענות עליה.
    אף אחד, כולל המדען הראשי של OpenAI לא ידע להסביר לך מה גרם למכונה לענות תשובה א' ולא תשובה ב', מה גרם לה להתנסח באופן ג' ולא באופן ד'. אין לנו דרך לחזות מראש מה תהיה תגובתה של המכונה.

    הבעיה הגדולה של התהליך הזה שהמכונה יכולה לפעמים להיות גזענית, לא מכבדת ולא מנומסת. לכן חברות הטכנולוגיה מצפות את המודלים שלהם בשכבה שאמורה למנוע את כל הבעיות האלו, אבל היות שאין לנו אפשרות לחזות את כל הדרכים שבהן בני אדם ישתמשו במכונה, החברות צריכות כל הזמן לעדכן את המודלים שלהם בהתאם לבעיות שנוצרות. (למי שלא זוכר, בעבר הלא כל כך רחוק, בתחכום קליל היה אפשר לבקש מGPT מפתחות של וינדוס או אפילו מתכון איך להכין פצצה בבית).

    אכן, קצת מפתיע שגוגל לא דאגה לזה שג'מיני לא יבקש מהמשתמשים בו למות, אבל דברים מעין אלו יכולים בהחלט לקרות.

    עזרה הדדית - בינה מלאכותית

  • בקשת מידע | אונקי של Transcend, מהי רמת האמינות שלו.
    ר רנדומלי

    מצטער על כך שתגובה אומללה שלי הצליחה להסיט את נושא האשכול.
    בכל אופן @משחזר-מידע אשמח לדעת על כוננים של איזו חברה אתה נוטה לסמוך.

    כללי - עזרה הדדית

  • בקשת מידע | קיבלתי את ההודעה הזו במייל. זה הונאה או אמיתי?
    ר רנדומלי

    @DAVID-MMOD
    מעניין באמת - כי יש לי כמה השגות קטנות על השיטה שלהם, אם יורשה לי.
    הקישור שהוא קיבל הוא קישור מקוצר שמוביל לדף התשלום, הקישור בנוי מהקידומת https://dsvisrael.page.link/
    ולאחריו שתי אותיות גדולות ושני מספרים. זאת לא בעיה גדולה לבנות סקריפט מעניין שבודק את כל 67,600 הלינקים האפשריים, ואתה מקבל שמות של אנשים + הכתובת המלאה שלהם + המוצר שהם הזמינו + המחיר שלו. בסיס נאה כדי לבנות עליו הונאה טובה...

    עזרה הדדית - מחשבים וטכנולוגיה

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    הקטנתי את התפריט, ואפשרתי להחליף רקע בלי לאבד את כל העבודה הקודמת.

    התבססתי על הסקריפט המקורי + כפתור הביטול של @נחמן-פלח (מקווה שלא הפרתי זכויות יוצרים או משהו).

    שימו לב שביטול הפעולה האחרונה חלה רק על הקווים המצוירים ולא על צבע הרקע.
    כמו כן - לפני שאתם קובעים צבע רקע, הורידו את הסימון מ"רקע שקוף" על מנת שתוכלו לראות את הצבע.

    יוצר המנדלות + ביטול פעולה אחרונה.zip

    עריכה: @נחמן-פלח אני רואה שתיקנת את השגיאה, אם תרצה שאמחק את הפוסט - תעדכן.

    כללי - עזרה הדדית

  • שאלה | תגובה לכיבוי אוטומטי ללא הפעלה חוזרת - תגובה ל"מייעל צריכת חשמל"
    ר רנדומלי

    אם תשתמש בשעון שבת, השעון גם יפעיל את המזגן בחזרה כעבור הזמן שהגדרת לו.
    המטרה של הטכניקה שמציע @רפאל-0 היא לכבות את המזגן לגמרי ולא להיות תלוי בשעון שבת שידפוק כמו שעון גם בימים שבהם אין לימודים במוסד.

    המטרה של שעון השבת במקרה שלנו, היא לנתק לרבע שעה את המגען, ובכך לכבות את המזגן עד שמישהו ילחץ שוב על הכפתור וידליק אותו.

    חשמל - שונות

  • הסבר | תגובה חריגה מ- Gemini
    ר רנדומלי

    @עדלאידע
    בוודאי!
    הכוונה שלי הייתה לומר שזאת לא רשימה לבנה אלא רשימה שחורה (-כי הם לא רוצים להגביל את היצירתיות של המודל) והיות שאי אפשר לחזות באמת את כל סוגי השימוש הקיימים - יש פספוסים.

    עזרה הדדית - בינה מלאכותית

  • בקשת מידע | אונקי של Transcend, מהי רמת האמינות שלו.
    ר רנדומלי

    @משחזר-מידע כתב בבקשת מידע | אונקי של Transcend, מהי רמת האמינות שלו.:

    מן הסתם כמו כל הזבל של כל הטכנולוגיה הזאת ולא משנה מה שם היצרן
    או אם תרצה... מן הסתם שוה ערך לאונקי שמונח עכשיו אצלי על השלחן לשיחזור

    אם מותר לשאול, בכוננים של איזו חברה אתה משתמש?

    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @רפאל-vnkl
    יוצר המנדלות.zip

    הוספתי תיבת בחירה לרקע שקוף, בדרך גם תיקנתי את התיבה של הפקדים - שתהיה מימין לשמאל.
    זה רלוונטי רק לתמונה שיורדת בלחיצה על שמור - לא רואים את השינוי במחולל עצמו.


    עריכה: אני רואה שבאתר לא שמים לב להבדל, אבל אם תורידו את התמונות תראו שהראשון בעל רקע לבן והשני בעל רקע שקוף.

    לבן.png

    שקוף.png

    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @נחמן-פלח
    אם יורשה לי - שתי הצעות לשיפור.

    ביטול פעולה אחרונה באמצעות ctrl+z (צריך להגדיר id ל-body).

    body.addEventListener("keydown", (event) => {
        if (event.code === "KeyZ" && event.ctrlKey) {
            undoLastAction();
        }
    });
    

    להוציא את החלפת צבע הרקע לפונקציה נפרדת. ולקרוא לה גם בשינוי תיבת הצבע וגם בשינוי תיבת הבחירה של השקיפות:

    function transparencyBackgroundColor() {
        const bgColor = bgColorPicker.value;
        if (!transparencyCheckBox.checked) {
            // רק אם הרקע לא שקוף, עדכן את צבע הרקע
            canvas.style.backgroundColor = bgColor;
        } else {
            // אם הרקע שקוף, אפס את צבע הרקע
            canvas.style.backgroundColor = "transparent";
        }        
    }
    
    bgColorPicker.addEventListener("input", transparencyBackgroundColor);
    transparencyCheckBox.addEventListener("input", transparencyBackgroundColor);
    

    מלבד זאת אם ברירת המחדל היא רקע שקוף - עדיף להשאיר את הסימון של התיבה.
    (ראיתי שאתה מבטל את הסימון בקוד - אבל זה לא גורם לעדכון של צבע הרקע - הוא נשאר שקוף).

    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @נחמן-פלח
    יש לך את הקוד הזה שמוריד את הסימון מהתיבה, אבל לא באמת משנה את הרקע לשקוף.

    // הגדרת ברירת המחדל של רקע שקוף לתיבה של הרקע שקוף לא תהיה מסומנת
    window.onload = () => {
        transparencyCheckBox.checked = false; // ברירת מחדל: לא מסומן
    };
    
    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @נחמן-פלח כתב בלהורדה | מחולל מנדלות איכותי ופשוט:

    חוץ מזה ראיתי שיש לך ידע בhtml האם תוכל לכתוב מדריכים?

    הידע שלי לא מאוד מאורגן. אם אני אדע מה מעניין את הציבור אוכל לנסות לסדר איזה מדריך עליו.

    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @נחמן-פלח
    אני לא מצליח להבין מה הוא עושה בפונקציה של השמירה.
    הנה פונקציה שעובדת:

    saveImageButton.addEventListener("click", () => {
        // קבע את צבע הרקע או קבע רקע כשקוף
        const backgroundColor = transparencyCheckBox.checked ? "rgba(255, 255, 255, 0)" : bgColorPicker.value;
        // צור אלמנט זמני
        const tempCanvas = document.createElement("canvas");
        const tempCtx = tempCanvas.getContext("2d");
    
        tempCanvas.width = canvas.width;
        tempCanvas.height = canvas.height;
    
        tempCtx.fillStyle = backgroundColor;
        tempCtx.beginPath();
        tempCtx.arc(centerX, centerY, centerX, 0, 2 * Math.PI);
        tempCtx.closePath();
        tempCtx.fill();
    
        // צייר את המנדלה
        tempCtx.save();
        tempCtx.beginPath();
        tempCtx.arc(centerX, centerY, centerX, 0, 2 * Math.PI);
        tempCtx.closePath();
        tempCtx.clip();
        tempCtx.drawImage(canvas, 0, 0);
        tempCtx.restore();
    
        // שמור את התמונה
        const link = document.createElement("a");
        link.download = "mandala.png";
        link.href = tempCanvas.toDataURL();
        link.click();
      });
    
    כללי - עזרה הדדית

  • להורדה | מחולל מנדלות איכותי ופשוט
    ר רנדומלי

    @ישראל-142 כתב בלהורדה | מחולל מנדלות איכותי ופשוט:

    קוד חדש כולל כל הפונקציות
    בשילוב הפונקציה (מהקטע קוד של @רנדומלי)
    ותיקון השמירה של הרקע הנבחר.

    הייתי בטוח שכללת גם את הקטע הזה:

    @רנדומלי כתב בלהורדה | מחולל מנדלות איכותי ופשוט:

    ביטול פעולה אחרונה באמצעות ctrl+z (צריך להגדיר id ל-body).

    כללי - עזרה הדדית

  • שאלה | הודעה מוזרה בקונסולה של Edge
    ר רנדומלי

    @צבי-מחשבים
    זאת הבדיחה המקורית

    פרטוקול תקשורת הומוריסטי שיצא לרגל האחד באפריל, בשם - Hyper Text Coffee Pot Control Protocol (HTCPCP):
    שמיועד עבור מכונות קפה.

    הפרוטוקול מבוסס על HTTP עם כמה תוספות רלוונטיות כמו זו:

    HTTP418 I'm a teapot

    Any attempt to brew coffee with a teapot should result in the error
    code "418 I'm a teapot". The resulting entity body MAY be short and
    stout

    כנראה שזה תפס...

    כללי - עזרה הדדית
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר