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

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

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

מבוא למדעי המחשב

מבוא למדעי המחשב

מבוא למדעי המחשב

מבוא לתכנות ב- JAVA תרגול 11

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

תרגול 1

PowerPoint Presentation

שאלהIgal : מערכים דו מימדיים רקורסיה:

PowerPoint Presentation

מבוא למדעי המחשב

מהוא לתכנות ב- JAVA מעבדה 3

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

Microsoft PowerPoint - 10_threads.ppt

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

PowerPoint Presentation

מבוא למדעי המחשב

שאלהIgal : מערכים דו מימדיים רקורסיה:

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

תרגול 1

Slide 1

Homework Dry 3

PowerPoint Presentation

Slide 1

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

PowerPoint Presentation

תרגול 1

מבוא למדעי המחשב

מבוא לתכנות ב- JAVA תרגול 7

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

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

Microsoft PowerPoint - rec3.ppt

PowerPoint Presentation

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

הגשה תוך שבוע בשעת התרגול

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

Slide 1

תרגול 1

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

מבוא למדעי המחשב - חובלים

מבוא למדעי המחשב - חובלים

Microsoft Word - c_SimA_MoedB2005.doc

מבוא למדעי המחשב

PowerPoint Presentation

מקביליות

שאלהIgal : מערכים דו מימדיים רקורסיה:

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

Slide 1

Slide 1

תכנות מונחה עצמים א' – תש"ע

מקביליות

תוכנה 1 תרגול מספר 12: GUI כתיבת מחלקות גנריות בית הספר למדעי המחשב אוניברסיטת תל אביב 1

Microsoft PowerPoint - lec10.ppt

Microsoft Word B

Microsoft Word - pitaron222Java_2007.doc

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

מס' ת"ז מס' מחברת מבחן בקורס מבוא מורחב למדעי המחשב CS1001.py ביה"ס למדעי המחשב, אונ' תל אביב סמסטר א' , מועד ב, 23/3/2018 מרצים: דניאל דויטש,

Microsoft Word - דוגמאות ב

סדנת תכנות ב C/C++

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

PowerPoint Presentation

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Slide 1

