תאריך פרסום: 13.3.14 תאריך הגשה: 27.3.14 משקל התרגיל : 5% מהציון הסופי )תקף( מבוא לתכנות מערכות תרגיל בית מספר )Bash( 1 סמסטר אביב 4102 יום שני 17:00-18:00 טאוב 312 יום רביעי 17:00-18:00 טאוב 312 שעות קבלה לתרגיל: הערות כלליות שימו לב: לא יינתנו דחיות במועד התרגיל. תכננו את הזמן בהתאם. חובה לעבוד לפי נהלי ההתקשרות בקורס אשר מפורטים בתרגול 0, שקפים 11-13. לשאלות בנוגע לתרגיל )שתואמות את נהלי ההתקשרות בקורס), יש לפנות למייל של צוות הקורס.mtm1 )subject( נא לכתוב בשורת הנושא,mtm@tx.technion.ac.il מומלץ לקרוא את כל המסמכים הרלוונטיים והקבצים שפורסמו לתרגיל לפני תחילת הפתרון ולפני שליחת שאלות. חלק זה חובה להתעדכן בעמוד Information "Assignment - General המופיע באתר הקורס )תחת.) F.A.Q יתפרסם זמן קצר לאחר יציאת התרגיל. 1 שימו לב לבדיקה האוטומטית 1.1 1.1 תרגיל זה יעבור רק בדיקה אוטומטית ולכן על התכניות שתכתבו לייצר בדיוק את הפלט הנדרש בתרגיל. תכנית הבדיקה האוטומטית מפנה את הפלט אשר התכנית שלכם מייצרת לתוך קובץ, ואח"כ מפעילה את הפקודה diff של,UNIX כדי לוודא שתוכן הקובץ זהה בדיוק לקובץ שהיא מצפה לקבל. לפיכך הבדל של תו אחד )אפילו סוף שורה או רווח מיותר( בין הקובץ המצופה לבין הקובץ שיוצר ע"י התוכנית שלכם יגרום לכך שתכניתכם תיכשל בבדיקה. בכדי למנוע פגיעה מיותרת בציון, הקפידו להוציא פלט בדיוק לפי ההגדרות. על מנת שתוכלו לבדוק את עצמכם, מסופקות לכם דוגמאות, כפי שיפורט בהמשך. בתרגיל זה תהיה בדיקה אוטומטית בלבד ולא תהיה בדיקה יבשה של הקוד מת"מ בוט מערכת זו נוצרה במיוחד עבור הסטודנטים בקורס מת"מ ומטרתה לעזור לכם לוודא שקבצי ההגשה שלכם תקינים ויעבדו בסביבת הבדיקה של הקורס )לאחר שבדקתם זאת בעצמכם כמובן ב- t2 (. כמו כן המערכת יכולה לספק לכם תשובות בנוגע לפלט המצופה מכל תרגיל בית. החלפת הshell ניתן להשתמש בפקודה הבאה כדי לקבל את שם ה- Shell הנוכחי ב- Unix > echo $0 במחשבים בהם Bash אינה Shell ברירת המחדל )כמו בשרת ה- t2 לדוגמה(, ניתןלהשתמש בפקודה shell) chsh (change כדי לשנות את ברירת המחדל: > chsh Changing shell for mtm. old shell: /bin/tcsh New shell: /bin/bash Shell will be changed for mtm in approximately 5 minutes > חשוב להקפיד לכתוב את שם ה- Shell )הייחוס אליו( נכון, אחרת החשבון נהרס!!
1 התרגיל מבוא 1.1 בתרגיל זה אנו נכתוב מערכת של סקריפטים "משחקי המת"ם שף" שתדמה את שלב המוקדמות של תחרות ריאליטי פופולרית )מוזמנים לנחש איזו כוכב מישלן למנחשים נכון( תחילה ניתן הקדמה של מידע שימושי לפתרון תרגיל הבית )ולחיים(, לאחר מכן נפרט את סוגי הקבצים והתיקיות שהמערכת תהיה בנויה מהן, ולבסוף נגדיר לכם את הסקריפטים וההתנהגות שאנו מצפים מהם. 1.1 הקדמה וטיפים לעבודה ולחיים כפי ששמעתם עד כה קיימות מערכות הפעלה נוספות חוץ מווינדוס וכמובן שיש ביניהן הבדלים, אחד ההבדלים הוא בסוגי התווים, לדוגמא בלינוקס התו לירידת שורה מסומן בn \ בעוד שווינדוס זה r\. לכן כשתעבירו קבצים מווינדוס ללינוקס )או סביבת )unix סביר להניח שחלק מהתווים לא יהיו כפי שאתם )או כפי שסקריפטי עזר שעובדים לפניכם כתבו( מצפים, למזלכם קיימת פקודה מאוד פשוטה שממירה בין שני ההבדלים אשר נקראת dos2unix אשר מקבלת רשימה של קבצים שברצונכם להמיר. דוגמא להרצה: dos2unix a.txt b.txt בשביל לתרגל זאת הקובץ competitors )אשר יוסבר עליו בהמשך( בטסטים שיסופקו לכם ייכתב במערכת הפעלה מסוג ווינדוס כדי שתוכלו להפעיל עליו את.dos2unix הבהרה: בטסטים שנריץ הכל יהיה תקין ואפשר להניח שכל הקבצים שאנו נריץ יכתבו בסביבת,unix חלק זה הוא לתרגול בלבד. כעת נסקור בקצרה 3 פקודות שימושיות אשר לא חובה להשתמש בהן בתרגיל והן להעשרה בלבד חשוב לציין כי אסור להשתמש בפקודות אשר לא נלמדו בתרגולים במבחן ולכן גם השימוש בפקודות אלו במבחן אסור. -הפקודה,tr מלשון translate היא מקבלת שתי מחרוזות ומחליפה ביניהן בתוך קובץ, ככה לדוגמא אפשר להפוך רווחים לירידות שורה או כל החלפה שתעלה על דעתכם. כמו בפקודות שלמדתם בתרגול גם לה יש דגלים כמו: d מלשון delete שפשוט מוחקת את המופעים של המחרוזת בקובץ. s- מלשון squeeze אשר מצמצמת חזרה מרובה של תו. חידה: איך אפשר לממש את את אחת ההחלפות של dos2unix באמצעות?tr פתרון: cat file tr \r \n -הפקודה,sed מלשון stream editor וכפי שמשתמע מהשם זו פקודה עם המון אפשרויות ולמען האמת זו פקודה עם כ"כ הרבה אפשרויות שאפשר לתכנת באמצעותה. מידע נוסף על פקודות אלו ועוד ניתן למצוא בלינק הבא: /http://ss64.com/bash או לחפש בגוגל. המלצה חמה מצוות הקורס לתרגיל ולחיים בכלל, מטרת הקורס היא לא רק שתכתבו המון קוד ותחיו בעומס )גם זו חלק מהחוויה(, אלא ברמה הקונספטואלית לארגן את המחשבות והקוד שלכם בצורה מסודרת. לא רק כי זה יוצר פחות באגים, אלא גם כי זה מקל על הכתיבה ומציאת באגים כי לא כולנו אלן טיורינג )מי שרוצה לדעת עליו קצת יותר http://he.wikipedia.org/wiki /אלן_טיורינג ועל הקשר שלו לאפל( ובסופו של דבר זה רק הרגל בריא שניתן לרכוש ורצוי כמה שיותר מוקדם. לכן נמליץ לכם בתרגיל הזה להיעזר בסקריפטים מסעיפים קודמים כיוון שהם יהיו באותה תיקיית בית.
1.2 מבני נתונים במערכת מצרך כל מצרך במערכת ייוצג ע"י קובץ ריק בעל שם המצרך עם סיומת של,.ing לדוגמא המצרך תפוח )apple( במערכת ייוצג ע"י הקובץ. Apple.ing להלן איור להמחשה: תיקיית מתכון תיקיה ששמה הוא השם של המועמד להתחרות בתחרות שמכילה: קובץ מתכון- קובץ עם שם המתכון וסיומת.recipe שמכיל שורה מפורטת לכל אחד מהמצרכים שלו בפורמט הבא: <ingredient_name> <Price > <Calories> <Vegan> <Time> כאשר כל שדה מופרד ע"י רווח ו: <Ingredient_name> - שם המצרך )מובטח-מילה אחת בלבד(. > <Price - מחיר למצרך יחיד ( מספר שלם אשר קטן או שווה ל- 100 (. <Calories> -מספר הקלוריות למצרך יחיד )מספר שלם קטן מ- 200 (. <Vegan> - ספרה בינארית שמייצגת האם המצרך טבעוני: 1 משמע שהמצרך לא צמחוני. 0 משמע שהמצרך צמחוני. <Time> -הזמן שלוקח לבשל את המצרך בשניות. תיקיית שקית- תהיה קיימת תיקיה ששמה הוא Bag )וזו תיקיית שקית( אשר תכיל קבצי מצרכים ומטרתה להוות "שקית של מצרכים". הבהרה: בגלל שהמערכת מייצגת אדם פשוט שלא למד בקורס מת"מ לחשוב ולסדר את מחשבותיו, לכן המלאי שלו אינו מסודר, ייתכנו שקיות בתוך שקיות )כמו באיור 3( וכן תיקיות וקבצים עם סיומות אחרות שמהם תצטרכו להתעלם.
להלן שני איורים למתכונים שקולים מבחינת המערכת: איור 1
איור 3 מתחרה הינו חוקי אם מתקיימים התנאים הבאים: קובץ הrecipe שלו חוקי )כל טווחי המספרים חוקיים כפי שהוגדר קודם( - לכל מצרך שקיים בקובץ הrecipe קיים מצרך בBag או באחת מתתי התיקיות )ששמן גם כן )Bag שבתוכה. - הנחות מקלות לכל התרגיל : שם מצרך או מתכון לא יכיל רווחים לאורך כל התרגיל! לכל משתתף יש רק מתכון אחד!
קובץ שופטים קובץ בשם judges שיכיל שורה עבור כל שופט והעדפותיו בפורמט הבא: <judge_name> <Price_factor> <Calories_factor> <Vegan_factor> <Time_factor> כאשר: <judge_name> - זהו שם השופט. <Price_factor> - מקדם החשיבות של המחיר )מספר בין 0 ל 5 (. <Calories_factor> - מקדם החשיבות של הקלוריות )מספר בין 0 ל 5 (. <Vegan_factor> - מקדם החשיבות של הטבעונות )מספר בין 0 ל 5 (. <Time_factor> - מקדם החשיבות של הזמן )מספר בין 0 ל 5 (. ניתן להניח כי כל המקדמים חוקיים. להלן איור להמחשה: איור 2
המערכת תיקיה בה יש קובץ judges ותיקיות מתחרים )כמובן שיכולים להיות בה גם דברים נוספים שיש להתעלם מהם(. להלן איור לדוגמא:
1.2 סקריפט : 1 validate Bag ו קובץ.recipe בהתאמה )ראו דוגמא בהמשך(. 1.2.1 קלט התסריט יקבל 3 ארגומנטים: תיקיית 1.2.1 פעולת התסריט לתסריט שני תפקידים: ווידוא של מצב המערכת וסיכום של מצב המערכת. תסריט זה יוודא שהמערכת במצב תקין, כלומר קובץ המתכון שהתקבל תקין )כפי שהוגדר בתת הסעיף "מתכון"( וכל המצרכים שרשומים בו נמצאים בBag שהתקבלה כארגומנט )או באחת מתתי התיקיות עם השם Bag שבתוכה( פעם אחת )ניתן להניח שמצרך יופיע פעם אחת לכל היותר בBag ובמתכון(. אם המצב תקין, תודפס שורה שמסכמת את המתכון )כפי שיוסבר בהמשך(. אחרת תודפס הודעה שתפורט בהמשך. Invalid! 1.2.2 פלט ווידוא אם המערכת לא תקינה מסיבה כלשהיא תודפס כפלט לדוגמא אם נריץ את התסריט בלי ארגומנטים נקבל: >> validate Invalid! שורת סיכום במידה והמתכון תקין, התסריט ידפיס שורה אשר תסכם את תוכן התפריט באופן הבא: Total: <Price> <Calories> <Vegan> <Time> כאשר: <Price> -סה"כ המחיר עבור המתכון = לסכום את המחירים של כל המוצרים. <Calories> - סה"כ הקלוריות עבור המתכון = לסכום את כל הקלוריות של כל המוצרים. <Vegan> - האם המנה טבעונית = אם יש מרכיב שאינו טבעוני אז כל המנה לא טבעונית. <Time> - סה"כ זמן ההכנה בשניות של המנה = לסכום הזמנים של כל המצרכים. שימו לב כי ההדפסות הן עם ירידת שורה בשני המקרים! לדוגמא אם נריץ את התסריט עם הקבצים החוקיים שבאיור 1 )או איור 3, הם שקולים!(: >> validate Lev/Bag Lev/Fruit_Salad.recipe Total: 15 600 0 4968
1.2 סקריפט :1 judge 1.2.1 קלט התסריט יקבל כקלט שני דברים: קובץ השופטים ואת שורת הTotal של מתכון מסוים )כפי שחישבתם בתסריט הvalidate ( או את המילה Invalid!. כלומר תמיד הפרמטר הראשון יהיה קובץ שופטים, אך שאר הפרמטרים יכולים להשתנות, או שורת Total שכוללת חמישה פרמטרים נוספים או המילה Invalid! שמהווה רק פרמטר נוסף אחד. ניתן להניח שהקלט תמיד תקין, כלומר קובץ השופטים תקין ולפי הפורמט שהוצג קודם לכן, ובמידה ומתקבלת שורת Total היא תמיד בת חמישה פרמטרים כפי שמוסבר בתסריט הקודם, וכל הפרמטרים בטווחים החוקיים. 1.2.1 פעולת התסריט בחלק זה אנו נדמה מנגנון של שיפוט עבור המנות. כלומר עבור כל העדפות השופטים ועבור שורת הTotal ייפלט ציון שאופן חישובו יוסבר בסעיף הבא. 1.2.2 פלט אם תתקבל שורת Invalid! לא יודפס כלום והתסריט יגמר. אם תתקבל שורת Total אז הציון עבור המתכון יחושב באופן הבא: לכל שופט הציון שהוא ייתן יחושב כך-סכום המכפלות בין המאפיינים לפקטורים התואמים להם. לדוגמא עבור שורת הפלט מהדוגמא בסעיף הקודם )"4968 )"Total 15 600 0 ועבור קובץ הjudges באיור 2, הציון שכל שופט ייתן יהיה: Grumpy 0*15+0*600+0*0+0*4968 = 0 Cheapy 5*15+0*600+0*0+0*4968 = 75 Vegy 0*15+0*600+5*0+0*4968 = 0 Fasty 0*15+0*600+0*0+5*4968 = 24840 Bamby 2*15+5*600+3*0+1*4968= 7998 הציון הסופי ממוצע ציוני השופטים. כלומר עבור הדוגמא הנוכחית הציון יהיה 6582= 32913/5. #!/bin/bash i=15 let i /= 4 echo $i שימו לב: Bash מעגל את תוצאת המנה כלפי מטה וזה בסדר גמור. לדוגמא התסריט הבא: תדפיס 2. >>judge judges Total: 15 600 0 4968 6582 דוגמא מוחשית:
1.2 סקריפט :2 compete 1.2.1 קלט התסריט יקבל תיקיה שמכילה קבצים כפי שהוסבר בסעיף "מבני הנתונים במערכת")כמו compete באיורים עם או בלי path אליה(. ניתן להניח שתמיד מתקבל ארגומנט יחיד בלבד כקלט והוא תמיד שם של תיקיה. 1.2.1 פעולה לכל המשתתפים בתחרות ישוקלל את הציון ויודפסו המנצחים כפי שיפורט בהמשך. אם קיימת תיקיית מתחרה ריקה )בלי מתכון(, או שהמתכון אינו חוקי )מומלץ לבדוק זאת בעזרת התסריט validate שכתבתם( התסריט יתעלם מהמתחרה הזה. שימו לב כי ייתכנו תיקיות וקבצים נוספים אשר לא קשורים לתחרות או מתחרים לא חוקיים ויש להתעלם מהם. 1.2.2 פלט התסריט יוציא כפלט את 20 המתחרים התקינים עם הציון הטוב ביותר, כאשר הם ממוינים לפי סדר ראשוני של הציון שלהם )כפי שחושב בתסריט,judge אשר כמובן מומלץ להשתמש בו לחישוב( ומיון משני לקסיקוגרפי )לפי שמם של המתחרים(. במידה ויש פחות מ- 20 מתחרים יש להדפיס אותם לפי הסדר הנדרש. פורמט הפלט הוא: <competitor_name> <recipe_name> <Grade> כאשר: <competitor_name> -שם המתחרה. <recipe_name> - שם המתכון שהמתחרה הציג. <Grade> - הציון שהתקבל עבור המתכון. כלומר עבור הדוגמא שבתת סעיף "מערכת" נקבל: >>./compete <path_to_the_compete_directory>/compete Lev Fruit_Salad 6582 Ward Chocolate_Cake 6582
הגשה 2 את ההגשה יש לבצע דרך אתר הקורס. תחת.Electronic submission,exercise 1,Assignments הקפידו על הדברים הבאים: יש להגיש את קבצי הקוד מכווצים לספרית ZIP )לא RAR או כל דבר אחר(, כאשר כל הקבצים מופיעים בתיקיית - השורש בתוך קובץ ה- ZIP. )כל התסריטים( אין להגיש אף קובץ חוץ מהתסריטים הדרושים. - סה"כ 3 תסריטים בשמות שהוגדרו בתרגיל זה. o ע"מ לבטח את עצמכם כנגד תקלות בהגשה האוטומטית: - שימרו את קוד האישור עבור ההגשה. 1 o שימרו עותק של התרגיל על חשבון ה- T2 שלכם, כך שחותמת הזמן על הקבצים תוכיח את קיומם בזמן. הקפידו לא לשנותם אח"כ משום שדבר זה יעדכן את חותמת הזמן. o כל אמצעי אחר לא ייחשב כהוכחה לקיום הקוד בזמן מוקדם מספיק. o שימו לב, ניתן להגיש את התרגיל מס' פעמים. ההגשה האחרונה היא הנחשבת. - 1 מומלץ לאמץ את השיטה הבאה להגשות אלקטרוניות: העתיקו את קוד האישור ושילחו אותו לשותף )ולעצמכם( בדואר אלקטרוני. דבר זה יאשר לשותף שלא שכחתם את ההגשה ויאפשר לכם למצוא את הקוד במקרה הצורך.
windows ל- linux יש לבצע את הפקודה dos2unix a.txt b.txt Convert and replace a.txt. and b.txt. דרישות, הגבלות והערות כלליות תו ירידת השורה שונה בין windows לunix לכן כאשר מעתיקים קבצים מ- dos2unix <file name> דוגמא: 2 אסור להשתמש בקבצים זמניים. לצורך פתרון התרגיל עליכם לייצר בדיוק 3 תסריטים בשמות שהוגדרו לכם מראש, וודאו שהתסריטים שכתבתם ייקראו בשמות הנדרשים בלבד sensitive(.)case הגבלה זו חיונית לצרכי הצלחת ההגשה. יש לכתוב את התרגיל ב- Bash בלבד )ולא בשפות script אחרות או ב- C (. אסור להשתמש בפקודות UNIX אשר לא נלמדו בתרגולים או הוזכרו במפורש בתרגיל. נסו להיעזר בפקודות קיימות שנלמדו בכיתה כמו cut, sort, grep וכו'. שימוש בפקודות אלה יכול לקצר בהרבה את החלק שלכם בכתיבת התסריט. התסריטים ייבדקו על t2. העובדה שהבדיקה תתבצע על t2 אינה אומרת שאתם חייבים כל הזמן לפתח על t2 אתם יכולים לפתח את התסריטים שלכם במחשבים אחרים ובהמשך להעביר אותם ל- t2 ולוודא שהם עובדים נכון על ה- t2. שימו לב תסריטים אשר עובדים נכון במחשב אחר עלולים ליצור פלט שגוי על t2 לפני ההגשה וודאו שהתסריטים שלכם עובדים נכון על ה- t2! אפשר לפתח את התסריטים ב- Shells של מכונות הלינוקס בחווה, ב- Cygwin של מכונות Windows בחווה, או להתקין Connecting to Stud.pdf בבית, ראו: Cygwin )ההוראות בקובץ מסבירות על התקנה של C-Shell בנוסף, אין לכם צורך בכך מאחר ו- Shell ברירת המחדל הוא )Bash שימו לב: בד"כ יש עומס רב על stud בימים האחרונים לפני הגשת תרגיל. מומלץ מאוד לא לדחות את התרגיל ליומיים האחרונים. מומלץ גם לפתח את התסריטים במכונה אחרת כפי שהוסבר לעיל בכדי לצמצם חשיפה לבעיות עומס/איטיות של.stud צוות הקורס לא יטפל/לא יוכל לטפל בבעיות שקשורות לעומס/איטיות ב- stud. לא יתנו שום הקלות/דחיות בגלל העומס/איטיות של.stud ה- shell שצריך להריץ את התוכניות הוא./bin/bash ניתן להניח שהתיקייה הנוכחית ).( תמצא ב- path בזמן הבדיקה. זה אומר שאתם רשאים להריץ את התסריטים שלכם ללא שימוש ב-"/.". אסור להריץ תסריטים ע"י הפקודה.source אין צורך לכתוב את התסריטים לפי מוסכמות קוד Conventions( )Code כלשהן. לא חייבים לתעד את התסריטים במלואם. רצוי לציין בראש כל תסריט בהערה תמציתית מה הוא עושה. הקפידו לא להדפיס דברים מיותרים לערוצי הפלט - טעות קלה של אפילו תו רווח יחיד תכשיל בדיקה שלמה. הנכם רשאים להניח כי לא קיימות שגיאות נוספות מלבד אלו שפורטו. פונקציות ב bash יכולות להחזיר ערך מספרי שלם חיובי, נצלו זאת לקיצור הקוד. דוגמא: #!/bin/bash function retone{ return 1 } retone echo "$?"
#!/bin/bash read line case "$line" in 1) echo "input is one";; "pi") echo "mmm pie";; esac בbash יש תמיכה במנגנון,case נצלו זאת לקיצור הקוד. דוגמא: 2 שינויים עדכונים והודעות בנוגע לתרגיל כל ההודעות הנוגעות בתרגיל ימצאו באתר של הקורס http://webcourse.cs.technion.ac.il/234122 בדף התרגילים. דף זה יכיל שאלות ותשובות נפוצות. רק הודעות דחופות תשלחנה בדואר. עליכם לעקוב אחר האתר והעדכונים שיפורסמו בו. בהצלחה!