بررسی وجود پیاده سازی محتویات MasterPage

25 10 2009

شاید در استفاده از MasterPage ها زمانی پیش آمده باشد که لازم شده وجود پیاده سازی یک ContentPlaceHolder را در صفحه خاص رو بررسی کنید. مثلا زمانی رو در نظر بگیرید که در صفحه خاصی نباید بلوک خلاصه محتویات صفحه یا لینکها نمایش داده شود و این کادر نیز در MasterPage پیاده سازی شده است.

پس روشی باید به کار گیرید که آن کادر در آن صفحه به خصوص نمایش داده نشود. متاسفانه در دات نت روشی برای این کار در نظر گرفته نشده است؛ لااقل هیچ متد عمومی برای این کار وجود ندارد.

خوشبختانه ویژگی داخلی و مخفی در کلاس MasterPage وجود دارد به نام ContentTemplates که لیستی از ContentPlaceHolder هست که توسط صفحه جاری پیاده سازی شده است. کاری که لازم است استفاده از قدرت Reflection دات نت هست تا به آن ویژگی دسترسی پیدا کنیم.

همراه با این باید ContentPlaceHolder برای وجود کنترل در داخلی خودش هم بررسی بشه. تابع زیر برای همین کار هست:

public static bool HasNonEmptyControls(ContentPlaceHolder cph)
{
    if (cph.Controls.Count == 0)
    {
        return false;
    }
    else if (cph.Controls.Count == 1)
    {
        LiteralControl c = cph.Controls[0] as LiteralControl;

        if (string.IsNullOrEmpty(c.Text) || IsWhiteSpace(c.Text))
            return false;
    }

    return true;
}

static bool IsWhiteSpace(string s)
{
    for (int i = 0; i < s.Length; i++)
        if (!char.IsWhiteSpace(s[i]))
            return false;

    return true;
}

در ادامه تابع اصلی منظور ما که وجود پیاده سازی از یک ContentPlaceHolder به خصوص رو بررسی خواهد کرد:

static readonly Type _masterType = typeof(MasterPage);
static readonly PropertyInfo _contentTemplatesProp = _masterType.GetProperty("ContentTemplates", BindingFlags.GetProperty | BindingFlags.NonPublic | BindingFlags.Instance);

public static bool HasContentPageContent(ContentPlaceHolder cph)
{
    IDictionary templates = null;
    MasterPage master = cph.Page.Master;

    while (templates == null && master != null)
    {
        templates = (IDictionary)_contentTemplatesProp.GetValue(master, null);
        master = master.Master;
    }

    if (templates == null)
        return false;

    bool isSpecified = false;

    foreach (string key in templates.Keys)
    {
        if (key == cph.ID)
        {
            isSpecified = true;

            break;
        }
    }

    return isSpecified;
}

همانطور که از کد مشخصه با بدست آوردن ویژگی ContentTemplates که یک لسیت دیکشنری است وجود ContentPlaceHolder مورد نظر رو بررسی می کنیم.

و سر انجام ترکیبی از این دو تابع جهت بدست آوردن نتیجه مطلوب:

public static bool HasContentOrControls(ContentPlaceHolder cph)
{
    return HasNonEmptyControls(cph) || HasContentPageContent(cph);
}

و تمام. به راحتی می توانید از این تابع استفاده کنید. مانند نمونه زیر:

<%if (HasContentOrControls(plhOptions)){ %>
<div id="options">
 <div>
 <h2>
 <asp:ContentPlaceHolder ID="plhOptionsTitle" runat="server" />
 </h2>
 <asp:ContentPlaceHolder ID="plhOptions" runat="server" />
 </div>
</div>
<%}%>

همانطور که در این مثال مشاهده می کنید، فقط در صورتی که plhOptions در صفحه پیاده سازی شده باشد کادر مربوط به آن همراه با محتویات بخش plhOptionsTitle نمایش داده خواهند شد.

منبع

خوش باشید.





بدست آوردن سطح دسترسی Administrator در ویندوز

6 09 2009
VistaUAC

از ویندوز ویستا به بعد و همچنین در ویندوز 7 مدیریت UAC قوانین سخت گیرانه ای رو برای سطح دسترسی کاربر و برنامه های کاربر به منابع سیسیتم و سیستم عامل در نظر گرفته است. این قوانین شامل اجرای تمامی برنامه ها در سطح دسترسی کاربر معمولی است و به همه آنها اعمال می شود. یعنی اگر کاربر فعلی دسترسی administrator داشته باشد باز هم برنامه های اجرا شد توسط آن با سطح user معمولی اجرا خواهد شد.

این سیاست که البته مدتهاست لینوکس از آن استفاده می کنه سبب خواهد شد بدافزارها نتوانند به راحتی به سیستم دسترسی داشته باشند. همچنین کنترل دسترسی نرم افزارها به منابع سیستم راحتتر خواهد بود.

این سیاست در ویندوزهای جدید ممکن است مشکلاتی رو برای برنامه های کاربردی پیش بیاره که از جمله عدم دسترسی نوشتن و بعضا خواندن برخی منابع سیستم است. توجه کنید که برنامه های عادی هیچ گاه نیاز دسترسی به منابع حیاتی سیستم نخواهد داشت. این مورد باید یک اصل در طراحی نرم افزارهای خود قرار بدید. مانند زمانی که دسترسی بی مورد به بخش های حساس ریجستری و یا شاخه ویندوز.

UAC-prompt

UAC

به هر حال شرایطی را در نظر بگیرید که به هر حال دسترسی به این منابع مورد نیاز باشد. در این صورت چند راه حل برای دستیابی به مجوز administrator وجود دارد.

راه حل اول- اولین و ساده ترین راه این است که از کاربر بخواهید با راست کلیک کردن بر روی برنامه شما و انتخاب Run as Administrator به برنامه این سطح دسترسی را بدهد. این راه حل مناسب و کاربر پسندی نخواهد بود.

راه حل دوم- در صورتی که از Visual Studio استفاده می کنید، دومین راه حل همراه با نسخه 2008 آن عرضه شده. این مورد بر این اساس هست که برنامه ها در صورتی که از یک manifest خاص استفاده کنند، ویندوز تشخیص خواهد داد که آن برنامه نیاز به مجوز admin دارد و این مورد توسط درخواستی از کاربر اعلام خواهد شد.

به این منظور نیاز به یک Application Manifest خواهد بود. برای افزودن آن به پروژه روی نام پروژه کلیک راست کرده و Add -> New Item رو انتخاب کنید. از این پنجره آیتم Application Manifest File رو انتخاب کنید. فایلی با نام app.manifest به پروژه اضافه خواهد شد. محتویات این فایل مانند زیر است:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
 </requestedPrivileges>
 </security>
 </trustInfo>
