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

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

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

April 2011 - Posts

mailto does not work in IE8 and windows7

 

בפורומים של NSDN עלתה הבעייה הידועה של mailto ב - IE8 תחת windows7,
 
הבעייה היא שבשימוש עם mailto כ - action של טופס לא מביא את הנתונים של ה - inputs (או שבכלל לא עובד)
 
 יש כל מיני פתרונות אפשריים ב - web, אף אחד מהם לא באמת עובד.
 
 
לכן כתבתי את הקוד הבא:
 

function send() {

 

    var inputs = document.getElementById('frm1').getElementsByTagName('input');

    var str = '';

    for (var i = 0; i < inputs.length; i++) {

        str += inputs[i].name + '=' + inputs[i].value + '%0a';

    }

 

    window.location.href = 'mailto:mailaddrss@server.co.il?body=' + str;

}

 
וכעת במקום להשתמש בקוד הזה:
 
 

<form action="mailto:mailaddress@server.co.il" method="post" enctype="text/plain">

    FirstName:<input type="text" name="FirstName">

    Email:<input type="text" name="Email">

    <input type="submit" name="submit" value="Submit">

</form>

 

 

תכתבו:
 

<form id='frm1'>

    FirstName:<input type="text" name="FirstName">

    Email:<input type="text" name="Email">

    <input type='button' name='btn' value='Submit' onclick='send()' />

</form>

 
אמנם זה לא הפיתרון שהיינו רוצים, אבל לפחות זה עובד.
 

Open Select User or Groups dialog

 

נשאל בתפוז וב - MSDN כיצד ניתן להקפיץ את החלון Select User or Groups.
 
לאחר קצת שיטוטים ומחשבות פניתי לברוך פריי שהוא אחד מהראשונים בצוות ALM (וגאון) היות שהנחתי שב - tfs יש צורך לבחור משתמשים,
 
ברוך חקר קצת וכעבור רבע שעה חזר אלי עם class שמלא ב - internals אבל הפעלה של אחת מהפונקציות שלו עושה את העבודה. כך נראה ה - main
 

class Program

{

    // Declare external functions.

    [DllImport("user32.dll")]

    private static extern IntPtr GetForegroundWindow();

 

    [DllImport("user32.dll")]

    private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

 

    static void Main(string[] args)

    {

        int chars = 256;

        StringBuilder buff = new StringBuilder(chars);

 

        // Obtain the handle of the active window.

        IntPtr handle = GetForegroundWindow();

 

        var selected = WindowsUserPicker.SelectAccounts(handle, true, true, false).Select(x => x.ToNTAccount());

    }

}

 
 
את המחלקה המלאה תוכלו לראות כאן.
 
את הפרוייקט המלא ניתן להוריד כאן.
 
לאחר ההרצה נקבל את החלון הבא:
 
Select User or Groups

כיצד לדבג קוד שרץ תחת IIS - צעד אחר צעד

במידה ואתם מריצים קוד ב – Visual Studio זה לא משנה מה בחרתם במאפיינים של הפרויקט האם לעבוד עם ה – server של visual studio או לעבוד מול IIS, תוכלו לדבג את הקוד.

אבל במידה והאפליקציה נמצא ב – IIS והרצתם אותה דרך גלישה בדפדפן ועדיין אתם רוצים לדבג, זה אפשרי בכמה שלבים פשוטים. (לקריאה על Remote Debugging)

ראשית פתחו visual studio. ופתחו את הפרויקט (אם יש לכם אותו – אם אין לכם עדיין אפשר לדבג אם יש לכם את קבצי ה – pdb אבל זה כבר נושא לפוסט אחר)

בחרו ב – Attach to Process (בדרך כלל תחת tools או לחיצה של ctrl + alt + p)

תקבלו את החלון הבא

image

חפשו Process הנקרא w3wp (במידה ולא מצאתם נסו לסמן את שני ה – checkbox הנמצאים למטה אחרי רשימת ה – processes)

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

ייתכן שתקבלו הודעת אזהרה שהתהליך יכול להעמיס על המחשב, אשרו אותו.

וכעת תוכלו לשים break points ולדבג כרגיל.

yield

 

