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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מחלקת "תכנות נורמלי במערכות 'ימות'..."

מחלקת "תכנות נורמלי במערכות 'ימות'..."

מתוזמן נעוץ נעול הועבר תכנות
57 פוסטים 6 כותבים 1.5k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    השיב לMusiCode ב נערך לאחרונה על ידי yossiz
    #26

    @MusiCode אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

    לא הבנתי, מה זה קורוטין?
    אפשר הסבר?

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

    ב-JS, עושים פונקציה כזאת עם התחביר: function*
    העצירה והחזרת ערך מתבצעת על ידי מילת המפתח yield.
    הרצת הפונקציה לא באמת מריצה אותה אלא מייצרת אובייקט מסוג generator. אפשר לקרוא generator.next כדי להריץ את השלב הבא של הפונקציה. generator.next מחזירה אובייקט בעלת 2 חברים {value: xxx, done: true/false}.

    טוב, אידך פירושא זיל גמור...

    אני מנסה להבין את הקוד, אבל כמו שאמרתי,

    אני בנוד מלפני כמה ימים...

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

    צריך איזו חבילה לזה?

    לא
    בעזה"י אעלה עוד מעט דוגמת hello world שעובד.

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    nigunN MusiCodeM 2 תגובות תגובה אחרונה
    5
    • nigunN מנותק
      nigunN מנותק
      nigun
      השיב לyossiz ב נערך לאחרונה על ידי
      #27

      @yossiz
      אני לא יודע איך זה עובד בנוד
      אבל בגו כנראה שזה אותו דבר כי אפשר לעשות לולאה שתמשיך רק אם היא מקבלת את הערך לערוץ
      אבל השאלה שלי איך אתה מכניס ערכים חדשים לתהליך שרץ מהקריאה הקודמת?
      בא נשים לרגע בצד את הHTTP
      במקרה שיש לך אפליקציה שאתה מעביר לה ארגומנטים משורת הפקודה
      ואתה מפעיל coroutine שלא ממשיך עד שהוא מקבל את הערך yield
      אם תפעיל שוב את האפליקציה משורת הפקודה עם הערך yield האם התהליך הראשון ימשיך או שהוא מחכה לו בערוץ שלו הוא לא יגמר לעולם

      מייל: nigun@duck.com

      yossizY תגובה 1 תגובה אחרונה
      0
      • yossizY מנותק
        yossizY מנותק
        yossiz
        השיב לnigun ב נערך לאחרונה על ידי yossiz
        #28

        @nigun הכל רץ בתוך תהליך אחד

        נדבר על גו (למרות שאני לא מכיר)
        על כל callid חדש אתה מריץ את הפונקציה (coroutine, שבמקרה של GO הוא גם goroutine).
        בתוך הפונקציה אתה דוחף לתוך ערוץ את המחרוזת שאתה רוצה להחזיר לימות, ואז אתה מחכה לקבל חזרה את הבקשה הבאה של ימות.
        בפונקציה הראשית, על כל בקשה מהשרת אתה מחלץ מתוכו את מזהה השיחה ודוחף את הפרמטרים לתוך הערוץ המתאים לפי מזהה השיחה, זה יגרום לפונקציה הנכונה להמשיך הרצתה.
        פשוט מאוד, או שאני מפספס משהו?

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        nigunN תגובה 1 תגובה אחרונה
        1
        • yossizY מנותק
          yossizY מנותק
          yossiz
          כתב ב נערך לאחרונה על ידי yossiz
          #29

          מצו"ב דגמה פשוטה, זה אמור לעבוד (פחות או יותר).
          יש המון המון מה לשפר פה, אבל אפשר לקבל את הכיוון.
          חילקתי את זה ל-2 קבצים:
          yemot-api-handler.js (קוד המחלקה, ניתן לשימוש חוזר)

          var activeCalls = {};
          
          module.exports = class YemotAPIHandler {
              
              constructor(callHandler) {
                  this.callHandler = callHandler;
              }
              
              async handle(req, res) {
                  
                  var callId = req.query.ApiCallId;
                  //console.log(req.query);
                  var currentCall = activeCalls[callId];
                  if (currentCall) {
                      var returnedValue = currentCall.getRetValue(req.query);
                  } else {
                      console.log(this);
                      currentCall = activeCalls[callId] = new yemotCall(req.query, this.callHandler);
                      returnedValue = null;
                  }
                  var reply = await currentCall.controller.next(returnedValue);
                  console.log(reply);
                  return res.send(reply.value);
              }
          }
          
          class yemotCall {
              constructor(query, callHandler) {
                  this.ApiCallId = query.ApiCallId;
                  this.ApiPhone = query.ApiPhone;
                  this.controller = callHandler(this);
              };
          
              read(data, replyVar) {
                  this.expect = replyVar;
                  return `read=${data}=${replyVar}`;
              }
              
              goToFolder(folder) {
                  return `go_to_folder=${folder}`;
              }
              
              getRetValue(query) {
                  if (this.expect && query[this.expect])
                  return query[this.expect];
                  this.expect = null;
              }
          }
          

          simple-yemot-sample.js

          const express = require('express');
          const app = express();
          const port = 3000;
          const hangupExtension = "";
          
          const YemotAPIHandler = require("./yemot-api-handler.js");
          
          async function* callHandler(call) {
              var input = yield call.read(`t-שלום, אתה מתקשר ממספר ${call.ApiPhone}, הקש מספר כלשהו כעת ולאחריה סולמית`, "abc");
              yield `id_list_message=t-הקשתם ${input}.`;
              return call.goToFolder(hangupExtension);
          }
          
          var apiHandler = new YemotAPIHandler(callHandler);
          app.get('*', apiHandler.handle.bind(apiHandler));
          
          app.listen(port, ()=>console.log("YemotAPIHandler started!"));
          

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

          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

          dovidD MusiCodeM 2 תגובות תגובה אחרונה
          3
          • WWWW מנותק
            WWWW מנותק
            WWW
            השיב לyossiz ב נערך לאחרונה על ידי
            #30

            @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

            איזה מחרוזת שולחים כדי לסיים את השיחה בימות?

            @nigun אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

            @yossiz
            שולחים את המשתמש לשלוחת ניתוק
            (לא ידוע לי על דרך אחרת)

            אני חושב שאפשר ככה:

            print "go_to_folder=hangup";
            

            WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

            תגובה 1 תגובה אחרונה
            2
            • dovidD מחובר
              dovidD מחובר
              dovid ניהול
              השיב לyossiz ב נערך לאחרונה על ידי dovid
              #31

              @yossiz זה ממש רעיון גאוני ההלבשה של הyield. לדעתי מתכנני התחביר לא התכוונו לזה...
              למימוש הזה יש לזה חיסרון במקרה שייפול השרת (זה הערה לשמה, כלומר זה אחרי הכל נפלא אבל אני מחפש ב"דוקא" למה לא לעשות את הטריק הזה). אולי יותר נורמלי לצפות מ@MusiCode לכתוב בצורה לא פונקציונלית והכל יבוא על מקומו בשלום?
              הרצון לכתוב לפעמים בצורה פשוטה ודקלרטיבית במקום קודים מסובכים גורמים לנו לסחוט מהשפה תחבירים :).

              מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

              בכל נושא אפשר ליצור קשר dovid@tchumim.com

              yossizY MusiCodeM 2 תגובות תגובה אחרונה
              4
              • yossizY מנותק
                yossizY מנותק
                yossiz
                השיב לdovid ב נערך לאחרונה על ידי yossiz
                #32

                @dovid אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

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

                למימוש הזה יש לזה חיסרון במקרה שייפול השרת

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

                טוב, אני צריך לחשוב...

                עריכה: הבנתי איפה הבעיה...

                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                dovidD תגובה 1 תגובה אחרונה
                2
                • dovidD מחובר
                  dovidD מחובר
                  dovid ניהול
                  השיב לyossiz ב נערך לאחרונה על ידי dovid
                  #33

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

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  MusiCodeM תגובה 1 תגובה אחרונה
                  3
                  • yossizY מנותק
                    yossizY מנותק
                    yossiz
                    כתב ב נערך לאחרונה על ידי yossiz
                    #34

                    אה, אני רואה שלא בצדק קראתי לזה coroutine. כי יש הבדל בין generator ל-coroutine.
                    https://en.wikipedia.org/wiki/Coroutine#Comparison_with_generators

                    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                    dovidD תגובה 1 תגובה אחרונה
                    1
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      השיב לyossiz ב נערך לאחרונה על ידי dovid
                      #35

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

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      0
                      • MusiCodeM מנותק
                        MusiCodeM מנותק
                        MusiCode
                        השיב לdovid ב נערך לאחרונה על ידי
                        #36

                        @dovid אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

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

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

                        dovidD תגובה 1 תגובה אחרונה
                        0
                        • dovidD מחובר
                          dovidD מחובר
                          dovid ניהול
                          השיב לMusiCode ב נערך לאחרונה על ידי
                          #37

                          @MusiCode זה לא ג'אוה אלא ג'אוה סקריפט, ובשתי השפות יש GC שעובד טוב בד"כ כך שזה לא אמור להיות בעיה.

                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                          תגובה 1 תגובה אחרונה
                          2
                          • MusiCodeM מנותק
                            MusiCodeM מנותק
                            MusiCode
                            השיב לyossiz ב נערך לאחרונה על ידי MusiCode
                            #38

                            @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

                            וואו!
                            אם זה מצליח לי, אני אחפש 20 הודעות שלך לעשות לייק...
                            (אלא אם תגיד שזה מעצבן אותך...)

                            @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

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

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

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

                            תגובה 1 תגובה אחרונה
                            3
                            • nigunN מנותק
                              nigunN מנותק
                              nigun
                              השיב לyossiz ב נערך לאחרונה על ידי
                              #39

                              @yossiz אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

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

                              מייל: nigun@duck.com

                              תגובה 1 תגובה אחרונה
                              0
                              • nigunN מנותק
                                nigunN מנותק
                                nigun
                                כתב ב נערך לאחרונה על ידי
                                #40

                                הנה משהו שניסיתי לבנות בזמנו ולא הצלחתי
                                אבל מאוד הגיוני שזה בגלל שאני לא יודע באמת איך זה עובד
                                אז קודם כל זה קוד מריץ לולאה עד שמתקבל הערך לערוץ כשיש קריאה לlocalhost:8000/run
                                אני הוספתי שישלח את הערך proc.Tomb.Kill(fmt.Errorf("Death from above"))
                                אחרי כמה שניות
                                ואז הלולאה מפסיקה

                                package main
                                import (
                                "fmt"
                                "net/http"
                                "log"
                                "time"
                                "gopkg.in/tomb.v2"
                                "github.com/julienschmidt/httprouter"
                                )
                                type Proc struct {
                                  Tomb tomb.Tomb
                                }
                                 func main() {
                                
                                    router := httprouter.New()
                                
                                    router.GET("/run", run)
                                
                                    log.Fatal(http.ListenAndServe(":8080", router))
                                }
                                
                                func run(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
                                proc := &Proc{}
                                
                                go proc.Exec()
                                    time.Sleep(1000 * time.Millisecond)
                                
                                  proc.Tomb.Kill(fmt.Errorf("Death from above"))
                                
                                }
                                
                                func (proc *Proc) Exec() {
                                
                                  for {
                                    select {
                                    case <-proc.Tomb.Dying():
                                      return
                                    default:
                                      time.Sleep(300 * time.Millisecond)
                                       currentTime := time.Now().Unix()
                                    fmt.Println("Current Unix Time:", currentTime)
                                    }
                                  }
                                }
                                
                                

                                אבל כשניסיתי לשלוח את proc.Tomb.Kill(fmt.Errorf("Death from above"))
                                בקריאה נפרדת זה לא מפסיק את הלולאה

                                package main
                                import (
                                "fmt"
                                "net/http"
                                "log"
                                "time"
                                "gopkg.in/tomb.v2"
                                "github.com/julienschmidt/httprouter"
                                )
                                type Proc struct {
                                  Tomb tomb.Tomb
                                }
                                 func main() {
                                
                                    router := httprouter.New()
                                
                                    router.GET("/run", run)
                                     router.GET("/kill", kill)
                                
                                    log.Fatal(http.ListenAndServe(":8080", router))
                                }
                                
                                func run(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
                                proc := &Proc{}
                                
                                go proc.Exec()
                                }
                                func kill(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
                                proc := &Proc{}
                                  proc.Tomb.Kill(fmt.Errorf("Death from above"))
                                }
                                
                                func (proc *Proc) Exec() {
                                
                                  for {
                                    select {
                                    case <-proc.Tomb.Dying():
                                      return
                                    default:
                                      time.Sleep(300 * time.Millisecond)
                                       currentTime := time.Now().Unix()
                                    fmt.Println("Current Unix Time:", currentTime)
                                    }
                                  }
                                }
                                
                                

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

                                מייל: nigun@duck.com

                                תגובה 1 תגובה אחרונה
                                0
                                • nigunN מנותק
                                  nigunN מנותק
                                  nigun
                                  כתב ב נערך לאחרונה על ידי
                                  #41

                                  אכן זה היה הבעיה
                                  עכשיו יצרתי את הערך בפונקציה הראשית וזה עובד מצויין

                                  package main
                                  import (
                                      "fmt"
                                  "gopkg.in/tomb.v2"
                                  "github.com/julienschmidt/httprouter"
                                      "net/http"
                                      "log"
                                      "time"
                                  )
                                  type Proc struct {
                                    Tomb tomb.Tomb
                                  }
                                  
                                         func main() {
                                                      proc := &Proc{}
                                  
                                      router := httprouter.New()
                                     
                                      router.GET("/run", run(proc))
                                      router.GET("/kill", kill(proc))
                                  
                                      log.Fatal(http.ListenAndServe(":8080", router))
                                  }
                                  
                                  func run(proc *Proc) httprouter.Handle {
                                  	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
                                     go proc.Exec()
                                  
                                    
                                     	}
                                  }
                                  func kill(proc *Proc) httprouter.Handle {
                                  	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
                                   
                                  
                                    proc.Tomb.Kill(fmt.Errorf("Death from above"))
                                     	}
                                  }
                                  
                                   
                                  func (proc *Proc) Exec() {
                                    for {
                                      select {
                                      case <-proc.Tomb.Dying():
                                        return
                                      default:
                                        time.Sleep(300 * time.Millisecond)
                                        currentTime := time.Now().Unix()
                                      fmt.Println("Current Unix Time:", currentTime)
                                      }
                                    }
                                  }
                                  
                                  
                                  

                                  מייל: nigun@duck.com

                                  תגובה 1 תגובה אחרונה
                                  2
                                  • שואףש מנותק
                                    שואףש מנותק
                                    שואף
                                    כתב ב נערך לאחרונה על ידי
                                    #42

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

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

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

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

                                    ליצירת קשר: admin@i-call.me

                                    הידד! גישה למייל גם בלי מחשב ואינטרנט!

                                    WWWW תגובה 1 תגובה אחרונה
                                    2
                                    • WWWW מנותק
                                      WWWW מנותק
                                      WWW
                                      השיב לשואף ב נערך לאחרונה על ידי
                                      #43

                                      @שואף אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

                                      לדעתי הקלושה, אתה צודק.

                                      WWW.netfree@gmail.com || קשבק! החזר כספי לבנק על רכישות באינטרנט || עונים על סקרים ומרוויחים כסף!

                                      MusiCodeM תגובה 1 תגובה אחרונה
                                      1
                                      • MusiCodeM מנותק
                                        MusiCodeM מנותק
                                        MusiCode
                                        השיב לWWW ב נערך לאחרונה על ידי MusiCode
                                        #44

                                        @WWW אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                        @שואף אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

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

                                        לדעתי הקלושה, אתה צודק.

                                        האמת שכולכם צודקים.

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

                                        ואחרי שראיתי איך עובד הAGI, אמרתי, חייבת להיות דרך ליישם את זה גם בימות.
                                        והנה, היא קיימת!

                                        שואףש תגובה 1 תגובה אחרונה
                                        2
                                        • שואףש מנותק
                                          שואףש מנותק
                                          שואף
                                          השיב לMusiCode ב נערך לאחרונה על ידי
                                          #45

                                          @MusiCode אמר במחלקת "תכנות נורמלי במערכות 'ימות'...":

                                          זיהוי דיבור חינם

                                          ??

                                          ליצירת קשר: admin@i-call.me

                                          הידד! גישה למייל גם בלי מחשב ואינטרנט!

                                          MusiCodeM תגובה 1 תגובה אחרונה
                                          0

                                          • 1
                                          • 2
                                          • 3
                                          בא תתחבר לדף היומי!
                                          • התחברות

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

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