الاثنين، 23 ديسمبر 2013

إعادة تهيئة خدمة مزامنة الحسابات في شيربوينت 2010


من أكثر المشاكل شهرة في شيربوينت 2010 هي خدمة مزامنة الحسابات من خلال Profile Service حيث قد تبقى ضمن الحالة Starting لمدة طويل وتفشل بعدها. المقالة التالية هي أفضل مقالة قرأتها عن هذا الموضوع من قبل مهندس مختص في حل مشاكل العملاء


استمتع :)

السبت، 14 ديسمبر 2013

إنشاء قاموس مخصص للبحث في شيربوينت 2013



يمكن استخدام المختصرات Acronyms في عملية البحث باستخدام شيربوينت 2013 بحيث يمكن للمستخدم كتابة كلمات مختصرة للبحث عن وثائق أو صفحات. مثلاً، يمكن البحث عن تقرير المبيعات الشهري باستخدام Monthly Sales Report والبعض يستخدم الاختصار MSR:



وفي شيربوينت 2013 يمكن بسهولة إنشاء واستيراد قاموس يحتوي على مختصرات تساعد في تسهيل عمليات البحث. فمثلاً، تصور أن مكتبة المستندات تحتوي على ما يلي:
  • ملف Office Word عنوانه Coffee.
  • ملف PowerPoint عنوانه Cup of Joe.


وعند البحث باستخدام الكلمة Coffee فإن نتيجة البحث ستحتوي فقط على ملف الـ Word:



وعند البحث عن cup of joe فإن نتيجة البحث تحتوي فقط على ملف الـ PowerPoint:



فيما يلي سنعمل على إنشاء واستيراد قاموس إلى شيربوينت 2013 بحيث عند البحث بأي من الجملتين السابقتين فإن نتائج البحث ستحتوي على الملفين معاً.
1 - أنشئ ملفاً جديداً باستخدام Notepad
2 - أدخل في أول سطر الكلمات التالية مع الفصل بينها بفاصلة Key,Synonym,Language




3 - في سطر جديد أدخل المختصرات بحيث يتم إدخال الجملة الكاملة أولاً ومن ثم يتم إدخال الاختصار وآخرها رمز اللغة، وكل منها يفصل بينها فاصلة:




4 - احفظ الملف بصيغة .csv مع الترميز UTF-8:



استيراد القاموس الجديد إلى شيربوينت 2013
قبل البدء بعملية استيراد يجب أن تكون مدير لخدمة البحث Search service application administrator.
1 - افتح SharePoint 2013 Management Shell:




2 - نفذ الأمر التالي:


$searchApp = Get-SPEnterpriseSearchServiceApplication 
Import-SPEnterpriseSearchThesaurus -SearchApplication $searchApp -Filename

يجب الانتباه إلى أن المسار يجب أن يشير إلى مسار على الشبكة حتى لو كان الملف الذي تريد استيراده هو على نفس الخادم. أي يجب أن يكون من الشكل:

\\servername_or_ip\SharedPath





الخميس، 21 نوفمبر 2013

مشكلة الـ Uploadify مع UAG (Unified Access Gateway)


يعتبر العنصر Uploadify.com من أشهر العناصر المستخدمة في تحميل الملفات بطريقة غير متزامنة علماً أنه يتوفر منه نسختين الأولى فلاش Flash والثانية HTML5. هذه المقالة تتحدث عن تجربة استخدام نسخة الفلاش من Uploadify مع خادم الـ UAG (Unified Access Gateway) الخاص بشركة مايكروسوفت حيث واجهتنا مشكلة ظهور الخطأ التالية:

500 internal server error

عند محاولة تحميل ملفات بغض النظر عن نوعها وأيضاً بغض النظر عن لغة البرمجة المستخدمة. وبعد محاولات كثيرة وبحث تم الاستعانة بشركة مايكروسوفت لحل هذه المشكلة وقد كان جواب مهندس مايكروسوفت كما يلي:



