Asp.net Development

تعریف data-attributes درون htmlAttributes در Asp.net MVC

در HTML5 و همینطور در Knockout.js مشخصه هایی برای تگ ها تعریف شده است که دارای خط تیره هستند به صورت data-* و data-attributes  خوانده می شوند . در صورتی که بخواهید این مشخصه ها را در asp.net mvc در درون htmlAttributes تعریف کنید

<%= Html.ActionLink("«Home", "Home",
     new { },
     new { @class = "nav-link", data-details = "Some Details"   })%>

با خطای زیر مواجه می شوید :

Invalid anonymous type member declarator. Anonymous type members 
  must be declared with a member assignment, simple name or member access.

از خط تیره نمی شود در نام یک anonymousType member استفاده کرد . راه حل این است که به جای خط تیره از underscore استفاده کنید و مشکل حل می شود :

<%= Html.ActionLink("« Previous", "Search",
     new { keyword = Model.Keyword, page = Model.currPage - 1},
     new { @class = "prev", data_details = "Some Details"   })%>


برچسب‌ها: asp, net mvc, tip
+ نوشته شده در  جمعه سوم خرداد 1392ساعت 20:39  توسط محسن  | 

به تاخر انداختن اجرای کدهای بعدی تا کامل شدن process آغاز شده

وقتی که یک process رو آغاز می کنیم و در دنباله اون کدهای بعدی رو برمبنای انجام شدن اون process می نویسیم ، می بینیم که نتیجه مطابق انتظار ما نیست . برای مثال فرض کنید که از طریق Process برنامه ای رو اجرا کرده اید تا یک فایل رو ایجاد کنه و سپس در ادامه روی اون فایل عملیاتی انجام بشه اما در زمان اجرا با پیام پیدا نشدن فایل مواجه می شید . علت اینه که کدهای بعد از Process.Start همزمان با اون اجرا می شن و منتظر تمام شدن اون نمی مونن . برای اینکه اجرای کدها رو تا زمان کامل شدن process به تاخیر بندازید باید متد WaitForExit() رو فراخوانی کنید . 


سال نو مبارک




برچسب‌ها: c
+ نوشته شده در  جمعه دوم فروردین 1392ساعت 21:37  توسط محسن  | 

Git و در نظر گرفتن فایل های متنی به عنوان فایل های باینری

چند روز قبل برای اعمال بعضی اصلاحات ،  یک پروژه قدیمی را در git وارد کردم .در زمان انجام اولین commit متوجه مسئله عجیبی شدم . نیمی از فایل هایی که تغییر کرده بودند ( با پسوند های مختلف ) توسط git به عنوان فایل باینری شناخته می شدند و به جای نمایش بخش های تغییر یافته تنها به نمایش پیام binary file differs بسنده می کرد .  تنظیمات repo را که بررسی کردم مشکلی وجود نداشت و مشابه دیگر Repo هایی بود که درست کار می کردند .
بعد از جستجو در اینترنت ، علت مشکل رو پیدا کردم :

Git با فایل های انکود شده به صورت UTF-16 مشکل دارد و آنها را به عنوان فایل های متنی در نظر نمی گیرد .  ( هرچند در ایجاد موقعیت مشابه موفق نشدم و فقط فایل های آن پروژه قدیمی این مشکل را داشتند ! )

برای حل کردن این مشکل دو راه حل پیدا کردم .

1- در فایل gitattributes برای فایل هایی که از نوع utf-16 هستند صریحا تعیین کنید که باید به صورت فایل متنی درنظر گرفته شوند . این روش در صورتی مناسب است که در مورد یک فایل یا پسوند خاص مجبور به استفاده ازutf-16  باشید .


*.cs diff merge -crlf

2- اما در موارد دیگر که نوع فایل ها و تعداد آنها زیاد و متنوع بوده و اجباری هم به استفاده از utf-16 نیست راه ساده تر و تمیزتری وجود دارد و ان تبدیل تمام فایل ها از utf-16 به utf-8 هستش که git مشکلی در دنبال کردنش ندارد .

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



        private static void ChangeEncoding(string folderPath)
        {
            string[] extensions = new[] { ".cs", ".aspx", ".aspx.cs", ".js", ".css", ".config", ".sitemap", ".ascx", "ascx.cs", ".ashx", ".htm", ".html", ".asax", ".txt" };

            DirectoryInfo dirInfo = new DirectoryInfo(folderPath);

            FileInfo[] dirFiles = dirInfo.GetFiles("*.*", SearchOption.AllDirectories);

            foreach (FileInfo file in dirFiles)
            {
                string ext = Path.GetExtension(file.Name);

                if (!extensions.Contains(ext))
                {
                    continue;
                }

                string fileName = file.FullName;
                string tempFileName = fileName + ".proback";

                File.SetAttributes(fileName, FileAttributes.Normal);

                File.Move(fileName, tempFileName);

                using (StreamReader sreader = new StreamReader(tempFileName))
                {

                    using (StreamWriter swriter = new StreamWriter(fileName, false, Encoding.UTF8))
                    {
                        while (!sreader.EndOfStream)
                        {
                            swriter.WriteLine(sreader.ReadLine());
                        }
                    }
                }

                File.Delete(tempFileName);

            }

        }

+ نوشته شده در  دوشنبه دوم بهمن 1391ساعت 16:57  توسط محسن  | 

