بایگانی ‘برنامه نویسی’ دسته

آنلاین برنامه‌نویسی کنید

تیر ۲۶م, ۱۳۸۹

قبلاً در نوشته‌ای درباره محاسبات ابری گفته بودم:

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

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

CodeRunحالا که قرار است پردازش برنامه‌های کامپیوتری روی اینترنت باشد چرا برنامه‌نویسی روی اینترنت نباشد؟ خب این ایده ما رو به IDE های آنلاین می‌رسونه: سایت‌هایی که می‌توانید به کمکشون آنلاین برنامه نویسی کنید، برنامه‌هاتون رو کامپایل و دیباگ و تست کنید و بالاخره اون‌ها رو برای اجرا با دیگران به اشتراک بگذارید.

یکی از سایت‌های جالبی که توی این حوزه بهش برخورد کردم سایت CodeRun هستش. به کمک این سایت می‌توانید پروژه‌هایی با زبان‌های  C#.NET‌ و PHP و JavaScript ایجاد کنید. محیط سایت بسیار شبیه محیط IDE های برنامه‌نویسی نظیر Visual Studio هستش و شما امکان watch کردن متغیرها و دیباگ رو هم دارید، ساختار Solution و Project ها درست مثل ویژوال استودیو هست و قابلیت‌هایی نظیر Syntax Highlight و Intellisense به خوانایی و راحتی کدنویسی کمک می‌کنه.نمونه دیگه‌ای از این سایت‌ها kodingen هستش که اون هم امکان توسعه نرم‌افزاری ابری (Cloud Software Development) رو میده. 

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

ایده‌های توییتری خود را قبل از اجرا تست کنید

اردیبهشت ۱۳م, ۱۳۸۹

twitterconsole هنگامی که کتاب توییتر را پیاده‌سازی می‌کردم برای تست بعضی حالت‌ها در فراخوانی API توییتر مجبور بودم برنامه را تغییر بدهم و مجدداً کامپایل و منتشر کنم. کمی بعد متوجه وجود سایت hurl شدم که کارش ایجاد HTTP Request است. به کمک این سایت به راحتی می‌توانید با ارسال درخواست HTTP و در صورت نیاز ست کردن header خروجی را در قالب مورد نظر (مثلاً json) بسته به آدرس درخواستی ببینید.

بخش توسعه دهندگان توییتر هم با الهام گرفتن از hurl اقدام به ایجاد کنسول API کرده است. در بخش کنسول می‌توانید توابع مختلف API توییتر را تست کنید و نتیجه درخواست خود را ببینید. اگر می‌خواهید برنامه‌ای مبتنی بر قابلیت‌های توییتر بنویسید یا ایده‌ای برای استفاده از توییتر در کسب و کار خود دارید، قبل از شروع می‌توانید از امکانات بخش کنسول API توییتر بهره بگیرید تا دید بهتری نسبت به ساختار برنامه و خروجی آن داشته باشید. برای استفاده از امکانات این بخش ابتدا باید اپلیکیشنی را ثبت کنید که به سادگی از طریق این فرم امکان‌پذیر است.

داستان Stack Overflow

آبان ۲۸م, ۱۳۸۸

لوگوی سایت از مفهوم نامش بهره میگیرد اگر در دنیای برنامه نویسی باشید حتماً نام سایت Stack Overflow را شنیده‌اید. Stack Overflow یک سایت پرسش و پاسخ برای برنامه نویسان است، اما نه یک سایت معمولی.

چیزی فراتر از انجمن‌های گفت‌وگو

شاید نخستین سوالی که در مورد سایت‌های پرسش و پاسخ به ذهن می‌رسد فرق آن‌ها با انجمن‌های گفت‌وگو (forum) ها باشد. در انجمن‌های گفت‌و‌گو  هم کاربران عضو می‌توانند سوالات خود را مطرح کنند و پاسخ کاربران دیگر را ببینند. اما ساختار سایت‌های پرسش و پاسخ کمی متفاوت است. در این سایت‌ها مباحث تنها پیرامون دو نوع محتوای پرسش و پاسخ شکل می‌گیرند. در واقع هدف در چنین سایت‌هایی فقط پرسش و پاسخ است، اگر شما می‌خواهید در مورد سوال مطرح شده از طرف یک کاربر صحبت کنید ولی حرف شما جوابی برای سوال نیست، می‌توانید آن را در قالب کامنت مطرح کنید. بنابراین معمولاً در سایت‌های پرسش و پاسخ خیلی سریعتر از انجمن‌ها به نتیجه می‌رسید. البته Stack Overflow و سایت‌های مشابه روش‌های بهتری هم برای پیدا کردن جواب سوالات دارند:

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

برای درک بهتر ساختار Stack Overflow شکل زیر را ببینید. StackOverflow در واقع نقطه اشتراک سیستم‌های مختلف است:

StackOverflow

    بدون ثبت نام عضو شوید!

یکی از اولین مسائلی که در برخورد با Stack Overflow‌ پیش می‌آید این است که: بسیار خب، این سایت مفیدی هست، اما چطوری می‌تونم ثبت نام کنم؟ پاسخ این است که شما همین الان عضو هستید و نیازی به ثبت نام ندارید! در واقع Stack Overflow‌ از OpenID پشتیبانی می‌کند بنابراین اگر شما اکانتی در گوگل، یاهو، وردپرس یا دیگر تامین کنندگان OpenID داشته باشید در واقع عضو Stack Overflow هم هستید. کافی است Login‌ کنید.