</asmv1:assembly>

تنها قسمت مهم برای ما requestedExecutionLevel هست که درخواست مجوز مورد نیاز رو مشخص می کنه. در ادامه آن، مقدار level نشان دهنده مجوز درخواستی است. این مقدار شامل موارد زیر است:

asInvoker: حالت پیش فرض سیستم که همان کاربر معمولی خواهد بود.

requireAdministrator: درخواست مجوز admin را مطرح می کنه. این درخواست باید برآورده بشه و برنامه حتما باید با این مجوز اجرا بشه در غیر اینصورت و درصورت عدم پذیرش کاربر برنامه اجرا نخواهد شد.

highestAvailable: درخواست بالاترین مجوز قابل دسترسی را مطرح می کند. دقت کنید که تفاوت این گزینه با requireAdministrator در این است که در صورتیکه امکان اجرای برنامه با دسترسی های پایین تری مانند PowerUser وجود باشد این انتخاب به کاربر واگذار خواهد شد. همچنین ممکن است که در این گزینه فقط کلمه عبور برای دسترسی های کمی بالاتر درخواست شود.

پس یکی از موارد requireAdministrator یا highestAvailable را با توجه به نیاز خود انتحاب کنید و فایل مذکور رو تغییر بدید. همچنین در بخش assemblyIdentity اطلاعات برنامه شما قرار دارد که تغییر آن اختیاری است.

در نهایت فایل app.manifest به این صورت خواهد بود:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="SalarBlog.AdministratorElevate.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

 </requestedPrivileges>
 </security>
 </trustInfo>
</asmv1:assembly>

راه حل سوم- این دو مورد روشهایی بودند که قبل از اجرای برنامه اتفاق می افتادند. در صورتی که در شرایطی لازم باشه که دسترسی از درون برنامه تعیین بشه موارد فوق موثر نخواهند بود.

در روش شوم این مشکل حل شده و پس از بررسی سطح دسترسی اقدام به درخواست آن خواهیم کرد. البته همچنان برای درخواست دسترسی نیاز خواهد بود تا برنامه دوباره اجرا شود.

ابتدا لازم است تا سطح دسترسی کاربر فعلی را بررسی کنیم:

public static bool AdministratorIsInRole()
{
 return new WindowsPrincipal(WindowsIdentity.GetCurrent())
 .IsInRole(WindowsBuiltInRole.Administrator);
}

در این تابع موجز دسترسی Administrator بررسی شده است. سپس با استفاده از تابع ShellExecute ویندوز و پارامترهای آن درخواست اجرا را مشخص می کنیم:

public static void Elevate()
{
 ShellExecute(IntPtr.Zero, "runas",
 Application.ExecutablePath + "", "", "", 1);
}

[DllImport("shell32.dll")]
private static extern void ShellExecute(IntPtr intPtr, string p, string p3, string p4, string p5, int p6);

و سرانجام کافی هست تا اینها را یکجا و در کد برنامه قرار دهید. برنامه نهایی مانند زیر خواهد بود:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Security.Principal;
using System.Runtime.InteropServices;

namespace AdminElvate
{
 static class Program
 {

 [STAThread]
 static void Main()
 {
 if (!AdministratorIsInRole())
 {
 Elevate();
 return;
 }

 Application.EnableVisualStyles();
 Application.SetCompatibleTextRenderingDefault(false);
 Application.Run(new Form1());
 }

 static bool AdministratorIsInRole()
 {
 return new WindowsPrincipal(WindowsIdentity.GetCurrent())
 .IsInRole(WindowsBuiltInRole.Administrator);
 }
 static void Elevate()
 {
 ShellExecute(IntPtr.Zero, "runas",
 Application.ExecutablePath + "", "", "", 1);
 }

 [DllImport("shell32.dll")]
 private static extern void ShellExecute(IntPtr intPtr, string p, string p3, string p4, string p5, int p6);

 }
}

و تمام. این کد رو می تونید در تمام قسمتهای برنامه استفاده کنید، ولی به هر حال برای بدست آوردن مجوز بالاتر باید برنامه مجددا اجرا بشه.





بررسی کامل Google Webmaster Tools

22 07 2009

Google Webmaster Tools
Webmaster Tools یکی از سرویس های ویژه مدیران سایتها است که با هدف افزایش کیفیت سایتها با توجه به معیارهایی شرکت گوگل است. این کار برای افزایش کیفیت نتیایج مرتبط با عبارات جستجو طراحی شده است. این سرویس مدت چندین سال است که راه اندازی شده و اخیرا بازبینی بر روی برخی امکانات و ظاهر آن صورت گرفته است.

قبل از هر چیز این رو توضیح بدم این سرویس بهترین نتیجه را زمانی خواهد داشت که صاحب سایت امکان ویرایش کدهای آن رو داشته باشه، به عبارتی ممکن است نیاز به تغییراتی باشد که برنامه نویس باید آنها را انجام دهد. برای وبلاگها و سایر سرویسها در صورت داشتن شرایطی که در ادامه مطرح خواهد کرد، امکان استفاده از این سرویس گوگل وجود دارد.

  • بررسی ویژگی و مزایا

قبل از هر کاری باید سایت را در این سرویس ثبت کنید و سپس آن را تایید هویت کنید. این مراحل را در آخر این مقاله خواهید خواند. پس از وارد شدن به حساب خود موارد زیر را مشاهده خواهید کرد.

بخش Dashboard

در این صفحه که صفحه آغازین سایتی که ثبت کرده اید است، اطلاعات مختصری از آخرین وضعیت سایت نمایش داده می شود. اینها شامل اطلاعاتی در مورد وضعیت sitemap ها، وضعیت بازبینی سایت توسط موتور گوگل و وضعیت کلمات کلیدی جستجو شده برای ورود به سایتتان است.

در منوی سمت چپ لیستی منویی می بینید که از طریق آن را سایر قسمت های این سرویس می توانید دست پیدا کنید.

مدیریت Sitemap

Sitemap یا به فارسی نقشه سایت، به صورت تعدادی استاندارد عرضه شده که اکثر آنها را گوگل در این سرویس پشتیبانی می کنه. همچنین گوگل این امکان رو میده که نقشه سایت رو به صورت Feed یا “خوراک” ثبت کنید.

با ثبت نقشه سایت گوگل می تونه خیلی راهت تر و سریع تر به مرور سایت شما بپردازد و آدرسهایی که ممکن است لینکی به آنها داده نشده باشه رو پیدا کنه. همچنین تغییرات صفحه خیلی سریعتر شناسایی خواهند شد. استفاده از این سرویس خیلی موثر است و حتما حداقل یک نقشه سایت به ثبت برسانید.

