بایگانی مرداد, ۱۳۸۸

جستجوی تصاویر فلیکر بر اساس رنگ

مرداد ۳۱م, ۱۳۸۸

امروز به سایت Multicolr Search برخوردم که قابلیت جستجو تصاویر فلیکر بر اساس رنگ را فراهم می‌کند.

Multicolr Search

در این سایت با انتخاب رنگ یا رنگ‌های مورد نظر خود می‌توانید تصاویری در فلیکر که تم رنگی مورد نظر شما را دارند پیدا کنید.

جستجوی تصاویر فلیکر بر اساس رنگ

عملکرد این سایت مشابه قابلیت جدید جستجوی تصویر بر اساس رنگ در گوگل است با این تفاوت که Multicolr Search رنگ‌های ۱۰ میلیون تصویر جالب در فلیکر را استخراج کرده است. عملکرد Multicolr Search بسیار خوب و دقیق است. اگر به دنبال پیدا کردن عکس‌های مناسب و هماهنگ با رنگ‌بندی سایت خود هستید Multicolr Search برای شماست.

۷ نکته برای نوشتن stored procedure های بهتر

مرداد ۲۹م, ۱۳۸۸

 

۱-نام stored precedure ها را با sp_ شروع نکنید. sp های سیستمی در SQL Server با sp_ شروع می‌شوند. وقتی شما هم از چنین نام‌گذاری استفاده کنید SQL Server برای اجرای sp ابتدا بین sp های سیستمی خودش می‌گردد. البته این تنها مشکل نیست، اگر sp شما که نامش با پیشوند sp_ آغاز شده مشابهی در دیتابیس master داشته باشد، sp شما هیچ وقت اجرا نخواهد شد!

Stored Procedure

۲-از عبارت SET NONCOUNT ON استفاده کنید تا پس از هر اجرای sp‌ از نمایش پیامی که تعداد ردیف‌های تحت تاثیر اجرا (rows affacted) را نشان می‌دهد جلوگیری شود.

۳-sp ها را با نام کاملشان فراخوانی کنید. نام کامل هر شیء از ۴ قسمت تشکیل شده: نام سرور، نام دیتابیس، نام مالک (owner)، نام شیء. فراخوانی sp ها با نام کامل باعث افزایش کارآیی به خاطر بیشتر شدن احتمال استفاده مجدد از execution plan مربوط به sp‌ می‌شود.

۴-از عبارت return برای بازگرداندن مقادیر عددی استفاده کنید. برنامه‌نویسان از عبارت return‌ معمولاً برای چک کردن خطاها استفاده می‌کنند، اگر در یک کوئری نیاز به برگرداندن مقداری عددی دارید به جای آنکه آن را با select و در قالب record set به برنامه برگردانید از عبارت return استفاده کنید.

۵-از sp_executesql به جای EXECUTION استفاده کنید. با استفاده از sp_executesql می‌توانید از پارامترها استفاده کنید و البته این کار باعث امکان استفاده مجدد از execution plan و در نتیجه بهترشدن کارآیی و سرعت می‌شود، چرا که در اجرای مجدد sp_executesql برای یک کوئری ثابت تنها متغیرها مقادیر پارامترهای آن کوئری هستند.

۶-از به کار بردن جداول موقت در stored procedure خودداری کنید. این یکی از مواردی است که تفاوت سرعت و کارآیی را در آن (در تعداد رکورد زیاد) شخصاً تست کردم. جداول موقت (temporary tables) واقعاً سرعت کار را پایین می‌‌آورند.

۷-از SQL Server Profiler استفاده کنید تا sp هایی که بیشتر recompile شده‌اند را شناسایی کنید، سپس کد این sp‌ ها را برای جلوگیری از کامپایل مجدد بهینه کنید.

مشکل جستجو و محتوای کم ارزش وب ۲

مرداد ۲۷م, ۱۳۸۸

چند روز پیش در خبرها خواندم که همسر اوان ویلیامز (از موسسان توییتر) حتی موقع زایمان هم دست از توییت کردن برنداشته و لحظه به لحظه اخبار را توییت می‌کرده است.

یکی از توییتهای سارا در بیمارستان

