@גמליאל אמר בהתייעצות על טכנולוגיה מתאימה לבניית אתר ספציפי:
מכיר משהו כזה בJS בקוד פתוח?
למיטב זכרוני ראיתי דברים שרובם לא היו בקוד פתוח, אבל המחירים באמת לא משמעותיים. בעיקר מפריע כשאתה רק רוצה להתנסות וחבל לבזבז על זה 50$.
@גמליאל אמר בהתייעצות על טכנולוגיה מתאימה לבניית אתר ספציפי:
מכיר משהו כזה בJS בקוד פתוח?
למיטב זכרוני ראיתי דברים שרובם לא היו בקוד פתוח, אבל המחירים באמת לא משמעותיים. בעיקר מפריע כשאתה רק רוצה להתנסות וחבל לבזבז על זה 50$.
בעבר העלתי פה דיונים רבים על שימוש בפלטפורמות קיימות לעומת בניה מקוסטמת מאפס. כעת יש לי שאלה מעשית, אשמח לחוות דעתכם.
מוצע לי פרוייקט של אתר מכירות פומביות אונליין. אין פרטים מיוחדים. מטבע הדברים יש לו מאפיינים רבים של חנות רגילה (מוצרים, קטגוריות, הרשמה, העדפות, תשלום, חשבון וכדומה) קלאסית. ובנוסף גם פלטפורמה המאפשרת רכישת מוצרים בלייב (מי שמכיר, אפשר לדמות את זה לסוג של צ'ט ייעודי).
פלטפורמות של חנות לא חסר בשוק. החל מוורדפרס המהוללת, ואפילו בJS יש ספריות ותבניות מוכנות כלשהן לחנויות וירטואליות.
אך בהנחה שאין משהו מוכן למטרה הספציפית של מכירה פומבית:
האם הדבר הנכן הוא לבנות מאפס בכלים הנוחים לי, או שעלי לחפש תשתית קיימת כלשהי (למשל תבנית של חנות) שתכסה חלק גדול מהעבודה ולעשות על גביה התאמות ותוספות?
נאמר לי שוורדפרס לא מתאים לעבודה כזו.
השפה המועדפת עלי היא JS, גם בצד שרת.
השיקולים: מחד בניה מאפס זה אזור הנוחות שלי, ואני גם חזק בו יותר, וגם מפרנס יותר. מאידך אם זה מיותר טובת הלקוח כלים מוכנים, מקצועיים, וזולים.
זו כמובן החלטה של הלקוח, אבל אני צריל לפרוש לפניו את האפשרויות.
דוקא בגלל שזה מחרוזות לא שיטתיות, הסיכוי של האלגוריתם של גוגל לזהות אותן נכון גדול לאין שיעור מאלגוריתם שתבנה.
כדי לבנות בעצמך משהו יעיל שמוכוון למטרה שלך וישיג תוצאות טובות יותר מגוגל, תצטרך כל כך הרבה התאמות ותיקונים שזה יהיה כבר חצי עבודה ידנית (בהנחה שיש לך לכל היותר עשרות אלפי כתובות, אם לא הרבה פחות).
המחירים של גוגל: הם נותנים זיכוי חינם של 200$ לחודש בAPI שלהם. לכל סוג בקשה יש מחיר אחר. למיטב זכרוני חישבתי בעבר על סוג הבקשה הזה שהוא מספיק ל28 אלף בקשות בחודש.
@dovid אמר בחילוץ נתונים מטאורלוגיים מקובץ geoTiff:
@davidnead יש מצב שלא בדקת ספריות אחרות חות מgdal?
עברת פה על זה
https://www.npmjs.com/search?ranking=popularity&q=geoTiff
הספריה הפופולרית היא עם 70 אלף הורדות שבועיות
https://www.npmjs.com/package/geotiffאני רואה המון קוד המון דוגמאות ומסתמא גם אפשר לשאול שם בגיטאב או בסטאק על זה נקודתית יותר.
בחנתי את הספריה הנ"ל.
הבעיה שלי משולבת מזה שיש לי מעט מאוד התמצאות במושגים הרלוונטיים, כך שגם אם אני מתקרב אולי לפתרון יתכן שאני לא מזהה אותו. החלק השני של הבעיה (שנדמה לי שהוא העיקר) שמה שתקע אותי זה לאו דוקא פורמט הקובץ והדרך לקרוא אותו, אלא חוסר בידע על הקובץ הספציפי הזה, על מבנה התוכן שלו.
הצלחתי הרי לקבל טבלה של פיקסלים, שזה בעצם מערך של נתונים בינאריים, ולכן לכאורה יש לי תוצאה ביד. עלי לתת את המיקום שאני צריך ולקבל את התוצאה המתאימה. הבעיה שהתוצאה היא מספר בינארי יחיד (שמתורגם לINT) ואני אמור לקבל מחרוזת טקסט או משהו כזה שמכילה לא מעט מידע. אז מה אני מפספס?
@OdedDvir אמר בחילוץ נתונים מטאורלוגיים מקובץ geoTiff:
@davidnead אמר בחילוץ נתונים מטאורלוגיים מקובץ geoTiff:
בסופו של דבר אני רוצה לקבל סוג של דאטאבייס, להגיש לו שאילתא של קורדינטות (קו אורך ורוחב) ולקבל פלט כלשהו, שאין לי מושג מה בדיוק הוא מכיל ובאיזה מבנה הוא מגיע, אבל תכל'ס אמור לכלול בתוכו את הטמפרטורה הממוצעת למקום שביקשתי.
הואיל ולא קיבלת מענה מדויק לבעיה, יתכן וכיוון אחר יעזור לך.
אם אתה לא נעול דווקא על המאגר של worldclim, אולי תבדוק את ה-API של OpenWeather. הוא נותן בחינם 1000 בקשות ליום.
תודה, בחנתי כבר אופציה זו, אם לא תהיה ברירה אולי אשתמש בה, אך זה דיעבד גדול מאוד.
@nigun אמר בחילוץ נתונים מטאורלוגיים מקובץ geoTiff:
@davidnead
לא נפנה אותך לגוגל
רק נעתיק לכאן את התוצאות.כאן נראה שיש הסברים קצת יותר מורחבים מה מבנה הקובץ
https://worldclim.org/data/v1.4/formats.html
כאן יש דוגמה לחילוץ של המידע בשפת R אולי זה יתן לך כיוון
https://gist.github.com/kgturner/6643334כל זה לקבצים בגרסה 1 של worldclim לא יודע איפה התיעוד של גרסה 2.
עריכה: המשכתי בכיוון הזה וחיפשתי בגיטהאב עוד דוגמאות קוד לניתוח הקבצים של worldclim, יש שם עוד כמה שנראה שמתאימים לגרסה 2.
למשל בזה מוזכר בפירוש גרסה 2.1
https://github.com/Chilipp/latlon-utilsיש עוד פרוייקטים מהשנים האחרונות שכנראה גם מתאימים
צריך לעבור ולהבין מה מתאים, אמנם הרוב כתוב בR אבל אולי מההערות אפשר להבין משהו
https://github.com/search?o=desc&q=worldclim&s=updated&type=Repositories
ביקשתי לא גוגל לא מחמת עצלות ח"ו, אלא מפני שחפרתי בו יסודי ולא עלה בידי, יותר מידי מושגים שאין לי בהם ניסיון ואני נאבד בהם. על רוב הקישורים שנתת כבר עברתי, וכמו שאמרת רובם ב-R שאין לי שום ניסיון איתו, וזה ספריות שעושים עבודה מאחורי הקלעים.
אמנם יש כן קישור אחד שנתת (לפייתון) שלא ראיתי, ואנסה לראות אם אני יכול ללמוד ממנו משהו.
תודה!
אני מתנצל מראש אם השאלה לא תהיה מספיק מפורטת או ברורה. אני טרם אוחז ב"שאלת חכם חצי תשובה".
המשימה שאני מנסה לבצע היא חילוץ נתוני מזג אוויר במקומות שונים בעולם, ממאגר הנתונים של worldclim.
בסופו של דבר אני רוצה לקבל סוג של דאטאבייס, להגיש לו שאילתא של קורדינטות (קו אורך ורוחב) ולקבל פלט כלשהו, שאין לי מושג מה בדיוק הוא מכיל ובאיזה מבנה הוא מגיע, אבל תכל'ס אמור לכלול בתוכו את הטמפרטורה הממוצעת למקום שביקשתי.
דא עקא, סוג כזה של נתונים (נתונים גיאו מרחביים על כל כדור הארץ וכשאר מילים מפוצצות) מגיע בפורט מקובל של קובץ geoTiff שזה בערך אומר שהמידע מתורגם לפיקסלים, וכך אתה יכול לקרוא לפי מיקום, וכנראה זו דרך אופטימלית לדחוס ולקרוא את המידע.
בדר"כ קריאת המידע נעשית באמצעות כלים מוכנים (עם UI) שמשמשים אנשי מקצוע שעוסקים בזה. אבל אני כולה צריך קוד, פונקציית JS או פייתון פשוטה שתעשה לי את העבודה.
למזלי הטוב, יצא לי בעבר להתעסק עם קוד מוכן שעשה משהו דומה, נתונים טיפוגרפיים על כל כדור הארץ. הוא השתמש בספריה GDAL שיש לה חבילה בפייתון וגם גרסה מקבילה בNODEJS.
אז היות שאני לא מבין בזה כלום ניסיתי לגשש באפילה בעקבות הקוד שיש לי + ניסוי וטעיה + הרבה גוגל, להלן הצעדים שביצעתי והיכן שנתקעתי.
//קריאת הקובץ
const file = `E:\\World Climate\\\\wc2.1_30s_tavg_01.tif`;
const dataset = gdal.open(file);
//חילוץ נתונים של גובה ורוחב התמונה (או הרסטר או השד יודע מה) מהשדה
dataset.geoTransform
//קריאת הפיקסלים:
const pxs = ds.bands.get(1).pixels.read(0, 0, ds.rasterSize.x, 14);
טוב, פה נתקעתי פעם ראשונה. רציתי לקרוא את כל הפיקסלים, ולכן בהתחלה העברתי פרמטרים (0, 0, ds.rasterSize.x, ds.rasterSize.y)
כלומר את כל הגובה והרוחב החל מהיסט 0 (הפינה). אבל משום מה זה החזיר שגיאה. מתברר שלמרות הגודל לכאורה של התמונה, הוא מסוגל לקרוא רק את ה14 שורות הראשונות (בדקתי, דוקא שורות אלו).
החלטתי להתפשר ולנסות עם השורות הללו. אז בשביל השלב השני תרגמתי את הפיקסלים למערך שמסודר לפי מספרי שורות וטורים (באמצעות לולאה שעברה על הפיקסלים).
כעת, לכאורה לא נותר לי אלא לבחור פיקסל מסוים (שיתאים במיקומו לקוי האורך והרוחב המבוקשים) וקיבלתי את התשובה (אם נתעלם מזה שיש לי מידע רק על 14 שורות).
דא עקא, כל מה שהפיקסל מכיל זה מספר ארוך מסוג Float32, שאין לי מושג מה לעשות איתו ואיך הוא אמור בדיוק להכיל בתוכו את כל המידע על טמפרטורה, משקעים ושאר מטעמים המופיעים בתיאור מסד הנתונים. כל חפירה בתיעודים ושאר אתרים לא הועילה לי.
אז אולי עשיתי כמעט את כל הדרך נכון ונפלתי רק בפספוס קטן בסוף. ואולי חסר לי משהו בהבנת כל הפרנציפ. כך או כך, אם יש מישהו שמבין משהו בבוץ הזה - אודה לו על כל עזרה. רק לא להפנות אותי לגוגל, אני מכיר את האתר הזה.
טוב, מצאתי את הבעיה, מקוה שזה יועיל לעוד מישהו כאן.
הגדרת הcors אכן אמורה לטפל בזה, ואין צורך לגעת בהגדרות העוגיות, אבל בתנאי שמאופשר דומיין ספציפי. לשם כך הייתי צריך להגדיר את הcors בשרת:
origin: "http://localhost:8080",
credentials: true,
ובקליינט
withCredentials: true
עד עכשיו השתמשתי בallow "*" בשרת במצב פיתוח ובלי credentials, זה נותן לי יותר גמישות. מתברר שעבור מנגנון העוגיות זה לא מספק, למרות שככל שהבנתי מהתיעוד הוא לא אמור לעשות בעיות בלוקלהוסט.
@davidnead אמר בexpress-session לא עובד?:
@yossiz אמר בexpress-session לא עובד?:
@davidnead אמר בexpress-session לא עובד?:
הפרונט ב8080 והשרת בפורט אחר
הקוקי אמור להיות על הפורט/דומיין של השרת
ההגדרה
="none"sameSite
לא אמורה לאפשר את זה?
אני רואה בתיעוד שזה דורש יחד עם הגדרה של secure
, אבל זו הגדרה שנתמכת רק עם HTTPS. זה יוצר מצב שלא אפשרי לפתח מלוקלהוסט, זה לא הגיוני. ככל שאני מבין זו רק הגדרה של לאן העוגיה תישלח מהדפדפן, אבל לא אמור להפריע לדפדפן לשמור עוגיה שהתקבלה מהשרת.
כמובן שכל הcors מאופשר.
@yossiz אמר בexpress-session לא עובד?:
@davidnead אמר בexpress-session לא עובד?:
הפרונט ב8080 והשרת בפורט אחר
הקוקי אמור להיות על הפורט/דומיין של השרת
ההגדרה ="none"sameSite
לא אמורה לאפשר את זה?
@yossiz אמר בexpress-session לא עובד?:
@davidnead יש לך קוד בסיסי להראות? אחרת איך נדע מה פספסת? בתשובה של השרת אין הידר של קוקי?
צודק, הסתכלתי כעת ואני רואה שהקוקי מגיע מהשרת.
אז זה אומר שהבעיה היא לא בשרת אלא בקליינט, מסיבה לא ידועה כלשהי העוגיה פשוט לא נשמרת.
מי בעצם התהליך שאחראי לשמור את העוגיה? זה לא הדפדפן עצמו כהתייחסות אוטומטית לקבלת עוגיה מהשרת? למיטב הבנתי לא אמור להיות לזה כל קשר כלשהו לaxsois.
@yossiz אמר בexpress-session לא עובד?:
@davidnead בדקת בכלי המפתחים בדפדפן אם העוגייה נשלחת?
איך היא יכולה להישלח אם היא לא קיימת? העוגיה לא נוצרת בשום שלב.
תגובה: קישור בין פניית סוקט לפניית API (socket io).
המסקנה שעלתה לי משם היא שexpress-session זו דרך הישר. אלא שמעולם לא השתמשתי בו, והשימוש הראשון כנראה ממש לא מוצלח.
הוא כביכול עובד, אבל תכל'ס לא שומר את העוגיה, וממילא הכל בטל.
ניסיתי את כל הפתרונות שהצלחתי להעלות על דעתי מתוך התיעוד ומתוך גוגל: להרחיב ליתר בטחון את הגדרות cors והגבלות דומיין או גיל של העוגיות ושאר ענייני אבטחה (הפרונט ב8080 והשרת בפורט אחר). גארנישט.
הפעלה על מצב דיבג לא שיפרה את המצב. כך זה נראה מחדש בכל בקשה:
[0] Wed, 06 Apr 2022 13:48:10 GMT express-session no SID sent, generating session
[0] Wed, 06 Apr 2022 13:48:10 GMT express-session saving XBEbCg3Oq2GKYFj6X8ZTaz5IBId91EwT
עם ID חדש כמובן.
מה אני מפספס?
@dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:
@davidnead
אתה צודק שלא צריך לקרוא לזה אימות, פשוט אני רגיל במערכות שלי שעוגיות זה רק עם אימות. אני לא עושה שימוש אחר בעוגיות.
מה שאמרתי בשורה התחתונה אם נתעלם מהמילה "אימות", זה שבארכיטקטורת HTTP, הדרך היחידה לזהות מקור משותף לבקשות היא ע"י פיסת מידע עקבית שהקליינט שולח. זה יכול להיות עוגיה שזה די אוטומטי, וזה יכול משהו שרירותי שנשלח במיוחד כמו הJWT.
הייתי מצפה ממך לתקן אותי על טעות הלשון רק אחרי שתודה לי על כך שהארתי את עיניך שאין "אפשרויות אחרות" לבחון.
אני מודה לך מאוד שהארת את עיני, הנחתך כי התכונתי לתקן אותך על טעות לשונית היא שגויה. אני בדרך כלל נוטה ליחס לעצמי את הטעות כשאיני מבין אותך, כך שרק כעת אני מבין את כונתך הלשונית.
@dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:
אח"כ אתה יכול לעשות mapUserToSocket.get מכל בקשת API למצוא את הסוקט המבוקש.
אלא מה? השאלה היא איך מגיעים לcurrentUser ועל זה ורק על זה הבאתי לך את הלינק. אני לא ידעתי שאתה משתמש בjwt אבל הבאתי לך איך מוצאים את פרטי הבקשה מתוך התחברות הסוקט.
איכפת לך להצביע לי על מה ספציפית התכוונת בלינק? כי אני רואה שם רק דברים על דרך הקוקיס כדלהלן, או דברים מבוססי session שלא בדיוק הבנתי מה זה עושה, וזה כולל גם את הספריה מהתשובה המעודכנת, עשה לי רושם שזה גם עובד עם קוקיס רק של הסשן.
עריכה אתה אומר שלא רלוונטי איך אתה מאמת כי עוד לא עשית אימות, ובכן בלי אימות אין דרך תיאורטית בעולם לקשר ביניהם, כלומר לא השאלה איזה קוד אלא פשוט גם המחשב לא יכול לדעת בחיים שסוקט מסויים יצא מאותו טאב של בקשה אחרת. אז דבר ראשון תתמקד באימות הסוקט (אולי תשתמש בזה https://www.npmjs.com/package/socketio-jwt).
אני הבנתי שהדרך שמציעה הספריה וגם הקודים השונים מבוססת על קוקיס. ליצור קוקי שישלח ממילא גם עם בקשת הסוקט וגם עם בקשת הAPI, וזה מה שממפה ביניהם. אין קשר לאימות.
אם יש לי אימות גם בסוקט - אני לא צריך כלום, אני מקשר את הסוקט לפי הטוקנים וחסל הסיפור. רק שמבחינתי אין לי צורך באימות בסוקט ולא רציתי להכניס אותו רק למטרה הזו. רציתי לבחון את האפשרויות האחרות.
@dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:
@davidnead אתה תמוה, יש בלינק שהבאתי לך שלל של תשובות.
מהתחלה התפלאתי שדחית את מה שיש שמה בגלל היושן, כי כמעט שלא השתנו דברים.
איך האימות שלך עובד? אתה משתמש בsession.js? passport? או אולי jwt?
אני לא יודע איזו תשובה רלוונטית שם פספסתי. אולי האנגלית שלי בעוכרי או משהו אחר.
לגבי האימות - הוא jwt, אך למה זה רלוונטי? בסוקט בינתיים טרם עשיתי בכלל אימות.
לגבי הבעיה - הצלחתי לעדכן את הגרסה של הsocket io, עד עכשיו לא עדכנתי אותה בגלל בעיות תאימות לגרסת הקליינט, שבה אני תלוי בגלל VUE, ואידך דומינו זיל גמור.
הצלחתי להתגבר על זה, אבל לא נראה שיש לזה קשר. גם אחרי השדרוג הקוד המתואר שם שהוא פשוט העתק מהתיעוד הרשמי טרם עושה לי את העבודה. או שאולי לא הבנתי איך להשתמש בו.
אני לא רואה שם שום פירוט איך לגשת מתוך הreq של אקספרס אל הסוקט הספציפי של הקליינט, הניחושים שלי כנראה לא הצליחו, וכל מה שחרשתי בגוגל מביא תוצאה דומה.
--תיקון--
לא שהתשובות שם לא רלוונטיות, אלא שכל אחת שם פחות טובה מסיבה אחרת. אחת היא קוד מיושן ונסמכת על ספריות מיושנות, אחת נסמכת על התאמה בקליינט. הם יותר הכונה של לקחת את העיקרון של ליצור קוקי ולשמור את הID שלו ולפי זה לגשת למערך הסוקטים. שאני צריך לקחת את הקוד ולעשות התאמות לממש לבד. כשהתחלתי נתקלתי כל פעם בבעיה אחרת, וחשבתי שאם יש ספריה מוכנה ממש לצורך זה מוטב וחכם יותר להשתמש בה, כי יש לא מעט בעיות שמימוש לא יסודי עלול ליצור במצבים מסוימים (כמו פרוקסי ועוד). וכאן נתקעתי, בהפעלת המוצר הנפלא המוכן.
טוב, אחרי ששברתי הרבה את הראש תפסתי למה זה לא עובד לי. כמפורש בתיעוד זה עובד רק מגרסה 4 של socket io, בעוד אני משתמש בגרסה 2.3. למה? כי 4 עשה לי בעיות אחרות שלא הצלחתי להתגבר עליהם אז העדפתי את הגרסה המוכרת לי.
אנא הושיעו נא.
@dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:
@davidnead אמר בקישור בין פניית סוקט לפניית API (socket io).:
תודה. לא התעמקתי, אך לפי התאריכים והתוכן עושה רושם שזה מיושן מכדי להיות רלוונטי.
יש שמה תשובה מלפני כמה ימים...
בכל מקרה יש שמה דוגמת קוד של גישה לאובייקט החביב request המוכר לך מכל בקשה, בעת אירוע connection של סוקט.
צודק, פספסתי את התשובה הזו. בדר"כ אני מקדיש פחות תשומת לב לתשובות התחתונות, בפרט אחרי שעברתי על שאר התוכן בשרשור והוא כ"כ מיושן.
באמת נראה שזה הפתרון שחיפשתי. מענין, לא ידעתי בכלל שלsocket io יש middlewares.
תודה
@dovid אמר בקישור בין פניית סוקט לפניית API (socket io).:
@davidnead אין לי שום מידע על זה, רק מציע לינק
https://stackoverflow.com/questions/4641053/socket-io-and-session
תודה. לא התעמקתי, אך לפי התאריכים והתוכן עושה רושם שזה מיושן מכדי להיות רלוונטי.
איזה גוגל הוביל אותך לשם?
מ"מ זה נותן כיוון שיש אפשרויות לעשות את זה בצורה מובנית יותר, ונכתבו עבור זה ספריות. צריך כנראה לחפש אחת טובה ועדכנית.
מקרה קלאסי: אני רוצה לפעמים ליזום מהשרת סוקטים לקליינט, לשם כך אני שומר היכן שהוא את כל אובייקטי הסוקט בעת שהם נוצרים, ושלום על ישראל.
אבל אם אני רוצה ליזום סוקט בתגובה לבקשת API של הקליינט. אני צריך לדעת איזה סוקט שייך לאותו קליינט ששלח את הAPI.
אני משתמש בsocket IO.
אני מכיר 2 פתרונות קלאסיים:
נפשי בשאלתי: מה הדרך האופטימלית לבצע את המשימה הזו? הsocket IO לא מספק איזה מזהה שאפשר להשתמש בו? אפילו IP לא מצאתי שם, למרות שאני מניח שIP זו לא דרך אמינה מספיק.