DCSIMG
May 2011 - Posts - שלמה גולדברג (הרב דוטנט) - net.rabbi@gmail.com

שלמה גולדברג (הרב דוטנט) - net.rabbi@gmail.com

מרצה בסלע ויועץ בעולם ה - net.

May 2011 - Posts

Including Empty Directory While Deploying a Web Application

 

גיל התלונן ובצדק שכשעושים Deploy ל - WebApplication זה לא מכיל את התיקיות הריקות, והוא הציע להוסיף קובץ טקסט ריק,
אני מניח שכל מי שעבד בעולם ה - web נתקל בבעייה המעצבנת הזו, ולכן החלטתי אחת ולתמיד לפתור את זה.
 
 
פוסט זה מכיל הוראות כיצד לשנות את ההגדרות של ה- publish המוגדר בסביבת העבודה, הקוד לא עבר QA מקיף ולכן השינויים הם באחריות המשתמש.
 
 
ראשית הורידו את ה - dll הזה, הוא מכיל מחלקה אחת הנראית כך:
 

public class CopyEmptyFolder : Task

{

    public string ProjectFile { get; set; }

    public string OutputFolder { get; set; }

 

    public override bool Execute()

    {

        XDocument document = XDocument.Load(ProjectFile);

        var folders = (from element in document.DescendantNodes().OfType<XElement>()

                        where element.Name.LocalName == "Folder"

                        select Path.Combine(OutputFolder, element.Attribute("Include").Value)).ToList();

 

        foreach (var item in folders)

        {

            if (!Directory.Exists(item))

                Directory.CreateDirectory(item);

        }

 

        return true;

    }

}

 
המחלקה יודעת לקבל את שם קובץ הפרוייקט
בעזרת Linq to Xml אני מוציא את כל התיקיות המוגדרות בפרוייקט,
 
ולאחר מכן אני יוצר אותם בתיקייה שנוצרת לפני ה - publish.
 
 
אחר שהורדתם מקמו אותה בנתיב הבא: C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web
 
באותה תיקייה קיים קובץ בשם Microsoft.Web.Publishing.targets פתחו אותו,
בהתחלת הקובץ יש הגדרה של כל ה - targets, הוסיפו את השורה הבאה
 

<UsingTask TaskName="CopyEmptyFolder" AssemblyFile="CustomTasks.dll"/>

 
כעת חפשו task בשם CopyAllFilesToSingleFolderForPackage (אצלי יושב בשורה מספר 1944) בסוף ה task הוסיפו את השורה הבאה
 

<CopyEmptyFolder ProjectFile="$(ProjectPath)" OutputFolder="$(_PackageTempDir)"></CopyEmptyFolder>

 
 
כעת לאחר publish (ל - File System) כל התיקיות יועתקו.

Sela Dev Days 2011 - Internet Explorer 9 (10)

 

 
sela
 
 
בסוף יוני יתקיים כנס Dev Days של מכללת סלע, ובו ניתן יהיה לשמוע הרצאות מלאות (יום שלם) בנושאים הכי מתקדמים וחדשים.
 
אני בחרתי הפעם להרצות על פיתוח ל - Internet Explorer.
בתקופה האחרונה יש הרבה באזז על HTML5 וכל מה שקשור (וכמובן גם בכנס יש הרצאה על כך),
 
אבל כמו שכתבתי אני רציתי להתמקד ב - IE, ולכן אני אדבר על פיתוח של WebSlice, Search Providers, Pin sites, accelerators ואפילו על פיתוח AddIns לדפדפן ועוד כמה דברים מעניינים, כמובן שנעשה הצצה לגרסה 10 של הדפדפן.
 
אז אם אתם מעוניינים לשמוע על כך, בואו להירשם.
 
מתחרים איתי באותו יום ההרצאות הבאות:
 
בנייה ויניב על - Parallel Programming in .NET 4.0.
 
 
תומר שמם על - Introduction to Windows Phone 7
 
סשה גולדשטיין על - C++ Debugging
 
ועוד כששה מרצים על - Team Foundation Server 2010 and Visual Studio 2010
Posted: May 24 2011, 09:40 PM by Shlomo | with no comments
תגים:, ,

boxing - unboxing

 