پس از ثبت نقشه سایت می توانید آخرین وضعیت آن را بررسی و تعداد لینکهای اضافه شده به موتور جستجوی گوگل را مشاهده کنید.

مدیریت دسترسی به قسمتهای سایت (Crawler access)

قبل از پیدایش سرویس هایی مانند Webmaster Tools صاحبان سایت برای جلوگیری از دسترسی و اندیس شدن برخی صفحات مجبور به استفاده از فایلی به نام robots.txt بودند. این فایل فرمت خاصی دارد که این امکان را می دهد که به صفحات خاص دسترسی داد و یا دسترسی را ممنون اعلام کرد.

تمام موتور جستجو های کنونی از این فایل پشتیبانی می کنند ولی گوگل در این سرویس و در این بخش این اجازه را می دهد که کنترل بیشتری بر روی دسترسی ها داشته باشید. امکان حدف آدرسها یکی از این موارد است.

همچنین در این بخش می توان به تولید فایل robots.txt پرداخت و آن را در موتور های جستجوی مختلف گوگل مورد آزمایش قرار داد.

مدیریت SiteLinks

در صورتی که خوش شانس باشید و سایت شما دارای بازدید زیاد و همچنین PageRank بالایی باشد در این صورت ممکن است که گوگل لینک سایت شما را به صورت دیگری نشان بدهد. مانند زیر:

Sitelinks

Sitelinks

در این قسمت می توانید لینکهایی که در Sitelinks داده شده را ویرایش کنید.

تنظیمات کلی سایت (Settings)

این تنظیمات در داخل بخش Site configuration با نام Settings قرار دارند. کارهای می توانید انجام بدهید به شرح زیر است.

Site Settings

Site Settings

اولین مورد انتخاب کشور هدف است. با این انتخاب سایت شما فقط در جستجو هایی که از آن کشور انجام می شود قرار خواهد گرفت. متاسفانه ایران در این لیست قرار ندارد.

همچنین می توانید به گوگل بگویید که آدرس سایت شما را با www نمایش بدهد یا نه و یا اینکه با توجه به لینک ها این کار را انجام دهد. این گزینه با نام Preferred domain مشخص شده است.

و سرانجام تنظیم تعداد دفعات مراجعه موتور کاوشگر گوگل به سایت در قسمت Crawl rate قابل تنظیم است. ممکن است که به علت بزرگ بودن سایت و مشکلات سرور نتوان پاسخ گوی درخواستهای اضافی بود که در این صورت این مقدار باید کم شود. در صورتی هم که از عدم شناسایی به موقع تغییرات سایت ناراضی هستید مقدار آن را افزایش دهید.

توجه کنید که این گزینه بر ترافیک سایت و همچنین به روز بودن لینکها تاثیر زیادی دارد و در تغییر این مقادیر دقت کند.

بهترین کلمات کلیدی – Top search queries
در این قسمت کلمات کلیدی که در موتور جستجو بیشترین مراجعه را به سایت شما کرده است نمایش داده می شود. همچنین موقعیت شما در نتایج جستجو با استفاده از کلمات کلیدی که در سایت استفاده کرده اید نمایش داده می شود.

این لیست خیلی مهم است و با استفاده از آن می توان فهمید که کاربران به چه چیزهایی علاقه دارند. همچنین چه کلمات کلیدی شانس بیشتری برای کلیک دارند. با استفاده از این کلمات می توانید سایت خود را بهینه تر کنید.

Top search queries

Top search queries

لینک ها به سایت – Links to your site
در این صفحاتی که لینکهایی از سایت های دیگر به آن داده شده است لیست می شوند. همچنین می توان متن لینکی که برای لینک دادن استفاده شده است را مشاهده کرد.

با استفاده از این ویژگی مشخص می شود که کدام صفحات بیشتر مورد پسند مخاطبین قرار گرفته که به آن لینک داده اند و از چه واژگانی برای لینک دادن استفاده کرده اند. امکان مشاهده سایت های لینک داده نیز وجود دارد.

کلمات کلیدی – Keywords

در این صفحه لیست پر کاربردترین کلمات کلیدی قرار دارد. برای درک ساختار مطالب صفحات شما برای تنظیم مقادیر Keyword مناسب است.

برای فارسی این مشکل وجود دارد که حروف اضافه مانند “در” در بالاترین مکان قرار می گیرند.

لینک های داخلی – Internal Links

لیست صفحاتی که در داخل سایت به یکدیگر لینک داده اند در این صفحه نمایش داده می شود. تعداد لینکهایی که به یک صفحه خاص داده شده مشخص است و امکان مشاهده صفحات لینک داده شده وجود دارد.

از این سرویس می توان برای شناسایی لینک هایی که صفحات به یکدیگر می دهند استفاده کرد.

مشترکین خوراک – Subscriber stats

در صورتی که سایت شما Feed یا خوراک ارائه میده در این صفحه می تونید وضعیت مشتریک خود را در سرویس Google Reader مشاهده کنید. در صورتی که این feed ها را قبلا در قسمت sitemap ثبت نکرده باشید می توانید آنها را مستقیما از اینجا به لیست Sitemap ها اضافه کنید.

خطاهای موتور کاوشکر – Crawl errors

موتور کاوشگر گوگل رباتی است که با حرکت در میان سایتها و لینکها آنها را با فرمول خاصی امتیاز بندی کرده و به فهرست نتایج جستجو اضافه می کند. در این صفحه جزئیات خطاهایی که در هنگام کاوش درون سایت شما پیش آمده نمایش داده می شود.

این خطاها در سه گروه عمده Web و Mobile-Chtml و Mobile-Xhtml تقسیم بندی شده که نشان دهنده وجود سه موتور کاوشگر متفاوت برای این نوع صفحات است.

به غیر از Web بقیه موارد زمانی نشان داده می شود که سایت سرویس هایی برای موبایل ارائه کند.

بخش های فرعی شامل جزئیات خطاها هستند که درتصویر مشاهده می کنید:

Crawl Errors

Crawl Errors

همیشه این موارد را دنبال کنید کنید چراکه اگر مشکلی در کاوش صفحه ای پیش بیاید بدان معنی است که ممکن آن صفحه در نتایج جستجو نشان داده نشود و یا اینکه تغییرات در نتایج اعمال نشود.

در این لیست تنها موردی که ممکن شما را به اشتباه بیاندازد و باید به آن توجه کنید قسمت “Restricted by robots.txt” است. صفحات لیست شده در این قسمت دارای اشکال نیستند و فقط توسط robots.txt که قبلا گفته شد، از لیست نتایج حذف شده اند و در نتیجه موتور کاوشکر آنها را کاوش نکرده است. این لیست کمک خواهد کرد که بدانید دقیقا کدام صفحات از نتایج جستجو حذف شده اند.