So Multipart/form-data is something that UAG does not support and also according to RFC http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
The CRLF preceding the encapsulation line is considered part of the boundary so that it is possible to have a part that does not end with a CRLF (line break). Body parts that must be considered to end with line breaks, therefore, should have two CRLFs preceding the encapsulation line, the first of which is part of the preceding body part, and the second of which is part of the encapsulation boundary.
The requirement that the encapsulation boundary begins with a CRLF implies that the body of a multipart entity must itself begin with a CRLF before the first encapsulation line -- that is, if the "preamble" area is not used, the entity headers must be followed by TWO CRLFs. This is indeed how such entities should be composed. A tolerant mail reading program, however, may interpret a body of type multipart that begins with an encapsulation line NOT initiated by a CRLF as also being an encapsulation boundary, but a compliant mail sending program must not generate such entities.
Encapsulation boundaries must not appear within the encapsulations, and must be no longer than 70 characters, not counting the two leading hyphens.
The encapsulation boundary following the last body part is a distinguished delimiter that indicates that no further body parts will follow. Such a delimiter is identical to the previous delimiters, with the addition of two more hyphens at the end of the line:
     --gc0p4Jq0M2Yt08jU534c0p—
More info on page 30 : http://www.ietf.org/rfc/rfc1341.txt

أي أنه من الواضح وجود نقص في المعلومات التي يرسلها Uploadify (Flash Version) وعلى اعتبار أنه لا يمكن التعديل على شيفرة الفلاش فقد كانت نصيحة مهندس مايكروسوفت هي إيقاف عملية فحص المعلومات المرسلة من قبل العنصر Uploadify وبذلك يتم حل المشكلة. وبالفعل تم اتباع الخطوات التالية باستخدام UGA لإيقاف عملية فحص البيانات المرسلة من قبل Uploadify:

http://technet.microsoft.com/en-us/library/dd278134.aspx

علماً أنه في الخطوة رقم 5 يجب استخدام اسم الصفحة التي يُرسل إليها Uploadify البيانات وفي حالتنا كانت كما يلي:

./Uploadify\.ashx.*

ملاحظة: قد لا تظهر هذه المشكلة عند رفع ملف أكبر من 3 ميغا والسبب غير معروف أيضاً وقد يعود لآلية تعامل العنصر Uploadify مع الملفات وآلية رفعها.

شكر خاص للمهندس ياسين رحال لمساعدته في هذه المشكلة.




الاثنين، 18 نوفمبر 2013

مقدمة إلى ميزة التخزين المجزأ في شيربوينت 2013


التخزين المجزأ في شيربوينت 2013 هو تحسين جديد على بيئة عمل شيربوينت والمرتبط بعملية تخزين البيانات الثنائية (الملفات) الكبيرة، مثل ملفات Word، PowerPoint وغيرها من الملفات الأخرى. ويعتبر التخزين المجزأ ميزة لتحسين أداء عمليتي القراءة والكتابة وتخفيض حيز التخزين اللازم لتخزين فقط التغييرات التي تمت على الملف. وقد تم بناء هذه الميزة باستخدام البروتوكول Cobalt.

البروتوكول Cobalt
عند حفظ ملف في شيربوينت 2010 تم فتحه باستخدام أحد برامج الأوفيس مثلاً، فإن التغييرات التي تمت على الوثيقة فقط يتم إرسالها إلى خادم الشيربوينت وبعدها يعمل الشيربوينت على تجميع التغييرات مع كامل أجزاء الوثيقة الأخرى وبعدها يتم حفظ الوثيقة في قاعدة البيانات. بينما تم تصميم التخزين المجزأ للتأكد من أن كلفة تحديث الملفات في قاعدة البيانات يتناسب مع التغييرات التي تمت على الملف ولا يتم إعادة حفظ كامل الملف مع التغييرات مرة أخرى. وشيربوينت 2013 يحفظ محتوى الملف كمجموعة من البيانات الثنائية المستقلة وهذا ما يسمى بالتخزين المجزأ وكل جزأ يحصل على رقم متسلسل يسمح بإعادة بناء الملف بشكل كامل من جديد عند الحاجة إليه.