בתפוז עלתה השאלה, מהו boxing - להלן הסבר בסיסי.
 
 
בעולם ה - NET המשתנים מחולקים לשני סוגים, אלה שנקראים value type ואלה שנקראים reference type, (נקרא להם val, ref בהתאמה) ההבדל המרכזי ביניהם הוא היכן הם ממוקמים בזיכרון כשמגדירים אותם,
ה - val ממוקם במקום שנקרא stack, שנניח נראה ככה (לא בדיוק)
 
name         type        value
i                 int          10
c12            char         f
 
לעומת זאת האובייקטים מסוג ref ממוקמים במקום אחר הנקרא heap כשהגישה אליו היא דרך מצביע מה - stack
 
i                int           10
c12           char         f
p1             Perons     23F2A (address of p1 data)
 
 
 
עכשיו נעבור לרגע לנקודה נוספת,
בעולם ה - Object Oriented אנחנו יודעים שאבא יכול להצביע לבן - לדוגמא - נניח שיש מחלקה בשם Person ויש מחלקה יורשת בשם Employee הקוד הבא יהיה חוקי
 
 

Person e1 = new Employee();

 
מכיוןן שבכל Employee יש Person קטן.
 
לפי הטענה הקודמת גם הקוד הבא יהיה חוקי
 

int i = 10;

object o = i;

 
זה אכן נכון, מכיוון ש - object הוא האבא של כל האובייקטים ב - NET.

אבל השאלה היא הרי object הוא מסוג ref (מכיוון שהוא class) לעומת int שהוא val (מכיוון שהוא struct), ברור לחלוטין שהערך של i יושב ב -stack אבל היכן יושב o ?
 
התשובה היא Boxing!

כשמגדירים מצביע מסוג ref אבל הערך האמיתי הוא val קורה הדבר הבא ב - stack
i                int           10
o              object      DD124 (address of o)
  
 
אבל ב - heap אין את סתם את הערך 10 אלא זה נראה כך:
 
-----------
      10
   Int32
----------
 
כלומר עטפו (box) את הערך 10 באובייקט וסימנו אותו שה - type האמיתי הוא int
וזהו boxing.
 
 
הבעייה עם התהליך היא בעיקר ב - unboxing - כלומר כשרוצים להוציא את הערך ולהשתמש בו, למשל
 
 

int i = 10;

object o = i;

int j = (int)o;

j++;

 
 
הפעולה שעשינו היא לא casting רגיל אלא unboxing - והתהליך כולל גם בדיקה האם האובייקט o מוגדר אכן כ - int. ניסיון להמיר אותו ל - long יכשל, אע"פ שבדרך כלל זה יעבוד - לדוגמא
 

int i = 10;

long l = i;

 
אך בדוגמא שלנו, שמדובר ב - unboxing חייבים להגדיר את ה - type האמיתי של o.
Posted: May 24 2011, 11:41 AM by Shlomo | with 2 comment(s)
תגים:, ,

WebWorker - html5

 

אחד מהחידושים ב - HTML5 הוא WebWorker.
 
בפוסט זה אני אראה את ההתחלה של עבודה עם WebWorker,
 
כידוע בעולם ה - javascript כל העבודה היא סינכרונית ולפעמים זה יכול להעיק על ה - UI, הדבר היחיד שיודע לעבוד בצורה אסינכרונית אלו קריאות ajax, בעזרת WebWorker אפשר להגדיר כל דבר שיעבוד בצורה אסינכרונית.
 
 
העבודה היא מאוד פשוטה, נגדיר קובץ js שיעבוד בצורה אסינכרונית ובקוד שלנו נייצר מופע של Worker וכפרמטר ניתן לו את שם הקובץ.
 

 var worker = new Worker('worker.js');

 
הקוד שלנו והקובץ Worker.js מתקשרים בעזרת postMessage כדי לשלוח הודעות מאחד לשני ובעזרת רישום ל - onmessage כדי לקבל הודעות, לדוגמה הקוד אצלנו יכול להיראות כך:
 

function webworkers2() {

    var worker = new Worker('worker.js');

    worker.onmessage = function (event) {

        document.getElementById('result2').textContent = event.data;

    };

    worker.postMessage('99945784');

}

 
בהתחלה יצרנו מופע של Worker, נרשמנו ל - onmessage והגדרנו שכאשר נקבל תשובה נציג את התוצאה על span כלשהו, בנוסף שלחנו הודעה (מספר כלשהו - כמובן שאפשר לשלוח כל מחרוזת שגם יכולה להיות אובייקט בפורמט JSON)
 
 
נראה את קובץ Worker.js
 