گزارش موتور کاوشگر – Crawl stats
این گزارش عملکرد موتور کاوشگر بر روی سایت است که شامل میانگین مدت زمان صرف شده برای دریافت صفحات و تعداد روزانه صفحات بازدید شده و همچنین حجم باند مصرفی است.

این گزارش بسیار جالی است که از آن می توانید برای تغییر عمکرد موتور کاوشگر که شرح آن در بخش Settings داده شد استفاده کنید. توجه کنید که این آمار به صورت 15 روز یکبار به روز می شود. به مقادیر آن دقت کنید و در صورتی که تغییر ناگهانی در آن دیدید، ممکن است مشکلی در سایت یا سرور میزبان سایت شما پیش آمده باشد.

Crawl Stats

Crawl Stats

همچنین در زیر این آمار خلاصه وضعیت سایت از نظر Page Rank نمایش داده شده است. یعنی در حالت کلی سایت بیشتر در بالای نتایج نمایش داده می شود یا نه.

در ادامه صفحه ای که در هر ماه دارای بیشترین Page Rank بوده نیز نمایش داده می شود.

پیشنهادات بهینه سازی – HTML suggestions

به نظر من این بخش یکی از جالب تری قسمت های این سرویس گوگل است. در این قسمت لیست صفحاتی که دارای مشکلات جزئی هستند که مانع از ارتقاء رتبه آنها در نتایج جستجو می شوند وجود دارد.

برای نمونه در صورتی که دو صفحه از یک عنوان استفاده کنند، این مورد در قسمت Duplicate title tags با عنوان وجود یک مشکل نمایش داده خواهد و با ورود به جزئیات امکان مشاهده صفحاتی که دارای اشکال هستند نمایش داده خواهد شد.

سعی کنید همیشه این صفحه را بررسی کنید و اشکالات گرفته شده را برطرف کنید. مطمئن باشید نتایج خوبی خواهد داشت. معمولا کمی طول می کشد که تغییراتی که به سایت داده اید در این سرویس منعکس شود ولی به هر حال بسیار با ارزش خواهد بود.

  • نحوه ثبت سایت در این سرویس

پس از اینکه وارد صفحه Webmaster Tools شدید بر روی گزینه Add site کلیک کرده و آدرس سایت رو وارد کنید. پس از آن آدرس سایت نمایش داده خواهد شد که نیاز به تایید دارد. برای تایید سایت بر روی گزینه Verify this site کلیک کنید:

افزودن سایت به Webmaster Tools

افزودن سایت به Webmaster Tools

تایید هویت سایت را به دو صورت می توانید انجام دهید. اول اینکه یک تکه کد Html را به صفحه اصلی سایت اضافه کنید و راه دوم اینکه یک فایل با نام مشخص در مسیر اصلی سایت قرار دهید.

در صورتی که به ساختار صفحات html آشنایی ندارید بهتر است که از روش دوم و قرار دادم فایل در مسیر اصلی سایت استفاده کنید. این فایل یک فایل خالی خواهد بود که نام آن را با انتخاب گزینه HTML file در قسمت Verification method به شما نمایش خواهد داد. این نام معمولا فرمتی مانند googlee30bf8a27611ecb4.html دارد.

تایید سایت

تایید سایت

پس از تایید سایت امکانات این سرویس فعال خواهند شد.

نکته ای برای وبلاگها: سرویس های وبلاگ در صورتی می توانند از این سرویس گوگل استفاده کنند که اجازه ویرایش صفحه Html وبلاگ را داشته باشند. به این علت که برای تایید سایت نیاز به افزودن کدی به صفحه است. خوشبختانه بیشتر سرویس ها شامل blogfa، mihanblog ، blogspot و غیره این امکان را می دهند. توجه کنید که این امکان در سرویس wordpress.com وجود ندارد.

در صورتی هم که وبلاگ بر روی هسات خودتان قرار دارد که بسیار راحت تر بوده و فقط فایل تایید هویت را باید در سایت قرار دهید.

موفق باشید.





دو ابزار قدرتمند برای تهیه عبارات با قاعده (Regex)

6 07 2009

قبل از هر چیز عذر خواهی من رو به خاطر تاخیر یک ماهه بپذیرید. علت آن هم همزمانی چندید رویداد بود که مانع از نوشتن می شد. سعی خواهم کرد در آینده تاخیری پیش نیاید.

عبارات با قاعده (Regular expressions) ابزار بسیار قدرتمندی در پردازش متون فرمت دار هستند.
از آنجایی که برخی عبارات می توانند بسیار پیچیده باشند وجود ابزاری برای ساده کردن کار بسیار لازم به نظر می رسه.
عبارات قاعده می توانند خیلی ساده مانند \w+ برای انتخاب کلمات باشند و یا خیلی پیچیده مانند (?><[A-Z][A-Z0-9]+)(?>\s+[^>\s]+)*?\s*(?>background\s*=(?!\\)\s*)(?>(['"])?)(?(?(1)(?(?<=”)[^"]+|[^']+)|[^ >]+))(?(1)\1|) برای انتخاب ویژگی background در تگهای Html باشند.

در اینجا قصد دارم دو ابزار رو معرفی کنم که هر کدام به نوبه خود قدرتمند هستند ولی استفاده همزمان از آنها باعث افزایش سرعت کار شما خواهد شد.

این ابزار 40 دلاری که با دلفی نوشته شده قابلیتهای فوق العاده ای رو در اختیار قرار میده. با داشتن یک محیط ویرایشگر قوی کد نویسی regex رو برایتون آسون می کنه. این محیط ویرایشگر با رنگی کردن کد ها درک آنها رو خیلی آسانتر کرده و همچنین با این کار می توان کد ها را خیلی راحت تر رفع ایراد کرد. همچنین با وجود این ویژگی می توانید کدهایی که قبلا نوشته اید رو به این ابزار انتقال داده و در آنجا مجددا بررسی کنید.

محیط ویرایشگر و آنالیزر

محیط ویرایشگر و آنالیزر

یک ویژگی مهم دیگر این نرم افزار پیاده سازی موتور پردازشگرهای زبانها مختلف برنامه نویسی است. به علت اینکه ممکن است برخی ویزگیهای regex در موتور های مختلف کمی متفاوت پیاده سازی شده باشند و یا جذف شده باشند، این ویژگی کمک خواهد کرد که کدهای نوشته شده با آن موتور همخوانی داشته باشد. تعدادی از موتور های پردازش regex  پیاده سازی شده شامل javascript, perl .NET , java, XPath و غیره است.