כמו שהבטחתי בפוסט הקודם אני אראה דרך קצרה יותר לממש את IEnumerable ללא מימוש עצמאי של IEnumerator בעזרת yield.
 
ראשית נראה את הדוגמא ואז את ההסברים:
 
 
הנה המחלקה מהפוסט הקודם:
 

class PersonManager : IEnumerable

{

    private List<Person> _persons;

 

    public PersonManager()

    {

        _persons = new List<Person>();

    }

 

    public IEnumerator GetEnumerator()

    {

 

    }

}

כעת נממש את המתודה בעזרת yield.
 
 

public IEnumerator GetEnumerator()

{

    foreach (var item in _persons)

    {

        yield return item;

    }

}

 
למעשה אפשר פשוט להשתמש בזה, במידה וחשוב לכם לדעת מה קורה מאחורי הקלעים  אתם מוזמנים לפתוח relector ותראו שנוצרת מחלקה שלמה, כשהמתודה העיקרית נראית כך:
 
 

private bool MoveNext()

{

    try

    {

        switch (this.state)

        {

            case 0:

                this.state = -1;

                this.wrap = this.@this._persons.GetEnumerator();

                this.state = 1;

                while (this.wrap.MoveNext())

                {

                    this.item = this.wrap.Current;

                    this.current = this.item;

                    this.state = 2;

                    return true;

                Label_0072:

                    this.state = 1;

                }

                this.m__Finally3();

                break;

 

            case 2:

                goto Label_0072;

        }

        return false;

    }

    finally

    {

        ((IDisposable)this).Dispose();

    }

}

 

,

כשבפעם הראשונה שהמתודה תקרא הערך של state יהיה 0.
 
(לא ברור לי כיצד אפשר ב - case 2 לקרוא ל - Label_0072 כשהוא מוגדר בסקופ של ה - while - אולי למייקרוסופט מותר לעשות דברים שלנו אסור ?)
Posted: Apr 26 2011, 10:39 AM by Shlomo | with 3 comment(s)
תגים:, ,

foreach

מה זה foreach וכיצד מממשים אותו.
 
 
לאלו שנכנסים לעולם הפיתוח ולומדים #C, כשמגיעים ללולאות לומדים שיש כמה סוגים, כשהנפוצים הם, for ו - foreach,
ההסבר ללולאת for הוא די פשוט, לדוגמא:
 

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

for (var i = 0; i < arr.Length; i++)