self.onmessage = function (event) {

    var res = isPrime(event.data);

    postMessage(res);

};

 
כמו שרואים אין כאן הרבה קוד, נרשמים ל - onmessage כדי לקבל את ההודעות מהלקוח ובסופו של דבר שולחים תשובה בעזרת postMessage.
 
 
זוהי דוגמא פשוטה יחסית אבל מראה כיצד אפשר להשתמש ב - Worker, מומלץ להסתכל על הדוגמאות ב - W3C (יש הרבה כולל קוד) אפשר לראות שם גם הגדרה נוספת של מושג בשם port ששייך ל - worker כך שניתן להגדיר יותר מערוץ תקשורת אחד עבור כל worker.
Posted: May 23 2011, 11:15 AM by Shlomo | with 2 comment(s)
תגים:,

Authentication providers - part 1 - Facebook

 

כמו שהבטחתי אני אראה כיצד אפשר לעשות תהליך לוגין לאתר שלנו על ידי חברה אחרת, ואתחיל עם פייסבוק, ואדגיש אנחנו נתמקד כרגע במצב שבו אנחנו צריכים מזהה ייחודי עבור משתמש ולא מעניין אותנו מידע נוסף עליו (אע"פ שאפשר לקבל מהם מידע נוסף אם המשתמש מסכים לכך)
 
 
מידע נוסף על התהליך של לוגין עם פייסבוק תוכלו למצוא כאן, וכאן
לחצן לוגין של פייסבוק כאן.
עטיפה של פקדי פייסבוק ב - net תוכלו למצוא כאן.
 
 
השלבים לבצע לוגין עם פייסבוק הם פשוטים וקצרים. (יחסית למתחרים)
 
 
ראשית אנחו צריכים לייצר אפלייקציה בפייסבוק, הכנסו ל - http://www.facebook.com/developers/ ולחצו על הלחצן (למעלה בצד ימין) Set Up New App
 
set up new app
 
מצד ימין אפשר לראות את כל האפליקציות שלכם (לחיצה עליהם תוביל לעריכה)
 
לאחר שלחצתם על Set Up New App תראו את המסך הבא:
 
new application
 
 
תנו שם לאפליקצייה שלכם (בשביל הדוגמא קראתי לאפליקצייה test application) 
סמנו את Agree (אם אתם מסכימים לתנאים)
לחצו על Create App
 
לאחר מכן תקבלו מסך בדיקת captcha
 
Security Check
 
 
נסו לכתוב את הטקסט שמופיע בתמונה (לי בדרך כלל לוקח כמה נסיונות עד שאני מליח לנחש נכון)
 
לאחר שהצלחתם תגיעו למסך הגדרות של האפליקצייה.
 
facebook application
 
 
אתם יכולים לערוך הגדרות שונות בטאבים השונים (חשוב לציין שבעזרת אפליקציות של פייסבוק אפשר לעשות עוד הרבה דברים ולא רק לוגין לאפליקצייה)
 
מה שחשוב מבחינתנו כרגע הוא הטאב השני (Web Site)
 
web site tab
 
 
אתם צריכים להגדיר את Site Url שיפנה לאתר שלכם (אתם לא חייבים להגדיר את Site Domain אלא אם כן אתם רוצים שיכולו לעשות לוגין גם מ - Sub Domain)
אי אפשר להגדיר localhost וזה חייב להיות דומיין אמיתי.
 
העתיקו לצד את הערך של Application Id ולחצו על Save Changes.
 
 
כעת סיימנו את ההגדרות בפייסבוק ונחזור לאפליקצייה שלנו.
ניתן לבצע את התהליך בצד הלקוח או בצד השרת, אני אדגים את העבודה בצד הלקוח.
 
הפעילו את הסקריפט הבא על לחצן כלשהו בדף הלוגין שלכם.
 
 

var appID = '1124445877994';

var scope = 'offline_access';

var redirectUrl = 'http://myDomain.com/myApp/loginpage.aspx';

 

window.location = 'https://www.facebook.com/dialog/oauth?client_id=' + appID +

                                                        '&scope=' + scope +

                                                        '&redirect_uri=' + redirectUrl +

                                                        '&response_type=token';

 
המאפיין appID הגדירו אותו לערך שקבלתם מפייסבוק.
 
המאפיין scope מגדיר אילו הרשאות אנחנו רוצים (כאן אפשר להגדיר שרוצים את המייל, רשימת החברים ועוד) כברירת מחדל ה - token שנקבל יחזיק מעמד ליום אחד ולאחר מכן נצטרך שוב לקבל אישור (יכול להיות שה - token ישתנה), היות שאנחנו רוצים לקבל token לתמיד נגדיר את הערך של scope ל - offline_access.
 
המאפיין redirectUrl נשלח לו להיכן נרצה שפייסבוק תחזיר את המשתמש אחרי ביצוע הלוגין אצלם. (הדומיין חייב להיות אותו דומיין שהגדרתם במאפיין Site Url בהגדרת האפליקצייה בפייסבוק)
 
 
כמעט סיימנו.
 
כעת המשתמש ילחץ על הלינק שמפעיל את הסקריפט והוא יגיע למסך הבא:
 
access facebook
 
במידה והמשתמש יאשר את הבקשה הוא יחזור למסך שלכם (מה שהגדרתם כ - redirectUrl) כך:
 
 
מה שאתם צריכים לעשות  זה להוציא את ה - token מתוך ה - hash ולבצע איתו לוגין באפליקצייה.
 
דרך אחת לעשות זאת זה קוד כזה:
 

$(document).ready(function () {

    if (window.location.hash.indexOf('access_token') > -1) {

        PageMethods.LoginAction(window.location.hash, function (res) {

            window.location = res;

        });

    }

});

 
ובצד שרת ניתן לכתוב משהו כזה:
 

[WebMethod]

public static string LoginAction(string token)

{

    int statr = token.IndexOf("access_token=") + 13;

    int length = token.IndexOf("&expires_in=") - 14;

 

    token = token.Substring(statr, length);

 

    if (DAL.UserExsit(token))

    {

        FormsAuthentication.SetAuthCookie(token, false);

        return "default.aspx"

    }

    else

    {

        DAL.CreateUser(token);

        return "firstTime.aspx";

    }

}

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

שיחזור החלון המוכר של השגיאות

 

בתפוז עלתה השאלה הבאה:
 
יש לנו בעבודה שני מחשבים. בשניהם מותקן VS 2010. באחד חלון הException נראה כמו החלון הרגיל, דהיינו עם אופציה לראות את הException הפנימי ועוד כל מיני דברים, אבל במחשב השני החלון של הException נראה מאוד מצומצם (ומצ'וקמק) ואין אופציות לראות את הException  הפנימי.
 
השאלה היא איך אני מאפשר לראות את חלון הException הטוב?
 
 
החבר'ה הטובים מתפוז לא ממש הבינו למה הוא מתכוון והיות שידידינו לא הסכים להביא צילום מסך הם לא יכלו לעזור לו.
 
אני מניח שהוא התכוון לדבר הבא:
 
חלון ה - Exception הטוב - זה החלון הזה:
 
exception
 
חלון ה - exception מצ'וקמק הוא התכוון לזה:
 
old exception
 
 
והפיתרון לקבל את החלון הטוב ולא את החלון המצ'וקמק, נמצא בסימון האפשרות enable the exception assistant תחת option --> debugging.
 
 
debug

Authentication providers - part 0 - הקדמה

 

כידוע לכל מפתח אתר - אחד החלקים המעצבנים בכל אתר הוא ניהול המשתמשים, שזה אומר לתחזק בסיס נתונים, לאפשר הוספת משתמשים, שיחזור סיסמאות וכמובן פיתוח דפי הרישום.
ומעבר לעלות מצד בעלי האתרים יש כמובן את המשתמשים המסכנים שצריכים לעבור תהליך רישום ולזכור סיסמא חדשה (במילא אנחנו משתמשים באותה סיסמא בכל האתרים).
 
 
קיימת חלופה מעניינת לנושא ניהול המשתמשים.
 
הרי יש כיום מספר חברות גדולות אשר מנהלות מליוני משתמשים,
חברות כמו:
גוגל (Gamil),
מייקרוסופט (Windows Live Id),
פייסבוק,
ועוד כמה.
 
 
אותם חברות מעוניינות שנשתמש בהם לצרכי הזיהוי, כלומר במקום שנפתח מנגנון זיהוי ונשמור את המידע בבסיס הנתונים, הם מוכנים שהזיהוי יתבצע דרכם.
 
בדרך כלל התהליך הוא כזה.
המשתמש גולש לאתר שלנו.
הוא רוצה לבצע לוגין.
אנחנו מעבירים אותו לדף של אותה חברה (פייסבוק, מיקרוסופט)
המשתמש מכניס אצלם את פרטי הכניסה שלו (שהוא מכיר אותם) ומאשר לשתף מידע עם האתר שלנו.
החברה מבצעת בדיקה האם המשתמש קיים ובמידה וכן, אנחנו מקבלים בחזרה מזהה ייחודי עבור הלקוח.
 
 
כברירת מחדל לא נקבל מידע אישי של המשתמש אלא רק מזהה ייחודי, כך שנוכל לזהות אותו בפעמים הבאות, במידה ונרצה בכל זאת לקבל מידע נוסף עליו (אימייל, רשימת חברים וכדו') נצטרך לבקש מהמשתמש אישור מיוחד.
 
 
כולם מרויחים מהתהליך הזה:
המשתמש: פטור מתהליך רישום ומזכירת סיסמא חדשה.
אנחנו: פטורים מפיתוח וניהול מנגנוני זיהוי.
החברות הגדולות: מקבלות פרסומת והאנשים מגדילים את התלות שלהם בחברה.
 
 
בסדרת הפוסטים הזאת אני אעשה מעבר על חברות גדולות כמו פייסבוק ומייקרוסופט (ועוד כמה) ונראה כיצד אפשר בקלות לעשות את התהליך איתם.
אני לא אדגים איך אפשר לקבל מידע נוסף אלא נתמקד באתר שצריך מזהה ייחודי ללקוח כדי שיוכל לזהות אותו בפעמים הבאות.
 
בפוסט הראשון בסדרה נעשה יחד את התהליך עם פייסבוק.

Collection Initializers for custom object

 

אחד הפיצ'רים הנחמדים שנכנסו ב - C# 3.0 הוא Collection Initializers.
 
עד C# 3.0 יכולנו לכתוב קוד כזה:
 

int[] arr = new int[] { 1, 2, 3, 34 };

מ - C# 3.0 אפשר גם לכתוב עבור Collections
 

List<int> list = new List<int>() { 1, 2, 3, 34 };

Dictionary<string, int> dic = new Dictionary<string, int>()

{

    {"a", 1},

    {"b", 2},

    {"c", 3},

    {"d", 4},

};

 
שזה באמת נחמד.
 
אבל יש דבר נוסף שטוב להכיר,
מסתבר שכל אובייקט שמממש את ICollection<T או שמממש את IEnumerable ויש לו מתודה בשם Add אפשר להשתמש בטריק הזה, לדוגמא:
 

class Person { }

 

class PersonManager : IEnumerable

{

    public void Add(Person item)

    {

 

    }

 

    public IEnumerator GetEnumerator()

    {

        throw new NotImplementedException();

    }

}

 

 

 

PersonManager manager = new PersonManager()

{

    new Person(),

    new Person(),

    new Person()

};

Posted: May 12 2011, 11:27 AM by Shlomo | with no comments
תגים:,

Detach and Attach - Entity Framework

 

מצב סביר בעולם ה - web.
 
משתמש ביצע לוגין.
הבאנו את המידע שלו בעזרת EF, (המידע שלו מכיל אובייקט - נניח קוראים לו User - שמכיל הפנייה לאובייקטים אחרים)
שמרנו אותו ב - Session אבל לא שמרנו את ה - Context מכיוון שלא רצינו לשמור על connection פתוח כל הזמן.
 
כעת עשינו שינוי כלשהו באובייקט ונרצה לשמור אותו בבסיס הנתונים.
 
אם נעשה את השינוי ישירות באובייקט ששמרנו בזיכרון, לא נוכל לבצע SaveChanges על ה - context, מכייון שהאובייקט ששמרנו שייך ל - Context אחר (שכבר נעלם).
אם נעשה את השינוי בבסיס הנתונים נצטרך גם לעשות את השינוי באובייקט שלנו כדי לשמור על אותו מידע.
 
 
הפיתרון שלכאורה אמור לפתור את הבעייה, הוא לבצע פעולת Detach על האובייקט User לפני ששומרים אותו בזיכרון, לבצע את השינויים בו, ולבצע פעולת Attach כדי להחזיר אותו ל - Context, ולאחר השמירה שוב לבצע Detach.
 
הבעייה עם זה היא ש - Detach מנתק את הקשר בין User לבין שאר האובייקטים שקשורים אליו.
 
 
לאחר התייעצות עם עידו פלטו וגיל פינק, עשיתי את הדבר הבא:
 
ביצוע פעולת סריאליזציה על האובייקט User (השתמשתי בפיתרון מהפוסט הראשון שלי).
שמרתי אותו בזיכרון.
לפני ביצוע השינוי בצעתי פעולת Attach.
עשיתי את השינוי ישירות על האובייקט.
SaveChanges.
ושוב סריאליזציה כדי לנתק אותו מה - Context.
 
 
הפיתרון עובד ודי משביע רצון.

New line in html tooltip

 

קורה לכם שאתם רוצים להציג tooltip פשוט של html ולהציג מידע בכמה שורות כשאתם מחליטים היכן לבור את השורה, תוכלו לכתוב קוד כזה:
 

<a href="#" title="Description:&#13Here is the description&#13&#13Info:&#13Here is the info">the link</a>

 
הסימון ;13&# נותן ירידת שורה, וכעת כשעומדים על הלינק זה יראה כך:
 
tooltip
Posted: May 08 2011, 04:06 PM by Shlomo | with 2 comment(s)
תגים:,

Unload OfficeScan

 

אחד מהאנטי וירוס הנפוצים בחברות הוא OfficeScan (עושה את העבודה נהדר).
 
הבעייה אם אתם רוצים לסגור אותו לכמה דקות מכל סיבה שהיא, הוא ירצה ממכם סיסמא שכנראה אין לכם ובסיר להניח שגם מנהל הרשת שכח אותה.
 
הפתרון פשוט.
 
גשו לספרייה
C:\Program Files (x86)\Trend Micro\OfficeScan Client
חפשו קובץ בשם:OFCSCAN.INI
פתחו אותו, וחפשו מקטע בשם Unload_Pwd
 
הערך שיש בו מוצפן ב - MD5
 
שנו את השורה כך שתראה כך:
Unload_Pwd=!CRYPT!111e8dc4081b13434b45189a720b77b6818
 
כעת הסיסמא שלכם היא: abcdefgh.
 
תהנו.
 
הפוסט מתבסס על האתר הזה
Posted: May 08 2011, 06:45 AM by Shlomo | with no comments
תגים:,

is of a type that is invalid for use as a key column in an index - Entity Framework

 

במידה ואתם משתמשים בשיטת Empty Model ב - EF, והגדרתם עמודה מסוג string שתהיה Primary Key, סביר להניח שבזמן שתעשו Generate database from model תקבלו את הודעת השגיאה:
 
 
 
Column 'Id' in table 'Entity1Set' is of a type that is invalid for use as a key column in an index.
 
כדי לפתור זאת חפשו את הגדרת העמודה בסקריפט שנוצר הוא יהיה כנראה מסוג:
nvarchar(max)
במקום הערך max הגדירו ערך הגיוני אחר ונסו שוב להריץ את הסקריפט, כעת זה אמור לעבוד.

עבודה עם פייסבוק

 

תומר קיסר העלה לאחרונה כמה סרטונים על עבודה עם פייסבוק
 
הרצאה מתוך סדרת הרצאות בנושא פיתוח לפייסבוק.בהרצאה זו תוסבר הדרך ליצור קשרים בין האתר שלכם כאתר חיצוני לבין פייסבוק.
מהי המשמעות של החיבור הזה?
ומהם הכלים שעומדים לרשותינו התוכניתנים.
הרצאה זו מוסברת הדרך לשלוט על ויזואליות של פקד ה - LIKE
וכמו כן השיטה לעבוד עם ספריות ה java script של פייסבוק

הרצאה שלישית

בהרצאה זו מודגמת הדרך ליצירת אינטגרציה בין אפליקציה אישית לבין פייסבוק תהליך שנקרא יצירת אפליקציית פייסבוק.