استفاده از موتور javascript

استفاده از موتور javascript

ویژگی قابل توجه دیگر اشکال زدای حرفه ای این ابزار است. با این اشکال زدا می توان مراحل اجرای یک دستور regex را دنبال کرد و محل وقوع اشتباه را دقیقا شناسایی کرد.

همچنین این اشکال زدا تعداد مراحل مورد نیاز انجام گرفته برای شناسایی متون را نمایش می دهد که این مورد می تواند در بهینه سازی عبارات regex کمک قابل توجهی بکند.

بخش تست نیز یک قسمت مهم هست که در آنجا عبارات بر روی نمونه مثالی که داده اید آزمایش می شود و نتایج بیدرنک در همانجا با رنگی کردن متون نمایش داده می شوند. این شیوه از رنگی شدن متون فهم عملکرد عبارات را خیلی ساده تر می کند.

تست و اشکال زدایی

تست و اشکال زدایی

خلاصه ای از ویژگی ها این ابزار:

Regex Tree and Regex Building Blocks
Regex Tester and Debugger
Instant Code Snippets
RegexBuddy Library
Search and Replace through Files and Folders
Integration with Your Favorite Software
و Toturial

این ابزار که با با دات نت نوشته شده است فقط امکان استفاده از موتور پردازشی دات نت را دارد و به همین خاطر از رقیب خود کمی عقب می ماند.

با این حال یکی از ویژگی های بسیار عالی این ابزار محیط طراحی یا Design این نرم افزار است که تقریبا تمام ویژگیهای regex را به صورت گزینه هایی در اختیار قرار می دهد، به طوری که کمتر به استفاده از صفحه کلید نیاز خواهید داشت.

محیط Expresso

محیط Expresso

از قابلیت دیگر و بسیار جالب این نرم افزار که از مورد قبلی نتیجه می شود، محیط آنالیز عبارات regex هست. در حین اینکه کدهای regex را می نویسید این آنالیزر کدهای شما را بررسی کرده و با توضیحات در لیست کناری نمایش می دهد. این نمایش به صورت درختی و بسیار کاربردی است. نکته مهم اینجا هست که در قسمت آنالیز با دوبار کلیک کردن بر روی هر قسمت و می توانید محیط ویرایشگر مخصوص آن قسمت را مشاهده کنید.

محیط آنالیز و ویرایش هر قسمت

محیط آنالیز و ویرایش هر قسمت

همانطور که در این تصویر مشاهده می کنید امکان تست عبارات وجود دارد. این امکان که به جزئیاتی همانند گروههای هر نتیجه دسترسی پیدا کنید از طریق لیست درختی بخش Search Results قابل دسترسی است.

مورد دیگر امکان Timing Test از منوی Tools هست که این امکان را فراهم می کند تا سرعت اجرای عبارات را در اجرای مکرر بسنجید.

و سر انجام مجموعه عبارت از قبل آماده که می توانید لیست آنها را در بخش Expression Leibrary مشاهده کنید.

ویژگیهای این ابزار به صورت لیست وار:

Test expressions against real or sample input data
Display all matches in a tree structure, showing captured groups, and all captures within a group
Build replacement strings and test the match and replace functionality
Highlight matched text in the input data
Test automatically for syntax errors
Generate Visual Basic, C#, or C++ code
Dramatically enhanced Analyzer
Rich new Builder and editing features

  • این دو ابزار با هم

این دو نرم افزار همانطور که ذکر شد دارای ویژگیهایی قابل ملاحظه ای هستند. اما با این حال شاید در برخی موارد کاستی هایی داشته باشند. به همین خاطر چرا از هردوی آنها استفاده نکنیم؟ این راه کار من هست:

ابزار RegexBuddy یک عیب اذیت کننده دارد و آن محیط کد نویسی یا تولید عبارات با قاعده است. یک منو که فقط با اسامی امکان دسترسی سریع به الگوها را می دهد.

ابزار Expresso عیبی که دارد این است که بر روی تست های عبارات کنترل کافی ندارد. برای مثال در صورتی که در تستها نتیجه ای از قلم افتاده باشد مشخص نخواهد شد. همچنین قدرت اشکال زدایی و اجرای قدم به قدم عبارات را نیز ندارد.

با توجه به این معایب و وِیژگیهایی که برای هر یک ذکر کردم می توان از این دو ابزار به این صورت در کنار هم استفاده کرد.

در صورتی که عبارات regex از قبل دارید و فقط می خواهید کارایی آن را آزمایش کرده و یا تغییرات اندکی به آن بدهید بی درنگ از RegexBuddy استفاده کنید که امکان قابل توجهی برایتان در اختیار دارد.

در صورتی که در حال نوشتن عبارات جدید هستید از ابزار expresso و محیط Design آن استفاده کنید. همچنین از ویژگیهای آنالیزر آن هم استفاده کرده و می توانید تست های خوبی روی عبارات انجام دهید. و سرانجام برای تست نهایی و تایید صحت عملکرد و بهینه سازی از ابزار RegexBuddy استفاده کنید.

در حالت کلی برای تست سریع عباراتی که در اینترنت مشاهده می کنید و یا به ذهنتان خطور می کند به سلیقه خود یکی را انتخاب کنید.

موفق باشید





ایجاد FavIcon متحرک و تغییر آن با جاوا اسکریپت

9 05 2009

تاکنون سایتهایی را دیده اید که favicon متحرک دارند. اعمال این انیمشین به سادگی امکان پذیر است.

برای اطلاع از اینکه favicon چیست به اینجا مراجعه کنید.

متحرک بودن آیکون سایت فقط در مرورگر فایرفاکس پشتیبانی میشود و در بقیه متحرک نخواهد بود. مرور IE نیز که به طور کل آن را پشتیبانی نمی کند.

favicon متحرک

برای اعمال آیکون متحرک ابتدا فایل انیمشن gif مورد خودتون رو ایجاد کنید و در مسیر سایت قرار بدید.

کد زیر رو به قسمت head فایل html مورد نظر اضافه کنید:
<link rel="shortcut icon" href="favicon.gif" type="image/gif">

نکته ای که در اینجا مهم هست استفاده همزمان از فایل gif و icon هست  تا برای مرورگرهایی که از این ویژگی پشتیانی نمی کنند مشکلی پیش نیاید و همچنان آیکون سایت نمایش داده بشود.
بس برای این منظور فایل favicon.ico را هم در مسیر قرار و لینک آن را نیز به قسمت head اضافه کنید. توجه کنید لینک icon باید قبل از gif باشد تا فایل gif در اولویت قرار گیرد.

