דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
yossizY

yossiz

@yossiz
אודות
פוסטים
6.1k
נושאים
124
קבוצות
0
עוקבים
26
עוקב אחרי
0

פוסטים

פוסטים אחרונים הגבוה ביותר שנוי במחלוקת

  • בעיה ב API של youtube
    yossizY yossiz

    @ass הגעת לפורום של הזקנים העצבניים... 🙂 לכן במקום התשובה שציפית לקבל תקבל שיחת מוסר ארוכה מטובלת בכמה שיעורי חיים...
    (טוב, לא כולם זקנים, אני מציג רק את עצמי)
    השאלה לא מספיק ממוקדת. אי אפשר לצפות שמישהו יעבור על כל המדריך שציינת ויבדוק למה לא עובד הקוד אצלך. (ובנוסף יש את האפשרות המאוד סבירה שהבעיה קשורה למשהו שבכלל לא כתבת בשאלה)
    התהליך הנורמלי של מתכנתים הוא לנסות למקד את הבעיה.
    כלומר לנסות למצוא איזה שורה של הקוד לא מתנהגת בצורה הצפוייה.
    איך?
    א) PHP פולטת שגיאות ואזהרות שונות, האם אתה מקבל אותם בפלט? (אם לא, תדאג שכן תקבל אותם). האם אתה רואה בפלט הזה שום שגיאות או אזהרות שיכולות להיות קשורות לנושא?
    ב) אם לא קיבלת שום שגיאה, תעבור על הקוד שלב שלב ותוסיף פקודות print שידפיסו את המצב הנוכחי, כלומר, ערכים של משתנים קשורים, או סתם לוג שהגעת לשלב הזה בהצלחה. תנסה לזהות אם המצב הנוכחי לא מתאים למה שציפית. (זו דרך לא מקצועית של דיבוג אבל נהוג מאוד בקהילת מפתחי PHP... נקרא בעגה המקצועית - כלומר אצלי... - בנימה של זלזול: console log debugging)
    ג) או תשתמש בדיבאגר אמיתי ותצעד צעד צעד דרך הקוד לבדוק איפה הוא נכשל. יש את xdebug עבור PHP.

    אני לא מומחה PHP. אולי יש למומחי ה-PHP פה טיפים יותר יעילים לדיבוג בעיות


  • קישורים שימושיים ללימוד SQL והמסתעף (מתעדכן)
    yossizY yossiz

    אני מביא פה רשימה של קישורים שימושיים ללימוד SQL והמסתעף. זה יכלול רק מקורות שאני יכול להמליץ עליהם כמקורות איכותיים.

    לימוד שפת SQL

    רמה בסיסית

    • https://selectstarsql.com
      • ספר (אינטראקטיבי) באנגלית ובעברית ללימוד SQL בסיסי, (חבל שהספר אף פעם לא הושלם, אני קראתי את החלק באנגלית אני לא יכול להמליץ על התרגום לעברית)
      • מומלץ!
    • https://tchumim.com/topic/9178/האנטומיה-של-שאילתת-sql 😉
    • https://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select
      • אגב, כל הכתבות באתר הנ"ל מומלצים מאוד ⭐⭐⭐⭐⭐

    תוכנות

    • TablePlus
      • תוכנה קלה ופשוטה
      • תומכת בכל ה-DB הנפוצים
      • הגירסה החינמית מוגבלת קצת
    • Azure Data Studio
      • תוכנה של מייקרוסופט בנוי על הבסיס של vscode (זה ה-SSMS של vscode)
      • תומך ב-SQL Server ו-Postgres
    • SQL Server Management Studio
      • תוכנה משוכללת ומלאה לניהול SQL Server
    • MySQL Workbench
      • תוכנה משוכללת לניהול DB של MySQL

    Query Plans ואופטימזציה

    • https://use-the-index-luke.com
      ספר שלם על ביצועי SQL נכתב בצורה נגישה.
    • https://www.depesz.com/2013/04/16/explaining-the-unexplainable
      • סידרה של 3 כתבות על Query Plans של postgres
      • מומלץ מאוד!
    • https://explain.depesz.com
      • אתר מאת המחבר הנ"ל שמציג query plans של postgres בצורה יפה
    • https://dalibo.github.io/pev2
      • מציג query plans של postgres בצורה של עץ גרפי עם הרבה שכלולים

    אתרים ובלוגים

    • http://mysql.rjweb.org
      אתר מלא טיפים לשימוש יעיל ב-mysql מאת איש שענה בקריירה שלו על עשרות אלפי שאלות בפרורומים בנוגע למיטוב SQL
    • https://use-the-index-luke.com/3-minute-test
      מבחן קצר בביצועי SQL. אפשר להשתמש במבחן והתשובות ללימוד מושגים בסיסיים.

    ההמשך יבוא...


  • ללמוד תכנות מאפס בצורה לא אינטנסיבית. אפשרי?
    yossizY yossiz

    @tzvi נראה לי (מהתבוננות על אחרים) ש

    • מי שלא להוט אחרי תכנות לשמה (ולא לשם פרנסה), בד"כ לא יצליח ללמוד לבד גם עם חומרים/ספרים מתאימים
    • מי שהאופי שלו לא מתאים (הוא לא עקשן, הוא לא מדייק בפרטים קטנים, לא יכול להתרכז לבד) לא יצליח ללמוד לבד

    גם מי שהאופי שלו כן מתאים צריך להיות מוכן להרבה תסכול בהתחלה, יהיו לא המון המון שגיאות לא מובנות, צריך או לבקש עזרה או להיות ממש עקשן או בעל כשרון גדול

    @nigun אני לא טיפוסי, לא יצאתי ללמוד לתכנת אלא להבין מחשבים ואיך הם מתוכנתים. מי שרוצה לתכנת בפועל, אם ישמע לעצתי, לא יתחיל עם C, וגם לא יסיים עם C, זה פשוט לא רלוונטי לרוב המוחלט של מתכנתים. (מי שבאמת רוצה להבין מחשבים, שלא ילמוד שפות עיליות עם זכרון מנוהל, רק C וכדומה, כמה שיותר קרוב לברזלים)


  • אני רוצה להשתמש נורמלי אשמח שתצביעו לי
    yossizY yossiz

    @שמחת-החיים זה לא עובד ככה. אם תתרום משהו של ערך ממילא יצביעו לך. (גם בלי מוניטין אפשר להשתמש בפורום).


  • מי עוד משתגע מהתנהגות כרום לגבי טקסט bidi?
    yossizY yossiz

    אה, מה זה bidi, אתה שואל?
    bidi = bidirectional = דו-כיווני. למשל טקסט שמאל לימין בתוך קטע ימין לשמאל, (למשל תחילת קטע זו).

    הנה text בידי, כלומר text דו כיווני.

    תפסתם את הרעיון? טוב

    אז למי שמכיר, יש 2 אופציות בממשקים עם טקסט דו-כיווני, וויזואלי ולוגי.
    כלומר, אם לוחצים חץ ימינה בתוך קטע דו כיווני, האם הסמן ינוע לכיוון ימין או שמאל? אם הולכים לפי המהלך הוויזואלי, אז הסמן תמיד ינוע ימינה. אם הולכים לפי המהלך הלוגי, אז חץ ימינה הולך אחורה לתו הקודם, איפה שהוא, הן ימינה הן שמאלה.
    בכרום, למרבה הצער, תפסו את שיטת הוויזואלי, הבעיה היא שלמרות שעל פניו זה נראה יותר אינטואיטיבי, למעשה זה פחות אינטואיטיבי.
    לדוגמא, איפה נשים את הסמן אם נרצה להוסיף כאן האות z להשלמת שם המשתמש שלי?

    yossi| האם נשים את הסמן כך (איפה שה|)
    |yossi או כך?

    התשובה הוא ההיפך מהאינטואציה הפשוטה (שלי לפחות),

    לסבך את המצב יותר, בבחירת טקסט אז גם בכרום עובדים עם השיטה הלוגי (כאן חייבים כי השיטה הוויזואלי פשוט לא לוגי...)

    אבל אי משום הא הייתי מסתדר, ב"ה אני מאוד מחונן ואני יכול להסתדר עם זה.

    אבל תלחצו על הלינק. תקבלו דף עם קטע דו כיווני. אני מאתגר את כולכם לנסות לבחור את המילה ה-HTML עם העכבר. בהצלחה!

    (לא, אני לא מצפה לפתרון אבל אני צריך לפרק את התסכול)

    <rant/>


  • היתכן שאין מחשב טוב בכל העולם?
    yossizY yossiz

    @chocolate האם אתה מחפש מקסימום ניידות ומראה חיצוני "מסובב ראשים"? או שאתה רוצה סוס עבודה?
    כדי לקבל ניידות מקסימלית ומראה חיצוני צריך לפשר קצת על מבנה חזק ו-repairability. אין מה לעשות.
    לדעתי אתה לא באמת צריך את זה. וא"כ אתה לא מסתכל כלל על הסדרות הנכונות.
    אני לא מומחה בנושא, אז אני לא רוצה להמליץ על סדרה מסויימת, רק אציין שאני מאוד מרוצה במחשב נייד שלי שהוא מסדרת thinkpad E series. שזה אפילו לא הסדרה החזקה ביותר שלהם.
    יש בו חסרונות קלות כמו מסך ממוצע ומטה, חיי סוללה חלשים, ומראה חיצוני - לא "מי יודע מה". אבל בסה"כ זה משרת אותי מעל לשלוש שנים בינתיים בלי שום בעיה. וגם ראיתי את הפנים וזה קל מאוד לתקן דברים, לא צריך לפרק את הכל עד לדיוטא האחרונה כדי להגיע לרכיבים. אני אוהב את המבנה הפנימי שלו.

    נ.ב. חוץ מכל הנ"ל אני חושב שאתה בונה יותר מדי על חוות דעת, אין דרך למדוד איזה אחוז מהקונים נתקלים בבעיות אלו ואיזה אחוז מרוצים עד לגג ופשוט לא כותבים חוות דעת


  • אבטחת חשבונות
    yossizY yossiz

    @n123456

    @n123456 כתב באבטחת חשבונות:

    בסדר לפתוח אותם על המייל שמשתמשים בו לשאר דברים

    זה בסדר. אין שום בעיה שאנשים יודעים מה כתובת המייל שלך
    מה שחשוב מאוד זה לשמור על "הגיינה" נכונה בנוגע לסיסמאות

    ועוד כיוצא בזה המלצות לאבטחת חשבון

    אני כותב את הכללים לפי סדר חשיבות (לענ"ד)

    הכלל הכי חשוב:
    חשבון המייל הוא החשבון הכי חשוב! זה המפתח לכל שאר החשבונות, ולכן צריך לשמור עליו בצורה נכונה

    אסור בשום פנים ואופן להשתמש בסיסמת המייל עבור שום חשבון אחר!
    סיסמת חשבון המייל חייב להיות משהו שקשה לנחש. סיסמה ארוכה יחסית ולא לפי תבנית שקל לניחוש (כמו 123456 או תאריך הלידה שלך, או "סיסמה123" וכדומה)
    והכי טוב שתגדיר אימות דו שלבי
    (גוגל דורשים אימות נוסף בכל מקרה כאשר אתה נכנס ממחשב לא מוכר, כדאי שאתה תשלוט על זה ותגדיר את זה בהגדרות החשבון)

    הכלל השני בחשיבותו - אבל גם חשוב מאוד:
    לא להשתמש באותו סיסמה עבור שום שני אתרים. לכל אתר סיסמה משלו!
    אפשר להתפשר לגבי כלל זה לגבי אתרים לא חשובים. אבל באתרים חשובים כדאי מאוד להקפיד על זה

    כלל שלישי:
    כדאי שכל סיסמה יהיה סיסמה חזקה, שזה אומר קשה לניחוש

    כלל רביעי:
    המחמירים (או ברוח הזמן 🕎 המהדרין) מגדירים אימות דו שלבי בכל מקום שמוצעת אפשרות כזאת
    זה לא הכרחי בהרבה מקרים אבל כדאי עבור אתרים ששומרים מידע רגיש

    אם תשמור על כללים אלו תהיה חייב להשתמש במנהל סיסמאות, שזה תוכנה שיוצרת ושומרת בשבילך סיסמאות
    היום יש מנהל סיסמאות בסיסי מובנה בדפדפן כרום
    זה מספיק לגמרי ומומלץ להשתמש בו

    אני אישית שומר אצלי בזכרון רק שתי סיסמאות
    הסיסמה של המייל שלי שהוא גם הסיסמה של מנהל הסיסמאות שלי אבל בשום פנים ואופן לא סיסמה של שום דבר אחר
    (אני מאפשר לעצמי קולא זו להשתמש באותו סיסמה עבור מייל ומנהל סיסמאות, כי אני סומך על בטיחות מנהל הסיסמאות ושהסיסמה לא שמורה בשום מקום ברשת או במחשב, אם אתה רוצה להחמיר גם בזה, מה טוב)
    סיסמה שנייה: סיסמה (קשה לניחוש אבל) קל לי לזכרון, אני משתמש בו רק עבור אתרים ממש לא חשובים
    בשום פנים אני לא משתמש בו עבור אתרים חשובים
    כל שאר הסיסמאות הם מחרוזות רנדומליים לגמרי ונשמרים במנהל הסיסמאות (הם נראים ככה: LUn2n.BV6o ואין שום דרך לזכור אותם לבד)
    (אני משתמש ב-1password עבור ניהול סיסמאות. אבל זה מוצר בתשלום אבל אפשר לגמרי להסתדר עם מוצרים חינמיים, פשוט החוויה שם הכי טובה)


  • האם ניתן להוריד את כל הפונטים מהאתר הזה.
    yossizY yossiz

    עדכון:
    הנה סקריפט מלא, זה מוריד את כל הגופנים ומכניס אותם לקובץ זיפ. בסוף ההרצה הדפדפן תוריד קובץ זיפ שמכיל כל הפונטים. (אזהרה: זה יכול להשתמש בהמון זכרון ראם. ראו הזהרתם.)
    (כנס לדף זה והכנס את הסקריפט לקונסול. חכה עד הגמר...)

    const numPages = parseInt($('.page-link').eq(-2).text());
    for (let i = 2; i <= numPages; i++) {
      console.log(`Getting results page: ${i}`);
      const html = await fetch(`catetory.php?b=&key=%25%25&pg=${i}`).then(res => res.text())
      const body = $.parseHTML(html);
      $(document.body).append(body)
    }
    const fonts = $('.center a b').toArray();
    console.log(`${fonts.length} fonts`);
    await import('https://cdnjs.cloudflare.com/ajax/libs/jszip/3.6.0/jszip.min.js');
    let zip = new JSZip();
    for (const [i, font] of fonts.entries()) {
      const name = $(font).text();
      console.log(`Downloading ${name}. Font ${i + 1} of ${fonts.length}.`)
      const arrayBuffer = await fetch(`/download/${encodeURIComponent(name)}.ttf`).then(res => res.arrayBuffer());
      zip.file(name + ' - (' + i + ').ttf', arrayBuffer);
    }
    const zipFile = await zip.generateAsync({ type: "blob" });
    const url = URL.createObjectURL(zipFile);
    const a = document.createElement('a');
    a.href = url;
    a.download = `fonts.zip`;
    document.body.appendChild(a);
    a.click();
    delete zip
    

  • הצבעה נגד?!?!?!?!
    yossizY yossiz

    @margalit אין צורך להשתמש ביותר מסימן שאלה אחת...
    ו... אין אפשרות להצביע נגד, כי המנהלים ביטלו אותו


  • מה ההבדל בין הפצות לינוקס?
    yossizY yossiz

    @nigun
    (אני לא בטוח שכל מה שאני כותב הוא מדוייק ב-100 אחוז אבל כך אני רואה את התמונה)

    לפני שנסביר את החילוקים בין הפצות השונות, בא נדבר על הנושא של "מה זה לינוקס? מה זה GNU? מה תורם ההפצה ל-Linux/GNU?"

    מה זה לינוקס?

    כפי שמן הסתם כבר ידוע לך, לינוקס הינו ליבת המערכת. הקרנל (Kernel) בלע"ז.
    הקרנל לא עושה כלום.
    כלומר, כל מציאותו של הקרנל הוא לשרת את ה-userland. ‏ ה-userland הינו כל התהליכים שרצים על המחשב. הקרנל אין לו שום תכלית חוץ מלשרת את התהליכים האלו.
    לא קיים מחשב "לינוקס" טהור. כי אם אין תהליכים, הקרנל נכנס לפניקה (kernel panic זה המקביל של מסך כחול של ווינדוס)

    מה זה GNU?

    GNU הינו פרוייקט קוד פתוח שתורם חלק גדול של ה-userland של הפצות לינוקס רגילים.
    לדוגמא, הספרייה הסטנדרטית של שפת C, מערכת כלים עבור דיבוג וקימפול של כמה שפות, shell סטנדרטי, חבילה שנקראת coreutils שכולל כל הכלים הבסיסיים שמערכת מבוססת UNIX אמורה להכיל... ועוד ועוד...

    מה תורם ההפצה ל-Linux/GNU?

    אבל אם נשלב קרנל של לינוקס עם shell ו-coreutils עדיין לא קיבלנו מערכת שעובדת.
    מה חסר? נראה בקטעים הבאים.

    • כאשר הקרנל עולה, הוא מחפש בינארי בשם init. הבינארי הזאת יהיה הקוד שירוץ כתהליך מספר 1. לתהליך הזאת יש כמה מטלות חשובות (ע"ע איניט ו-init). ביניהם, להריץ את כל שאר התהליכים החל משירותי מערכת עד ל-shell (גרפי או אחר).
      אחד מההבדלים הגדולים בין הפצות הוא איך הם ממשים את תהליך init.
      כהיום תהליך ה-init הכי פופולארי הוא systemd, אבל יש המון פולמוסים סביבו, (ביניהם, על איזה חלקים של המערכת אמורה ה-init לשלוט), וזה כמובן משריץ עוד ועוד הפצות...
      (מערכת הלינוקס הכי פשוטה, אולי יכולה להיות מערכת שתהליך מספר 1 (PID 1) הינו ה-shell בעצמו, אבל זה לא יהיה מערכת שימושי ביותר)

    • נגיד שיש לנו מערכת init ויש לנו coreutils ו-shell, מה עוד חסר?
      חסרים כמה וכמה שירותי מערכת נחוצים.
      לדוגמא, cron לתזמון משימות, שירות שמזהה כוננים שמגיעים ויוצאים ומעלה אותם בהתאם, שירות שמזהה חיבורי רשת זמינים ופועל בהתאם, שירות שמזהה חומרה שמתחברת או מתנתקת ופועל בהתאם, ועוד...
      לפעמים יש כמה מימושים של שירותים אלו. כל הפצה מחליטה איזה מהם הוא הכי מתאים לפי קווי היסוד והייעוד של ההפצה

    • כל הפצה מביאה דרך לנהל הוספה והסרה של תוכנות. יש הפצות שמקמפלים בשבילך את התוכנות ומנהלים אוצרות (repositories) של תוכנות מקומפלות. ויש שמנהלים repositories של נוסחאות שאפשר להריץ להרדה וקימפול והתקנה אוטומטית של תוכנות.
      כל הפצה מחליטה על -

      • מערכת לניהול הוספה/הסרה/מציאת ופתרון תלויות (dependencies)
      • מדיניות לגבי איזה תוכנות הם מציעים
      • מדיניות לגבי מבנה התקייות של התוכנות
      • עוד מדיניות, (האם ואיפה התיעוד ימוקם במערכת הקבצים, מבנה קבצי התצורה ואיפה ימוקמו, ועוד ועוד)
    • מה עוד חסר?

      • מבנה מערכת הקבצים לא בא למציאות מעצמה. כל הפצה מחליטה על מדיניות שונות בנוגע למבנה מערכת הקבצים.
      • מעטפות גרפיות (graphical shells) קיימים רבים כחול הים. כל הפצה מציעה אפס, אחד, או כמה מעטפות גרפיות

    עכשיו להפצות השונות שקיימות:
    בגדול אפשר לחלק את ההפצות ל-3 קטגוריות

    • Debian ואביזרייהו
    • Redhat ואביזרייהו
    • כל השאר

    Debian - הוא האבא (והסבא וסבא רבה...) של רוב ההפצות כהיום.
    Ubuntu הוא בן של Debian. ההבדליים הם בעיקר ש-Debian הוא יותר מבוסס, ישן, מנוסה, ובסיסי. משא"כ Ubuntu מביאה יותר תוכנות ותכונות מהקופסא, וגירסאות ותכונות יותר מתקדמות אבל פחות מנוסים ומבוססים. אבל זה בנוי על הליבה של Debian.

    Redhat - הוא השם הגדול השני בתחום, זה כולל Fedora ו-Centos ג"כ. ועוד בנים ובני בנים.

    כל השאר - כולל הפצות שלא מבוססות על אף אחד מהנ"ל. כולל slackware, arch, ועוד.

    אם הייתי רוצה לכתוב את כל ההבדלים בין ההפצות, יכלה הזמן והם לא יכלו. אבל בגדול אפשר לחלק את ההבדלים לכמה קטגוריות.

    • ההבדלים בין שלוש ההפצות הראשיות שהזכרתי, הם ההבדלים הכי גדולים. הם מתבטאים כמעט בכל התחומים שהזכרתי בקטע של "מה תורמת ההפצה?". כל הפצה מביאה מדיניות שונה בנוגע לכל תחומים אלו.

      • מתחת לזה יש תתי הפצות שבנויות על אחד מההפצות הראשיות אבל יש להם מחלוקת אידיאילוגית בנוגע לאחד מהדברים הבסיסיים. לדוגמה הם מבוססים על Debian אבל הם אוחזים ש-systemd לא טוב.
    • יש הפצות שבנויים לגמרי על הפצה קיימת אבל הם מותאמים לצורך ספציפי או לאוכלוסיה ספציפית.

    • יש כמה הפצות שהליבה שלהם בנוי על אחד מההפצות הראשיות, אבל הם מביאים סביבה גראפית יותר טובה/נוחה/יפה לדעתם.

    כל זה בלי לדבר על מערכות כמו אנדרויד ו-chromeos שלקחו רק את הקרנל וכל השאר שונה הרבה ממערכת לינוקס רגילה. ובלי לדבר מערכות אחרות מבוססי UNIX אבל עם קרנל שונה.


  • מחלקה פשוטה ב-JS לטפל בחוסר הודאות בקיום localstorage
    yossizY yossiz

    קיבלתי הרבה דיווחי שגיאות בקוד פרונטאנד מסויים בגלל מצבים שונים שבהם localstorage לא זמין, למשל בדפדפנים מסויימים במצב גלישה בסתר, או גירסאות מסויימות של דפדפנים למובייל וכדומה
    אז כתבתי את המחלקה הזאת כמעטפה ל-localstorage
    אשמח לקבל שיפורים

    export class Storage {
      static #nullStorage = {
        getItem() {},
        setItem() {},
        removeItem() {}
      };
    
      static #cookieBasedStorage = {
        getItem(key, defaultValue) {
          // https://stackoverflow.com/a/64472572
          return Object.fromEntries(document.cookie.split('; ').map((v) => v.split(/=(.*)/s).map(decodeURIComponent)))[key] ?? defaultValue;
        },
        setItem(key, value) {
          document.cookie = `${key}=${value}`;
        },
        removeItem(key) {
          document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC`;
        }
      };
    
      static #storage = this.#storageAvailable(localStorage)
        ? localStorage
        : this.#storageAvailable(this.#cookieBasedStorage)
        ? this.#cookieBasedStorage
        : this.#nullStorage;
    
      static #storageAvailable(storage) {
        // https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#Feature-detecting_localStorage
        try {
          const x = '__storage_test__';
          storage.setItem(x, x);
          storage.removeItem(x);
          return true;
        } catch (e) {
          return false;
        }
      }
    
      static getItem(key, defaultValue) {
        return this.#storage.getItem(key) ?? defaultValue;
      }
    
      static setItem(key, value) {
        this.#storage.setItem(key, value);
      }
    
      static removeItem(key) {
        this.#storage.removeItem(key);
      }
    }
    
    

  • ספריית Sequelize: איך למנוע שליחת שדות מסויימות לצד לקוח
    yossizY yossiz

    תיאור הבעיה

    על פי רוב בממשקי API, האובייקטים שה-API שולח משקפים במידה רבה את המבנה של ה-DB. עד כדי כך, שלרוב התשובה של ה-API הוא פשוט ייצוג JSON של שורות ב-DB.
    מתכנתים עצלנים כמו רוב עמך (כולל אני) בד"כ פשוט עונים לבקשות API עם תבנית זו:

    1. שאילתת DB לקבל את הישויות הרלוונטיות
    2. הרצת לוגיקה על היישויות, כמו בדיקת הרשאות, או עדכון נתונים וכו'
    3. סיריאליזציה של ישות ה-DB שרלוונטי לתשובה ל-JSON, ושליחה לקליינט

    הבעיה היא שקורה הרבה שהשדות שנצרכים עבור שלב 2 שונים מהשדות שרוצים לשלוח בשלב 3

    למשל בבקשת login בד"כ שולפים שורה שמייצגת משתמש, ועבור שלב 2 רוצים לבדוק שהסיסמה נכונה, ולכן שולפים את השדה שמייצג את ההאש של הסיסמה, אבל בשלב 3 בד"כ לא רוצים לשלוח את זה חזרה לקליינט

    עוד דוגמה: אפליקציה ששומרת מפתח API של המשתמש כדי להריץ עבורו פעולות מול צד שלישי, רוצה לשלוף את המידע הזה מה-DB עבור שלב 2 כדי לטפל בבקשות שונות, אבל לא רוצה לשלוח את זה חזרה לקליינט

    וכהנה רבות

    מצו"ב קוד קצר לטיפול נוח בנושא זה עבור משתמשי Sequelize

    הסבר על הפתרון

    בספריית Sequelize, כאשר הופכים מודל ל-JSON, מנוע JS משתמש מתחת למכסה בפונקציית Sequelize.Model.prototype.toJSON
    הרעיון הוא שנוסיף שדה סטטית להגדרת המודלים שלנו שמכיל מערך של שדות שצריך תמיד להשמיט מהסיריאליזציה, ונכתוב toJSON מותאם אישית שלנו שיכבד רשימה זו
    כדי שזה יעבוד גם על מודלים מקוננים, נקרא לפונקצייה זו בצורה ריקורסיבית על מודלים מקוננים

    הנה הקוד

    // Override the builtin `toJSON` method to allow hiding certain fields from the client
    // To hide a field, add it to the `hidden` array on the model's prototype
    // We recursively call `toJSON` on all included models
    Sequelize.Model.prototype.toJSON = function () {
      const includes = this._options.includeNames ?? [];
      const hiddenKeys = this.hidden ?? [];
      const values = Object.assign({}, this.get());
      for (const hiddenKey of hiddenKeys) {
        delete values[hiddenKey];
      }
      for (const include of includes) {
        if (Array.isArray(values[include])) {
          values[include] = values[include].map((value) => value.toJSON());
        } else if (typeof values[include].toJSON === 'function') {
          values[include] = values[include].toJSON();
        }
      }
      return values;
    };
    

    והנה הגדרת מודל לדוגמה:

    const User = sequelize.define(
      'User',
      {
        firstName: {
          type: DataTypes.STRING,
          allowNull: false,
        },
        lastName: {
          type: DataTypes.STRING,
        },
        passwordHash: {
          type: DataTypes.STRING,
        }
      });
    
    User.prototype.hidden = ['passwordHash']
    

    או אם אתה מעדיף קלאסים:

    class User extends Model {
      static hidden = ['passwordHash']
    }
    
    User.init(
      {
        firstName: {
          type: DataTypes.STRING,
          allowNull: false,
        },
        lastName: {
          type: DataTypes.STRING,
        },
        passwordHash: {
          type: DataTypes.STRING,
        }
      },
      {
        sequelize,
        modelName: 'User',
      },
    );
    

    נ.ב. הקוד נכתב עבור sequelize v6. אני משתמש בשדה פנימית של Model (ה-_options.includeNames). אין הבטחה שהקוד ימשיך לעבוד בגירסאות הבאות של sequelize

    עוד הערה:
    אני לא חושב שקוד זה מספיק טוב לאפליקציה רצינית
    נראה לי שאפליקציה רצינית אמורה להפריד בין הייצוג הפנימי לאובייקטים החיצוניים שנשלחים לקליינט, ולהשתמש בשכבה שיודע להמיר בין אובייקטים פנימיים לאובקטים "חיצוניים"
    בפרוייקט אחד שלי השתמשתי ב-https://github.com/typestack/class-transformer לצורך זה


  • שפת תכנות GOlang
    yossizY yossiz

    @לעזור-לכולם לא כתבת באיזה רמה אתה כותב ב-php ו-js, ומה רצית להשיג מלימוד גו.
    המלצתי הוא להשקיע בכתיבה מקצועית יותר בשפות שאתה כבר כותב במקום ללמוד שפה חדשה.
    במקרים מסויימים יכול להיות באמת יתרונות לגו על פני js ו-php. למשל עיבודים כבדים או עיבוד מקביל של הרבה נתונים.
    שאלת על ביקוש: אז יש יותר ביקוש למתכנת טוב מאשר למתכנת שמכיר הרבה שפות.


  • עזרה| תקשור בapi בשפת הphp לפלטפורמת nodebb
    yossizY yossiz

    @mgm-ivr זה לא אמור להיות דבר קל... אז לא להיות מופתע שלא הצלחת.

    כמו בכל בעיית תכנות (או כללית) הא' של הא' זה לפצל את הבעיה לחתיכות קטנות יותר ולפתור אותם בנפרד.

    לשם כך, נוריד רגע את השפה מהסיפור מכיון שזה לא כל כך משנה. התשובה שלי לא יהיה ספציפית ל-PHP אלא לכל שפה. אם יש לך שאלה ספציפית בנוגע למימוש ב-PHP תשאל שוב אחרי שהבנת את העקרון הכללי.

    טוב, עכשיו נקדים ונאמר א) התיעוד שלהם לוקה קצת בחסר... ב) לפי התיעוד שלהם אין שום API עבור התחברות למשתמש שלך על ידי שליחת שם משתמש וסיסמה.
    (ואגב, הם מודים בפה מלא שה-API לא נוצר במחשבה תחילה עבור שימוש כ-API כללי, בעיקר זה נוצר עבור תקשורת של הפרונט-אנד עם הבק-אנד והדבר די ניכר.)

    אז איך עושים בקשות API עבור המשתמש שלך?
    בתיעוד יש שתי אופציות:

    • להשתמש בקוקי בתוקף שלקחת מהדפדפן. השם של הקוקי שאתה צריך הוא express.sid.
      מה שלא כתוב בתיעוד הוא שאם תשתשמש בקוקי תצטרך גם csrf token...
    • או אפשר ליצור טוקן שיאמת אותך. הטוקן הזה מייצרים בפאנל הניהול תחת settings > API Access ואז לוקחים את הטוקן ומכניסים אותו בהידר Authorization אחרי המילה bearer.

    למעשה, אפשר לעשות עוד משהו שלא כתוב בתיעוד וזה לשלוח בקשת לוגין עם הפרמטרים הנכונים ולקבל חזרה את הקוקי הנצרך.

    (אני לא מאריך בכל פרט ופרט, אם משהו לא ברור תשאל. (אבל בבקשה שאלות ממוקדות ומפורטות))


  • בירור | עבודה בתחום התכנות
    yossizY yossiz

    אני רוצה להוסיף עוד נקודה:
    מישהו שאל אדם גדול (אני לא זוכר את השם) שיש לו בת (או בן?) מבוגר/ת ואומרים לו שיש יותר בני זוג פוטנציאליים (שמתאימים להדבר הספציפי שהוא מחפש) באמריקה, האם להתחיל לחפש בן/בת זוג באמריקה?
    האדם גדול הנ"ל שאל אותו "כמה בני זוג הבת שלך צריכה? לא מספיק אחד? אז מה צריך את המאות הנוספות שיש במקום אחר?"
    המסר ברור.
    נניח שאין הרבה משרות מתאימות בשוק. אבל אתה צריך רק משרה אחת, לא?

    (כמובן שהדברים הם לצנינים בצידי אלה שדוגלים בסטטיסטיקה... אבל המציאות מוכיחה אחרת, לא לחכמים הלחם)


  • תכנות | איך להתחיל?
    yossizY yossiz

    @למה אני קורא את שאלותיך (משאלותיך...) ובאמת לא מבין מה אתה מבקש.
    האם תוכל בשורה אחת להביע שאלה ענינית (ולא משאלה...)?

    הבנתי שאתה רוצה "להיות מתכנת". טוב. מה - אם כן - מונע ממך מ"להיות מתכנת"?

    אתה לא יודע שפת תכנות? תלמד שפת תכנות. איזה? פייתון, JS, #C... איזה מהם שתמצא מדריך טוב בשפה שאתה מבין ושמתאים לאופי שלך.

    אתה לא יודע איך מחשב עובד? לא צריך לדעת איך מחשב עובד להיות מתכנת. יש מספר מבייש לגמרי של מתכנתים שלא מבינים איך מחשבים עובדים...

    אתה רוצה להבין איך מחשב עובד? שוב, מה מונע ממך מלקחת מדריך בשפה שאתה מבין ושמתאים לאופי שלך ולהתחיל ללמוד?

    אלא מאי, אתה מבקש מראה מקומות למדריכים? אבל זה לא מה שביקשת...


  • הרצת בדיקת מהירות אינטרנט בלופ
    yossizY yossiz

    זה אמור לעבוד:

    let runCount = 0;
    const interval = 1000 * 60 * 30; // 30 min
    const results = [];
    
    function runTest () {
      $('.start-text')[0].click();
    }
    
    function getResults () {
      const res = {};
      ['ping-speed', 'upload-speed', 'download-speed'].forEach((sel) => {
        res[sel] = parseFloat($(`.${sel}`)[0].innerHTML)
      });
      results.push(res); return res;
    }
    
    function getAverage (field) {
      return results.map(res => res[field]).reduce((p, c) => p + c, 0) / runCount;
    }
    
    function printStats () {
      console.log(`
    =========================
    RUN COUNT: ${runCount}
    Average:
    PING: ${getAverage('ping-speed')}
    DOWNLOAD: ${getAverage('download-speed')}
    UPLOAD: ${getAverage('upload-speed')}
    =========================
      `);
    }
    
    function loop () {
      if (runCount) {
        getResults();
        printStats();
      }
      runTest();
      runCount++;
    }
    
    loop();
    setInterval(loop, interval);
    

    לך לאתר speedtest.net ותדביק את זה בקונסול. כל חמש דקות חצי שעה הוא יריץ מחדש את הטסט וידפיס את הממוצע העדכני.
    ייתכן שאם הטאב לא בפוקוס הסקריפט יפסיק לעבוד, אני לא יודע.
    בכל שלב אפשר לכתוב בקונסול את ה"פקודה" results ולקבל את רשימת התוצאות המלאה.

    @מעלה-ומוריד אמר בהרצת בדיקת מהירות אינטרנט בלופ:

    שאלתי ובקשתי אם יש מי שמוכן לכתוב או לשדך אותי למדריך לJS הנצרך.
    אני מאמין שלא מדובר במשהו ארוך או מורכב, אני טועה?

    לא יודע. תחליט בעצמך אם 43 שורות עונה להגדרה של ארוך או מורכב.


  • עזרה - הכנסת ערך לתיבת טקסט c#
    yossizY yossiz

    @נ-נח אמר בעזרה - הכנסת ערך לתיבת טקסט c#:

    @dovid תודה רבה! עובד מצוין

    באמת מגיע לדוד תודה רבה. אבל לא בגלל שעכשיו הקוד שלך עובד מצויין. כמו שאם תקבל רכב לא תגיד תודה רבה עכשיו יש לי איפה לאכסן בקבוקי קולה. דוד נתן לך שיעור שאמור ללוות אותך במשך כל ימיך כמתכנת.
    אל תחפש פתרונות. תחפש להבין מה הבעיה. הפתרון תגיע מאליה אם רק תבין את הבעיה לאשורה


  • היכר עיצובי לפורום האקסלוסיבי
    yossizY yossiz

    @shaya אמר בהיכר עיצובי לפורום האקסלוסיבי:

    מה דעתכם על זה?

    אני מרשה לעצמי להציג את שעיה מכיון שהוא כנראה מתבייש להציג את עצמו... מקווים שהוא יתחיל לתרום ולא רק לקרוא הודעות ולהצביע...
    מדובר במפתח המוכשר שפיתח את האתר השימושי והמרהיב ביופיו: https://koshercode.netlify.app.
    ואגב, מי שיש לו מה לתרום לאתר הנ"ל מוזמן לתרום, סרטונים או אתרי הדרכה:
    https://github.com/shayaulman/kosher-code

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 254
  • 255
  • 5 / 255
  • התחברות

  • אין לך חשבון עדיין? הרשמה

  • התחברו או הירשמו כדי לחפש.
  • פוסט ראשון
    פוסט אחרון
0
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום