אני מחזיק מערכת שנבנתה בהתחלה עבור לקוח ספיציפי, ובהמשך הותאמה לעוד כמה לקוחות
כל לקוח מקבל דוקר עם מסד אישי שלו
כל המערכות משתמשות באותם קבצים של האפליקציה, עם משתני סביבה שמחברים אותם למסד הנכון
שינויים שאני עושה בקוד, משתקפים בכל המערכות
שינויים שאני עושה במסד, אני מריץ סקריפט באש שמבצע אותם בכל המסדים.
נכון שזה מצריך מעט יותר עבודה, אבל מצמרר אותי לחשוב שכל הקליינטים היו על אותו מסד, כמה התנגשויות היו יכולות להיות.
דוגמא פשוטה שעולה בדעתי, מספר טלפון של יוזר שאמור להיות ייחודי, אם אותו יוזר היה משתמש במקביל בשתי מערכות מה הייתי עושה?
כמה תכנון הייתי צריך לעשות כדי להמנע מהתנגשות כזו, וכמה עבודה זה היה מצריך לתחזק מערכת כזו
וגם לתחזק את השאילתות נראה לי מאד קשה, זה מחייב לזכור ולקחת בחשבון תמיד את ה ClientID, וטעות יכולה להיות הרת גורל
יוסף בן שמעון
-
עבודה נכונה מול מסד נתונים ללקוחות נפרדים -
בניית תמונת דוקר - שגיאה ב CURLבסוף לקחתי את התמונה הזו
FROM linuxserver/code-server:4.4.0-ls125
והצלחתי להתקין נוד
תודה לכל העוזרים (וכרגיל ל @yossiz שליווה גם בפרטי ותמך בי רגשית בנוסף לעזרה המקצועית...) -
בקאנד ופרונט - איך לחבר אותם לאחד@צדיק-תמים כתב בבקאנד ופרונט - איך לחבר אותם לאחד:
או אולי יש איזה דרך "להכליא" אותם לשרת נוד אחד כלומר שהנתיבים הרגילים יהיו הSPA וכל מה שב"קידומת" /api יעבור אל הבקאנד?
כך אני נוהג
app.use('/api/', apiRouter); app.use('/', express.static(path.join(__dirname, 'assets'))); app.get(/.*/, (req, res) => res.sendFile(path.join(__dirname, 'assets', 'index.html')));
-
MySql JOIN עם אינדקס לוקח המון זמןהתודה והברכה ל @yossiz שכמנהגו הטוב טרח גם בפרטי המשיך לנסות להבין את הבעיה ולא נח ולא שקט עד אם כילה הדבר, אבל לצערי לא הצלחתי לייצר שחזור מינימלי של הבעיה, אנסה עוד לדבג ואם יהיו לי חידושים שיכולים לעניין מישהו אעדכן כאן בלי נדר
(הזוי שאם אני מפריד את השאילתות, קודם שולף יוזרים ואחר כך מוצרים עם where in, ומאחד אותם בעצמי, זה לוקח בערך עשירית שניה, לעומת שאילתה מאוחדת שלוקחת בערך עשר שניות, עקוב mysql ואנוש מי ידענו...)
-
עזרה | קוד JS שעובד רק בקונסול ולא בסימניה@צדיק-תמים שים לב שכתבת
URL =
בלי let או const
אתה דורס את המחלקה הגלובלית URL של הדף -
אתחול אובייקט ב-TS.@yyy המחלקה הבאה תתן לך אותה תוצאה בחצי קוד:
class shortClass{ z:number; constructor(private x:number, private y:number){ this.z = x * y; } }
איך זה קורה? כשאתה מעביר ארגומנטים לקונסטרקטור, אם אתה מצהיר עליהם פרייבט או פאבליק, TS מבין שהם אמורים להיות נכסים של המחלקה ולא משתנים מקומיים, ומבצע עבורך את העבודה.
-
בירור | עבודה בתחום התכנות@yossiz אמר בבירור | עבודה בתחום התכנות:
כמובן שהדברים הם לצנינים בצידי אלה שדוגלים בסטטיסטיקה...
הרחקת לכת במסקנתך... הסיפור הזה לא אמור להיות לצנינים בצד אף אחד, ואין בו ממש כדי להוכיח או לסתור את ההנחה שמתחשבים בסטטיסטיקה, מליצה שנונה של אדם גדול לא מעידה על התוכן האמיתי שעליו הוא ביסס את התשובה שלו, יתכן שהוא שקל בדעתו שהנזקים שיגרמו למשודך מנסיעה לחו"ל רבים על סיכויי התועלת שתצא ממנה, וגם אם זה היה בן שמצווה על פו"ר הרי יש שיטות שלא חייבים לנסוע לעיר אחרת כדי לקיים מצוות וק"ו לא למדינה אחרת, ויתכן שהוא בכלל פקפק במקור המידע של האבא שיש שם יותר הצעות, איך שלא יהיה, אחרי שהוא החליט שלא נכון לנסוע הוא עטף את התשובה שלו בשנינות לפייס את דעתו של האב הדואג ותו לא...
@yossiz אמר בבירור | עבודה בתחום התכנות:
המציאות מוכיחה אחרת, לא לחכמים הלחם
אמת, אבל אין קשר בין התוצאה לבין חיוב ההשתדלות, האם כל אדם בכל דרגת ביטחון רשאי לבחור לו מקצוע שעל פי הסיכויים הסבירים אינו מספיק לפרנסתו?
-
חידה מתמטית לשמחת החג ולחדד את מוחות הילדים (והמבוגרים)@nigun @שואף אחרי כל ההסברים וההוכחות והסימולטרים הלב ממאן לקבל את זה, אבל צריך לזכור שססטיסטיקה זה חוק טבע בדיוק כמו הגרביטציה, אין כאן היגיון אמיתי
מישהו חכם אמר פעם, אם אני זורק קוביה והיא נופלת על הספרה 5, בפעם השניה כבר יש פחות סיכויים שזה יפול על אותו מספר, ובכל זאת נפל שוב על ספרה 5, אחרי הפעם השלישית זה כבר הופך להיות כמעט בלתי אפשרי, אחרי חמש פעמים כל מהמר ישים את כל הקופה שזה כבר לא יפול על אותה ספרה.
נשאלת השאלה, ומה יקרה אם אני אגיד לקוביה "אוקי, בואי נאפס את המשחק ונתחיל מהתחלה"? האם הסיכויים יחזרו להיות כמו הפעם הראשונה? מה בעצם ההבדל בין הפעם הראשונה לפעם העשירית?
אז זהו, שאי אפשר לחפש מה ההגיון שעומד מאחורי החוקיות המוזרה הזו שנקראת מדעי הססטיסטיקה... -
מעקב אחר בקשות HTTPS@MusiCode 1. הקליינט שולח בקשה ראשונה לא מוצפנת לגוגל - "אני רוצה לתקשר איתך"
2. גוגל שולח לא מוצפן את המפתח הציבורי שלו לדפדפן (מפתח ציבורי - מפתח שאפשר רק להצפין מידע, ורק בעל המפתח הפרטי יכול לפענח את המידע)
2. הקליינט מקבל את המפתח, כדי להית בטוח שהמפתח הזה אכן שייך לגוגל ולא לתוקף אמצעי, הוא בודק את החתימה של המפתח, ומי הגורם שחתם ואישר שאכן המפתח שייך לגוגל.
בשביל זה יש מאגר תעודות, הקליינט בודק במאגר התעודות שלו האם החותם הזה מוכר ואמין
3. אחרי שהקליינט החליט שהתעודה שייכת לגוגל, הוא מתחיל תקשורת מוצפנת, הוא שולח מידע מוצפן לגוגל, וכך הוא יודע שרק גוגל תצליח להבין מה מכיל המידע הזה.התוקף שיושב באמצע ורוצה לפענח את המידע (פידלר, נטפרי, אנטי וירוס, האקר), יש לו רק אפשרות אחת לפרוץ את מעגל ההצפנה - אם הוא יצליח ללכוד את הבקשה בשלב הראשון הלא מוצפן, ובמקום לשלוח לקליינט את המפתח של גוגל הוא ישלח מפתח אחר שהוא מנפיק, והמפתח הפרטי יהיה אצל התוקף, כך הוא יוכל לפענח את התעבורה.
הבעיה היא כאמור, הקליינט מודע לאפשרות הזו, ולכן הוא בודק מי חתם על המפתח הציבורי שהוא מקבל, ולתוקף אין אפשרות לזייף חתימה של גורם מוכר שמופיע במאגרי התעודות הרשמיים.
הדרך להתגבר על זה, היא לשכנע את הקליינט להוסיף את התוקף בעצמו לרשימת החותמים המוכרים, וכך כשהקליינט יקבל את המפתח, הוא יראה שחתם עליו גורם מוכר מבחינתו, ויסכים להאמין שזה אכן מפתח של גוגל.
כשאתה מתקין פידלר, ומבקש פיענוח של תעבורה מוצפנת, פידלר רושם את עצמו במאגר התעודות של המערכת כגורם אמין שניתן לסמוך על החתימות שלו, וכעת הוא יוכל ללכוד את התעבורה, ובמקום לשלוח את המפתח של גוגל הוא ישלח מפתח משלו על שם גוגל שחתום בחתימת ידו, והקליינט יקבל את זה כאמת מוחלטת וימשיך את ההתקשרות שלו מול פידלר כשהוא משוכנע שהוא מתקשר עם גוגל. -
מידע - השגת סט הספרים "צבא השמים"@yits לא בטוח שאפשר לקרוא לזה ספר מדעי, למרות שלא קראתי את הספרים אבל אני מכיר קצת את הסחורה הארכיולוגית, חופרים עד לשכבה שמתאימה לתארוך של אחשורוש (באותה מידה זה יכול להיות בלשאצר או כורש) מוצאים 2 קירות חצוים שהדמיון של הארכיולוג משלים אותם לארמון פאר, וממילא זה מתאים להיות הארמון של אחשורוש (אולי החוות סוסים של השכן שלו?) מוסיפים עוד מדרגה שמתאימה להיות גינת הביתן (אולי העליה לחדר השינה?) ועוד איזה חריץ בקרקע שמסתמא הוא העוקרמא דמיא שהפרידה בין עיר המלוכה לעיר האזרחית (או בקע שנוצר מרעידת אדמה תת קרקעית?) ואז כל המגילה מובנת וכל הקושיות מתורצות...
(מה זה קשור לאשכול? לא יודע, אולי קצת קשור כי ביקשו ספרים מדעיים ולא אגדות עם)עריכה: דוד קידמני, וברוך שכיוונתי
-
מי עוד משתגע מהתנהגות כרום לגבי טקסט bidi?טוב אז אם זה בא לידי שימוש ציבורי כדאי קצת לשדרג את זה...
javascript: (function() { var elements = document.getElementsByTagName("*"); for (e of elements) { if (!e.style) continue; if (!e.style.direction || e.style.direction === 'ltr' ) e.style.direction = 'rtl'; else e.style.direction = 'ltr'; } } )()
בזה לא צריך ללחוץ פעמיים
עריכה: ערכתי את ההודעה הראשונה עם הקוד המשודרג
-
מי עוד משתגע מהתנהגות כרום לגבי טקסט bidi?הפתרון לענ:ד הוא לשים סימניה בדפדפן כזו:
javascript: (function() { var elements = document.getElementsByTagName("*"); for (e of elements) { if (!e.style) continue; if (!e.style.direction || e.style.direction === 'ltr' ) e.style.direction = 'rtl'; else e.style.direction = 'ltr'; } } )()
אותי זה משמש לדפים שאני מתרגם בגוגל טרנסלייט, אבל זה יכול לעזור גם לבעיה הזו לכאורה
-
הצטרפות לנטפרי -
מימוש עצמי של אירועיםהדרך הטובה ביותר להבין איך מתרחשים אירועים - היא ליצור אותם בעצמך
אז כדי להבין את המושג האזנה לאירוע, ניסיתי לממש בעצמי מחלקה שמטפלת בנושא.
הדרישה היא – לספק API עם 2 אפשרויות, הרשמה לאירוע והפעלת האירוע, כולל אפשרות להעביר מידע מותאם אישית יחד עם האירוע.
הדרך המתבקשת היא לעבוד עם אוביקט שמכיל מפתחות שהם שמות האירועים, והערך של כל מפתח הוא מערך של פונקציות שהם הקולבקים, וכאשר "יתרחש" האירוע, כלומר כשמישהו יחליט לפלוט אירוע, נעבור בלולאה על המערך ונריץ את כל הקולבקים, ונעביר להם את המידע. האובייקט אמור להיראות כך:{ "click": [ function name (params) { ...params } ], "myEvent": [ function name (params) { ...params }, function name (params) { ...params } ] }
ובכן נתחיל עם המחלקה, בשבל הראשון נחקה את מודל האירועים של נוד, שזה אובייקט גלובלי שכל מי שיש לו גישה אליו יכול להרשם ולפלוט אירועים, ראשית נאתחל נכס פרטי בשם _events שהוא יהיה האובייקט שישמור את כל האירועים והקולבקים. וגם ניצור את המתודה on שדרכה ירשמו לאירועים, מי שרוצה להרשם לאירוע יעביר 2 פרמטרים למתודה on – שם האירוע, והפונקציה שהוא רוצה שתתרחש כשיפלט האירוע
class EventEmitter { _events = {}; on (eventId, callback) { this._events[eventId] = this._events[eventId] || []; this._events[eventId].push(callback); } }
נבדוק שזה עובד, ניצור מופע של המחלקה, ונרשם להאזנה לאירוע:
ניתן לראות שהנכס הפרטי מכיל את האירוע והקולבק שהעברנו לו.עכשיו נוסיף למחלקה מתודה בשם emit שדרכה יתאפשר להכריז על התרחשות האירוע, היא תקבל גם 2 פרמטרים, שם האירוע והמידע שישלח יחד עם האירוע.
emit (eventId, args) { if (!this._events[eventId]) return; for (let callback of this._events[eventId]) { callback(args) } }
ובכן, זה עובד. כל מי שיש לו גישה ל events יוכל להרשם ולפלוט אירועים.
בשלב השני, נחקה את ההתנהגות של הדפדפן, האירועים מוצמדים לאלמנטים, כל אלמנט DOM מאפשר אירועים פרטיים, לדוגמא כל כפתור פולט אירוע click כשלוחצים עליו, ואפשר לקבל הודעה על האירוע הפרטי של אלמנט מסוים.
הדרך לעשות את זה פשוטה, נדאג שכל אלמנט יירש מהמחלקה של האירועים. לדוגמא ניצור מחלקה של רכב עם ירושה.class Car extends EventEmitter {}
כעת ניצור שני סוגי רכבים, ונראה שאפשר ליצור מטפל לכל אירוע מכל רכב בנפרד:
-
NODEJS שילוב משתנים במחרוזת קלט מהמשתמשאתה שומר את התבנית כך:
var template = `שלום {{name}} זו הודעה מבית הכנסת {{synagogue}} לידיעתך קיים על שמך חוב בסך {{amount}} עבור {{for}}`
וכשאתה מקבל את ההעדפות של המשתמש אתה בונה מהם אוביקט כזה:
var option = { name: "יוסף", synagogue: "בעלז", amount: 100, for: "עליה" }
ומריץ את הפונקציה הזו:
function buildOutput(template, userOptions){ for(let i in userOptions){ template = template.replace(`{{${i}}}`, userOptions[i]) } return template }
-
עזרה בשליחת מייל דרך אנגולר@yossboss בעיקרון שליחת מייל אמורה להתבצע דרך שרת, זה לא בתחום של אנגולר.
אם יש לך שרת, אתה שולח AJAX מאנגולר לשרת, והשרת מתממשק לשירות מיילים כלשהו.דרך אפשרית אחת להתממשק לג'ימייל ולשלוח עם STMP, תצטרך ליצור סיסמת אפליקציה עבור השרת שלך, כי גימייל כבר לא מאפשרים שליחה עם סיסמה רגילה. ראה כאן https://kinsta.com/blog/gmail-smtp-server/.
עוד דרך אפשרית לפתוח חשבון בחברות שנותנות API לשליחת מיילים, אני עובד עם mailersend, יש להם מסלול חינמי, מסתמא יש עוד חברות בחינם או בתשלום.
-
אתר קניות עם פונקציות@אחד-וחצי המלצה בעלמא, תברר על הצעות מחיר של ווקומרס עם קסטומיזציה, אל תרוץ על בניה אישית.
זה גם יהיה יותר זול מסתמא, וגם תהיה יותר משוחרר לעבור בין מתכנתים במשך הזמן -
הכוונה לטכנולוגיה\פלטפורמה לצורת בניית ממשק web@דאטה-בייס לדעתי לא כדאי לרוץ מהר מידי, אתה לא עושה דברים מיוחדים, אתה עושה מה שכולם עושים, בונים ממשקים לניהול מאגרי מידע, אז למה לא תעשה את זה בצורה שכולם עושים, דהיינו שימוש בספריות קליינט לעיצוב ולרנדור המידע.
אם תתחיל להשתמש בספריות הנישתיות שהוזכרו לעיל, סביר להניח שיגיע שלב שתצטרך להאבק בתקרות זכוכית שהן יציבו לך, בגלל שהן לוקחות בחשבון סוג משתמשים מסויים, ולא מכסות את כל האפשרויות.
אני לא כותב את זה מידיעה, אלא מאמין ומשער שזה כך, בגלל שצורת העבודה הזו לא מוכרת מספיק, וזה מוכיח שעדיין אין הרבה מתכנתים שעובדים כך, אז לא יתכן שהם לקחו בחשבון את כל האפשרויות הנצרכות, ומהר מאד תתקל במגבלות בגלל שיש לך צורך X שהם לא חשבו עליו.
הבעיה בספריות המפנקות האלו שזה מלכודת דבש שכל באיה לא ישובון, אחרי שמתרגלים לזה קשה מאד להשתחרר מהן ולהתחיל לעבוד נכון בצורה עצמאית.בנושא העיצוב, שווה להכיר את Bootstrap שזה סטנדרט בתעשייה, זו ספריה שדואגת לעימוד ופריסה, וגם לשפה עיצובית אחידה, אתה פטור מלכתוב CSS, עובדים עם מחלקות CSS לפי החוקים שלהם וזהו.
ובאשר לתוכן עצמו, גם לזה יש סטנדרטים, לא עובדים היום עם RAW JS, עובדים עם פריימורקים כדוגמת אנגולר או VUE, זה אמנם לא קליל ברמה של גרירה ושחרור, צריך יותר עבודה פרטנית, אבל האפשרויות הן בלתי מוגבלות
-
יצירת פונקציות "עוקבות" - כאובייקט של פונקציות או ככמה פונקציות קטנות?@צדיק-תמים האופציה השניה שכתבת, לעשות אובייקט עם מתודות, זה השער לתכנות מונחה עצמים, זה השיטה הרווחת היום, יותר קל למוח האנושי לקלוט את התוכנה בצורה הזו שיש מחלקה שהיא כמו ישות שמספקת לך גישה מוגדרת לחלקים מוגדרים
חפש חומר על תכנות מונחה עצמים או OOP -
הגדרת שפת קוד ברירת מחדל ב-VSCהאמת שהלינק הזה יותר יעיל לפעמים הבאות
https://www.google.com/search?q=vscode+set+defaul+lang&oq=vscode+set+defaul+lang&aqs=chrome..69i57.8631j0j7&sourceid=chrome&ie=UTF-8