יום שלישי, 14 ליולי 2015 מבחן סוף סמסטר - תכנות מונחה עצמים )236703( סמסטר אביב 2015, מועד א' מרצה: ערן גלעד מתרגלים: נורית מושקוביץ', הלאל עאסי, אליר

Microsoft Word - Ass1Bgu2019b_java docx

תורת הקומפילציה

Microsoft Word - c_SimA_MoedA2006.doc

Microsoft Word - sync_LG.doc

1 תוכנה 1 תרגיל מספר 7 מנשקים Interfaces הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה- moodle ב

מקביליות

מצגת של PowerPoint

מס' סידורי: ת.ז.: עמוד 1 מתוך 20 בחינה בתוכנה 1 סמסטר ב', מועד א',תשס"ט 5/7/2009 וולף, ליאור ליאור שפירא, נעמה מאיר, מתי שמרת הוראות )נא לקרוא!( משך ה

שעור 6

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

פייתון

Slide 1

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

Slide 1

תוכן העניינים

תרגול 3 - מערכים

Microsoft PowerPoint - rec8.ppt

הטכניון - מכון טכנולוגי לישראל הפקולטה להנדסת חשמל המעבדה למערכות תכנה מרושתות ניסוי בתכנות מקבילי ב- Java המאחר ביותר מ 51 דקות לא יורשה לבצע את הניס

HTML - Hipper Text Makeup Language

Microsoft PowerPoint - meli-iso.ppt

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

Microsoft Word - ExamA_Final_Solution.docx

תמליל:

אוניברסיטת בן-גוריון מדור בחינות מספר נבחן: רשמו תשובותיכם בגיליון התשובות בלבד, תשובות מחוץ לגיליון לא יבדקו. בהצלחה! (25 נקודות) שאלה 1: זיכרון בשאלה זו נדון ב: Pattern,Smart Pointer Design כפי שנלמד בכיתה. א. הסטודנט אפי ניגש לממש את המחלקה Smart Pointer אך חלקים מהקוד נמחקו לו. עזרו לאפי להשלים את הקוד במקומות המקווקוים כפי שנלמד בכיתה (ניתן להוסיף מתודות עזר לפי הנדרש) [15 נקודות] template <typename T> class SmartPointer { T *ptr_; ----; public: SmartPointer(T *ptr) { ---- SmartPointer(const SmartPointer<T>& rhs) { ---- SmartPointer<T>& operator=(const SmartPointer<T>& rhs) { ---- virtual ~SmartPointer() { ---- 1

; ב. אפי התהדר בידיעותיו בC ++ ולכן כתב את הקוד הבא. מה צריך להוסיף למחלקה SmartPointer על מנת שהקוד יעבוד נכון ויעיל? (רשמו אך ורק את התוספת הנדרשת, קוד מיותר יגרור איבוד נק') [10 נק] SmartPointer<int> create() { SmartPointer<int> p(new int(42)); return p; void main() { SmartPointer<int> pointer = create(); (30 נקודות) שאלה 2: מקביליות א. בשאלה זו נעסוק בסנכרון על ידי משתנים ופעולות אטומיות. א. 1 [6 נק`] נתונים שני תרדים t1 ו t2. בפונקציות run() של t1 וגם של t2 מופיעה קריאה לפונקציה ()f: t1: void run() { f(); t2: void run() { f(); public static void main(string[] args) { Thread t1 = new Thread(); Thread t2 = new Thread(); t1.start(); t2.start(); 2

הראו כיצד ניתן לסנכרן, ע"י שימוש במשתנה אטומי, בין t1 ו t2 כך ש t1 יבצע את הקריאה ל ()f ראשון, יסיים אותה, ורק לאחר מכן t2 יתחיל לבצע פונקציה ()f. הסינכרון חייב להיות בתוך הקוד של run() שהתרדים מבצעים. לצורך הסנכרון השתמשו במשתנה אטומי יחיד, ובפעולה האטומית CompareAndSet שנלמדה בכיתה. כזכור, פעולת חומרה זו ניתנת לקריאה דרך מחלקות ה Atomic של,Java כמו AtomicInteger, AtomicBoolean, AtomicReference וכו'. כתבו קוד מתאים, ונמקו את נכונותו בקצרה. א. 2 [10 נק`] כעת יש לנו שלושה ת'רדים,t1.,t2 and t3 כל תרד מבצע בלולאה נצחית קטע קוד. כלומר, הקוד של שלושת התרדים נראה כך: t1: void run() { while (true) { A t2: void run() { while (true) { B t3: void run() { while (true) { C public static void main(string[] args) { Thread t1 = new Thread(); Thread t2 = new Thread(); Thread t3 = new Thread(); t1.start(); t2.start(); t3.start(); 3

כאשר,A, B ו C זה בלוק של שורות קוד שהם מבצעים (בלולאה, לנצח). עליכם לסנכרן את התרדים כך שיתבצעו באופן הבא: קודם תרד t1 יבצע את קטע הקוד A מתחילתו ועד סופו, לאחר מכן תרד t2 יבצע את קטע הקוד מספר B כלשהו של פעמים **, מתחילתו ועד סופו, ורק לאחר מכן תרד t3 יבצע את קטע הקוד C מתחילתו ועד סופו. אחרי הסיבוב הזה הכל מתחיל מהתחלה: A, ואז B מספר כלשהו של פעמים, ואז C וכך הלאה עד שעוצרים את ריצת התוכנית. דוגמא להרצה אסורה : קודם B, ואז פעמיים A, ואז שוב פעם B, ואז C. לצורך הסנכרון השתמשו בשני משתנים אטומיים בדיוק, ובפעולה האטומית CompareAndSet שנלמדה בכיתה. כתבו קוד מתאים, ונמקו את תשובתכם בקצרה. ** שימו לב : מספר הפעמים שקטע הקוד B מתבצע ברצף אינו נתון מראש, הדבר תלוי בתזמון הת'רדים בסוף ביצוע קטע הקוד B: - אם t3 מתוזמן בדיוק כאשר t2 סיים לבצע את קטע הקוד שלו B, אז t3 רשאי וחייב להתחיל לבצע את קטע קוד C. - אם t2 מתוזמן אחרי שסיים לבצע קטע קוד B ולפני ש t3 התחיל לבצע את קטע הקוד שלו C, אז t2 חוזר ומבצע שוב את קטע הקוד שלו B. ב. למדנו בכיתה כי ניתן לממש LinkedList לשימוש מקבילי, תוך סנכרון הת'רדים בעזרת הפעולה האטומית.CompareAndSet בן, סטודנט בקורס, חושב שניתן לממש את ההכנסה של חוליה (link) לראש הרשימה של ה LinkedList ללא שימוש ב,synchronized, Semaphore או,CompareAndSet באופן הבא: class Link<T> { private T data; private Link<T> next; Link(Link<T> next, T data) { this.next = next; this.data = data; class LinkedList<T> { 4

private Link<T> head = null; public void add(t data) { head = new Link<T>(head, data); public class Task implements Runnable { private volatile LinkedList<Integer> lst; static public volatile int id; static public volatile boolean isbusy = false; Task(LinkedList<Integer> lst) { this.lst = lst; public void run () { while (true) { // do some work // add new link to LinkedList while (true) { if (!isbusy) { id=thread.getcurrentthreadid(); isbusy = true; if (id == Thread.getCurrentThreadId()) { lst.add(1); isbusy = false; break; if (// some condition to check if enough work is done) break; public static void main(string[] args) { LinkedList<Integer> lst = new LinkedList<Integer>(); // create some random number of threads int n = random(); for (int i=0; i<n; i++) (new Thread (new Task(lst))).start(); 5

ב. 1 [7 נק`] האם בפתרון של בן יתכן מצב שבו חוליות (links) שהת'רדים מנסים להכניס לרשימה המקושרת הולכים לאיבוד? כלומר, תרד ביצע הכנסה לרשימה המקושרת, אך הרשימה המקושרת אינה מכילה את החולייה שהוכנסה. אם לא, נמקו את תשובתכם. אם כן, הראו תרחיש שבו זה קורה. ב. 2 [7 נק`] האם במימוש של בן יתכן מצב של? deadlock האם במימוש של בן יתכן מצב של?livelock אם לא, נמקו את תשובתכם. אם כן, הראו תרחיש שבו זה קורה. 6

(30 נקודות) שאלה 3: תקשורת הממשק מגדיר Stores מבנה נתונים המאחסן את המחירים של מוצרים שונים בחנויות שונות: public interface Stores { List<String> getstores(); Map<String,Integer> getproductsofstore(string store); void addproducttostore(string store, String product, int price); המתודה מחזירה getstores רשימה של שמות החנויות. המתודה מקבלת getproductsofstore שם של חנות, ומחזירה את טבלת המוצרים בחנות זה - מיפוי שמות של מוצרים למחיר שלהם. המתודה מקבלת addproducttostore שם של חנות, שם של מוצר, ומחיר, ומוסיפה את המוצר עם מחירו לטבלת המוצרים בחנות זו (אם המוצר כבר מופיע בחנות עם מחיר אחר, יישמר המחיר הנמוך מבין השניים). נתון כי המחלקה מממשת StoresImpl באופן בטוח ונכון עבור הרצה מקבילית את הממשק.Stores אופן מימושה אינו רלבנטי לשאלה זו. בהרצאות הראנו את תבנית ה.Command Invocation Protocol כזכור, בתבנית עיצוב זו, השרת מגדיר מבנה נתונים מסוים בזיכרון ותומך בביצוע פקודות על מבנה זו. באופן זה הלקוח יכול לשלוח לשרת הודעות מסוג פקודה (אובייקט המממש את הממשק, <Command<T כאשר T הוא הטיפוס של מבנה הנתונים) והשרת יפעיל את הפקודה על המבנה שבזיכרון שלו (כלומר יקרא למתודה execute של אובייקט הפקודה, כאשר מבנה הנתונים מטיפוס T הוא הפרמטר). לנוחיותכם: בנספח בסוף השאלון מופיעות המחלקות של תבנית זו, כפי שנלמדו בכיתה (אין לשנות אותן, אלא רק להשתמש בהן אם נדרש) א. ממשו בגיליון התשובות את שתי הפקודות הבאות: GetProductPrices הפקודה מקבלת שם של מוצר ומחזירה (מאובייקט ה בשרת ) Stores את המחיר של המוצר הנתון בחנויות השונות (=טבלה הממפה שם חנות למחיר המוצר הנתון בה). 7

public class GetProductPrices implements Command<Stores> { ; public GetProductPrices ( ) { ; @Override public Serializable execute(stores stores) { AddStoreProducts הפקודה מקבלת שם של חנות ורשימת מוצרים עם מחיריהם (=טבלה הממפה שם של מוצר למחיר שלו), ומוסיפה את המוצרים ומחיריהם לחנות הנתונה (באובייקט ה בשרת). Stores אין ערך מוחזר. public class AddStoreProducts implements Command<Stores> { ; ; public addstoreproducts(, ) { ; ; @Override public Serializable execute(stores stores) { 8

להזכירכם, כל המחלקות של מממשות Java.Serializable [10 נקודות] ב. השלימו בגיליון התשובות את התוכנית הבאה, המריצה שרת מחירים מבוסס ריאקטור בתבנית ה Command.Invocation Protocol השרת מקבל פקודות כמו,GetProductPrices AddStoreProducts ומבצע אותן על האובייקט מטיפוס המוגדר Stores בזיכרון של התהליך שלו. ניתן לענות על סעיף זה גם אם לא עניתם על הסעיפים האחרים. public class PriceServer { public static void main(string[] args) { Stores stores = new StoresImpl(); //one shared object new Reactor( 7777, //port 10,, //protocol factory //encoder-decoder factory ).serve(); [6 נקודות] ג. כמה ת'רדים רצים בתוכנית של סעיף ב? ניתן לענות על סעיף זה גם אם לא עניתם על הסעיפים האחרים. [3 נקודות] ד. עדכנו את הקוד הנתון של סעיף ב', כך שירוץ ת'רד לכל לקוח. ניתן לענות על סעיף זה גם אם לא עניתם על הסעיפים האחרים, ובפרט גם אם לא עניתם על סעיף ב. [4 נקודות] ה. ציינו תרחיש שבו שרת המחירים במודל הריאקטור יעיל יותר משרת המחירים במודל הת'רד-לכל-לקוח. ניתן לענות על סעיף זה גם אם לא עניתם על הסעיפים האחרים. [7 נקודות] 9

10

(15 נקודות) שאלה 4: בסיסי נתונים בחברת Netflix משכירים סרטים ללקוחות בביתם, והם זקוקים למעקב אחר משתמשים והזמנת הסרטים שלהם לצורך המלצות. נציגי החברה פנו אליכם בבקשה ליצירת layer persistence עבורם. צריך לתמוך במידע הבא: ישנם משתמשים (users) אשר שוכרים סרטים.(movies) לכל משתמש יש רק id ושם.(name) לכל סרט יש,id שם הסרט,(name) תיאור מילולי,(description) ואופציה להיות שייך לקטגוריות (תיתכן יותר מאחת): מתח/פעולה,(Action) דרמה,(Drama) רומנטיקה,(Romance) או ילדים.(num_scorers) וכמות מדרגים (score) כמו כן, לסרט יש דירוג: ציון ממוצע.(kids) צפייה בסרט (movie_watch) מוגדרת ע"י המשתמש הצופה בסרט, הסרט הנצפה, ותאריך הצפייה. בסיום כל צפייה הצופה יכול לדרג את הסרט (ציון מ- 1 עד 10) ולהוסיף דעה (review) במלל חופשי. לשם פשטות נניח שמשתמש אינו רואה את אותו הסרט יותר מפעם אחת באותו יום. להלן מבנה הטבלאות CREATE TABLE Users ( id INT PRIMARY KEY, name TEXT NOT NULL ); CREATE TABLE Movies ( id INT PRIMARY KEY, name TEXT NOT NULL, description TEXT, isaction BOOL NOT NULL, isromance BOOL NOT NULL, isdrama BOOL NOT NULL, iskids BOOL NOT NULL, score FLOAT NOT NULL, num_scorers INT NOT NULL ); CREATE TABLE Movie_watches ( user_id INT NOT NULL, movie_id INT NOT NULL, date DATE NOT NULL, score INT, review TEXT, ); FOREIGN KEY(user_id) REFERENCES Users(id) FOREIGN KEY(movie_id) REFERENCES Movies(id) PRIMARY KEY(user_id, movie_id, date) 11

סעיף א' [4 נק'] רוצים לבנות את אובייקט ה- DAO בעבור הטבלה.Movies עלינו לתמוך בפקודות הבאות: UpdateScoreForMovie(movie_id, additional_score) מתודה זו אחראית לעדכן score ממוצע של סרט בעקבות ציון חדש, ולהעלות באחד את השדה.num_scorers השלימו את קוד המתודה. עדכון הממוצע score מתבצע בהתאם לנוסחה: new_score = (old_score*old_num_scorers + additional_score)/(old_num_scorers+1) class _Movies: def init (self, conn): self._conn = conn def UpdateScoreForMovie(self, movie_id, new_score): C = self._conn.cursor() C.execute(""" DO NOT ANSWER HERE - ONLY IN ANSWER SHEET """, [ ]) להזכירכם, הקוד למטה לקוח מתוך מחלקת DAO של הטבלה,Users ומייצג עדכון שם. כמו כן, זה חוקי לעדכן ערך בטבלה בעזרת קריאת הערך הקיים ושימוש בו בחישוב, לדוגמא x=x+1,set כאשר x שם עמודה. class _Users (object) def update_name(self, id, name): self._conn.cursor().execute(""" UPDATE Users SET name = (?) WHERE id= (?) """, [name, id]) סעיף ב' [4 נק'] בהמשך לסעיף הקודם רוצים לממש את המתודה GetMostPopularActionMovies(number_of_movies, minimum_selections) מתודה זו אחראית לייבא את רשימת number_of_movies הסרטים הכי פופולריים מקטגוריית "פעולה" (נתרכז בקטגוריה אחת לשם פשטות). פופולריות של סרט נקבעת ע"פ הציון הממוצע של הסרט (score) בהינתן שנצפה ודורג לפחות minimum_selections פעמים. יש לייבא את את כל עמודות הטבלה. def GetMostPopularActionMovies(self, number_of_movies, minimum_selections): self._conn.cursor().execute(""" _DO NOT ANSWER HERE - ONLY IN ANSWER SHEET """, [ ]) 12

כמו כן, לנוחיותכם הסינטקס של בחירה מטבלה עם תנאי בחירה, ועם מיון, כאשר ASC או DESC קובעים אם המיון בסדר עולה או יורד. כמו כן, LIMIT מגביל למספר רשומות (הראשונות בטבלה נלקחות). SELECT column-list FROM table_name [WHERE condition] [ORDER BY column1, column2,.. columnn] [ASC DESC] [LIMIT number_records]; סעיף ג' [5 נק'] רוצים לדעת האם משתמש מסוים אוהב סרטים מקטגוריה מסוימת, לדוגמא סרטי פעולה. בצורה יותר ספציפית, רוצים שבהינתן צופה (user_id) נוכל להוציא (1) את כמות הסרטים שאותם ראה מקטגוריית "פעולה" ),(isaction=true ו-( 2 ) את ממוצע הציונים שנתן לסרטים שראה מקטגוריה זו. כתבו את השאילתה המתאימה. יש לוודא שבממוצע ובספירה נכנסים רק סרטים שדורגו ע"י המשתמש (בעלי ערך score מספרי). לנוחיותכם, הסינטקס הבא סופר את כמות הרשומות ומחשב ממוצע של עמודה מסוימת בטבלה: SELECT COUNT(*),AVG(Column-name) FROM Table-name DO NOT ANSWER HERE - ONLY IN ANSWER SHEET סעיף ד' [2 נק'] בהתאם ל persistence design pattern שלמדתם בקורס, האם לדעתכם השאילתה בסעיף הקודם צריכה להיות ממומשת כחלק מה DAO של אחת הטבלאות, או כחלק מה- repository? נמקו את תשובתכם. DO NOT ANSWER HERE - ONLY IN ANSWER SHEET 13

נספח : מחלקות תבנית ה,Command Invocation Protocol כפי שהוצגו בכיתה. public interface Command<T> extends Serializable { Serializable execute(t data); public class RemoteCommandInvocationProtocol<T> implements MessagingProtocol<Serializable> { private T data; public RemoteCommandInvocationProtocol(T data) { this.data = data; @Override public Serializable process(serializable msg) { return ((Command) msg).execute(data); @Override public boolean shouldterminate() { return false; public class ObjectEncoderDecoder implements MessageEncoderDecoder<Serializable> { private final byte[] lengthbytes = new byte[4]; private int lengthbytesindex = 0; private byte[] objectbytes = null; private int objectbytesindex = 0; @Override public Serializable decodenextbyte(byte nextbyte) { if (objectbytes == null) { //indicates that we are still reading the length 14

lengthbytes[lengthbytesindex++] = nextbyte; if (lengthbytesindex == lengthbytes.length) { //we read 4 bytes and therefore can take the length int len = bytestoint(lengthbytes); objectbytes = new byte[len]; objectbytesindex = 0; lengthbytesindex = 0; else { objectbytes[objectbytesindex++] = nextbyte; if (objectbytesindex == objectbytes.length) { Serializable result = deserializeobject(); objectbytes = null; return result; return null; private static void inttobytes(int i, byte[] b) { b[0] = (byte) (i >> 24); b[1] = (byte) (i >> 16); b[2] = (byte) (i >> 8); b[3] = (byte) i; private static int bytestoint(byte[] b) { //this is the reverse of inttobytes, //note that for every byte, when casting it to int, //it may include some changes to the sign bit //so we remove those by anding with 0xff return ((b[0] & 0xff) << 24) ((b[1] & 0xff) << 16) ((b[2] & 0xff) << 8) (b[3] & 0xff); @Override public byte[] encode(serializable message) { return serializeobject(message); private Serializable deserializeobject() { 15

try { ObjectInput in = new ObjectInputStream( new ByteArrayInputStream(objectBytes)); return (Serializable) in.readobject(); catch (Exception ex) { throw new IllegalArgumentException( "cannot desrialize object", ex); private byte[] serializeobject(serializable message) { try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); //placeholder for the object size for (int i = 0; i < 4; i++) { bytes.write(0); ObjectOutput out = new ObjectOutputStream(bytes); out.writeobject(message); out.flush(); byte[] result = bytes.tobytearray(); //now write the object size inttobytes(result.length - 4, result); return result; catch (Exception ex) { throw new IllegalArgumentException ("cannot serialize object", ex); 16