بينما في شيربوينت 2010 عند تحميل ملف إلى مكتبة وثائق يتم إنشاء سجل جديد في الجدول AllDocStreams لتخزين المعلومات الثنائية للملف. وأيضاً يتم إرسال التغييرات فقط إلى خدم شيربوينت 2010 لكن يتم تخزين كامل الملف مع التغييرات مرة أخرى في سجل منفصل. وهذا حسن عملية استخدام الشبكة في شيربوينت 2010 لكن كان لم يخدم في عملية خفض كلفة حيز التخزين. وباستخدام التخزين المجزأ في شيربوينت 2013 تم تحسين هذه الميزة وذلك بتقسيم البيانات الثنائية لملف إلى أكثر من جزء ويتم تخزينها في جدول جديد اسمه DocStreams وكل جزء يحتوي على رقم ID متسلسل وعندما يحدث تغيير على الملف يتم تحديث فقط الجزء المتعلق بالتغيير الذي تم على الملف.

وبمقارنة سريعة بين تطبيق التخزين المجزأ في شيربوينت 2013 وبين آلية التخزين في شيربوينت 2010 فإن عمليات القراءة والكتابة انخفضت تقريباً بمعدل النصف مقارنة مع 2010 إضافة إلى خفض كبير في حيز التخزين.

مثلاً، في حال أن المستخدم يعمل على ملف Power Point حجمه 10 ميغا ونفذ بعض التعديلات عليه ومن ثم حفظ الملف مرة أخرى، عندها البروتوكول المحسن في شيربوينت 2013 المسؤول عن عملية التخزين المجزأ يعمل على تعديل السجلات الموجودة في الجدول DocStreams المرتبة بالتغيير الذي حدث.

الجدول DocStreams
يتم إنشاء الجدول DocStreams في كل قاعدة بيانات محتوى في شيربوينت 2013 حيث يتم تخزين كل جزء من المحتوى الثنائي المجزأ في سجل، علماً أنه تمت إضافة الأعمدة التالية إلى الجدول للتعامل مع عملية التخزين المجزأ:
  • BSN: رقم تسلسلي يحدد ترتيب الجزء ضمن جميع الأجزاء التابعة لنفس المحتوى الثنائي.
  • Data: يحتوي على جزء من البيانات الثنائي إلا إن كان المحتوى الثنائي مخزن باستخدام تقنية الـ RBS (Remote BLOB Storage) أي حيز التخزين البعيد.
  • Offset: الإزاحة ضمن المحتوى الثنائي الذي ينتمي إليه الجزء.
  • Length: حجم جزء المحتوى الثنائي بالبايتات.
  • RbsId: في حال أن جزء المحتوى الثنائي مخزن باستخدام تقنية RBS عندها يجب أن يحتوي معرف يشير إلى الـ RBS وإلا قيمة هذا العمود تكون تساوي NULL.
ملاحظة: بشكل افتراضي ميزة التخزين المجزأ تكون مفعلة ولا يمكن إيقافها.

الخاصية FileReadChunkSize
تم إضافة الخاصية FileReadChunkSize في شيربوينت 2010 كخاصية تحكم مرتبطة بالتخزين المؤقت للبيانات الثنائية BLOB Cache والتي تسمح لمدير بيئة عمل شيربونيت التحكم بحجم البيانات التي سيتم إرسالها في حال طلب ملف من قبل المستخدم. علماً أن خاصية التخزين المؤقت للبيانات الثنائي BLOB Cache تُستخدم عند طلب بيانات ثنائية مثل الصور وملفات الفيديو. وفي حال أن الملف المطلوب حجمه أصغر من قيمة الخاصية FileReadChunkSize (القيمة الافتراضية 100 كيلو) أو يساوي قيمة الخاصية LargeFileChunkSize (القيمة الافتراضية تساوي 5 ميغا) عندها يتم إحضار معلومات الملف من خادم قواعد البيانات مباشرة.

