רפאל
-
התקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החיים -
הרצת callback רק עם התוצאה של הקריאה האחרונה@yossiz אמר בהרצת callback רק עם התוצאה של הקריאה האחרונה:
נעלבתי
גם לי לא לקח יום אחד להבין איך הכל עובד, ואני בטוח שלך יקח פחות.
@yossiz אמר בהרצת callback רק עם התוצאה של הקריאה האחרונה:
והוא מחזיר מיד את הפרומיס בצורה סינכרונית
בהחלט, אבל שים לב להבדלים בין:
- Map מיועד למיפוי ערך פשוט
- SwitchMap יבטל את הרישום לObservable הפנימי הקיים וייצור Observable עבור הערך החדש
- MergeMap ייצר Observable פנימי עבור הערך החדש, בלי לבטל את הObservable הפנימי, כך שאין סוף Observables פנימיים יכולים להיות פעילים במקביל (אפשר להגביל את הכמות).
- ExhaustMap יתעלם מערכים חדשים כל עוד שהObservable הפנימי פעיל.
- ConcatMap ימתין שהObservable הפנימי יושלם לפני שיצור Observable פנימי נוסף, הערכים נשמרים בBuffer פנימי.
להלן יישום קטנטן שמציג Countdown כתוצאה להזנה לתוך תבת טקסט, ובסיום מציג מערך המכיל את האותיות המרכיבות את הטקסט, הקוד מראה בבירור שכל פעם שמגיע ערך חדש, הObservable הפנימי הקודם יתבטל והטיימר יתאפס.
תרשים ציר זמן המתאר את ההבדלים בין הMaps השונים:
- $Source מתאר את הstream המקורי.
הכחול מייצג את הערך הראשון מהstream החיצוני
הצהוב את השני
הירוק את השלישי - $Target מייצג את הstream הפנימי (כל איבר מהstream החיצוני ימופה לstream פנימי)
באיור הבא כל איבר בstream המקורי "משתכפל" כמספר הערכים שהstream הפנימי פלט (בכפוף למדיניות של האופרטורים הנ"ל):
-
הרצת callback רק עם התוצאה של הקריאה האחרונה@yossiz אמר בהרצת callback רק עם התוצאה של הקריאה האחרונה:
אני רוצה לקבל את התוצאה של הקריאה האחרונה. לא התוצאה שחזרה אחרונה.
אני ממליץ לך לקרוא על SwitchMap.
-
התקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החיים@ארכיטקט עבור הNamespaces הנפוצים (לפי סוג הפרויקט) מספיק להוסיף
<ImplicitUsings>enable</ImplicitUsings>
לקובץ הפרויקט (csproj) -
הרצת callback רק עם התוצאה של הקריאה האחרונהביכולתך לממש Debouncing כך:
function returnOnce(func) { let counter = 0; return async (...args) => { const id = ++counter; await new Promise(x => setTimeout(x, 300)); if (counter > id) return; const result = await func(...args); if (counter === id) { return result } }; }
Reactive programming
אישית הייתי משתמש בRxJs עבור המשימה, הרבה יותר אפשרויות, פחות קוד לתחזוק,
fromEvent(input, 'keyup') .pipe( debounceTime(300), distinctUntilChanged(), switchMap(e => func(e.target.value)) ) .subscribe(result => updateUi(result))
בדוגמא למעלה אנו יוצרים Observable שמאזין לאירוע
keyup
של התבת טקסט,
לאחר מכן אנחנו מוסיפים אופרטורים (באמצעותם ניתן לקבוע מה יתרחש בשעה שערך יוחזר) באמצעות המתודה Pipe:-
DebounceTime
עבור כל ערך שחוזר, המתן X מילי שניות, במידה ובמהלך הזמן הזה ערך חדש מופיע, התעלם מהערך הנוכחי, וחזור על התהליך שוב, במידה והזמן חלף ללא הופעת ערך חדש, העבר את הערך לאופרטור הבא. -
DistinctUntilChanged
התעלם מהערך הנוכחי במידה והוא זהה לערך הקודם, במידה ולא, העבר את הערך לאופרטור הבא. -
SwitchMap
האופרטור מקבל מתודה שמקבלת את הערך שחזר מהאופרטור הקודם כפרמטר ומחזירה Observable/Promise, המתודה תרוץ עבור כל ערך שחוזר, הObservable/Promise הפנימיים יתבטלו במידה והם עדיין רצים בשעה שערך חדש מופיע (עבור Promise אין לדבר משמעות מלבד התעלמות מהתוצאה).
Promise vs Observable
- Observable אינו מוגבל להחזרת ערך בודד.
- Promise רץ ברגע שהוא נוצר, לעומת Observable שירוץ רק במידה ונרשם אליו באמצעות Subscribe (הדבר אינו נכון עבור Hot Observable אולם השימוש בו נדיר יותר ונתעלם ממנו לצורך העניין).
לסיכום
אני משוכנע שידע בתכנות ריאקטיבי, הופך אותך למתכנת טוב יותר, במיוחד בפיתוח ממשקים, בו יש צורך לטפל בstream של אירועים בצורה אסינכרונית.
-
-
דוקר: פורטים לא מגיבים@שואף כשאתה אומר הכל תקין, מה זה כולל?
-
התקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החיים@ארכיטקט אמר בהתקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החיים:
לפעמים אתה רוצה קלאס שיהיה זמין בכל המרחב והוא באמת שימושי ושייך לפרוייקט בכללותו, אז אתה מקצץ בעומק הניימספייס שלו מצד שני הוא אכן שייך לקבוצת קבצים וכו'.
המעלה בהיצמדות למבנה הקבצים היא העקביות והיכולת לאכוף אותה.
-
התקנתי Visual Studio 2022 כאן המקום למי שיודע דברים חשובים על IDE בכלל - דברים ששינו לי את החייםSync Namespaces
קרוב ל"דוגמאות
ששינושישנו לי את החיים" ניצבת הפקודה Sync Namespaces (נוספה בVisual Studio 2022) אשר מעדכנת את הNamespaces בSolution\Project כך שיתאימו למבנה הקבצים.
ניתן לקבוע בוודאות שללא שימוש תדיר בפקודה, יהיו לכם טעויות בNamespaces בכל אחד מהפרויקטים שלכם.
Subword Navigation
ניווט בתוך חלקי המילה באמצעות Ctrl-Alt-Left ו Ctrl-Alt-Right
לדוגמא:
-
קבלת טקסט של דף אינטרנט@משה-כהן345 NodeJs הוא יישום שנועד לאפשר סביבה להרצת קבצי JavaScript, היישום משתמש במנוע V8 של Chrome, השימוש העיקרי ביישום הוא עבור אפליקציות Web, אולם אתה יכול להריץ באמצעותו כל קובץ JS שתרצה.
באפשרותך להוריד את היישום מכאן.
-
קבלת טקסט של דף אינטרנטאני אמור להשתמש בתוסף כדי לקבל תשובה מהשרת של גיידסטאר ללא שגיאת CROS
אני לא בונה דף אינטרנט. אני צריך ליצור לולאה כדי לקבל רשימת מיילים של עמותות. (לשימוש אישי, רק זה לא רלוונטי לאסוף אותם אחד אחד מהדף של כל אחד..)
אז למה לך להריץ את הקוד בדפדפן, למה שלא תריץ את הקובץ באמצעות NodeJS?
-
קבלת טקסט של דף אינטרנטאני חשבתי ש CROS בא להגן על המשתמש הגולש ולא על האתר.
לחלוטין.
בכל אופן התוסף שכתבתי עליו אמור לעזור לעקיפת CROS
לא הבנתי את הסיטואציה, מי אמור להשתמש בתוסף הזה? האם אתה בונה דף אינטרנט לעצמך בלבד?
האם אתה נמנע מלעזור בזה ממניעים עקרוניים\מצפוניים?
מאיפה הסקת את זה? מה עשיתי עד עכשיו?
-
קבלת טקסט של דף אינטרנט@משה-כהן345 אמר בקבלת טקסט של דף אינטרנט:
כשאני מנסה להשתמש בקוד הזה ככה בקוד ה JS שלי אני מקבל שגיאת CROS מהדפדפן
וטוב שכך.
התשובה שלי לא נועדה לספק דרך עוקפת Cors. שורות הקוד בפוסט הנ"ל יניבו את התשובה המבוקשת אך ורק באתר שכתובתו guidestar.org.il, אין דרך עוקפת.הוא מנסה את זה בקונסול כנראה, לא בתוך אתר שלו.
אין הבדל.
-
מחפש דגם קורא ספרים אלקטרוני@מרדכי-היהודי לא חשבתי להגיב, אולם ראיתי שיש הנחה (Early Black Friday deals) של כמעט 50% עבור Kindle Kids, a Kindle designed for kids, with parental controls - Rainbow Birds Cover, אולי יש דרך אחר כך לחסום את המכשיר, או לחלופין להשתמש בחסימה המובנית.
-
שדרוג nginx שהסתבך@davidnead שים לב, הבעיה שלך איננה ברורה (ניסית לתאר את הבעיה כפי תפיסתך, אולם כמו שכתבת אתה לא מתמצא בNginx), לכן אני מציע:
- תשתדל לתאר במילים פשוטות את הפעולות בהם נקטת (לדוגמא "כי הוא לא מזהה כל מיני דרייקטיביס" לא עונה על ההגדרה הזו).
- צטט את השגיאות, כך שנקרא אותם מכלי ראשון.
-
קבלת טקסט של דף אינטרנט@משה-כהן345 בכיף גדול.
-
קבלת טקסט של דף אינטרנט@משה-כהן345 מכיוון שפרטי יצירת קשר מופיעים בגיידסטאר (אולם הם לא מופיעים בHTML עצמו) פעלתי להבין היכן המקור של הנתונים.
Request
המספר 580023356 מייצג את מזהה העמותה.
POST /apexremote HTTP/1.1 Host: www.guidestar.org.il Content-Type: application/json Referer: https:// Content-Length: 248 { "action": "GSTAR_Ctrl", "method": "getMalkarDetails", "data": [ "580023356" ], "type": "rpc", "tid": 6, "ctx": { "csrf": "_", "vid": "_", "ns": "", "ver": 0 } }
Response
הJSON שחוזר מכיל טלפונים וכתובות דואר אלקטרוני ליצירת קשר.
{ "statusCode": 200, "type": "rpc", "tid": 6, "ref": false, "action": "GSTAR_Ctrl", "method": "getMalkarDetails", "result": { "result": { "addressHouseNum": "20", "addressStreet": "הטורים", "addressZipCode": "9466217", "annualTakinYearsText": " (2021)", "audience": [ "בני ישיבות ואברכים" ], "emailMalkar": "b9707575@gmail.com", "employees": 1, "govConnectionSum": 0, "govSupportLastYear": 2020, "govSupportSum": 505585, "greenInfo": { "description": "אחזקת כולל אברכים , תמיכה וסיוע מיוחדים במועדי ישראל", "email": "b9707575@gmail.com", "phoneNumbers": [ "029707575" ], "year": 2021 }, "hasMalkarPeople": true, "hekdeshBelongingsCount": 0, "hekdeshIsAcademic": false, "hekdeshIsForPrivateAlso": false, "hekdeshMoneyList": [], "hekdeshRealEstateCount": 0, "InactiveMenu": { "documents": false, "govsupport": false, "donations": false, "govservices": true, "people": false, "assets": true, "trustees": true, "places": false, "services": false, "finances": false, "connections": false, "estates": true, "contact": false, "volunteering": true }, "IsExperiencePlace": false, "isStatusActiveText": "עמותה רשומה", "lastModifiedDate": 1636069135000, "lat": 31.788751700000000, "lng": 35.210483400000000, "machoz": "[\"ירושלים\"]", "malkarCities": [ { "lat": 31.768319000000000, "lng": 35.213710000000000 }, { "cityName": "מקום פעילות אחר", "lat": 31.768319000000000, "lng": 35.213710000000000 }, { "lat": 31.768319000000000, "lng": 35.213710000000000 }, { "lat": 31.768319000000000, "lng": 35.213710000000000 } ], "mapGeometryLists": { "info": [ "malkarCities" ], "volunteering": [ "volunteerCities" ], "places": [ "malkarCities" ] }, "members": 7, "nationalInsuranceSum": 0, "phoneNumbers": [ "029707575" ], "submittedPapers": false, "targets": [ { "Activity": "מתן מלגות ללומדים", "Target": "אחזקת כולל אברכים" } ], "tchumPeilut1": "ישיבה - כולל", "tchumPeilutRasham": "ישיבה - כולל", "volunteers": 6, "approval46": true, "cities": [ "ירושלים" ], "city": "ירושלים", "cityNums": [ "3000" ], "greenCities": [ "ירושלים" ], "greenCityNums": [ "3000" ], "greenMalkarDistricts": [ "ירושלים", "ארצי" ], "hasHekdeshEstates": false, "hasProperManagement": true, "hasProperManagement2Years": true, "hasReports": true, "hasSubmittedPapers": false, "hekdeshIsNeedCheck": false, "hekdeshIsReligious": false, "hekdeshIsReligiousNeedCheck": false, "Id": "a002400000ACLiYAAX", "isAmuta": true, "isDeleted": false, "isHekdesh": false, "isHeletz": false, "isOttoman": false, "lastAddDataYear": "2019", "malkarDistricts": [ "ירושלים" ], "malkarLocationIsNational": false, "malkarLocationIsNationalGreen": true, "Name": "ישיבת בית הכרם (ע\"ר)", "orgGoal": "להקים להחזיק ולנהל ישיבות", "orgYearFounded": 1982, "regNum": "580023356", "showApproval46": true, "showDonation": false, "showProperManagement": true, "showReports": true, "showSubmittedPapers": false, "sugHitagdut": "עמותה", "sugHitagdutLabel": "עמותה", "tchumPeilutMain": "חינוך, השכלה והכשרה מקצועית", "tchumPeilutMainNum": "21", "tchumPeilutSecondary": [ "ישיבה - כולל" ], "turnover": 1836211 }, "success": true } }
Request באמצעות Fetch
fetch("https://www.guidestar.org.il/apexremote", { "headers": { "content-type": "application/json", }, "referrer": "_", "referrerPolicy": "origin-when-cross-origin", "body": "{\"action\":\"GSTAR_Ctrl\",\"method\":\"getMalkarDetails\",\"data\":[\"580033249\"],\"type\":\"rpc\",\"tid\":6,\"ctx\":{\"csrf\":\"VmpFPSxNakF5TVMweE1TMHdPRlF3TVRveE1qb3lPQzQ0TkRoYSw4Y2N5TWlWNl8zQ0RZejJ6WEQxNjVXLE9EaG1aV0ky\",\"vid\":\"06624000000VGgM\",\"ns\":\"\",\"ver\":43}}", "method": "POST", }) .then(x => x.json()) .then(console.log)
-
קבלת טקסט של דף אינטרנט- כדאי שתתחיל להבין את הסיבה למגבלה הזו.
- אלא א"כ אתה אתה בעל השרת אין הרבה מה לעשות (וטוב שכך) חוץ מלהשתמש עם שרת Proxy, או לחלופין להשבית את ההגבלה של CORS בדפדפן אם כי אני מניח שהפתרון השני לא בדיוק יעזור לך.
-
הסתברות ברצף מספרים רנדומלי@יוסף-בן-שמעון ההוכחה לכשל המהמר איננה רק לוגית, הכשל יוכח כנכון בכל רצף של הטלות קוביה.
טעות לחשוב שההוכחה לכשל המהמר סותרת את ההסתברות, משום שההסתברות עצמה איננה מתיימרת לחזות את המקרה הבודד.
אתה טוען שטענת המהמר היא נכונה בגדול, אולם אם תנהג כמותו אתה תתרושש, ובהתייחס למקרה שציינת היות וההסתברות איננה מתיימרת לקבוע מה יתרחש בכל אחד מהאירועים בסדרה, החיילים לא ישארו בחיים, משום שמספיק פגז אחד בשביל למות.