@אחד-וחצי כתב באתר קניות עם פונקציות:
יש מישהו שמסוגל? מה המחיר לדבר כזה.
בשביל לתת מחיר (אפילו כיוון) צריך לפרט את השורה וחצי שכתבת לאפיון של כמה מאות מילים לפחות.
@אחד-וחצי כתב באתר קניות עם פונקציות:
יש מישהו שמסוגל? מה המחיר לדבר כזה.
בשביל לתת מחיר (אפילו כיוון) צריך לפרט את השורה וחצי שכתבת לאפיון של כמה מאות מילים לפחות.
זה קצת בעיה עבורי (ואולי גם עבורך) שקפצת מאקסל/אקסס
לblazor.
עריכה: ראה הודעה הבאה, אני חייב לומר שBLAZOR SERVER באמת פוטר אותך מלהבין כמעט את ההבדלים דלהלן, אבל אני משאיר אותם ובמהשך אסביר למה.
אינטרנט, HTML, זה מחייב הבנה בסיסית בארכיטקטורת שרת לקוח.
שרת לקוח זה אומר שישנם שתי תכונות בעצם.
אחת רצה בלקוח בדפדפן והיא בעצם הקוד שמופעל על ידי דף האינטרנט, ואחת רצה במחשב כל שהוא (רחוק קרוב או אותו אחד בו הדפדפן פתוח, אז בד"כ הכתובת היא localhost/127.0.0.1).
התוכנה שבדפדפן בעצם לא רצה ממש במחשב ישירות אלא הדפדפן ברוב טובו עושה עבורה פקודות שהיא אומרת לו לעשות. יש דברים שאי אפשר לעשות משני סיבות:
א. הדפדפן לא מקבל פקודה מסוג כזה.
ב. כי האחראי על המשאב לא מתחשק לו לקבל מהדפדפן הוראות.
דוגמה לא', אי אפשר בתוכנת שבדפדפן להורות על כיבוי המסך, על מזעור החלון וכדומה.
דוגמה לב', אי אפשר בתוכנה שבדפדפן להורות על השמעת אודיו במחשב אחר.
אבל כן אפשר בקוד בדפדפן להתגבר על המגבלה הזאת, על ידי שפשוט בונים תוכנה נוספת שמאזינה לבקשות HTTP שהדפדפן אלוף בלשוחח בה, ותוכנה זו איננה רצה בדפדפן אלא עצמאית במחשב הרצוי, והיא יכולה גם לכבות את המסך וגם להשמיע אודיו (במחשב בו היא רצה). כעת התוכנה בדפדפן יכולה לבקש מהתוכנה הזו "אנא זמרי ברמקולים" ומכיון שאנו בנינו את התכונה הזו והסברנו לה לכבד את הבקשה הזו, ייצא שהתוכנה שבדפדפן יכולה לפעול על רמוקלים של מחשב אחר!
SQL SERVER זו תוכנה שנמצאת במחשב כל שהוא. התקשורת איתה מתבצעת (על פי רוב מוחלט) בפרוטוקול TCP, שהוא גם הפרוטקול אב של הHTTP.
נניח שהSQL-SERVER רץ במחשב X.
גם אם נריץ באותו המחשב דף אינטרנט, אין ביכולתו לשוחח עם הSQL SERVER מסיבה א'. הדפדפן לא מספק בכלל פקודה עבור התכונה בדפדפן שעימה הוא יוכל לתקשר בTCP.
טוב בשביל מה כל האריכות הזו? הרי אתה ידעת זאת לכאורה מצויין, ואתה שואל על BLAZOR SERVER שזה תכונה עצמאית, נפרדת, שלא רצה במסגרת הדפדפן בכלל, אלא עצמאית לחלוטין. הדפדפן סה"כ אומר לה (על ידי קוד יפה שהם הכינו מראש) על מה לחצו ומה השתנה, ואז היא מעבדת את התוצאה ושולחת HTML רלוונטי מתאים שוב.
אין הכי נמי, האריכות מיותרת אבל זה רק בשביל חידוד העניין והבהרתו.
בהודעה הבאה אענה לך בל"נ על השאלה.
@OdedDvir כתב בבנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים:
פוק חזי וכו' ואתה מכיר את הדרך המקובלת של RESTful API
זה סתירה באותו משפט.
REST נעשה נכון רק בויקיפדיה (בתיאור הערך, לא בAPI שלהם) ובצדק... עמא נוהג לעשות מלא בלגנים.
@סקרן-0 עד היום אתם בלי תוכנה.
השאיפה שלכם להפוך הכל לממוחשב, עם תוכנה אחת שתטפל בכל ההיבטים, היא חזון סטארטאפיטי, זה הרפתקאה יקרה שסיכוייה להיגמר יפה לא מבטיחים.
החכמה היא למחשב חלקים חלקים נדבך אחר נדבך, לשאוף כמה שיותר לתוכנות מדף זולות/קיימות, ולשלב איש מעולם הפיתוח או עם החוש הנכון (זה אולי אתה) בוגר ואחראי (שלא יתפתה ללכת להרפתקאות ושיהיה גם אסטרטג לצד הגימיקים) שינסה לשלב כמה שיותר, ואיפה שצריך יידע איזה חלקים/רכיבים מתמונת המערכת כולה שווים הזמנת פיתוח מותאם ממתכנתים ובאיזה תקציב ומה יכול להמתין או יכול להיות מיותר בהמשך.
@segev_gr באופן כללי הכי חשוב זה מה השגיאה, אבל גם יעזור אם תצרף קוד קצר.
אבל במקרה הזה קל לנסות לבד, והרצתי את זה לבד.
ראשית כל שמתי את זה בדפדפן והסתכלתי מה קורה בכלי המפתחים ברשת (F12), והכל היה נראה טוב. הרצתי את השאילתה בC# ואכן הייתה תשובה של 301 עם מסך קאפצ'ה.
התחלתי להוסיף כותרות של דפדפן קלאסיות, ומה שראיתי שמשנה זה הכותרת Accept-Language, ברגע ששמתי את זה זה עבד.
@ליה מעבר על מאפייני אובייקט נעשה בעזרת Object.keys שנותן את שמות המפתחות, או לולאת for .. in שנותנת גם את שמות המפתחות, או מתודת Object.entries שמחזירה אוסף של זוגות מפתח-ערך, ועוד.
לשםמעבר עמוק, כלומר שבכל מפתח בודקים את הערך ואם הוא אובייקט יורדים גם לרמה שלו, אפשר להשתמש ברקורסיה. הנה דוגמה:
function iterateDeep(obj)
{
if (Object(obj) === obj)
for (const [k, v] of Object.entries(obj))
iterateDeep(v);
else
console.log("item: " + obj);
}
הפונקציה הזו בודקת קודם אם הערך הוא אובייקט או משהו אחר, אם זה אובייקט היא עוברת על הערכים של הצאצאים (מאפיינים בנים בלבד) וקוראת עבור כל ערך לפונקציה הזו בעצמה. אם הצאצא הוא אובייקט העבודה תחזור על עצמה.
בכזו פונקציה יש בעיה של אינסופיות, כי לאובייקט יכול להיות חבר למשל שמצביע על על עצמו, או על אביו/אחיו, ואז יהיה מעגל אינסופי. בשביל למנוע את זה אפשר להוסיף דגל בתוך האובייקט במהלך המעבר:
if (Object(obj) === obj) {
for (const [k, v] of Object.entries(obj))
if(!v.passLoop){
iterateDeep(v, [...keys, k]);
v.passLoop = true;
}
} else
console.log("item: " + obj);
אם רוצים לדעת בכל ערך את הנתיב בו הוא נמצא ביחס לאובייקט, אפשר להעביר את המפתח הנוכחי כפרמטר במערך, ואז לשרשר אותם:
function iterateDeep(obj, keys = [])
{
if (Object(obj) === obj) {
for (const [k, v] of Object.entries(obj))
if(!v.passLoop){
iterateDeep(v, [...keys, k]);
v.passLoop = true;
}
} else
console.log(`${keys.join('.')}: ${obj}`);
}
@clickone הדרך שהבאת ממש אלגנטית! במקום להתחיל לכתוב את הקוד של המרת 64 לטקסט.
החבילה הזו דפוקה שהיא לא עושה את זה, כי זה ממש התפקיד שלה.
הקידוד לא חייב להיות ככה, הוא מוגדר בשורה הזו:
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:;=
שנמצאת מעל כל איש קשר.
QUOTED-PRINTABLE זה שם הקידוד.
אני מאוכזב קשות מהדרך בה נגשו פה העונים לשאלה.
רובם לא ניסו בכלל לענות על השאלה כפי שהיא נוסחה בבהירות (תרגיל חשבוני פשוט להסתיר ולפענח מספר) רק על הצורך שעלה להם ברפרוף מהכותרת ומקצת הטקסט שנאמר בה, זאת למרות שבשאלה ציינתי שיש לי מושג או שניים איך לעשות את זה כמקובל. כל מחאותיי וויכוחיי לא עזרו...
אני הולך לכתוב פה בחוסר התלהבות את הפתרון, שכבר כתבתי עליו בהודעה השניה אבל אז לא הבנתי איך הוא עובד.
ב"ה כעת הבנתי ואני הולך להשתמש בו.
להלן המ"מ שעזרו לי:
https://stackoverflow.com/a/8555047
https://ericlippert.com/2013/11/14/a-practical-use-of-multiplicative-inverses/
https://jmcphers.github.io/techniques/2015/08/20/id-obfuscation.html
אז ככה, מגדירים 3 מספרים קבועים חד פעמית:
א. מספר מקסימום שודאי לא נעבור בשום שלב, למשל אם מדובר בביקורים, נחליט על 10 מליארד.
ב. מספר כל שהוא שניתן לבחור אקראית, שהוא קטן מהמקסימום ושהוא גם מספר זר למספר המקסימום (אפשר פשוט לנסות בכלי בסעיף ג', אם יש תוצאה תקינה אז זה מספר זר).
ג. מוצאים את הModular multiplicative inverse של ב', על ידי כלי כמו זה https://www.dcode.fr/modular-inverse (שמים את המספר של ב', ובמודלו שמים את המקסימום מא').
אחרי שיש לנו את שלושת המספרים הללו, נקרא להם בשמות MAX, A, B.
בשביל להסתיר את המספר פשוט נביא את השארית של חלוקת הA * המספר, בMAX:
mask = number * A % MAX;
בשביל לפענח נעשה משהו דומה:
original = mask * B % MAX;
המחשה של הפעולה:
https://replit.com/@davidlevtov/EnormousJoyousDesign#index.js
הקידוד וגם הפיענוח נעשים ע"י שני פעולות אריתמטיות פשוטות.
ולמי שיש חלום לנוסחה שמתקרבת לקרסולי קרסוליים של המהירות של זה,
הוא מוזמן לבדוק פה את פתרונו
https://jsben.ch/SA0T6
שמתי בתור "תופס מקום" אלגוריתם שלא עושה כלום אבל משרשר טקסט למספר ובהמרה מחזיר למספר.
הערה: במספר ב' גדול (או קלט גדול) יכולה להיות גלישת מספר שתעוות את התוצאות, עליכם להבטיח שהמקסימום לא יחרוג על ידי מספרים נמוכים או טיפוסי מספרים גדולים (long או BigInt וכדומה).
@liy770 הבדיקה שלך לא טובה כ"כ, כי 1 ימצא גם את 10 ואת 21 וכדומה.
תוכל להשתמש ברגקס שבודק שהמספר תחום, ככה:
numbers.match(/\b1\b/);
הסבר: הסימנים / משני הצדדים הם סימנים שמורים שהתוכן הוא ביטוי רגלורי (כמו שמרכאות אומרים שהביטוי הוא string). ה\b שמופיע פעמיים משמעותו קצה מילה, כלומר פסיק רווח סוף/תחילת מחרוזת וכדומה. ככה זה מחפש בעצם 1 שלפניו ואחריו יש "סוף מילה".
אם אתה מבצע את הבדיקה הזו יותר מפעם אחת, עדיף שתחלץ קודם את המספרים החוצה. אם זה רשימת מספרים מופרדת בפסיק קל לעשות
const numberAsArray = numbers.spilt(',');
const hasOne = numberAsArray.includes('1');
המתודה split הופכת מחרזות למערך (רצף ערכים) על ידי פיצולו לפי התו שמועבר כפרמטר (פסיק במקרה שלנו).
המתודה includes בודקת אם ערך מסויים הוא איבר במערך.
@mekev אמר בפילטור שינויים בלבד לתצוגת המשתמש:
או שבכלל צריך לשמור מראש את השינויים בצורה שונה שתאפשר את השליפה הנ"ל)
אכן. ככה מקובל בכל אופן. יוצרים טבלת "שינויים" שמכילה רק את השינויים.
בעת עדכון אתה עובר בלולאה על השדות ומשווה חדש לישן,
ההבדלים נכנסים לטבלה בסגנון כזה:
זמן, משתמש, [טבלה], שדה, ערך ישן, ערך חדש
העמודה טבלה אופציונלית להתאים לכלל הטבלאות במסד.
הדרך הזאת מעבירה את ה"עבודה" משגרת הצפיה בשינויים (שהיא השימוש הרווח) למקרה של שחזור (שזה מקרה שאמור להיות פחות שכיח) בעת שחזור יצטרכו לעבוד יותר מהדרך שנקטת:
א. צריך לולאה כדי לייצר שורה מתאימה למה שהיה קודם
ב. הטיפוסים הם תמיד טקסטואליים (כי הערך ישן וחדש הם בהכרח מסוג טקסט להתאים לכל האפשרויות).
אתה יכול לרקוד על כל החתונות עם שני טבלאות, אחת כמו שיש לך כעת לצורך שחזור נקודות זמן מהירים, ואחת טבלת "שינויים" בשביל צפיה נוחה בשינויים.
חסר בשאלה מה אתה רוצה שיהיה. לכאורה זה או שזה חורג או שזה נשבר, יש אפשרות שלישית?
נ.ב. טיפ לכותרת טובה: לכתוב אותה אחרי סיום כתיבת ההודעה. מסתכלים על ההודעה ואוספים מילות מפתח הכי חזקות: CSS מילה ארוכה מאוד חורגת מהאלמנט.
עוד טיפ: תמיד תיצור דוגמת קוד מבעיות כאלה גם בשבילך לחדד איפה הבעיה, וגם בשביל העונים. אתה לא חשוד על עצלות כי עבדת עוד יותר קשה עם התרשימים, כל הכבוד על שאלה כהלכה!
צירפתי דוגמת קוד
@katz פישינג זה לגרום לך להיכנס לאתר של מישהו ולא כניסה של אחר לשרת שלך.
שום כתובת בעולם שנכנסת לשרת שלך אינה פישינג.
המקרים הגרועים הם ניסיונות ניחוש סיסמה או סריקת פורטים לשירותים שניתנים ללא אימות.
במקרה הזה הכתובת הזו מאוד שקופה, היא מסבירה מה היא עושה ואף מה לעשות אם מתנגדים לקיומה.
@nachman אמר ב[מחפש כלי שממיר שאילתה מ MYSQL ל PostgreSQL]
INSERT IGNORE INTO
זה אותו דבר בשני המסדים. וכן רוב השאילתות הקלאסיות זהים בשניהם.
@nachman אני זוכר לך היסטוריה של שאלות עמומות שמגלות חצי טפח ומכסות עשרה.
אם אתה לא רוצה שאחרים את שאלותיך שקול להשתנות קצת בעניין.
אם זה סודי וזה פחד פחדים שכולם יידעו ששאלת בפורום על אודות XYZ אז שקול סיפור כיסוי עשיר שמצד אחד יהיה אחד לאחד בצרכים ומצד שני יטשטש את המשימה הסופר דיסקרטית.
אם מדובר בעצלות בביטוי ושממילא יש לך כמה חברים שמבינים אותך אלחוטית (אולי @WWW) אז תבקש מהם שיבואו אחריך להבהיר את הרמזים הטמונים בשאלה.
@mekev תודה רבה על הדברים!
להגיב סתם תודה רבה אבדוק, זה אולי מיותר (אבל ממש לא פוגע בשגרת הפורום, כולו מלא מזה).
(אגב, יש אפשרות להודות בצורה מינימליסטית מאוד - מתחת לכל הודעה בצד שמאל יש חץ כלפי מעלה שאומר: הפוסט מועיל/ראוי. זה מחווה קטנה ומאוד "מפדבקת" את העונה).
אבל מה הבעיה לעדכן אחרי חודש? ולמה לא לשתף מה הסיבוך שלך כעת שעליו אתה יוצא למסע בירור, אולי גם בזה הרי יעזרו לך.
נ.ב. עדכון של שורה לא בטוח יותר מהר מהוספה, אבל אני מאמין שתרצה היסטוריה של הנוטיפקציות שהתוכנה קיבלה, וככה אתה מרויח את שניהם.
@צדיק-תמים
מה שהבאת זה לא נקרא מוטמע באמת, זה נקרא "מוטמע" רק בניגוד לקובץ מצורף.
(באנגלית המינוח הוא inline כלומר כחלק מגוף ההודעה).
המשמעות לזה שזה לא מוטמע, היא שכתובת התמונה נשארת חיצונית, למשל למי שיש מייל בלבד זה לא יעבוד לו גם אם היה נשאר הכתובת של JDN.
במקרה שהבאת מדובר בג'מייל. ג'מייל למען בטחון משתמשיה ממירה את הכתובות לכתובת שלה (פרוקסי), וככה השרת שבה התמונה נמצאת לא מקבל את פרטי הפונה (אייפי ועוד).
העבודה שמבחינת נטפרי התמונה שוב ושוב לא בדוקה היא מעניינת, כי נטפרי בודקים תמונות לפי תוכן ןלכאורה התוכן כבר נבדק. ייתכן שגוגל משנה את התמונה? מעניין, אפשר לשאול אותם בפורום שלהם.
כעת לשאלתך, האם ניתן להטמיע תמונה במייל שבכלל לא תפנה למקור חיצוני? כן.
אם מדובר בתמונה קטנה, תוכל להשתמש עם תחביר base64, עליך להמיר את התמונה לbase64 ואז לשים בsrc את התוצאה עם הקידומת של data:image/jpg;base64,...
אם מדובר בתמונה גדולה, מצרפים אותה למייל ומשתמשים במזהה שלה (cid) להצגה בגוף ההודעה, אינני יודע אם איזה כלי אתה שולח את ההודעה, ראה פה את העקרונות:
https://stackoverflow.com/a/30424938/1271037
@צדיק-תמים ראה פה דרכים למדידה
https://michaelscodingspot.com/measure-execution-time-in-javascript/
יש המון אתרים אונליין להשוואת קוד JS, חפש בגוגל
js online test benchmark
@ארכיטקט אני חושב שמתחילים צריכים להיות פאנטים (וכל תחום שלא טובים בו עוד נחשבים למתחילים בו),
אבל בתחומים שיש כבר הרגלים טובים צריך לוודא שרוב האנרגיה ממוקד בתכלית שבתכלית ורק מיעוט בביקורת ובמיטוב. ובקטגוריית תכלית אין שום דבר שקשור לתכנות, רק מוצר שעובד.
@ivrtikshoret זה קשקוש.
הרבה יותר קל להגן על אתר מפריצה מאשר להגן על כספת של בנק.
כל הפריצות הנפוצות זה העדר ידע או רשלנות, או ניצול פרצות מפורסמות ברכיבים לא מעודכנים.
@צדיק-תמים אני מתבייש מאוד, לא קראתי כנראה את הפוסט של יוסי עד הסוף...
אתה צודק לגמרי.
@צדיק-תמים אכן הרבה אתרים. לא כ"כ נוגע לאיכותה של השפה וכמה חכם להשתמש בה ב2022.
הדוגמה של var שנתת היא שינוי תחבירי, אין מאחורי זה שינוי טכנולוגי. php מפגרת טכנולוגית.
לא אכפת לי למנות דוגמאות:
א. יוצרת טריד פר בקשה
ב. היא ממוקדת לתת שליטה חזקה בHTML, לא כ"כ בתקשורת עצמה (הHTTP)
ג. אין כל דרך לשתף מידע בין בקשות בלי שמירה בדיסק.
שוב, זה אכן לא חסרונות נוראים, ויש לה עדיין יתרונות. אבל כיון שהחסרנות הללו מגבילים אותה, ובפורום תכנות רוצים לעזור לאנשים לפרוץ גבולות, טבעי שיש סלידה ממקומות בהם הגבולות הם סופיים מראש.
נ.ב. הדוגמה של וורדפרס לא הכי טובה, כי לטעמי PHP מתביישת ביצירה הזו.
וורדפרס היא במקור הייתה מאוד פופולרית למשתמשים בה כבלוג. היא פשוט הייתה פה, והיא הייתה טובה בתור מוצר בלוג עבור משתמשיה (שלא היה אכפת להם בדיוק איך היא בנויה) אז כולם הלכו עליה.
כל זה גרם למפתחים להוסיף יכולות לסל הכלים שלה ולשפר את יכולת הגמישות (שני הדברים רק מזיקים כשהם בנויים על דבר גרוע).
המעגל הזה הביא את וורדפרס לאיפה שהיא.