الخاصية FileWriteChunkSize
تُستخدم هذه الخاصية للتحكم بحجم جزء التخزين المجزأ الواحد. ويجب الانتباه إلى أن تحديد قيمة غير مدروسة بشكل صحيح لهذه الخاصية قد تؤدي إلى مشاكل في أداء بيئة عمل الشيربوينت عند استخدام قيمة صغيرة جداً في وقت يتم فيه استخدام ملفات الفيديو بشكل متكرر.






الاثنين، 28 أكتوبر 2013

كيف يمكن استخدام Report Viewer 2012 مع شيربوينت 2013


عند العمل على Reporting Service مع Visual Studio 2012 على شيربوينت 2013 يجب اتباع الخطوات التالية:

1 - تحميل Report Viewer 2012 من الرابط التالي:

http://www.microsoft.com/en-sa/download/details.aspx?id=35747

2 - إضافة السطر التالي تحت العنصر system.webServer/handlers في ملف الـ web.config لتطبيق الويب على شيربوينت 2013:


<add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />


3 - حذف السطر التالي من المسار system.webServer/handlers في ملف الـ web.config لتطبيق الويب على شيربوينت 2013:


<add name="ReportViewerWebControl" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />


4 - حذف السطر التالي من المسار appSettings في ملف الـ web.config لتطبيق الويب على شيربوينت 2013:


<add key="reportviewermessages" value="microsoft.sharepoint.portal.analytics.ui.reportviewermessages, microsoft.sharepoint.portal, version=15.0.0.0, culture=neutral, publickeytoken=71e9bce111e9429c" />


5 - عند استخدام ReportViewerControl ضمن Visual Studio 2012 يجب إضافة مرجع إلى الملف Microsoft.ReportViewer.WebForms.dll تحت المسار التالي:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\ReportViewer



الأربعاء، 23 أكتوبر 2013

إضافة أكثر من حل Solution باستخدام PowerShell


في بعض الحالات عند البدء في بناء بيئة العمل الحقيقية لأحد المشاريع قد تضطر إلى تثبيت أكثر من حل Solution باستخدام الملفات wsp قد يصل عددها إلى 10 وأكثر. من أجل إضافة ملف واحد في كل مرة باستخدام PowerShell يتم تنفيذ الأمر التالي:

add-SPSolution c:\FILE_NAME.wsp

الأمر السابق يضيف حل Solution في نفس الوقت, لكن لإضافة أكثر من حل باستخدام سطر واحد يمكن بناء سكريبت يحتوي على شيفرة برمجية تستخدم أوامر PowerShell لتنفيذ هذه العملية. ولبناء هذا الملف اتبع الخطوات التالية:

1 - أنشئ ملف امتداده ps1 اسمه DeployWSPs.ps1 واكتب في التعليمات التالية:

$path = (get-location).path
$files = get-childitem | where {$_.extension -eq ".wsp"}
foreach($file in $files)
{
       $wspPath = $path + '\' + $file
       add-spsolution $wspPath
}


2 - احفظ الملف

لتجريب الملف السابق انسخ أكثر من ملف wsp مع الملف السابق إلى المسار التالي:

c:\wsps

افتح سطر الأوامر SharePoint 2013 Management Shell ونفذ الأوامر التالية:

cd\
cd wsps
.\DeployWSPs.ps1

بعد تنفيذ الأوامر السابقة سيتم إضافة جميع الحلول Solution ذات الامتداد wsp الموجودة في المجلد c:\wsps





الاثنين، 21 أكتوبر 2013

تحديث أكتوبر - تشرين الأول لشيربوينت 2010



تم إصدار التحديث SharePoint Server 2010 cumulative update package October 8, 2013 على الرابط التالي:


وباعتبار تم إصداره بعد حزمة الإصلاحات الثانية SharePoint Server 2010 SP2 فهذا يعني أنه يجب تحميلها بعد تثبيت SP2.



الأربعاء، 7 أغسطس 2013

