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

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
E

eido

@eido
אודות
פוסטים
255
נושאים
26
שיתופים
0
קבוצות
0
עוקבים
0
עוקב אחרי
0

פוסטים

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

  • יש חלופה טובה/עדכנית לרקורסיה?
    E eido

    @chv הקוד שלי הוא כזה:
    לשחזור:

    function getAllFilesAndDiresToUpload(path, parentFolder)
    {
      Logger.log("מתחיל למצוא קבצים");
      Logger.log("התיקיה היא: " + parentFolder.getName());
      let urls = [], urlsBigFiles = [];
    // מטפל בצד של ימות המשיח, פחות חשוב לעניננו  
    if(path!=""){
      let tempCreateExtUrl = createExtUrl.replace("{token}", token);
      tempCreateExtUrl += path;
      Logger.log("יוצר תיקיה: " + path);
          let res = UrlFetchApp.fetch(tempCreateExtUrl, {muteHttpExceptions: true});
          let data = JSON.parse(res.getContentText());
    
      if (!data || data.responseStatus !== "OK") {
        sheet.appendRow(["איראה שגיאה", data.message]);
      Logger.log("שגיאה");
      return HtmlService.createHtmlOutput("שגיאה");
      }
    }
    
    // עובר על הקבצים שנמצאים בתיקיה שהועברה כפרמטר (בגוגל דרייב)
    // עושה מהם רשימה שיוכלו לעבור עליה ולהעלות את כל הקבצים ששם
      let files = parentFolder.getFiles(); 
          while(files.hasNext())
          {
            let file = files.next(); 
            if (file.getSize() > 52428800) {
              urlsBigFiles.push(file);
            }
            else{
            urls.push(file);
            Logger.log("נמצא קובץ: " + file.getName());
            }
          }
    
    // קורא לפונקציה שמעלה את הקבצים
          uploadFiles(urls, path);
    
    // מושך את כל התת תיקיות של התיקיה שהועברה כפרמטר
    let folders = parentFolder.getFolders();
    // עובר על כל תיקיה
           while(folders.hasNext())
          {
            let folder = folders.next();
    // מפעילה עליה את הפונקציה הנוכחית ומעביר את התיקיה הנבחרת כפרמטר
            getAllFilesAndDiresToUpload(path+"/"+folder.getName() ,folder);
          }
    
    }
    

    לגיבוי

    function getAllFilesAndDires1(path, parentFolder){
      let filesTodownload=[];
      
    // החלק של ימות המשיח, לא רלוונטי לנו.
      let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
      tempGetDirDataUrl +=  path;
      let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
      let data = JSON.parse(res.getContentText());
    
      if (!data || data.responseStatus !== "OK") {
        sheet.appendRow(["איראה שגיאה", data.message]);
      Logger.log("שגיאה");
      return HtmlService.createHtmlOutput("שגיאה");
      }
    
    // עובר על כל סוגי הקבצים ומוסיף אותם לרשימה שבה משתמשים אח"כ כדי להוריד את הקבצים
      if (data.files && data.files.length)
      {
        data.files.forEach(file => {
            let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what);
            filesTodownload.push([file.name,tempGetFileUrl]);
    
            if(file.meta != null && !(file.what.endsWith(".ygmr")))
            {
              tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(file.what.replace(/\.[^/.]+$/, ".txt"));
              filesTodownload.push([file.name.replace(/\.[^/.]+$/, ".txt") ,tempGetFileUrl]);
            }
        })
      }
    
      if (data.ini && data.ini.length)
      {
        data.ini.forEach(ini => {
        let tempGetFileUrl = getFileUrl.replace("{token}", token) + encodeURIComponent(ini.what) 
        filesTodownload.push([ini.name,tempGetFileUrl]);
        })
      }
    
    // קורא לפונקציה להורדת הקבצים
      DownloadFile(filesTodownload, parentFolder);
    
    //אם יש תת תיקיות
        if (data.dirs && data.dirs.length)
      {
    // עובר עליהם
        data.dirs.forEach(dir => {
          if (dir.what !== "ivr2:/Trash"){
    //  יוצר  תיקיה (בדרייב) בתוך התיקיה שהועברה כפרמטר באותו השם של התיקיה בימות המשיח
          const subFolder = parentFolder.createFolder(dir.name);
    // קורא לפנוקציה עצמה שוב, עם התיקיה החדשה שנוצרה כפרמטר
          getAllFilesAndDires1(dir.what, subFolder);
          }
        })
      }
    
    }
    

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

    let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
    let dirInDataIndex = Number(PropertiesService.getScriptProperties().getProperty("dirInDataIndex"));
    let dirIndex = Number(PropertiesService.getScriptProperties().getProperty("dirIndex"));
    let dirList = sheet.getRange(1,1,sheet.getLastRow()-1,2).getValues();
    const startTime = Date.now();
    
    function getDirs(){
    // בודק אם יש בשיטס תיקיות שעוד לא עברו עליהם
    while (dirInDataIndex<dirList.length)
    {
      let newDirList=[];
    
    // החלק של ימות המשיח
        let tempGetDirDataUrl = getDirDataUrl.replace("{token}", token);
              tempGetDirDataUrl +=  dirList[dirInDataIndex][0];
              dirInDataIndex++;
              let res = UrlFetchApp.fetch(tempGetDirDataUrl, {muteHttpExceptions: true});
              let data = JSON.parse(res.getContentText());
    
              if (!data || data.responseStatus !== "OK") {
              sheet.appendRow(["איראה שגיאה", data.message]);
              Logger.log("שגיאה");
              return HtmlService.createHtmlOutput("שגיאה");
              }  
    
    // אם יש תיקיות
              if (data.dirs && data.dirs.length)
              {
                for(let i = dirIndex ; i < data.dirs.length ; i++){
    // יוצר תיקיה כשם התיקיה בימות המשיח
                const subFolder = parentFolder.createFolder(data.dirs[i].name)
    // שומר במערך את שם התיקיה ואת הID שלה בדרייב
                newDirList.push([data.dirs[i].name, subFolder.getId()]);
    //בודק אם עברו 5 דקות
                if ((Date.now() - startTime) > 300000)
                  {
    //אם כן, שומר את מצב המעבר בפרופרטיס ואת מערך התיקיות ששמרו עד עכשיו - בשיטס              PropertiesService.getScriptProperties().setProperty("dirInDataIndex",dirInDataIndex);
                    PropertiesService.getScriptProperties().setProperty("dirIndex", i+1);
                    sheet.getRange(dirList.length,1,newDirList.length,2).setValues(newDirList);
    יוצר טריגר שימשיך את המעבר
                    ScriptApp.newTrigger("getDirs").timeBased().after(10 * 1000).create();
                    return;
                  }
                }
                PropertiesService.getScriptProperties().setProperty("dirIndex", 0);
              }
      }
    // אם אין עוד תיקיות מוחק את כל הטריגרים שנוספו
      ScriptApp.getProjectTriggers().forEach(trigger => {
        if (trigger.getHandlerFunction() == "getDirs")
        {ScriptApp.deleteTrigger(trigger);}
        });
    }
    
    תכנות

  • ניהול שרת/אתר מומלץ
    E eido

    @A0533057932 אהה, אז זה פחות טוב, אם לא אמצא משהו אחר, אגיד לו שזה מה יש... יצטרך להשקיע פעם ב3 חודשים.

    האמת שפעם בדקתי אותו וממש לא הסתדרתי איתו... צריך לנסות שוב

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

    @אביי הוא מחדש מעצמו את הSSL?
    יש לו ממשק משתמש נוח לפתיחת אתר/מסד נתונים הוספת והסרת קבצים ותיקיות?

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

    @A0533057932 צודק.
    טעות שלי.
    אני מחפש דרך לנהל את השרת, בצורה קלה. אערוך את ההודעה הראשונה

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

    @A0533057932 יתכן בהחלט, אני חלש בתחום.
    תקן אותי.

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

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

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

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

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

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

    לעצמי אולי אניאאמץ את זה

    רשתות

  • ניהול שרת/אתר מומלץ
    E eido

    איזה מערכת מומלצת לניהול שרת (בדגש על "שגר ושכח" מבחינת SSL)? אני עובד עם cyber panel שאני לא מרוצה מהגירסה האחרונה שלו, עושה לי קצת פאדיחות עם הSSL ונראה שקצת כבר לשרתים חלשים.
    המליצו לי על caddy, שהוא לא ממשק לניהול שרת, אלא ה"שרת" עצמו ולכן הוא דורש יותר התעסקות.
    למישהו יש המלצה על מערכת כלשהי? כזו שהוזכרה או כזו שלא?

    רשתות

  • vps לעומת שרת מנוהל
    E eido

    מה ההבדל? מה ההיתרונות והחסרונות? למי מיועד?

    רשתות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

    @חגי השגת הכתובות לוקחת הרבה זמן כי כל תיקיה זה שליחת בקשה חדשה והבקשות לוקחות זמן כמו שאמר dovid. מעבר לזה, המעבר על הקבצים בתיקיות ושמירתם ברשימה כלשהיא, גם כן לוקח זמן, זה בקלות עובר את ה6 דקות.

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

    רק להמחשה, עץ נתיבים של בערך 10 תיקיות עם קצת תת תיקיות ולא הרבה קבצים בתוכן לוקח קרוב ל5 דקות!

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

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

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

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

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

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

    @יהודי-טוב כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

    @eido כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

    אני צריך יותר "תוכנית עבודה"

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

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

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

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

    @חגי אתם נשמות טובות באמת, אבל אם ביקשתי לא רקורסיה, אז יש סיבה...

    גם לזה, ה6 דקות לפעמים לא מספיקות, אני אומר מניסיון...

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

    @ivrtikshoret 100% הבעיה שלי היא לתרגם את זה לאלגוריתם יעיל.

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

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

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

    @dovid כתב במעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה:

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

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

    אתה לא מסכים איתי? מי אמר שכאן רקורסיה + תחנות עצירה הם דוקא הפתרון הנכון?

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

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

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

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

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

    תכנות

  • מעבר על תיקיות ותתי תיקיות על כל קבציהן בלי רקורסיה
    E eido

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

    תכנות
  • 1
  • 2
  • 3
  • 4
  • 5
  • 12
  • 13
  • 3 / 13
  • התחברות

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

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