لینک های روزانه

+ نوشته شده در  دوشنبه بیست و دوم آبان 1391ساعت 21:3  توسط محسن  | 

لینک های روزانه

+ نوشته شده در  یکشنبه بیست و یکم آبان 1391ساعت 23:43  توسط محسن  | 

لینک های روزانه

+ نوشته شده در  یکشنبه بیست و یکم آبان 1391ساعت 0:57  توسط محسن  | 

لینک های روزانه

+ یک بحث طولانی درباره تفاوت و مقایسه رویه های ذخیره شده و کوئری های برخط ؟ ( نتیجه اینکه آنچه درباره مزایای رویه های ذخیره شده در باب سرعت و امنیت بیشتر ذکر می شود در حال حاضر برای کوئری های برخط هم صادق هستند . و در صورت عدم اجرای مناسب به یک اندازه آسیب پذیر هستند . تنها عامل موثر در انتخاب یکی از این دو مشخصات پروژه است )

+ بحث کلید خارجی در sqlite ( در حال حاضر sqlite از تعریف کلید خارجی تنها در زمان ساخت جدول حمایت می کند و البته باید برای فعال شدن آن در تنظیمات دیتابیس مربوطه وضعیت ساپورت کلید خارجی را به true تغییر دهید )

+ راه حل هایی برای مشکلاتی که در زمان پیکربندی و استفاده از sqlite پیش می آید 

+ مشکل تفاوت نوع int در .NET و در sqlite و روشی برای حل آن ( خطای The type of the key field ‘Id’ is expected to be ‘System.Int32′, but the value provided is actually of type ‘System.Int64′ )

+ نسخه بندی معنایی



برچسب‌ها: لینک های روزانه
+ نوشته شده در  دوشنبه پانزدهم آبان 1391ساعت 23:18  توسط محسن  | 

بازنویسی کد از ابتدا ، یک اشتباه استراتژیک در برنامه های تجاری

این ترجمه ( با جرح و تعدیل ) یک مقاله قدیمی ( اما هنوز مفید و آموزنده ) از وب سایت Joel Spolsky به بهانه بیرون آمدن نسخه جدید netscape است :

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

NetScape ، Microsoft ، Borland نمونه هایی از شرکت های بزرگی هستند که در مقطعی این اشتباه را مرتکب شدند و به شدت ضربه خورده و سهم خود در بازار را کاملا یا به طور نسبی به رقیبان واگذار کردند .

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

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


خواندن کد از نوشتن آن سخت تر است .


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

دلیل این افتضاح بودن چیست ؟

آنها می گویند " خوب ، به این تابع نگاه کن . دو صفحه است . هیچکدام از این کدها جایشان اینجا نیست . من نمی دونم نصف این فراخوانی API ها برای چیست

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

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

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

با ادامه دادن استفاده از یک نسخه قدیمی از کد برای چندین سال ( در زمان کار بر روی نسخه ی کاملاً جدید ) ، شما خود را در موقعیت خطرناکی قرار می دهید و قادر به هیچگونه تغییر استراتژیک یا واکنش به تقاضای امکانات جدید از طرف بازار نخواهید بود چون کد قابل توسعه ای ندارید . شاید کسب و کارتان را در این مدت تعطیل کنید

با نوشتن کدی که وجود دارد ؛ شما مقدار زیادی پول و سرمایه را هدر می دهید .

آیا گزینه ی دیگری وجوددارد ؟ به نظر می رسد که اتفاق نظر بر این است که کد قدیمی Netscape خیلی بد بود . خوب ؛ شاید بد بوده است اما می دانید ؟ بر روی تعداد خیلی زیادی از کامپیوترها در دنیا به خوبی کار می کرد .
وقتی یک برنامه نویس می گوید که کدش افتضاح است ( که همیشه هم  می گوید ) سه چیز باعث آن است :
اول ، وجود مشکلات معماری . کد به خوبی نوشته نشده است .این مشکلات را می توان  یکی یکی با جابجا کردن محتاطانه کدها ، refactor کردن ، تغییر interface ها و ... حل کرد .می توان این تغییرات را توسط یک برنامه نویس انجام داد . حتی تغییرات نسبتا بزرگ در معماری را می توان بدون دور ریختن کد قدیمی انجام داد . جابجا کردن و  تمیزکاری کدها ، ساختن کلاسهای پایه درست و با معنی ، ساختن interfaceهای دقیق بین ماژول ها  همراه با احتیاط و بدون ایجاد کردن باگ های جدید .

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

دلیل سوم زشت بودن کد قدیمی است . برای مثال پروژه با این قرارداد شروع شده که متغیرها با زیرخط شروع شوند اما بعدا قرارداد به m_ تغییر کرده . که کد را زشت می کند . این مشکلات را می شود به راحتی با یک ماکرو حل کرد ونیازی به بازنویسی پروژه نیست .

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

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


برچسب‌ها: ترجمه
+ نوشته شده در  دوشنبه پانزدهم آبان 1391ساعت 9:21  توسط محسن  | 

لینک های روزانه

+ نوشته شده در  شنبه سیزدهم آبان 1391ساعت 2:0  توسط محسن  | 

لینک های روزانه

+ نوشته شده در  چهارشنبه دهم آبان 1391ساعت 8:58  توسط محسن  | 

مطالب قدیمی‌تر