صرفنظر از اینکه توییت کردن موقع زایمان (که سلامتی مادر و فرزند مهمتر از همه چیز است) تا چه اندازه لازم است، یک بار دیگر به نقشی که سرویس‌های وب ۲ در تولید محتوای کم ارزش و مشکلی که در جستجوی عمقی وب ایجاد می‌کنند فکر کردم.

ما امروز چطور جستجو می‌کنیم؟
به گوگل یا یک موتور جستجو دیگر می‌رویم، یک باکس جستجو، چند کلمه کلیدی وارد می‌کنیم (گاهی وقت‌ها به همراه چند عملگر جستجو)، در صفحه اول جستجو چیزی را که می‌خواهیم پیدا می‌کنیم یا نه، به هر حال جستجوی ما محصور به ارزیابی خودمان از محتوای چند کلمه‌ای است به صورت لینک‌های آبی زیرخط دار در صفحه نتایج جستجو می‌بینیم.

روش کار؟ گوگل و موتور جستجوهای دیگر عملاً چیزی را در بیرون جستجو نمی‌کنند. آن‌ها یک کپی از اطلاعات را در دیتابیس خود ذخیره می‌کنند و بعد به کمک الگوریتم‌های خاص خودشان در آن جستجو می‌کنند. برای همین است که همیشه می‌توانید در کش گوگل صفحات و وب سایت‌هایی پیدا کنید که دیگر وجود خارجی ندارند.

وب ۲: مشارکت کاربران در تولید محتوا
پیش از اینکه واقعاً سرویس‌های وب ۲ از مشارکت کاربران و share کردن اطلاعات بهره ببرند، وبلاگ‌‌ها و وبلاگ‌نویسان باعث گسترش محتوای آنلاین شدند.
با به وجود آمدن امکان مشارکت کاربران در تولید محتوا، از روش‌هایی مثل برچسب‌زنی و ارزشیابی (به کمک رای در سیستم‌هایی نظیر دیگ و بالاترین) برای پیدا کردن و نشانه‌گذاری محتوای مفید استفاده شد. اما این روش نیز به تدریج کارآیی خود را از دست می‌دهد. حجم اطلاعات به شدت در حال افزایش است و استفاده از روش‌های بازنشری تنها به کپی شدن (شامل کپی شدن خود اطلاعات یا نسخه تغییر یافته یا لینک اطلاعات) بیشتر و بیهوده منتهی می‌شود. این نسخه‌های کپی شده از اطلاعات روی وب تنها جستجوی عمقی در وب را مشکل‌تر می‌کند. نه موتور جستجوهای سنتی (با روش خزیدن و ایندکس کردن اطلاعات) و نه روش‌های جدید (تگ گذاری و نشانه‌دار کردن اطلاعات مفید) جوابگوی این حجم از اطلاعات نخواهند بود.

