אני צריך לשלוח כל לילה מייל לרשימה של מאתיים אנשי קשר, כל פעם לרשימה אחרת
אני שולח עם שרת SMTP עצמאי מדומיין שלי, הדומיין מאומת והמייל חתום
רוב אנשי הקשר הם בג'ימייל
כמה סיכון יש בזה שמנועי הספאם יסמנו אותי? והאם יש הבדל אם אני שולח מייל פעם אחת למאתיים נמענים בעותק מוסתר, או שולח את המייל מאתיים פעם בנפרד?
יוסף בן שמעון
-
שליחת מיילים מרובים עם SMTP -
MySql תכנון טבלה לשליפה על פי שתי עמודותמסד שמורכב מטבלת יוזרים, וטבלה של אינטרקציה בין היוזרים.
הטבלה של האינטרקציה נראית כך:ID UserID UserSideBID Type ENUN('sale','buy','question','interest')
ה Type מכיל מידע על סוג האינטרקציה, ועל פיו אמור להיקבע האם השורה הזו נוגעת לשני הצדדים או רק לצד א.
לדוגמה אם צד א ביצע מכירה או קניה, הפעילות הזו אמורה להרשם עבור שני הצדדים, כי פעילות כזו מחייבת אינטרקציה דו צידית, אבל אם צד א רק התעניין במוצר של צד ב לא היתה כאן תקשורת הדדית, ולכן פעילות כזו תרשם רק על שם צד א.
הנתון הזה חשוב ובא לידי שימוש ברבה וריאציות ברחבי האפליקציה, בדוחות שימוש וכדומה.
כרגע כשאני רוצה דוח עבור יוזר, אני מבצע שאילתה שבודקת האם המזהה שלו מופיע בצד א, או שמופיע בצד ב וה Type מכיל את המידע שנוגע לשני הצדדים, משהו כזהWHERE UserID=123 OR (UserSideBID=123 AND Type IN('sale', 'buy'))
אבל השאילתות מורכבות לתחזוקה ולא אינטואיטיביות
נפשי בשאלתי מהי הדרך הנכונה לתחזק טבלה שכזו, כל הצעה תתקבל בברכה
-
בקשת עזרה עם קוד בc#@pcinfogmach אתה יכול לאשר שזה קורה רק במחרוזת שמכילה מרכאות?
-
קביעת עמודות בסייר כברירת מחדלאחרי שאתה מגדיר תיקיה אחת, אתה נכנס לאפשרויות תיקיה > תצוגה, ולוחץ על הלחצן "החל על תיקיות"
-
שאלה: מה הסוד מאחורי מנוע החיפוש של בר אילן? (מבחינת תיכנות)נניח שיש טבלה של תנך, טבלה של גמרא טבלה של ראשונים וכו'.
האינדקס החזיר שביטוי החיפוש מופיע בתנך בשורה 8947 ובגמרא בשורה 749
האפליקציה ניגשת לטבלאות האלו, שולפת את השורות הרצויות, מסתמא גם שולפת אחת לפני ואחת אחרי בשביל התצוגה, ומוסיפה את זה למערך של תוצאות החיפוש.
אם היא היתה מחפשת את הביטוי הזה בכל הטבלאות של התנך והגמרא והראשונים, בלי להעזר באינדקס, היה לוקח המון זמן לכל חיפוש, האינדקס מקצר את התהליך -
שאלה: מה הסוד מאחורי מנוע החיפוש של בר אילן? (מבחינת תיכנות)זה טקסט נקי, אתה קודם שולף מהאינדקס את המיקום של המילים האלו, ניגש לטבלאות הרלוונטיות, שולף מהם את השורות מהמיקום שיש לך, עוטף את המילים של ביטוי החיפוש בוורוד, ומציג את הרשימה. כך בעיקרון עובד כל אינדקס.
כשעושים חיפוש בתמונות סרוקות כמו צורת הדף וכתבי עת, זה קצת שונה, כי אתה לא מחזיק טקסט אלא תמונה, האינדקס יכול רק להצביע לך איפה ממוקם קובץ התמונה, ואז אתה צריך לעשות לו OCR כדי לזהות את המילים ולצבוע אותם. אם כי מסתבר שכל תמונה מחזיקה כבר את ה OCR במטמון וזה לא נעשה בלייב.
-
שאלה: מה הסוד מאחורי מנוע החיפוש של בר אילן? (מבחינת תיכנות)אתה מדבר על צורת הדף והכתבי עת?
-
שאלה: מה הסוד מאחורי מנוע החיפוש של בר אילן? (מבחינת תיכנות)גם לבר אילן יש אינדקס מאחורי הקלעים
-
פניה אסינכרונית והמסתעף Angular TS@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
זה נכון לגבי כל השמה, או שזה משהו ספציפי לפקודת return?
כל השמה
@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
למה פקודה כזו
returnthis.books || this.httpClient.get<Books []>(this.Getbooks URL).toPromise();
לא מבצעת אותו דבר, הרי אם האובייקט אינו מאותחל זה יחזיר undefind כלומר false, וילך לפרומיס לאתחל את האובייקט, ואם זה כן מאותחל כלומר true שיחזיר אותו עצמו ולא יפנה לפרומייס?
בדקתי ואכן בסינטקס שלי הוא כן פונה כל פעם מחדש ואני רק שואל למה זה קורה.כפי שכתב אהרן, בתחביר שלך אתה לא מאתחל אותו אף פעם, אז הוא תמיד נשאר undefined, ולכן כך קריאה לפונקציה תייצר פניה לשרת.
אם תנסה לפרק את הסינטקס הזה לגורמים, זה יראה כך:getBooks() { if (this.books !== undefined) { return this.books; } else { this.books = this.httpClient.get<Book[]>(this.GetBooksURL).toPromise(); // <<<<<<<<<<<<<<< return this.books; } }
אצלך דילגת על שורה 5, ובמקום זה עשית כך:
getBooks() { if (this.books !== undefined) { return this.books; } else { return this.httpClient.get<Book[]>(this.GetBooksURL).toPromise(); } }
אז books מעולם לא אותחל
-
פניה אסינכרונית והמסתעף Angular TS@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
זה:
books: Promise<Books[]>;
מחזיר את השגיאה הזו
'books' has no initializer and is not definitely assigned in the constructor.אתה יכול לכתוב במקום סימן שאלה סימן קריאה, וזה ידלג על הבדיקה
או לאתחל את זה בקונסטקטור בלי האופרטור || ובמתודה getBooks רק להחזיר אותו בלי לעשות השמה -
פניה אסינכרונית והמסתעף Angular TS@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
האמת (אני מניח שזה קשור לזה) שגם כך אשמח להכיר את הסינטקס של ה-return הנ"ל בשני דברים:
א. סימן ה"||" פירושו OR?
ב. מה המשמעות של קטע הקוד הזה
this.books = this.books
?אכן, זה אופרטור OR.
כשאתה מבצע השמה למשתנה books אתה קודם כל בודק אם הוא כבר מאותחל, במידה והוא כבר אותחל אתה לא משנה בו כלום אלא מצביע עליו בחזרה, אם הוא עוד לא מאותחל והוא מחזיר undefined (שזה ערך false ב JS) אז אתה מאתחל אותו כפרומיס.
כך אתה מרויח שהפניה לשרת תתבצע רק פעם אחת בכל חיי האפליקציה, וכל מי שירצה לקבל את רשימת הספרים יקבל אותה מהפרומיס הזה -
פניה אסינכרונית והמסתעף Angular TS@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
עשיתי כדבריך:
כמעט...
איך נראית השורה הזו בסרביס? כמו האופציה הראשונה או השניה?books: Promise<Book[]>; books: Promise<Book[]> = [];
-
פניה אסינכרונית והמסתעף Angular TS@yyy כתב בפניה אסינכרונית והמסתעף Angular TS:
בקיצור לא הולך...
באנגולר לא אמורים לעבוד עם הקונסטרקטור
הקומפוננטה עשויה להיראות כך:export class showBooksComponent implements OnInit { books: Book[]; constructor(private BooksSvc: BooksSvc) { } async ngOnInit() { this.books = await this.BooksSvc.GetBooks(); } }
זה יאפשר לך לבצע מניפולציות על המערך מתוך הקומפוננטה.
באופן כללי עדיף להמנע משימוש ב pipes כמו async ובבינדינג לפונקציות, זה מריץ את הפונקציה בכל בינדינג ודורש יותר משאבים. -
פניה אסינכרונית והמסתעף Angular TSobservable לא נצרך כאן וזה לא נכון להשתמש בו בסיטואציה הזו
מדובר על נתונים שנטענים פעם אחת בלבד מהשרת, והאובייקט הזה לא אמור להתעדכן מהשרת יותר, זו התנהגות פרומיסית קלאסית
observable לא מגיע ככה מהקופסה, אמנם אפשר לקנפג אותו כדי להתאים אותו לצרכים האלו, אבל זה מאולץ ומיותר. -
פניה אסינכרונית והמסתעף Angular TSהשורה הזו
this.books = BooksSvc.GetBooks();
אמורה להחזיר מערך שלא קיים.
המתודה GetBooks לא אמורה להחזיר מערך, אלא פרומיס.
כך אמור להיראות הסרביסGetBooksURL: string = "http:GetBooks"; books: Promise<Book[]>; constructor(private httpClient: HttpClient) { this.GetBooks(); } Getbooks() { return this.books = this.books || this.httpClient.get<Book[]>(this.GetBooksURL).toPromise(); }
והקומפוננטה תחכה לפרומיס כך
this.books = await BooksSvc.GetBooks();
-
שינוי פעולת מקשי עכברעכבר עם תוספת לחצנים של speed link
שאלתי אותם איך אפשר לקבוע מה תהיה פעולת הלחצנים, אמרו לי שאין להם תוכנה והם מנועים מלהמליץ על תוכנות צד ג
התוכנה של מיקרוסופט לא מזהה את העכבר.
מישהו יודע להמליץ על תוכנה אמינה שעושה את זה? -
בניית תוכנה ע"י שימוש בטאמפלט | Anguler + Material@avi-rz כתב בבניית תוכנה ע"י שימוש בטאמפלט | Anguler + Material:
איך יוצרים קומפונננטות חדשות
כנ"ל סרוויסים
זה מגיע איך שזה נראה ומעלימים את כל התוכן הקיים? איך?
זה מגיע ריק ומייצרים עם ה cli טאמפלט של טבלה או של כרטיסים וכו'?עובדים עם זה בדיוק כמו כל פרוייקט אנגולרי, מוסיפים קומפוננטות וסרביסים עם ה CLI
לא נראה לי שיש אפשרות ליצור עם ה CLI טבלהצריך למחוק את הדפים הקיימים, או להחליף להם את התוכן בתוכן משלך, הרעיון של הטמפלט הוא שאתה לוקח את המבנה של האפליקציה מהטמפלט, ומשתמש בקלאסים ובדירקטיבים מוכנים במקום לעצב אותם בעצמך, ויש לך שפה עיצובית אחידה.
לדוגמא אם אתה רוצה ליצור דף של כרטיסים, אתה מעתיק את הקוד מהתצוגה של הטמפלט ומשנה את התוכן לפי מה שאתה צריך, או עורך את הקוד במקום.@avi-rz כתב בבניית תוכנה ע"י שימוש בטאמפלט | Anguler + Material:
צריך ליצור שרת לכל התוכן הקיים כלומר להתאים את כל השדות שבקליינט?
כמו"כ הצ'אט והתיבת דואר שיש שם צריך ליצור להם טבאלאות ופוסטים וכו' בשרת?בודאי, הטמפלט מגיע בלי שרת, זו רק תצוגה
-
סידור ואחסון העלאותבעצם השאלה שלי היא במקרה של תיקיה ראשית אחת שתחתיה יש אלפי תיקיות, האם למערכת הקבצים יש הבדל אם התיקיות משנה נמצאות ברמה השניה שתחת התיקיה הראשית, או אם הן מסודרות בהיררכיה של כמה תתי רמות ומחולקות לכמה תיקיות משנה.