DCSIMG
November 2008 - Posts - Dor Rotman`s Blog

November 2008 - Posts

דרושים מפתחי SharePoint!
החברה בה אני עובד, Omnisys, מחפשת מתכנתי .NET עם ניסיון פיתוח בטכנולוגיות SharePoint.
 
דרוש ניסיון של שנתיים בפיתוח .NET, ידע ב-C#, ASP.NET, Web Services, ניסיון בעבודה עם טכנולוגיות SharePoint ורצוי ספציפית MOSS.
 
יחסי אנוש טובים – חובה. :)
 
מעוניינים? מעוניינות? שלחו אליי קורות חיים – dorr@omnisys.co.il
 
דור רוטמן.
Omnisys Logo
    
Converting Word 2007’s WdColor to .NET Color Class

Here’s a small snippet that I wrote for converting a Microsoft.Office.Interop.Word.WdColor object to a System.Drawing.Color object.

The WdColor enum values are actually stored as BGR and not RGB. So you must parse the number and isolate the R,G and B elements to re-assemble them into a .NET Color class.

Also, during runtime, sometimes a color object gets a value that isn’t listed in the enum. I don’t understand why this happens, but I’m guessing it’s either me being silly or the COM wrapper being silly. :)
The characteristic of the strange value is that it has an Alpha element as well as RGB elements.

I wrote my code to fit both cases, yet you may choose to change it to fit only the enum values.

So here’s the code:

public static class Extensions
{
    /// <summary>
    /// Converts a Microsoft.Office.Interop.Word.WdColor object to a 
    /// System.Drawing.Color object.
    /// If Word's color only contains RGB values without an alpha value,
    /// the alpha value will be set to 255.
    /// </summary>
    public static Color ToColor(this WdColor originalColor)
    {
        // Cast to numeric value so we can isolate RGBA elements
        int wordColor = (int)originalColor; 
 
        // Isolate alpha element. Shift right to set its range to [0-255].
        int alphaTemp = (int)((wordColor & 0xFF000000) >> 24);
        // Check that it's not completely transparent. If so, make it visible.
        int alpha = (alphaTemp == 0) ? 255 : alphaTemp;
 
        // Isolate R,G,B elements.
        int r = (wordColor & 0x000000FF);
        int g = ((wordColor & 0x0000FF00) >> 8);
        int b = ((wordColor & 0x00FF0000) >> 16);
        
        return Color.FromArgb(alpha, r, g, b);
    }
}

Please note that this is written as an Extension Method, which means it will look like a member of WdColor.

Usage:

// Get the background color from the cell and convert it to Color class
WdColor backgroundColor = newRow.Cells[4].Shading.BackgroundPatternColor;
Color myColor = backgroundColor.ToColor();

I would appreciate feedback regarding the Alpha strangeness. :)

Enjoy..

Dor Rotman.

Quick Tip: Displaying Hexadecimal Values in VS
במצבים מסויימים הרבה יותר נוח לצפות בערכים מספריים בבסיס 16, כלומר Hexadecimal, במקום בבסיס 10 הדצימלי, שאנו רגילים אליו. יש לכך יתרון כשעוסקים בצבעים – מאוד קל להפריד את מרכיבי ה-RGB מתוך המספר המוצג.
 
ניתן להגדיר ש-Visual Studio יציג מספרים ב-Quick Watch בבסיס זה בצורה מאוד פשוטה. במקרה גיליתי את זה היום וזה עשה לי את החיים הרבה יותר קלים :)
 
אז קדימה:
1. דבגו את התוכנה להנאתכם והגיעו למשתנה מספרי כלשהו שאת ערכו אתם מעוניינים להציג
2. עמדו עם העכבר מעל המשתנה כך שיוצג ערכו ב-Tooltip
3. לחצו על ה-Tooltip באמצעות הלחצן הימני להצגת התפריט
4. בחרו את Hexadecimal Display – וזה הכל!
 
 image
 
באותה קלות אפשר תוך כדי debugging לעבור חזרה לבסיס הדצימלי וביניהם.
 
איזה כיף :)
 
 
דור רוטמן.
SharePoint Performance Optimization Whitepaper
ואם כבר אנו עוסקים בנושאי ביצועים של חוות SharePoint, כדאי מאוד ללמוד מנסיונם של אנשי ה-IT של מיקרוסופט: הם הקימו תשתית SharePoint פנימית המשרתת 154 אלף עובדים.
 
פורסם לאחרונה Whitepaper המתאר את אופן בחינת הביצועים הנוכחיים, המסקנות, האופטימיזציות שנעשו, וכן הלקחים וההמלצות ללקוחות.
 
כדאי מאוד לקרוא: להורדת ה-Whitepaper לחצו כאן.
 
דור רוטמן.
 
עבודה עם רשימות גדולות ב-SharePoint
לאחרונה עלה אצלי בעבודה כבר כמה פעמים נושא הרשימות הגדולות ב-SharePoint. כמה פריטים מותר לשים ברשימה או בתיקיה ולשמור על ביצועים טובים?
 
אז הנה כמה המלצות בנושא:
  • לא לעבור את ה-2000 פריטים בתצוגה \ תיקיה
  • לאנדקס עמודות שמבצעים עליהן סינונים תדירים
  • בפיתוח, בשום אופן לא להשתמש ב-foreach, אלא להריץ שאילתת CAML. תמיד שאילתת CAML תהיה מהירה יותר מאנומרציה של אובייקטים.
הנה תמונה מתוך Whitepaper שאספר עליו בהמשך. היא מציגה הבדלי מהירות שאילתא בין השיטות השונות. מדובר על רשימה עם 100,000 פריטים, שרוצים לדלות ממנה 100 פריטים, תוך כדי שיש עומס על האתר, וללא עמודות מאונדקסות. ניתן לראות ששימוש בשאילתת CAML במסגרת SPQuery היא הרבה יותר מהירה מאשר foreach, שהזמן שלקח לו חרג מהגרף ולכן כלל לא מופיע בו.
SharePoint Limits Graph, Copyright Microsoft
 
המסקנה היא פשוטה: מי שרוצה להשתמש ב-SharePoint כבסיס נתונים מרכזי ולאחסן ברשימה אחת כמות פריטים גדולה כל כך, חייב לכתוב ממשק תצוגה משלו, על מנת לשמור על ביצועים סבירים.
 
למי שרוצה להתעמק, מומלץ לקרוא שני מסמכים חשובים:
1. מאמר Plan for Software Boundaries ב-TechNet המפרט כמויות מומלצות
2. ה-Whitepaper המעולה Working with large lists in Office SharePoint Server 2007, שפורסמם ב-MSDN כבר לפני שנה וקצת, ומשם לקוח הגרף שלמעלה.
 
דור רוטמן.
Podcasting Kit for SharePoint
החודש יצא Release חדש ל-SharePoint Podcasting Kit, פרויקט ה-CodePlex עבור פלטפורמת MOSS. יעודו של הפרויקט הוא לספק תבנית אתר למדיה כגון סרטים, קבצי אודיו וכו’.
תמונה שווה אלף מילים:
 
הפרויקט לא סתם יושב ב-CodePlex, אלא הוא קוד-פתוח ואינו מוצר של מיקרוסופט, אלא של מספר חברות הפועלות יחד איתה בפיתוחו.
 
מי שרוצה להקים אתר User Generated Content בתוך האירגון שלו לקבצי מדיה ירוויח מהמוצר החינמי הזה מאוד, כי הרי כבר קנה ושילם על MOSS, וזו עוד דרך מצויינת לנצל את יכולות המערכת.
 
עם זאת, מי שרוצה להשתמש ב-Podcast Kit בקרוב צריך להתאזר בסבלנות רבה בעת יישומה, שכן המוצר עוד לא מוגמר: ההתקנה ידנית ברובה, והתיעוד לוקה בחסר. כל חודש יוצאת גרסה, כאשר ה-Major Release הבא מתוכנן לדצמבר.
 
בכל אופן, הפתרון בהחלט מעורר השראה ושווה מבט, כולל לתוך הקוד שלו.
 
דור רוטמן.