{

    Console.WriteLine(arr[i];

}

 
מבצעים את שורת הקוד שבתוף גוף הלולאה כגודל המערך ובכל פעם מדפיסים מספר אחד מתוך המערך.
 
אותה תוצאה בתחביר foreach

foreach (int item in arr)

{

    Console.WriteLine(item);

}

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

class Person

{

    public int Age { get; set; }

    public string Name { get; set; }

}

 

class PersonManager

{

    private List<Person> _persons;

 

    public PersonManager()

    {

        _persons = new List<Person>();

    }

}

 
כמובן שיש הרבה סיבות למה להשתמש ב - PersonManager ולא להשתמש ישירות באוסף של Persons, זה יכול להיות כדי לעשות בדיקות לפני שמוסיפים Person למערך או כל סיבה אחרת,
 
כעת נניח שיש לנו מופע של PersonManager, ונרצה איכשהו לרוץ על כל ה - Persons שהוא מחזיק, לא נוכל כמובן לרוץ בלולואת for, מכיוון שהמשתנה persons_ מוגדר כ - private ומסיבות מובנות ולא נרצה כמובן לחשוף אותו,
 
פיתרון סביר יהיה לגרום שנוכל לכתוב קוד כזה:
 

PersonManager manager = new PersonManager();

 

foreach (Person item in manager)

{

 

}

 
כמובן שממבט ראשון זה נראה מוזר, מכיוון ש - manager אינו מערך, אז כיצד נגרום לו לאפשר את הקוד הזה, גם הקומפיילר לא יאהב את זה וייתן את הודעת השגיאה
 
foreach statement cannot operate on variables of type 'ConsoleApplication7.PersonManager' because 'ConsoleApplication7.PersonManager' does not contain a public definition for 'GetEnumerator'
 
כדי לפתור זאת נצטרך לממש את IEnumerable
 

class PersonManager : IEnumerable

{

    private List<Person> _persons;

 

    public PersonManager()

    {

        _persons = new List<Person>();

    }

 

    IEnumerator GetEnumerator()

    {

 

    }

}

 
אנחנו רואים שאנחנו צריכים לממש מתודה בשם GetEnumerator שמחזירה מישהו שמממש את IEnumerator, (בהמשך אני אסביר מדוע צריך שני interfaces שונים)
 
כעת נייצר מחלקה חדשה שתמממש את ה - interface הנדרש, ובשביל הנוחות נגדיר את המחלקה החדשה בתוך המחלקה PersonManager.
 
ה - interface מוגדר כך:
 

public interface IEnumerator

{

    object Current { get; }

    bool MoveNext();

    void Reset();

}

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

class PersonManagerEnumerator : IEnumerator

{

    private PersonManager _parent;

    private int _index = -1;

 

    public PersonManagerEnumerator(PersonManager manager)

    {

        _parent = manager;

    }

 

    public object Current

    {

        get

        {

            return _parent._persons[_index];

        }

    }

 

    public bool MoveNext()

    {

        _index++;

        return _index < _parent._persons.Count;

    }

 

    public void Reset()

    {

        throw new NotImplementedException();

    }

}

 
ב - ctor של המחלקה אחנו מקבלים מופע של PersonManager (ולכן חשוב שהמחלקה תהיה מוגדרת בתוך המחלקה PersonManager כך שתהיה גישה ל - private members), במתודה MoveNext אנחנו כל פעם מקדמים את ה - index שמוחזר על ידי ה - Current. (וזה דרך אגב הסיבה שאי אפשר לשנות ערכים של המערך ב - foreach, מכיוון שה - Current מוגדר רק עם get)
 
כעת נחזור למתודה הקודמת, שתראה כך:
 

public IEnumerator GetEnumerator()

{

    return new PersonManagerEnumerator(this);

}

 
 
הסיבה שצריך שני interface שונים, היא כדי לתמוך בלולאה בתוך לולאה, כי אם המחלקה עצמה הייתה מממשת את IEnumerator במידה ומישהו היה מבצע foreach בתוך foreach הוא לא היה מקבל את התוצאות הרצויות, כעת שכל מופע של foreach מקבל מופע של PersonManagerEnumrator משלו, זה לא יהווה בעייה.
 
 
שתי נקודות לסיום.
עדיף לממש את הגרסה הגנרית שלה (ודוגמא מלאה לקוד תוכלו לראות כאן)
בפוסט הבא אני אדגים שיטה יותר קצרה לממש foreach וזה בעזרת yield.
Posted: Apr 21 2011, 06:53 AM by Shlomo | with 8 comment(s)
תגים:,

ListItemCollection.SelectedItems Extensions

 

במידה ואתם צריכים לקבל מאובייקט המכיל ListItemCollection (כמו CheckBoxList ודומיו) את כל הערכים שהמשתמש בחר, תוכלו להשתמש בפונקצייה הבאה
 

public static class ListItemCollectionExtensions

{

    public static IEnumerable<ListItem> SelectedItems(this ListItemCollection collection)

    {

        foreach (ListItem item in collection)

        {

            if (item.Selected)

            {

                yield return item;

            }

        }

    }

 

 
 
בפוסט הבא אני אסביר מה זה ה - yield למי שלא מכיר (זה קיים מ - C#2.0)

HTML5 Geolocation

 
ישנם הרבה אפליקציות המתבססות על מיקום המשתמש, כמו אפליקציות המציגות מידע בהתבסס על מיקום המשתמש כגון תחנות דלק או מסעדות וכד'.
 
הרבה פעמים האפליקציות ירצו לדעת את המיקום של המשתמש כדי לאסוף סטטיסטיקות אודות המיקומים שממנו גולשים לאפליקציה שלהם.
 
בעבר כדי לכתוב אפליקציות מהסוג הזה היו שני אופציות, או שהיו מתקינים אצל הלקוח תוכנה כלשהי שיודעת לתת את המיקום שלו בהתבסס על GPS או שהיו מנסים לחשב את המיקום שלו לפי IP בהתבסס על בסיסי נתונים המסתובבים ברשת.
 
אבל מעולם לא היה את האופציה לכתובת אפליקציות מבוססות מיקום בצד הלקוח – כלומר html  ו – javascript בלבד.
 
התקן החדש מגדיר API לעבודה עם geolocation מצד הלקוח, אמנם הלקוח יהיה חייב לאשר האם הוא מוכן לשתף את המידע אודות מיקומו, הוא יוכל לבחור לאשר באופן חד פעמי או לתמיד (לפי אתר), לאחר שהמשתמש יאשר לשתף את המידע על מיקומו, הדפדפן יפנה לשירות כלשהו (התקן לא מגדיר כיצד לממש את השירות הוא רק מגדיר את ה – API), לאחר שהפנייה לשירות המרוחק תסתיים בהצלחה, הדפדפן יקבל את הקורדינטות ועוד מספר פרמטרים (חלק מהפרמטרים הם תלוי device.
 
רמת הדיוק של הקורדינטות תלויה מתוך איזה סביבה מריצים את ה – API, מתוך מחשבים המחוברים לרשת רגילה המידע בדרך כלל יהיה פחות מדויק, מחשבים המחוברים ברשת אלחוטית יהיו יותר מדויקים וכמובן מכשיר עם GPS יהיה הרבה יותר מדויק מכל האחרים.
 
כדי להתחיל לעבוד עם geolocation נצטרך להכיר את ה - API שלו שהוא ממש פשוט, יש לנו את שלושת הפונקציות הבאות:
 
getCurrentPosition
 
watchId = watchPosition
 
clearWatch(watchId)
 
 
כש - getCurrentPosition מחזירה את המיקום ברגע נתון לעומת watchPosition שכל הזמן מעדכנת במידה ויש שינויים במיקום ו - clearWatch עוצרת את watchPosition
 
למעשה אחרי שמכירים איך המתודה getCurrentPosition עובדת כבר מבינים איך watchPosition עובדת, מכיוון שהם אותו דבר מלבד ההבדל היחיד ש - watchPosition מחזירה id עבור clearPosition.
 
שני המתודות הראושנות חייבות לקבל מתודה להפעלה במידה והקריאה הצליחה
ואפשר לשלוח כפרמטר שם למתודה עבור כישלון
ומספר פרמטרים נוספים (האם לאפשר רמת דיוק גבוהה, כמה זמן לשמור את הנתון האחרון שהתקבל ו - timeout).
 
 
דוגמא לקריאה פשוטה:
 

navigator.geolocation.getCurrentPosition(ongoeSuccess);

 

 
 
דוגמא לקריאה עם כל הפרמטרים:
 

navigator.geolocation.getCurrentPosition(ongoeSuccess,

                                    ongoeError,

                                    {

                                        enableHighAccuracy: true,

                                        maximumAge: 600000,

                                        timeout: 0

                                    });

 
 
 
שני הפרמטרים הראשונים כמו שאמרנו הם מתודה להפעלה במידה והקריאה הצליחה ומתודה להפעלה בזמן שהקריאה נכשלה, שאר הפרמטרים
הפרמטר הראשון מדבר על רמת דיוק גבוהה יותר בזמן המדידה,
הפרמטר maximumAge מדבר על כמה זמן לשמור ב - cache את תוצאות הקריאה האחרונה,
והפרמטר האחרון מדבר על timeout כשהערך 0 שולח את האחריות למי שמריץ בפועל את הקריאה.
 
 
נראה את המתודה ongoSuccess.
 

function ongoeSuccess(e) {

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

    d.innerHTML = 'lat: ' + e.coords.latitude + '<br/>' +

    'lon: ' + e.coords.longitude + '<br/>' +

    'acc: ' + e.coords.accuracy + '<br/>' +

    'time: ' + e.timestamp + '<br/>';

}

 
הפרמטר e מכיל שני מאפיינים חשובים, אחד timestamp המכיל את הזמן שבו המדידה התבצעה בפועל והשני cords המכיל מספר פרמטרים חשובים כמו המיקום ורמת הדיוק, בנוסף יש עוד מספר פרמטרים שתלויים במי שמריץ את הקריאה (כמו גובה ועוד כמה אחרים).
 
במידה והקוד שלכם ירוץ על מחשב רגיל סביר להניח שלא תקבלו דיוק גדול מידי (אני קבלתי דיוק של 4000 מטר - שזה אומר כישלון מוחלט, אלא אם כן אני רוצה לדעת את המדינה), אבל במידה והקוד ירוץ על גבי סלולר שיש לו GPS תקבלו רמת דיוק מאוד גבוהה כמובן.
 
 
דוגמא לשימוש עם google maps כדי לדעת היכן אתם נמצאים. (הדוגמא המלאה נמצאת כאן)
 

 

 

function initialize() {

    navigator.geolocation.getCurrentPosition(function (e) {

        var myLatlng = new google.maps.LatLng(e.coords.latitude, e.coords.longitude);

 

        var myOptions =

        {

            zoom: 10,

            center: myLatlng,

            mapTypeId: google.maps.MapTypeId.ROADMAP

        };

 

        var map = new google.maps.Map(document.getElementById("map"), myOptions);

 

        var marker = new google.maps.Marker({

            position: myLatlng,

            map: map,

            title: 'Your Location'

        });

 

    });

}

 
 
במידה והמתודה נכשלה תוכלו לקבל את המידע אודות השגיאה, לדוגמא: (העתקתי מה - MSDN)
 

function ongoeError(error) {

    var message = "";

    // Check for known errors

    switch (error.code) {

        case error.PERMISSION_DENIED:

            message = "This website does not have permission to use the Geolocation API";

            break;

        case error.POSITION_UNAVAILABLE:

            message = "The current position could not be determined.";

            break;

        case error.PERMISSION_DENIED_TIMEOUT:

            message = "The current position could not be determined " + "within the specified timeout period.";

            break;

    }

    // If it's an unknown error, build a message that

    // includes information that helps identify the situation so that

    // the error handler can be updated.

    if (message == "") {

        var strErrorCode = error.code.toString();

        message = "The position could not be determined due to " + "an unknown error (Code: " + strErrorCode + ").";

    }

    alert(message);

}

 
 
חשוב לזכור שכשמנסים להשתמש במתודות של geolocation לפני שזה יעבוד הדפדפן יוודא האם המשתמש מוכן לשתף את המידע אודות מיקומו.

Convert xps to image

 

כדי להמיר קובץ xps לתמונה מצאתי את xps2img,
מאוד פשוט וקל להשתמש בו.
 
1. הורידו את xps2img.
2. פתחו command line וכתבו:
xps2img.exe filename.xps
 
זה ימיר לכם את הקובץ לתמונה.
 
(אני השתמשתי בו כדי להמיר קובץ pdf לתמונה, המרתי אותו ראשית ל - xps (על ידי הדפסה ל - xps) ולאחר מכן המרתי אותו לתמונה.
Posted: Apr 12 2011, 01:12 PM by Shlomo | with no comments
תגים:, ,

text-shadow CSS3

 

כחלק מהתקן של CSS3 הגיע מאפיין חדש בשם text-shadow שמגדיר צל עבור טקסט.
 

div

{

    font-family: Arial;

    font-size: 55px;

    width: 250px;

    height: 250px;

    border: 1px solid black;

    margin: 20px;

    padding: 20px;

    text-shadow: rgba(0,0,0,0.7) -1px -1px,

                rgba(0,0,0,0.5) -2px -2px,

                rgba(0,0,0,0.3) -3px -3px;

    background-color: Yellow;

}

 

 

<div>

    Sela College Channel

</div>

 
 
 בדוגמא אפשר לראות שמוגדר כמה שבות של צל.
התוצאה של הקוד הזה:
 
text-shadow
 
 
נכון להיום זה עדיין לא נתמך ב - IE, נקווה שהם יתמכו בזה בקרוב.
Posted: Apr 11 2011, 10:50 AM by Shlomo | with no comments
תגים:, , , ,

background CSS3

 

מהם השינויים במאפיין background בתקן CSS3

 
 
כחלק מהתקן של CSS3 נכנסו מספר שינויים במאפיין background, חלקם כבר ממומשים וחלקם עדיין לא.
 
בפוסט זה אני אתאר את חלק מהמאפיניים החדשים הממומשים בו.
 
 
מאפיינים:
box-shadow
size
Image
clip
attachment
 
 
box-shadow
מאפיין זה נותן את היכולת לתת צל לכל אלמנט בעמוד, הוא מקבל ששה פרמטרים:
 
מספר מה ההפרש לצד ימין (או לשמאל אם מדובר במספר הקטן מ - 0) מהאלמנט עצמו.
מספר מה ההפרש למטה (או למעלה אם מדובר במספר הקטן מ - 0) מהאלמנט עצמו.
מספר המאפיין את עוצמת הטישטוש של הצל.
מספר המציין את ההתפשטות של הצל.
צבע הצל.
פרמטר בשם inset המגדיר האם הצל הוא חיצוני לאלמנט או בתוך האלמנט.
 
 
שני המאפיינים הראשונים הם חובה, השאר אופציונליים.
 
דוגמא:
 

div

{

    width: 150px;

    height: 150px;

    margin: 20px;

    box-shadow: 5px -5px 0px 0px rgb(150,150,150);

    border: 1px solid black;

}

 
נקבל את האפקט הבא
 
box shadow
 
אפשר גם לתת כמה שכבות של צל, למשל:
 
 

div

{

    width: 150px;

    height: 150px;

    margin: 20px;

    box-shadow: 5px -5px 0px 0px rgb(150,150,150),

                7px -7px 0px 0px rgb(175,175,175),

                10px -10px 0px 0px rgb(200,200,200);

    border: 1px solid black;

}

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

div

{

    width: 150px;

    height: 150px;

    margin: 20px;

    box-shadow: 0px 0px 0px 5px rgba(0,0,0, 0.1) inset,

                0px 0px 0px 10px rgba(0,0,0, 0.2) inset,

                0px 0px 0px 15px rgba(0,0,0, 0.2) inset,

                0px 0px 0px 20px rgba(0,0,0, 0.3) inset,

                0px 0px 0px 25px rgba(0,0,0, 0.4) inset,

                0px 0px 0px 5px rgba(0,0,0, 0.5) inset;

    border: 1px solid black;

    background-color: Orange;

}

 

box-shadow

 
 
 
background-size
בכל סביבות הפיתוח שאנחנו מכירים יש אפשרות לקבל תמונה מהגרפיקאי ולהגיד לאובייקט שמכיל את התמונה באפליקצייה לשנות את גודל התמונה לפי הגודל הרצוי, גם ב - html כשאנחנו שמים אובייקט img אפשר לשנות את גודל התמונה, אבל אף פעם לא יכולנו לשנות תמונה כשהיא הייתה מוגדרת ברקע של האלמנט, מעכשיו נוכל לעשות זאת, המאפיין מקבל את האופציות הבאות:
 
auto - מה שהיה עד היום (ברירת מחדל).
contain - מתאים את גודל התמונה לגודל הכי גודל שמתאים לרוחב וגובה האלמנט שמכיל אותו. כשהוא שומר על היחס גובה רוחב.
cover - מתאים את גודל התמונה לגודל הכי קטן שמתאים לרוחב וגובה האלמנט שמכיל אותו. כשהוא שומר על היחס גובה רוחב.
מספר בפיקסלים.
מספר באחוזים.
 
 
background-image
יודע לקבל יותר מתמונה אחת בו זמנית (בעזרת הפרדה עם פסיקים) כך שיהיה ניתן לשים כרקע יותר מתמונה אחת.
 

background-image: url(m.png), url(c.png);

 
background-clip
מגדיר מהיכן מתחיל שטח הציור של הרקע,מקבל את האופציות הבאות.
 
border-box - ברירת המחדל, מתחיל מהנקודה העליונה כולל השטח של ה - border.
padding-box - מתחיל מאחרי ה - border.
content-box - מתחיל מהתוכן.
 
clip
 
 
 
background-attachment
יודע לקבל שני פרמטרים.
scroll - ברירת המחדל, מגדיר שתמונת הרקע תגלל יחד עם האלמנט במידה ויש גלילה.
fiexd - מגדיר שבמידה ויש גלילה התמונה לא נגללת.
Posted: Apr 10 2011, 07:38 AM by Shlomo | with 2 comment(s)
תגים:, ,

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

 

אחד הדברים שמייקרוסופט עשו בדפדפן החדש הוא לאחד את שורת הכתובת עם שורת הטאבים
address bar and tabs
 
(אפשר לשנות את היחס בין שורת הכתובת לטאבים בעזרת גרירה של שורת הכתובת מצידה הימני.)
 
מסתבר שהשינוי הזה נחמד למי שיש לו מסך גדול, לבעלי המסכים הקטנים (או רזולוציות נמוכות) השינוי הזה הוא לא הכי נוח.
 
ניתן להחזיר את המצב לקדמותו בעזרת סימון האופציה הבאה: (קליק ימין על אחד מהטאבים)
 
ie9 tabs

RegExp javascript

 

הקדמה.
כמעט כל שפה תומכת בעבודה עם Regular Expression, לשפה זו יש יכולות חזקות בעבודה עם מחרוזות והיא מאוד עוצמתית ומהירה.
יש לה אכן תחביר מוזר שצריך להתרגל אליו ולהכיר אותו (או לחפש כל פעם את הביטוי המתאים) בפוסט זה אני אעשה מעבר מהיר על הפונקציות השונות של RegExp ואיך עובדים איתו - אני לא אסביר על התחביר של regular expression אלא אני יוצא מתוך הנחה שיש לכם כבר אחד מוכן ואתם רוצים לדעת כיצד משתמשים בו.
 
 
בניית ביטויים.
כדי לייצר מופע של RegExp ניתן לעשות השמה של הביטוי לתוך משתנה או להשתמש ב - ctor של RegExp, כך:
 

var reg = /pattern/;

var reg = new RegExp("pattern");

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

var numbersOnly = /^\s*\d+\s*$/;

 
נוכל להריץ עליו את המתודה exec או את המתודה test, כך:
 

var res = numbersOnly.exec(value1);

res = numbersOnly.test(value1);

 
ההבדל ש - exec מחזיר null אם הביטוי לא נכון ובמידה והביטוי נכון הוא מחזיר את הערך,
לעומת test שמחזיר ערך בוליאני האם המחרוזת תואם לביטוי.
 
בדרך כלל נעדיף את השימוש ב - test. מכיוון שנוח יותר להשתמש בה בפקודות if.
 
 
עבודה עם מחרוזות.
למחרוזות ב - javascript יש שני מתודות שעובדות עם ביטויים, replace ו - match.
replace מחליף את הביטוי בערך אחר, למשל:
 

var r = new String('shl123om').replace(/[0-9]/, '  FFF  ');

 
יחזיר: shl   FFF   23om.
 
הסיבה שזה לא החליף את כולם היא מכיוון שכברירת מחדל הוא מתייחס רק למקום הראשון שהוא מצא תואם לביטוי, נוכל להגדיר שאנחנו רוצים להחליף את כל מי שמתאים לביטוי, נעשה זאת בעזרת ההגדרה של global. (שימו לב ל - g)

var r = new String('shl123om').replace(/[0-9]/g, '  FFF  ');

 
 
 
המתודה match מחזירה מערך שמכיל את כל מה שמתאים לביטוי, למשל:
 

var arr = new String('shl123om').match(/[0-9]/g);

 
יחזיר מערך בגודל 3 (עם כל המספרים)
 
 
 
 מאפיינים שונים.
לכל אובייקט מסוג RegExp יש כמה מאפיינים (לקריאה בלבד)
 
global - אומר האם הפרמטר g נשלח. (מגדיר את כל מה שמתאים לביטוי במחרוזת)
 
ignoreCase אומר האם הפרמטר i נשלח. (מגדיר אהם להתייחס לאותיות רישיות)
 
lastIndex מחזיר את המיקום האחרון שהביטוי תאם.
 
source מחזיר את הביטוי עצמו.
 
multiline אומר האם הפרמטר m נשלח.
Posted: Apr 04 2011, 11:09 PM by Shlomo | with 1 comment(s)
תגים:, , ,

megavideo with subtitles (internet explorer addin)

 

כיצד לצפות ב - megavideo ולהוסיף כתוביות ל - IE.

 
 
בפוסט הקודם כתבתי כיצד אפשר להוסיף addin ל - IE בעזרת שימוש ב - mshtml ו - shdocvw,
 
 סשה הרגיש צורך לאתגר אותי ולהגיב "נראה לי שמתבקשת השאלה - מה הצורך המעשי שבשבילו צריך את הדבר הזה"

 ולכן כתבתי את ה - addin הבא.
 
 
ניתן להוריד אותו מכאן (קוד מקור וקובץ הרצה)
 
 
יש לי חבר שבא אלי עם הבקשה הבאה:
אני רואה לפעמים סרטים ברשת, אי לא יודע אנגלית ולכן יש לי אחת משתי האופציות,
 להוריד סרט ולהוריד קובץ תרגום ולצפות באחד מהנגנים המאפשר חיבור שלהם,
 או לצפות בסרט עם תרגום מובנה, אני מחפש את האופציה להוריד קובץ תרגום ולהוסיך אותו לדפדפן שבו אני צופה, האם זה אפשרי ?
 
 
בעזרת ה - dll מהפוסט הקודם זה אפשרי,
 
 
כך נראה המסך של התוכנה שכתבתי.
 
app
 
הסברים:
בצד ימין רואים את כל הדפדפנים הפתוחים, צריך לבחור את הדפדפן שאליו רוצים לבצע את ה - html injection (ניתן ללחוץ על הלחצן בצד ימין למעלה כדי לרפרש את הרשימה)
בצד שמאל ניתן לבחור קובץ כתוביות (כרגע אני תומך בפורמט str)
ניתן לבחור את צבע הרקע צבע הגופן וגודלו.
למטה ניתן לבחור את המיקום המדויק שהכתוביות יופיעו (x, y, width, height)
הסינכרון לא עובד כרגע.
 
לאחר מכן צריך ללחוץ על ה - strat בתוכנה וגם בסרט
 
 
חשוב לציין שהאפליקציה לא מושלמת, ברור שיהיו בעיות סינכרון וכנראה יש באגים, מדובר בעבודה של חמש שעות בלבד כדי להוכיח יכולות, אם יהיה לי זמן אני מקווה לכתוב אותה כמו שצריך.
 
 
כך יראה המסך של megavideo
 
קובץ כתוביות לדוגמא - להורדה מכאן.
 
סרט שמתאים לקובץ הכתוביות - http://www.megavideo.com/?d=SYFSKETJ
 
 
mega

הרב דוטנט - MVP

 

 במוצאי שבת פתחתי את המייל והופתעתי לראות שקבלתי הודעה ממיקרוסופט שאני MVP.
 
Dear Shlomo Goldberg,

Congratulations! We are pleased to present you with the 2011 Microsoft® MVP Award! This award is given to exceptional technical community leaders who actively share their high quality, real world expertise with others. We appreciate your outstanding contributions in Internet Explorer technical communities during the past year.

 
 
 
אני רוצה בהזדמנות זו להודות למספר אנשים שעזרו לי בדרך לתואר (אני חושב שאני הכי צעיר בארץ עם התואר MVP)
 
בראש ובראשונה כמובן למנהלי סלע שעזרו לי וקידמו אותי (והעלימו עין שאני כותב לפעמים פוסטים בזמן העבודה).
 
כמובן שמגיע תודה מיוחדת לחברה במייקרוסופט בראשם כמובן האיש והאגדה גיא בורשטין שכתב לי בפוסט מספר 100 (היום אנחנו מעל 400) שאני אגיע לגדולות והוא ידאג לזה באופן אישי - אז תודה גיא על העזרה.
 
תודה גם למיכל שעזרה בכל פעם שהייתי צריך עזרה, ולמאיר פינטו.
 
 
אני מאמין שתמשיכו ליהנות מהפוסטים שלי.
 
שלמה גולדברג - הרב דוטנט
 
MVP
Posted: Apr 02 2011, 10:30 PM by Shlomo | with 25 comment(s)
תגים:,