نشان‌ها، مدال‌های افتخار شما

یکی از دلایلی که کاربران را به استفاده و مشارکت در Stack Overflow‌ مشتاق می‌کند، نشان‌ها یا Badge‌هایی است که سایت به آن‌ها می‌دهد. این نشان‌ها تنها بر اساس میزان مشارکت نیستند، مثلاً اگر سوالی بپرسید که جواب و کامنت و مشاهده کمی برای یک هفته داشته باشد نشان Tumbleweed را دریافت می‌کنید! نشان‌های Stack Overflow‌ که در سه دسته کلی طلایی، نقره‌ای و برنزی دسته‌بندی شده‌اند در واقع مدال‌های کاربران هستند و به میزان شهرت کاربر کمک می‌کنند. شهرتی که دیگر کاربران می‌توانند روند آن را به صورت یک نمودار در پروفایل هر کاربر ببینند.

خانواده Stack Overflow

Stack Overflow تنها یک سایت نیست، سایت‌های دیگری نیز که به سایت‌های خواهر معروفند با همین ایده شکل گرفته‌اند، از جمله این سایت‌ها به Server Fault که سایت پرسش و پاسخ مخصوص مسائل شبکه و Super User اشاره کرد. البته سایت‌های دیگری هم هستند که از ایده Stack Overflow استفاده کرده‌اند اما نرم افزارشان با نرم افزار Stack Overflow متفاوت است. 

ویژگی‌های فنی و پروژه‌های مشابه

جالب است بدانید که Stack Overflow‌ با ASP.NET‌ کار شده است. در اینجا می‌توانید لیستی از زبان‌ها و فناوری‌هایی که برای ساخت Stack Overflow استفاده شده است را ببینید. و اینجا هم اطلاعاتی درباره سرور اختصاصی Stack Overflow‌ هست.
گرچه نرم افزار Stack Overflow هنوز اپن سورس نشده است (در این مورد زمزمه‌هایی هست)، اما پروژه‌های مشابهی با  php‌ و Ruby on Rails ایجاد شده‌اند. البته وقتی نمونه چینی سایت درست شد، بحث‌هایی در مورد میزان موفقیت پروژه‌های کپی شده در گرفت که اگر حوصله دارید این مطلب فوق العاده را از دست ندهید. در مورد کپی‌های چینی (که حالا همه چیز از چفیه عربی تا آیفون امریکایی را شامل می‌شوند) سایتها این مطلب خواندنی است.

یک نکته دیگر این که اگر به ساخت وب سایتی مشابه Stack Overflow‌ علاقمند شدید باید بدانید که معماری و ساخت نرم افزار Stack Overflow‌ خیلی ساده نیست. اینجا می‌توانید مقالات و کدهایی درباره ساخت چنین نرم افزاری با استفاده از ASP.NET  را ببینید.

Stack Overflow چگونه پول در می‌آورد؟

Stack Overflow‌ رایگان است اما چطور هزینه‌های خود را تامین می‌کند و پول در می‌آورد. در واقع دو راه اصلی برای کسب درآمد در Stack Overflow‌ هست، یکی تبلیغات و دیگر ارائه خدمات میزبانی شده سایت‌های پرسش و پاسخ مبتنی بر نرم افزار Stack Overflow. در این روش دوم در واقع شما از طریق سایت Stack Exchange‌ می‌توانید پلتفرم Stack Overflow را برای راه اندازی سایت پرسش و پاسخ خود استفاده کنید.

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

پ.ن: مدتی است که گرفتاری کاری زیاد شده است، اما سعی می‌کنم از این به بعد منظم‌تر اینجا را به روز کنم.

پخش صدا در برنامه‌ها

مهر ۸م, ۱۳۸۸

ویندوز هنگام ورود کاربر یا خاموش کردن کامپیوتر یا هنگامی که به خطایی برمی‌خورد صداهایی را پخش می‌کند. شما هم به کمک فضانام System.Media‌ می‌توانید در برنامه‌های دات نتی خودتان فایل‌های صدا فرمت wav را پخش کنید.
این قابلیت معمولاً در رابطه با فعالیت‌های کاربران در برنامه استفاده می‌شود.

برای پخش صدا می‌توانید از دو روش زیر استفاده کنید، اما قبل از هر چیز فضانام System.Media را به کدتان اضافه کنید.
۱-پخش فایل صدا از روی هارد
درفراخوانی متد زیر کافی است مسیر فایلی که می‌خواهید پخش شود را به عنوان پارامتر ارسال کنید.

private void PlaySoundFromHDD(string path)
{
   SoundPlayer player = new SoundPlayer();
   player.SoundLocation = path;
   player.Play();
}

2-پخش فایل صدا از مجموعه resource های application

برای استفاده از این متد باید فضانام‌های System.Reflection و System.IO را نیز به کدتان اضافه کنید.

در فراخوانی این متد نام فایلی که می‌خواهید پخش شود (و قبلاً به resource های برنامه‌تان اضافه کردید) را به عنوان پارامتر ارسال کنید.

private void PlaySoundFromResources(string fileName)
{
  Assembly assembly= Assembly.LoadFrom(Application.ExecutablePath);
  Stream soundStream = assembly.GetManifestResourceStream(fileName);  SoundPlayer player = new SoundPlayer();
  player.Stream = soundStream;    player.Play();
}

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

SystemSounds.Exclamation.Play();

۷ نکته برای نوشتن 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‌ ها را برای جلوگیری از کامپایل مجدد بهینه کنید.

پرسش‌های متداول درباره 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();
}