یک مثال: Twitter و محتوای بی ارزش
Twitter یک رسانه است. یک رسانه جدید برای رساندن صدای مردم. اما نزدیک نیمی از توییت‌های مردم بی‌اهمیت و بی‌ارزش هستند. در چنین شرایطی فکر می‌کنید پیدا کردن صدای واقعی مردم در میان انبوه توییت‌های بی‌ارزش و اسپم چقدر مشکل است؟ به موضوعات داغی که عموماً با تگ گذاری توییت‌ها (با استفاده از #) در سطح توییتر ایجاد می‌شوند دقت کنید، بعد از چند ساعت خیلی از توییت‌های کاملاً بی‌ربط با موضوع اما با تگ یک موضوع داغ را می‌توانید ببینید.
حالا اگر به دنبال چیزی باشید با این حجم از اطلاعات بی‌ارزش و اسپم فکر می‌کنید شانس موفقیت‌ چقدر است؟ این مشکل تنها در مورد متن نیست، امروز ما عکس و ویدئو و صدا را هم با روش‌ سنتی (جستجوی کلمات کلیدی یا برچسب و عنوان و …) پیدا می‌کنیم.

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

ادامه دارد…

پرسش‌های متداول درباره ASP.NET Membership

مرداد ۲۱م, ۱۳۸۸

توضیح: این یادداشت به تدریج تکمیل و به روز خواهد شد، لطفاً اگر سوال یا ابهامی در مورد نحوه کار با ASP.NET Membership داشتید کامنت بگذارید.

اغلب کسانی به تازگی با ASP.NET آشنا می‌شوند در استفاده از امکانات membership سوالات و مشکلاتی دارند که در این نوشته به برخی از آن‌ها نگاهی می‌اندازیم.

حذف ASPNETDB
به صورت پیش فرض وقتی شما از یکی از کنترل‌های مربوط به ASP.NET Membership مثلاً CreateUserWizard استفاده می‌کنید یک دیتابیس به نام ASPNETDB در پوشه App_Data ساخته می‌شود.
اگر می‌خواهید از دیتابیسی که خودتان ساخته‌اید برای کار با ASP.NET Membership استفاده کنید باید کارهای زیر را انجام بدهید:

۱-commnad prompt ویژوال استودیو را اجرا کنید و در آن دستور aspnet_regsql را بنویسید، در پنجره‌ای که باز می‌شود دیتابیسی که می‌خواهید از membership در آن استفاده کنید را مشخص کنید تا جداول و دیگر موارد مربوط به membership به آن اضافه شود. توضیحات بیشتر…

۲-یک Connection String در web.config خودتان برای دیتابیسی که ساخته‌اید ایجاد کنید.

<connectionStrings>
   <add name="MyConnection"   
   connectionString="Your_Connection_string"
   providerName="System.Data.SqlClient" />
</connectionStrings>

3-حالا باید به اجزای مختلف ASP.NET Membership بگویید که با استفاده از connection string ای که در مرحله قبل ساختید به دیتابیس شما متصل شوند. به عنوان مثال:

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
   <providers>
      <add name="SqlProvider"
       type="System.Web.Security.SqlMembershipProvider"
       connectionStringName="MyConnection" applicationName="/"/>
   </providers>
</membership>

این کار را می‌توانید برای دیگر اجزای membership‌ مثل rolemanager و profile هم انجام دهید.

پیدا کردن UserId

فرض کنید در وب سایت یا برنامه‌ای که در حال پیاده‌سازی آن هستید رابطه (relation) بین جداول ساخته شده توسط شما و جداول asp.net membership وجود دارد. معمولاً این رابطه با جدول aspnet_Users و با فیلد UserId است. حالا در برنامه‌تان باید به شکلی UserId را پیدا کنید. تابع زیر با گرفتن یک username به عنوان پارامتر userId آن کاربر را به شکل رشته برمی‌گرداند:

public string GetUserId(string userName)
{
  MembershipUser myObject = Membership.GetUser(userName);
  string UserID = myObject.ProviderUserKey.ToString();
  return UserID;
}

حذف Security Quesion‌ و Security Answer

حذف Security Question و Security Answer و همچنین تغییر قانون مربوط به کلمه عبور نیز از جمله سوالات متداول مربوط به ASP.NET Membership است. این کار را می‌توانید از طریق ویرایش provider ای که برای membership‌ در web.config تعریف کرده‌اید انجام دهید:

<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20">
 <providers>
   <add name="SqlProvider"
    type="System.Web.Security.SqlMembershipProvider"
    connectionStringName="MyConnection"
    minRequiredPasswordLength="5"
    minRequiredNonalphanumericCharacters="0"
    requiresQuestionAndAnswer="false"
    applicationName="/"/>
 </providers>
</membership>

در مثال بالا membership برای کلمات عبوری با حداقل طول ۵ کاراکتر و بدون نیاز به کاراکترهای غیرحرف و عددی و همین‌طور برای عدم استفاده از Security Question و Security Answer تنظیم شده است.

ویرایش پروفایل کاربران دیگر

ویرایش پروفایل کاربر جاری به راحتی امکان پذیر است، اما برای ویرایش پروفایل دیگر کاربران می‌توانید از تابع زیر استفاده کنید. قبل از هر چیز فرض می‌کنیم دو property تحت عنوان‌های Name و Family به پروفایل در web.config اضافه کرده‌ایم:

<profile automaticSaveEnabled="false" enabled="true">
  <properties>
    <add name="Name"/>
    <add name="Family"/>
  </properties>
</profile>

تابع زیر username کاربر را به عنوان ورودی گرفته و تغییرات داده شده روی نام و نام خانوادگی کاربر(که قبلاً در web.config تعریف شده‌اند) را در پروفایل کاربر ثبت می‌کند، شما می‌توانید این تابع را با توجه به نیاز خود و فیلدهای پروفایلی که تعریف کرده‌اید سفارشی کنید:

private void UpdateProfile(string userName)
{
   ProfileCommon userProfile = Profile.GetProfile(userName);
   userProfile.Name = txtName.Text;
   userProfile.Family = txtFamily.Text;
   userProfile.Save();
}

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

private void Register()
{
 //Add User
 MembershipUser newUser =
  Membership.CreateUser(txtUsername.Text, txtPassword.Text, txtEmail.Text);
 Membership.UpdateUser(newUser);
 //Add Name and Family
 ProfileCommon userProfile = Profile.GetProfile(txtUsername.Text);
 userProfile.Name = txtName.Text;
 userProfile.Family = txtFamily.Text;
 userProfile.Save();
}

We Follow

مرداد ۱۹م, ۱۳۸۸

We Follow یک دایرکتوری از کاربران twitter در زمینه‌های مختلف است. 
دنبال توییت‌های بریتنی اسپیرز می‌گردید، شاید بخواهید بدانید گروه coldplay چه می‌کنند یا از حال و احوال این روزهای ال گور اطلاع پیدا کنید. شاید هم بخواهید اکانت توییتر فعالین یک حوزه خاص مثلاً دات نت را پیدا کنید. We Follow برای همین کار است.

We Follow: Twitter Directory

می‌توانید خودتان هم در We Follow عضو شوید. هنگام عضویت می‌توانید سه تگ که اکانت توییتر شما به آن‌ها مربوط است را انتخاب کنید. به این ترتیب ضمن تگ شدن، می‌توانید افرادی که در توییتر به حوزه کاری شما نزدیک هستند را پیدا کنید و جایگاه‌تان را بین آن‌ها ببینید.

پروژه ناتال، تحقق یک رویا

مرداد ۱۷م, ۱۳۸۸

در نمایشگاه E3 امسال مایکروسافت از پروژه‌ای برای کنسول Xbox خود به نام ناتال(Project Natal) خبر داد. ناتال شما را از گیم‌پد بی‌نیاز می‌کند، در واقع در ناتال با تشخیص حرکات و چهره و صدای افراد قابلیت تعامل کاملاً طبیعی با بازی‌ها را فراهم می‌کند.

Project Natal

در دموهایی که از ناتال ارائه شده، شما می‌بینید که کنسول با دیدن چهره افراد قادر به احراز هویت آنان است و افراد با قرار گرفتن در معرض سنسورهای ناتال به راحتی می‌توانند Sign in‌ کنند. البته توانایی‌های ناتال چیزی بیشتر از پردازش تصویر چهره‌هاست.

شما در ناتال، برای بازی نیاز به هیچ دسته بازی ندارید، سنسورهای ناتال حرکات شما را تشخیص داده و بر اساس آن اکشن مناسب را انجام می‌دهند، مثلاً برای راندن ماشین، فقط کافی است که دست‌هایتان را در هوا به گونه‌ای نگه دارید که انگار فرمان ماشین را در دست دارید و بعد ماشین را به همین روش برانید!

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

یکی از دلایلی که مایکروسافت و سونی به کار در حوزه کنترلرهای حرکتی بازی علاقمند کرده است موفقیت کنسول wii‌ نینتندو و اقبال کاربران به بازی‌های wii‌ بوده است.

مزیت فناوری ناتال نسبت به رقبای خود در سونی(Motion Controller) و نینتندو (MotionPlus) این است که فناوری مایکروسافت تنها به صنعت بازی‌های رایانه‌ای محدود نمی‌شود، در واقع پس از نهایی شدن کار ناتال، این فناوری لااقل در تئوری قابلیت استفاده در همه جا را دارد. این در حالی است که کنسول‌های رقیب که برای چنین قابلیتی (تشخیص حرکات) دسته‌های مخصوص به خود را دارند امکان تعامل به این شیوه را تنها در محیط‌های سرگرمی به کاربر می‌دهند.

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

Natal Project

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

مرتبط:
+ سایت پروژه ناتال
+ کانال یوتیوب پروژه ناتال
+ پروژه ناتال در ویکی‌پدیا فارسی (به تکمیل اطلاعات در ویکی‌پدیا فارسی کمک کنید)