R.J. אקינו: בואו פשוט להתחיל. אז זה 1 חידון. הנה קצת מידע ברמה גבוהה. הדף אודות לחידון הוא בשלב זה כתובת אתר, כבר לא CS50.net, למרות ש ימשיך לעבוד. זה CS50.harvard.edu/quizzes/2013/1. זה גדול על דף, אומר לך היכן ומתי, כלומר ביום רביעי הבא בחבורה של חדרים. ועל ידי ביום רביעי הבא, אני אומר שני ימים מהיום. כל המידע הזה נמצא שם. אבל זה מצטבר. אז כל דבר, החל במחצית הראשונה של שנה היא באופן פוטנציאלי על החידון, כי אתה לא באמת יכול לעשות מתקדם דברים ב-C ללא אם תנאים ו ללולאות וכדומה. אבל יהיה דגש על חומר מכוסה מאז חידון 0, החל structs וקובץ I / O. זה בדרך כלל יותר מאתגר יותר מחידון 0. הציון הממוצע הוא בדרך כלל נמוך יותר. ללמוד קשה. בזמן שאתה לומד, כדי להיות בטוח לשימוש CS50/discuss לפרסם השאלות שלך ולקרוא על השאלות של אנשים אחרים. אז אם אין לך שאלות, להיכנס ולקרוא השאלות של חבריך. הם כנראה שאלות טובות. ולקחת את החידונים בפועל. אנחנו כבר נותנים לחידונים שבע או שמונה שנים עם החברה. הם כולם באינטרנט. שאלות דומות בעתיד לשאלות ישנות. ככה אנחנו עושים אותם. החידון אינו קיים עדיין. אף אחד מאתנו לא ראה אותו. אבל זה ייראה חידונים קודמים. למפגש סקירה זו, זה לא רשימה ממצה של נושאים. אתה לא יכול פשוט להשתתף בזה ולאחר מכן להיות מוכן בצורה מושלמת לחידון. אחרת, זה לא יהיה שהרבה מחידון. וזה לא בהכרח גם כל מה שאתה צריך לדעת על כל ניתנו בנושא. זה אמור לחשוף אותך לדברים אנחנו כבר כיסינו, להזכיר לך את מה שאנחנו מכוסה, ואת הדרך ש שכיסינו אותו. אבל תצטרך ללכת רחוק יותר ו עמוק יותר כאשר אתה לומד כדי לבדוק פעמיים שאתה יודע הכל על כל שניתן נושא וכי אתה כבר מילאת כל הפינות שהיו מכוסה בהרצאה. הערות החידון תגיד לך ללכת ל הערות סופר, קטעי וידאו הרצאת שעון. זוהי דרך טובה כדי לוודא שיש לך כיסה את כל הבסיסים שלך. אז בתחילת הדרך, כאשר אני עשיתי אלה שקופיות, ניסיתי לשים שם מצאתי מידע. אז עבורי קובץ / O, למשל, 7 בשבוע, הרצאה של יום שני, ופורסם סעיף 6 והבעיה סט כל מה שיש מידע על קובץ I / O. אני כבר עשיתי זה לכל נושא. אז שקופיות הכותרת אלה עשויות להיות לך לעזר. אז הנה יש לנו אני קובץ / O. זכור, ב בעיה הגדרת 5, השתמשנו fopen, fclose, fwrite, fread, וfseek. לאחר שהתאושש 30ish תמונות JPEG ו לאחר שינוי גודל והתעסקתי עם מפות סיביות, אתה צריך להיות די מוכרת עם הפונקציות האלה ואיך הם עובדים. אם אתה כבר לא מוכר, בהחלט לעיין בהם. וודא שאתה מבין מה הטיעונים השונים, כשהם בשימוש. אבל באגים הקשורים לקבצים הנפוצים ייתכן שתתבקש על - ובכן, אם אתה שכחת לבדוק אם fopen עבד בפועל לפני שאתה הולך לשנות קובץ. זה יכול להיות רע. אם שכחת לfclose קובץ כי אתה כבר fopened, זה דומה ל דליפת זיכרון. זה די רע. ושוכח לבדוק אם יש לך הגיע לסוף של הקובץ לפני שאתה להתחיל לכתוב אליו. אז אם אתה אומר, היי, אני ב סוף הקובץ. תן לי 5 בתים יותר. ובכן, זה כנראה לא הולך תסתדר כפי שאתה מצפה. זה באמת אותו לקובץ I / O, בגלל שעשינו כל כך הרבה יותר מזה עם הבעיה מוגדרת. אז אם אתה מבין מה קורה בבעיה הסט 5, זוכר את bitmats והתמונות JPEG, אז אתה כנראה כל נקבע לקובץ I / O. אם זה קצת מטושטש, בהחלט תבדוק את הבעיה להגדיר והחומר הנלווה. Structs היה הנושא שהיו על קו בין חידון 0 ו -1 החידון. לא ממש להפוך את החיתוך לחידון 0. אז הם בהחלט נהיה על חידון 1, שבוע 7, יום שני. מהו struct? כאן אנו מראים struct. זה כמו סוג חדש. זה כמו מיכל עבור שדות מרובים. במקרה זה, אנחנו כבר הכריזו struct תלמיד שיש לו שני שדות - שם מחרוזת שאנחנו קוראים ו int שאנחנו קוראים לי גיל. לכן, כאשר אני עובר סביב סטודנטים או שאני לשנות תלמידים, אני אהיה מסוגל לגשת שמם וגילם. בואו נסתכל על קצת קוד בשביל זה. כאן אנו רואים, כי אני כבר הכריז של תלמיד, בדיוק כמו אני מצהיר כל משתנה - x int, y int, וכולי. הנה של תלמיד. הוא מתחיל עם שום דבר בתחומיו. אז בואו להגדיר אותם. אתה מגדיר את השדות של struct עם נקודה. אז אני כבר אמרתי כאן s.name ש= RJ. וs.age = 21. ניתן גם לעדכן שדות באותו אופן שהיית לעדכן הערך של משתנה. אז אני רוצה לשנות את השם שלי מRJ עם אין תקופות לR.J. כוסמין דרך נכונה. זה יהיה s.name = RJ, אותו כפי שאמרנו אותו מקור. ואז אתה יכול לגשת אליהם. אז יש לנו להגדיר אותם. שנעדכן אותם. ניתן גם לגשת אליהם באותה הדרך. אז הנה, אני מדפיס את R.J. האם ישן 21 שנים. ואני גישה ערכים אלה עם s.name וs.age. אז שגישת structs עם סימון הנקודה. כן, שאלה? קהל: האם יש סיבה על שקופית קודמת שלא לשים סטודנט בשורה העליונה, כמו typedef תלמיד struct ולאחר מכן סטודנט בסופו של הדבר? R.J. אקינו: אז השאלה הייתה, על השקופית הזו, שראינו בדרך כלל typedef struct צומת ולאחר מכן שדות של struct ו אז מילת הצומת. ואיך הגיע לכאן אני לא אומר, typedef תלמיד struct ולאחר מכן שדות של struct ולאחר מכן סטודנט? הסיבה לכך היא שאני לא צריך לגשת אליו בתוך struct. אז זה בסדר להשאיר אותה ללא שם. אני רק יכול להשאיר אותו כפי struct בעילום שם. הסיבה שאנחנו עושים את זה לרשימות מקושרות ו דברים הוא, כי בתוכך צריכים הפניה כוכב צמתים struct. אז struct חייב להיות שם, כך שאתה יכול לגשת אליו מאוחר יותר. זה פרט שולי. אבל אתה בדרך כלל רואה typedef struct סוגריים מסולסלים אם אתה לא צריך השם וtypedef struct כמה שם ואחריו בסוגריים מסולסלים, אם תרצה צריך את השם. כך שזו שאלה טובה. ועל נקודה זו, אנו נוטים לשנות structs ולעבור מסביב structs ידי התייחסות, לא על ידי ערך. אז אנחנו פשוט מעבירים מצביעים structs במקום עובר סביב structs עצמם. אז אתה לעתים קרובות מאוד הולך להיות שימוש, במקרה זה, * תלמיד או * צומת מבנה או צומת * במקום סטודנטים או צמתים החוצה. אז הנה, אני כבר אמרתי, אוקיי, PTR משתנה הולך להיות כתובתו של ים. זה הולך להיות המצביע לתלמיד R.J. אז אנחנו יכולים לקבל בתחומים אלה אותו הדבר כמו שאנחנו מקבלים כל דבר. ראשית, זיהוי להפנות את המצביע כדי לקבל את struct. זה * ptr ולאחר מכן נקודה ולאחר מכן גיל. אז כדי לגשת לשדה, ואני כבר מעודכן את זה עכשיו כדי 22, כי, בוא נניח, זה היה יום ההולדת שלי. יש תחביר קיצור באמצעות החץ כאן. גיל חץ כך PTR הוא רק אותו הדבר כמו * ptr.age. עכשיו, זה משהו שיהיה לך לשנן ולזכור. אתה השתמשת בו הרבה בpset6, pset האיות. אבל זה בעצם מה שקורה על מתחת למכסת המנוע. זה ביטול הפניה למבנה המצביע ולאחר מכן לגשת אליו. שאלה? קהל: [לא ברור]. R.J. אקינו: אז למה אנחנו משתמשים מצביעים כstructs במקום structs עצמם? הסיבה תהיה אם אתה עובר struct לפונקציה, אתה כנראה רוצה לעבור מסביב רק 4 או כך בתים המייצגים את המצביע, כפי בניגוד לפוטנציאל או 30 40 בתים כי הם struct. אז עובר משהו לפונקציה קל יותר כאשר הדבר הוא קטן יותר בזמן קצר. שאלה? קהל: ייתכן שהזכיר את זה בהתחלה, אבל הם שם שקופיות עד אחרות על [לא ברור]? R.J. אקינו: שקופיות אלה יהיו עד לאחר פגישת הביקורת. אנחנו נפרסם אותם באתר. אז ממשיך הלאה ולהמשיך הלאה במקצת מהר יותר, אנחנו הולכים לדבר על נתונים מבנים. יש הרבה. כיסינו חבורה שלהם. הנה מה שאתה צריך להבין על מבנה הנתונים. אתה באמת צריך להבין בגבוה רמה מה הוא כל מבנה. האם אתה יכול להסביר באנגלית לך חבר שלא נקט CS50 איך אנחנו מארגנים את הנתונים שלנו ולמה אנחנו היינו ישתמש משהו בדרך זו? זה דבר אחד. דבר שני, מבין היישום. אז להבין כיצד להשתמש בדברים האלה בג ואנחנו נלך על זה. ואז דבר שלושה היה יודע פעמים לרוץ והמגבלות של מבנים שונים אתה משתמש. אז הבנתי למה היית משתמש חשיש שולחן במקום מערך. להבין כמה מהר, בממוצע, גישה לשולחן חשיש. להבין מה פעולות מהירות על רשימה מקושרת אבל איטית על מערכים ו להיפך. אז כדי להבין את זה, יהיה לך ל מבין סימון Big-O רק כדי לדעת איך לדבר על אלה מיני דברים. ונדבר על זה. דבר אז קודם כל, רשימות מקושרות. הנה תמונה ברמה גבוהה של רשימה מקושרת. אנחנו מראים את זה בכיתה. בדרך כלל יש לנו 10 אנשים עומד על הבמה. אבל יש לנו סדרה של צמתים שבו כל יש צומת קצת ערך ומצביע לערך הבא שלה. אז כדי להגיע מצומת אחד למשנהו, אתה רק אומר, תן לי את הצומת הבאה. יש לך הצומת. תן לי את הצומת הבאה. יש לך הצומת. תן לי את הצומת הבאה וכן הלאה עד שאין שמאל צומת. אז תמשיך לדבר על זה ברמה גבוהה. זה קל מאוד להכניס דברים לרשימה מקושרת. אם לא אכפת לך על ההזמנה, אתה יכול פשוט להפיל אותו מייד בהתחלה. זה זמן קבוע. אבל קשה למצוא את ערך. אם אתה מנסה לשאול, הוא שבע ברשימה שלי? אתה צריך לעבור כל ערך. האם זה שבע? האם זה שבע? האם זה שבע? האם זה שבע? שוב ושוב. וזה O (n). לכן, כאשר לומדים לחידון, להשוות את זה עם מערכים. האם זה בסדר? האורות כבו עמומות. על אישור. מתי רשימה מקושרת טובה יותר? כאשר הוא מערך טוב יותר? אז בואו נסתכל על כמה קוד. הנה צומת פוטנציאלית. זה struct. יש לו n int, אשר יהיה הערך שלנו. ויש לה צומת struct * הבא, אשר הוא מצביענו לצומת הבאה. אז הנה, אנחנו יכולים לראות שאנחנו קרו ליש לשים int בצומת שלנו. אבל אם זו היתה רשימה מקושרת של char כוכבים או רשימה מקושרת של צף, אנחנו לגמרי יכול לעשות את זה יותר מדי. זכרו בpset6, סביר להניח שהיה לי רשימה מקושרת של כוכבי char או סתם מערכי char סטטי. בואו נסתכל כאן במבצע. אז אנחנו רוצים להכניס חדשים n לרשימה המקושרת שלנו. אנחנו מתחילים עם מצביע ראש שהוא מצביע לצומת הזה שיש לו את ערך של n והבא של מצביע כי נקודות לצומת הזה היא ערך של n והבא של null, כי זה הצומת האחרונה. אז בעניין של זמן, אני לשים את כל הקוד על המסך. ונדריך את דרכו כמה שורות בכל פעם. אז הנה הקוד. אני מקווה שזה קריא. הדבר הראשון שאנחנו עושים הוא אנו malloc צומת חדשה. אז זה הופך את מצביע לצומת חדשה ש לא די לי שום דבר מוגדר בזה עדיין. אנחנו בודקים לוודא כי הצומת החדשה היא לא ריקה. אחרת, אנחנו צריכים לוותר. אז לאחר שבדק כי, אנחנו עכשיו להגדיר את הערכים בצומת. אז אנחנו שמים n החדש לתוך שדה n שלנו. ואנו קובעים את המצביע הבא כדי להצביע הראש המקורי, כך שנוכל עכשיו הכניס את זה צומת לרשימה שלנו. לבסוף, יש לנו את נקודת הראש הגלובלית לצומת החדשה שלנו, כך שאם היינו להתחיל בראש, היינו בשלב זה הצומת הראשונה חדשה במקום הצומת הראשונה הישנה. וכאשר פונקציה זו יוצאת, צומת חדשה משתנה כבר לא קיימת, בגלל שזה היה מקומי לפונקציה. אז זה המצב של העולם. הראש הגלובלי שלנו מצביע על החדש שלנו צומת ראשונה, שמצביעה עלינו צומת הראשונה מקורית, שנקודות לצומת אחרי זה. זה היה כניסה. אני מקווה שהיה יחסית פשוט לעקוב. במקרה של ספק, לצייר תמונה. אז אני מוצא שמדבר על רשימות מקושרות ומסתכל על קוד הוא מאוד לא מועיל. בעוד מסתכל על תמונה של מקושר רשימה מאפשרת לי לחשוב, הו, כל כך יש לי את הצומת הזה כאן. אבל אם אני מעדכן את המצביע ש, זה בסופו מנותק. ושכחתי שבי הצומת הולכת. וקוד יציאתו. ויש לך צמתים מרובים כי הם מנותקים. ואתה לא בסופו של דבר עם הרשימה שאתה רוצה. אז אם אתה מצייר את התמונה ולעשות את זה צעד אחר צעד, בתקווה, תוכל לראות הסדר הנכון של דברים במונחים של עדכון המצביעים כדי לוודא כי הרשימה מגיעה ביחד. הכנס הוא פשוט יחסית. אחד מסובך יותר יהיה כניסה לתוך רשימה ממוינת. פונקציה מסובכת יותר היא למחוק ותמצא, ולכן מחפש דרך רשימה לראות אם יש שם משהו. אולי אתה עשית את זה בpset6 כאשר אתה נכנס לטבלת הגיבוב שלך ואתה אמר, כן, הוא המילה התפוח ברשימה המקושרת שלי? אז ייתכן שכבר עשה את זה. אבל בהחלט, לרענן את זכרונך ולנסות reimplement חיפוש ו reimplement למחוק לרשימה מקושרת. הערה צדדית כיף, יש גם כפליים צמוד רשימות, שבו יש לך מצביעים שמצביעים הן לפנים והן אחורה, כך שאתה יכול ללכת ל הצומת הבאה ולצומת הקודמת. ולא הייתה שאלה בשנה שעברה חידון מסוג זה, מדבר על כפליים צמוד רשימות. עכשיו, זה מבנה שאתה מוכר יחסית עם, משום שרוב שלך כנראה השתמש בהם על pset6. הנה אחד שזה קצת פחות מוכר. בתור הערה צדדית, אני חושב ש1 חידון הוא בעיקר קשה יותר מחידון 0, כי הדברים שאתה עושה, אתה לא עשה כל כך הרבה. כדי לשים את זה בדרך אחרת, לחידון 0, אתה כתב הרבה ואנחנו ג שאלתי אותך על ג עבור 1 חידון, אנחנו הולכים לשאול אותך על PHP ו-JavaScript, שבו אתה לא כפי שנכתב הרבה. אנחנו הולכים לשאול אותך על C-קוד ש אתה לא כתבת כמה שיותר, דברים C מתקדמים זו. אז בהחלט, לתרגל אותנו הדברים דיבר עליו בהרצאה שאתה לא עשיתי בהכרח על הבעיה להגדיר. ואם כבר מדבר, אתה לא כתבת ערימה על בעיה להגדיר. אבל זה היה בהרצאה. הנה התמונה ברמה הגבוהה של ערימות שאנו מציגים בכל שנה. זה הערימה של מגשים חדר אוכל מאת'ר. ברמה גבוהה, הן הערימות האחרונות ב, הראשון מתוך מבנה הנתונים. זה אומר שאתה הולך כדי לשים את הדברים ב-- 1, 3, 7, 12, 14, 0 שליליים. דבר אחד אני לא יכול יש לי אמר - שלילי 3, 0. אתה שם את כל הדברים האלה פנימה והאחרון אתה מכניס הוא ראשון אחד שהולך לצאת. אז יש לך שתי פעולות - לדחוף ופופ. כל לשים שבהייתי מחווה כזה הוא דחיפה. ואז כשאני מגיע לגזל משהו או להגיע למעלה כדי לתפוס משהו, זה פופ. אז אנחנו הולכים ליישם את הערימות. והראיתי להם בהרצאה שימוש במערכים. אבל אתה יכול לעשות אותם באמצעות רשימות מקושרות. ערימה היא נתונים רעיוניים מבנה, לא אוהב אחד יישום ספציפי. אז מה שהייתי נראה? זה היה נראה כמו סוג של זה. שתהיה לך בגודל של מספרים שלמים. ושתהיה לך מערך של ערכים ש אנחנו קוראים מגשים, כי זה מה התמונה הייתה עבור שלנו - int מגשים - ולאחר מכן כמה קיבולת המקסימלית. אז מה היה דוחף את נראה? ובכן, אם יש לנו של מחסנית, ואז לדחוף את משהו על ים, היינו מקבל גודלו של ים. וזה יהיה הבא נקודה פתוחה של המערך שלנו. אז אם יש לנו שלושה דברים בערימה שלנו, לאחר מכן מגשים 3 יהיה הבא מקום פתוח, כי 0, 1, ו 2 כבר התמלאו. אז אנחנו שמים את הערך לתוך s.trays [s.size], המקום השלישי. ואז להגדיל s.size לומר, היי, היו לנו שלושה דברים לפני. עכשיו, יש לנו ארבעה. אז בפעם הבאה שאתה דוחף, אתה הולך לשים משהו לתוך 4. או בפעם הבאה שאתה קופץ, אתה הולך להסתכל על 3 במקום 4 או משהו כזה. ולאחר מכן נחזור נאמן ל נניח, היי, הצלחנו. זה עבד. ככלל אצבע, אם פונקציה זו אמור לחזור אמיתי או השקר תמיד מחזיר אמת, ייתכן עשה משהו לא בסדר. אז זה עובד? ובכן, זה עובד מצוין עבור 1, ו 2, ו 3, ו -4, וחמש. אבל בואו נגיד שאני מגיע לקיבולת שלי. אז אני כבר נתקלתי בבעיה, כי אם הגודל זהה לקיבולת, אני עכשיו מנסה לשים משהו לתוך מערך שבו אין לי מקום. אז בדיקה קצרה כדי לתקן את זה. אם s.size קיבולת ==, בתמורת שווא. אחרת, ללכת ולעשות את מה שעשינו. אז מה עוד אנחנו יכולים לבקש על לערימות? מה עוד אתה צריך ללמוד? מה עוד אתה צריך להתאמן? ובכן, יישום פופ. אנחנו כבר עשינו את הדחיפה. אני אסדר את זה. יישום שאינו מערך, שבו אתה משתמש ברשימה מקושרת, אולי. יישום שאינו int. עשינו ints כאן. אבל זה היה יכול להיות צף. היינו יכול להיות מחרוזות. זה היה יכול להיות כוכבי char. תראה חידוני העבר למינים שאלות שכבר נשאלות על ערימות. אני אומר שאנחנו מכוסים ערימות סביב אותו הדבר כמו שכבר כיסו אותם ב שנים האחרונות. אז שאלות החידון צריכה להיות אינדיקציה טובה. במבט קדימה אפילו מהר יותר, תורים. הם כמו ערימות. אבל הם הראשונים, את הראשון. אם אתה בריטי, בתור המילה כנראה עשיתי הרבה חוש לך. אחרת, ייתכן שיש לך שמע על זה כעל קו. הם עובדים כמו הקו בחנות של אפל. האדם הראשון להופיע בשעה 3:00 בבוקר הוא הראשון אדם לקנות iPad שלו. אז יש לנו שתי פעולות - הוסף לתור וdequeue. הוסף לתור מעמיד מישהו בקו. Dequeue מושך הראשון אדם מן השורה. שוב, אנחנו יכולים ליישם זה עם מערך. אז מה אנחנו struct הראה בהרצאה? זה היה זה. שוב, מספרים. שוב, גודל ומול הדבר החדש הזה. מדוע יש משהו שנקרא חזית? זה המדד הבא אלמנט לdequeue. זה רק באופן פנימי שמירה על המסלול של הבחור הראשון להופיע, אז אנחנו ש יכול למשוך אותו החוצה כאשר אנחנו צריכים. בהחלט מסתכלים על סיכומי הרצאות ולנסות ליישם Enqueue וdequeue כאשר לומדים לחידון. דברים חשובים שיש לחשוב עליו. גלישה מסביב אם החזית בתוספת גודל סופו של דבר גדול יותר מקיבולת. שוב, אם המבנה שלך מלא, אתה הולך יש לי בעיה. חשיש שולחנות שראיתם בעבר. רובכם כנראה מיושמים אלה על pset6. זה מבנה שנועד לO (1) החדרת זמן קבוע וO (1) בדיקת זמן קבועה. בCS50, יישמנו את זה כ מערך של רשימות מקושרות. המרכיב המרכזי לשולחן חשיש היא הפונקציה חד כיוונית. אז הוא ממיר את הקלט שלך, נניח, מילה במילון, למספר, שהוא הולך להיות האינדקס שלנו. ואנו נשתמש מדד למערך שלנו. אז הנה תמונה קטנה וחמודה מstudy.50.net. אנחנו זורקים את כל המילים לתוך פונקציית hash שלנו. ופונקציית hash אומרת לנו איפה לשים את המילים האלה. כל זה הוא גדול בארץ שבה יש רק מילה אחת לכל חריץ. אבל כפי שאתה זוכר מpset6, יש יותר מילות מאשר חריצים. אז מה קורה כאשר אתה תקבל התנגשות? במקום לאחסן ערך אחד ב, נניח, חשיש טבלה 3, אתה לאחסן רשימה מקושרת. וכך במקום שיש מלון כאן, יש לך רשימה מקושרת, שבו על הצומת הראשונה היא מלון. ואת הצומת הבאה היא חתול. ואת הצומת השלישית היא התנגשות, בוא אומר, כי כל המילים האלה מתחילות עם ג אז רובכם עשה את זה לpset6. אם אתה לא עושה את שולחן חשיש בpset6 ואתה ניסית משהו כמו הגיבורים, בהחלט לסקור שולחנות חשיש. אם אתה עשית את זה בpset6, בהחלט תסקור שולחנות חשיש. ואם עשה את זה בpset6 וזה לא נסתדר לגמרי בסדר ואתה היה לי הרבה בעיות עם זה, בהחלט תסקור שולחנות חשיש. אז את הלקח באמת הוא בהחלט תסקור שולחנות חשיש. המיעוט העצום שלך ניסה את מנסה בpset6. תמונה ברמה גבוהה. זה משהו כמו זה, שבו כל יש צומת קבוצה של ילדים, שבו כל ילד מתאים למכתב. ובכל צומת גם אומרת, היי, אני מילה. אז במקרה הזה, המילה מקסוול, אם אתה מבין את M ל X-W-E-L-L ולאחר מכן בצעתי אותו לאחד יותר. ואתה מקבל סמל, דלתא, זה שבו אנחנו מסמנים לפירוש זה הוא מילה. אז מקסוול הוא מילה. הד לתות אלו ברחבי מסמנים שדברים הם מילים ובי דברים הם לא. אז בpset6, הנתונים שמאוחסנים לצד כל אחד מצומת שלנו היה "אני מילה. "והדבר מגניב על ניסיונות הוא שהם מדגימים הכנסה ו בדיקה בO (אורך של מילה). אז רק כדי לעבור את מקסוול, זה M--X-W-E-L-L. אז שבע או שמונה - אני לא יכול לספור - צעדים כדי להגיע בסופו ולבדוק את הדברים. יישום כל כך מהיר כאן. רוב עבר מקושר רשימה בנתיחה שלאחר מותו. כדי לבדוק את זה. סליחה. עבר מלבלבים בנתיחה שלאחר מותו. כדי לבדוק את זה. אבל אתה בעצם יש יש כל צומת 27 מצביעים לצומת הבאים ואחד בוליאני עבור אני מילה. בדוק את הנתיחה שלאחר מותו של רוב לאיך למעשה זה מיושם. המבנה הסופי שלנו, העצים שלנו ועצי חיפוש בינארי. אז מסתכל על אלה, אלה היו מכוסים לאחרונה שבוע 8, יום שני. עץ דומה לגיבורים, חוץ ממך אין לי בהכרח 27 צמתים ב כל נקודה. ואין לך את הנתונים בכל צעד שמסמן אם - הדרך לא משנה. ואילו הגיבורים, את הנתיב מלמעלה תחתון, מקסוול, היה חשוב לנו. אבל יש כל צומת מרובה ילדים, אולי. יש לנו כמה אוצר מילים יותר. השורש של העץ הוא בחלקו העליון. ואנו אומרים כי מאוד תחתון צמתים שאין להם ילדים הם עלים. אז כמו הגיבורים, עץ הוא מבנה של צמתים. סוג נפוץ של עץ שאנחנו הולכים לדבר עליו הוא עץ בינארי, שבו יש כל צומת אין ילדים או ילד אחד או שני ילדים. אז התמונה הזאת כאן היא לא עץ בינארי, כי יש צומת 3 לשלושה ילדים. אבל אם היינו להתעלם מאלו, שאר שלו הוא עץ בינארי כי זה מדגים את הרכוש שכל צומת יש אפס, אחד או שני ילדים. אז איך אנחנו יכולים להביע את זה בקוד? יש לנו יכול צומת שבו כל צומת יש שלם בתוכו, כמו גם כמצביע לעץ בצד השמאל ומצביע לעץ על בסדר, אז שני ילדים. איך זה שימושי? ובכן, אם אנחנו עושים את הכללים על איפה אנחנו לשים צמתים, אנחנו יכולים לעשות חיפוש מהיר יותר. אז יש רעיון של חיפוש בינארי עץ, שבו כל צמתים על יש עץ משנה עזב את ערך קטן יותר מהצומת אנחנו מסתכלים. וכל צמתים בעץ המשנה תקין יש ערך רב יותר מצומת השורש. עכשיו, זה נראה כמו הרבה מילות. אני הולך לשים אותו בתוך כפול ציטוטים ולהראות לך תמונה. אז הנה דוגמא של עץ חיפוש בינארי. רואה שאנחנו מתחילים עם 10. כל מה שמשמאל 10 הוא קטנים יותר ממה שהוא. והכל בצד הימין הוא גדול יותר ממה שהוא. אבל יותר מזה, כל צומת ב העץ מבטא את הנכס הזה. אז יש את הצומת 7 3 עד על ימין ועל 9 בצד הימין. אז כל אלה הם קטנים יותר מאשר 10. אבל מסתכלים רק אלה, יש 7 3 לה השמאלי ו9 לזכותה. ובאופן דומה בצד הימין, יש 15 14 לה השמאלי ו50 לזכותה. אז שלושה צמתים שם, 15, 14, ו50, גם עץ בינארי בתוקף או עץ חיפוש בינארי בתוקף. והם כולם גדולים יותר מ10. אז מותר להם להיות בצד הימין שם. האם יש לך שאלה? קהל: איך אתם מתמודדים כאשר יש לך שני שביעיות? R.J. אקינו: כן. איך אתה מתמודד עם שני ערכים שהם אותו הדבר? כמה עצי חיפוש בינארי אומרים שאתה להתעלם מכפילויות, כי המטרה היא רק כדי להגיד, שראיתי הדברים האלה כל כך רחוקים. כמה עצי חיפוש בינארי שאפשר לומר יש לספור בתוך הצומת. אחרים יכולים לומר כי הכל כדי השמאל הוא פחות או שווה ל. והכל בצד הימין גדול מ. זה פשוט תלוי במה בעיה היא שאתה פותר. אז במילון, למשל, אתה לא הייתי אכפת להם כפילויות. היית זורק אותם החוצה. אך ייתכן שאכפת איזו בעיה אחרת. קהל: האם זה אפשרי שיהיה לי 1 בצד השמאל של 15, אשר הוא פחות מ -10? R.J. אקינו: מס אם 14 כאן היו 1, היית עושה את זה לא יהיה עץ חיפוש בינארי בתוקף, כי הכל בצד הימין של 10 צריך להיות גדול יותר ממה שהוא. ואנחנו תראו למה. אם בארץ חיפוש המטרה שלי היא למצוא 14, אני מתחיל בשורש. אז אני מסתכל. על אישור. אנחנו הולכים להתחיל בשורש. תראה 10. ובכן, 14, היעד שלנו, הוא גדול יותר מ10. אז זה חייב להיות בצד הימין. זה דומה מאוד לכל הטלפון דבר ספר שעשינו, בינארי לחפש שם. אבל במקום לחפש בינארי במערך, אנחנו ינארי חיפוש בעץ הזה. אז אנחנו עדיין מחפשים 14. ובכן, 14 הוא קטנים יותר מאשר 15. אז אם זה בעץ שלנו, הוא חייב להיות בתחום זה כאן. זה חייב להיות בצד הימין של 10 ומשמאל 15. ואז אנחנו בודקים את הצומת הזה. וyay, מצאתי 14. אני לא מתכוון ללכת דרכו. אבל הנה הקוד. זה בעצם יחסית פשוט, בגלל זה הוא רקורסיבית. מה שאנחנו יכולים לבקש ממך לעשות בחידון? אנחנו יכולים לבקש ממך לכתוב את הקוד הזה. אנחנו יכולים לשאול אותך להסתכל על הקוד הזה ולשנות את הקוד הזה ולהסביר מה היא עושה. כן. שאלה? קהל: האם שקופיות אלה הולכים להיות זמין כפי שהיו בפעם האחרונה? R.J. אקינו: כן. אז שקופיות אלה בהחלט יפורסם. קהל: הם פורסמו דווקא עכשיו באתר. דוד פשוט עשה את זה. R.J. אקינו: השקופיות עכשיו באתר. אני בטח להטליא כמה שגיאות הקלדה שציינתי ולתקן אותם. אבל יש נוכחית גרסה באתר. אחרים דברים שאנחנו יכולים לבקש ממך לעשות - לכתוב להוסיף. לכתוב גרסה חוזרת ונשנית של פונקציה רקורסיבית אנחנו רק הראיתי לך או לדבר על הדברים האלה, כמו ב פסקאות, במילים, במשפטים. השוואה בין זמני ריצה ומסביר מה שהיית רוצה להשתמש בינארי עץ חיפוש במקום חשיש שולחן, למשל. אז מבין מבנים אלה ברמה די עמוקה. להבין איך לכתוב אותם, איך להשתמש בם, איך לדבר עליהם. ואתה תהיה מוכן. שאלה? קהל: כשאתה כותב עץ חיפוש בינארי, איך אתה לקבוע מה ערך לעשות את זה כמו השורש? R.J. אקינו: אז השאלה הייתה, מה ערך אתם עושים כשורש? בהתאם לקוד שלך, אתה ייתכן שיש לי שורש גלובלי. אז אתה יכול להיות סביר היה ב pset6 שולחן חשיש עולמי. לחלופין, ייתכן שאתה עובר את השורש כבטיעון. אז פונקצית חיפוש זה כאן לוקח טיעון צומת *. ולכן כל מה שצומת יקרה לך להיות מסתכל הוא אחד אתה מטפל כמו השורש שלך כאשר אתה עובר אותו פנימה ואני מסודר. אלה הם השקופיות שלי. האדם הבא יכול לבוא להחליף במחשב נייד ומיקרופון. ROB אודן: אני חושב שאולי יש לי פירש את השאלה הזאת בצורה שונה. אבל אני פירשתי את זה כ, אם יש לך המספרים 1, 2, ו -3, איך אנחנו לדעת לעשות 2 השורש בניגוד ל1 או 3? אם אנחנו עושים את 2 השורש, אז זה יפה 1 ו -3 לשמאל וימין. אבל אם 1 הוא השורש, אז זה 1 ל עליון, 2 מימין, 3 בצד הימין. אז כברירת מחדל, אתה לא יודע מה לעשות שורש. ועבור כל אלגוריתם שאנחנו מצפים לתת לך, רק הדבר הראשון שאתה הכנס יהיה השורש. או שאנחנו רוצים לתת לך עץ בינארי ש כבר קיים שיש לו שורש. אבל אלגוריתמים אחרים קיימים כך ש השורש יעדכן, כך שאם אתה בסופו של המצב שבו זה 1, 2, 3, זה יהיה באופן אוטומטי לעדכן את לעשות 2 השורש החדש, כך ש זה עדיין יפה מאוזנת. אנג'לה LI: מגניב. היי, חבר 'ה. אני אנג'לה. ואני הולך לסיים את C שלנו ולאחר מכן להיכנס לכמה מהאתרים שלנו טכנולוגיות - HTTP, HTML, ו-CSS. אז הדבר הראשון הוא חיץ התקפות בגלישה. אז בואו נסתכל על הקוד הזה. זה די פשוט. יש foo פונקציה. וזה לא מחזיר שום דבר. אבל זה לוקח במצביע למחרוזת בשם בר. וזה הולך להכריז על זה חיץ, שהוא דמות מערך שיש לי 12 חריצים. והיא משתמשת בה memcpy, שהוא רק פונקציה שעותקים מכתובת אחת לאחר. אז זה הוא מנסה להעתיק לתוך חיצנו מכל הבר מצביע. אז מושג מה לא בסדר עם הקוד הזה? קהל: אם הבר ארוך יותר C, הם יחליפו. אנג'לה LI: כן, בדיוק. אין לנו שום ערובה לכך שבר הולך להיות פחות מ 12. אנחנו פשוט עשינו כמה מספר שרירותי 12. ואנחנו היינו כמו, בואו נקווה ש קלט המשתמש שלנו הוא פחות מ תווי 12 ארוך. אז בעולם אידיאלי, אם הקלט שלנו הוא תמיד כצפוי, אז נגיע משהו כמו, הלו. זה פחות מ12 תווים. זה נהיה לקרוא לתוך char ג. ואז אנחנו עושים משהו עם זה. זה לא משנה באמת. אבל אדם זדוני יכול לעשות משהו יותר כמו זה, שבו הם לתת לנו כל מה שהבר מצביע, זה הולך להצביע למערך הענק הזה רק של. וזו הדרך ארוכה יותר מ12. אז זה הולך ללכת את כל הדרך כאן למטה למקום שבי התמורה כתובת הייתה פעם. אז בואו נגיד שפונקציה זו נקרא foo. אולי foo נקרא על ידי חלק אחר פונקציה, שנקראה על ידי ראשי. לכן, כאשר foo פועל, שהוא צריך לדעת לאן לחזור. אם foo נקרא על ידי כמה פונקציה בשם באז, שיש לו יודע שזה צריך לחזור לאז. וזה מה שכתובה שולח זה כאן אומר לנו. אבל אם להחליף אותו עם כמה אחר כתובת, במקרה הזה, זה הוא ייצוג של הכתובת ב מתחיל מאוד של חיץ זה, ולאחר מכן מה באמת הולך לקרות הוא ש במקום לחזור בחזרה לאז, הנקרא הפונקציה שלנו, זה רק הולך לחלק הקדמי של קוד זה. ואם זה היה שם כי אחי האקר הזדוני בא ו הזריק את זה, אז אולי סכום זה של שלו לא ממש של. וזה בעצם רק קוד שהפסקות המחשב שלך או משהו. אז כדי להיות הגנתי על סוג זה של דבר, יש לך אף פעם לא להניח כי קלט משתמש הוא מסוים כמות התווים. לדוגמא, כאשר אתה עושה המאית, שאמרו לך שדברים היו רק הולך להיות 40 תווים לכל היותר ארוך. וזה היה טוב. אבל אם לא, אז אתה תצטרך הקפד לקרוא רק ב45 תווים בכל פעם. אחרת, אתה עלול לדרוס החיץ שלך. כל שאלות על זה. כן. קהל: האם אתה יכול רק לדבר קצת יותר על אלה? אנג'לה LI: מצטער. כן. קהל: המיקרופון הוא רק לוידאו. אני אנסה ופרויקט. היי, חבר 'ה. Sup? אז בואו נעבור על כמה דברים ב ספריית CS50, אתה שכבר משתמש כל הסמסטר, בעיקר כדי לקבל קלט ממשתמש. כפי שאתה יודע, אתה כולל CS50 ספרייה על ידי פשוט עושה CS50.h, אשר מכיל את כל אבות הטיפוס של פונקציות שאתה יכול להשתמש בו, כמו GetString וGetInt, ו GetFloat, וכולי. ויש שורה אחת זה בCS50 ספרייה המגדירה מחרוזת, אשר אתם כולנו יודעים עד עכשיו רק char *. אבל בואו להציץ איך GetString עובד. זוהי גרסה מאוד מקוצרת. אתה יכול למשוך את הקבצים בספריית CS50 מ, אני חושב, manuals.CS50.net. ואתה יכול לקרוא דרך התפקוד בפועל. אבל זה מכסה חלק החלקים החשובים. אז יצרנו כמה חיץ עם קצת יכולת. ומה שאנחנו עושים הוא שאנחנו מקבלים תו אחד בכל פעם מn הסטנדרטי. זה מקום שבי תשומות המשתמשים טקסט במסוף. וכך אנחנו הולכים לקרוא ב כל עוד זה לא דמות חדשה קו וזה לא בסופו של קובץ, אשר הסוף של קלט סטנדרטי. ועבור כל תו שאנו קוראים ב, אם דמות שסופו של דבר הוספה למספר התווים שקראנו ושבהוא יותר מהיכולת שלנו, אז מה שאנחנו עושים הוא שאנחנו פשוט לשנות את הגודל שלנו חיץ, כך שזה זמן כפול. אז שוב, זה להגן מפני חיץ התקפות על גדותיו, בגלל שאתה קורא ב אופי בכל פעם. ואם בכל נקודה שאתה קורא במדי רבים, אתה פשוט להרחיב את המאגר שלך. אתה מכפיל אותו בשתיים. ואז יש לך יותר מקום. אחרת, אתה רק להוסיף אופי לחיץ. ואחרי שקראתם בכל תווים, היא תתכווץ החיץ בחזרה לגודל הנורמלי, להוסיף שליחות קטלנית ריקה, ולאחר מכן לחזור. עכשיו, בואו נסתכל על GetInt. אתם יכולים לקרוא את זה? אני יכול להתקרב קצת. אני לא יודע איך מחשבים לעבוד. אין דבר. אני לא יכול להגדיל את התצוגה כמו שצריך. זה באמת קשה. אני מצטער. בואו רק נסתכל על זה. אז מה GetInt עושה זה קורא ראשון במחרוזת מGetString, אשר אנחנו כבר יישמנו בעבר. והחלק החשוב לציין כאן הוא אם שיתוף זה כי זה בסופו של קריאה היא כמו לא ממש מחרוזת, אז אנחנו פשוט לחזור לINT_MAX מייצג כישלון. למה אנחנו חוזרים INT_MAX במקום של 1 שלילי או 1? יש לך רעיונות? קהל: [לא ברור] שלילי 1 על אחד. אנג'לה LI: כן, בדיוק. אז אתה בדרך סביר יותר רק רוצה לקלט 1 או 1 שלילי כאשר תתבקשו להמי יודע כמה ומה המי יודע כמה Maxes. זה ענק. אתה לא כנראה הולך להשתמש בו. אז זה כמו החלטת עיצוב לוודא שאתה לא בטעות להחזיר שגיאה או שאתה לא חוזר 1, מה שעשוי להיות מנותח כמו תשובה נכונה. אז אם קו לא קיים, אנחנו חוזרים INT-MAX. אחרת, אנו משתמשים sscanf, שזה כמו scanf. אבל זה קורא ממחרוזת. ויש לנו את זה מעוצב מחרוזת, המהווה%% i ג. ואנחנו מנסים ולהתאים את זה עם כל מה שהמשתמש נתן לנו. אנחנו רוצים שמספר דברים מתאימים להיות 1, מה שאומר שאנחנו רק באמת רוצה להתאים מספר שלם מוקף אולי לבן חלל, ואולי לא. במקרה זה, אם אתה מכניס משהו כמו הבר, הבר אינו תואם בכלל, משום ששם צריך להיות שלם בהתחלה. אז sscan מעולם לא פנה 0. אז אתה לא מחזיר את זה. לחלופין, אם אתה מכניס משהו כמו 1, 2, 3, A, B, C, שגפרורים שני המספרים השלמים, אלא גם האופי אחריו. אז sscanf יחזיר 2, אשר הוא גם לא אידיאלי. אתה לא רוצה 1, 2, 3,, B, C להיות int בתוקף. אז זה גם לא עובד. אבל אומרים לך לשים במשהו כמו 50. שיתאים% i, מה שאומר היא תקבל לקרוא לתוך n. ועכשיו, n יכיל המספר 50. ואז אתה יכול להחזיר אותו. אחרת, אתה מכה על נסה שנית. ואז זה פשוט הולך שוב עד אתה מקבל קלט תקין מהמשתמש. כל שאלות על זה? קהל: אז אם היית להדפיס את הערך של GetInt על [לא ברור] זה יהיה רק ​​המספר השלם והמקסימום? אנג'לה LI: כן. אז אם אתה משתמש GetInt, אתה צריך להניח כי אתה לא רוצה מקסימום המי יודע כמה ל להיות קלט חוקי, בגלל שאתה הולך להניח שזה היה רע. קהל: אם לא היה לנו char c ו מישהו לשים 1, 2, 3, סם, היית עושה את זה עדיין עובד עבור 1, 2, 3? אנג'לה LI: אני חושב שזה יעבוד. אבל אתה לא רוצה 123Sam ל להיות קלט חוקי על ידי משתמש. זה לא באמת int. אז זה לא נראה הוגן כדי לנתח אותו כint. על אישור. במקרה זה, בוא מהלך של לאינטרנט. אז HTTP הוא לא שפה. HTTP הוא רק האוסף של תקנים ל איך אתה שולח דברים מלקוחות, זה אתה, לשרתים. זה אנשים אחרים באינטרנט. אז עומד HTTP עבור Hypertext העבר את הפרוטוקול. זה הלב והנשמה של האינטרנט כולו. חלק היפרטקסט רק מתייחס ל-HTML. ההעברה היא לקוחות כמו תוכל לשלוח בקשות ל שרתים, אשר נותנים תשובות. והפרוטוקול הוא פשוט, איך לעשות אתה מצפה שרת להתנהג? ואיך אתה אמור להתנהג כזאת שאתה יכול לייעל את זה תהליך תקשורת? אז בקשות HTTP נראות הרבה כמו זה. מקבל הוא הסוג של בקשה. אתם ראיתם בקשות GET ובקשות POST. כי דבר שני שיש, / לי, זה רק URI או את כתובת האתר שבו אתה רוצה ללכת בתוך הפונדקאי. אז בקשה זו מבקשת דף, כמו www.facebook.com /. וזה בקשת GET. ולאחר מכן HTTP/1.1 זה, זה פשוט הגרסה של HTTP אתה משתמש. זה כמעט תמיד 1.1. ויש גם את חבורה דברים אחרים יותר מדי. אתה ממש יכול לראות אלה אם אתה לפתוח את הקונסולה שלך כשאתה גלישה באינטרנט. תגובות נראות משהו יותר כמו זה. החלק העליון הוא, שוב, סוג של HTTP אתה משתמש ואחריו קוד מצב. אז 200 אישור הוא הכל הסתדר. הנה התוכן שלך. התוכן שלך הולך אחריו. ואז הוא יגיד לך איזה סוג של תוכן וגם דברים אחרים. קודי המצב, יש כמה חשובים אלה שאתה צריך לדעת. 200 אישור הוא כמו הזהב של כל דבר. הכל עובד. 403 אסורים. זה בטח ראה אם ​​שכח לchmod משהו כמו שצריך. זה אומר שאין לך את ההרשאות המתאימות גישה שעל השרת. זה כמו, לא, אתה לא יכול לראות את זה. 404 פירוש הדבר שאינו קיימים. לא נמצא. בטח כבר ראה את זה הרבה. 500 שגיאת שרת פנימית היא בדרך כלל כמו משהו השתבש בצד של השרת. לכן, כאשר אתה מיישם pset7, אם היה לך שגיאות PHP, אתה יכול בעצם לעבור לדף ותראה כל מיני דברים שגיאת PHP. אבל זה בדרך כלל לא קורה, כי אתרים לא באמת רוצים לך למה האתר שלהם נשבר. הם כנראה פשוט לחזור 500 שגיאת שרת פנימית. ואז יש 418 אני קומקום תה. יש סיפור שלם על מדוע זה דבר. אבל אתה יכול לקרוא על זה על הזמן שלך. יש חבורה שלמה קודי מצב אחרים. אבל אלה הם אלה אתה צריך לדעת. אז בואו נדבר על ה-HTML. HTML, יש לזכור, אינו שפת תכנות. זה שפת סימון. כלומר, זה מתאר את התוכן. זה אומר לך את מה שנראה מסמך HTML כמו או לא מה שזה נראה אבל איך זה מובנה. אז זה מגדיר את מבנה ואת סמנטיקה של דפי אינטרנט. זה כמו, זה פסק. זה ברשימה מסודרת. זה כמו קטע בדף שלי. הנה הכותרת. הוא עושה דברים כאלה. זה לא סגנון של כל זה, כי זה מה שאתה עושה ב-CSS. וזה נראה כמו סדרה תגים של מקוננים. אז להשתמש בדוגמה של ממש בסיסי דף ה-HTML, יש לך DOCTYPE הכרזה שם למעלה. הצהרת DOCTYPE זה אומר, אנחנו משתמשים HTML5. ואז יש לך את תג ה-HTML הגדול. הוא מכיל בראש ובגוף. בתוך הראש, יש לך את הכותרת. זה מה שהולך בכותרת סרגל של הדפדפן שלך. יש לנו קישור תג שמקשר בגיליון סגנונות חיצוני. ואז יש לנו תסריט שמושך מJavaScript חיצוני גם כן. ואז בתוך הגוף שלנו הוא למעשה מה מקבל המוצג בדף. יש לנו סעיף ולאחר מכן תמונה בתוך פסקה זו. זה אחד הוא תמונה של גורי חתולים. שימו לב שהתמונה תג סוגר את עצמו. אז במקום לפתוח עם תמונה ולאחר מכן עושה עוד / תמונה, אתה רק צריך לוכסן הקטן הזה כאן, מה שסוגר אותו. ותג התמונה יש גם מפתח זה תכונת ערך שנקראת alt. זה הטקסט החלופי ש קורה כאשר אתה מרחף מעליו. רוב האלמנטים של HTML כמה ערך מפתח דברים שאתה יכול לתת לו, שונים התאמה אישית. כן. קהל: [לא ברור]. אנג'לה LI: טוב, אז זה תכונה של התג. אז אם אתה היה באמצעות jQuery, אתה יכול לעשות image.getAttribute בחר. ואז אתה יכול לחפש את לקבל את מאפיין alt. וזה ייתן לך גורים. אם אתה זוכר טפסים ב-HTML, קלט אלמנטים יהיו שם תכונות. וזה מה שPHP משתמש לשלוח בקשות כאשר טופס נשלח. קהל: האם אתה מזכיר משהו על איך אם אתה משתמש kittens.jpg או משהו שיש חסר להגיש קבצים אחרים או תיקיות? אנג'לה LI: כן. אז זה מה שנקרא יחסי נתיב, כי אני לא נותן שלך את הנתיב המלא. זה כמו כשבC אם אתה עושה fopen כמה קובץ, אם אתה hi.txt fopen, כי hi.txt צפוי להיות באותה ספרייה, אלא אם כן אתה נותן לו יותר דרך מורכבת. קהל: אז אתה יכול לציין באיזו תיקייה [לא ברור]? אנג'לה LI: כן. ואתה יכול להסתכל למעלה איך לעשות את זה. אבל אם אני רוצה לקבל את kittens.jpg של המדריך להורה, הייתי עושה .. / Kittens.jpg. כן. סליחה. כן. אה גבר, שכחתי את השאלה. מה הייתה השאלה? אה, השאלה הייתה הוא, kittens.jpg צפוי להיות באותה הספרייה? ובמקרה הזה, זה הוא. אבל אתה גם יכול לתת לו בדרך מסוימת כך שזה לא צריך להיות. טוב? ב-CSS. אז CSS, כמו HTML, אינו שפת תכנות. CSS הוא רק סדרה של כללי הסטיילינג. מייצג גיליונות סגנון מדורג זה. ואתה משתמש בו בשיתוף עם ה-HTML לדפי סגנון. אז יש שלוש דרכים אתה יכול לכלול אותו. דרך אחת אתה יכול לעשות את זה היא בראש חלק של ה-HTML שלך, אתה רק יכול לפתוח תג בסגנון ולאחר מכן מקל כמה CSS שולט שם. זה די בסדר. כן. קהל: האם אתה יכול לשים אותם תגי סגנון שביניהם, בואו למשל, גוף ו / גוף. ואז אתה יהיה סטיילינג רק בגוף. אנג'לה LI: אתה יכול. זה יעבוד. אבל אתה לא צריך, כי הסטיילינג הוא סוג של מטה שצריכה ללכת ב ראש המסמך. גוף באמת צריך להכיל רק מה בעצם הולך להופיע בדף שלך. קהל: אז אתה הייתי שם בסגנון בראש שלך לסגנון דף האינטרנט כולו, נכון? אנג'לה LI: כן. כדי לשים את הסגנון כאן, כללים אלה CSS יחול על כל הדף המבוסס על הבוררים שלהם. לכן הדרך טובה יותר לעשות את זה היא במקום שיש לו תג בסגנון בראש שלך, יש לך קישור זה לסגנון חיצוני גיליון כמו שהראיתי לך ב דוגמא קודמת. מה שזה עושה הוא שהוא מנסה ומוצא קובץ style.css ולאחר מכן מושך אותו ובמשתמש בזה כ סגנונות עבור הדף. וstyle.css שלך היה רק נראה ככה. זה יהיה חבורה של CSS פשוט. ולבסוף, יש דרך אחרת שאתה יכול לכלול CSS, שבו אתה באמת לא צריך לעשות אי פעם. זה סגנון מוטבע שיחה. וכך כל אלמנט HTML יכול גם לקחת תכונת סגנון. ולאחר מכן בכך שתכונת הסגנון, אתה יכול לתת לו כללי ה-CSS. אז במקרה הזה, כל מה שאני div הגדרה כאן, זה הולך יש להם רקע שחור ו צבע טקסט לבן. אבל אתה לא צריך לעשות את זה, כי מה המשמעות של זה הוא שזה מעמיד את הסטיילינג שלך בתוך ה-HTML שלך. ואני יודע שאנחנו כבר מדברים על HTML הוא מבנה ו-CSS הוא סגנון. אם תעשה זאת, הוא מתערבב אותם יחד. וזה לא מאוד נקי. אז אל תעשה את זה. שימוש בדוגמה של CSS, שם למעלה, אנחנו פשוט בחר את הגוף של ה-HTML סרט תיעודי. ואנחנו כמו, הכל הולך להיות Sans קומיקס. אני גם לא ממליץ על זה. אבל אתה יכול לעשות את זה. הכלל השני כאן, זה הולך כדי לבחור את האלמנט על דף עם עיקרי זהות. אז מה ה-HTML אלמנט, אמרתי זהות = עיקרי, אני הולך לתת לי כי מרווח 20 פיקסל וליישר את הכל, כל הטקסט, למרכז. הדבר האחרון שבוחר על פי מעמד CSS. אז כל אלמנט בעמוד שנתתי כיתת קטע, אני הולך לעשות את זה צבע רקע של אור כחול. כן. זה כל מה שיש לי. שאלה? קהל: מה עושה hashtag לפני עיקרי לעשות? אנג'לה LI: השאלה היא, מה עושה hashtag לפני המטלות עיקריות? במקרה זה, החשיש ב CSS פירוש בחר לפי תעודת זהות. אז אם היה לי כמה רכיב HTML, כמו = בוחר divid עיקרי, CSS זה כלל הדבר עיקרי בזהות. ובאופן דומה, בתקופה שלפני סעיף הוא בחר על פי מעמד CSS או בחר על פי מעמד ה-HTML. קהל: מדוע יש לך עד היום 6 בצבע רקע? אנג'לה LI: כן. אז השאלה היא, מדוע יש חשיש לפני 6? זה שונה מאשר חשיש ש. משמעות דבר היא כי אתה נותן צבע הקסדצימלי. צבעים אז hex, זה פשוט מייצג צבע. ואתה זוכר את משולשים RGB כאשר עשית pset זיהוי פלילי? זה דומה. שתי הספרות הראשונות מייצגות כמה אדום הוא בצבע. השניים מייצגים כמה ירוק. והשלישי מייצג כמה כחול. והחשיש הוא זה הולך לייצג את צבע. אז כל דבר מ0, 0, 0, 0, 0, 0 עד F, F, F, F, F, F הוא תקף. זה קצת צבע שיכול חוקי להיות מוצג על ידי הדפדפן שלך. שאלה? קהל: מה ההבדל בין שימוש לפי תעודת זהות ועל ידי כיתה? אנג'לה LI: השאלה היא מה ההבדל בין שימוש לפי תעודת זהות ומעמד? אתה יכול להיות רק מרכיב אחד ב מסמך ה-HTML שיש לו זהות מסוימת. דבר אחד, כך שרק בדף שלי מותר לי עיקרי זהות. אז אתה משתמש בו לכך הוא הכותרת. זה הניווט. זה תחתונה. חוגים שונים, כי אתה יכול חלים שיעורים לכמה שיותר אלמנטים של HTML כמו שאתה רוצה. כך למשל, עשיתי את הקטע בכיתה, בגלל שיש כנראה יותר מאחד סעיף בדף שלי. אתה פשוט אפשר לי רב אלמנטים בעמוד עם אותו כיתה אבל רק אחד עם זהות מסוימת. קהל: אז הנקודה מייצגת בכיתה? אנג'לה LI: כן. נקודה מייצגת כיתה. מגניב. זה כל מה שיש לי, חבר 'ה. תודה. [מחיאות כפות] ZAMYLA צ'אן: היי, כולם. אני Zamyla. אני הולך להיות כיסוי PHP, MVC, ו-SQL היום. הרבה חומר שאני אהיה כיסוי הולך להיות פחות או יותר היישר מpset7. בסדר. אז מה זה PHP? PHP הוא הקיצור של PHP Hypertext Preprocessor. אז זה, בפני עצמו, הוא רקורסיבית שם, וזה די מגניב. PHP היא שפת scripting בצד השרת, והוא מספק את backend והיסודות הלוגיים באתר שלנו. אז אנג'לה דיברה הרבה על ה-HTML ו-CSS שיהפוך את המבנה של האתר. אבל מה אם אתה רוצה לשנות את זה תוכן דינמי או אם זה משתנה המבוסס על המשתמש או בתנאים מסוימים? זה מקום שבי PHP נכנס עכשיו, בדרך כלל, PHP עלול לקחת כמה פחות קווים ליישם את אותו הדבר ב C. זה בגלל PHP מטפל בזיכרון ניהול עבור המתכנת, בניגוד אלינו שיש לmalloc ללא תשלום, כל מיני דברים כאלה. אבל מאז PHP היא פרשנית שפה, בדרך כלל, זה יכול לבצע קצת לאט יותר מאשר C, ה היא שפת הידור. מכיוון שאנחנו עוברים בתכנות שפות, בואו נסתכל על איך תחביר יהיה שונה. בואו להיות זהיר מאוד שלא להתבלבל עם זה. אז עם תחביר PHP, אם אתה הטבעת PHP שלך בתוך ה-HTML קובץ או בתוך קובץ PHP. עצמו, אתה צריך לתחום את הקוד בפתוח PHP ואת תגי PHP הסגורים כמו להלן, כמו על המסך. משתנים ב-PHP. כל משתנה אחד יתחיל עם $ הסימן ואחריו את שמו של המשתנה שלך. עכשיו, משתנה ב-PHP מוקלדים באופן רופף, מה שאומר שאתה לא צריך כדי לציין מה סוג הנתונים הוא כשאתה מצהיר על זה. עם זאת, זה לא אומר שהם אין לי שום סוגים בכלל. אז אם אני מצהיר משתנה ופשוט להגדיר זה שווה ל 1, ולאחר מכן אני מצהיר משתנה אחר, להגדיר אותו שווה ל "1", ואז עוד אחד 1.0, טוב, תלוי בסוג של שוויון מפעילים אני משתמש, אם אני רוצה להשוות בכל הסוגים, ולאחר מכן הם יהיו שווים. אבל אם אני רוצה לוודא כי סוגים שווים, PHP עדיין יכול לעשות זאת, למרות שאנחנו לא מצביעים איזה סוג זה הוא כאשר אנחנו ראשון לעשות את הקובץ. עכשיו, ב-PHP, למרות שאנחנו מעבר מעל מתכנות שפות מC, עדיין יש לנו שלנו אמין אם מצב, בדיוק כמו זה. עדיין יש לנו הלולאות בזמננו, רק כמו זה, שבו אתה מכניס מצב ולאחר מכן גוף של הלולאה. ולאחר מכן יש לנו גם שלנו ללולאה, אשר בדרך כלל נראה כך. אז אם אני רוצה לחזר על כל תשע psets ולהגיש ולהתקשר submitPset פונקציה, ואז אני יכול לעשות את זה כאן, שאתם כולם על ידי נקודה זו. מזל טוב, דרך אגב. למצלמה, אנשים אמר, תודה לך. עכשיו, אם אתה לא רוצה רק כדי להשתמש בזה ללולאה, ואז PHP למעשה גם יש דברים שנקראים לולאות foreach. אז אם יש לי מערך של מספרים שלמים, 0 דרך 8, מאוחסן בpsets המערך, אז יש לי יכולים לולאת foreach כי סובב מעל כל מספר בpsets. ואז אני יכול לקרוא את אותו לתפקד שמונה פעמים, בדיוק כמו שעשיתי בעבר. אז זה עבור כל לולאה הוא נחמד, כי אין לך אם אתה לא יודע האורך של המערך המדויק שאתה יש, ולאחר מכן באמצעות foreach לולאה זו ידאג לזה בשבילך. אז עשיתי psets כמערך. בואו נסתכל על זה. מערכים ב-PHP הם בדרך כלל זהים אלה שהיו לנו ב-C, שבו אתה יכול להצהיר על מערך. וכאן, אני יכול להצהיר על מערך ריק ולאחר מכן לבנות באופן דינמי באמצעות מדדים כמספרים שלמים. אז מדד 0, אני הולך לחנות שלם בשם 1. במדד 1 מתוך הרשימה שלי, אני הולך כדי לאחסן את הערך 2. ובמדד אך השלישי מספר שני, אני הולך לאחסן את המספר 12. עכשיו, זה בסדר גמור שב עובד זה עובד טוב. אבל אומר שזה חשוב לי מה כל מדד מחזיק. בשבילי, מדד 0 פירושו איך חתולים רבים שיש לי. ומדד 1 פירושו איך ינשופים רבים שיש לי. והבא אומר כלבים כמה. טוב, אז זה כדי לציין שבמקום יש לזכור 0 מתייחסים ל חתולים ו1 לינשופים, אני יכולים להשתמש מערכים אסוציאטיביים, כלומר במקום מספרים שלמים כמדדים שלי, אני ממש יכול להשתמש במחרוזות. אז זה די שימושי. ויש לך בעצם רק החליף המספרים השלמים עם מחרוזות. ויש לך את מערך אסוציאטיבי. כן. קהל: האם יש סיבה לכך שיש קו תחתון לשני חלק, משום שהרשימה שלי יש לו את המערך. ZAMYLA צ'אן: השאלה הייתה, הוא יש סיבה לכך שיש מדגיש בין והרשימה שלי? לא. זה בדיוק איך אני מגדיר את משתנה. קהל: ביום הראשון קו, שזה מילה אחת. ZAMYLA צ'אן: אני מתנצל. אני אסדר את זה. כן. הם צריכים להיות באותו השם משתנה. לתפוס טוב. על אישור. אז בואו נעבור למחרוזת שרשור. אם אני רוצה לקחת את שתי מחרוזות, אז אני יכול לשרשר אותם עם מפעיל הנקודה. אז אם יש לי מילוא כהשם פרטי ובננה כמו שם משפחה, ולאחר מכן שרשור עם המפעיל והנקודה לאחר מכן לשים את החלל שביניהם יהפוך את מחרוזת המכילה מילוא בננה, אשר אז יכול להדהד או, ולא, להדפיס. אם כבר מדברים על הד, בואו נדבר על כמה שימושי - אופס. אני מצטער. כמה פונקציות PHP שימושיות. אז יש לנו - קשיים טכניים. שנייה אחת. אני שלחתי אותו. בעיות ב-PowerPoint. ואנחנו שוב עם פונקציות PHP. ואנחנו שוב עם פונקציות PHP. אז יש לנו דורשים פונקציה, שבו אם אתה עובר בקובץ, הנה הוא רק דוגמא של קובץ ש אני עלול לעבור פנימה ואז שיכלול את קוד PHP מאותו הקובץ שאני מצביע. וזה יהיה להעריך שבי ואז יש לנו גם הד, אשר הוא מקביל לprintf. יציאה היא במקביל להפסקה, שיוצא מהבלוק של קוד שאתה נמצא בו ולאחר מכן בדיקות ריקות אם ניתנו משתנה הוא כמו ריק או אפס או כל מה שהשווה עם להיות ריק. כן. קהל: לשרשור המחרוזת מפעיל נקודה אחת, ב-PHP, הוא כי אותו דבר כמו ב-JavaScript שבו הוא משתמש הנקודה לשרשור פירושו תוספת? אז לשם מלאים, יכול להיות לך דולר סימן + ראשון ולאחר מכן + מעמד? ZAMYLA צ'אן: כן. אז השאלה הייתה האם ב-PHP אנחנו ניתן להשתמש באותו שרשור המחרוזת כמו בJavaScript עם הפלוסים. ויוסף יקבל את זה מאוחר יותר. אני חושב שיש לו להחליק על זה. למעשה, זה שונה. אז ב-JavaScript, אתה צריך להשתמש בתוספת לשרשור מחרוזות. וב-PHP, שיש לך השתמש באופרטור הנקודה. אז הם שונים. על אישור. אז עכשיו שאנחנו כבר כיסינו את כל PHP זה, שבו עושה את זה באמת שימושי? ובכן, מדובר בהישג יד כאשר אנו ניתן לשלב את זה עם ה-HTML שלנו. אז PHP שלנו ייתן לנו את הכוח לשנות את תוכן ה-HTML של דף לפני הטעינה שלה. כך שבהתבסס על תנאים שונים, בדרך כלל המשתמש הספציפי זה מחובר, אנחנו יכולים להציג מידע שונה. לינדה, האם יש לך שאלה? קהל: אתה יכול לשרשר שלם גם? ZAMYLA צ'אן: כן, אתה יכול. אז השאלה הייתה אם אתה יכול לשרשר מספרים שלמים או אחרים variable.s עכשיו, אנחנו עוברים לMVC, אשר היא הפרדיגמה שהשתמשנו ב pset7 והרבה מעצבי אינטרנט להשתמש עבור ארגון הקוד בקבצים באתר האינטרנט שלהם. M עומד על דגם. ובעצם, קבצי מודל יעסקו עם אינטראקציות עם מסד הנתונים. הצג את הקבצים, הם מתייחסים ל אסתטיקה של האתר. וידיות בקר בקשות משתמשים, מנתח הנתונים, עושה היגיון אחר. בpset7, אנחנו בשילוב המודל והבקר. ואנחנו רק קראנו להם בקרים ו לשים אותם בספרייה הציבורית. וקבצי התצוגה, אנחנו משתמשים בם כ תבניות בספריית התבניות. אז תרשים זה כאן גם מייצג שאותו סוג של חלוקה עם מודל ואת הבקר בצבע סגול כאן בצד השמאל ו התצוגה בצד הימין. אז זה סכמטית שכמה מכם יכול להיות שראה בשעות או Office דיאגרמות שאנחנו ציור כמו שאתה ניסיתי להבין pset שלך. אז הנה, בבקר נתון, מודל בקר, יש לנו פונקציות הנוגעים לביצוע שאילתות SQL מסד הנתונים, ביצוע היגיון PHP. אולי היית מסתכל למעלה מניות ב-Yahoo! האוצר. או אולי, היית לבדוק רק כדי לראות אם משתמש שהגיש יוצר כבר לפני שיש ביקר בדף שלך. ואז אתה תהפוך יוצר כאן. אחרי הטופס שהוגש על ידי המשתמש, הפעולה שהייתה צוין בתג ה-HTML של הטופס מצביע על כך שהדף שהוא היה מחזיר את הנתונים ל. אז כל מידע שיהיה נשלח בחזרה לבקר שלך. אז אתה כנראה הייתי עושה קצת יותר היגיון ושבאולי לבצע כמה יותר שאילתות בבסיס נתוני SQL ו אז, סוף סוף, לבוא עם יפה סט ארוז של מידע שהיית לעבור בלתוך תבנית כלשהי אחרת שמוצג במידע זה. עכשיו, איך שאנחנו באמת לארוז כי מידע למעלה? ובכן, יש לנו פונקציה שנקראת לדקלם זה היה בקובץ functions.php ב pset7, שבו אתה עובר בשם קובץ, את השם של תבנית. ואז אתה גם עובר ב מערך אסוציאטיבי. וכדי שהמערך אסוציאטיבי מייצג המידע שונה כי אתה רוצה להעביר פנימה עכשיו, מה הולך להיות קבוע ב דוגמאות אלה היא כי המפתחות או, ליתר דיוק, את המפתחות של אסוציאטיבי מערכים, אלה הם מה הולך להיות צפוי להיות קבוע על ידי התבנית, משום שהוא יודע שהוא צריך משהו שנקרא הודעה או קרא בשמה. ואז הדברים בצד הימין, ערכים בפועל, ולכן במקרה זה, מי ילד טוב ומילוא, אלה הולכים להיות הערכים שמשתנים כי הבקר משתנה בכל פעם או על בסיס מצב מסוים ו יעבור שבו אז הנה בתבניות, אנו רואים שאנו משתמשים בתווים מיוחדים של HTML, אשר רק בעצם אומר שאנחנו רוצים כדי לקבל את מחרוזת שהעמיתים משתמשים מכניסים פנימה ואנחנו רוצים להחליף הודעה לשם. אז כאשר אנו למעשה להציג את הקובץ, ספציפי מידע מועבר פנימה שים לב שהמפתח כיצד לעבד יצירות הוא שהמפתחות של אסוציאטיבי מערכים, משתנה להיות אלה שמות כאן. וכן הערכים של מפתח שב מערך אסוציאטיבי ואז הופך ערך של המשתנה. עכשיו, בואו נעבור לSQL. זה עומד על מובנה שפת שאילתות. ואז זה רק תכנות שפה נועדה לניהול מסדי נתונים. וזה הגיע שימושי עבורנו ב אתר הפיננסים pset7 שלנו. בעיקרו של דבר, זה פשוט דרך קלה לעקוב ולנהל את אובייקטים ושולחנות ולקשר אותם זה לזה. עכשיו, לחשוב על מסד הנתונים SQL שלך בעצם כקובץ Excel, אולי, עם סדינים עם לשוניות מרובים. אז אתה יכול להיות מספר רב של שולחנות, אולי, שמקושר אחד לשני. ועוד הרבה כמו Excel, יש לנו הרבה פונקציונלי שאנחנו רוצים. לדוגמא, אנחנו יכולים לבחור שורות מסוימות. אנחנו יכולים להוסיף מידע. אנחנו יכולים לעדכן את השורות. ואנחנו גם יכולים למחוק את הדברים. SQL לבחור יצירות על ידי בחירת שורות או שורת עמודים שצוינו מסד הנתונים תואמים מסוים קריטריונים שאתה מציין. אז לכאן כשאני רואה בחר * מ קוסמים שבו בית = רייבנקלו, ולאחר מכן אני בחירה *, מה שאומר שאני בחירה כל עמודה שב שורה משולחן הקוסמים אבל רק אם טור הבית שווה רייבנקלו. עכשיו, זה טהור או SQL. אז אם אני נכנסתי לphpMyAdmin, שהוא דרך מסוימת שאנו משתמשים כדי לנהל מסדי נתונים של SQL שלנו, אז אני יכול להכניס כי לאתר האינטרנט של phpMyAdmin. וזה יהיה ביצוע. אבל אנחנו באמת רוצים לעשות כי בצד ה-PHP. אז איך אנחנו עושים את זה? ובכן, אנו משתמשים בפונקצית השאילתה, אשר בעצם מבצעת ששאילתא SQL. משתמש? כמציין מיקום, אנחנו יכולים לעבור במסוימים ערכים למחרוזת שלנו שאנחנו רוצה להחליף. אז אולי אני אחסון שונה ערכים בcurr_house, אשר מייצג את הבית הנוכחי שאני עובר. אז אני יכול להעביר שכבמציין מיקום עם סימן השאלה. ואז אני בעצם לבצע את אותו דבר כמו שעשיתי בעבר, למעט עכשיו, אני ב-PHP. ושאילתא תחזיר מערך אסוציאטיבי. ואני הולך לאחסן אותו בשורות. עכשיו, שאילתה תמיד יכולה להיכשל. אולי שאילתת SQL לא יוכל לבצע כי השולחן לא היה קיים. או אולי, הטור לא היה קיים. משהו השתבש. ובכן, במקרה זה, אתה רוצה לעשות בטוח שאתה לבדוק אם השאילתה חזרו שווא. וזה על ידי שימוש במשולש שווה פעולה שם. ואז אני מתנצל, וזה עוד פונקצית CS50, עוברת בהודעה. ואם אתה מסתכל לתוך להתנצל, כל זה באמת עושה הוא לדקלם apology.php. כן. קהל: האם אתה יכול להסביר מה זה כוכב עושה בין נבחרים ומ? ZAMYLA צ'אן: כן, בהחלט. אז את הכוכב שבבין נבחרת ומן פירוש הדבר כי אני רוצה לבחור את כל שורה שלמה מהשולחן שלי. אני יכול כבר צוין בחר שם, שנה, בית. ואני אקבל את שלושה אלה בלבד עמודות בטבלה שלי. אבל אם אני אומר * בחר, אז אני לקבל הכל באותה עמודה. ואז אני הולך ללכת לך בחלק האחורי הראשון. קהל: אז זה עדיין ב-SQL, נכון? האם שאילתה זו או זה PHP זה? ZAMYLA צ'אן: אנחנו בשאילתא. אז זה ב-PHP. זאת באמצעות שאילתת פונקצית PHP, אנחנו ביצוע שאילתת SQL. קהל: האם כל דבר ב-SQL מקרה רגיש, כמו לבחור או קוסמים או בבית? ZAMYLA צ'אן: האם כל דבר ב-SQL מקרה רגיש? אני מאמין שכן, כן. אני מאמין כי כך בחר מ ואיפה הם תלויים רישיות. לא? ROB אודן: אז, זה הפוך. שמות העמודות ואמצעי השולחן, כל אלה הם תלויים רישיות. אבל כל אחת ממילות המפתח של MySQL, כמו לבחור,, והיכן, אלה הם לא מקרה רגיש. על אישור. אז ההפך ממה שאמרתי. אז את כל מילות המפתח MySQL - בחר, מ, שבו - אלו אינם תלוי רישיות. אבל כל דבר אחר הוא. על אישור. אתה בחלק הקדמי. קהל: אם יש לי $ שורות במונחים של יותר משורה אחת, האם זה אומר שהיא פשוט הופך להיות מערך אסוציאטיבי? ZAMYLA צ'אן: אז השאלה הייתה אם שורות יש יותר משורה אחת בו, אין זה הפך למערך אסוציאטיבי? אז זה הוא מערך של אסוציאטיבי מערכים כבר. אז גם אם יש רק שורה אחת חזרתי, אז היית צריך ללכת ל מדד 0 של התוצאה. ואז היית צריך שהשורה ראשונה. כן, בלינדה? קהל: כשאתה משתמש ב===, זה המקרה היחיד? או שיש לאחרים? ZAMYLA צ'אן: אז במקרה הזה, === הוא השוואה בין סוגים. סליחה. === היא השוואה שמשווה את הסוגים. ולאחר מכן == משווה בין כל הסוגים. קהל: אתה יכול להסביר מה שורות היא במצב הזה? האם זה בשורה של נתונים? ZAMYLA צ'אן: בשקופית הבאה, אני הולך להסביר מה הוא שורות. אז אם לא אכפת לך מחזיק הנחה על זה. ואז אתה בחלק האחורי? קהל: לפונקציות כמו שאילתה, להבהיר ולהתנצל [לא ברור]? ZAMYLA צ'אן: השאלה הייתה האם פונקציות אלה - השאילתה, להתנצל, ולהבהיר - הם נפוצים ברחבי ה-PHP. אלה הם אלה שCS50 כתבתי לpset7. וג'יי? קהל: כאשר אתה צריך לומר _SESSION $, הוא שרק לתעודות זהות? או אפשר שיש לך אמר את זה כאן? ZAMYLA צ'אן: אז השאלה הייתה, כאשר אנו משתמשים _SESSION $, שהיה המבוקש משתנה הגלובלי שבו אנו משתמשים. כאן משתנים זה הולך להיות מקומי לתפקוד שלנו. אז אנחנו רק מכריזים משתנה חדש. קהל: איך הוא מתנצל מיושם? ZAMYLA צ'אן: השאלה הייתה, איך הוא להתנצל מיושם? ואני חושב שזה דווקא די אימון טוב בשבילכם להיכנס סעיף functions.php ומסתכלים על מתנצל ולראות איך אתה יכול להיות עשיתי את זה בעצמך. אז אני יכול להשאיר לך את זה, אבל רק אומר שאם אתה מסתכל על להתנצל, אז זה לוקח את המסר שאתה הוגש להתנצל, ואז זה הופך את המסר הזה. עוד שאלות? אני אוהב שאלות. אז לשמור אותם הקרובים. קהל: [לא ברור] הד או להדפיס לשם? ZAMYLA צ'אן: השאלה הייתה, אנחנו יכולים לא רק יש לשים הד או להדפיס לשם. אז זה היה עושה משהו שונה במקצת. זה היה מודפס שאילתה נכשל בזה - כן, ממש עכשיו, אנחנו בעצם בבקר שלנו. אז לא ממש יש לנו HTML להגדיר כאן. מתנצל על ידי טיוח apologize.php מפנה אותך דווקא לapology.php. על אישור. אז עכשיו, בואו נלך על כדי לטפל שאלה מקודם על מה באמת שורות. ובכן, שאילתה תחזיר מערך של שורות. וכל שורה מיוצגת על ידי מערך אסוציאטיבי. אז אם אני כבר ביצע כמה שאילתה ו-SQL אני כבר מאוחסן התוצאה בשורות, ולאחר מכן באמצעות לולאת foreach, ולאחר מכן את המערך שם הוא הראשון יש אחד - השורות. ולאחר מכן אני הולך לקרוא כל שורה בשורה $ שם. אז iterating על זה, אז אני יכול גישה של השורה קבלה את שם טור, טור שנה, ועמודה בית. שים לב שאני לא היה מסוגל לעשות את זה עם שורות, כי מדד שורות שם לא קיימים. שורות היא רק מערך של מערכים אסוציאטיביים. אז יש לך שתי רמות שם. ברגע שיש לך את המערך של שורות, יש לך להיכנס לזה. ואז אתה יכול לגשת לעמודים. האם זה עושה את זה ברור? כן, בחזית? קהל: [לא ברור] לפתוח בסוגריים עבור [לא ברור]? ZAMYLA CHAN: סלח לי? קהל: סוגריים הפתוחים. ZAMYLA צ'אן: אלה כאן? זה מאפשר לי כולל משתנה זה. כן. קהל: כאשר אתה מדפיס, אתה מדפיס את קוד ה-HTML? ZAMYLA צ'אן: כן. כאשר אני מדפיס, זה כאן הוא בתוך התבנית שלי עכשיו, אז המבט שלי של שיטת MVC. אז אני מדפיס לתוך ה-HTML. קהל: אז אם נכנסנו למפתחים כלים לאחר ההפעלה זו, שיכולנו כי בעצם בקוד? ZAMYLA צ'אן: זה נהדר שאלה, כן. כך שאם אתה נכנס לכלי הפיתוח ב-Firefox באמצעות Firebug או כרום, אז כן, אתה יכול לראות את ה-HTML הספציפי. כדי שלא להראות שורת $ ["שם"]. זה יראה לפי שם הוא באותה שורה. קהל: רק נושא כללי, מה tr וTD מוגדר כ? למה לנו [לא ברור]? ZAMYLA צ'אן: TR שורת טבלה, שולחן אז TD עמודה. על אישור. קהל: כן, זה נתוני טבלה. ZAMYLA צ'אן: נתוני טבלה. כן. קהל: זה שורה שבה הוא מטופל כמו עמודת שורה? ZAMYLA צ'אן: מצטער. האם אתה יכול לחזור על זה? קהל: איך היית לדמיין שורות? ZAMYLA צ'אן: איך היית לדמיין שורות באיזה סוג של דרך? אתה מדבר על אלה שורות כאן או שורות TR? קהל: השורות. ZAMYLA צ'אן: שורות אלו כאן? הייתי לדמיין את זה כ אני מבצע השאילתה שלי. וזה אומר, בסדר, יש לי גם 0 עד n כמות השורות התואמות את הקריטריונים שיש לך שאילתה. אז יש לי כמה מספר השורות. אז שורות, שורות $, חנויות כל אחד מאותם שורות במערך. אז גם אם זה רק אחד מהם, זה עדיין מערך של שורות התואמות את זה. אז, למשל, זה הוא דומה כאשר אתה הביא המטמון ממשתמשים. והקריטריונים לא היו שם מזהה שווה מזהה הפעלה. יש באמת רק היא שורה אחת שיכול להתאים לזה. אבל עדיין שורות פשוט חזרו לשורה אחת. אז היית צריך ללכת לשורות, מדד 0, מטמון אינדקס למעשה להגיע למטמון שלך. קהל: האם פונקצית ההדפסה בהד את אותו הדבר? ZAMYLA צ'אן: כן. כן. הדפס הד של אותו. קהל: האם foreach הלולאה רק דרך לאינדקס לתוך שורות? ZAMYLA צ'אן: האם לולאת foreach האופן שבו אתה יכול רק לחזר דרך שורות? לא. אתה יכול גם להשתמש בלולאה, ובלבד כי אתה יודע את האורך של המערך של השורה. קהל: האם אתה יכול לגשת אליו באמצעות שורה כמו [לא ברור]? ZAMYLA צ'אן: אז אתה לא יכול לגשת אליו רק באמצעות שורה אם אין לך foreach לולאה ובלבד ש אתה לא הכריז רציפות. כן. כן, בלבן. קהל: אז מה TR ו TD עושים? ZAMYLA צ'אן: אז TR ו TD הם תגי HTML. TR מציין את תחילתה של שורה בטבלה. וכל אחד td מציין עמודת נתונים חדשה שולחן. קהל: לראייה של מה שורה זה כמו, רק לדמיין SQL, איך יש להם בשורה. [לא ברור]. ZAMYLA צ'אן: כן. זו נקודה גדולה. אתה יכול לדמיין את השורות כמו סתם כמו בטבלת Excel, רק הרשימה של השורות. על אישור. בסדר. אז עכשיו שאנחנו כבר דברנו על בחירה, אם אין עוד שאלות, אנחנו לעבור על גבי להוסיף. אז אם אני רוצה להכניס לתוך כמה שולחן ולהכניס עמודה מסוימת ערכים, אני יכול להכניס את עצמי לרייבנקלו ב -7 שנה. אבל לפעמים אולי יש כפול ערכים, כפי שראינו בpset7 כש היו מעדכנים את תיק העבודות שלנו. אז במקרה הזה, אנחנו רוצים להשתמש ON DUPLICATE לעדכן את המפתח, כדי שלא לאחסן שורות מרובות עם אותו מעריך אלא לעדכן אותו. אז בעצם יש לנו עדכון, שלא להוסיף. זה פשוט עדכון שבו אתה מעדכן בטבלה מסוימת עם נתון קריטריונים ואז, סוף סוף, למחוק, שעושה דבר דומה מאוד. קהל: האם אתה יכול בקצרה לעבור על מפתח הכפול? ZAMYLA צ'אן: כן. בעיקרו של דבר כאן, יש לי INSERT INTO גרינגוטס, היא, אוניות, ערכים אלה. אבל זיהוי, ככל הנראה, הוא מפתח ייחודי להגדיר את הערך בטבלת MySQL. אז אם יש לי כבר להגדיר את הזהות ש, אז אני לא יכול להוסיף שורה חדשה. אז אם הוא לא קיים כבר, אז אני צריך לעדכן אותו. באמצע בלבן. קהל: אז הוספה, עדכון, מחיקה, ובחר, הם אלה כולם זמינים מקומי [לא ברור]? ZAMYLA צ'אן: אז להוסיף, עדכון, מחיקה ו בחר כל שאילתות SQL. בכל פעם אז אתה באמצעות SQL, יהיה לך אלה זמינים. קהל: חזרה לחידוני העבר - לא הייתה שאלה שעסקה ב אם היה לך שולחן ורציתי הכנס ציוני מבחנים באחד ואתה מכניס השם שלך, כך שהוא לא ייתן לך הציון במבחן [לא ברור] של החבר שלך. איך אתה הייתי עושה את זה עם הוספה? ZAMYLA צ'אן: אז השאלה הייתה על שאלת אמצע הקדנציה קודמת. אני לא מודע לאשר אחד שהוא עכשיו. אז אולי אחר כך, אם אתה רוצה לבוא ולהראות לי, אז אני יכול בהחלט לתת לך טיפים. אבל אם כבר מדבר על דברים הכנסה, כמו לוקח ציון של מישהו כשאתה לא צריך, בואו נדבר על התקפות הזרקת SQL. אז התקפת הזרקת SQL היא למעשה שבו מישהו לוקח יתרון של הביטחון הנמוך של דרך שאתה לוקח בנתונים. אז כאן, בדיוק כמו במימון CS50, כאשר אנחנו מחוברים, אנחנו יכולים להיכנס ב שם משתמש בטופס ההתחברות, תיבת הטקסט הראשונה, ו לאחר מכן להזין בסיסמא. אולי קוד PHP שלנו עשוי להיראות משהו כזה, את שם משתמש של $ שבו הוא שם המשתמש של הודעה הנתונים וסיסמא הוא סיסמא שלאחר הנתונים. ואז אנחנו פשוט לבצע השאילתה שלנו, למשל, בסדר, ובכן, השאילתה שלנו הולכת בחר מהמשתמשים שלנו, שבו שם המשתמש הוא אחד שהם הגישו. והסיסמה היא הסיסמה, כלומר, סיסמאות תואמות. עכשיו, מה אם במקום באמת הגשת סיסמא בפועל, כמו 12345 ומנחשים בשיניים שאומר סיסמא וניסיתי לפרוץ להם חשבון, מה אם במקום הם הגישו את זה. הם יכולים להקליד אולי ניחוש בסיסמא. ואז הם היינו מסיימים את ציטוט לאחר מכן הקלד באו 1 = 1. זה יהיה קצב ישירות לתוך SQL שאילתה לנראה משהו כזה. בחר ממשתמשים בו את שם המשתמש = שיניים וסיסמא שווה שושן או 1 = 1. אז או שיש הסיסמה להיות נכון או 1 = 1, וזה תמיד נכון. אז במקרה הזה, בעצם, יכולים משתמשים לנצל את זה ופשוט להיכנס את עצמם ובגרזן חשבונו של מישהו. אז בגלל זה אנחנו רוצים למנוע מישהו יצטרך לעשות את זה. אבל למזלנו, פונקצית השאילתה על ידי עובר במציינים ייקח תטפל בזה בשבילך. כמו כן, אתה בדרך כלל לא רוצה להגיש למעשה את סיסמאות את עצמם. בגלל זה אנחנו מרוסקים או מוצפנים שלהם במימון CS50. קהל: חידון העבר דיבר על מיתרי בריחת MySQL. האם אנחנו צריכים לדאוג לזה? ZAMYLA צ'אן: זו שאלה טובה. מחרוזות בריחת MySQL היא בהחלט פונקציה שהיה בשימוש בשאילתה שלנו. אבל בהחלט לבדוק את זה. אני הייתי אומר שזה משחק הוגן לדעת שהיית צריך לקרוא לזה לתפקד על חוט. כן, בלינדה? קהל: איך אתה יודע מתי זה גרשיים בודדים או במרכאות כפולות? וגם, אני מרגיש בהרצאה כמוך הזכיר משהו על כך שלא [לא ברור] או משהו או ציטוט הסינגל שני בסוף. אני חושב שהוא ציין בהרצאתו כי אתה אמור להיות גרש 1 ואז לא צריכים גרשיים או משהו. קהל: [לא ברור]. קהל: הדבר הוא הסינגל האחרון ציטוט שם שבתיבה השנייה לא צריך להיות שם. [לא ברור] כי כשאתה לוקח שעברת אחת לצטט את ולהתאים אותם לתוכן שם הסיסמה היא, אם יש לך את זה שאילתה, יש ציטוט אחד ב הסוף כבר. אתה רוצה להשתמש שבגרשיים כאחד שעומד בפני אחד [לא ברור]. אז מה זה בעצם בטקסט ה תיבה לא צריכה את זה. ZAMYLA צ'אן: אני ישנה את זה. על אישור. אם אין שאלות, אז אני להעביר אותו מעל ליוסף לדבר על JavaScript, וכולי. [מחיאות כפות] יוסף אונג: אז אנחנו פועלים קצת מאחור. אז אם אתה חייב לעזוב, זה בסדר. אבל אנו מבקשים שתורידו את הראשים אם אתה באמצע, כך שאתה לא לחסום את המצלמה ואתה משתמש היציאה חזרה אם יש לך. אני ג'וזף דרך אגב. היי. מבחן, מבחן. דן, האם זה טוב? מגניב. אז הווידאו יהיה גם פורסם באינטרנט עבור אלה ש צריך לעזוב עכשיו. מביך. על אישור. אז ביקורת חידון. זה חתול. עכשיו, JavaScript, שהוא אולי לא כאאווו עבור חלק מכם חבר 'ה. על אישור. אז זה ראשון, זוכר מZamyla. זכור כי PHP היא לרוץ על השרת. והרבה פעמים, אתם כתבו לולאות ב-PHP כדי להדפיס את ה-HTML, נכון? אז ברגע שהקוד שמבצע, כי פלט ה-HTML שאתה להדפיס מקבל נשלח למשתמש. וברגע שזה קורה, יכול לא יותר PHP לרוץ, אלא אם כן אתה לטעון מחדש את הדף, של כמובן, שreexecutes PHP. אבל ברגע שאתה להדפיס את ה-HTML ש, אתה לא יכול ללכת לשום מקום. אז ה-HTML שנשלחה אל המשתמש, שהוא הדפדפן כאן, שבו מילו באמצעות המחשב. וכל כך טוב, יש כמה דברים ברגע שאנו שולחים HTML למשתמש. לפעמים אנחנו רוצים לעשות משהו כמו כאשר אתה לוחץ על משהו, אנחנו רוצים תיבות התראה לצוץ, אלה מיני אינטראקציות, כמו בעת הלחיצה על מפתח, כאשר אתה לוחץ על משהו דף, אני רוצה שמשהו יקרה. ובכן, אתה לא יכול reexecute PHP קוד ה-HTML שפעם אחת מוגדרת. אז איך אתה עושה את זה? אנחנו מציגים את השפה חדשה בשם JavaScript, אשר פועל בדפדפן זה מאפשר לך לעשות דברים ל-HTML לאחר שתקבל את אותם מהשרת. וזו הסיבה שאנחנו קוראים לזה בצד לקוח שפת תכנות. זה עובד על המחשב שלך - הלקוח. כל שאלות על זה עד כה? הפרדיגמה שהגיונית לאנשים? על אישור. טוב. בסדר. אז הדבר הראשון שיש לשים לב הוא JavaScript היא לא PHP. יש להם כמה תחביר שונה, שנלך אליו. ויש להם שימושים שונים מאוד. JavaScript, שוב, לך דפדפן, עבור הלקוח. שרת פועל איפשהו על מישהו אחר מחשב ששולח מידע אליך, נכון? אז אם אנו מבקשים מכם לכתוב קוד PHP בבחינת שאלה, לא לכתוב JavaScript ולהיפך. אתה פשוט תאבד נקודות, וזה לא יהיה נכון. אז בואו להיכנס כמה הבדלי תחביר - JavaScript בצד השמאל ו-PHP בצד הימין. הדבר הראשון שתבחין עם JavaScript, להצהיר על משתנה עם מילת המפתח var - V--R. PHP משמש סימן הדולר, כZamyla דן קודם לכן. אם אתה רוצה להכריז אסוציאטיבי מערך, שאנחנו רואים את התחביר המוכר על בצד ימין עם PHP. בצד השמאל, במקום אתה משתמש בסוגריים מסולסלים. ולאחר מכן את המפתחות שלך הם בצד השמאל. אז יש לך מעי גס. ואז יש לך את הערכים שאתה רוצה. אז ככה היית עושה את זה ב-PHP בצד ימין עם שנייה כי קו שמתחיל במיל. וככה היית עושה את זה על בצד שמאל ב-JavaScript אם אתה רוצה מה שאנו מכנים אובייקט. ואובייקטים ב-JavaScript הם רק מערכים אסוציאטיביים. אז אם אתה רוצה לגשת לשדות, ב PHP אתה משתמש בתחביר סוגר זה. ודרך זו, אתה יכול להקצות מחדש שדה בעל זה ללורן. ובכן, ב-JavaScript, אם אחד רוצה לגשת לשדה ולשנות אותו, אתה יכול להשתמש בתחביר הנקודה. אתה יכול גם להשתמש בתחביר הסוגר. אבל אתה לא יכול להשתמש תחביר הנקודה ב-PHP. זה לא יעבוד. זה עובד רק ב-PHP. ולבסוף, כדי להדפיס דברים קונסולה, אתה משתמש console.log, אשר אתם משתמשים הרבה בpset8. אתה יכול console.log ש. אם אתה רוצה להדפיס מערך ב PHP, אתה צריך להשתמש r הדפסה. ובצד ימין, אתה רואה שאני חשיש שרשור מחרוזת שם. מישהו שאל קודם לכן. אני משתמש בתוספת ב-JavaScript. אם אני רוצה לשרשר משהו ב-PHP, אני משתמש בנקודה. אלה הם שונים. אם אתה כותב קוד PHP, לא משתמש בתוספת. אם אתה כותב JavaScript קוד, לא כותב נקודה. זה לא יהיה נכון. ואתה תהיה עצוב. הבדלים אז תחביר. יודע התחביר שלך, כי אם יש לך לכתוב שאלה ואתה משתמש בתחביר מהשפה הלא נכונה, זה לא יעבוד. וזה יהיה בסדר. אז בואו נדבר על שליטה מסוימת לזרום הבדלים, איך אתה משתמש לולאות בכל אחד מהם. Zamyla ניגש בצד ימין. דברים בצד ימין צריך להיות מוכר. בואו נסתכל בצד השמאל. כאשר אתה משתמש עבור n לולאה ב-JavaScript, משתנה לולאה, var שלך אני שם, לולאה את המפתחות של המערך. אז אתה רואה שם, בית, ותפקיד. אם אני console.log i, אני מקבל שם, בבית, ובתפקיד. אלה הם את המפתחות. ב-JavaScript, לולאת foreach הולכת על הערכים של המערך הזה. אז אתה שם לב שהם שניהם אני. אבל כאן בצד PHP, היא מדפיסה את המילוא, CS50, וקמע. אלה הם הערכים ב-PHP. אז אלה הם כיצד שני אלה שונים בשפות השונות. אז אם אתה משתמש בforeach לולאה, אל תניח שזה נותן לך את המפתחות. ואם אתה משתמש עבור n לולאה, לא מניח שזה נותן לך את הערכים. האם זה הגיוני עד כה? השקופית הבאה הולכת להראות לכם איך אתה יכול לגשת את ההפך ב כל אחד מהם. ובכן, אם יש לך את המפתח ב-JavaScript ואתה רוצה את הערך, אתה רק מדד ל מערך עם זה. אז מילו של אני אשיג לך מה אתה רוצה - את הערכים. יש תחביר שונה זה ב-PHP. אם אתה באמת רוצה לדעת את זה, אני לא חושב שהראינו לך את זה עדיין. אבל אם אתה מעוניין, אתה יכול להשתמש תחביר נוסף זה בצד הימין לוואי שבאמת יאפשר לך לקבל את מקשים ב-PHP כאשר אתה משתמש foreach לולאה. אז רק קצת טריוויה אם אתה מעוניין. אז זה רק כדי להדגים את הבדלים בין שתי הלולאות הללו. אל תערבב אותם כשאתה תכנות שאלה. כל שאלות בקשר לזה. מגניב. בסדר. JavaScript אובייקטים. אני דיברתי עליהם. הם כמו מערכים אסוציאטיביים. דבר אחד אני רוצה שתשים לב כאן הוא שערך באסוציאטיבי מערך יכול להיות כל דבר ב-JavaScript. זה אפילו יכול להיות פונקציה, כמו שם. יש לי פונקציה ש הוא ערך של מפתח. ואם אני רוצה לקרוא לפונקציה ש, אני פשוט לגשת לקליפה. ואז אני שם את הסוגריים אחרי זה. וזה עובד. אז כל שאלות? לא? על אישור. טוב. JavaScript, כמו PHP, הוא מודפס באופן רופף. מה זה אומר? זה עושה לי סוגים. אבל כאשר אתה מצהיר על JavaScript משתנה, אתה אומר אני var. אתה לא אומר את זה. זה לא דבר. אתה פשוט אומר שזה משתנה. ולאחר מכן JavaScript יטפל סוגים מתחת למכסת המנוע בשבילך. אנחנו יכולים להמיר באופן חופשי בין סוגים בגלל זה. אז אני מתחיל את דרכו כמספר במקרה זה. ואז יש לי מיתרים. ואני מוסיף לי לזה. ואני להקצות מחדש אותו בחזרה לתוך i. אז שבשורה ראשונה, הוא את המספר. בשורה השנייה, אני הופך כעת מחרוזת לאחר שאני עושה השינוי. וכאן, אני רק שרשור מספר שעל החוט. אז אתה רואה שלמרות שהייתי שלם בחלק הראשון, זה סוג כמו להיות מומר מחרוזת ולאחר מכן להתווסף על שמחרוזת שלום. ואז זה מה שאני מתכוון על ידי ההקלדה רופפת. זה שאתה להמיר בין סוגים מאוד בקלות. וזה לא לזרוק אזהרות עליך כאילו C עושה. אז אני עכשיו מכיל שלום 123 למחרוזת. הבא. אנחנו גם יכולים להשוות באופן חופשי בין סוגים. אז אם אתה פשוט להשתמש ==, מאוד כמו ב-PHP, JavaScript עושה דבר דומה. המחרוזת 123 היא זהה למספר 123 כאשר אתה משתמש בשווים כפולים. כאשר משתמשים בו שווים משולשים, זה גם רוצה לוודא כי הסוג הוא אותו הדבר. אז בגלל שהיא מחרוזת וכי הוא מספר, אף על פי ששניהם 123, כאשר אתה משתמש משולש שווה, אתה מקבל שווא. בפעמים שוות מקרה, אתה מקבל אמיתי, כי שווים כפולים לא אכפת סוג. אכפת שווים לשלושה על סוג. שאלות? על אישור. ועוד דבר על JavaScript הוא היקף הוא סוג של גלובלי אלא אם כן אתה בפונקציה. וזה עובד באותה דרך ב-PHP בפועל. אז בואו נלך דרך דוגמא זו. אני מגדיר את i 999. ואז אני נכנסתי לזה ללולאה. אז אם אני מדפיס אני בזה ל לולאה, אני מצפה 0, 1, 2, 3, 4. אני מקבל i = 4. זה מגדיל לי עכשיו עד 5 ב סוף ללולאה. ואז זה פורץ את הלולאה, משום שהיא אינה מקיימת את להתנות יותר. מה אתה חושב שבא console.log מדפיס? אז זה מה שהוא הייתי עושה בג ב C, כי אם יש לך, גם אני כמו var מחוץ ויש לך אני var בתוך לולאה, כמו ללולאה, אז זה עושה את זה באופן ש זה scoped ששני i שלהם שונים. ב-JavaScript, פשוט יעשה את זה להתייחס אליו כזהה אני. אני מקבל 5, משום שזה היה הערך לאחר שיצא מחוץ לעניינים. אז אני של אלה הם אותם אני. האם זה הגיוני? ובכן, זה הגיוני מ נקודת מבט-JavaScript. אבל באותה פרדיגמה לא לשאת מעל לג יש להם כללים לקביעת טווח שונים. כן. קהל: [לא ברור] מחוץ לפונקציה [לא ברור]? יוסף אונג: אז מחוץ שפונקציה? אז אני אגיע לזה בעוד שני. אז אנחנו קוראים foo (i). זה עובר לי לfoo, מרווחים אותו, ולאחר מכן נכנס בו. אז זה היה 5. אז זה הופך להיות 6. אבל מה שאני מדבר עליו i כי בפונקציה זו. בגלל שזה פרמטר, זה scoped לתפקיד זה. אז ברגע שאני בעצם יוצא שמ פונקציה, עכשיו זה הולך חזרה לאני הישן. i כי הוא scoped רק בגלל שהוא בתפקיד. ויש לנו היקפו ובפונקציות. אבל אין לנו היקף מחוץ פונקציות ב-JavaScript. האם זה הגיוני? כן. שאלה. קהל: אותו דבר [לא ברור]? יוסף אונג: אז כן. ב-PHP, זה אותו הסוג של דבר. יש עידון קל בעצם. אבל אתה יכול לשאול אותי על כי לאחר הבדיקה. אתה לא באמת צריך לדעת עידון שלחידון. לכל דבר ועניין, כמו משתנים הגלובאליים ו-PHP, אלא אם כן הם בתפקיד, אותו דבר ב-JavaScript. כן. קהל: למה זה מותר ב JavaScript ולא שם אחר? יוסף אונג: אז למה זה מותר ב-JavaScript ולא ב-C? זה רק מי שבא עם JavaScript החליט שזה היה בסדר ב ב-JavaScript. אז זה בדיוק כמו שפת תכנות אמנה כפי שהיינו אומר. כן. קהל: אז למה עשה זה הולך 6-5? יוסף אונג: כך זה נמשך 6-5, כי כשעברתי i לfoo, כי אני פנימי של foo כעת scoped לfoo, בגלל היקף קיים בפונקציות ב ב-JavaScript. אבל ברגע שאני יוצא מכאן, כי זה היה scoped לפונקציה, אני פשוט באמצעות אני הרגיל שהיה בפנים שאר בקרת הזרימה. הגיוני? האם אני יכול להמשיך הלאה? בסדר. מגניב. קבלה זו היא אובייקטים הם עברו על דרך הפניה. אתה יודע איך זה כשאתה עובר מערך לתוך C אתה יכול למעשה לשנות את המערך? זה אותו הדבר ב-JavaScript. אם אני עובר אובייקט, במקרה זה, אני עבר מילוא לתפקיד catify זה. המילוא מתחיל. שמו הוא מילוא בננה. אני עובר אובייקט שלתוך פונקציה כי זה אובייקט, אסוציאטיבי מערך ב-JavaScript. כאשר אני מבצע פעולה בתפקיד זה, שזה יהיה למעשה לשנות את האובייקט. אז זה יקרה רק לאובייקטים ב-JavaScript, בדיוק כמו שזה קורה עבור מערכים פנימיים של שמו של ג אז המילוא יהיה למעשה להפוך לחתול עכשיו. האם זה הגיוני? אז זה עובד רק לאובייקטים. אובייקטים מועברים על דרך הפניה. כן. קהל: אז אתה אומר ש בניגוד לאני משתנה. יוסף אונג: כן. איזה משתנה אני פשוט היה מספר, נכון? זה כמו ב-C כאשר אתה עובר integer, זה יוצר עותק. וכאשר אתה עובר מערך, זה בעצם משנה את המערך בפועל ג קורה אותו הדבר עם JavaScript במקרה זה. בסדר. ולמחרת, מילו הוא עצוב כי הוא עכשיו חתול. זה היה ממש אחרי המילוא כמה נסיעה לווטרינר. אז איך להשתמש ב-JavaScript בדף אינטרנט? אנחנו יכולים לכלול אותו. זהו קוד ה-HTML עם תגי הרצועה. אז יש לי תגי רצועה שם. ואז לשים קצת JavaScript קוד בתוך תגי התסריט. ולאחר מכן הוא מבצע את זה. כאשר אני רק עושה את זה ככה, זה קרא JavaScript מוטבע. זה סוג של מבולגן, כי JavaScript היא בעצם ב-HTML. דרך טובה יותר לעשות את זה, הרבה יותר נחמד, הוא לכתוב JavaScript ב קובץ חיצוני ולאחר מכן לספק תג סקריפט עם מקור. וזה ילך לזה קובץ JavaScript ולקרוא את קוד JavaScript מ שאגיש במקום. ודרך זו, אין לך הרבה JavaScript בתחילת שלך קובץ HTML, מה שהופך זה באמת מבולגן. אתה פשוט לשים אותו במקום אחר. ואז זה יהיה לקרוא אותו משם. האם זה הגיוני? ענייני מיקום. במקרה הספציפי הזה, תסריט הוא לפני הגוף. לכן, כאשר אני מבצע את זה, אין שום דבר בגוף עדיין. אולי זה יעשה קצת יותר לחוש מתי אני מראה זה חלק הבא. במקרה זה, את התסריט מגיע לאחר div. אז div מופיע למעשה בעמוד הראשון. ממש כאן בעיגול האדום הקטן הזה, אתה רואה את הטקסט מופיע. ואז ההתראה מופיעה. במקרה הראשון, כי את התסריט היה לפני div, ההתראה מופיעה ראשונה. ולאחר מכן div מופיע לאחר שלך לסגור את התיבה. אז הביצוע חשוב. אז אנחנו נשמור את זה בחשבון. זה יהיה חשוב בקצת. על אישור. כל כך טוב, איך אתה לחכות עד כל הדף נטען אז לפני שאתה ביצוע קצת קוד? אנחנו נגיע לזה קצת קצת מאוחר יותר מדי. אבל רק לשמור על מיקום זה עניינים במוח כאשר אנו הגיע לשקופית אחרת. אז אנחנו מגיעים לDOM עכשיו. ומה הוא DOM? אז אם אתה מסתכל על קוד ה-HTML, זה פשוט חבורה של טקסט על המסך. אז איך יודע שJavaScript זה אלמנט ב-HTML? אז יש לנו כמה זיכרון ייצוג זה מבנה שיש לנו. ובכל פעם שיש לנו את זה בזיכרון ייצוג ב-JavaScript, אנו קוראים כי ה-DOM. וזה רק בדרך שאנשים החליטו שאנחנו צריכים לייצג את זה מבנה HTML כ. ומה DOM זה נראה? ובכן, בייצוג זיכרון, אנחנו לוקחים את הטקסט הזה. ואנחנו הופכים אותו לזיכרון ייצוג. אז זה את ה-HTML. אז אנחנו הראשונים לגלות כי כל יש עץ DOM מסמך. זה נראה כמו עץ. והמסמך מכיל את ה-HTML תג, ממש הכל בתוך זה עכשיו. יש תג HTML שני ילדים. יש לו ראש. הראש הזה, אם אתה מסתכל על כניסה שם על איך זה מובנה בין התגים הקרובים, יש ראש ילד. הילד הוא כותרת. בדיוק. עכשיו, יש לנו ילד בגוף. ואז גוף שיש לו ילד בשם משפחה. ויש לו המשפחה כי שלושה ילדים - העתיק ביותר, באמצע, וצעיר. אז אתה צריך לדעת איך לצייר תרשים ככה כשנשאל אותך איך כדי לצייר תרשים כאשר אנו נותנים שלך את ה-HTML בצד השמאל. יודע איך לייצר את עץ DOM. ובתוך הדברים האלה, יש רק חלק מטקסט, שאני כבר מיוצג קופסות קטנות כ. האם מבנה עץ DOM זה לעשות תחושה ומה DOM? אז מה עושה את עמ 'לעמוד? כאן, עמ 'שם בתג שמייצג תג פסקה ב-HTML. אז אתה יכול לבדוק את זה. אבל זה רק אומר שזה קצת מקום לחלק מהטקסט. ויש לו כמה סטיילינג CSS ברירת מחדל, בגלל שזה תג פסקה. אבל לא באמת לדאוג שחלק גדול מדי. רק יודע שזה מציין מיקום עבור חלק מטקסט. כן. שאלה? כן. קהל: אתה פשוט הזכרת CSS. משפחת החשיש והחשיש כל הדברים האלה הוא בעצם המייצג את תעודות הזהות ב-CSS? יוסף אונג: כן, בדיוק. אני אגיע למה שhashes אלה מתכוון בשני. כאשר אנג'לה ניגשה CSS, היא דיבר על סלקטורים ב-CSS. אלה הם סלקטורים ב-CSS כי היא מדברת. כן, רוב? ROB אודן: הייתי גם להגיב DOM שבתוך תג הכותרת גם צומת טקסט. יוסף אונג: נכון. אז בתוך תג הכותרת, יש לי כמה DOM טקסט. אז באמת, התואר הזה צריך להיות כמו קופסא קטנה יורדת ממנה גם כן. אבל זה לא ממש משנה יותר מדי במקרה הזה. באמת לא אכפת לנו על בלוטות טקסט, כפי שאנו קוראים להם, יותר מדי. בסדר, אנחנו עושים. ככל הנראה, שאנחנו עושים. ואני אתקן את זה כש אני מעלה את זה שוב. האם זה הגיוני? אז איך אנחנו עובדים עם DOM? בכל פעם שאתם מתמודדים עם DOM ב JavaScript, יש שני שלבים. אתה בוחר אלמנט DOM. ואז אתה עושה את הדברים אליו. אז במקרה הזה, בצורה מופשטת, יש לי נבחר אלמנט האמצע. ולאחר מכן דוגמה לעושה דברים כדי שזה יהיה לשנות את הטקסט. שהיה אמורים להיות בוב. עכשיו, מה שעשיתי לו היה לי השתנה בוב למילוא במקרה זה. אז איך אנחנו באמת עושים את זה? איך עושה את הבחירה? ואיך אנחנו עושים דברים ל הדבר ברגע שלקחנו אותו? ובכן, הדרך בה אתה חבר 'ה שלמדו את זה בכיתה זו היא באמצעותנו משהו נקרא jQuery. אז מה זה jQuery? jQuery היא ספרייה שעושה JavaScript קל יותר לכתוב. אז מישהו לקח את הזמן וכתב jQuery. jQuery היא למעשה כתב ב-JavaScript. ואז בגלל שהם עשו את זה, עכשיו אנחנו יש חבורה של פונקציות שלמות ש אנחנו יכולים להשתמש בזה עושה אותנו גר ממש קל. אז מה הם כמה מן דברים שהיא עושה? זה עושה את בחירת אלמנטים קלים יותר. זה עושה שינוי HTML, הוספת כיתות לקלה יותר. זה עושה את אייאקס לקל יותר. אנחנו נגיע לזה בשנייה. וזה מקביל לספריות C. אז אתה כולל string.h, אתה מקבל strlen. אתה מקבל strcpy, את כל הדברים האלה. כאשר אתה כולל jQuery, אתה מקבל נחמד דרכים לבחירת אלמנטים לשינוי דברים, וכולי. אתה מקבל פונקציונלי נוסף ש JavaScript לא נותן לך. אז jQuery היא לא ב-JavaScript. jQuery היא ספרייה שכתובה ב JavaScript שעושה JavaScript קל יותר לכתוב. אז jQuery היא לא תכנות שפה. אבל JavaScript היא. לעשות. בטוח שאתה מקבל את המינוח נכון. כל שאלה? כן. האם זאת שאלה? בסדר. אז איך אתה להשתמש jQuery? ובכן, כשאתה כותב כמה קוד JavaScript ואתה כולל jQuery בחלק העליון של הקובץ שלך, כמו קובץ תסריט, אתה משתמש בסימן הדולר עכשיו כדי לקבל גישה לjQuery. וזה שונה מ סימן הדולר ב-PHP. זה אותו הסמל שאתה מקליד במקלדת שלך. אבל הם אומר דברים שונים מאוד. דולר סימן ב-PHP פירוש זה איך אני מצהיר על משתנה. ב-JavaScript, כשאתה כבר כלול jQuery, הוא עומד לjQuery. אז לזכור את זה. אז איך אנחנו יכולים לבחור אלמנטי DOM? ובכן, כשאתה עושה את זה JavaScript המכוער דרך אגב, אתה ניגש לתעד משתנה גלובלי. ואז אתה מקבל אלמנט על ידי בני משפחה מזהה. זה באמת ארוך ומלל ולא מאוד נחמד. או שאתה יכול לקבל את כל האלמנטים שתג p. זה עובד גם ב-JavaScript. אבל אנחנו אף פעם לא באמת הראיתי אתה התחביר יותר מדי. מה שהראינו לך היה jQuery. כך שכל שם למעלה, כי הבורר באו לידי ביטוי ב-JavaScript רק מקבל תמצית לדולר מאוד נחמד זה תחתום משפחת hashtag. ועמ '$, בדיוק איפה שזה ככה. אם ברצונך לבחור את כל תגי p בתוך משפחה, אנחנו שמים את החלל בין שתיים. ועכשיו, אנחנו מקבלים את כל p תגים בתוך משפחה. ונראה מוכר? ובכן, אנג'לה דיברה על סלקטורים ב-CSS. תן לי שנייה אחת. ולכן על מנת לבחור אלמנט, אתה פשוט להשתמש באותו הדבר כמוך הייתי עושה עם בורר-CSS. אם אתה שם את חשיש בחזית שלו, הוא בוחר לפי תעודת זהות. נקודה בוחרת בכיתות. אם רק יש לך את הדבר ללא hashes או נקודות, הוא בוחר תגים אלה. שאלות. כן? קהל: כאשר אנו משתמשים בנקודה שלנו HTML, הוא כי לא jQuery? יוסף אונג: דוט ב-HTML שלנו זה דבר-JavaScript. זה לא דבר של jQuery. הדרך בה אתה חבר 'ה למדה את זה עם jQuery היא לשימוש. html. ואז אתה העביר אותו מה HTML הולך להיות. אז אני אגיע לזה בסתם שני דווקא. אז איך אנחנו עושים דברים לאלמנט ברגע שאנחנו שבחרתי אותו? אז זה דוגמא של בחירת אלמנט. אז עכשיו, אנחנו רוצים לעשות את הדברים אליו. אז במקרה הזה, תן לי לחזור לשקופית הקודמת. זה היה בוב לפני. ואני רוצה לשנות את זה בתוך ה-HTML למילו. אז אני קורא לפונקצית ה-HTML מהאלמנט. שפונקצית ה-HTML היא שיטה של ​​אלמנט. ואז אני נותן לו את מה אני רוצה את ה-HTML כדי להיות. וזה פשוט מחליף את מה שיש בפנים של תג שעם כל מה שאני נותן לו. כן. שאלה? קהל: hashtag משמש רק jQuery. [לא ברור] לא היינו משתמש בזה. יוסף אונג: כן, בדיוק. אבל אל תדאגו יותר מדי JavaScript על טהור. אני רק רוצה שחבר 'ה להתמקד באופן שבי הייתי עושה את זה עם jQuery, כי זה הולך להיות חשוב חלק בחידון. נכון. בדיוק. אז אתה רואה שhashtag, כך מתאים כדי לבחור את האלמנט עם האמצע מזהה בגלל hashtag ש. Hashtag אומר זהות. ויש את האלמנט הזה ID של אמצע. אז זה האלמנט שאנחנו בוחרים. קהל: [לא ברור]. hashtag סימן דולר [לא ברור]? יוסף אונג: אז לא. השאלה היא האם אתה יכול להשתמש בו. ערך. ו. הערך עובד רק על אלמנטים כי הם תשומות. בjQuery, זה יהיה . Val, לא. ערך. אז אני אגיע לדוגמה קטנה ש מדגים את כל זה בשילוב בשני. אבל אני חושב שזה משרת מעט קטע הגיוני לאנשים עד כה. רוצה לשנות את ה-HTML, לקרוא את שיטת ה-HTML. כן. קהל: האם אתה יכול להסביר השיטה שוב? יוסף אונג: אז שיטה היא פשוט פונקציה ששייכת לאחד, בזה מקרה, אחד מאלמנטי DOM אלה, כי אתה רואה שאני נבחר האלמנט ראשון. למעשה, תן לי להשתמש בעכבר. אני בחרתי את האלמנט ראשון. ולאחר מכן התקשרתי לHTML זה פונקציה שהייתה לו. ומכיוון שפונקציה זו שייכת ל את הדבר הזה, אנחנו קוראים לזה שיטה. זה פשוט שם מפואר לזה. תגיד את זה שוב. אז זכור, בחרנו האלמנט עכשיו. ואנחנו שמנו את זה בפנים של משתנה האלמנט. לתקן? לכן, כאשר אנחנו רוצים לשנות את ה-HTML על בפנים, בגלל שזה היה בוב לפני, אתה רוצה לשנות את הטקסט שלמילו. אז אנחנו קוראים ה-HTML. ואנחנו אומרים לו מה HTML בתוך אלמנט שצריך להיות עכשיו. וכך הוא משנה אותו למילו, כי אני נתתי את מילוא. קהל: אז הם עובדים יחד. [לא ברור] יוסף אונג: כן, כן. הם עובדים יחד. אז אחד מהם בוחר האלמנט ראשון. והשנייה אחת עושה משהו. כן. קהל: [לא ברור]. אם שיטה זו שונה מב-HTML יש לך השיטה שווה בפועל. יוסף אונג: כן. זה הוא בשיטה שונה. זה הוא בשיטה שונה. ואנחנו יכולים לכסות את זה רק שני כשנגיע לירושלים. אני רוצה לוודא שאנחנו לזרז כי אנחנו הולכים ואוזל זמן. אבל יש לנו להפעיל דרך לאורך זמן עכשיו. על אישור. מגניב. אז אם ברצונך להוסיף בכיתה, יש גם שיטת כיתת תוספת. זוהי רק דוגמא למה אתה יכול לעשות עם jQuery. זה רק מוסיף כיתה. אם אתה רוצה להסיר אותו, אתה יכול להתקשר להסרה. זה פשוט עוד דבר שאתה יכול לעשות. אז עוד דוגמאות של דברים שאתה יכול לעשות. אז יכול פשוט שמתי את זה ב הראש כזה? הסרה צעירה. אם אני רק לבצע JavaScript שב החלק העליון של התיק שלי, האם זה עובד? נכון. בגלל אמצע אינו קיים עדיין. אז זה לא הולך לעבודה. צו הוצאה לפועל. זה הולך לראש ראשון. מה? קהל: הצעיר עדיין אינו קיים? יוסף אונג: כן. צעיר עדיין אינו קיים. בדיוק. קהל: אתה אמר אמצע. יוסף אונג: מצטער. צעיר עדיין אינו קיים. והדבר השני הוא שיש לי לא כלל את jQuery להגיש שואל src תסריט. אז זה לא הולך לעבודה. למעשה, אני לא עשיתי את זה ב השקופית הבאה, שהוא אמור לתקן גם את זה. אבל הדרך בה אנו עושים זאת היא JavaScript הוא אירוע מונע. אז מה שאנו עושים זה להשתמש באירוע מטפל כדי שזה יקרה. וכך אני בוחר את המסמך המערכה ראשונה. אני אומר, בסדר, כאשר המסמך מוכן, תן לי להפעיל פונקציה. אז זה כל מה שאמצעי התחביר. אני נבחר את המסמך. עכשיו, כאשר המסמך הוא מוכן, להפעיל את הפונקציה. וכן כאן כאשר המסמך מוכן, מה שאומר שיש את כל ה-HTML טעון, ואז אני מפעיל את הפונקציה שמסיר את האלמנט הזה. וכך עכשיו, כאשר אני מפעיל פונקציה זו שעברתי למוכן, אני מובטח כי כל HTML על הדף הולך להתקיים ראשון. כן. שאלה? קהל: מה היא מילת המפתח האירוע בתוך הפונקציה? יוסף אונג: אז שמילת מפתח באירוע פונקציה היא רק פרמטר ש מקבל מועבר לפונקציה לכל אירוע. זה פשוט משהו ש אתה מקבל בחינם. כשאתה משתמש במפעילים מרכזיים ב pset8, אירוע שיכול להגיד לך, עבור למשל, שמפתח שאתה לחצת על. במקרה זה, לאירוע מוכן, זה ממש לא סופר שימושי. אבל עבור למטה אירוע מרכזי, זה יותר שימושי, כי אתה לומד להכיר בי מפתח שאתה לחצת על ידי גישה למפתח קוד הנחה שאובייקט אירוע. לתקן? האם זה הגיוני? על אישור. כן. שאלה? קהל: אז אתה יכול לשים תג סקריפט נמוך יותר? יוסף אונג: אז כן. אתה יכול לשים את התסריט לתייג יותר למטה. אבל אז זה פשוט הופך להיות ממש מבולגן. ואנחנו רוצים לרכז את כל של הקוד שלנו במקום אחד. וזה יאפשר לנו לעשות את זה. זכור קודם לכן אמרתי שיש יותר נחמד דרך להבטיח שאלמנטים הם בעמוד לפני שאתה לבצע קוד? וזו רק דרך נחמדה היית להשיג את זה. קהל: [לא ברור]. יוסף אונג: כן. אתה עדיין תצטרך, נכון? כי תזכור, אתה כלול להגיש בחלק העליון של הדף. אז זה הולך לבצע לראשונה לפני אתה מגיע לתחתית הדף. על אישור. אז אתה יכול גם להוסיף שונה סוג של מטפל באירועים. אחד זה רק מעבד קליקים. כאשר אני לוחץ על צעיר, ולאחר מכן זה יצוץ עם התראה. זוהי רק שונה סוג של אירוע. בניגוד לאירוע מוכן, אתה עכשיו להשתמש באירוע הלחיצה בעת הקבלה לוחץ על אלמנט. ולכן במקרה זה, יש לזכור, לחץ מטפל מחובר לצעיר. אז זה קורה רק כאשר אני לוחץ על צעיר. ובשניית אחת, האירוע מוכן מצורף למסמך. אז הוא ממתין למסמך כדי להיות מוכן. הגיוני? אני חושב שאני יכול להמשיך הלאה. כן. שאלה? קהל: [לא ברור]. במקרה זה אתה משתמש [לא ברור]. יוסף אונג: הו, כן, כי בזה מקרה, אני צריך לחכות לצעיר אלמנט שיופיע במסך ראשון לפני שאני יכול לצרף מטפל לחץ כדי את זה, וזו הסיבה שאני שם את זה בתוך של מסמך מוכן. על אישור. והבא, אז זה הוא דוגמא גדולה של איך היית משלב את הכל. זוהי רק דוגמא אימות טופס שראית בהרצאה. אז לקחת את זה צעד אחר צעד כמו אתה עובר את זה. וזה יהיה בסדר לגמרי. רק לקרוא אותו מלמעלה למטה. יש לי טופס בתחתית. כאשר המסמך מוכן, אני מצרף להגיש מטפל לטופס, כגון ש כשאני מגיש את הטופס, אני מקבל את הערכים בתוך כל אחד מתשומות אלה. ואני בודק אם זה ריק. אם זה ריק, אני חוזר שווא, כי אני לא רוצה לשלוח את הטופס, בגלל הצורה שגויה. אם הסיסמה היא ריקה או שזה פחות משמונה תווים, אני לא תגיש את הטופס, כי זה גם לא נכון. ושקר התמורה פשוט מונע צורת הגשה ומ הולך לדף חדש. ובתקווה, זה הגיוני. אני חושב שאתם צריכים ללכת דרך צעד אחר צעד בקוד זה בעצמך. וברגע שאתה מבין מה בחר אלמנטים ולעשות את הדברים אליו בעצם מחייב, זה יגרום לי הרבה תחושה לך. כן? קהל: מה עושה name = שם משתמש אומר? יוסף אונג: אז name = שם המשתמש ו name = סיסמא רק אומרת מסתכלת תכונה של מה אתה בוחר. ולאחר מכן שיש להתאים. אז אנחנו הולכים לרישום. ואז אנחנו מסתכלים על כל התשומות ורישום. ואז אנחנו בוחרים בו שם אחד התכונה שווה לשם משתמש. כך שהבורר הראשון בוחר רק קלט המשתמש. וכי הבורר שני בוחר רק הסיסמה אחת, כי יש לי אלה שם את התכונות שלהם להגדיר כמו מה הם אמורים להיות. שאלה? קהל: ביום ההגשה, איך עושה את חלק תחתון לפתור את החלק העליון? יוסף אונג: אז זה בגלל של המטפל באירועים. אז אנחנו מחכים לאירוע להגיש שמקבל ירה מהטופס. וזה כל מה שהוא שליחה. למה אני קורא להגיש עד לשם? זה אומר, כאשר הטופס שהוגש, אני מקבל אירוע שליחה. אז תן לי רק ליירט וש לאחר מכן להפעיל את הקוד הזה במקום. כן? קהל: למה יש לך יש אירוע פונקציה? למה לא פשוט [לא ברור] אתה יכול? יוסף אונג: כי ב-JavaScript, אתה יש להכריז על הפונקציות. זה בדיוק איך זה עובד ב-JavaScript. אתה חייב לומר שזה הולך כדי להפעיל את פונקציה. אז אתה אומר לו שאתה מצפה פונקציה כאן במקום רק סוגריים מסולסלים. קהל: ואת הפונקציה הוא מה שאחרי? יוסף אונג: כן. הפונקציה היא מה שבפנים הסוגריים המסולסלים אחרי שמילת מפתח הפונקציה. כן? קהל: [לא ברור]. יוסף אונג: להגשה? קהל: לא, לפונקציה ללא אירוע. יוסף אונג: כן. אז בלי האירוע, אתה יכול לקבל את זה. אם אתה לא צריך את האירוע, אז אתה יכול פשוט להשמיט אותו. אבל אם אתה עושה, אז אתה פשוט לשים אותו שם. כן. שאלה מהירה? קהל: [לא ברור]. יוסף אונג: כן. כי מה שאתה צריך לעשות, document.ready פשוט אומר לחכות לכל HTML בדף לטעון ראשון. ובדרך כלל, אתה רוצה האלמנטים שלך במקום לפני שאתה מפעיל כל קוד. בסדר. אנחנו צריכים להגיע לאייאקס. אין לנו הרבה זמן. אז יתרונות וחסרונות. JavaScript היא לנסות יותר קל לכתוב עם jQuery. אבל jQuery היא סוג של איטי. זה כמו PHP היא איטית יותר מאשר C, כי זה יתפרש. וjQuery היא קצת איטית יותר מאשר JavaScript, כי זה עושה הרבה דברים מתחת למכסת המנוע. ולכן אם אתה משתמש jQuery, זה רק קצת איטי יותר מאשר JavaScript, למרות שזה נותן לך אלגנטיות נחמדה. ולבסוף, אייאקס. עד כה עם אייאקס, שלא ראה אייאקס במונחים של pset7 עדיין, כי כאשר אתה עושה, אתה שולח טופס לציטוט. הוא טוען דף חדש. כך שאתה מקבל הבזק הלבן הגדול הזה בעמוד בזמן ש דף נטען שני, נכון? זה יהיה ממש נחמד אם אתה לא היה לי את זה פלאש. כמו פייסבוק, אם אתה פשוט לגלול ל בתחתית, זה מוסיף תוכן חדש מבלי לרענן את הדף כולו. אז משהו כזה יהיה נחמד. זה קוד JavaScript בצד השמאל. אתה מקבל מה שהוא חלק פנימי של קלט זה. אתה מקבל את מידע על המניה מ-Yahoo! ואז אתה עושה מחרוזת גדולה כי אומר, אוקיי, זה המסר שאני רוצה כדי להראות על המסך. ואז אתה שם את זה בתוך הודעה של חלק רכיב HTML שמקבל מוצג על המסך. אז זה כל מה שקורה כאן. אז בעצם, בגלל זה הוא כל JavaScript ואתה לא צריך לרוץ עוד PHP, זה יהיה לוודא שהדף לא מתרענן. אז זה רק רעיון מופשט שאני אומר כאן לעת עתה. הרעיון המופשט הוא שאם אתה עושה את זה כל ב-JavaScript, אין לך דף רענון. אבל איך שאתה בעצם עושה את זה? טוב, בעצם, בואו נדבר על בעיה עם זה ראשון. בעיה היא ב-JavaScript, ביצוע הוא סינכרוני. אז אתה צריך לחכות לאחד קו כדי לסיים לפני שאתה לבצע את השורה הבאה. ומה אם אני הולך ליאהו, והשרתים שלהם הם איטיים מאוד, ו לוקח להם שלוש שניות כדי תחזיר לי את שמידע על מניות? כאשר אני מכה קו המחיר, שאם ביצוע הוא סינכרוני, כפי שהוא על ידי ברירת מחדל, מה שזה רק הולך לעשות הוא הדפדפן שלך הולך לדוכן ל שלוש שניות. ואתה לא הולך להיות מסוגל לעשות כל דבר בזמן שהוא מקבל את הנתונים האלה. זה הולך להיות קפוא. וזה רע. אתה לא רוצה שמשתמש יש דף אינטרנט קפוא. לתקן? זה פשוט רע. כולם מסכים? אם אתה גולש בפייסבוק וזה קופא ואתה לא יכול לעשות כלום, אתה מתוסכל באמת. אז הפתרון הוא שאנחנו עושים משהו אסינכרוני במקום. אז כל דבר אסינכרוני זה אומר הוא, אני הולך לשאול את זה כתובת אתר לכמה נתונים. ואז אני הולך להמשיך. אני רק הולך לשמור על ביצוע מה קוד שהיה אחרי זה. ולאחר מכן בכל פעם שהנתונים, כי הוא מוכן, אז אני נעבד אותו. זה כל מה שזה אומר. קהל: אייאקס פשוט עושה אסינכרוני קוד? יוסף אונג: זה אסינכרוני דרך של נתונים מקסימים. אז הדבר הראשון שעל אייאקס זה מאפשר לי לקבל נתונים מאתר חיצוני. והדבר השני הוא שהוא מוודא כי הדף שלי לא דוכן בזמן שאני הבאת הנתונים. זה חלק אסינכרוני שלו. כי זה הולך למקום אחר, משום שאני אומר אני שומר קורה בזמן זה להביא את הנתונים, כי הופך אותו לאסינכרוני. אני כל זמן המבצע. אז לשמור אסינכרוני כי רעיון במוחו. ואני אראה לך מה ההבדל הוא. גרסת סינכרוני הוא בצד השמאל. גרסת אסינכרוני הוא בצד ימין. תסתכל על המספרים כדי לראות אילו צעדים מתאימות למה מבצע בכל שורה. שם, ההתראה מופיעה ראשונה. מכיוון מקבל מידע על המניה מ-Yahoo! לוקח שלוש שניות, שהוא מזדקר למשך שלוש שניות. ואז היא מודיעה המחיר לאחר שלוש שניות האלה. אז עכשיו, שמראה התראה עד באותו זמן - שלוש שניות פנימה ואז זה מתריע על ידי אחרי זה. אז זה רק הולך צעד אחר צעד. זה כמו מה שאתה חבר 'ה היה מוכן לקבל, נכון? עם ביצוע אסינכרוני, אתה להתריע ראשון. ואז אתה הולך לכתובת זו. ואתה אומר, אני הולך פשוט לבקש את הנתונים. ולאחר מכן אני הולך לעבד אותו מאוחר יותר. אז זה מייד מבצע השורה הבאה לאחר שאני עושה בקשת אסינכרוני. אז 0.001 שניות, אתה רואה היי ערני. לבצע פונקציה ש, ביי התראה. ובגלל שהבטחתי שאני יהיה לעבד את הנתונים מאוחר יותר, מה קורה הוא כאשר הנתונים שחוזרים שלוש שניות מאוחר יותר, ואז אני רץ כי פונקציה שיש לי שם. כן? קהל: האם אתה יכול לציין או להבהיר מה פירוש אייאקס? יוסף אונג: אז אייאקס הוא דרך שאם אני צריכים נתונים כשאני על אתר ואני לא אז רוצה לרענן את הדף, אני משתמש בטכנולוגיה זו קרוי אייאקס. כי למעשה רק אומר, לך תביא נתונים מהאתר אחר. ולעשות את זה בצורה שרק לא לעכב דף האינטרנט שלי. קהל: אז הוא שטבוע חלק מJavaScript או jQuery? יוסף אונג: אז מישהו כתב את דרך לעשות זה ב-JavaScript לפני זמן רב. בשלב מסוים, זה לא היה קיים. ואז מישהו המציא את הטכניקה הזו כדי לאפשר לאנשים לבקש את הנתונים בדרך זו. והם כתבו כמה דברים כדי לעשות את זה בשבילך. וjQuery רק נותן לך את זה דרך מאוד נחמדה לעשות את זה עם דולרים. לקבל פונקציה. שאלות? אני יכול לענות על שאלות לגבי אייאקס אחר כך יותר מדי. אני אהיה כאן. אז זה בוא להביא נתונים ללא לרענן את הדף. וזה בואו איתנו לעשות את זה ב דרך אסינכרוני כי לא להקפיא את הדף. ארוך מדי, לא קרא, אם כי ההסבר היה ארוך מדי עבורך. אז סוף סוף, בין אתרים תקיפות Scripting. ראינו את זה עם Zamyla. אם מישהו באתר שלי יש את השם הזה, אשר תג זה תסריט, ואני יש לי כמה קוד בדף שלי שמדפיס את השמות של אנשים ברציפות, או שיש לי כמה קוד JavaScript שמכניס השם הזה לדף, מה HTML מקבל הפיק? ובכן, אני מדפיס את תג ה-HTML. אני מדפיס את כל תגים אלה. אני מגיע לחלק שבו אני הדפסה עם החברים שלי. אני מדפיס את לורן. זה להדפיס את המילוא. ולאחר מכן את השם שלי באתר הוא פוסט סקריפט סטטוס בפייסבוק לא מחמיא. כי אני מוכנס זה לתוך הדף כי הוא נראה כמו JavaScript, כאשר דף זה מקבל נשלח למשתמש, הוא מקבל להורג כ- JavaScript. ואז זה מה שאנחנו קוראים התקפת Scripting בין אתרים. מישהו מכניס מידע זדוני מסד הנתונים שלך שיכול מתאימות ל כמה מחרוזת או נוספות חלק המחרוזת ב-JavaScript. וכאשר הוא מקבל הדפיס כדי דף באופן זה, אז מה שקורה הוא שהקוד רע מקבל להורג שאני לא מתכוון לזה כדי לקבל להורג. וזה כל מה שבין אתרים התקפת scripting היא. ועל הדרך אתה מקבל סביב זה כמו Zamyla אמר. אתה פשוט לעטוף את הדברים ב תווים מיוחדים ב-HTML. ותווים מיוחדים של HTML זה PHP פונקציה שתמנע סוג זה של דבר לא יקרו לך אם יש לך זדוני מחרוזת במסד הנתונים שלך. זה פשוט בורח זה, כך שזה לא מקבל מתפרש כ-HTML. הוא מחליף את סוגריים הקטנים עם מה שאנו מכנים גופים. והלכנו על זה בהרצאה מדי. אז אני חושב שאתם צריכים הבנה טובה על זה. שאלות? כן. קהל: אז איך היית [לא ברור]? יוסף אונג: אומר את זה שוב. קהל: איך היית לפקח - יוסף אונג: נכון. אז יש לך משהו שאומר, כש שלי להירשם, להקליד את השם שלי. אני פשוט הקלד בשדה זה, השם שלי הוא פייסבוק הודעה לא מחמיא stript תג סקריפט קרוב מצב. וזה רק יכניס אותו ל מסד הנתונים, מישהו, כי אני לא יכול להגיד בעולם אין לו שם עם חץ שמאלה בזה או מילת תסריט בו. זה לא ממש הגיוני. אז אני רק צריך לוודא שאני לטהר את החומר לפני שאדפיס אותו לדף. קהל: אז כרטיסים מיוחדים HTML מונע את תגים הסקריפט? יוסף אונג: כן. אז זה לא מונע את תגי הסקריפט. זה פשוט מוודא כי תגי סקריפט לא מקבלים מתפרש כ-HTML או - כן. זה פשוט עולה כמו מה זה בעצם. בסדר. אז זה היה ביקורת החידון. מגניב. [מחיאות כפות]