אוקטובר 2013 סמסטר ב' תשע"ג – Qyouספר הפרויקט מנחה :ד"ר אוסי מוקרין מגישים: עומרי שייקו מוטי קדוש רון פלד תוכן עניינים הקדמה 4........................ ................................ ................................ ................................ הצורך 4....................... ................................ ................................ ................................ על המערכת 4............... ................................ ................................ ................................ מטרות המערכת 5......................................... ................................ ................................ מוטיבציה למערכת 5...................................... ................................ ................................ דרישות פונקציונליות 5.................................... ................................ ................................ קהל היעד והגדרת משתמשים 6....................... ................................ ................................ תהליכים עסקיים 7......................................... ................................ ................................ ניתוח מערכות מתחרות 8................................ ................................ ................................ תיאור אופן השימוש במערכת 9............................ ................................ ................................ זרימת המערכת – תהליכים עיקריים 9............... ................................ ................................ אפליקציית 9..................................... ................................ ................................ qyou פאנל ניהול המערכת – 17.................. ................................ qyou.co.il – web application צד לקוח 18..................... ................................ ................................ ................................ 18.......................................... ................................ ................................ Html5 + CSS3 18............... ................................ ................................ ................................ AngularJS 18...................................... ................................ Single page application by angularJS 19.............................. ................................ ................................ Ajax with angularJS 20............... ................................ ................................ ................................ Phonegap 20............... ................................ ................................ ................................ Facebook תקשורת בין שרת ללקוח באמצעות 22................................ ................................ SOKCET I/O צד שרת 23...................... ................................ ................................ ................................ עיצוב הקוד 23.............. ................................ ................................ ................................ מודל )23...................................... ................................ ................................ (Model מבט )23......................................... ................................ ................................ (View בקר )24.................................. ................................ ................................ (Controller קבצים נוספים מחוץ ל 27..................... ................................ ................................ MVC אלגוריתם חישוב הדירוג עבור ניהול התור 28...................................... ................................ 29................... ................................ ................................ ................................ Database 30................................... ................................ ................................ USER collection 31.................................. ................................ ................................ PLACE collection 31.................................... ................................ ................................ LINE collection 32................................. ................................ ................................ EVENT collection 33................................ ................................ ................................ QUEUE collection תוכניות עתידיות 34........... ................................ ................................ ................................ טכנולוגיות בהן השתמשנו 35.............................. ................................ ................................ הקדמה הצורך הצורך לאפליקציה הגיע מצורך עצמי שלנו :היינו יוצאים למקומות בילוי ,במיוחד בסופי שבוע והיינו מחכים בתורים העצומים למועדון בין שעה לשעתיים בלי לדעת אם נכנס למועדון בסוף הערב או לא. בנוסף הרגשנו שבגלל שאנו לא בליינים מוכרים ואיננו מכירים יחצנים ,אנו נכנסים לאט יותר ואפילו כלל לו .זאת אף על פי שיכול להיות שאנו לקוחות פוטנציאלים שווים לבעל העסק – ובעל העסק לא יודע זאת. את בעיה זו רצינו לפתור ,כלומר לעזור לבליין להכנס למועדון ולבעל המועדון להרוויח יותר מהעסק שלו. על המערכת Qyouהיא אפליקציית רשת ייחודית לאירועים בתחום חיי הלילה ,שמיועדת לכל מי שמתכנן אירוע או מתכנן להשתתף באירוע. אנחנו מסייעים למארגני אירועים ולבליינים להפיק את המרב מהאירוע שלהם. ב , Qyou-כל אחד יכול להיות מארגן אירוע ולכן אנו מציעים כלים שיעזרו לך ליצור אירוע ולקדם אותו במדיה ממש בכמה קליקים. אפליקציית Qyouממקסמת את הפוטנציאל של הרשת במהלך חיי הלילה .סצנת התור שמתרחשת בכניסה למועדונים היא מתסכלת ולא יעילה -לא עבור הבליין ולא עבור בעל המועדון .הפתרון שלנו הוא אוטומציה של סצנת התור בכניסה -פלטפורמה ניידת לניהול האירוע באופן חכם אונליין ,אשר הופכת את התור לחוויה מהנה שמתגמלת את הבליין – בכל אירוע נכנס יותר מהר מהאירוע הקודם ובעל המועדון מתוגמל גם -הוא מקבל סטטיסטיקות בזמן אמת שיתנו לו מידע מדויק על האנשים שנכנסים אליו למועדון לפי חתכים שונים וכך אופטימיזציה לגבי העסק שלו בהמשך. אפליקציית Qyouנותנת את כל הכלים כדי ליצור אירוע בקלות ,להביא אנשים לאירוע ולנהל את התור בכניסה באופן חכם. איך זה קורה? בערב האירוע יגיע בליין למקום ,ועל מנת להכנס בקלות ,פשוט יפתח את האפליקציה, יתחבר באמצעות פייסבוק ,יראה את כל המועדונים סביבו )לפי (GPSואת הליינים של אותו יום ,וילחץ על ליין ספציפי ויבקש להכנס למועודן ע"י לחיצה על כפתור. סלקטורית תראה את כל אנשים שמבקשים להכנס ,אם בליין ביקש להכנס והוא כבר אישר הגעה באיבנט בפייסבוק המערכת תזהה זאת אוטומטית ותדרג אותו גבוה ברשימת האנשים המבקשים להכנס למערכת .כאשר הסלקטורית תרצה להכניס את הבליין היא תלחץ על כפתור אישור כניסה ,הבליין יקבל לתוך האפליקציה שהוא אושר להכנס ויקבל QR-CODEלצורך אימות .כאשר ירצה להכנס למועדון ,יסרקו לו את הברקוד וכך יוודאו שהוא אכן אושר כניסה. בכל שלב בעל המועדון יראה את כל מה שקורה כרגע בתור ,כמה אנשים בחוץ ,כמה אנשים נכנסו ,מי הם מאיפה הם באו וכל הפרטים שפייסבוק יכול לספק. מטרות המערכת מטרתה העיקרית של המערכת היא אוטומציה של סצנת התור שמתקיימת היום במועדונים, באמצעות הרחבת האיבנט הקיים היום בפייסבוק. למערכת qyouיש שתי מטרות עיקריות: להקל על חייו של הבליין. היום ,מאוד מתסכל לבוא למועדונים ולחכות בתור שאין בו סדר ,שצריך להידחף ושנשארים הרבה זמן בחוץ ללא סיבה .המערכת שלנו באה לפתור את בעיה זאת בכך שהבליין פשוט יכנס לאפליקציה ,Qyouהתחבר למערכת באמצעות פייסבוק, יקבל את רשימת המועדונים הקרובים ביותר אליו ופשוט יבקש להכנס למקום ע"י לחיצה כפתור באפליקציה .בשלב זה המערכת תודיע לסלקטורית שהבליין הזה הגיע ,תראה לה את חשבון הפייסבוק שלו והיא תוכל להכניס אותו ע"י לחיצה על כפתור) .נסביר על תהליך זה בפירוט בהמשך( לתת לבעל המועדון אינפורמציה על אוכלוסיית המועדון בקלות לסמארטפון בזמן אמת. מכיוון שכל המערכת עובדת עם פייסבוק ,בעל המועדון יוכל לדעת בדיוק מי נמצא לו במועדון בכל שלב .למשל ,הוא יוכל לראות מי האנשים במחכים בכניסה ,מי כבר נכנס למקום ,כמה אנשים הגיעו דרך איבנטים בפייסבוק ,כמה לא ועוד.. מוטיבציה למערכת ניהול התור במועדון באופן מסודר ,יעיל וחכם: oמסודר -הלקוחות שבאים למועדון לא יצטרכו להידחף בכניסה. oיעיל -אפשרות לניהול התור באופן מבוקר. oחכם -דרך המערכת תזרום הרבה אינפורמציה על הלקוחות ,שממנה יוכלו בעלי המועדון לנתב את העסק שלהם .בנוסף התור יוכל להתנהל לפי צרכי המועדון )עדיפות לגיל ,מין ,לקוחות קבועים בזמן אמת( כניסה חלקה למועדון ,זמני המתנה נמוכים יותר ובטוחים ללקוח .אווירה נעימה ויצירת מיני רשת חברתית למשתמשי המערכת )למשל לקוח יוכל לדעת אם חבריו כבר נכנסו(. סטטיסטיקות לבעלי המועדון על האוכלוסייה שנמצאת במועדון שלהם על פי חתכים שונים. דרישות פונקציונליות הדרישות מתחלקות לשני תחומים: .1לפני האירוע: בשלב זה ,בעל המועדון יוכל להכניס נתונים ל ,DBליצור איבנטים בפייסבוק דרך Qyouולקדם את האירוע .לכן הדרישות הן: כניסה לפאנל ניהול. יצירת מועדון חדש ,עריכה ,מחיקה. יצירת איבנטים בפייסבוק דרך הפאנל ניהול. .2בזמן האירוע: בשלב זה התור צריך להיות מנוהל ,לכן הדרישות הן בצד של הבליין ובצד הניהול אפליקציה שתראה את את כל המועדונים שקרובים אלי )לפי מיקום המכשיר( התחברות לאפליקציה באמצעות פייסבוק ע"י פרוטוקול )(Auth2.0 כפתור בקשת כניסה למערכת. דף בתוך האפליקציה רק לאנשים מורשים אשר יקבלו את כל הבליינים שרוצים להכנס למערכת ,ויאשרו את הכניסה שלהם ויקבלו סטסטיסטיקות בזמן אמת. כאשר הבליין מאושר כניסה ,יקבל ברקוד ייחודי שהוא יוכל להכנס. כאשר יציג את הברקוד ,האפליקציה של הסלקטורית תוכל לסרוק אותו וכך לראות שהברוד מאושר. קהל היעד והגדרת משתמשים קהל היעד שלנו מחולק לשניים: .1בעלי מועדונים בעלי מועדונים מכל רחבי הארץ חובבי חידושים וטכנולוגיות שרוצים לפתח את העסק שלהם. .2בליינים סטודנטים בפרט וחבר'ה בני 18-30בכלל שיוצאים באופן קבוע למועדונים ויש להם סמארטפון. תהליכים עסקיים נתאר 2תהליכים: .1הכנסת נתונים למערכת ע"י בעל המועדון .כמו שציינו בעל המועדון יכניס את פרטי המועדון, הליינים ויוכל ליצור איבנטים בפייסבוק. .2תהליך הכניסה למועדון מהרגע שבו המשתמש פותח את האפליקציה ועד שממש נכנס למקום ,כמו שתואר בסעיף הקודם ניתוח מערכות מתחרות נציין שכרגע ,אין שום אפליקציה שכזאת ,אנחנו רוצים להיות חלוצים בזה ,ולנסות להכנס באמת לשוק האמיתי ,ולא רק כפרוקייט במכללה. ישנן אפליקציות רבות בשוק המועדונים אך הן לא באותו נושא של ניהול התור במועדון ואוטומטיזציה של כל המצב הזה. תיאור אופן השימוש במערכת זרימת המערכת – תהליכים עיקריים נתאר תהליכים עיקריים: אפליקציית qyou .1משתמש (בליין) .aהרשמה למערכת ובקשה להכנס לתור של מסיבה: .iכניסה למערכת :המשתמש יכנס לאפליקציה דרך אייקון האפליקציה: .iiהמשתמש ילחץ על כפתור Connect with Facebook .iiiהמשתמש מועבר לדף פייסבוק לאישור הרשאות האפליקציה: .ivסיום ההרשמה למערכת :לאחר שהמשתמש לחץ על " ,"OKהוא מגיע למסך הראשי של האפליקציה. במסך הראשי של האפליקציה ישנם מגוון אירועים ולכל אירוע המשתמש יכול לראות את הפרטים הרלוונטים: כך המשתמש יכול לראות בנוחות את כל האירועים ולחפש את האירוע המתאים לו. .vכאשר המשתמש מוצא אירוע שהוא רוצה להרשם לתור שלו ,הוא לוחץ על המועדון הנבחר ומגיע למסך האירוע: .viבלחיצה על כפתור ,GO PARTYהמשתמש נרשם לתור בהצלחה ומקבל הודעת עדכון ) (Notificationשהבקשה להכנס לאירוע נשלחה בהצלחה. .2אדמין (סלקטורית/בעל מועדון) .aהכנסת משתמש (בליין) לתוך מסיבה דרך התור: .iכניסה למערכת :כמפורט בסעיף הקודם .מכיוון שהאדמין מסומן ב- DBכהרשאה שונה ,המסך שיקבל לאחר סיום הכניסה למערכת הוא המסך הבא: .iiלחיצה על כפתור :Queue .iiiלאחר לחיצה על הכפתור ,האדמין יקבל את מסך התור .במסך התור קיימות 3רשימות :רשימת הממתינים ,רשימת האנשים שאושרו להכנס למסיבה ורשימת האנשים שלא אושרו להכנס למסיבה. האדמין קודם כל צריך לבחור מאיזה רשימה הוא רוצה להכניס את הבליין – מרשימת הממתינים או מרשימת הלא מאושרים: .ivלאחר שבחר את הרשימה הנכונה ,וברשימה בחר את המשתמש שאותו רצה להכניס )המשתמשים מסודרים לפי דירוג משוכלל של המערכת( ,האדמין צריך ללחוץ על המשתמש שאותו רוצה להכניס: .vמסך פרטים אישיים על המשתמש ואישור המשתמש :האדמין רואה את הפרטים האישיים הרלוונטיים על המשתמש ולוחץ על כפתור "אישור" .bקבלת סטטיסטיקות על המועדון: .iכניסה למערכת :כמפורט בסעיף הקודם .מכיוון שהאדמין מסומן ב- DBכהרשאה שונה ,המסך שיקבל לאחר סיום הכניסה למערכת הוא המסך הבא: .iiלחיצה על כפתור :Statistics .iiiצפייה בסטטיסטיקות: פאנל ניהול המערכת – qyou.co.il – web application .1הוספת מועדון חדש: הוספת מועדון חדש אפשרית ע"י שני דרכים: .aהוספת פרטי המועדון: .iשם .iiעיר .iiiרחוב .ivכתובת +מספר .vלוגו של המועדון .viתיאור כללי על המועדון .bהכנסת קישור facebookשל המועדון והמערכת תשאוב את כל הפרטים באופן אוטומטי. .2הוספת ליין חדש: הוספת ליין חדש מתבצעת ע"י הכנסת פרטי הליין: שם ימים בשבוע טווח גילאים לוגו\תמונה של הליין תיאור כללי כעת ,כאשר הגדיר זאת ,יוכל דרך המערכת להוסיף איבנטים חדשים בפייסבוק כך שהמערכת שלנו תהיה מסוגלת לקרוא את המידע מהאיבנט בפייסבוק. צד לקוח Html5 + CSS3 את הבסיס של האפליקציה בנינו באמצעות התוסף הבא: /http://maker.github.io/ratchet תוסף זה נותן לנו כפתורים תפריטים יפים וכפתורים .אך את רוב האפליקציה כתבנו ועיצבנו בעצמנו. באפליקציה שלנו ניצלנו את היכולות של ,CSS3 + HTML5כך שהשתמשנו בהצללה ,פינות מעוגלות, אנימציה ב ) CSSאשר לא גורמת לאפליקציה להאט( ועוד אלמנטים מ .CSS3 השתמשנו בספריה של אייקונים הבאה: /http://fortawesome.github.io/Font-Awesome בשביל כל האייקונים באפליקציה. על מנת להראות את המפה של של המעדון ,השתמשמנו ב APIשל ,Google Mapsוהוספנו למפה pinבסמל של הלוגו המשנה את צבעו באופן רנדומלי. סה"כ ניצלנו את המירב מהטכנולוגיות הללו ,והקוד שלנו מאוד קריא וקל להבנה. AngularJS פיתחנו את האפליקציה ב HTML + CSS + JS בשביל שהאפליקציה תהיה מהירה ,לא השתמשנו ב .jqueryהשתמשנו ב .angularJS angularJSהיא סיפריה JSקטנה יחסית ,המנהלת את כל האפליקציה במודל .MVC angularJSמספקת חיבור ישיר בין המודל לבין הדף עצמו ) (viewע"י סינטקס חדש .וחוסכת הרבה קוד. לכל דף באפליקציה שלנו ,יש קונטרולר שהוא מתווך בין המודל ל .view למשל אצלנו בדף שמציג את ה ,QR-codeהקונטרולר נראה כך: כאן אנחנו מקבלים מהכתובת של הדף את ה lineIdואת ה .uuIdהחלק החשוב ביותר בקונטרולר הוא הקטע הבא: scope.qr$ קטע זה מגדיר משתנה הנקרא qrשיהיה גישה אליו ב .view הגישה אליו תתבצע כך }}qr{{ :בתוך הדף .HTML מומלץ לקרוא על angularJSכאן/http://angularjs.org : Single page application by angularJS את האפליקציה שלנו ממישנו כ ,Single Page Applicationכלומר יש רק דף HTMLאחד ,ואנחנו "מזריקים" לו תוכן אחר כל פעם .באמצעות זה שהאפליקציה היא Single Page Applicationאנחנו מקבלים את היתרון שאנחנו טוענים פעם אחת את כל הספריות שאנו משתמשים בהם ,ורק מחליפים את התוכן של הדף .דבר היוצר מצד אחד נראות של אפליקציה עם הרבה עמודים ,מצד שני חסכון בטעינה )הדף נטען פעם אחת כשהוא עולה וזהו(. נסביר את תהליך את Single Page Applicationעם angularJSעובד: מגדירים דף index.htmlכך: התגית htmlנראת כך: נצרף את הקוד של :angularJs ובתוך ה bodyשל הדף נגדיר כך: מה שעשינו כאן זה בעצם הגדרנו את האפליקציה עצמה כאפליקצית ,angularJSוהקטע קוד < >mobile-view></mobile-viewיוחלף בדף הרלוונטי. בקוד ה JSנשתמש במנגנון ה routesשל .angularJSנסביר זאת: קוד זה עובד רק עבור אפליקצית Qyouכמו שהוגדר בתגית ה HTML הקוד כאן בעצם מגדיר עבור כל לינק איזה קונטרולר ואיזה viewצריכים להיות פעילים .למשל כאן בדוגמא ,אם גלשנו ל"דף" lines/אז angularJSידחוף את ה viewשל lines.htmlלתוך ה < >mobile-view></mobile-viewהמקורי ,וידליק את הקונטרולר .linesCtrl כך בעצם ,כל "דף" שנקרא angularJS ,מחליף את התוכן וקורא לקונטרולר המתאים. כמובן ,שאנחנו לא באמת גולשים לדף ,lines/המנגון routesמנצל את ה anchorשל htmlובעצם קורא לדף כך: qyou/d3/AppAsAdmin/#/lines נשים לב שזה lines/#ולא lines/כך הדפדפן לא עובר לדף אחר וגם angularJSיודע כאשר קראו לזה ומעביר אותו לדף הנ"ל וכך מתבצע ה single Page Applicationבמערכת שלנו. Ajax with angularJS כעת נסביר על קריאות ה AJAXב .angularJS האפליקציה שלנו משתמשת המון בפעולת ,AJAXעבור כל קבלה ושליחה של נתונים אנחנו משתמשים ב .AJAXנובע גם מהעובדה שהאפליקציה היא Single Page Applicationואנחנו לא יכולים לעבור פתאום לשרת ולחזור חזרה לדף. כמו שציינו בספר בצד של השרת השתמשתנו ב ,RESTולכן כעת בצד בלקוח מאוד קל לנו לקבל ולשלוח נתונים. בשונה מ jqueryשצריך לכתוב כל פעם ajax.$עבור כל בקשת ,ajaxל angularJSיש פלאגין קטן המאפשר לקבל ולשלוח נתונים על גבי ajaxבפורמט restבקלות מאוד. נסביר: השתמשנו בפלאגין - restangular https://github.com/mgonto/restangular באמצעות הפלאגין הזה אפשר לבצע בקשות ajaxבשורה אחת ובקלות .לדוגמא על מנת לשלוף את כל הליינים באותו ערב פשוט נרשום כך: ('rest.all('lines שורה זאת בעצם יצרה בקשת ajaxלשרת וביקשה את כל הליינים ב .GET על מנת לעבוד עם הפלאגין הזה צריך להגדיר אותו פעם אחת: בקובץ ההגדרות הראשי app.jsרשמנו: כלומר בעצם הגדרנו את ה BASEשלנו ,כלומר את הכתובת של השרת ,ומעכשיו כל פעם שנבצע בקשת ajaxכמו ('rest.all('lines היא תתורגם מאחורי הקלעים ל: http://qyou.co.il:80/api/lines ותחזיר לנו את התשובה מהשרת. Phonegap לאחר שבנינו את כל האפליקציה ברמה של HTML + JS + CSSנשאר לנו להפוך את ה"אתר" שהכנו לאפליקציה ממש שמתאימה לאייפון. על מנת לעשות זאת ,השתמשמנו ב ,PhoneGapאשר "אורזת" את כל האתר שלנו לתוך פרוייקט xcodeשאותו אפשר לקמפל לאפליקצית אייפון אמיתית. האפליקציה שלנו דורשת יותר ממה ש PhoneGapהבסיסית נותנת ,לכן השתמשנו ב pluginsל :phonegap חיבור לפייסבוק ברמה של האייפון -רצינו שיהיה חיבור מלא בין פייסבוק לאפליקציה שלנו ,כלומר שכאשר משתמש רוצה להתחבר למערכת שלנו ,הוא צריך לעבור דרך פייסבוק .מבחינה פרקטית ,זה אומר שהמשתמש נכנס לאפליקציה שלנו ,לוחץ על כפתור "התחבר" ומועבר לאפליקצית פייסבוק המותקנת לו במכשיר )במידה ולא מותקנת אפליקציה הוא מועבר לדפדפן לאתר של פייסבוק( ושם הוא מאשר את האפליקציה שלנו ולאחר האישור הוא חוזר אוטומטית לאפליקציה שלנו ומתחיל לעבוד. סורק - QR-codeהאפליקציה שלנו צריכה להשתמש במצלמה של המכשיר ,לצורך סריקת הברקוד של המשתמש .פעולה זאת מתבצעת כאשר הבליין קיבל אישור כניסה למועדון והוא צריך להציג את האישור בכניסה לצורך בדיקה אם האישור הוא אמיתי. כלומר ,סיימנו את האתר שבנינו ,וארזנו אותו לתוך פרוייקט xcodeבאמצעות phonegapהתקנו את הפלאגינים שציינו למעלה. לאחר מכן phonegap ,נותנת לנו APIב JavaScriptלהפעלה של אלמנטים במכשיר ,השתמשנו בהם בחלקים מהאפליקציה ,לדוגמא כאשר אנחנו מודיעים לבליין שהוא קיבל אישור כניסה ,אנחנו מפעילים את הרטט במכשיר של הבליין ומפעילים מוזיקה במכשיר של הבליין. לאחר שסיימנו את כל החלקים האלה עם phonegapנשאר לנו רק לקמפל את הפרוייקט xcode ולהעלות אותו ל AppStoreשל .Apple נציין גם ,שלמעט ההתקנה של ה pluginsשציינו ,אנחנו יכולים גם להתקין את האפליקציה על אנדורואיד ,בלאקברי ,וינדוס פון בקלות רבה ,רק נצטרך להתקין את ה pluginsהללו בפרוייקטים האלה. Facebook האפליקציה שלנו מתממשקת ב 100%עם פייסבוק ,מההתחברות למערכת ,ועד לתמונת הפרופיל שאנחנו מציגים לסלקטורית על הבליין. לצורך עבודה כזאת מול פייסבוק ,השתמשנו בדברים הבאים: יצרנו אפליקצית פייסבוק ב /https://developers.facebook.comהגדרנו את האפליקציה הזאת כך שנוכל לגשת לחשבון על המשתמשים שלנו ולשאוב מהם את הפרטים האישיים שלהם כגון ,שם, משפחה ,גיל ,עיר מגורים ,גישה לחברים שלו ,אפשרות פרסום על הקיר שלו. פייסבוק :SDKפייסבוק הוציאו SDKבכל מיני שפות תכנות לצורך עבודה מולם .אנחנו השתמשנו ב :facebook JS SDK https://developers.facebook.com/docs/javascript/gettingstarted עם ה sdkהזה אנחנו עובדים מול פייסבוק לצורך של קריאה של נתונים מהם .ופרסום על הקיר של הבליין. כמו שציינו בסעיף על הפלאגין לפייסבוק ב PhoneGapלצורך המעבר בין האפליקציה שלנו לאפליקציה של פייסבוק ,התחברות וחזרה לאפליקציה שלנו. כאשר אנחנו משתמשים בכל מה שציינו למעלה ,אנחנו מסוגלים לעבוד בצורה חלקה מול פייסבוק. תקשורת בין שרת ללקוח באמצעות SOKCET I/O Websocketהוא פרוטוקול הרץ מעל ה .TCP-באמצעות ה Websocket -אפשר ליצר תקשורת דו כיוונית בין שרת ללקוח בזמן אמת ).(real time באפליקציה שלנו חשוב לנו מאוד תקשורת בזמן אמת כלומר כאשר בלין מבקש להכנס למועדון, הסלקטורית תקבל את הבקשה שלו באותו הרגע ולא לאחר מספר דקות. באותו אופן גם כשסלקטורית מאשרת לבליין להכנס ,נרצה שהבליין יקבל את אישור הכניסה באותו רגע כדי לא ליצור עומס בכניסה. לכן בחרנו להשתמש ב ,Websocket -שנותן לנו את הביצועים הנדרשים הללו. ניתן לראות את הדיאגרמה הממחישה את התקשורת בין הסלקטורית לבליין: צד שרת צד השרת נכתב כולו ב Node.jsבסביבת לינוקס )גרסת (Ubuntuע"י ) Webstorm IDEפירוט נוסף ניתן למצוא בפרק "טכנולוגיות בהן השתמשנו"(. עיצוב הקוד צד השרת נכתב תוך שימוש בתבנית העיצוב ) , MVC (model,view,controllerהמשמשת להפשטת היישום על ידי חלוקתו ל 3מרכיבים עיקריים ולצמידות נמוכה של המרכיבים דבר שאפשר לנו לבצע יותר שימוש חוזר בקוד ) ,(Reusableויסייע לנו בעתיד בעת תחזוקת הקוד. להלן תרשים ה MVCהמתאר את היחסים בין שלושת המרכיבים. כעת ,נפרט מה מטרתו של כל אחד מהרכיבים שהוזכרו לעיל באפליקציה שלנו. מודל ()Model מרכיב זה כולל את הייצוג של כל המידע עליו פועל היישום כלומר ,מכיל את כל טבלאות ה DBואת כל הפונקציות הבסיסיות שמימשנו עבור הטבלאות הללו )יצירה עריכה ,מחיקה(. חלק זה יתואר בהמשך בפירוט בפרק .Database מבט ()View מרכיב זה תפקידו להמיר את נתוני המודל לייצוג המאפשר למשתמש לבצע פעולת גומלין כלשהי ,באפליקציה שלנו מרכיב זה כולל את כל דפי ה ) ejs (embedded javascriptשל ממשק המנהלים שעל ידם אנו יכולים לבצע פעולות בסיסיות לאפליקציה כמו יצירה/מחיקה/עריכה של אירוע חדש מקום חדש ועוד... מרכיב זה כולל את הקבצים הבאים: תיקיית Adminהכוללת את 3תיקיות Place , Line , Eventשכל אחת מהן כוללת את הקבצים הבאים: – main.ejs oבעזרת דף זה אנו מציגים את כל המקומות/ליינים/אירועים שהמשתמש יצר. – new.ejs oבדף זה אנו מציגים טופס שבעזרתו המשתמש יכול ליצור מקום/ליין/אירוע בצורה נוחה ולשמור מקום זה ב DBעל ידי לחיצה על "שמירה". – edit.ejs oבדף זה אנו מציגים טופס שבעזרתו המשתמש יכול לעדכן מקום/ליין/אירוע קיםם בצורה נוחה ולשמור את העדכון ב DBעל ידי לחיצה על "עדכון". תיקיית – Errorתיקייה זו כוללת קבצי ejsשמופיעים כאשר המשתמש קיבל שגיאה בזמן השימוש באפליקציה )לדוגמא: שגיאת 404עבור ניווט לדף שלא נמצא( – HomePage.ejsדף הבית של ממשק הניהול. – Layout.ejsדף זה מכיל את הפאנל העליון הקבוע שמופיע בכל הדפים. בקר ()Controller תפקיד מרכיב זה לעבד ולהגיב לאירועים המתרחשים ב ,Viewכתגובה לפעולה של המשתמש. באפליקציה שלנו הבקר עונה לבקשות שהתקבלו מה View-מטפל בהם ומחזיר תשובה בפורמט ,JSONכמו כן בבקר נעשות בדיקות תקינות של קלט שהגיע מה View-לפני שקלט זה מועבר למודל. כעת על הפונקציות העיקריות בכל אחד מהקבצים שיצרנו ב .Controller authentication.js קובץ זה מכיל פונקציות המאמתות המשתמש עם חשבון הפייסבוק שלו שהצהיר עליו )כזכור ,ההתחברות לאפליקציה היא על ידי חשבון פייסבוק( בשימוש בפונקציות אלו אנו משתמשים במודל ) Passportקישור למודל זה (https://npmjs.org/package/passportבדיקות האימות עבור המשמש נעשות גם בין כל מעבר מדף לדף על ממת להבטיח שמשתמש לא יגיע לדפים "פנימיים" מבלי לעבור תהליך של אימות. facebook.js קובץ אלו מכיל את כל הפונקציות שפונות לשרתים של פייסבוק ומבקשות מידע שונה לטובת האפליקציה ,פונקציות אלו משתמשות במודול fbgraph )קישור למודול זה ( https://npmjs.org/package/fbgraphהמהווה Apiלשירותי פייסבוק הפונקציות הכלולות בו הם: – createNewEventפונקציה המשמשת את המשתמש ליצור Eventבפרופיל הפייסבוק שלו דרך אתר .Qyouהמספר המזהה של האיבנט שנוצר נשמר ב DB )בקולקציה (Eventומאפשר לנו לקבל חיוני מפייסבוק ביחס לאירוע זה. – GetFriendAttendingByEventIDפונקציה זו משמשת אותנו לקבלת מידע על האנשים שהוזמנו/אישרו הגעתם לאירוע זה. schedule.js קובץ זה מכיל פונקציות ש"רצות ברקע" ונקראות לפעולה באופן אוטומטי כל זמן מוגדר. למימוש פונקציות אלו אנו משתמשים במודול ) Cronקישור למודול (https://npmjs.org/package/cronהמאפשר לנו לקבוע זמן מחזורי קבוע בו נבצע פעולות מסוימות ,במערכות ההפעלה של Unixמשתמשים במנגנון זה על מנת לבצע פעולות באופן מחזורי. ) לינק להסבר מויקיפדיה על ממגנון הcron - ( http://en.wikipedia.org/wiki/Cron הפונקציות העיקריות בקובץ זה: – updateDateOfLinesפונקציה זו נקראת באופן אוטומטי כל בוקר ותפקידה הוא לעדכן את התאריך הבא של ליין שהוגדר באופן מחזורי )לדוגמא :נניח ויש לנו ליין קבוע בכל ימי שני וחמישי אז על ידי הפונקציה ביום שלישי בבוקר תאריך האירוע הקרוב של הליין ישתנה מיום שני ליום חמישי(. - UpdateQueueפונקציה זאת נקראת באופן אוטומטי כל 5דקות ותפקידה הוא להכניס לתור של אותו ליין את כל האנשים שאישרו את הגעתם לאירוע דרך אחד מהאיבנטים שנפתחו עבור האירוע בפייסבוק. – StartRankIncrementOfQueueפונקציה זו מופעלת לראשונה על ידי הסלקטורית כאשר האירוע מתחיל ולאחר מכן נקראת באופן מחזורי כל 3דקות ותפקידה הוא להעלות את הדירוג הזמני של כל כל המשתמשים הממתינים בתור וזאת על מנת למנוע מצב של "הרעבת" המשתמשים )הסבר מפורט יותר ניתן למצוא בחלק שמפרט על אלגוריתם ניהול התור מטה(. Places.js בקובץ זה ממושמות כל הפונקציות הפועלות על טבלת ה Placeשב DBנפרט על העיקריות שבהם: – calcLonAndLatבפונקציה זו נעשה שימוש כאשר יוצרים מקום חדש והיא משמשת אותנו לחישוב מיקום גיאוגרפי מדויק ) (lat & lonשל המקום על סמך הכתובת המלאה שלו ,המכילה את הפרמטרים :ארץ ,עיר ,רחוב ומספר רחוב )ניתן להעביר לפונקציה את הפרמטרים בעברית או באנגלית( .בפונקציה זו אנו משתמשים במודול ) geocoderקישור למודול (https://npmjs.org/package/geocoderשמשמש כ wrapperשל .google map apiהמיקום הגיאוגרפי המתקבל מהפונקציה נשמר ב DB ומשמש אותנו בפונקציות הבאות. – GetDistanceפונקציה זו מקבלת כפרמטר את המיקום הנוכחי של המשתמש ומספר מזהה עבור מקום כלשהו ומחשבת את המרחק בין המשתמש לבין המקום. Lines.js קובץ זה מכיל פונקציות רבות המספקות מידע עבור הליין כמו קודם נפרט על העיקריות שבהם – getLinesDataForMainScreenפונקציה זו נקראת בכל פעם שהמשתמש נכנס לאפליקציה ,הפונקציה מוצאת את כל הליינים הפעילים שצריך להציג למשתמש עבור כל אחד מהם מרכזת את המידע הנחוץ להצגה )ע"י פונקציית ( dataCollectionForLineבפורמט של JSONושולחת את המידע לצד הלקוח שם הוא מפוענח ומוצג על הסמארטפון. – GetDataAboutSpecificLineפונקציה זו נקראת לאחר שהמשתמש בחר בליין כלשהו בדף הרשאי של האפליקציה .פונקציה זו מייצרת אובייקט JSONהכולל את כל הנתונים הידועים לגבי אותו ליין )שם ,תאריך ,תיאור ,תמונה ,שם המקום בו מתרחש האירוע ,מרחק של המשתמש מהאירוע ועוד.(.. – getLinesDataSortByDistanceפונקציה זו מחזירה למשתמש את רשימת כל האירועים לפי המרחק הנוכחי שלו מכל אחד מהאירועים הפעילים שבאפליקציה. – getAverageAges/CalcGenderPropositionפונקציות אלו מספקות סטטיסטיקה לבעל המועדון והסלקטורית על יחס הבנים/בנות וממוצע הגילאים של הבליינים שנכנסו לאירוע ושל אילו שעדיין ממתינים בתור. Events.js קובץ זה מכיל פונקציות בסיסיות המספקות מידע עבור הליין לא מצאנו כי ישנם פונקציות לא ברורות הדורשות הסבר מיוחד בקובץ זה. Queue.js קובץ זה מכיל את כל הפונקציות המשמשות לניהול התור בפועל וביניהן הפונקציות הבאות: – addUserToWaitingListAndInitializeQueueRankפונקציה זו נקראת את כאשר המשתמש הגיע למסיבה וברצונו להיכנס לתור ,הפונקציה מכניסה את המשתמש לרשימת ההמתנה של אותו תור ומחשבת את ה Queue Rank ההתחלתי שלו )כפי שמתואר באלגוריתם התור המופיע מטה( לשם דירוג בתור. - getPeoplesWaitingSortByRankפונקציה זו נקראת כאשר הסלקטור מבקש לראות את רשימת על האנשים בתור ,הפונקציה יוצרת אובייקט JSONהמכיל פרטים על המשתמשים )תמונה ,שם ועוד , (..את הזמן שבו כל המשתמש ביקש להיכנס )על מנת להציג כמה זמן המשתמש ממתין( כאשר סדר המשתמשים באובייקט הנשלח נקבע על פי דירוגם מהגבוהה לנמוך. - generateUUIDפונקציה זו נקראת כאשר הסלקטורית אישרה את המשתמש וכעת אנו יוצרים עבור משתמש מספר UUIDלשם יצירת ברקוד ייחודי )שנשלח למשתמש על ידי (Web Socketאת המספר יצרנו ע"י המודול ) UUIDניתן לראות פירוט על המודול כאן .(https://npmjs.org/package/uuid : - VerifiedUserפונקציה זו נקראת כאשר הסלקטורית סורקת את הברקוד שהמשתמש מציג לה ,תפקידה של הפונקציה הוא לבדוק האם הברקוד שהמשתמש מציג הוא אכן הברקוד שנשלח לו. קבצים נוספים מחוץ ל MVC – SERVER.jsקובץ זה מהווה כ ENTRY POINTשל האפליקציה ,בקובץ זה אנו מבצעים התחברות לשרת בהתאם לסביבת העבודה עליה אנו עובדים ) Productionאו ,, (Developmentהתחברות ל ) DBע"י (mongoose וטוענים את המודלים הבאים http , Passport , Express :ו .Socket I/O - ROUTES.jsבקובץ זה אנו משתמשים ב Express Frameworkשל (/http://expressjs.com) Node.jsתפקידו של Frameworkזה הוא לבצע התאמה בין כתובת ה URLשהוזנה על ידי המשתמש לדפדפן לבין הפונקציה שצריך להריץ בצד השרת בעקבות בקשה זו ,במידה ולא נמצאה התאמה בין הכתובת שהוכנסה לבין אחת מהכתובות המופיעות בקובץ השרת יחזיר שגיאת ) 404דף לא נמצא(. קובץ זה בנוי במתודולוגיית ) RESTהסבר על RESTמויקיפדיה (http://en.wikipedia.org/wiki/Representational_state_transfer שמספקת לנו את היתרונות של פשטות וניהול של כל הניתובים בקובץ אחד ובצורה ברורה. – Package.jsonקובץ זה מכיל את כל המודולים מה NPMבהם השתמשו במערכת ,קובץ זה משמש להתקנת על המודלים הרשומים בו בשרת באופן הבא :כאשר אנו מעלים את השרת ומכניסים בקונסול את הפקודה Npm Installאז הרצת הפקודה גורמת לחיפוש בכל הקבצים בקוד קובץ בשם Package.json בתוך קובץ זה מחפשים את האובייקט dependenciesועל פי ה ) Keyהמייצג את שם המודול( וה ) valueהמייצג את הגרסא של המודול ( מתבצעת התקנת המודולים לשרת. אלגוריתם חישוב הדירוג עבור ניהול התור בחלק זה נסביר על האלגוריתם בעזרתו המערכת מנהלת את התור האלגוריתם מורכב מ 3 פרמטרים עיקריים – Global Rankמספר חיובי המייצג את הדירוג הכללי שיש לכל משתמש ,ביחס לרמת השימוש שלא באפליקציה באופן כללי ,ערך זה גדל באופן איטי יחסית. – Line Rankמספר חיובי המייצג את הדירוג שיש לכל משמש ביחס לליין ספציפי )כלומר הדירוג נקבע על פי מספר הפעמים שהמשתמש השתמש באפליקציה באותו הליין( ,ערך זה גדל באופן מהיר יותר מאשר .Global Rank – Queue Rankמספר חיובי שערכו הראשוני נקבע על סמך 2הפרמטרים בתוספת פרמטר המייצג את משך זמן ההמתנה של כל משתמש ,בניגוד ל 2הפרמטרים האחרים פרמטר זה הוא זמני ואין לא חשיבות לאחר שהמשתמש נכנס למסיבה. הבליינים בתור מדורגים באופן הבא: שלב ההגעה למסיבה :כאשר משתמש מגיע לתור ומבקש להיכנס למסיבה אנו מבצעים את הדברים הבאים: oמחלצים מה DBאת Global Rankשל אותו המשתמש )במידה וזהו השימוש הראשון שלו באפליקציה .(Global Rank=0 oמחלצים מה DBאת ה Line Rankשל אותו משתמש )במידה וזהו השימוש הראשון של המשתמש באפליקציה באותו הליין .(Line Rank =0 oמאתחלים את Queue Rankלערך הבא: }Queue Rank = MAX { Global Rank , Line Rank בזמן המתנה בתור :בכל 3דקות רצה פונקציה מתוזמנת בשרת ותפקידה הוא להגדיל את ה Queue Rankשל כל המשתמשים שממתינים בתור .פונקציה זו נצרה על מנת למנוע מצב של "הרעבת" משתמשים חדשים. לאחר הכניסה למועדון :לאחר שהמשתמש אושר על ידי הסלקטורית אין יותר חשיבות לערך ה ,Queue Rankמה שהמערכת עושה היא מעדכנת את ערך ה Global Rankואת ערך ה ) Line Rankביחס לאותו הליין( של המשתמש לטובת השימוש הבא שלו באפליקציה. Database בפרויקט עבדנו עם Databaseמסוג MongoDBעשינו זאת בעזרת הorginal design - (manufacturer ODMשנקרא Mongooseהמאפשר לעבוד בצורה נוחה וקלה ב MongoDBעם .Node.js להלן שרטוט המכיל את מבנה הטבלאות ב mongoDBהטבלאות נקראות קולקציות ולכן מעתה נשתמש במילה זו לתיאור טבלה )והקשר ההיררכי בינהן(. נפרט קצת כל כל אחת מהקולקציות שמופיעות בשרטוט למעלה: USER collection מכיל את כל המידע שאנו רוצים לשמור על המשתמש שכולל נתונים כללים על המשתמש )שם, שם משפחה ,מייל ,תאריך לידה ,מין ,תמונה ,טלפון ומידע נוסף מהפייסבוק ( לצד אובייקטים מעניינים יותר שאותם נפרט כעת . – EventInfoHistoryמערך אובייקטים זה מכיל מידע על כל היסטוריית הבילויים של המשתמש באוביקט זה אנו שומרים מידע חשוב כמו מספרים מזהים למועדון/ליין/אירוע/תור ,תאריך וזמן שהמשתמש ביקש להיכנס למועדון ,דגל בוליאני שמורה האם המשתמש נכנס למסיבה באותו האירוע,תאריך וזמן בו הסלקטורית אישרה את המשתמש והוא נכנס למועדון בפועל. – Barcodeמערך אובייקטים זה מכיל את הברקוד שהמשתמש קיבל באותו ערב בכניסתו לאירועים השונים )וזאת על מנת שבמידה והמשתמש יצא החוצה הוא יוכל לחזור בקלות למסיבה ע"י הצגת הברקוד( נציין כי ברקוד זה תקף לערב האירוע בלבד ולאחר מכן הוא נמחק מה.DB - – Verifiedמערך אובייקטים שמכיל את כל המקומות )על פי מספר מזהה( שבהם המשתמש מאושר לא מאושר )מאושר הכוונה שהסלקטורית במועדון אימתה את גיל האמיתי מול גילו בפייסבוק(. – LineRankמערך אובייקטים המכיל רשימה של מקומות ואת הדירוג של המשתמש במקומות אלו )הדירוג נקבע על פי היסטוריית הביקורים של המשתמש באותו ליין ומשמש לדירוגו בתור(. – QueueRankמערך אובייקטים המכיל רשימה של מקומות ושל התור ששייך להם, שדה בוליאני בשם Invitedהמציין אם המשתמש אישר את ההגעה דרך אחד מהאיבנטים של הליין בפייסבוק )במידה וכן הוא מקבל על כך סוג של "בונוס" בדירוג(, דירוג התור שנקבע על פי אלגוריתם ניהול התור שהוסבר קודם לכן. – GlobalRankדירוג גלובאלי המייצג עבור כל משתמש את מדד השימוש שלו באפליקציה. – UserTypeשדה המתאר מאיזה סוג המשתמש )משתמש רגיל ,בעלים ,יחצ"ן או סלקטורית(. PLACE collection מכיל את כל המידע שאנו רוצים לשמור על מקום בילוי כלשהו )שם ,כתובת ועיר ,לוגו ,סוג מקום הבילוי ומידע מהפייסבוק( נפרט כעת על השדות הפחות טריוואלים בקולציה זו. – geoמכיל מערך של 2מספרים המייצגים longitudeו latitudeשדה זה מאונדקס כ '.'d2 שדה זה מכיל את המיקום הגיאוגרפי של מקום הבילוי ומשמש לחישוב המרחק בין המשתמשים לבין מקום הבילוי. – Descriptionשדה המשמש לתיאור מילוי )עד 5000תווים( של המקום. – Ownerמערך המכיל רשימה של המשתמשים שהם הבעלים של המקום. – Linesמערך המכיל את כל הליינים )ראה פירוט על הקולקציה Lineמטה( שנפתחו עבור מקום בילוי זה. LINE collection מכיל את כל המידע שאנו רוצים לשמור ליין )שם ,תאריך יצירה ,תמונה ( נפרט כעת על השדות הנוספים בקולקציה – schedulingLineשדה בוליאני המשמש לציין האם הליין שנקבע הוא ליין מחזורי )ליין מחזורי זה ליין שמתקיים במועדון כלשהו בימים קבועים בכל שבוע( או שהליין הוא חד פעמי. – Daysשדה זה הוא נכנס לשימוש במידה והליין הנוכחי הוא ליין מחזורי ,שדה זה מכיל מערך של מספרים מ 0עד 6המייצגים את הימים הקבועים בהם הליין יתקיים ) – 0ראשון , – 1שני – 2 ,שלישי וכך הלאה.(... – Daysשדה זה הוא נכנס לשימוש במידה והליין הנוכחי הוא ליין מחזורי ,שדה זה מכיל מערך של מספרים מ 0עד 6המייצגים את הימים הקבועים בהם הליין יתקיים ) – 0ראשון , – 1שני – 2 ,שלישי וכך הלאה.(... – IsActiveשדה בוליאני המציין אם הליין עדיין פעיל. – LineDateשדה המציין את התאריך בו מתקיים הליין ,שדה זה מאונדקס מכיוון שביצענו שאילתות רבות באפליקציה על ערך זה והאינדוקס חוסך המון זמן תקורה. – GenderPropositionשדה המייצג את היחס בין המינים שדורש בעל הליין שעל ידו האלגוריתם יודע אם לתת עדיפות לבנים או לבנות בכניסה לתור. – MinAge Female/maleשדה המייצג את הגיל המינימאלי עבור נשים/גברים עבור אותו הליין. – Descriptionשדה המשמש לתיאור מילוי )עד 5000תווים( של הליין. – Promotersמערך המכיל את רשימת כל המשתמשים שהם יחצ"נים של הליין. ליין זה. – Eventsרשימת כל האיבנטים )ראה פירוט על הקולקציה Eventמטה( שנפתחו עבור – Queuesרשימת כל התורים )ראה פירוט על הקולקציה Queueמטה( שנפתחו עבור ליין זה. :EVENT collection מכיל את כל המידע שאנו רוצים לשמור עבור האיבנט מהפייסבוק של האירוע .קולקציה זו מכילה מידע בסיסי כמו שם האיבנט ,תאריך יצירה ,תמונה ומחיר כניסה לאירוע לצד מידע מורכב יותר שנפרט עליו מטה – facebookEventIdשדה זה מייצג את מספר המזהה של פייסבוק עבור האיבנט שיצרנו בפייסבוק )באמצעות מספר זה נוכל להוציא מידע חיוני מאוד על האירוע(. – Descriptionשדה המשמש לתיאור מילוי )עד 5000תווים( של האיבנט. .- eventStartDateשדה המציין את התאריך בו מתקיים האיבנט ,שדה זה מאונדקס מכיוון שביצענו שאילתות רבות באפליקציה על ערך זה והאינדוקס חוסך המון זמן תקורה. – eventStartTimeשדה המכיל את השעה בא מתקיים האירוע. – Invitedמערך של המשתמשים שהוזמנו – goingמערך של המשתמשים שאישרו בפייסבוק את הגעת לאירוע. :QUEUE collection קולקציה זו מייצגת את כל המידע שאנו צריכים לשמור עבור ניהול של תור ספציפי וכוללת את השדות הבאים – eventDateתאריך האירוע בו מתנהל תור זה. – IsActiveשדה בוליאני המייצג אם באותו הרגע התור פעיל. – Invitedמערך המכיל את רשימת המשתמשים שאישרו את הגעתם בלפחות אחד מהאיבנטים בפייסבוק המשוייכים לאירוע זה. – waitingמערך של אובייקטים המכיל את כל המשתמשים הממתינים בתור ואת הזמן המדויק בו כל אחד מהם ביקש להצטרף לתור. - approvedמערך של אובייקטים המכיל את כל המשתמשים שאושרו לכניסה על ידי הסלקטורית אך טרם נכנסו ואת הזמן המדויק בו הם אושרו. - acceptמערך של אובייקטים המכיל את כל המשתמשים שנכנסו למועדון ואת הזמן המדויק בו הם נכנסו. - Rejectedמערך של אובייקטים המכיל את כל המשתמשים שנדחו מהמועדון ואת הזמן המדויק בו הם נדחו. תוכניות עתידיות הרחבת המערכת ככלי לניהול יחצ"נים כך שהאפליקציה עצמה תהיה ככלי נלווה למוצר וההכנסה העיקרית תהיה ממכירת המידע. - BIG DATAהגדלת מסד הנתונים כך שיעבוד עם Cassandra DBעל מנת להפיק יותר מידע ממה שיש היום ולבצע אנליזות מתוחכמות. המלצות על בליינים מיחצנים ומבליינים אחרים שיעזרו להם להיכנס למועדונים. שביעות רצון של הבליינים. הרחבת האפליקציה לטובת מענה מגוון תורים )מסעדות ,אירועים ועוד(... טכנולוגיות בהן השתמשנו צד שרת Node.js Express framework o NPM o MongoDB Mongoose ODM o Restful API Amazon web services צד לקוח HTML5 CSS3 Rachet o Font awesome o Javascript AngularJS o PhoneGap אינטגרציה עם פייסבוק Passport Fbgraph Facbook JS SDK phoneGap facebook plugin סביבת עבודה Linux Ubuntu מערכת הפעלה Git – ניהול גרסאות ועבודה בצוות BitBucket אחסון הקוד בענן מאובטח IDE WebStorm 6
© Copyright 2024