إضافة Like Button إلى صفحة شيربوينت 2013


من الإضافات الجديدة في شيربوينت 2013 هي إمكانية إضافة ميزة الإعجاب Like إلى أي عنصر من عناصر مكتبة المستندات Document Library أو الصفحات Pages. ولكن ولسبب ما فإن مايكروسوفت تتيح إمكانية عرض التقييم باستخدام النجوم Stars في الصفحات ولكن لا يظهر زر "أعجبني" في الصفحة. فيما يلي شرح آلية استخدام هذه الميزة مع شيفرة جافا سكريبت التي تمكن من استخدام هذه الميزة.

1 - يجب التأكد من أن خاصية التقييم مفعلة على مستوى مكتبة الصفحات Pages Library:
      - من التبويب "مكتبة" اختر إعدادات المكتبة.
      - من ثم اختر الرابط "إعدادات التصنيف"


      - يجب التأكد من إعدادات التقييم على أنها كما في الشكل التالي:


2 - بعد التأكد من ضبط إعدادات التقييم بشكل صحيح. يجب الآن إدراج عنصر التقييم في مخطط الصفحة Page Layout حيث يجب أن تظهر بالصفحة. ويتم ذلك بإدراج الشيفرة التالية علماً أنه يمكن تخصيص هذه الشيفرة بالشكل الذي يتناسب مع التصميم المعتمد:

<a href="javascript:void(0)" onclick="(function() {SURE_likepage.LikePage();})()"><span class="sure_likecount"></span>

3 - بعد ذلك يجب إدراج مرجع إلى الملف sure_like2013.js كما يلي:

<script type="text/javascript" src="FILE_PATH/sure_like2013.js"></script>

بعد تنفيذ جميع الخطوات السابقة سيظهر عنصر الإعجاب في الصفحة كما يلي في حال أن المستخدم الحالي لم يضغط على زر أعجبني:


ويظهر بالشكل التالي في حال أن المستخدم الحالي ضغط على زر أعجبني مسبقاً لنفس الصفحة الحالي:


كما يمكن الاستفادة من القيمة $v_3.$2d_1 لمعرفة أسماء المستخدمين الذين أعجبوا بالصفحة الحالية.

ملاحظة: يمكن تخصيص الشكل السابق بحيث يتناسب مع التصميم المعتمد.


الخميس، 1 أغسطس 2013

استخدام المصادر في ملفات الجافا سكريبت Localized JavaScript


معظم استخدامات ملفات المصادر Resources لتمكين التطبيقات من دعم أكثر من لغة Localization ومعظمها تتم على مستوى الشيفرة التي يتم تنفيذها على السيرفر Server Side Code. لكن في بعض الأحيان نحتاج لدعم المصادر في شيفرة الجافا سكريبت. وهذه الإمكانية متوفرة في شيربوينت 2013 من خلال استخدام الملف ScriptResx.ashx. ويمكن استخدامه باتباع الخطوات التالية:

1 - يجب التأكد من أن ملف المصادر Resource File يدعم هذه الإمكانية وذلك بفتح الملف resx باستخدام محرر نصوص والتأكد من وجود السطر التالي:

<resheader name="scriptResx"> <value>true</value></resheader>
تحت العنصر التالي:
</xsd:schema>
وفي حال عدم توفره يجب إضافته.

2 - هذه الخطوة مرتبطة بكيفية استدعاء قيمة من ملف المصادر من خلال شيفرة الجافا سكريبت. حيث يمكن تعريف Namespace تحتوي على جميع قيم ملف المصد. مثلاً لنفترض أن الـ namespace لملف المصدر هو ProjectName.General وتوجد قيمة ضمن ملف المصدر يمكن الوصول إليها من خلال المفتاح SiteTitle عندها ضمن شيفرة الجافا سكريبت تكون الشيفرة كما يلي:

ProjectName.General.siteTitle

