برنامهی آنلاینی جهت تولید یک theme سفارشی جدید برای ویژوال استودیو ایجاد شده است که در آدرس زیر قابل استفاده است:
ابتدا تنظیمات رنگ خود را انتخاب کنید، سپس بر روی دکمه refresh کلیک نمائید تا نمونهای از نتیجهی کار را بتوان مشاهده کرد و سپس بر روی دکمه create کلیک کنید.
و برای استفاده از فایل تولید شده از طریق منوی tools گزینهی Import and Export Settings اقدام کنید.
اشتباه 1:
استفاده از
throw ex;
throw;
اشتباه 2:
درک اشتباه عملکرد متد replace :
string s = "Take this out";
s.Replace("this", "that"); //wrong
s = s.Replace("this", "that"); //correct
اگر از fxCop استفاده کنید، اینگونه خطاها را (عدم استفاده از مقدار بازگشتی) گوشزد میکند.
اشتباه 3:
استفادهی بی دقت از متغیرهای استاتیک در یک برنامه وب. دو مثال زیر را در نظر بگیرید:
public static string GetCookieName(Cookie c)
{
return c.Name;
}
static List<string> cookieList = new List<string>();
public static void AddToCookieList(Cookie c)
{
cookieList.Add(c.Name);
}
برنامههای وب ذاتا چند ریسمانی هستند و زمانیکه یک متغیر را از نوع استاتیک تعریف میکنید، این متغیر، هنگام مراجعهی کاربران بین آنها به اشتراک گذاشته میشود و امکان تخریب یا استفادهی ناصحیح از مقادیر آنها وجود خواهد داشت. در حالت اول نیازی به مباحث همزمانی و قفل کردن منابع نیست زیرا متغیری که در متد استفاده میشود، thread safe است اما cookieList در مثال دوم خیر و حتما هنگام استفاده از آن باید مباحث قفل کردن منابع را درنظر داشت. (حتی اگر برنامهی شما از نوع وبی هم نیست اما چند ریسمانی است این مطلب باز هم صادق میباشد)
اشتباه 4:
مقابله با خطاها به شکلی نادرست: (اصطلاحا خفه کردن خطاها!)
try
{
//something
File.Delete(blah);
}
catch{}
هرچند گاهی از اوقات اگر خطای حاصل برای ما اهمیتی نداشت میتوان از آن استفاده نمود، در غیراینصورت باید حتما از این روش پرهیز کرد.
اشتباه 5:
ارائهی برنامههای ASP.Net با گزینهی پیش فرض Debug=true در web.config که پیشتر در مورد آن در این سایت بحث شده است.
اشتباه 6:
عدم استفاده از امکانات ویژهی دات نت فریم ورک هنگام کار با رشتهها:
string s = "This ";
s += "is ";
s += "not ";
s += "the ";
s += "best ";
s += "way.";
StringBuilder sb = new StringBuilder();
sb.Append("This ");
sb.Append("is ");
sb.Append("much ");
sb.Append("better. ");
زمانیکه نیاز به کنار هم قرار دادن رشتههای مختلف وجود داشت و تعداد آنها نیز زیاد بود، مثال دوم توصیه میشود.
البته در مثال فوق که تعداد کمی رشته قرار است با هم جمع شوند، کامپایلر به اندازهی کافی هوشمند خواهد بود که تمام آنها را کنار هم قرار دهد و تفاوتی در کارآیی احساس نشود، حتی روش اول سریعتر از روش دوم خواهد بود، اما زمان استفاده از هزاران رشته، این تفاوت محسوس است.
اشتباه 7:
عدم استفاده از عبارت using هنگام استفاده از اشیایی از نوع Idisposable . مثالی در این مورد.
using (StreamReader reader=new StreamReader(file))
{
//your code here
}
اشتباه 8:
فراموش کردن بررسی نال بودن یک شیء هنگام استفاده از آن.
string val = Session["xyz"].ToString();
این نوع کد نویسی یکی از اشتباهات متداول تمامی تازه واردان به ASP.Net است. حتما باید پیش از استفاده از متد ToString بررسی شود که آیا این سشن نال است یا نه. در غیراینصورت حاصل کار فقط یک exception خواهد بود. (استفاده از افزونهی ری شارپر در این موارد کمک بزرگی است، زیرا به محض قرار گرفتن مکان نما روی شیءایی که احتمال نال بودن آن میسر است، یک راهنما را به شما ارائه خواهد کرد)
اشتباه 9:
بازگشت دادن یک property عمومی از نوع لیستهای جنریک.
با توجه به اینکه این نوع لیستها فقط خواندنی نیستند و امکان دستکاری اطلاعات آن توسط فراخوان وجود دارد، توصیه میشود از نوع جنریک IEnumerable استفاده شود. همچنین توصیه شده است هنگام انتخاب نوع پارامترهای ورودی یک متد نیز به این مورد دقت شود.
مدتی است که محصور کنندهای سورس باز برای امکانات غلط یاب مجموعهی open office در سایت code project ارائه شده است:
NHunspell - Hunspell for the .NET platform
دریافت آخرین نسخهی آن از source forge
خوشبختانه کتابخانهی واژههای فارسی هم برای اپن آفیس مهیا است.
دریافت
پس از دریافت کتابخانهی فوق و همچنین فایلهای مربوط به زبان فارسی، فقط کافی است ارجاعی به اسمبلی NHunspell.dll در برنامه اضافه شود و سپس یک مثال ساده در مورد استفاده از آن به صورت زیر خواهد بود:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using NHunspell;
namespace testWinForms87
{
class CSpellCheck
{
public static void Test()
{
using (Hunspell hunspell = new Hunspell(@"fa_ir.aff", @"fa_ir.dic"))
{
bool correct = hunspell.Spell("دباق");
if (correct)
MessageBox.Show("مشکلی نیست!");
else
{
List<string> suggestions = hunspell.Suggest("دباق");
string result = string.Empty;
foreach (string suggestion in suggestions)
{
result += suggestion + Environment.NewLine;
}
if (result != string.Empty)
MessageBox.Show(result,"لیست پیشنهادها");
}
}
}
}
}
جواب ساده و کوتاه: خیر!
کدمدیریت شدهی شما در هر دو پلتفرم 32 بیتی - x86 و x64 بدون نیاز به هیچگونه تغییری و بدون نگرانی اجرا خواهد شد.
گزیدهای از MSDN :
اگر کد شما 100 درصد مدیریت شده است (managed code ایی که به صورت خالص از دات نت فریم ورک استفاده میکند و هیچگونه وابستگی خارجی دیگری به کتابخانههای دیگر ندارد)، تنها با کپی شدن در یک محیط x64 دارای CLR ایی 64 بیتی (دات نت فریم ورک 64 بیتی)، بدون هیچگونه مشکلی اجرا خواهد شد.
سؤال: چرا و چگونه؟!
کامپایلرهای دات نتی (تفاوتی نمیکند که چه زبانی مورد استفاده باشد)، کد شما را به IL ترجمه میکنند و IL اساسا درکی از پروسسور ندارد. JIT است که در آخرین لحظه در این مورد تصمیم گیری میکند.
این نگرانی از کجا حاصل شده است؟
نگارش R2 ویندوز 2008 سرور، فقط 64 بیتی خواهد بود و ویندوز سرور 2008 فعلی، آخرین سروری از مایکروسافت است که هر دو نسخهی 32 بیتی و 64 بیتی را دارد. بنابراین دیر یا زود تمام برنامه نویسهای ویندوزی "مجبور" خواهند شد دنیای 64 بیتی را تجربه کنند. (البته اگر تاکنون آنرا تجربه نکردهاند)
و البته هنوز یک سری از محیطهای توسعه، کامپایلر مخصوص 64 بیتی ندارند (مانند دلفی که قرار است در طول سال جاری اولین تجربهی 64 بیتی خود را ارائه دهد)
نکته:
در صفحهی build ویژوال استودیو، شما میتوانید نوع پلتفرم مورد نظر را نیز تعیین کنید:
پیش فرض آن بر روی Any CPU است و در این حالت کد کامپایل شدهی شما بدون مشکل بر روی پلتفرمهایی که مشاهده میکنید اجرا خواهد شد و تنها پیشنیاز اجرای آن، نصب نسخهی دات نت فریم ورک مخصوص آن پلتفرم است، بدون اینکه نیاز باشد برنامه نویس نگران جزئیات خاصی در مورد خصوصیات ویژهی آن پلتفرم ویژه باشد.
سؤال: اگر کد ما خالص نبود چطور؟ (منظور اینکه 100 درصد دات نتی نبود)
حالت الف) اگر از کامپوننتهای خارجی استفاده میکنید (حتی اگر 100 درصد دات نتی هم باشند) حتما اطمینان حاصل کنید که برای پلتفرم خاصی کامپایل نشدهاند (همان Any CPU مورد استفاده بوده)، زیرا کد شما که برای تمام CPU ها کامپایل شده، در محیط 64 بیتی، تنها توانایی بارگذاری اسمبلیهای 64 بیتی را خواهد داشت (64 بیتی رفتار میکند) و با مواجه شدن با اسمبلیهایی که برای یک پروسسور خاص دیگر کامپایل شدهاند، با خطای BadImageFormatException خاتمه مییابد.
حالت ب) استفاده از API ویندوز یا DLL های غیر دات نتی
باید با هماهنگی با تولید کنندهی مربوطه حتما از نگارش 64 بیتی استفاده شود و همچنین برنامهی شما باید توانایی استفاده از اشارهگرهای 64 بیتی را داشته باشد. اندازهی نوع دادهای IntPtr در یک محیط 32 بیتی 4 است و در یک محیط 64 بیتی 8 خواهد بود (IntPtr.Size). اگر در حین اجرای ترجمهی API یک کتابخانه به اشتباه بجای استفاده از IntPtr از int استفاده شده باشد، ممکن است کد شما در یک محیط 32 بیتی سالها بدون مشکل اجرا شود، اما در اولین اجرای خود در یک محیط 64 بیتی، کرش خواهد کرد. (بدلیل overflow حاصل)
IntPtr به اندازهی کافی هوشمند است تا سایز خودش را مطابق پلتفرم تنظیم کند و مشکل ساز نشود.
مثال:
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEM_INFO
{
internal _PROCESSOR_INFO_UNION uProcessorInfo;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public int lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort dwProcessorLevel;
public ushort dwProcessorRevision;
}
[StructLayout(LayoutKind.Explicit)]
public struct _PROCESSOR_INFO_UNION
{
[FieldOffset(0)]
internal uint dwOemId;
[FieldOffset(0)]
internal ushort wProcessorArchitecture;
[FieldOffset(2)]
internal ushort wReserved;
}
مطلب زیر چکیدهای است از کتاب Framework Design Guidelines در مورد سربارگذاری توابع
الف) از یک نوع خروجی استفاده کنید
مثال زیر را در نظر بگیرید:
public User[] GetGroupMembers(int groupId)
public List<User> GetGroupMembers(string groupName)
مشکل اینجا است که هنگام فراخوانی هر کدام، نحوهی استفاده متفاوت خواهد بود. بنابراین باید از این نوع سربارگذاری پرهیز کرد.
ب) نامهای آرگومانهای توابع سربارگذاری شده شما باید یکسان باشند
در مثال زیر، از اولین آرگومان جهت دریافت شناسهی یک گروه استفاده میشود:
public List<User> GetGroupMembers(int groupId)
public List<User> GetGroupMembers(int id, int pageIndex, int pageSize)
ج) ترتیب آرگومانها را در توابع سربارگذاری شده حفظ و رعایت نمائید
لطفا به مثال زیر دقت کنید:
public List<User> GetGroupMembers(int groupId)
public List<User> GetGroupMembers(int pageIndex, int pageSize, int groupId)
د) از call forwarding استفاده کنید
جهت توضیح بهتر call forwarding به مثال زیر دقت نمائید:
public List<User> GetGroupMembers(int groupId)
{
return GetGroupMembers(groupId, 0, 10);
}
public List<User> GetGroupMembers(int groupId, int pageIndex, int pageSize)
{
return GetGroupMembers(groupId, pageIndex, pageSize, SortOrder.Ascending);
}
public List<User> GetGroupMembers(int groupId, int pageIndex, int pageSize, SortOrder sortOrder)
{
var query = new GroupQuery();
query.GroupID = groupId;
query.PageIndex = pageIndex;
query.PageSize = pageSize;
query.SortOrder = sortOrder;
return GetGroupMembers(query);
}
public List<User> GetGroupMembers(GroupQuery groupQuery)
{
// Actual implementation to get group members goes here
}
ه) زیاده روی نکنید!
آخرین موردی که توصیه شده این است که در تهیه توابع سربارگذاری شده زیاده روی نکنید. در این نوع موارد باید قانون 80/20 را در نظر گرفت. 2 تا 3 تابع سربارگذاری شده ارائه دهید که 80 درصد کار را انجام میدهند و سپس یک تابع سربارگذاری شدهی دیگر ارائه دهید که 20 درصد باقیمانده را پوشش دهد.
پ.ن.
در سی شارپ 4 ، با معرفی optional parameters ، شاید کمتر به سربارگذاری نیاز باشد.
حدود 8 سال از ارائه اولین نگارش دات نت فریم ورک میگذرد و در ادامه مرور سریعی خواهیم داشت بر عناوین کتابخانههای اضافه شده به این مجموعه:
دات نت فریم ورک 1.0
اولین ارائه عمومی آزمایشی آن در PDC 2000 صورت گرفت و در اوایل 2002 به عموم عرضه شد (2/13/2002).
عبارت کد مدیریت شده را به دنیا معرفی کرد (managed code) و شامل اجزای زیر بود:
• GC, JIT
• C#
• Coherent Framework
• XSP….ASP+…ASP.NET!
• WinForms
در اوایل 2003 به همراه ویندوز سرور 2003 و VS 2003 ارائه شد.
• Mobile ASP.NET controls
• Built-in support for ODBC and Oracle databases.
• IPv6 support.
در اواخر 2005 ارائه شد (11/07/2005) و شامل تازههای زیر بود:
• ASP.NET for the Masses
○ Application Building Blocks
§ Parts, Authentication, Role Management, etc
○ Visual Web Developer
• Client Development
• ClickOnce!
در اواخر 2006 ارائه شد (11/06/2006) و موارد زیر را به این فریم ورک افزود:
• Windows CardSpace - Digital identity interface.
• Windows Presentation Foundation : WPF
○ Vector Graphics, Media and UI
○ Enters the age of UX
• Windows Communication Foundation : WCF
○ Unified messaging model
• Windows Workflow Foundation : WF
○ Coordinating work with durable applications
در پایان 2007 ارائه شد (11/19/2007) و تازههای زیر را به همراه داشت:
• Linq
• Expression Trees and Lamda Methods
• Extension Methods
• Paging Support for ADO.NET
• Managed Wrappers for WMI and AD
• Enhancements to WCF and WF
• System.CodeDom namespace
• ASP.NET AJAX
• WCF/WF
○ REST Services
○ Workflow Services
• Client
○ Sync
○ Client app services
سرویس پک یک دات نت فریم ورک 3.5
در اواسط 2008 ارائه شد (8/11/2008) و به همراه تغییرات زیر بود:
• ASP.NET Dynamic Data
• ADO.NET
○ Entity Framework
○ Data Services (Astoria)
• WCF
○ AtomPub ServiceDocuments
• Client
○ Client Profile
○ Performance
§ Working set and startup time
• Silverlight 2
○ RTM end of 2008
○ Brings power of .NET to the web client
○ Media and RIA .NET platform
دات نت فریم ورک 4.0
نگارش بتای آن در دسترس است و احتمالا نگارش نهایی آن در سال آیندهی میلادی به همراه VS2010 ارائه میشود. این مجموعه تازههای زیر را به همراه خواهد داشت:
• Base Class Library Improvements
○ Managed Extensibility Framework
○ More Core Data Structures
○ I/O Improvements
• Parallel Computing
○ Task Parallel Library
○ Parallel Linq (PLINQ)
○ Coordination Data Structures (CDS)
• Client
○ WPF
§ Client Profile
§ Business Focused Controls
§ Win7 Advances (Multi-touch, etc)
○ ADO.NET
§ Entity Framework v2
□ Code-First Development
□ TDD Support
□ Foreign-Key Support
○ ASP.NET
§ ASP.NET Dynamic Data Improvements
§ ASP.NET MVC
§ ASP.NET Dynamic Data for MVC
§ Extensible Caching Framework
○ WF & WCF
§ Fully Declarative Services
§ Workflow Enhancements
□ New flowchart modeling
□ Workflow Rules Integration
□ … much more…
§ WCF Enhancements
□ Durable Duplex
□ WS-Discovery & UDP Channel
□ In-Process Channel
§ RIA (Silverlight)
□ Simplified N-tier development
□ Business-focused framework
احتمالا همیشه برای شما سؤال بوده است که مجوزهای گوناگون سورس باز با هم چه فرقی دارند، یا اینکه اگر روزی خواستم پروژهی خود را به صورت سورس باز ارائه کنم، کدامیک از مجوزهای موجود مناسبتر است و همچنین وقت مطالعه مقالات طولانی یا کتابهایی چند صد صفحهای در این مورد را نداشتهاید.
جدول زیر کار مقایسه این مجوزها (موارد رایجتر) را به صورت مختصر و مفید و بر اساس سؤالات رایج کاربران، انجام میدهد:
نام مجوز | آیا به کار مشتق شده از پروژه اصلی، میتوانم نامی دیگر بدهم؟ | آیا باید حتما کار مشتق شده سورس باز باقی بماند؟ | آیا میتوانم برای کار مشتق شده مجوزی جدید انتخاب کنم؟ | آیا میتوانم کار مشتق شده را بفروشم و کسب درآمد کنم؟ |
Apache License 2.0 | بله | خیر | بله | بله |
Common Development and Distribution License (CDDL) | بله | خیر | بله (به مجوزهای سازگار دیگری از همین دست) | بله |
GNU General Public License 2.0 (GPLv2) | بله، اما حتما باید لیست تغییرات انجام شده نسبت به پروژه اصلی را نیز ارائه بدهید. | بله | بله (به مجوزهای سازگار دیگری از همین دست یا توافق با نویسنده اصلی) | بله |
GNU Library General Public License (LGPL) | بله | بله، اما امکان استفاده از کتابخانههای کامپایل شده یک پروژه سورس باز تحت این مجوز در یک پروژه سورس بسته نیز وجود دارد. | بله (به مجوزهای سازگار دیگری از همین دست) | بله |
Microsoft Public License (Ms-PL) | بله، اما نمیتوانید از علامت تجاری خود استفاده کنید. | خیر | خیر | بله |
Microsoft Reciprocal License (Ms-RL) | بله، اما نمیتوانید از علامت تجاری خود استفاده کنید. | بله | خیر | بله |
Mozilla Public License 1.1 (MPL) | بله | خیر | خیر | بله |
BSD License | بله | خیر | بله | بله |
MIT License | بله | خیر | بله | بله |
همچنین لازم به ذکر است که
مجوزهای کار اصلی و کار مشتق شده هر دو باید ذکر شوند.
پسندیده است که از نویسندگان کار اصلی، نامبرده شده و قدردانی گردد.
هیچکدام از این مجوزها مسؤولیتی را در قبال کار انجام شده نمیپذیرند!
جهت مطالعه بیشتر:
http://khason.net/blog/open-source-licenses-comparison-table/
http://developer.kde.org/documentation/licensing/licenses_summary.html
http://en.wikipedia.org/wiki/Comparison_of_free_software_licences
داشتم به دنبال راهی برای نمایش محبوبترین پستها در وبلاگ جاری میگشتم، این جستجو به لولههای یاهو ختم شد!
یکی از پرکاربردترین ویجتهای بلاگر، ویجت نمایش فید است (با نام "عناوین خبری" ترجمه شده است). برای مثال همین لیست آخرین نظرها در سایت، با استفاده از فید استاندارد کامنتهای سایت درست شده است. 5 کامنت آخر سایت را نمایش میدهد که البته این یک ایراد هم هست و بیشتر از این تعداد را قبول نمیکند. یا دقیقا همان زمان ارسال کامنت به روز نمیشود. به نظر در ساعات مشخصی از روز این به روز رسانی صورت میگیرد.
جهت "نمایش لیست مطالبی با بیشترین کامنت" میتوانید به آدرس زیر مراجعه کنید:
Popular Posts/Most Commented Widget for Blogger Blogs
آدرس بلاگ خود را وارد کنید (بدون http البته). عدد دلخواهی را که بیانگر تعداد رکورد بازگشت داده شده است نیز وارد نمائید (هر چند بلاگر فقط 5 آیتم را نمایش خواهد داد) و سپس بر روی دکمه run کلیک کنید. در همانجا روی more options کلیک کرده و لینک فید rss آنرا دریافت کنید. در حقیقت با استفاده از لولههای یاهو یک سری پردازش روی فید کامنتهای سایت صورت گرفته و آمار نهایی به صورت یک فید جدید به شما ارائه خواهد شد که از آن میتوانید در ویجت مربوط به عناوین خبری یا همان فیدهای بلاگر، استفاده کنید.
و یا نمایش لیست برترین کامنت گذاران!
Top Commentators Widget for Blogger
در اینجا روی لینک clone کلیک کنید تا یک نمونه مخصوص شما کپی شود (بهتر است به اکانت ایمیل خود در یاهو لاگین کرده باشید). اکنون میتوانید آن را ادیت کرده و بر روی آن تغییرات دلخواه را اعمال کنید (وارد کردن لینک فید کامنتهای سایت مطابق شکل). سپس بر روی دکمه ذخیره کلیک کرده و نهایتا فید rss آنرا دریافت کنید.
موارد دیگری هم از همین دست در سایت لولههای یاهو موجود است:
http://pipes.yahoo.com/pipes/search?q=blogger&x=6&y=9
قبل از استفاده از بلاگر، در سایت wordpress وبلاگ داشتم، که بهدلایلی کنسل شد. تفاوت محسوسی را که اینجا مشاهده میکنم، نبود قسمت آمار سایت است. در سایت wordpress آمار مبسوطی را از بازدید کنندگان سایت میتوانید در کنترل پنل مدیریتی وبلاگ مشاهده کنید، اما در اینجا خیر.
به همین جهت اولین کاری را که انجام دادم استفاده از سرویس رایگان persianstat بود که انصافا هم با کیفیت است و قابل مقایسه با آماری که wordpress ارائه میدهد، میباشد.
جالب اینجا است که هر چند هاست اینجا، گوگل است اما استفادهی خودکار از ابزار Google analytics در آن مهیا نیست. احتمالا علت آن آماده نبودن API آن است که قرار است به زودی ارائه شود، بنابراین ارزش وقت گذاشتن را دارد.
برای استفاده از Google analytics ، پس از ثبت نام و ورود به آن، سایت مورد نظر را معرفی کرده (در قسمت Add Website Profile) و نهایتا یک کد جاوا اسکریپتی به شما خواهد داد که میتوانید آنرا به صفحات مورد نظر خود در سایت اضافه نمائید تا تحت کنترل آماری قرار گیرد. محدودیتی هم در مورد تعداد سایت وجود ندارد و با یک اکانت میتوانید چندین سایت را معرفی کرده و تحت کنترل قرار دهید.
اگر از ASP.Net استفاده میکنید، تنها کافی است به master page سایت مراجعه کنید و پیش از بسته شدن تگ body ، اسکریپت مربوط به Google analytics را اضافه کنید تا تمام سایت را تحت کنترل قرار دهید.
یا اگر علاقمند بودید که اینکار را به صورت "شیکتری" انجام دهید، میتوان از این http module استفاده کرد. به این صورت ابتدا تگ بسته شدن body به صورت خودکار پیدا شده و سپس اسکریپت به پیش از آن اضافه میشود.
این روش بار بزرگ تهیه آمار سایت را حذف خواهد کرد. عموما دیتابیس جمع آوری آمار سایت خیلی زود (برای مثال پس از گذشت 6 ماه) حجیم میشود و تاثیر مشهودی را بر روی کارآیی سایت خواهد گذاشت. بنابراین، این سؤال مطرح میشود که چرا گوگل اینکار را برای ما انجام ندهد؟! هزینه بانک اس کیوال سرور بر روی هاستهای اینترنتی بالا بوده و حجمی را هم که در اختیار قرار میدهند محدود است. در صورت نیاز به حجمهای بالاتر باید هزینه بیشتری را پرداخت کرد. بنابراین هم از لحاظ قیمت و هچنین کارآیی سایت، استفاده از این سرویس واقعا مقرون به صرفه است. بعلاوه از تنوع آماری که ارائه میدهد نیز نمیتوان چشم پوشی کرد. برای مثال کاربران چه واژههای کلیدی را در موتورهای جستجو وارد کردهاند تا به سایت شما رسیدهاند؟ چند درصد کاربر وفادار دارید؟! (کاربرهای وفادار، منظور افرادی هستند که به صورت منظم به سایت سر میزنند) و امثال این. انصافا تهیه چنین ماژولی برای یک سایت از لحاظ برنامه نویسی شاید با برنامه نویسی کل یک سایت برابری کند.
اگر هم نیاز به یک برنامه سورس باز داشتید که هر روز به اکانت Google analytics شما سر بزند و اطلاعات آنرا استخراج کرده و در یک بانک SQL server ذخیره کند، میتوانید به پروژه سی شارپ زیر مراجعه نمائید:
Google Analytics Data Extractor
البته باید دقت داشت که پس از ارائه API کامل Google analytics ، دیگر نیازی به این نوع روشهای ابتکاری وجود نداشته و استخراج داده از آن بسیار سادهتر خواهد شد.