DCSIMG
March 2011 - Posts - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

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

March 2011 - Posts

Internet Explorer AddIn using SHDocVw and mshtml

 

כיצד אפשר לייצר AddIn שמוסיף קטעי html לכל הדפדפנים (IE) הפתוחים

 
(תודה לתומר קיסר על העזרה)
 
ראשית נוסיף את Microsoft.mshtml (זהו dll המאפשר שליטה על תוכן html - דוגמה לשימוש תוכלו לראות בפוסט Working with Microsoft.mshtml in c#)
 
לאחר מכן נוסיף את SHDocVw זה אמור להיות ב - C:\Windows\System32 (זהו dll המאפשר גישה לכל הדפדפנים הפתוחים)
 
 
כעת נרצה לקבל את כל החלונות הפתוחים, נריץ את הקוד הבא:
 

private static List<IWebBrowser2> GetIEWindows()

{

    List<IWebBrowser2> list = new List<IWebBrowser2>();

 

    ShellWindows windows = new ShellWindows();

 

    foreach (IWebBrowser2 item in windows)

    {

        if (item.Document is HTMLDocument)

        {

            list.Add(item);

        }

    }

 

    return list;

}

 
IWebBrowser2 מגיע מ - SHDocVw והוא מכיל את כל המידע על החלון הפתוח.
 
ShellWindows הוא האובייקט המכיל את כל החלונות.
 
ונבדוק האם האובייקט הוא מסוג HTMLDocument (שמגיע מ - mshtml) כי זה יכול להיות גם תיקיות פתוחות (explorer - לא הדפדפן אלא תיקייה במערכת ההפעלה)
 
 
 
כעת נרצה להוסיף בתחתית כל הדפדפנים הפתוחים את השם שלי, נריץ את הקוד הבא:
 

static void Main(string[] args)

{

    List<IWebBrowser2> ie = GetIEWindows();

    foreach (var item in ie)

    {

        string html = "<hr/><b>Shlomo Goldberg</b><hr/>";

        ((HTMLDocument)item.Document).body.insertAdjacentHTML("beforeEnd", html);

    }

}

 
כמובן שאפשר לשנות כל דבר ב - html, כרגע בחרתי להשתמש בפונקציה insertAbjacentHTML להוסיף בתחתית העמוד את ה - html,
 
וכך נראים הדפדפנים שלי אחרי ההרצה של הקוד.
 
 
SHDocVW mshtml
 
 
 
זה הבסיס וההתחלה ליצירת AddIn, מכאן אפשר לקחת את זה קדימה להרבה כיונים, לדוגמא:
ניתן לכתוב Window Service שירוץ ברקע ויעדכן כל הזמן את החלונות החדשים שתפתחו,
או שאפשר לכתוב לחצן ולהוסיף אותו ל - tool bar ובלחיצה עליו להפעיל קוד שיעשה משהו (כמו להסתיר את כל אובייקטי ה - flash באתר).

WCF 4 (Windows Communication Foundation) for Beginner - part 14

 

ללמוד WCF 4 פרק 14 - היכרות עם האופציות להגדרת המופעים של ה - Services, ועבודה עם כמה תהליכים במקביל.

 
 
נושאים בפרק 14.
היכרות עם הגישות השונות של יצירת מופעים.
כיצד לאפשר PerSession גם ב - http.
היכרות עם הגישות השונות לעבודה עם כמה קריאות לשירות בו זמנית.
 
 
היכרות עם הגישות השונות של יצירת מופעים.
כשכותבים שירות אנחנו יכולים להחליט באיזה מוד נעבוד, כלומר - כשמישהו יפנה ל - host וירצה להפעיל את אחד מהמתודות, ה - host יוכל להחליט:
 
 
האם לייצר מופע עבור כל קריאה - כלומר - בכל פעם שמישהו יפעיל מתודה יווצר מופע חדש של ה - service, אופצייה זאת נקראת PerCall.
 
אופציה נוספת היא שלכל Session יווצר מופע של השירות - אופציה זאת נקראת PerSession. (כל Session הכוונה לכל Proxy, אם הלקוח יוצר מופע חדש של Proxy עבור כל קריאה, ייוצר מופע חדש של השירות עבור כל קריאה)
 
אופציה נוספת היא שלכולם יש מופע אחד בלבד (Singelton) אופציה זאת נקראת Single.
 
 
ההגדרה מתבצעת בעזרת הגדרה של ServiceBehavior על השירות.
 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

 
יש משמעות לבחירה בכל אחד מהמודים האפשריים, כמו ההגדרה של משתנים שישמרו את הערך שלהם ועוד. (צריך לזכור לא לשמור יותר מידי מידע עבור כל משתמש)
 
 
כיצד לאפשר PerSession גם ב - http.
לא כל הפרוטוקולים תומכים ב - session, לדוגמא http לא תומך, כדי לאפשר בכל זאת Session בפרוטוקול http, נצטרך להגדיר ב - binding שיעבוד עם reliableSession מה שיגדיר שכל request חייב להגיע לשרת ואי אפשר לאבד אותו (כמו שיכול לקרות ב - http) אפשרי להגדיר אותו במידה וההודעות נשלחות ב - SOAP, לדוגמא
 

<wsHttpBinding>

  <binding>

    <reliableSession enabled="true" ordered="true"/>

  </binding>

</wsHttpBinding>

 
 
היכרות עם הגישות השונות לעבודה עם כמה קריאות לשירות בו זמנית.
אחד הדברים שעובדים מאוד צמוד להחלטה על ה - InstanceContextMode זה גם ההחלטה האם מאפשרים עבודה עם כמה תהליכים במקביל.
 
אפשר להגדיר שאסור לעשות קריאות אסינכרוניות (ברירת המחדל), כלומר קריאה למתודה יכולה להתחיל לעבוד רק עם הקריאה הקודמת הסתיימה, כמובן שאם נגדיר PerCall אין משמעות לא לאפשר קריאות אסינכרוניות מכיון שכל קריאה יוצרת מופע חדש, אבל במידה והגדרנו PerSesson לקוח אחד לא יוכל להפעיל כמה קריאות בו זמנית, ואם הגדרנו Single אף אחד לא יוכל להפעיל מתודה אלא אם כן הקריאה הקודמת הסתיימה.
 
כדי לאפשר בכל זאת קריאות אסניכרוניות נוכל להגדיר את ConcurrencyMode
 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

 
חשוב לשים לב ש - WCF לא מגדיר שום מנגנון לסינכרון ואנחנו צריכים לוודא שהקוד שלנו הוא thread safe.
 
 
לפעמים השירות שלנו קורא לשירות אחר שבתורו צריך להפעיל מתודה מסוימת בשירות שלנו (calback) מה שיגרום ל - timeout במידה והגדרנו Single (ב - ConcurrencyMode) מכיון ששירות A הפעיל את שירות B שקרא לשירות A שלא מאפשר לקריאות להתבצע כל עוד לא הסתיימה הקריאה הקודמת, במצב כזה ניתן להגדיר
 

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

 
 
Posted: Mar 28 2011, 10:27 AM by Shlomo | with 1 comment(s)
תגים:,

From string to bool in javascript

 

כששומרים משתנה בוליאני ב - cookie או ב - storage זה נשמר כמחרוזת, הבעייה כשמנסים להוציא את הערך ולשים אותו למשל ב - checkbox תמיד ה - checkbox יהיה מסומן מכיוון שגם אם הערך הוא "false" נקבל true, בגלל שכתיבה של הקוד הזה:
 

chk.checked = "false";

 
זהה לקוד הבא:

chk.checked = !("false" == true);

או לזה:

chk.checked = !("false" == false);

 
 
כדי להמיר את הערך (שנשמר כמחרוזת) ניתן להרחיב את האובייקט String.
 

String.prototype.ToBool = function () {

    return this.toLowerCase() == "false" ? false : true;

}

 
ואז נוכל לכתוב
 

chk.checked = "false".ToBool();

מי תומך בגישה ישירה לאלנטים ב - DOM בלי להפעיל את document.getElementById

 

אני מניח שהקוד הבא די ברור
 

<div id="rightCell">

</div>

 

<script type="text/javascript">

    var rightCell = document.getElementById('rightCell');

    rightCell.appendChild(document.createTextNode('Shlomo Goldberg'));

</script>

 
זה בסך הכול יוסיף ל - div את הטסקט Shlomo Goldberg.
 
 
אבל מה יקרה אם נריץ את הקוד הבא:
 

<div id="rightCell">

</div>

 

<script type="text/javascript">

    rightCell.appendChild(document.createTextNode('Shlomo Goldberg'));

</script>

 
אני לא יודע מה התקן מגדיר (חיפשתי ולא מצאתי)
בפועל בדקתי בדפדפנים שמותקנים לי על המחשב.
 
IE בכל הגרסאות ובכרום זה יעבוד מכיוון שהם יודעים לקשר בין המשתנה לאלמנט עם ה - id ב - DOM,
 
לעומת זאת ב - Firefox הקוד יכשל מכיון שהמשתנה rightCell מחזיר undefined.
 
 
אשמח לקבל הפניות לתקן.

document.createTextNode

 

כיצד להוסיף טקסט לאלמנטים בצד לקוח (ושיעבוד בכל הדפדפנים)

 
 
כידוע ב - IE קיים InnerText וב - Firefox יש את textContent (שמגיע מהתקן ו - IE9 כבר תומך בו)
 
jQuery לדוגמא בפונקציה text בודק באיזה דפדפן אנחנו נמצאים כרגע.
 
 
כדי לכתוב בצורה פשוטה ונכונה יותר ושיתמוך בכל הדפדפנים אני בדרך כלל מעדיך לכתוב קוד כזה
 

element.appendChild(document.createTextNode('text'));

 

Export Resource to Excel

 

במידה ואתם עובדים עם קבצי resx כנראה שמתי שהוא אתם רוצים לשפוך החוצה את התוכן שלהם לקובץ שניתן לעריכה על ידי כאלו שהם לא מפתחים,
 
הפרוייקט שכתב ידידי היקר תומר קיסר מקבל שם של תיקייה ומוציא החוצה קובץ אקסל עם כל המידע שיש בקבצי ה - resource, כרגע זה תומך בעברית ובאנגלית במידה ותרצו עוד שפות עליכם להרחיב את ה - enum
 

enum Language

{

    en = 3,

    he = 4

}

המספרים הם המיקומים של העמודה בקובץ האקסל (שני הראשונים הם עבור שם הקובץ וה - key).
 
 
(הפרוייקט עובד לי לוקלית אבל הוא לא מושלם ולא הושקע בו יותר מידי עבודה - הרגישו חופשי לתקן באגים)
Posted: Mar 22 2011, 07:03 PM by Shlomo | with no comments
תגים:, ,

Aggregate

 

שימוש נחמד ב - Aggregate של LINQ זה היכולת לחבר מערך כלשהו למחרוזת אחת המופרדת עם פסיקים (עבור שאילתת in).
 
לדוגמא:
 

int[] arr = { 1, 2, 3, 4, 5, 6 };

 

string s = arr.Select(x => x.ToString()).Aggregate<string>((x, y) => x + "," + y);

 
יחזיר: "1,2,3,4,5,6"
 
המשתנה x יכיל בכל סיבוב של הלולאה את הערכים הקודמים ואילו המשתנה y יכיל כל פעם את המשתנה הנוכחי.
 
אפשר להריץ את הקוד הבא כדי להווכח בכך:
 

string s = arr.Select(x => x.ToString()).Aggregate<string>((x, y) =>

            {

                Console.WriteLine("x:{0}\r\ny:{1}", x, y);

                Console.WriteLine();

                return x + "," + y;

            });

Posted: Mar 18 2011, 02:36 AM by Shlomo | with 3 comment(s)
תגים:, ,

propdm - snippet for a property with DataMember Attribute

 

אחד ה - snippets המוכרים ביותר הוא prop שזה קיצור דרך ליצירת automatic property.
 
אם תכתבו prop ותלחצו פעמיים על טאב ייוצר הקוד הבא:
 

public int MyProperty { get; set; }

 
אני כותב הרבה מחלקות עבור wcf ואני מעדיף לשים את ה - DataMember על המאפיינים אפילו שלא חייבים,
 
כדי לקצר את התהליך יצרתי את ה - snippet שתוכלו להוריד אותו מכאן, לאחר מכן ייבאו אותו בעזרת ה - Code Snipped Manager תחת תפריט Tools, ולאחר מכן כתיבה של propdm ייוצר הקוד הבא:
 
 

[DataMember]

public int MyProperty { get; set; }

Posted: Mar 17 2011, 07:25 PM by Shlomo | with no comments
תגים:,

Internet Explorer 9 Pin Site

כיצד לתת למשתמשים ב – IE9 חווית משתמש טובה יותר בעזרת Pin Site.

 

הקדמה:

בהרצאה שלי ב – SDP על IE9, HTML5, CSS3 דברתי על התכונות החדשות של הדפדפן, בפוסט זה נראה חלק מהתכונות המעניינות של הדפדפן.

 

כמשתמשים במערכת ההפעלה Windows 7 אנחנו יודעים שאפשר לנעוץ אפליקציות ב – Task Bar וליהנות ממגוון אופציות כמו Jump List בלחיצה ימנית על האפליקציה.

Untitled

בנוסף יש לנו את ה – Thumbnail ולפעמים יש בו לחצנים - לדוגמא

Untitled

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

לינקים:

באתר של מייקרוסופט יש דוקומנטציה מלאה לנושא עם הרבה דוגמאות קוד.

מימוש של חלק מהנושאים המדוברים כאן יש באתר "ערוץ מכללת סלע"

נושאים:

  • Pin Site
  • Jump List
    • Static
    • Dynamic
  • Thumbnail
  • Notifications

 

Pin Site

כדי לאפשר לאתר שלנו להינעץ בתוך ה – task bar צריך להוסיף מספר תגי meta שיגדירו מה לעשות, שאר הדפדפנים פשוט יתעלמו מאותם תגים, לדוגמא:

<meta name="application-name" content="SDP 2011" />

<meta name="msapplication-tooltip" content="Sela Developer Practice 2011" />

<meta name="msapplication-window" content="width=1024;height=768" />

<meta name="msapplication-navbutton-color" content="#FF3300" />

 

התג הראשון מגדיר את השם לאתר שלנו, התג שלאחריו מגדיר tool tip, התג שלאחריו מגדיר את גודל החלון שיפתח בזמן לחיצה ב – task bar, והתג האחרון מאפשר לשנות את צבע לחצני הניווט בדפדפן כדי שלמשתמש תהיה חוויה שהוא נמצא בתוך האתר שלנו.

בנוסף יש גם תג בשם msapplication-starturl שמאפשר לנו להגדיר את ה – url שלחיצה על הלינק ב – task bar יפתח (כברירת מחדל הוא פותח את הדף שממנו נעצו אותו ב – task bar)

 

Static Jump List

כדי להוסיף Jump List סטטי לאתר (יראו אותם בלחיצה ימנית על האתר) שוב נשתמש במספר תגי meta

<meta name="msapplication-task" content="name=SCC Home Page;

    action-uri=http://scc.sela.co.il;

    icon-uri=../scc.ico" />

<meta name="msapplication-task" content="name=Sela Home Page;

    action-uri=http://www.sela.co.il/;

    icon-uri=../sela.ico" />

<meta name="msapplication-task-separator" content="Sela Pages" />

<meta name="msapplication-task" content="name=Shlomo Goldberg Blog;

    action-uri=http://blogs.microsoft.co.il/blogs/shlomo/;

    icon-uri=../favicon.ico" />

אפשר לראות שימוש בתג msapplication-task שמקבל כפרמטר את הטקסט להיכן זה יפנה ותמונה, בנוסף אפשר גם להגדיר מפרידים בין tasks. בסופו של תהליך זה יראה כך:

Untitled

 

Dynamic Jump List

לפעמים נרצה לאפשר Jump List יותר דינמי ולשנות את התוכן של ה – Tasks לפי כל מיני פרמטרים (סוג המשתמש, מידע עדכני, ועוד), כדי לעשות זאת נצטרך להשתמש במתודות הבאות. (כל המתודות שייכות ל – window.external)

// Determines whether the current page was launched as a pinned site.

msIsSiteMode()

 

// Deletes the Jump List.

msSiteModeClearJumpList()

 

// Creates a new group of items on the Jump List.

msSiteModeCreateJumpList(title)

 

// Adds a new entry to the Jump List of a taskbar button.

msSiteModeAddJumpListItem(name, url, icon)

 

// Shows updates to the list of items in a Jump List.

msSiteModeShowJumplist()

 

ראשית תמיד חייבים לבדוק האם msIsSiteMode (האם האתר נעוץ) ורק אז ניתן להפעיל את שאר הפונקציות, אפשר להוסיף עד עשרים אבל בפועל יראו רק עשרה.

 

Thumbnail

כדי לאפשר למשתמש להוסיף לחצנים בתוך חלון ה – preview ב – windows 7 במידה והאתר נעוץ ב – task bar נצטרך להשתמש במספר פונקציות שמיד נכיר.

כמה נקודות לפני.

אפשר להוסיף עד שבעה לחצנים (גודל חלון ה – preview נקבע לפי מספר הלחצנים).

אחרי שקראנו למתודה שתפקידה להגיד "הצג את הלחצנים" אי אפשר להוסיף עוד לחצנים.

הלחצנים חיים ב – context של הטאב, בהתבסס על הסעיף הקודם, אם בעמוד הראשון יצרנו שלושה לחצנים אי אפשר בעמוד הנוכחי (באותו טאב) להוסיף עוד לחצן וחייבים לייצר את אותם לחצנים בדיוק כמו שיצרנו אותם בעמוד הקודם.

ניתן להסתיר לחצנים, ניתן להגדיר ללחצנים מצב disabled, ניתן לשנות את התמונה של הלחצן (כדי לאפשר מצב של לחצן כפול – כמו mute, unmute)

הנה המתודות שנצטרך להשתמש בהם.

// Determines whether the current page was launched as a pinned site.

msIsSiteMode()

 

// Adds a button to the Thumbnail Toolbar.

btnId = msSiteModeAddThumbBarButton(icon, tool tip)

 

// Defines an alternate icon image and tooltip for the specified button.

styleId = msSiteModeAddButtonStyle(btnId, icon, tool tip)

 

// Enables the Thumbnail Toolbar in the thumbnail preview of a pinned site.

msSiteModeShowThumbBar()

 

// Occurs when a user clicks a button in a Thumbnail Toolbar.

msthumbnailclick

 

// Changes the state of a Thumbnail Toolbar button.

msSiteModeUpdateThumbBarButton(btnId, enable, visible)

 

// Changes the icon image and tooltip of a Thumbnail Toolbar button.

msSiteModeShowButtonStyle(btnId, styleId)

 

כרגיל בהתחלה נבדוק האם אנחנו נמצאים במצב של pin, לאחר מכן נוכל להשתמש בפונקציה של add כדי להוסיף לחצנים נוספים (עד 7) כשכל קריאה תחזיר מספר כלשהו המייצג את הלחצן (יש לשמור את המספר במשתנה גלובלי כלשהו כדי שנוכל להבחין לאחר מכן על איזה לחצן המשתמש לחץ).

נוכל להוסיף ללחצן style (המאפשר לנו להגדיר לחצנים עם מצב החלפה – כמו play, pause)

בסוף התהליך נשתמש ב – show כדי להציג את כל הלחצנים.

ניתן להירשם לאירוע msthumbailclick המקבל כפרמטר בין היתר גם את מספר הלחצן.

if (typeof (onThumbnailButtonClicked) == "function") {

    if (document.addEventListener) {

        document.addEventListener('msthumbnailclick', onThumbnailButtonClicked, false);

    }

    else if (document.attachEvent) {

        document.attachEvent('onmsthumbnailclick', onThumbnailButtonClicked);

    }

}

 

function onThumbnailButtonClicked(btn) {

    if (btn.buttonID == btnMute) {

 

    }

}

 

נוכל להשתמש בפונקציה update כדי להציג או להסתיר לחצנים.

ונוכל להשתמש בפונקציה showButtonStyle כדי לשנות את התמונה של הלחצן.

 

Notifications

ישנם שני סוגי התראות שנוכל לתת למשתמש שמשהו קורה באתר שלנו (בזמן שהאתר נעוץ), האחד בעזרת icons והשני בעזרת הבהוב.

בעזרת הבהוב זה מאוד פשוט, במידה והאתר נעוץ וממוזער ומשהו קורה באתר ואנחנו רוצים למשוך את תשומת לבו של המשתמש, נוכל לקרוא לפונקציה msSiteModeActivate שתגרום לכך שהאתר יתחיל להבהב למשך עשרים שניות.

במידה ונרצה משהו יותר חכם, נוכל להשתמש בפונקציה msSiteModeSetIconOverlay(Icon, Description) שתוסיף על ה – icon בשורת המשימות icon אחר, בסוף התהליך נוכל להשתמש בפונקציה msSiteModeClearIconOverlay כדי להחזיר אותו למצב רגיל.

requestedExecutionLevel level=requireAdministrator

 

כיצד להגדיר את האפליקצייה שלכם שתרוץ עם הרשאות מנהל.

 
 
כדי להגדיר זאת תצטרכו להכין קובץ עם סיומת manifest ולכתוב את הקוד הבא
 

<?xml version="1.0" encoding="utf-8" ?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="WebcastController" type="win32"/>

      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

      <security>

        <requestedPrivileges>

            <requestedExecutionLevel level="requireAdministrator"/>

        </requestedPrivileges>

      </security>

  </trustInfo>

</assembly>

 

 
ולאחר מכן להוסיף את הקובץ לפרוייקט, לפתוח את המאפיינים שלו ובטאב application יש מקום לבחירת manifest file תבחרו בקובץ שלכם, ומאותו רגע האפליקצייה שלכם תרוץ עם הרשאות מנהל.
 
 

new WMEncoder crash visual studio

 

 
אם אתם עובדים עם Windows Media Encoder 9 Series מעל windows vista או windows 7 האפליקצייה עלולה להתרסק בניסיון ליצירת מופע של ה - encoder מבלי הודעה מוקדמת וללא פרטי שגיאה.
 
למיקרוסופט יש hotfix הפותר את הבעייה, תוכלו למצוא אותה כאן: http://support.microsoft.com/kb/929182
 
 

פוסט מספר 400

 

הנה אני בפוסט מספר 400 ולכבוד הפוסט החלטתי לרכז מקום שבו יהיו לי לינקים לכל הפוסטים שכתבתי, הכתובת היא http://blogs.microsoft.co.il/blogs/shlomo/pages/all-posts.aspx (וגם בלינקים בצד ימין)
 
אני אעדכן אותו מידי עשרה פוסטים בערך, וכמובן אמשיך לכתוב על דברים מעניינים.
 
 
שלמה - הרב דוטנט
Posted: Mar 09 2011, 12:20 PM by Shlomo | with 2 comment(s)
תגים: