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

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

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

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

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

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

    f = call.read("file", 1, 5, ...)
    

    והקוד ימשיך לשורה הבאה

    call.goToFolder("/7/" + f)
    
    תגובה 1 תגובה אחרונה
    0
    • MusiCodeM מנותק
      MusiCodeM מנותק
      MusiCode
      כתב ב נערך לאחרונה על ידי
      #7

      אולי אם מישהו מבין איך אסטריסק ARI עובד,
      אפשר לשכפל את זה גם לכאן.
      https://github.com/asterisk/node-ari-client

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

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

      על אסטריסק-ארי: https://wiki.asterisk.org/wiki/display/AST/Introduction+to+ARI+and+Channels

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

        @MusiCode

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

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

        מייל: nigun@duck.com

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

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

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

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

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

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

            @MusiCode איפה בבקשה של ימות אתה מקבל את מזהה השיחה?

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

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

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

              מייל: nigun@duck.com

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

                @MusiCode
                אני בור בנוד
                אבל אולי אני אלמד מזה משהו

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

                מייל: nigun@duck.com

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

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

                  זה נראה ככה:
                  בקשה ראשונה: https://call2yemot.com/ext
                  התשובה: read=f-000=ivr,n,...
                  (המילה הראשונה read היא מסמנת קבלת הקשות. אח"כ, שם הקובץ שיושמע כתפריט. אח"כ שם המשתנה שיוחזר)

                  למעשה הבקשה הראשונה נראית כך:
                  https://call2yemot.com/ext?ApiPhone=0504100000&ApiCallId=b6t76r7v6v4754c
                  71a48d6b-e5da-4923-a8e9-858c20ed1227-image.png

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

                    @MusiCode
                    ליתר דיוק
                    ApiCallId=0b1b92e09984f1d6f200e3190b805a6ab0625f68&ApiDID=0773137777&ApiRealDID=0773137777&ApiPhone=0504100000&ApiExtension=5/1

                    מייל: nigun@duck.com

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

                      @MusiCode מה שאתה צריך הוא מימוש של generator coroutines .

                      משהו כזה:

                      var activeCalls = {};
                      
                      function router(req, res) {
                          var callId = getCallId(req);
                          var currentCall = activeCalls[callId];
                          if (currentCall) {
                              var returnedValue = extractValue(req);
                          } else {
                              currentCall = activeCalls[callId] = Call();
                              returnedValue = null;
                          }
                          var reply = currentCall.next(returnedValue);
                          return res.send(reply.value);
                      }
                      
                      function* Call() {
                          yield playfile("file");
                          var f = yield read("file", 1, 5, ...);
                          yield goToFolder("/7/" + f);
                          yield hangup();
                      }
                      

                      אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

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

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

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

                        var activeCalls = {};
                         
                        async function router(req, res) {
                            var callId = getCallId(req);
                            var currentCall = activeCalls[callId];
                            if (currentCall) {
                                var returnedValue = extractValue(req);
                            } else {
                                currentCall = activeCalls[callId] = Call();
                                returnedValue = null;
                            }
                            var reply = await currentCall.next(returnedValue);
                            return res.send(reply.value);
                        }
                         
                        async function* Call() {
                            yield playfile("file");
                            var f = yield read("file", 1, 5, ...);
                            yield goToFolder("/7/" + f);
                            yield hangup();
                        }
                        

                        אני מקווה ללמוד יותר את ה-API של ימות ואז אוכל להביא משהו יותר מושלם.

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

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

                          איזה מחרוזת שולחים כדי לסיים את השיחה בימות?
                          אני מנסה לעשות סוג של hello world עם yield כדי להדגים צורת הפעולה

                          @MusiCode האם הקוד הנ"ל עונה על דרישותיך? הפונקציה call נראה כמעט כמו הקוד שלך רק בתוספת המילה yield.

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

                          nigunN WWWW 2 תגובות תגובה אחרונה
                          0
                          • nigunN מנותק
                            nigunN מנותק
                            nigun
                            השיב לyossiz ב נערך לאחרונה על ידי
                            #18

                            @yossiz
                            החיבור יכול להסתיים במעבר לשלוחה אחרת
                            ואז לא נשלח כלום
                            ואם הלקוח ניתק את השיחה כשהוא עדיין בשלוחת API המערכת תשלח את כל הערכים שנאספו עד עכשיו בשלוחה בתוספת hangup=yes

                            מייל: nigun@duck.com

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

                              @nigun אני שואל מה אני אמור לשלוח כדי לנתק את השיחה מהצד שלי?
                              (בקיצור מימוש של פונקציה בשם hangup)

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

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

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

                                מייל: nigun@duck.com

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

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

                                  שולחים את המשתמש לשלוחת ניתוק

                                  איך נראה המחרוזת שיעשה את זה? אני ממש ממש לא מכיר את מערכת ימות

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

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

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

                                    אני ממש ממש לא מכיר את מערכת ימות

                                    אתה לא מפסיד כלום
                                    בכל מקרה מעבר לשלוחה אחרת בPHP יראה משהו כזה

                                    print "go_to_folder=../";
                                    
                                    

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

                                    print "id_list_message=f-028.n-100.f-029&go_to_folder=/4&";
                                    
                                    

                                    שזה בעצם משמיע לו את קובץ 028 ואז את המספר 100 ואז את קובץ 029 ואז עובר לשלוחה 4

                                    מייל: nigun@duck.com

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

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

                                      print "go_to_folder=../";

                                      ואז בממשק של ימות מגדירים את השלוחה שינתק?

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

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

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

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

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

                                        print "go_to_folder=../";

                                        ואז בממשק של ימות מגדירים את השלוחה שינתק?

                                        כן

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

                                        בקוד למעלה
                                        ניסיתי לשאול האם אפשר להרוג תהליך שכבר רץ מקריאה קודמת
                                        אז לצורך הדוגמה בניתי שרת HTTP שקריאה לlocalhost:8000/run מפעילה את הפונקציה run(foo)
                                        (אין ל פונקציה כזאת כרגע זה כדי לתת הדגמה של הפעלת תהליך)
                                        וכיון שזה קריאה א-סינכרונית אני לא צריך להישאר בדף כדי שפונקציה תמשיך לרוץ
                                        אבל אם הפונקציה היא אינסופית או שרצה להרבה זמן
                                        אני רוצה דרך לשלוט עליה עם קריאה נפרדת
                                        למשל להרוג את התהליך אחרי שעה
                                        אז רציתי שיהיה אופציה בסגנון של קריאה ל localhost:8000/kill
                                        שמפעילה את הפונקציה kill(foo)
                                        ובעברית "להרוג את תהליך foo"
                                        אבל הבעיה היא שאי אפשר להשפיע על התהליך מהקריאה הקודמת ע"י קריאה בשם של התהליך (foo)
                                        אמנם אם אני מקבל בשעת ההפעלה את הPID של התהליך אז אני יכול להרוג אותו ע"י קריאה לPID
                                        (לכאורה אני יכול להחליט בהפעלה מה הPID כדי שאני אוכל לגשת אליו אחר כך
                                        ואם לא אפשר לקבל אותו בהפעלה ולשמור אותו איפה שהוא
                                        אבל כל זה נוגע להריגת התהליך אבל להמשיך הפעלה לאותו תהליך זה כבר משהו אחר

                                        מייל: nigun@duck.com

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

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

                                          @MusiCode מה שאתה צריך הוא מימוש של coroutines.

                                          משהו כזה:

                                          var activeCalls = {};
                                          
                                          function router(req, res) {
                                              var callId = getCallId(req);
                                              var currentCall = activeCalls[callId];
                                              if (currentCall) {
                                                  var returnedValue = extractValue(req);
                                              } else {
                                                  currentCall = activeCalls[callId] = Call();
                                                  returnedValue = null;
                                              }
                                              var reply = currentCall.next(returnedValue);
                                              return res.send(reply.value);
                                          }
                                          
                                          function* Call() {
                                              yield playfile("file");
                                              var f = yield read("file", 1, 5, ...);
                                              yield goToFolder("/7/" + f);
                                              yield hangup();
                                          }
                                          

                                          אני לא מצרף מימוש של playfile, read, gotofolder, hangup כי אין לי מושג איך ה-API של ימות עובד. אבל כל אחד מפונקצייות אלו אמור להחזיר את המחרוזת שצריך להשיב למערכת ימות

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

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

                                          yossizY תגובה 1 תגובה אחרונה
                                          1

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

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

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