حيث يتم تغيير حالة الحرف الأول من المفتاح ليصبح حرفاً صغيراً. ولتعريف namespace لملف المصدر يجب فتح الملف ضمن محرر نصوص والبحث عن عنصر resheader الخاصية name له تساوي classFullName وفي حال عدم وجودها يجب إضافتها:


<resheader name="classFullName"><value>ProjectName.General</value></resheader>


3 - الآن يجب استخدام الملف ScriptResx.ashx كما يلي:


في الخطوة رقم 3 سيتم توليد ملف جافا سكريبت يحتوي على ملف المصدر ضمن الـ namespace المعرفة في الخطوة رقم 2.


تثبيت معالج الحدث على القوائم باستخدام الميزات List Event Handlers


يمكن تثبيت معالج الحدث على أي قائمة باستخدام الشيفرة البرمجية أو باستخدام الطريقة التصريحية والتي تعتمد على الميزات Features. وعند استخدام الطريقة التصريحية فإن المجال Scope الذي يتم تحديده للميزة يغير في الإعدادات التي يمكن استخدامها أثناء التصريح عن الأحداث.

تثبيت معالج الحدث باستخدام ميزة تعمل ضمن مجال مجموعة المواقع Scope=Site
يمكن تثبيت معالج الأحداث في شيربوينت 2013 على قائمة باستخدام ميزات ذات مجال Site أو مجال Web. وفي حال استخدام المجال Site للميزة عندها يمكن تحديد قيمة للخاصية Scope لتحديد مجال القوائم الذي سيثبت عليها معالج الحدث. في حال تحديد القيمة Site سيتم تثبيت معالج الحدث على جميع القوائم في مجموعة المواقع Site Collection، أما في حال تحديد القيمة Web فسيتم تثبيت معالج الحدث على الموقع الرئيسي فقط لمجموعة المواقع Root Web. ويجب الانتباه إلى أنه بغض النظر عن أي إعدادات أخرى فإن مالج الحدث سيتم تثبيته على جميع القوائم ضمن المجال المحدد في الخاصية Scope.

تثبيت معالج الحدث باستخدام ميزة تعمل ضمن مجال الموقع Scope=Web
عند استخدام المجال Scope = Web عندها يمكن تحديد قيم لبعض الإعدادات الإضافية. ومنها تحديد قيمة منطقية true|false للخاصية RootWebOnly، فعند تحديد القيمة true فإن معالج الحدث يمكن تثبيته فقط على القوائم التي تحت الموقع الرئيسي فقط ف يحال تفعيل الميزة على موقع فرعي سيؤدي ذلك إلى ظهور خطأ. أيضاً سيفحص شيربوينت 20103 العناصر Receivers للتأكد من قيمة الخاصية ListTemplateId، في حال تم تحديدها من قبل المطور فإن شيربوينت سيبحث عن قيمة الخاصية ListUrl، وفي حال أن كلا القيمتين محددتان فإن شيربوينت سيرسل خطأ يفيد بأنه يجب تحديد إحدى القيمتين فقط. وفي حال أن قيمة الخاصية ListUrl غير محددة فإن شيربوينت سيثبت معالج الحدث على جميع القوائم التي تطابق القيمة المعرفة في الخاصية ListTemplateId ضمن الموقع الحالي. ويجب الانتباه أن قيمة الخاصية ListTemplateId هي إحدى القيم المعرفة في الرابط التالي:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splisttemplatetype.aspx

وهي نفس قيم الخاصية SPList.BaseTemplate.

وفي حال أن قيمة الخاصية ListTemplateId غير محددة فإن شيربوينت يبحث عن قيمة الخاصية ListUrl، ففي حال توفرها فإن شيربوينت سيثبت معالج الحدث على القائمة المحددة بقية هذه الخاصية فقط. ويجب الانتباه إلى أن قيمة هذه الخاصية هي عبارة عن العنوان النسبي للقائمة Relative List URL. أما في حال عدم تحديد قيمة للخاصية ListUrl فإن شيربوينت سيثبت معالج الحدث على جميع القوائم في الموقع حيث تم تفعيل الميزة.