نتیجه نهایی قسمت head صفحه به این صورت خواهد بود:

<head>
  <title>SalarBlog.wordpress.com Animated Favicons</title>
  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
  <link rel="shortcut icon" href="favicon.gif" type="image/gif">
</head>

نحوه تغییر favicon با جاوا اسکریپت

در صورتی که بخواهید آیکون سایت در شرایط مختلف تغییر کنه می توانید از روشی که در ادامه توضیح می دهم استفاده کنید.
کاربرد این تغییر می تونه برای وضعیت های مختلف صفحه باشه. برای مثال آیکون سایت برای روز متفاوت از آیکون برای شب باشه و از این مدل تغییرات.

این روش فقط در مرورگرهای فایرفاکس و اپرا کار خواهد کرد و در سایر مرورگرها بی اثر هست.
تابع زیر در جاوا اسکریپت با دریافت آدرس آیکون آن را به صفحه اعمال می کند:

function ChangeFavicon(iconUrl){
  var docHead=document.getElementsByTagName('head');
  if(docHead!=null && docHead.length>0)
    docHead=docHead[0];
else return;
  var link = document.createElement("link");
  link.type="image/x-icon";
  link.href=iconUrl;
  link.rel="shortcut icon";
  docHead.appendChild(link);
}

در این تابع با ایجاد یک شی Link و مقدار دهی آن و سپس اضافه کردن آن به بخش head سایت مرورگر رو وادار به شناسایی آیکون جدید کرده و آن را نمایش می دهیم.

استفاده از این تابع آسان است و به صورت زیر خواهد بود.

ChangeFavicon('favicon-frame1.ico');
ChangeFavicon('favicon-frame2.ico');
ChangeFavicon('favicon-frame3.ico');

پ.ن: برای ایجاد favicon به صورت آنلاین از سایت favicon.cc استفاده کنید.

موفق باشید





Threadها در جاوا اسکریپت

13 03 2009
WebWorker

در جاوا اسکریپت نیز همانند سایر زبانها انجام برخی محاسبات نیاز به زمان زیادی دارد.

همانند کد زیر که رشته فیبوناچی را محاسبه می کند:

function fibonacci(n) {
  if(n == 0)
    return 0;
  if(n == 1)
    return 1;
  return fibonacci(n - 1) + fibonacci(n - 2);
}

در صورتی که این کد را در صفحه وب خود برای محاسبه عدد 35 ام استفاده کنید، در اکثر مرورگر ها صفحه قفل خواهد شد و اگر خوش شانس باشید مرورگر پس از مدتی با پیغامی ادامه عملیات را خواهد پرسید.

برای رفع چنین مشکلاتی در نسخه 3.1 فایرفاکس استاندارد جدیدی با نام web workers و یا به فارسی “کارگر وب” پیاده سازی شده است. این کارگر وب یکی از استاندارد های نهایی نشده کارگزار استانداردهای وب یا WhatWG است که در حال تکمیل موارد آن هستند.
کار اصلی کارگر وب انجام عملیات و دستورات طولانی در یک thread (به فارسی رشته) جداگانه است تا صفحه اصلی بتواند به طور همزمان و بدون قفل شدن به کار خود ادامه بدهد.
به طبع جدا بودن threadهای اصلی و کارگر وب سبب ایجاد تعدادی محدودیت می شود که برای جلوگیری از مشکلات هستند. یک محدودیت اساسی ارتباط داشتن دو thread با هم از طریق پیغام ها است.
همچنین امکان دسترسی و دستکاری اشیاء DOM وجود ندارد (منظور از DOM سرنام عبارت Dodcument Object Model که همان عناصر صفحه است).
و البته امکان استفاده از AJAX یا شیئ XMLHttpRequest وجود دارد.

  • تعدادی از ویژگیهای Web Workers

دسترسی به شیئ navigator در درون کارگر وب که امکان شناسایی مرورگر را می دهد. ویژگی های appName، appVersion، platform و userAgent قابل استفاده هستند.
امکان خاتمه دادن کار کارگر وب با استفاده از دستور terminate .
اسکریپتهای کارگر وب باید در یک فایل جداگانه و در مسیر یکسان از محل اجرای صفحه قرار داشته باشند.
امکان کنترل خطاهای رخ داده در درون کارگر وب با استفاده از رویداد onerror . در درون این رویداد با استفاده از ویژگی preventDefault  میتوان از خطای رخ داده چشم پوشی کرد.
امکان ارسال اعداد، boolean و اشیاء وجود دارد. تنها محدودیت در این زمینه عدم امکان استفاده از توابع و اشیاء ارجاع داده شده به DOM است.

  • نمونه پیاده سازی

در اینجاها نمونه پیاده سازی شده کامل وجود دارد
http://people.mozilla.com/~bturner/weaveworker/weaveDecryptor.html
https://wiki.mozilla.org/DOMWorkerThreads_current

ابتدا باید آخرین نسخه از Firefox را دریافت کنید. در حال حاظر Firefox 3.1 Beta 3 برای دانلود موجود است. لینک دریافت. (نسخه فارسی نیز موجود است)

در صفحه خود باید یک نمونه از شیئ Worker ایجاد کنید. مانند کد زیر:

var webworker = new Worker("workerScript.js");

در این کد به سازنده کلاس اسکریپت workerScript.js ارسال می شود. سپس برای اینکه بتوانیم پیغام ارسالی توسط کارگر را دریافت کنیم باید رویداد onmessage را پیاده سازی کنیم:

webworker.onmessage = function(event) {
	document.getElementById("result").textContent = event.data;
};

این کد در thread اصلی صفحه اجرا خواهد شد پس امکان تغییر اطلاعات DOM وجود دارد. در اینجا فیلدی با نام result تغییر خواهد کرد.
در صورت تمایل می توان OnError را هم برای دریافت خطاهای احتمالی پیاده سازی کرد:

webworker.onerror = function(event) {
	document.getElementById("result").textContent = "Worker error: " + event.data + "n";
};

پیاده سازی فایل اسکریپت workerScript.js
این فایل که در thread جداگانه ای اجرا خواهد شد باید حداقل دارای یک پیاده سازی ار رویداد onmessage باشد تا بتواند کار مورد نظر را درون خود انجام دهد.

onmessage = function(event) {
  var n = parseInt(event.data);

  if (n == 0 || n == 1) {
    postMessage('Hello');
    return;
  }
}

توجه کنید که تعریف رویداد onmessage مستقیما بوده است. این رویداد پس از اجرای postMessage در thread اصلی اجرا خواهد شد. در این رویداد مقدار ورودی آن را بررسی می کنیم و در صورت برقرار بودن شرط پیغامی به صفحه ارسال می شود.

