[Powered by Google Translate] [שבוע 7] [דוד י מלאן - אוניברסיטת הרווארד] [זה CS50. - CS50.TV] בסדר. ברוך שובך. זה CS50, וזו היא ההתחלה של שבוע 7. כמה הכרזות קטנות: Pset5 הוא עכשיו בהתקדמות, או בקרוב יהיה, והרשו לי לומר, בכנות, זה נוטה להיות בין מאתגר יותר הסטים הבעייתיים של הקורס, אז בוא יזכירו לי את זה עכשיו כך שהשבוע הזה יותר מתמיד שלא לחכות עד, יניח, יום רביעי בלילה יום חמישי בערב או לצלול פנימה זה בהחלט pset מעניין. אנחנו חושבים שזה כיף. אם אתה ממש מקבל את זה נכון בהמלוא ולאחר מכן יכול לאתגר את הלוח הגדול שנקרא, תהיה לך הזדמנות כדי להתאים שכל עם חלק מצוות של הקורס וכמה מחבריך לכיתה. מה הוא הלוח הגדול הוא ברגע שיש לך עבודה של בדק איות שלך, תוכל ללכת לcs50.net לאחר הפעלת פקודה, גרידא להצטרף, ולאחר מכן את כמות הזמן וכמות הזיכרון RAM ועוד שהשתמשת ביישום שלך יוצג כאן בדף הבית של הקורס. תוכל להבחין כי כל חבורה של האנשים האלה כאן מופיעות כצוות מאז סוף השבוע, צוות חשב שזה יהיה כיף לנסות לעלות זה על זה. אז מבין שהמטרה כאן היא לא לעלות על צוות. גם אני כאן רק במספר 13. גרידא להצטרף, אבל זה הזדמנות לראות עד כמה זיכרון RAM הקטן וכמה מעט שניות CPU אתה יכול להשתמש בכמה פנים אל פנים של חבריך לכיתה. ואני מודה שמייקל קווין שמידט, כיום בעמדת מספר 1 כאחד מTFS, זה הוא יישום שאנחנו קוראים לא אפשריים בהתחשב בכך שהוא משתמש כמעט 0 RAM וכמעט 0 שניות לטעינה. אז אנחנו כבר נדאג למחוברים קווין. [שחוק] יש כישורים מסוימים שקווין הוא לשים למבחן כאן. אחד הדברים שחשבנו שאנחנו היינו עושים גם עכשיו CS50x הוא שבוע בהתקדמות, ואתם הם כחלק בלתי נפרדים מניסוי זה כתלמידים האלה. שאלנו אותם כחלק מpset0, שהיה דומה להגשת פרויקט Scratch מעניין אותם - משחק, חתיכה אינטראקטיבית של אמנות, אנימציה, או כמו - 1 - וידאו 2-דקה, אם הם היו רוצים, יגידו שלום לעולם ושהם באמת. חשבתי שאני רוצה לחלוק איתכם רק כמה מהסרטונים שהוגשו עד כה כי אצלנו בצוות לפחות, זה באמת היה מרגש ומעורר השראה לראות את האנשים האלה מכל רחבי העולם - מדינות בכל רחבי העולם - כוונון, של כל הדברים, לקורס במדע מחשב באינטרנט, בין אם זה בגלל שהם רוצים להמשיך את לימודיהם, הם רוצים לקחת את הקריירה שלהם בכיוון חדש, הם רוצים להשלים פערים בידע שלהם, כך שחלק מאותן הסיבות שאתם אולי כבר כאן. אז אני אתן לך סטודנט אחד כזה כאן. אתה יכול להעלות את הנפח רק קצת. הנה אחת מההגשות של הסטודנטים שלנו 1-דקה. שלום, עולם. אני סטודנט להנדסת תעשייה כאן במלאגה, ספרד. אני שמח על המהלך הזה באינטרנט כי אני אוהב מדעי מחשב, אני באמת, ואני באמת מעריך שאני מקבל כדי לחקור אותו. והעובדה שאני יכול ללמוד אותו כל שאתם עושים אבל במקום להיות ברווארד אני במלאגה, כמה מדהים זה? ובכן, אני פרננדו, וזה CS50. תראו אתכם. [שחוק] סרטון נוסף שאנחנו אוהבים במיוחד, תמצא שהאנגלים של האדון הזה הוא לא כל כך חזק. זה נראה כאילו יש לו את זה במכונת תרגום, ולכן את התרגומים עצמם הם קצת לא מושלמים, אבל זה עד כה, כמו גם היה אחד מהמועדפים שלנו. [♪ ♪] שלום, עולם. [מדבר ביפנית] [יש לי לברך ביפנית בגלל האנגלי שלי הוא מאוד לא אמין.] [שאני מסרתי לך את המסר מהעיר גיפו, יפן.] [אני יכול להיות תלמיד בפעם הראשונה מזה 20 שנים, כפי שניתן לראות.] [אני מודה מאוד לאוניברסיטת הרווארד, שנתן לי את ההזדמנות הזאת וedx.] [גולף הוא גיטרה והדבר האהוב עליי בריצה.] [שחוק] [♪ ♪] [למה אתה חושב שאני מנסה להשתתף cs50x.] [אוניברסיטת הרווארד, הוא הכמיהה שלי.] [במיוחד אם אני נוכחות מרוחקת חיה ביפן.] [אני רוצה לנסות מייד מודע לקיומו של edx כגון מתי.] [אתה לא חושב שכדי שלא קשור לגיל של למידת א] [Cs50 הוא הגעגועים שלי. השם שלי הוא קאזא, וזה cs50.] [♪ ♪] [מחיאות כפות ומריעות] אהובים אחרת שלנו הייתה זו כניעה לכאן ממישהו. [♪ ♪] [מלאן] גוגל את זה אם אתה לא מכיר מם הזה. ואז לבסוף, כמה אחרים שקבלו פורסם שאולי לזכות בפרס המקסים. [סטודנטים] אאווו! >> [מלאן] יהיה לנו להקשיב. זה קצר, אז תקשיב טוב. [דובר נקבה] מה שמך? >> לואי. [דובר נקבה] מה זה? >> [צחקוקים] CS50. [שחוק] [מלאן] הוא לוקח 2, אם כי. הנה, עבר. השמי הוא לואי, וזה CS50. [שחוק] אז זה הוא CS50x. תודה לכל אלה מכם ואילו לאחר יחד בבית שכבר partaking עד כה. כיום, אנו מגיעים למסקנת הדיון במבני נתונים שלנו, לפחות בחלק מבסיסי ביותר, ואז אנחנו ממשיכים בשיחתנו על HTML ותכנות אינטרנט. אכן, בילינו את העבר כשבעה שבועות מסתכלים על יסודות תכנות - אלגוריתמים, מבני נתונים, וכמו - ו-C, כפי שחווית עד כה, לא בהכרח נגיש ביותר של שפות עם שכדי ליישם כמה מהרעיונות האלה. וכך החל מהשבוע ובשבוע הבא ולאחר מכן הבא, אנחנו סוף סוף נוכל מעבר מ C, אשר ידועות בדרך כלל כשפה נמוכה למדי ברמה, לדברים ברמה גבוהה יותר, וביניהם PHP, JavaScript, וכמו, שאנחנו נראה לשאוב את אותם שיעורים שלמדנו בשבועות האחרונים, אבל תמצא שהצהיר דברים כמו מערכים ושולחנות חשיש וחיפוש ומיון להיות כל כך הרבה יותר קל משום שהשפות עצמן תתחלנה להשתמש יהיה יותר חזק. אבל קודם, יישום של עצים. זה נפוץ מאוד בימים אלה לצורך לדחוס מידע. באיזה קשר היית רוצה לדחוס איזה מידע דיגיטלי? כן. >> [תלמיד] כאשר אתה צריך לשלוח אותו דרך האינטרנט. כן, כשאתה רוצה לשלוח משהו דרך האינטרנט. אם אתה רוצה להוריד קובץ גדול, זה אידיאלי אם מישהו בצד השני יש דחוסי קובץ שמשתמש בפורמט ZIP או משהו כזה כך שאתה שולח פחות סיבי מאשר אחר עלול להיות מועבר. אז איך אתה לדחוס מידע? כל זה מסתכם לשימוש בפחות סיבי מאשר נדרשים כברירת מחדל. אבל זה סוג של דבר מוזר מפני חושבים לחזור לשבועות 0 ו 1 כשדברנו על ASCII ובינארי ודברנו על ASCII בפרט כמו באמצעות 8 סיביים כדי לייצג אותיות האלפבית כך שהמכתב מיוצג על ידי 65, אותיות קטנות הוא המספר 97, ועם זאת אתם מייצגים את 65 או 97, אתה משתמש 7 או 8 סיבי. אבל לתפוס את זה שיש כמה אותיות באלפבית העברי כי הם לא פופולריים כמו אחרים. Z הוא לא כל כך פופולרי, ש היא לא כל כך פופולרי, אבל A ו-E הוא סופר פופולרי. ובכל זאת, לכל המכתבים הללו, כברירת מחדל בעולם משתמש באותו מספר הביטים, רק 8. אז האם לא היה חכם יותר אם במקום להשתמש 8 ביטים לכל אות, אפילו בשימוש לעתים רחוקות ביותר כמו Q ו-Z, מה אם היינו פחות סיבי ולE ו-S והאותיות הפופולריות ביותר וצרוך יותר ביטים לאותיות פחות הפופולריות, הרעיון הוא לייעל את בואו למקרה הנפוץ, אשר הוא נושא במדעי מחשב בניסיון לייעל את מה שהולך לקרות ביותר ולבלות קצת יותר זמן, קצת יותר מרחב בדברים, כן, עלול לקרות אך לא בהכרח בתדירות גבוהה. אז בואו ניקח דוגמה. תניח שאנחנו רוצים לקודד מידע די ביעילות. ייתכן שגדלתם בידיעה שמשהו קטן על קוד מורס, ורוב הסיכויים הם שאתה לא יודע את הקוד בפועל, אבל אתם אולי זוכרים שזה לפחות זו סדרה של נקודות וקווים. זהו קידוד יעיל למדי, והודעה שהמכתב הפופולרי ביותר - למשל, ה - משתמש הקצר של צפצופים. קוד המורס הוא על כל ביפ-ביפ-ביפ ומחזיק צלילים או לפרקי זמן קצרים או לתקופות זמן ארוכים. E, וכונה על ידי הנקודה, היא צפצוף קצר סופר, רק צפצוף, ושייצג את א ' לעומת זאת, T יהיה צפצוף ארוך יותר, כמו צפצוף [מאריך קול], ושאייצג ט אבל זה עדיין די קצר כי, לעומת זאת, אם אתה מסתכל על Z, להביע Z היית הולך ביפ, ביפ [צליל יותר], ביפ, ביפ [צליל קצר יותר]. אז זה כבר לא כי זה פחות מקובל. אבל תפסתי אותך כאן הוא שקוד המורס הוא קצת פגום בכך שהוא לא מייד decodable. לדוגמה, תניח שאתה שומע בסופו של דבר חלק מצפצוף החוט [קצר], צפצוף [עוד]. איזה מסר אני פשוט לא מקבל? נקודה ומקף. מה זה מייצג? [תלמיד] א '>> [מלאן] אולי. זה יכול להיות גם E ואחרי ט במילים אחרות, קוד מורס, למרות שהוא ממנף את העיקרון הזה של אופטימיזציה מקרה הפינה, זה לא להשאיל את עוצמה decodability המיידי. כלומר, האדם ששומע או מקבל נקודות וקווים אלה יש להבין איכשהו שבה הפסקות הן בין אותיות, כי אם אתה לא יודע איפה ההפסקות האלה, אתה עלול לבלבל לאי.טי. או להיפך. אז מה אפשר לעשות? בקוד מורס שאתה יכול פשוט להשהות בין כל אחד מהמכתבים. אך נעצר לרגע הוא סוג של סתירה לכל העניין של זירוז דברים. אז מה אם במקום זה בא עם קוד שבו לא היה המצב הגרוע הזה כאשר E היא קידומת, למשל, של - במילים אחרות, אם אנחנו יכולים לוודא שהדפוסים עדיין קצרים לאותיות הפופולריות ארוך לאותיות פחות הפופולריות, אבל אין בלבול אפשרי? אדם בשם של האפמן לפני שנים המציא שיטה זו נקראת קידוד האפמן כי למעשה ממנף את אחד ממבני הנתונים שאנחנו מבלים קצת זמן מדברים על בשבוע האחרון, זה של עצים, עצים בינאריים במיוחד - משמעות עץ בינארי שאין לו יותר מ 2 ילדים. יש אולי ילד שמאלי, אולי ילד נכון, וזהו. אז תניח רק לצורך הדיון שמישהו רוצה לשלוח הודעה שנראה כמו זה. זאת שטות גמורה אבל זה מורכב מכל, ארוחת בוקר, Cs, DS, וEs. ואם אתה ממש לספור את כל כ, ארוחת בוקר, Cs, DS, וEs ואז לחלק במספר הכולל של אותיות, התרשים הקטן הזה כאן, אומר כי 45% מהמכתבים הם אסתר, 20% הם כ, 10% ארוחת בוקר, וכך הלאה. אז במילים אחרות, תניח שהמחרוזת צוטטה שם רק מסר כלשהו שברצונך לשלוח. זה קורה להיות שטויות רק כדי שנוכל להשתמש בו כמספר אותיות ככל האפשר, אבל זה אכן המקרה שהדואר נשאר פופולרי ביותר, ו-B ו-C הם הפחות פופולרי, לפחות של 5 אותיות אלה של האלפבית. אז איך אנחנו יכולים ללכת על זה שהגיע עם קידוד, קידוד בינארי, דפוס של 0s ו 1s לכל אחד מהמכתבים האלה בצורה כזאת, כי E היא דפוס קצר ואולי B ו-C הם דפוסים מעט ארוכים יותר, שוב, הרעיון הוא שאנחנו רוצים להשתמש פחות סיביים רוב הזמן ועוד דברים רק פעם בכמה זמן. לדברי האפמן קידוד, אתה יכול ליצור יער של עצים. יש סוג של קו פה סיפור שכרוך בעצים וגם בתהליך של בנייתם. בואו נתחיל. אני מציע לך להתחיל עם יער זה, כביכול, של 5 עצים, כל אחד מהם הוא עץ די טיפש. העץ מורכב מסתם צומת אחת, כפי שמיוצגת כאן על ידי המעגל. אז כל אחד מהדברים האלה יכול להיות struct C ובתוך struct C עשויה להיות לצוף מייצג את ספירת התדירות ואז אולי char המייצג את המכתב. אז תחשוב על צומת האלה כסתם struct C ישן, אבל, לעת עתה, ברמה גבוהה יותר. זהו יער של עצים 5, כל אחד שיש צומת אחת בלבד. מה האפמן המוצע הוא שאנחנו מתחילים לשלב העצים האלה שיש את ספירת השכיחות הקטנה ביותר לעצים גדולים מעט יותר עד לחיבור לצומת שורש חדשה. אז בין האותיות כאן, שים לב כי לנוחיות שאמיין אותם משמאל לימין, למרות שזה לא הכרחי, ושים לב שהבלוטות הקטנות ביותר כיום 10% ו 10%. אז האפמן הציע שלמזג 2 הבלוטות הקטנות האלה לתוך עץ חדש על ידי החדרת צומת הורה חדשה ולאחר מכן לתת ההורה שילד שמאלי וימני ילד בי B הוא שרירותי השמאל ו-C הוא שרירותי הנכון. ואז האפמן עוד מוצע, כי בואו עכשיו רק נחשוב על הילד השמאלי באחד מהעצים האלה תמיד כפי שמיוצגים על ידי 0 והילד צודק תמיד כפי שמיוצג על ידי המספר 1. זה לא משנה אם אתה להעיף אותם, כל עוד אתה עקבי. אז עכשיו יש לנו ארבעה עצים ביער הזה. ואני אומר כי עכשיו 4 עץ מהשמאל - וזה לא כל כך הרבה עץ, במובן זה שהוא גדל בדרך זו, זה יותר כמו עץ ​​משפחה שבו עכשיו 0.2 הוא סוג של ההורה של שני ילדים - מבחין כי שבהורה אנחנו נמשכים 0.2. אנחנו הוספנו את ספירת השכיחות של שני ילדים ונתנו את הצומת החדשה הסכום הכולל. אז עכשיו אנחנו פשוט לחזור על תהליך זה. מצא את שני צומת הקטנים ביותר ואז תחבר אותם לעץ חדש ואז לחזור על התהליך עוד יותר. כרגע יש לנו כמה מועמדים, 20%, 15%, ו 20% נוספים. במקרה זה, יש לנו לשבור את העניבה. אנחנו יכולים לעשות את זה באופן שרירותי. אנחנו צריכים פשוט לעשות את זה באופן עקבי. במקרה זה, אני שרירותי ללכת עם האחד בצד השמאל, ואני עכשיו למזג 20% ושל 15% שינתנו לי הורה חדש בשם 35%, ילד ששמאל הוא 0, שזכות ילד הוא 1, ועכשיו יש לנו רק שלושה עצים ביער. אתה אולי יכול לראות לאן זה הולך. אם אנחנו חוזרים על זה עוד כמה פעמים, אנחנו הולכים להיות רק עץ אחד גדול, שכל קצוות מסומנים עם 0s ו 1s. בואו נעשה את זה שוב. 35% הם שורשו של העץ. 20% ו 45%, ולכן אנחנו הולכים למיזוג של 35% ו 20%. עכשיו יש לנו העץ הזה כאן. אנו מוסיפים אלה יחד, יש לנו 55%. עכשיו יש רק שני עצים ביער. אנחנו עושים את זה פעם אחת אחרונה, ואני מקווה מתמטי כל התדרים להוסיף עד כי הם צריכים מאז שמחושבים אותם מהרגע הראשון להוסיף עד 100%. ועכשיו יש לנו עץ אחד. אז זה עץ האפמן קידוד. זה סוג של לקח זמן להגיע לשם באופן מילולי, אבל המציאות היא שעם ללולאה או עם פונקציה רקורסיבית, אתה יכול לבנות את הדבר הזה די מהר. אז עכשיו יש לנו צומת חדשה אחד, וכל צומת הפנימיים הללו malloc'd, ככל הנראה, לאורך כל הדרך. אז עכשיו בחלק העליון של העץ הזה יש לנו 100%, אבל עכשיו שמנו לב שיש לנו דרך מזה-הורי סבים גדולים חדשים גדולים לכל כמות של נכדי רבה הגדולות כל הדרך בתחתית, לכל העלים. מה אנחנו הולכים לעשות עכשיו הוא מציע כי על מנת לייצג את אות E, אנחנו פשוט נשתמש במספר 1. למה? כי אם אנחנו חוצים את העץ הזה מהשורש הסופי עד לעלה הידוע כדואר, אנו עוקבים רק קצה אחד, הקצה הימני, וזה כמובן שכותרת ליום 1 בצד ימין למעלה. אז מה שמשתמע כאן לאפמן היה שהקידוד של E בינארי שסתם יהיה 1. וזה די לא יעיל. באמת אינך יכול לצמצם יותר מזה. לעומת זאת, הולך להיות מיוצגים, אם אתה מבין את ההיגיון, לפי מה דפוס של ביטים במקום? 01. אז כדי להגיע ל, אנחנו מתחילים בשורש וללכת שמאלה ואז ימינה, מה שאומר שאנחנו אחרי 0 ואז 1. אז תייצג את המכתב עם הדפוס 0 ו 1. ועכשיו שם לב כבר יש לנו רכוש של decodability המיידי שלא היה לנו בקוד מורס. למרות ששניהם של דפוסים אלה הם די קצרים - E היא 1 ביט, הוא 2 ביטים - שם לב שהם לא יכולים להיות מבולבלים זה או אחר, כי אם אתה רואה 1 זה חייב להיות E, אם אתה רואה 0 אז 1 זה חייב להיות ברור א בדומה לכך, מה D? 001. מה זה C? 0001. ומה הוא B? 0000. ושוב, כי כל המכתבים חשובים לנו הם על העלים ואף אחד מהם הם סוג של מתווכים בדרך משורש ועד עלים, אין סיכון של מצרף קידודים השונים 2 אותיות משום שכל אלה הם דפוסים הסיביים דטרמיניסטיים. 0000 תמיד יהיו B. אין צומת איפשהו באמצע, כי אתה עלול לבלבל את אות אחת לשנייה. אז מה המשמעות כאן? המכתב הפופולרי ביותר - במקרה זה אי - קבל את הקידוד הקצר ביותר, קבל את הקידוד הקצר הבא, ו-B ו-C, שכבר ידע מהסוג היו מקבל-go של הפחות הפופולרי בתדירות של 10% כל אחד, הם מקבלים את הקידוד הארוך ביותר. ואז מה זה אומר הוא שאם אתה רוצה לשלוח הודעה זה דחוס באינטרנט או בדואר אלקטרוני או כ, במקום להשתמש ASCII הרגיל, תוכל לשלוח הודעה מוצפנת האפמן שלפיו אם ברצונך לשלוח מכתב הדואר, שתשלח רק קצת בודדה. אם ברצונך לשלוח, אתה שולח 2 ביטים, 01, במקום לשלוח 8 סיביים אחרי 8 ביטים נוספים ובעקבותיה 8 ביטים נוספים וכן הלאה. אבל יש תפס אותך כאן. זה לא מספיק רק לבנות את העץ הזה ואז להתחיל לשלוח מאליס לבוב הדפוס קצת קצר יותר, מחרוזת מASCII, משום שאליס יש גם להודיע ​​בוב של מה אם בוב הולך להיות מסוגל לקרוא את הודעתה הדחוסה? [תגובת תלמיד לא נשמע] >> מה זה? [תגובה בלתי נשמעת תלמיד] >> ממה הוא העץ. או אפילו יותר ספציפי, מה קידודים אלה, במיוחד מאחר בסיפור הזה עשינו שיחת שיפוט בנקודה אחת. זכור שיש לנו לבחור באופן שרירותי בין 2 צומת השונים 20%? אז זה לא המקרה שבוב, הנמען, יכול פשוט לשחזר את העץ בעצמו כי אולי הוא ייצור את העץ אי פעם כל כך שונה במעט מאליס. יתר על כן, בוב אפילו לא יודע מה היא ההודעה המקורית כי הדבר היחיד שאליס שולחת לו, כמובן, הוא המסר הדחוס. אז תופס עם דחיסה כמו זה שכן, אליס יכולה לחסוך המון חתיכות על ידי שליחת 1 עבור E ו 01 ולכן הלאה, אבל גם לה יש להודיע ​​לבוב מה הוא המיפוי בין אותיות וחתיכות בגלל שהם לא יכולים להסתמך על בהירות רק ASCII יותר אם אנחנו לא משתמשים בתווי ASCII. אז או שהיא יכולה לשלוח אותו לעץ איכשהו - לכתוב אותו, לאחסן אותו כנתונים בינאריים או משהו כזה - או פשוט לשלוח לו גיליון קצת לרמות, קובץ Excel, המציג את המיפויים. אז היעילות של דחיסה באמת מניחה שההודעות שאתה שולח הם די גדולים, לפחות בגודל בינוני, כי אם אתה שולח הודעת סופר קצרה, אם אתה רק רוצה לשלוח המסר רע, שקורה להיות מילה שאנחנו יכולים לאיית כאן, B--D, אז כנראה שאתה הולך להשתמש בפחות סיבי, אבל המלכוד הוא אם יש לך גם להודיע ​​מה בוב העץ הוא או מה קידודים אלה, אתה הולך כנראה כדי להכריע את כל החסכונות שיש דברים דחוסים מלכתחילה. אז זה באמת יכול להיות מקרה שאם אתה מנסה לדחוס אפילו עם משהו כמו פורמטי zip או קובץ אתה יכול להיות מוכר עם - קבצים די קטנים, קבצים אפילו ריקים - לעתים קבצים אלה עשויים לקבל יותר ולא קטנים יותר. אבל באופן מציאותי, זה קורה רק לגודל קובץ קטן, כך שזה לא הולך להפוך את קובץ ג'יגה יהיה 2 ג'יגה; אנחנו באמת מדברים בתים, או רק כמה ק"ג. חלק מהתוכניות כגון zip הן חכמות מספיק כדי להבין את זה, "אתה הולך לבלות עוד חתיכות דחיסה זה." "תן לי לא מפריע לך לדחוס אותו בכלל". אז זה הוא רק דרך אחת אז של דחיסת פורמט טקסט. אנחנו יכולים ליישם משהו כזה בג לדוגמה, הנה כיצד תוכל לייצג צומת בעץ הזה שם יש לנו char לסמל, ערך צף לתדר, וכפי שראינו במבנים האחרים שלנו הנתונים, 2 מצביעים, 1 עד ילד השמאל, 1 בצד ימין, או של מה שיכול להיות NULL, אבל אם לא, זה מתייחס לילד שמאלי וילד נכון. זוהי אפוא האפמן קידוד, וזו אחת דרכים שאתה יכול ללכת על דחיסת מידע, וזה בהחלט אחד מקל ביותר ליישום בהקשר של, יניח, מבני הנתונים בשבוע שעבר, למרות שאפילו אלגוריתמים מתוחכמים יותר קיימים שיכול לעשות מוטציות אפילו מתוחכמות יותר של הנתונים שלך. כל שאלות ואז על עצים, עצים בינאריים, או דחיסה של טקסט? [תלמיד] האם יש עמימות, כמו אם [לא ברור] פיצול 01, אז 011 יהיו מעורפל, נכון? [לא ברור] >> שאלה טובה. עמימות. הרשה לי לסכם, על ידי פנייה לתמונה הזאת כאן. מאחר שהתווים אתה הדחיסה, את הייצוגים של, על פי הגדרה של אלגוריתם זה תמיד יישארו את העלים, יותר לא תוכל להשתמש באותו הדפוס של ביטים בטעות לקידומת של מכתבים מרובים. אז במילים אחרות, אתה מודאג, זה נשמע כמו, עמימות הנובעת לפי 001 יכול להיות ההתחלה של B או C או ההתחלה של משהו כזה. אבל זה לא יכול להיות מקרה, בגלל הודעה שכל האותיות האלפבית אנחנו קידוד הם על העלים. העמימות יכולה לנבוע רק, כמו במקרה של קוד מורס, אם, למשל, C היה איפשהו לאורך הדרך מהשורש עד B. [תלמיד] ימני. אז במקרה כזה, אומר יש 2 עלים. >> יגיד יש - יגיד את זה שוב. [תלמיד] יגיד יש 2 עלים, F ו-G, ואז G - >> בסדר. אבל זה לא יכול. עצמו לא היה יכול לי F עלים ו-G, כי מכתבים אלה F ו-G היינו משאיר את עצמם להיות במקום בצד השמאל של B או זכותו של א ' אז בהגדרה, הם חייבים להיות בעלים. אחרת, אתה בדיוק נכון, יש לנו לא פתר את הבעיה שניצבת בפני קוד מורס. שאלה טובה. שאלות אחרות? בסדר. רעיון זה של ביטים, מתברר שהיינו לנו כוח לכל אורך הדרך שאנחנו כבר לא בשימוש בפועל כשזה הגיע למניפולצית 0s ו 1s אלה. שאלנו על זה באחת מהסדרות הבעייתיות הראשונות: כלומר, איך אתה הולך על המרת אותיות רישיות לאותיות קטנות או להיפך? או, באופן קונקרטי יותר, אחד מpsets הראשון הללו בקש כמה חתיכות אתה באמת נכנסת צריך להעיף כדי לשנות לאותיות קטנות או להיפך? הנה תזכורת קצרה על מה 65 ו 97 נראים כמו בינארי. וגם אם שאלה שקצת דהתה בזיכרון שלך, אתה יכול לראות כאן שוב שכמה ביטים צריכים להיות התהפך כדי לשנות את ההון לאותיות קטנות? רק אחד. הם נבדלים רק במיקום אחד, קצת השלישי מהשמאל. בעוד שיש לו 010, קטן יש 011. אז איכשהו, אנחנו צריכים רק כדי להיות מסוגלים להעיף את החלק הזה, ואז אנחנו יכולים לנצל או אותיות קטנות. אנחנו עשינו את זה בעבר על ידי שימוש בפועל אם תנאים ובדיקה אם האות היא בין הון וההון Z, אז יציאות כמו - + 26 או משהו כזה. אתה כנראה עשית שינוי חשבון לאותיות האלפבית. אבל מה אם היינו יכול פשוט לדפדף קצת בודד? איך אתה יכול ללכת על לקיחה שווה של ייט אחד של ביטים, כך 8 סיביים כמו 01000001 01100001 ו? אם היה לך דפוסים אלה של ביטים, איך אנחנו יכולים ללכת על שינוי רק אחד מהם? מה אם אנחנו מציגים בצהוב כאן דפוס של ביטים אחרים? אם אני עושה את 0s השרוך ​​הצהוב השלם למעט בכלל שאני רוצה לשנות ולאחר מכן אני מציג את מפעיל חדש המכונה מפעיל סיבי האופרטור - סיבי האופרטור במובן זה שהיא פועל על ביטים בודדים, לא בכל בתים או ארבעה בתים בבת אחת. סרגל זה אנכי יש בצהוב עולה כי מה אם תיקחו את הייצוג של הון וסיבי האופרטור או זה עם הרצף של ביטים הצהובים? במילים אחרות, חושב בחזרה לדיון של ביטויים בוליאניים בסריטות שלנו ולאחר מכן בג עושה וליאני או אומר שזה יהיה נכון, או שהדבר הראשון שחייב להיות נכון או הדבר השני חייב להיות אמיתי או ששניהם צריכים להיות אמיתי, ואז הפלט המתקבל הוא שהיא אמיתית. במקרה זה כאן, על מה אנחנו מקבלים אם ניקח 0 "או" אד עם 0? שקר או שקר? עדיין אין זה אמיתי, ולכן קטן נשאר כצפוי. מה אם במקום שאנו עושים 1 או 0? זה עכשיו נשאר 1, אבל שים לב למה שעומד להתרחש כאן. אם נתחיל בבירה ואנחנו ממשיכים "או" ביטים הבודדים שלה כמו שאנחנו עושים כאן, 0 או 1 הצהוב נותנים לנו את מה שירד לכאן? זה נותן לנו 1. למעשה, יניח שאנו לא יודעים מה הגרסה של האותיות הגדולה קטן הייתה בפועל. בואו נלך לעשות את זה. תן לי להזיז את זה בחזרה לכאן. בואו נעשה זאת שוב. 0 או 0 נותנים לי 0. 1 או 0 נותן לי 1. 0 או 1 נותן לי 1. 0 או 0 נותנים לי 0. הבא בתור היא 0, הבא הוא 0, הבא הוא 0. 1 או 0 נותן לי 1. ולכן גם אם אנו לא יודעים מראש מה אותיות קטנות היה, פשוט על ידי "או" ing עם דפוס זה של ביטים שאנחנו כבר הוצגנו כאן בצהוב, אתה יכול אותיות קטנה הון על ידי flipping את הקטע הזה. אנחנו משתמשים בכך לפני שבועות ביטוי: רפרף קצת. איך אתה בעצם עושה את זה באמצעות תכנות? אתה משתמש במה שנקרא מסכה, רצף של ביטים, בדרך כי במקרה זה פשוט קורה כל כך להיראות כמו המספר הזה כאן, ואז אתה "או" את זה ביחד באמצעות מפעיל C חדש זה, לא | |, אתה משתמש באחת | והיית ממש מקבל תשובה זה כאן כי למה? זה מקום 1s, 2s מקום, 16s 4s, 8s, 32s. אז מתברר שאם אתה לוקח את אות גדולה וסיבי האופרטור או אותו עם 32 השלמים, בגלל 32 מספרים השלמים, כאשר אתה מסתכל על זה כביטים, נראה כך, זה אומר שאתה יכול להעיף קצת שאתה באמת רוצה. ובאופן דומה - ואנחנו מסתכלים על קוד ברגע - אניח שאנחנו רוצים ללכת לכיוון השני. איך אתה הולך מאותיות קטנה לבירה? באיזה קטע זה צריך להשתנות? זה אותו אחד. אנחנו רוצים לשנות את זה קצת שלישי מ1 עד 0. ואיך ניתן ללכת על עושה את זה? איך לכבות קצת? עם מה דפוס של ביטים יכולנו לכבות קצת? מה אם מיון של מרחב זה המסכה? בעוד שבעבר, עשה 0s המסכה הצהובה השלם פרט לביט אחד שאנחנו רוצים להפעיל, מה אם הפעם, אנו עושים את כל המסכה 1s למעט קצת שאנחנו רוצים לכבות ולאחר מכן להשתמש במה מפעיל? מה אם "ו" דברים? בואו נעיף מבט. אם עכשיו להעיף לזה, תניח ששוב אני יוצר מסכה זה כל 1s מלבד בכלל שאני רוצה לכבות ואז, במקום "או" המספרים הלבנים עד למעלה עם מספרים הצהובים כאן למטה, מה אם אני במקום "וגם" אותם יחד? זה נקרא סיבי האופרטור ו. מבחינה הגיונית, זה אותו הדבר כמו בוליאני ו. זה נותן לי 0 & 1 הם 0. אז שקר ואמת הוא שקר. אמת לאמיתה היא נכונה. והנה קסם: אמת ושקר הוא שקר עכשיו, אז אנחנו כבר כיבינו את הקטע הזה. ועכשיו שאר הסיפור הוא קצת פשוט. כי שאר המסכה הוא 1s, זה לא משנה מה המספרים הם בלבן. כאשר אתה "ו" משהו עם אמיתי, אתה לא הולך לשנות את הערך שלו. אם זה נכון, הוא יישאר נכון. אם זה היה נכון, הוא יישאר שקר. אבל הקסם קורה כאשר אתה לוקח משהו שהיה נכון ואז אתה "ו" אותו עם שקר. יש לזה אפקט של כיבוי קצת ש. אז לא ברור מספיק לשם. בואו באמת מסתכלים על קוד מסוים, שבאמת עשוי להיראות אפילו יותר מסתורי, אבל בואו נסתכל כאן בtolower. אם אני מסתכל על tolower, הולך מהון לאותיות קטנות, בואו נראים כיצד תוכל ליישם תכנית זו. הנה ראשי, וזה לא לוקח שום טיעוני שורת פקודה. הריני מצהיר ג אופי למכתב שהמשתמש עומד להקליד פנימה אז אני משתמש עשה מוכר תוך לולאה רק לוודא שהמשתמש בהחלט נותן לי הון או B או C. .. Z, ולכן הם נותנים לי משהו בין וז' ועכשיו מה אני עושה פה? אני "או" זה עם ing 0x20, אבל זה בעצם אותו הדבר כמו - ואנחנו נחזור לזה ברגע - 32. אז שוב, 32 הם זה דפוס של ביטים כאן. למה אנחנו יודעים את זה? רק ייזכר שבוע 0. זה מקום 1s, 2s המקום, 4s, 8s, 16s, 32s המקום. אז מספר צהוב זה קורה להיות 32. אז אני יכול לקחת את מכתב כמו char כאן, סיבי האופרטור "או" אותו עם פשוטו כמשמעו, את המספר 32, ומה יוצא לי בחזרה? הגרסה הקטנה של char. לפני רגע, אם כי, אני בטאתי זאת בסימון בסיס אחר. מה זה מייצג? >> [תלמיד] הקסדצימאלי. [מלאן] זה קורה לייצג הקסדצימלי. אנחנו לא דברנו על הקסדצימלי כל כך הרבה, אבל זה בעצם נוח במקרים כאלה. למרות שזה נראה יותר מורכב ולמרות שזה נראה כמו 20 ולא 32, מתברר שהקסדצימלי הוא למעשה סימון סופר נוח כי בהקסדצימלי כל ספרה לאחר 0x - וזה לא אומר כלום; זה רק אנושית שאומר אמנה כאן מגיע מספר הקסדצימלי - כל אחד מאלה ספרות, 2 ואז 0, בעצמם יכולים להיות מיוצגים עם בדיוק 4 ביטים. אז אם אנחנו עושים את זה, תן לי לפתוח את עורך טקסט כאן - מוזר השלמה אוטומטית - אם אנחנו עושים עורך טקסט קטן כאן, 0x20 מספר המשמעות כאן הן 4 ביטים, הנה עוד 4 חתיכות. בואו נעשה את 4 ביטים הימניים ביותר הראשון. 0 כאשר מיוצג עם 4 חתיכות הן מה? סופר קל. פשוט כל 0s. אז 4 חתיכות כ0s. איך אתה מייצג 2? זה היה זמן מאז שעשינו את זה, אבל זה 0100. אז זה מקום 1s, זה מקום 2s, ואז זה לא משנה מה המקומות אחרים. במילים אחרות, בהקסדצימלי אפשר לומר 0x20, אבל אם אתה חושב אז על מה הוא 2 וכיצד הוא מיוצג בינארית, מה הם 0 וכיצד הוא מיוצג בינארית, את התשובות לשאלות האלה הן זה וזה, בהתאמה. אז 0x20 קורים לייצג את הדפוס הזה של 8 סיביים, וזה בדיוק המסכה שאנחנו רוצים. אז זה לרגע רק תרגיל אינטלקטואלי, אבל המציאות היא בקוד זה בדרך כלל נפוץ יותר לכתוב קבועים כמו זה בקסדצימלי כי אז המתכנת יכול בקלות יחסית, גם אם זה דורש קצת נייר ועיפרון, להבין מה דפוס שביטים הוא כי אתה לא יכול פשוט להביע 0s ו 1s בדרך כלל בקוד. אתה לא יכול ללכת 00010 וכן הלאה. אתה צריך לבחור את הסימונים עשרוניים או הקסדצימאלי או אוקטלי או אחרים. רוב האנשים נוטים לבחור הקסדצימלי פשוט כך שכל ספרה מייצגת 4 ביטים ואתה יכול לעשות את מתמטיקה מהירה זה. ואני אניף את היד שלי בtoupper, שזה כמעט אותו הדבר, זה נראה כמעט זהה. Toupper קורה לא להשתמש או מפעיל אלא הבחור הזה וdf. מה df מייצג? df? מישהו? >> [תלמיד] 255. 255? לא 255. זה יהיה FF. נשאיר את זה כתרגיל קטן. אבל אם אתה עובר מ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ואז מה בא אחרי 9? אנחנו סוג של מספרות אחרי נקודה עשרוניות, אבל בהקסדצימלי מה בא אחרי 9? [תלמיד]. >> אז, ב, ג, ד. אתה יכול להבין משם מה דפוס של ביטי ד מייצג למעשה. ואם תעשו את החשבון, נראה שהמסכה אתה בסופו לחזור היא זהה לזו. זה f, כל 1s, וזה ד. אז df מייצג מסכה ש. בסדר. ולבסוף, לא לעשות דברי קול סופר, סופר טכני, אבל אניח שאנחנו רוצים לכתוב תכנית שעושה את זה. תן לי ללכת קדימה ולעשות בינארי, שהיא תכנית בקובץ בשם binary.c. ועכשיו תן לי לרוץ בינארי ולתת לי מספר שלם שאינם שלילי. בואו נתחיל קל והקלד 0. זה עכשיו הוא תכנית שמדפיסה את מספר שלם בייצוג בינארי שלה. אז אם אני משחק במשחק הזה שוב ולהקליד רק 1, אני צריך לקבל ייצוג 32-bit של 1. אם אני עושה את זה שוב עם 2, אני צריך לקבל את זה. אם אני עושה 7, אני צריך לקבל כמה 1s בסוף וכן הלאה. מתברר שאני מזכיר זאת משום שעם פעילות סיבית האופרטור אתה באמת יכול לעשות דבר אחד אחר גם כן. באפשרותך ליצור המסיכות האלה באופן דינמי. תסתכל על הדוגמא האחרונה הזה הכרוך בפעולות סיביות האופרטור. הנה החלק הראשון של הקוד, מנחה את המשתמש למספר, והוא מתעקש שאתה נותן לי מספר שלם שאינם שלילי. אז זה סוג של חומר בית הספר ישן. אבל הנה משהו שגם די מעניין. איך אני הולך על הדפסת מספר בינארי? אני לחזר ראשון ממה למה? מה הגודל של int בדרך כלל, לפחות במכשיר? >> [תלמיד] 4. זה 4. אז 4 * 8 הוא 32 - 1 הוא 31. אז אם אני מתחיל לספור מיום 31, שמייצג, מתברר, רק מושגית, קצת 31 או קצת סדר הגבוה ביותר, שהוא הבחור הזה כאן, בעוד שזה הולך להיות 0 סיביים. אז זה קצת 01 קצת ... 31. אז מה הקוד הזה עושה? שים לב זה ללולאה, למרות שזה נראה מסתורי, רק iterating מ 31 עד 0. זה הכל. אז עכשיו חלק המעניין חייב להיות ב5 שורות אלה כאן. שימו לב שבשורה הריני מצהיר מסכה משתנית בשם כדי להיות עקבי עם הסיפור של המספרים הצהובים האלה שלנו. ואז מה זה עושה? זהו עוד מפעיל סיבי האופרטור שלא ראה לפני כן, סביר להניח. זה מפעיל משמרת שמאל. מפעיל זה עושה את זה. כאן הוא המספר 1, ואם אתה עושה אותי השאיר במשמרות, משמרת שמאל, מה אתה חושב שיש לו את ההשפעה שעושה ל1 פרט? פשוטו כמשמעו, עובר מעליו. אז אם המספר 1 הוא מה יש לך בצד השמאל ואתה מתחיל על ידי אתחול אני עד 31, מה שהולך לעשות? זה הולך לקחת מספר 1 זה ולהעביר אותו 31 מקומות לכאן. וכי ודאי שאין ספרות אחרת שעומדים מאחוריו, אלה יהיו ברירת המחדל להיות מוחלפים עם 0s. אז אתה תתחיל עם המספר 1, שכמובן נראה כך - ונתן לי לצייר את זה כאן במרכז. ואז כפי שאתה תעביר את החפצים מהשמאל, הבחור הזה למעשה הולך בדרך זו. אבל ברגע שאתה עושה את זה, 0 מתמלא פנימה אם להעביר אותו בפעם שנייה, זה הולך בדרך זו ואחרת 0 מתמלאת פנימה אתה לעבור את זה שוב ואז 0 אחר מתמלא פנימה אז אם אתה עושה את הדבר הזה של 1 << i 31 מקומות, אתה בסופו של דבר מקבל מסיכה שהם 32 תווים ארוכים, 1 השמאלי ביותר שבם הוא 1, כל שאר שהם 0. ומתברר, כהערת אגב, הסטת מספר לשמאל כזה גם במקרה, ולעתים בנוחות, יש השפעה של מה שעושה למספר זה? >> [תלמיד] הכפלתו. הכפלה זה כי כל אחת מהעמודות - מקום 1s, 2s המקום, מקום 4s, מקום 8s, מקום 16s - פזור בכל ההכפלה כמו שאתה הולך לצד השמאל. או לייתר דיוק, כשזז 1s אתה הולך בסופו של הכפלת ערכו של המספר. אתה יכול בסופו של דבר עושה תמורות מעניינות של ספרות על ידי העברה כל מה שמעל בדרך זו על ידי חזק של 2. אז איך זה עובד? אז זה נותן לי מסכה זה כל 0s למעט 1 בדיוק במקום שאני רוצה את זה, ולאחר מכן בביטוי זה, אשר נגנב מtoupper.c, אומר פשוט לקחת את מספר n שמשתמש הקליד ב, "ו" זה עם זה מסכה, ומה אתה הולך לקבל? אתה הולך לקבל 1 אם יש 1 שבמיקום מסכות, או שאתה הולך לקבל 0 אם אין. ולכן כל התכנית הזאת זה בצורה יעילה היא שיש לו לולאה, וזה יוצר מסיכה עם 1 כאן, אז 1 לכאן, אז 1 לכאן, והוא משתמש בטריק הזה סיבי האופרטור ולומר הוא שיש 1 ביט בקלט של המשתמש כאן? האם יש 1 ביט בקלט של המשתמש כאן? ואם כן, פשוטו כמשמעו, להדפיס 1, אחר להדפיס 0. אנחנו עושים את זה עם ints רק בגלל שזה למה שאנחנו עושים 32 סיביים במקום 8, אבל מה שהצגנו אז זה סיבי האופרטור AND, OR סיבי האופרטור הזה, ומפעיל זה שמאל משמרת, שהם לא לעתים קרובות מאוד מועילים, אבל מסתבר שהם יכולים להיות. למעשה, אם היית מייצג משהו כמו מערך של Booleans רק כדי לייצג אמת או שקר, תניח שאתה רוצה לעקוב אחר האם או לא חדר מלא של 300 סטודנטים הוא הווה, אתה יכול להצהיר על מערך בגודל 300 מהסוג bool כך שאתה מקבל 300 bools, ואתה יכול להגדיר כל לנכון אם מישהו כאן ושקר אחר. למה הוא ייצוג שבמבנה הנתונים יעילים? מה רע בעיצוב של מבנה נתונים, מערך של 300 bools? מה הוא bool, למעשה, מתחת למכסת המנוע? גם זה משהו שלא יכול להיות מוכר. מתברר שאין bool. זכור שאנחנו איכשהו נוצרנו שעם קובץ cs50.h, אשר עצמו כולל bool הסטנדרטי. C היא סוג של טמטום, אם כי, כשזה מגיע לbool. היא משתמשת 8 סיבית לייצג כל bool, שהוא לחלוטין בזבזני כי ברור, כמה חתיכות אתה צריך לייצג bool? רק 1. אז מתברר שאם עכשיו יש לך את היכולת במפעילים סיביים האופרטור כדי לתפעל פיסות בודדות אפילו בchar, אפילו בבית אחד, מתברר שאפשר להקטין את הזיכרון הנדרש כדי לייצג משהו טיפשי כמו שמבנה נתוני הנוכחות המנוסח בפקטור של 8. במקום להשתמש בשמונת ביטים לייצג אמת או שקר, אתה יכול, פשוטו כמשמעו, להשתמש באחד באמצעות בית אחד לכל שמונה תלמידים בכיתה וtoggling 0-1 פיסות בודדות על ידי שימוש בסוגים אלה של תרגילים ברמה הנמוכה. זה באמת לשים קץ לאנרגיה. האם יש שאלות כלשהן לגבי פעילות סיבית האופרטור? כן. >> [תלמיד] האם יש מפעיל בלעדי או? כן. יש מפעיל בלעדי או שנראה כמו זה, ^, סמל הגזר, מה שאומר רק הדבר הראשון או הדבר השני יכול להיות 1 עבור הפלט להיות 1. יש גם לא, ~, שיאפשר לך להפוך 0 עד לכן 1 או להיפך. ויש גם מפעיל זכות משמרת, >>, שהוא היפוכו של זה שראינו. בסדר. בואו ניקח את הדברים עכשיו לרמה גבוהה יותר. התחלנו בלדבר על טקסט ולאחר מכן לדחוס אותו ומייצג את הטקסט עם מספרים פחות ביטים; דברנו קצת על איך אנחנו יכולים להתחיל עכשיו מניפולצית דברים ברמה סיבית האופרטור. עכשיו בואו להתקרב בחזרה 10,000 רגל לייצוג דברים יותר מורכבים, כמו גרפיקה. כאן יש לנו דגל של גרמניה, הנה יש לנו אחת מצרפת. אלה יכולים להיות מיוצגים בפורמטים של קבצים, היית יודעים - GIF, למשל. אם אי פעם ראה תמונה באינטרנט שמסתיים ב. Gif, זו תבנית מחלף גרפיקה. שני הדגלים האלה כאן סוג של להשאיל את עצמם לדחיסה למה אולי סיבה ברורה? >> [תגובת תלמיד לא נשמעה] יש הרבה חזרות, נכון? על מנת לשלוח הדגל של גרמניה, לחשוב על זה כתמונה על המסך חזרה בימי Scratch. אתם אולי זוכרים שיש פיקסלים בודדים או נקודות שמרכיבות את תמונה. יש כל שורה של נקודות שחורות ועוד שורה השלמה של נקודות שחורות. יש חבורה של שורות של נקודות שחורות שלא יכל לראות אם אנחנו באמת ראייה, הרבה אוהבים כשהתמקדנו בפניו של רוב בפוטושופ. ברגע שיש לנו יותר ויותר עמוקים ועמוק יותר לתוך התמונה, אתה התחלת לראות pixelation, כל הריבועים שמרכיבים את עיינותיו במקרה זה. עסקה גם כאן. אם שטסנו לא מעט, היית רואה נקודות בודדות. ובכן, זה סוג של בזבוז של ביטים. אם שלישי של הדגל הוא שחור ושלישי של הדגל הוא צהוב וכן הלאה, למה אנחנו לא יכולים איכשהו לדחוס את הדגל הזה? ואפילו הדגל הצרפתי יכול להיות דחוס למרות שהדפוס הוא קצת שונה. מתברר תבנית קובץ GIF היא פורמט דחיסה ללא אובדן, מה שאומר שאתה יכול לקחת את תמונה כמו הדגל הגרמני כאן, אתה יכול לזרוק הרבה הביטים שלה, מבלי להתפשר על איכות. זאת בניגוד למשהו כמו תמונות JPEG, עם שרובנו כנראה יותר מוכרים. פייסבוק תמונות ופליקר תמונות וכמו כמעט תמיד נשמרים כתמונות JPEG כאשר הם נטענים, אבל תמונות JPEG היא lossy - פורמט שבו אתה זורק ביטים - lossy אבל אתה גם לזרוק איכות. ולכן אם אתה לדחוס תמונות עם Photoshop או להעלות אותם לפייסבוק או לקחת אותם בטלפון ממש מחורבן, אתה יודע שהתמונה מתחילה להיות מאוד מוכתם ומגורען, וזה בגלל שזה להיות דחוס על ידי המחשב או הטלפון פשוטו כמשמעו, על ידי זריקת מידע משם. אבל GIF הוא מדהים בכך שהוא יכול להשתמש בפחות סיבי מזה אולי כברירת מחדל מבלי לאבד את כל מידע. וזה בעצם עושה זאת באופן בא. במקום חנות בקבצים כמו BMP היית RGB משולש לשחור, שחור, שחור, שחור, שחור, שחור, שחור, שחור, שחור, שחור, שחור, שחור וכן הלאה, ולא, בפורמט GIF הולך להגיד, "שחור" ולאחר מכן, "חזור 100 פעמים", או משהו כזה. "שחור, חוזר 100 פעמים, שחורות, חזור 100 פעמים ..." "צהוב, לחזור 100 פעם." וכך זוכר, בעצם, הפיקסל השמאלי ביותר ולאחר מכן מקודד איכשהו הרעיון של חזרה פיקסל זה שוב ושוב. אז GIFs אז יכול לדחוס את עצמם בלי לאבד את כל מידע. אבל אם הייתי צריך לנחש, אם זה האלגוריתם שGIFs שימוש, איזה מהדגלים האלה, למרות שהם נראים זהים בגודל, הולך להיות קטן יותר כאשר נשמר בדיסק כקובץ GIF? >> [תלמיד] גרמניה. גרמניה הולכת להיות קטן יותר? למה? [סטודנטים] מכיוון שאתה חוזר עליו פעמים רבות, רבות אופקי ואז אתה חוזר בפעם אחרת. >> בדיוק. כי אנשים פשוט סוג של שהמציאו GIF החליטו באופן שרירותי שההחזרה תהיה למנף בצורה אופקית ולא רוחבי. יש הרבה יותר חזרות רוחביות כאן בדגל הגרמני מאשר בדגל הצרפתי. אז אם אנחנו בעצם פותחים את תיקייה בכונן הקשיח שלי, כי יש GIFs אלה, אתה ממש יכול לראות שהדגל הגרמני כאן הוא 2 ק"ג ואחד צרפתי הוא 4 ק"ג. זה קורה להיות צירוף מקרים, כי אחד הוא פעמים אחרות, אבל זה למעשה מקרה שהדגל הצרפתי הוא הרבה יותר גדול. למרות שאנחנו מדברים כאן על גרפיקה, אותם הרעיונות יכולים לחול על לא דברים כמו דגלים אלא תמונות שהם קצת יותר מורכבים. אם אתה לוקח את תמונה של תפוח, בטוח שיש הרבה כפילות שם, ולכן אנחנו יכולים איכשהו זוכרים שהרקע של ברירת המחדל הוא כחול ולא, כמו בתמונה הימנית מרמזת, צריך לזכור את צבעו של כל פיקסל בודד בתמונה זו. אז אנחנו יכולים לזרוק חתיכות משם מבלי לאבד מידע. התפוח עדיין נראה בדיוק אותו הדבר. בדוגמה זו כאן, ייתכן שתראה את מה שקורה בסרט. אלה מייצגים את סלילי סרטים ישנים תיכונים לפיה בתמונה העליונה יש יש לך נהיגת קרווני עבר בית ועץ. וכמו שאן מניעה העבר משמאל לימין, מה שכמובן לא משתנה? הבית הוא לא הולך לשום מקום, והעץ לא הולך לשום מקום. הדבר היחיד שזז הוא ואן במקרה זה. אז כרקע ללא שינוי מרמז, מה אתה יכול לעשות בסרטים הוא דומה פשוט משליך את המידע שאינו משתנה בין מסגרות. זה ידוע בדרך כלל דחיסת interframe שלפיו אם המסגרת הזאת נראית כמעט זהה לזה, בואו לא נטרח אחסון בדיסק כלשהו של המידע הזהה במסגרות אלה ביניים, בואו ננצל את מסגרות מפתח רק פעם בכמה זמן כי בעצם לאחסן מידע שredundantly בדיוק כמו שפיות קטנה לבדוק. לעומת זאת, גישה אחרת לדחיסת וידאו היא בדוגמה שנייה ונמוכה זה כאן, שם במקום חנות 30 מסגרות, למה שלא פשוט לאחסן 15 פריימים בשניים במקום זה? במקום סוג של הסרט זורם להפליא, בצורה מושלמת, זה עלול להיראות כאילו הוא מגמגם קצת, בית ספר קטן וזקן, אך ההשפעה נטו תהיה להשתמש ביטים הרבה פחות מאחר עלול להיות נחוץ. אז איפה זה משאיר אותנו אז? זה היה קצת בצד על איפה עוד אתה יכול ללכת עם דחיסה. למידע נוסף על זה, לקחת שיעור כמו CS175 כאן. הנה דוגמה נוספת בתוך וידאו. אם הדבורה היא דבר היחיד שנע, אתה באמת יכול לזרוק מידע במסגרות ביניים אלה בגלל הפרח והשמים ועלים אינם משתנים. אבל בואו עכשיו לשקול דבר אחד אחרון. ב 5 הדקות הבאות אנחנו משאירים מאחורי C לנצח בהרצאה? כן. לא בpsets, אם כי. הסיפור אחרון על C ואז אנחנו מגיעים לדברים מאוד סקסיים מעורב HTML ואינטרנט ולחזר הא. בסדר. הנה אנחנו מתחילים. זה המוטיבציה. מתברר כל הזמן הזה כאשר אנחנו כבר בכתיבת תוכניות שרצים קלאנג. וקלאנג, שאמרנו מאז השבוע הראשון פחות או יותר, לוקח את קוד מקור וממיר אותו לקוד יעד. זה לוקח C וממיר אותו ל0s ו 1s. אני כבר שוכב לך סוג של כמה שבועות, כי זה לא ממש פשוט כמו זה. יש בזה הרבה יותר קורה מתחת למכסת המנוע בעת הפעלת תכנית כמו קלאנג. למעשה, התהליך של הידור תכנית יכול באמת לסכם, כפי שזכור לכם מהסרטון של רוב על מהדרים, ל 4 השלבים הבאים: טרום עיבוד, עריכה עצם, הרכבה, וקישור. אבל אנחנו בכיתה ורוב האנשים בעולם בדרך כלל לסכם את כל השלבים הבאים כפשוט "הידור". אבל אם אנחנו מתחילים עם קוד מקור כזה, זוכר את זה הוא אולי תכנית C הפשוטה אנחנו כבר כתבנו עד כה, זוכרים שכשחברנו אותו בסופו של מצב כזה. אבל יש בעצם שלב ביניים, והצעדים האלה הם כדלקמן. ראשית יש את הדבר הזה בחלקו העליון של זה ורוב התוכניות שלנו, # כולל מה # אינה כולל תעשה לנו? זה די הרבה עותקים ומשחות את תוכן stdio.h לתוך הקובץ שלי כך שלמה? למה אכפת לי את התוכן של stdio.h? מה יש בעניין? הכרזתו של printf, אב הטיפוס שלה, כך שהמהדר מכן יודע למה אני מתכוון כשאני מזכיר בפונקציה זו printf. אז שלב 1 בקומפילציה היא מראש עיבוד, לפיה תכנית כמו קלאנג או איזו תכנית שעוזרים קלאנג מגיע עם למעלה קוראה את הקוד שלך למטה, משמאל לימין, וכל פעם שהוא רואה סימן # אחרי מילת מפתח כמו כולל, היא מבצעת פעולה ש, העתקה והדבקה במקרה stdio.h זה לתוך הקובץ שלך. זה שלב 1. אז יש לך קובץ C הרבה יותר גדול בגלל העותק הענק, העבודה להדביק זה פשוט קרה. 2 צעד כעת הידור. אבל מתברר הקומפילציה לוקחת קוד מקור שנראה כך והופך אותו למשהו שנראה כמו זה, אשר למי שמכיר נקרא? >> [תלמיד] עצרת. שפת אסיפה. >> זה באמת משהו אם אתה לוקח CS61 תוכל לצלול לתוך בפירוט רב יותר. זה פשוט רחוק בערך כמו שאתה יכול לקבל את עצמך לכתיבת 0s ו 1s אבל לכתוב דברים באופן כזה שעדיין עושה לפחות קצת היגיון. אלו הן הוראות מכונית, ואם אנחנו למטה כדי לגלול את הפונקציה העיקרית כאן, שם לב שיש הוראת דחיפה זו, העבר את ההוראה, לחסר הוראה, קורא הוראה, וכן הלאה. כשאתה שומע שהמחשב שלך יש אינטל בפנים, יש לך מעבד אינטל ב-Mac או במחשב האישי שלך, מה זה אומר? מעבד מגיע מובנה על ידי חברות כמו אינטל הבנת הוראות מסוימות. אין להם מושג מה פונקציות כמו החלפה הן או עיקרי הוא כשלעצמה, אבל הם יודעים מה הוראות מאוד ברמה נמוכה כמו חיבור, חיסור, לדחוף, לזוז, להתקשר, וכן הלאה. לכן, כאשר אתה לקמפל קוד C לשפת הרכבה, קוד המשתמש שלך מאוד ידידותי למראה הופך למשהו שנראה כמו זה, כי ממש מזיז בתים או 4 בתים מסביב ביחידות קטנות כאלה בתוך ומחוץ למעבד. אבל לבסוף, כאשר קלאנג מוכן לקחת ייצוג זה של התכנית שלך ל0s ו 1s, אז הצעד נקרא הרכבה קורה, ושוב זה קורה בכל הרף עין בעת ​​הפעלת קלאנג. אנחנו מתחילים כאן, זה פלטי קבצים כמו זה, ואז זה הופך אותו ל0s ו 1s אלה. אם אתה רוצה לחזור בשלב כלשהו וממש לראות את זה בפעולה ו, אם אני הולך לhello1.c-ספר הזה הוא אחד מהתוכניות מאוד הראשונות שבדקנו - בדרך כלל היינו זה לקמפל עם hello1.c קלאנג וזה ייתן לנו a.out. אם לעומת זאת אתם במקום לתת לו את הדגל-S, מה שתקבל הוא hello1.s ואתה בעצם רואה את השפה אסמבלי. אני עושה את זה לתכנית קצרה מאוד, אבל אם אתה לחזור למירוץ או לשחזר או כל תכנית שכתבת ורק מתוך סקרנות רוצה לראות מה זה באמת נראה כמו, מה בעצם שהוכנס למעבד, אתה יכול להשתמש בדגל ש- S עם קלאנג. אבל אז לבסוף, יש עדיין תפס אותך אחד. הנה 0s ו 1s שמייצג יישום שלום, העולם שלי. אבל אני השתמשתי בפונקציה של מישהו אחר בתכנית שלי. אז למרות שהתהליך היה אני לוקח hello.c, היא מקבלת מלוקטת לתוך קוד הרכבה, ולאחר מכן הוא מקבל התאסף לתוך 0s ו 1s, רק 0s ו 1s שoutputted בנקודה זו בזמן הם אלה הנובעים מהקוד שלי. אבל מי שכתב printf, הם חברו את הקוד שלהם לפני 20 שנים ועכשיו זה מותקן במקום כלשהו על המכשיר, לכן אנחנו קצת צריכים להתמזג 0s ו 1s או שלה עם שלי 0s ו 1s, וזה מביא אותנו לצעד 4 והאחרון של הידור, הידוע כקישור. אז בצד השמאל יש לנו את אותו תמונה המדויקת כמו קודם: hello.c הופך קוד הרכבה הופך 0s ו 1s. אבל זוכר שהייתי ספריית הקלט / פלט הסטנדרטית בקוד שלי, וזה אומר שאי שם במחשב יש קובץ שנקרא stdio.c או לפחות גרסת הידורם, כי מישהו לפני כמה שנים הידור stdio.c לתוך קוד הרכבה ואז כל חבורה של 0s ו 1s. זה מה שנקרא סטטית או דינמי ספרייה. זה חלק הקובץ יושב איפשהו במכשיר. אבל לבסוף, אני חייב לקחת 0s ו 1s שלי ושל אותו האדם 0s ו 1s ואיכשהו לקשר אותם יחד, ממש לשלב את כל אלה 0s ו 1s לתוך קובץ אחד בשם a.out או hello1 או מה שקראתי לי התכנית כך שהתוצאה הסופית יש את כל 1s ו 0s שצריך מרכיב את התכנית שלי. אז כל הזמן הזה זה הסמסטר שבו אתה כבר משתמש קלאנג ועוד יותר לאחרונה פועל לעשות כדי להפעיל קלאנג, כל הצעדים האלה כבר קורים באופן מיידי, אלא סוג של זהירות רבה. ואז אם אתה ממשיך במדעי מחשב, כלומר CS61, זו השכבה שתוכל להמשיך לקלף את שם מדבר על יעילות, השלכות בטחוניות, וכמו בפרטים ברמה הנמוכים אלה. אבל עם זה, אנחנו עומדים לצאת C מאחור. בואו נלך קדימה, לקחת ההפסקה שלנו 5-הרגע, וכשאנחנו חוזרים: האינטרנט. בסדר. אנחנו נחזור. עכשיו אנחנו מתחילים את המראה שלנו לא רק בHTML כי, כפי שתראה, HTML עצמו הוא בעצם די פשוט אבל באמת בתכנות האינטרנט באופן כללי יותר, רישות באופן כללי יותר, ואיך כל הטכנולוגיות הללו באים ביחד כדי לאפשר לנו ליצור תוכניות הרבה יותר מתוחכמות על גבי האינטרנט מ עד כה שהצלחנו לחלונות שחורים ולבנים האלה. אכן, בנקודה זו בסמסטר למרות שאנחנו נבלה יחסית פחות זמן ב-PHP, HTML, CSS, JavaScript, SQL ועוד, רוב התלמידים עושים בסופו של דבר עושים פרויקט גמר שמבוסס אינטרנט משום שכפי שתראה, עכשיו יש לך הרקע ב-C הוא מאוד רלוונטי לשפות ברמה גבוהה יותר אלה. וכמו שאתה מתחיל לחשוב על פרויקט הגמר שלך, אשר, בדומה להגדרת בעיה 0, שבו אתה עודדת לעשות כל הדבר הכי מעניין אותך בהתחלה, פרויקט הגמר הוא ההזדמנות שלכם לקחת את הידע וההבנה החדש שלך עם C או PHP או JavaScript או רוצה לצאת לסיבוב וליצור פיסה מאוד משלך של תוכנה עבור העולם כדי לראות. ולזרעך עם רעיונות, יודע שאתה יכול הראש כאן, projects.cs50.net. בכל שנה, אנו לבקש רעיונות מסגל וצוות וקבוצות סטודנטים בקמפוס רק כדי להגיש את רעיונותיהם לדברים מעניינים שאפשר לפתור באמצעות מחשבים, באמצעות אתרי אינטרנט, באמצעות תוכנה. אז אם אתה נאבק כדי לבוא עם רעיון משלך, בכל האמצעים לגלול בין רעיונות לשם משנה זו ואחרונה. זה בסדר גמור כדי להתמודד עם פרויקט שכבר התמודד בעבר. אנחנו ראינו הרבה יישומים עבור לראות את המצב של כביסה בקמפוס, יישומים רבים לניווט בתפריט חדר האוכל, יישומים רבים לניווט בקטלוג כמובן וכדומה. ואכן, בהרצאה ובעתיד סמינרים עתידיים, אנו להכיר לך כמה APIs זמין לציבור, הן מהבחינה מסחרית זמין כמו גם זמין מכאן CS50 בקמפוס, כך שיש לך גישה לנתונים ואז יכול לעשות דברים מעניינים עם זה. אז נוסף על פרויקט גמר בכמה ימים, כאשר אנחנו משחררים את המפרט, אך לעת עתה, יודע שאתה יכול לעבוד לבד או עם חבר או שניים ברוב כל פרויקט לעניין אותך. האינטרנט. אתה הולך קדימה ולשלוף את המחשב הנייד שלך, אתה הולך לfacebook.com בפעם הראשונה, שלא התחברתי אליו לאחרונה, ולחץ על Enter. אז מה בדיוק קורה? כאשר תקישו Enter במחשב שלך, חבורה שלמה של צעדים תתחיל במעין קסם קורה. אז אתה כאן בשרת שמאל, האינטרנט כמו פייסבוק הוא כאן מהימין, ואיכשהו אתה משתמש בשפה זו נקראת HTTP, Hypertext Transfer Protocol. HTTP הוא לא שפת תכנות. זה יותר של פרוטוקול. זהו סט של מוסכמות שדפדפני אינטרנט ושרתי אינטרנט להשתמש בעת תקשורת פנימיות. ומה שזה אומר הוא כדלקמן. ממש כמו בעולם האמיתי, יש לנו אמנות אלה שם אם אתה פוגש אדם כלשהו בפעם הראשונה, אם לא אכפת לך לרצות אותי כאן, אני יכול לבוא אליך, אומר, "היי, קורא לי דוד". >> היי, דוד. השם שלי הוא סמי. "היי, דוד. השמי הוא סמי." אז עכשיו יש לנו רק עוסקים בסוג זה של פרוטוקול אדם מטופש היכן אני יוזם את הפרוטוקול, סמי הגיב, אנחנו כבר לחצנו ידות, והעסקה הושלמה. HTTP הוא דומה מאוד ברוחו. כאשר בקשות דפדפן האינטרנט שלך www.facebook.com, מה הדפדפן שלך באמת עושה הוא מושיט את ידו, כביכול, לשרת והיא שולחת אותה הודעה. והמסר שהוא בדרך כלל משהו כמו לקבל - מה אתם רוצים להשיג? - תשיג לי את דף הבית, שהוא כונה בדרך כלל על ידי חתך יחיד בסוף הכתובה URL. ורק שתדע באיזו שפה אני מדבר, אני הדפדפן אני הולך לספר לך שאני מדבר HTTP גרסת 1.1, וגם למען סדר טוב, אני הולך להגיד לך שמארח שאני רוצה בדף הבית של הוא facebook.com. בדרך כלל, דפדפן אינטרנט, ללא ידיעתך, האנושי, שולח את המסר הזה אל האינטרנט כאשר אתה פשוט להקליד www.facebook.com, הזן, בדפדפן שלך. ומה עם פייסבוק להגיב? הוא מגיב עם כמה פרטים נסתרים בעלי מראה דומה אבל גם הרבה יותר. בואו תלכו קדימה לדף הבית של פייסבוק כאן. זהו המסך שרובנו כנראה לא תראו אם אתה נשאר מחובר כל הזמן, אבל זה אכן דף הבית שלהם. אם אנחנו עושים את זה בכרום, שים לב שאתה יכול למשוך את תפריטי הקשר הקטנים האלה. משתמש ב-Chrome, בין אם ב-Mac OS, חלונות, לינוקס, או כמו, אם אתה או בקרה לחץ על קליק שמאלי, אתה יכול בדרך כלל למשוך את תפריט שנראה כמו זה, שם כמה אפשרויות מחכות, שאחד מהם הוא מקור דף. אתה יכול גם בדרך כלל להגיע לדברים אלו על ידי מעבר לתפריט התצוגה ולחטט. למשל, הנה תחת תצוגה, מפתחים הוא אותו הדבר. אני הולך קדימה ולהסתכל על מקור דף. מה שתראה הוא HTML שמארק כתב לייצג facebook.com. זה בלגן שלם כאן, אבל אנחנו נראה שזה הופך מעט יותר לפני זמן רב. אבל יש כמה דפוסים כאן. בואו לגלול למטה לי דברים כאלה. זה קשה לאדם לקרוא, אבל שם לב שיש את הדפוס הזה של סוגריים הזוויתיים עם מילות מפתח כמו אפשרות, מילות מפתח כגון ערך, כמה מחרוזות מצוטטות. זה המקום בו, בעת שנרשמת בפעם הראשונה, צוינה מה שנת הלידה שלך היא. זה תפריט נפתח של שנתי לידה מקודד איכשהו כאן בשפה זו נקראת HTML, שפת סימון HyperText. במילים אחרות, כאשר הדפדפן מבקש דף אינטרנט, הוא מדבר הכנס הזה שנקרא HTTP. אבל מה facebook.com להגיב לבקשה שעם? הוא מגיב עם חלק מהמסרים המסתוריים האלה, כפי שנראים ברגע. אבל יותר מהתגובה שלו הוא בצורה של HTML, שפת סימון HyperText. זה השפה שהיא בעצם דף אינטרנט שכתוב. ומה דפדפן אינטרנט הוא באמת אז, עם קבלתו של משהו שנראה כמו זה, קורא אותו מלמעלה למטה, מהשמאל לימין, וכל פעם שהוא רואה אחת מהסוגריים הזוויתיים הללו אחרי מילת מפתח כמו אפשרות, הוא מציג ששפת הסימון בצורה המתאימה. במקרה זה, זה יהיה להציג תפריט נפתח של שנים. אבל שוב, זה הוא בלגן שלם להסתכל. אין זה משום שהמפתחים של פייסבוק מניפסט 0 עבור 5 עבור סגנון, למשל. זה בגלל שרוב הקוד שהם כותבים הוא, למעשה, כתוב יפים, כן ציין, יפה מסוכסך, וכמו, אבל קורס של מכונות, מחשבים, דפדפנים באמת לא אכפת לי אם הקוד שלך הוא מנוסח היטב. ולמעשה, זה לגמרי בזבזן להכות על המקש TAB כל הפעמים האלה ולשים את ההערות לאורך כל הקוד שלך ולבחור שמות משתנים באמת תיאוריים כי אם הדפדפן לא אכפת לי, כל מה שאתה עושה בסופו של היום הוא מבזבז בתים. אז מתברר מה שרוב האתרים עושים זה למרות שאת קוד המקור לfacebook.com, לcs50.net וכל אתרים אחרים אלה באינטרנט בדרך כלל כתובים היטב וגם הגיב יפה ומסוכסך וכדומה, בדרך כלל לפני שהאתר הוא לשים על גבי האינטרנט, קוד minified, לפי HTML ו-CSS - משהו אחר שבקרוב יראו - קוד JavaScript שבקרוב יראו דחוס, לפי שמות משתנים ארוכים יהפכו X ו-Y ו-Z, וכל שהרווחים שעושים הכל נראה כל כך קריא כל זורק שם, כי אם תחשוב על זה ככה, פייסבוק מקבל מליארד עמוד פוגע יום - משהו מטורף כזה - אז מה אם רק כדי להיות מתכנת אנאלי פגע במרחב זמן פס אחד הנוסף רק כדי לשנן כמה שורת הקוד אי פעם כל כך הרבה יותר? מה המשמעות אם פייסבוק שומר שרווחים בכל הבתים שהם שולחים חזרה לאנשים באינטרנט? להכות על מקש הרווח פעם אחת נותן לך שני בתים נוספים בקובץ שלך. ואם מליארד בני אדם ולאחר מכן להמשיך להוריד את דף הבית באותו יום, כמה נתונים נוספים שמועבר על גבי האינטרנט? ג'יגה בלי שום סיבה טובה. ומובן מאליו, להרבה אתרים זה לא עניין כה מדרגים, אבל לפייסבוק, לגוגל, לכמה מהאתרים הפופולריים ביותר יש תמריץ גדול מבחינה כלכלית לעשות את הקוד שלך נראה כמו בלגן כך שאתה משתמש בכמה שיותר בתים בנוסף לאז לדחוס אותו באמצעות משהו כמו zip, אלגוריתם שנקרא gzip, שהדפדפן עושה עבורך באופן אוטומטי. אבל זה נורא. אנחנו אף פעם לא נלמד משהו על אתרים של אנשים אחרים וכיצד לעצב דפי אינטרנט אם יש לנו להסתכל על זה ככה. אז למרבה המזל, דפדפנים כמו כרום ואקספלורר ופיירפוקס בימים אלה מגיע בדרך כלל עם כלי פיתוח מוכללים. למעשה, אם אני יורד כאן לבדוק אלמנט או אם אני הולך להצגה, מפתחים, וללכת לכלי פיתוח באופן מפורש, חלון זה בחלק התחתון של המסך שלי עכשיו צץ. זה קצת מפחיד בהתחלה כי יש הרבה כרטיסיות לא מוכרות כאן, אבל אם אני לוחץ על אלמנטים כל הדרך בצד השמאל למטה, הכרום הוא ללא ספק די חכם. הוא יודע כיצד לפרש את כל הקוד הזה. ואז מה הכרום עושה זה מנקה את כל HTML של פייסבוק. למרות שאין רווחים יש, אין כניסה לשם, עכשיו שם לב שאני יכול להתחיל לנווט בדף אינטרנט זה עוד יותר היררכי. מתברר שכל דף אינטרנט כתוב בשפה הנקראת HTML5 צריך להתחיל עם זה, הצהרת DOCTYPE זה, אם אפשר לומר כך: זה סוג של שיש בהיר ואפור, אבל זה הקו הראשון של קוד בקובץ זה, וזה רק אומר לדפדפן, "היי, כאן מגיע חלק של HTML5. הנה בא דף אינטרנט". הסוגר הפתוח הראשון מעבר לכך במקרה זה דבר, תג HTML פתוח סוגר ואז אם אני צולל עמוק יותר - החיצים האלה הם לגמרי חסרי משמעות; הם רק לצורך ההצגה, שהם לא ממש בקובץ - שם לב שבתוך של תג HTML של פייסבוק, כל דבר שמתחיל בסוגר פתוח ואז יש מילה נקראת תג. אז בתוך תג HTML הוא כנראה תג ותג בראש גוף. בתוך תג הראש כרגע הוא כל בלגן לפייסבוק כי יש להם הרבה של מטה ודברים אחרים לשיווק ופרסום. אבל אם אנחנו לגלול מטה, מטה, מטה, מטה, בואו נראים איפה זה. הנה הוא. זה אחד הוא לפחות מוכר קצת. הכותרת של דף הבית של פייסבוק, אם אי פעם להסתכל בכרטיסייה בשורת הכותרת שלך, הוא ברוכים הבאים לפייסבוק - התחבר, רשם או למידע נוסף. זה מה שהיית רואה בשורת הכותרת של הכרום, וככה זה מיוצג בקוד. אם נתעלמתי מכל דבר אחר בראש, רוב ממעיו של דף אינטרנט נמצאים בגוף, ומתברר שהקוד של פייסבוק עומד להיראות יותר מורכב מרוב הדברים שאנחנו נכתוב תחילה רק בגלל שבנינו במשך השנים, אבל יש המון תגי הסקריפט, קוד JavaScript, זה הופך את אתר האינטרנט אינטרקטיווי מאוד: לראות עדכוני סטטוס באופן מיידי תוך שימוש בשפות כמו JavaScript. יש משהו שנקרא div, אשר הוא חלוקה של דף. אבל לפני שנגיע לאותו פרט, בואו ננסה להקטין את התצוגה ולהסתכל על גרסה פשוטה יותר של פייסבוק 1.0, אם אפשר לומר כך. הנה, עולם השלום של דפי אינטרנט. יש שהכרזת DOCTYPE בחלקו העליון וזה קצת שונה מכל דבר אחר. שום דבר אחר שאנחנו כותבים בדף אינטרנט עומד להתחיל עם לנועז. שוב, הסיפור הוא אותו: שלום, פסיק, להתחיל לעשות את זה מודגש, אז העולם מקבל מודפס באותיות מודגשות, וזה אומר להפסיק את ההדפסה זו מופיעה באופן מודגש. תן לי ללכת קדימה ולשמור את הקובץ שלי, לחזור לכרום, אני להתקרב רק כדי שנוכל לראות את זה יותר טוב, ולטעון מחדש, ותראה שהעולם הוא עכשיו באופן מודגש. האינטרנט הוא על כל קישורים, אז בואו נלך ותעשה את זה: האתר האהוב עליי הוא, יניח, youtube.com. שמור, טען. אוקיי. יש כאן שני בעיות כרגע מלבד הכיעור של האתר. 1, אני די בטוח שאני מכה הזן כאן. וכך עשיתי. אני מכה לא רק זן, גם אני מסוכסך, לתרגל את מה שהיינו מטיף על סגנון, אבל שלי הוא ממש ליד העולם. אז למה זה? דפדפנים לעשות רק את מה שאתה אומר להם לעשות. לא ספרתי לי הדפדפן, "קווי הפסקה כאן. הכנס פסק לשבור כאן." אז הדפדפן, זה לא משנה אם אני מכה חזרה 30 פעמים, זה עדיין הולך לשים את זכותי לצד העולם. מה שאני באמת צריך לעשות כאן היא אומר משהו כמו
, להוסיף מעבר שורה. ולמעשה, מעבר שורה הוא סוג של דבר מוזר כי אתה לא באמת יכול להתחיל לנוע לקו אחר, ואז לעשות משהו, ולאחר מכן להפסיק לנוע לשורה חדשה. זה סוג של פעולה אטומית. או שאתה עושה את זה או שלא. אתה מקיש Enter או שאתה לא. אז br הוא קצת תג אחר, ולכן אני זקוק למיון של שניהם הפתוחים ולסגור אותו בבת אחת. התחביר שהוא זה. מבחינה טכנית, אתה יכול לעשות משהו כזה בגרסות מסוימות של ה-HTML, אבל זה רק טיפשים משום שאין שום סיבה להתחיל ולהפסיק משהו אם אתה יכול לעשות את זה במקום כולם בבת אחת. מבין HTML5 שאינו דורש בקפדנות לוכסן זה, כך תוכל לראות ספרי לימוד ומשאבים מקוונים שאין לו, אבל למען הסדר טוב בואו להתאמן הסימטריה שראינו עד כה. משמעות הדבר הוא כי התג הוא גם נפתח ונסגר. אז עכשיו בואו להציל אותי את התיק שלי, לחזור לכאן. אוקיי, אז זה מתחיל להיראות טוב יותר, מלבד האינטרנט שאני יודע הוא סוג של לחיצה, ועדיין youtube כאן לא נראה שיוביל לשום דבר. זאת משום שלמרות שזה נראה כמו קישור, הדפדפן לא יודע שכשלעצמה, אז יש לי לומר לדפדפן שמדובר בקישור. הדרך לעשות זאת היא להשתמש בתג עוגן: ולתת לי להזיז את זה לשורה חדשה, רק כדי שזה קצת יותר קריא, ואני לכווץ את גודל הגופן. האם אני עושה זאת? לא, יש שם הולך להיות זו הדיכוטומיה. תג זה, התג העוגן, אכן ייקח את תכונה, אשר משנה את ההתנהגות שלה, ואת הערך של תכונה זו היא כנראה כתובת האתר של YouTube. אבל שים לב לדיכוטומיה הוא שרק בגלל זה את כתובת האתר שאתה הולך, זה לא אומר שצריך להיות המילה שאתה מדגיש ועושה קישור. אלא, שיכול להיות משהו כזה. אז אני חייב לומר שאפסיק לעשות את המילה הזאת היפר באמצעות תג העוגן הקרוב. שים לב שאני לא עושה את זה. 1, זה יהיה סתם בזבוז הזמן של כולם וזה לא הכרחי. כדי לסגור תג, אתה מזכיר את שמו של התג היחיד שוב. את לא מזכיר את כל התכונות. אז בואו נחסוך את זה, לחזור. אוקיי, וזהו, עכשיו הוא כחול ומקושר. אם אני לוחץ עליו, אני ממש לעשות ללכת ל-YouTube. אז למרות שדף האינטרנט שלי הוא לא באינטרנט, זה לפחות HTML, ואם יניח לאינטרנט להתעדכן, הייתי למעשה בסופו כאן בyoutube.com. ואני יכול לחזור והנה דף האינטרנט שלי. אבל שם לב לכך. אם אי פעם קבלת דואר זבל או התקפת פישינג, עכשיו יש לך את היכולת אחרי חמש דקות בלבד כדי לעשות את אותו הדבר. אנחנו יכולים ללכת לכאן ולעשות משהו כמו www.badguy.com או מה האתר הוא הרפרף, ואז אתה יכול להגיד לאמת את חשבון PayPal שלך. [שחוק] ועכשיו זה הולך לצאת לbadguy.com, שאני לא מתכוון ללחוץ על משום שאין לי מושג לאן זה מוביל. [שחוק] אבל עכשיו יש לנו את היכולת באמת יגיע לשם. אז אנחנו באמת רק מתחילים לגרד את פני השטח. אנחנו לא תכנות כשלעצמה; אנחנו כותבים שפת סימון. אבל ברגע שאנחנו משלימים את אוצר המילים שלנו ב-HTML, אנחנו נציג את PHP, שפת תכנות בפועל שיאפשר לנו לייצר HTML באופן אוטומטי, להפיק CSS באופן אוטומטי, כדי שנוכל להתחיל ביום רביעי ליישום, אומר, מנוע החיפוש שלנו ועוד. אבל גם על זה בכמה ימים. ניראה אותך אז. [CS50.TV]