هم اکنون می توان به کارگر وب دستور اجرا را صادر کرد. برای این منظور باید از متد postMessage استفاده کنید. پس از اولین postMessage ارسالی کارگر وب شروع به کار کرده و اجرا می شود.
توجه کنید که این کد را باید در صفحه بنویسید و نه در فایل اسکریپت.
worker.postMessage(10);

منابع
https://developer.mozilla.org/web-tech/2008/09/04/web-workers-part-1/
https://developer.mozilla.org/web-tech/2008/12/04/web-workers-part-2/
https://developer.mozilla.org/web-tech/2009/01/05/web-workers-part-3/
https://wiki.mozilla.org/DOMWorkerThreads
https://wiki.mozilla.org/DOMWorkerThreads_current
http://www.whatwg.org/specs/web-workers/current-work/
http://ajaxian.com/archives/web-workers-update-for-firefox-31





ریستارت کردن سایت ASP.NET

13 02 2009

در وبسایت های پر بازدید پیش میاد که به دلایل مختلفی مانند توسعه و یا تست قسمتی از سایت، یا سنگین شدن سایت به علت استفاده نادرست از رم و یا حملات احتمالی که ممکن است باعث سنگین شدن سایت بشود، نیاز به راه اندازی وبسایت پیش بیاد.
البته در مورد حملات این کار می تواند موفقتا مشکل را حل کند تا فرصت کافی برای راه حل اساسی پیدا کنید.
راه اندازی مجدد یا Restart باعث خواهد شد که تمامی محتویات کش، محتویات session و حافظه پاک شده و وبسایت بسته شود تا در درخواست بعدی به طور خودکار مجددا اجرا شود.

در ASP.NET یک متد اصلی برای این کار طراحی شده است و یک متد دیگر هم وجود دارد که این کار را انجام میدهد.

متد اول:

HttpRuntime.UnloadAppDomain()

این متد باعث پایان یافتن سایت می شود و تا رسیدن درخواست بعدی سایت مجددا اجرا نخواهد شد. نکته مهمی که در استفاده از این تابع است، فراخوانی رویداد Application_End در Global.asax است که به شما اجازه میده کارهای نهایی برای آزاد سازی حافظه را انجام بدید. مزیت اصلی این تابع طی کامل مراحل و عملیات آزاد سازی حافظه و پایان کار سایت است.

متد دوم:

HttpRuntime.Close()

این متد نیز همانند متد قبلی باعث پایان کار سایت خواهد شد و سایت در درخواست بعدی مجددا اجرا خواهد شد. نکته مهم در استفاده این تابع عدم فراخوانی رویداد Application_End هست. در حقیقت این تابع سایت را به یکباره متوقف می کند که هیچیک از مراحل پایان کار سایت اجرا نخواهند شد و می تواند برای مواقع اضطراری مناسب باشد.

نکته ای که در مورد HttpRuntime.Close هست این است که در حقیقت این مدت برای پاک کردن کش سایت طراحی شده، ولی ظاهرا این کار را با بستن سایت انجام می دهد که البته نتایجی مانند Restart کردن دارد! همانطور که گفته شد تفاوت عمده این مدت در این است مراحل بسته سایت به ترتیب انجام نشده و سایت به یکباره متوقف خواهد شد تا در خواست بعدی مجددا اجرا شود.

سعی کنید در قسمت مدیریت سایت خود صفحه ای را برای فراخوانی این دو مدت طراحی کنید.





SyntaxHighlighter با طعم JQuery

29 01 2009
SyntaxHighlighter JQuery

اگه تا حالا از اسکریپت SyntaxHighlighter استفاده کرده باشین میدونین که با استفاده از این اسکریپت می شه کدها یا همون Code Snipped ها را رنگی و فرمت کرد.
برای استفاده از این اسکریپت در حالت عادی لازم است که علاوه بر موتور اصلی این اسکریپت (shCore.js) اسکرپیت مخصوص زبان استفاده شده در کدتون رو هم اضافه کنید. برای مثال برای سی شارپ shBrushCSharp.js

مشکلی که با این روش وجود داره اینه که ممکنه که نتونید این کار رو با هر پست در وبلاگ و یا هر صفحه در سایتتون انجام بدین، چون ممکنه که چندین زبان در صفحات مختلف استفاده شده باشه و تشخیص زبان و افزودن اسکریپت مخصوص آن به راحتی ممکن نباشه.
در این حالت اکثر سایتها تمامی زبانهایی رو که احتمال می دن در سایت یا وبلاگ استفاده شده باشه رو اضافه می کنند.
این کار علاوه بر اینکه حجم و زمان بالا اومدن رو افزایش میده باعث افزایش تعداد درخواست های غیر ضروری به سرور شده و آن را بی جهت مشغول می کنه.

در زیر اسکریپتی رو که با استفاده از JQuery نوشته ام اگر در صفحه خود استفاده کنید علاوه بر کاهش تعداد درخواست ها به سرور و کاهش حجم دریافتی، اعمال SyntaxHighlighter به صورت خودکار خواهد بود و نیازی به درج هیچ کد اضافه ای نخواهید داشت. این امکان هم هست که اگر در صفحه هیچ کدی(منظور code snipped) وجود نداشته باشد هیچ کدام از اسکریپتهای SyntaxHighlighter استفاده نشود.
پس برای استفاده، به جای لینک مستقیم به SyntaxHighlighter باید از اسکریپت زیر استفاده کنید:

// Coded by Salar Khalilzadeh 2009-01-29
// http://salarblog.wordpress.com/

if($){
// SyntaxHighlighter scripts path
var BrushBasePath='http://www.YourSite.com/SyntaxHighlighter/scripts/';

// SyntaxHighlighter style sheet
var StyleFilePath='http://www.YourSite.com/SyntaxHighlighter/styles/SyntaxHighlighter.css';
var BrushFileName='shBrushXXX.js';
var BrushCoreFile='shCore.js';
var BrushAliases=[
	['xml','xml'], ['xhtml','xml'], ['xslt','xml'], ['html','xml'] , ['xhtml','xml'],
	['vb','vb'], ['vb.net','vb'],
	['sql','sql'],
	//['asm','asm'], uncomment if you have assmbly brush
	['ruby','ruby'], ['rails','ruby'], ['ror','ruby'],
	['py','python'], ['python','python'],
	['php','php'],
	['js','jscript'], ['jscript','jscript'], ['javascript','jscript'],
	['java','java'],
	['delphi','delphi'], ['pascal','delphi']
];

var codeTags=$('pre,code');
var matchedElements=[];
codeTags.each(function(){
	var $item = $(this);
	var href = $item.attr("href");
	var i;
	for(i=0;i<BrushAliases.length;i++){
		var attr=$item.attr("class");
		if(attr.indexOf(BrushAliases[i][0])!=-1 && matchedElements[BrushAliases[i][1]]==null){
			matchedElements.push(BrushAliases[i][1]);
		}
	}
})

// Highlighter core, if there is any language
if(matchedElements.length>0){
	document.write("<link rel='stylesheet' type='text/css' href='"+StyleFilePath+"' />");
	var jsCore=BrushBasePath+BrushCoreFile;
	document.write(unescape("%3Cscript%20type%3D%27text/javascript%27%20src%3D%27")+ jsCore + unescape("%27%3E%3C/script%3E"));
}

// Brushes
for(i=0;i<matchedElements.length;i++){
	var jsSrc=BrushFileName.replace('XXX',matchedElements[i]);
	jsSrc=BrushBasePath+jsSrc;
	document.write(unescape("%3Cscript%20type%3D%27text/javascript%27%20src%3D%27")+ jsSrc + unescape("%27%3E%3C/script%3E"));
}}

نحوه استفاده: این کد رو در حتما در آخر صفحه درج کنید. علت این کار رو در ادامه توضیح می دم.
در این کد در مقدار BrushBasePath آدرس محل brush های SyntaxHighlighter خواهد بود که با توجه به اینکه آن ها را در کجای وبسایت خود قرار داده اید باید آن را مسیر دهی کنید.
StyleFilePath آدرس فایل CSS مورد استفاده SyntaxHighlighter است.

شیوه کار این کد به این صورت هست که با استفاده از لیست زبانهای قابل استفاده، در تگ های pre به جستجو می پردازد و در صورت یافتن، اسکریپت مربوط به آن زبان را به صفحه اضافه می کند.
تنها نکته مهمی که وجود داره عدم استفاده از $(document).ready() مربوط به JQuery هست. به این علت که این تکه کد مقداری اسکریپت در صفحه درج می کند و زمان وقوع رویداد ready کد html کامل دریافت شده است و درج مجدد یک اسکریپت جدید باعث refresh شده صفحه و از دست رفتن ظاهر اون میشه.

موفق باشید





تنظیم Http Proxy در CVS

25 01 2009

برای دریافت تعدادی کد نیاز داشتم تا از سرویس CVS (مخفف Concurrent Versions System) استفاده کنم و کدها رو که هاست شده بود دریافت کنم.

مشکل زمانی پیش اومد که ساختار اینترنت شرکت ما از یه Http Proxy برای دسترسی کاربران استفاده می کنه و تنظیم خاصی برای عبور از این proxy برای ابزار cvs پیدا نکردم. البته می تونستم از طریق سرور کد ها رو دریافت کنم، ولی این خلاف منطق به نظر می رسید که امکان تنظیم چنین ویژگی پیش پا افتاده ای رو نگذاشته باشند.

پس از جستجوی فراوان تعدادی پارامتر رو پیدا کردم کردم که امکان تنظیم این ویژگی ها رو می ده. جالبه بدونید که در هیچ یک از رفرنس های اصلی این ابزار که مشاهده کردم در مورد این پارامتر ها حرفی گفته نشده بود!! یک منبعی که پیدا کردم لیست پستی هست:

http://www.cvsnt.org/pipermail/cvsnt/2005-November/022467.html

برای رفع این مشکل از پارامتر های زیر می توانید استفاده کنید:

  • proxy: آدرس پراکـسـی سرور خواهد بود. برای مثال 192.168.0.1
  • proxyport: آدرس پورت پراکـسـی سرور خواهد یود. برای مثال 8080
  • proxyuser: نام کاربری برای لاگین شدن به پراکـسـی سرور هست که اختیاری است. یعنی در صورتی که پراکـسـی سرور شما نیاز به تایید هویت داره باید از ان پارامتر استفاده کنید.
  • proxypassword: کلمه عبور برای لاگین شدن به پراکسی سرور که اختیاری است.

توجه کنید موارد فوق فقط بر روی سرور هایی که از pserver استفاده می کنند کار خواهد کرد. pserver مخفف password server هست که دسترسی را از طریق کلمه عبور و رمز را امکان پذیر می کند.

یه نمونه از خط فرمانی که از موارد فوق استفاده می کند:

cvs -d :pserver;proxy=192.168.0.3;proxyport=6000:guest@test.com:/cvs

برای TortoiseCVS

در صورتی که از برنامه TortoiseCVS استفاده می کنید در قسمت “Protocol parameters” هست که باید موارد فوق را وارد کنید.

اگر مثال فوق رو بخواهیم از طریق TortoiseCVS انجام بدیم باید در فیلدی که گفتم مقدار زیر رو قرار بدید:

proxy=192.168.0.3;proxyport=6000

تصویر زیر این مورد رو نشان می ده.

TortoiseCVS




محاسبه تعداد کاربران آنلاین در ASP.NET

3 01 2009

محاسبه کاربران آنلاین در سایت یکی از مسائل مهم در آمار گیری آن هست که برای انجام آن راه های مختلفی وجود دارد. برخی سایت ها وجود دارند که چنین سرویس هایی را برای سایتها عرضه می کنند و برخی سیستم های آمار گیری وجود دارند که می توانید آن ها را خریداری کرده و یا به طور رایگان استفاده کنید.

در ASP.NET نیز چندین روش وجود دارد که یکی از آنها استفاده از رویدادهای Session است. در استفاده از شیئ Session در حالت عادی چندین مشکل مانند TimeOut وجود دارد که باعث عدم کارایی این روش می شود.

ابزار OnlineActiveUsers را به عنوان راه حلی ساده برای این مشکلات نوشتم تا به راحتی امکان آمار گیری از کاربران آنلاین سایت وجود داشته باشد.

  • توضیحی مختصر درباره OnlineActiveUsers

این ابزار از رویدادهای شیئ Session به نحوی متفاوت استفاده می کند، به گونه ای که مشکلات استفاده از آن مرتفع شده و روشی مطمئن برخوردار خواهید بود.

در صورتی که نیاز دارید تفکیکی بر کاربران عضو در سایت و کاربران میهمان داشته باشید، این ابزار این کار را برای شما می تواند انجام دهد و تنها کافی است تا فراخوانی های مورد نیاز انجام شود.

این ابزار را کاملا تست شده نوشته ام و هم اکنون بر روی سایت خودم نصب هست.

اگر نظرات و پیشنهادی در مورد توسعه این ابزار دارید خوشحال می شوم

* مطالب مرتبط

بررسی فعال بودن Javascript در ASP.NET

راهنمای کامل توابع JQuery و MooTools به صورت CHM