۱۳۹۰/۰۲/۰۹

SFDown


چند روز قبل جهت دريافت فايل‌هاي تنظيم سطح دوم كش NHibernate به سايت سورس فورج مراجعه كردم و ... آه از نهادم برخاست! نه از اين جهت كه اين سايت مدت مديدي است ما رو تحريم كرده، به اين دليل كه سورس فورج حتي با IP غير ايراني تونسته بود موقعيت من رو شناسايي كنه. شبيه به همين مورد مدتي است توسط گوگل نيز بكارگرفته ميشه. به نظر ميرسه اين وسط جايي نشتي وجود داره. براي مثال در فايرفاكس امكان گزارش Geo Location به صورت پيش فرض فعال است. هر چند در مستندات آن صراحتا عنوان شده كه ... خير ... ما اين اطلاعات را بدون تائيد شما بروز نمي‌دهيم؛ ولي سؤال اينجا است كه چطور تونستند از روي IP غيرايراني، موقعيت من رو تشخيص دهند؟!
غير فعال كردن اين مورد هم ساده است. مطابق تصوير زير عمل كنيد:



به عبارتي در نوار آدرس فایرفاکس عبارت about:config را تایپ کرده، سپس عبارت geo.enabled را يافته و غيرفعال كنيد. اكنون نياز است يكبار مرورگر را بسته و باز كنيد.
و ... IP ايي كه سوخت ... تا يكي دو هفته عمل نخواهند كرد و بعد از ليست سياه پاك خواهد شد.

براي رفع اين نقيصه و ساده‌تر كردن دريافت فايل‌ها از سورج فورج، برنامه‌ي كوچكي را تهيه كرده‌ام كه با گرفتن آدرس يك پروژه سورس فورج، لينك مستقيم قابل دريافت فايل‌هاي آن‌را در اختيار شما قرار مي‌دهد. اين برنامه بر اساس Mirror هاي سورس فورج عمل مي‌كند و به صورت خودكار تمام آن‌ها را بررسي كرده و مورد قابل استفاده را گزارش خواهد داد. يا مي‌توانيد توسط خود برنامه فايل نهايي را دريافت كنيد يا امكان كپي كردن يا ذخيره كردن لينك‌هاي مستقيم نهايي يافت شده، در برنامه پيش بيني شده است (جهت دريافت توسط برنامه download manager مورد علاقه شما).




۱۳۹۰/۰۲/۰۸

ويندوز 7 و SQL Server 2008 موفق به كسب گواهينامه امنيتي شدند


نرم افزارهاي Windows 7, Windows Server 2008 R2 and SQL Server 2008 SP2 32 & 64 bit Enterprise Edition موفق به كسب گواهينامه امنيتي Common Criteria شدند. كسب اين مجوز امنيتي يكي از شروط اصلي و اجباري استفاده از يك نرم افزار در وزارت دفاع آمريكا است.
اين بررسي‌ها زير نظر وزارت دفاع و آژانس امنيت ملي آمريكا و همچنين آلمان برگزار شده و گزارش‌هاي مرتبط با ويندوز 7 و SQL Server 2008 را از اينجا مي‌توانيد دريافت كنيد: (+) و (+)

ماخذ: (+)


مطالب مشابه:
امنيت SQL Server 2008
مقايسه امنيتي نگارش‌هاي مختلف ويندوز

۱۳۹۰/۰۲/۰۵

تهيه آزمون واحد جهت كار با محتواي فايل‌ها


يكي از شروط تهيه‌ آزمون‌هاي واحد، خارج نشدن از مرزهاي سيستم در حين بررسي آزمون‌هاي مورد نظر است؛ تا بتوان تمام آزمون‌ها را با سرعت بسيار بالايي، بدون نگراني از در دسترس نبودن منابع خارجي، درست در لحظه انجام آزمون‌ها، به پايان رساند. اگر اين خروج صورت گيرد، بجاي unit tests با integration tests سر و كار خواهيم داشت. در اين ميان، كار با فايل‌ها نيز مصداق بارز خروج از مرزهاي سيستم است.
براي حل اين مشكل راه حل‌هاي زيادي توصيه شده‌اند؛ منجمله تهيه يك اينترفيس محصور كننده فضاي نام System.IO و سپس استفاده از فريم ورك‌هاي mocking و امثال آن. يك نمونه از پياده سازي آن‌را اينجا مي‌توانيد پيدا كنيد : (+)
اما راه حل ساده‌تري نيز براي اين مساله وجود دارد و آن هم افزودن فايل‌هاي مورد نظر به پروژه آزمون واحد جاري و سپس مراجعه به خواص فايل‌ها و تغيير Build Action آن‌‌ها به Embedded Resource مي‌باشد. به اين صورت پس از كامپايل پروژه، فايلهاي ما در قسمت منابع اسمبلي جاري قرار گرفته و به كمك متد زير قابل دسترسي خواهند بود:
using System.IO;
using System.Reflection;

public class UtHelper
{
public static string GetInputFile(string filename)
{
var thisAssembly = Assembly.GetExecutingAssembly();
var stream = thisAssembly.GetManifestResourceStream(filename);
return new StreamReader(stream).ReadToEnd();
}
}

نكته‌اي را كه اينجا بايد به آن دقت داشت، filename متد GetInputFile است. چون اين فايل ديگر به صورت متداول از فايل سيستم خوانده نخواهد شد، نام واقعي آن به صورت namespace.filename مي‌باشد (همان نام منبع اسمبلي جاري).
اگر جهت يافتن اين نام با مشكل مواجه شديد، تنها كافي است اسمبلي آزمون واحد را با برنامه Reflector يا ابزارهاي مشابه گشوده و نام منابع آن‌را بررسي كنيد.

۱۳۹۰/۰۲/۰۲

ظهور ميكرو ORMs


پس از "معرفي Microsoft.Data.dll يا WebMatrix.Data.dll" كه يك كتابخانه‌ي سورس بسته و همچنين مخصوص وب ماتريكس مي‌باشد، اين ايده توسط ساير برنامه نويس‌ها دنبال و تبديل به ORMs جديدي با كمتر از 400 سطر كد شده است كه به Micro ORMs هم شهرت يافته‌اند.
در اينجا شما هنوز هم كاملا با SQL سر و كار داريد اما با امكان استفاده بسيار ساده‌تر از پارامترها و همچنين بكارگيري قابليت‌هاي جديد dynamic معرفي شده در دات نت 4 . براي مثال:

Dapper
var guid = Guid.NewGuid();
var customer = connection.ExecuteMapperQuery<customer>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });

Massive
var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice &gt; @1", orderBy: "ProductName", limit: 20, args: 5,20);

Massive توسط آقاي راب كانري كه قبلا ORM ديگري را به نام ساب سونيك ايجاد كرده بود، تهيه شده و Dapper توسط تيم سايت StackOverflow جهت مواردي خاصي كه استفاده از ORMs (از LINQ to SQL استفاده مي‌كنند) هزينه زيادي داشته، مورد استفاده قرار مي‌گيرد. در همان صفحه اصلي پروژه، يك سري آمار و ارقام از ديد مقايسه كارآيي با ساير ORMs نيز ذكر شده‌اند.
حتي اگر قصد استفاده از آن‌ها را هم نداشته باشيد مطالعه كد آن‌ها از ديدگاه كاربردهاي عملي قابليت‌هاي پوياي زبان، بسيار آموزنده هستند.

۱۳۹۰/۰۱/۳۰

رادار فناوري اطلاعات


احتمالا يك سري نمودار مانند اين را ديده باشيد كه هر از چندگاهي براي زبان‌هاي برنامه نويسي از ديدگاه محبوبيت تعيين رتبه مي‌كنند. البته اين آمار با آنچه كه در سايت پر بازديد stackoverflow در جريان است عموما در تناقض است؛ از اين لحاظ كه برنامه نويسي با سؤال مواجه نمي‌شود كه كار نمي‌كند!
بر اين اساس عده‌اي آمار و اطلاعات سايت stackoverflow را هر از چندگاهي آناليز مي‌كنند تا متوجه شوند هم اكنون كدام زبان‌ها يا فريم ورك‌ها بيشتر مورد استفاده هستند؛ براي مثال:
  • كداميك از فريم ورك‌هاي وب بيشتر مورد استفاده هستند؟ (+)
  • كداميك از زبان‌هاي برنامه نويسي بيشتر محبوب هستند؟ (+) و (+) (محبوبيت در اينجا به معناي تعداد سؤال پرسيده شده است نه علاقه شخصي)
  • همين سوال بر اساس مسابقه هوش مصنوعي گوگل: (+) و (+)

اين‌‌ها يك روي سكه هستند؛ روي ديگر آن هم به اين صورت است كه "الان واقعا اون ور آ‌ب‌ها چه خبره؟!" صرف نظر از علاقه شخصي من كه بخواهند بر اساس آن نمودار رسم كنند يا تعداد سؤالات پرسيده شده در يك انجمن، نظر كارشناسان امر در اين باره چيست؟ بر همين اساس شركت ThoughtWorks مدتي است يك سري آمار را بر اساس وضعيت شركت‌هاي بزرگ، بازار و علاقمند‌ي‌هاي جاري آن‌ها منتشر مي‌كند كه از آدرس زير قابل دريافت هستند:



۱۳۹۰/۰۱/۲۸

روش از كار انداختن صفحه‌ي Add service reference در VS.NET


در جهت تكميل بحث "بررسي امنيتي، حين استفاده از jQuery Ajax"، يك مورد ديگر را هم مي‌توان اضافه كرد: چگونه صفحه‌ي معروف Add service reference را در VS.NET جهت سرويس WCF خود از كار بيندازيم؟
راه حل آن هم بسيار ساده است اما چون عموما در منابع مرتبط با جملات و كلمات بيش از حد فني بيان مي‌شود، شايد از ديد دور مانده باشد:
اگر WCF Service توليدي شما تنها قرار است توسط برنامه‌ي Silverlight يا جاوا اسكريپتي موجود در پروژه‌ي جاري مورد استفاده قرار گيرد، بايد Meta Data مرتبط با آن سرويس را جهت بالابردن امنيت سيستم، حذف نمود. توسط اين Meta Data مي‌توان ServiceContract ، OperationContract و ساير اطلاعات يك WCF Service را استخراج نمود.

الف) روش غير فعال كردن متاديتا در يك Ajax enabled WCF Service

به فايل وب كانفيگ برنامه مراجعه كرده و تغيير زير را اعمال كنيد:
...
<behavior name="">
<serviceMetadata httpGetEnabled="false" httpsGetUrl="false" />
...
</behavior>
...

ب) روش غيرفعال كردن متاديتا در يك Silverlight enabled WCF Service

ابتدا قسمت الف را اعمال نموده سپس تغيير زير را نيز لحاظ نمائيد (IMetadataExchange به صورت كامنت درآمده):
<!-- <endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" /> -->

با اين تغييرات ساده، گزينه‌ي Add service reference ديگر قابليت تشخيص خودكار اطلاعات سرويس شما را نداشته و با يك خطا متوقف خواهد شد:
The HTML document does not contain Web service discovery information.
Metadata contains a reference that cannot be resolved.

سؤال:
1- آيا با اين تغيير در عملكرد WCF سرويس ما اخلال ايجاد خواهد شد؟
پاسخ: خير. تنها Web service discovery information را از كار انداخته‌ايم.
2- در صورت تغيير كدهاي WCF Service چه بايد كرد؟
پاسخ: اگر امضاي متدها و اينترفيس‌هاي تعريف شده تغييري نداشته‌اند، لزومي به هيچ نوع تغييري نيست. در غيراينصورت، سريع موارد الف و ب فوق را به حالت اول برگردانده، كلاينت مورد استفاده را به روز كنيد، مجددا متاديتا را حذف نمائيد.

۱۳۹۰/۰۱/۲۷

NH 3.2 و تاثير آن بر آينده‌ي FHN


در اين عنوان، NH همان NHibernate است و FHN همان Fluent NHibernate

نگارش آزمايشي NH 3.2 هم اكنون در دسترس است و يكي از مهمترين مباحثي را كه پوشش داده، جايگزين كردن فايل‌هاي XML تهيه نگاشت‌ها با كدنويسي است. دقيقا چيزي شبيه به Fluent NHibernate البته اينبار از يك كتابخانه ديگر به نام ConfOrm كدها يكي شده‌اند.
بايد توجه داشت كه نگارش 3.2 خاصيت AutoMapping مربوط به FHN را پشتيباني نمي‌كند (يا هنوز در اين نگارش به اين حد نرسيده است)، بنابراين نمي‌تواند جايگزين صد در صدي براي FHN باشد اما باز هم تا حدود 75 درصد كار FHN را پوشش مي‌دهد و مي‌تواند علاقمندان را از اين وابستگي خارجي (!) نجات دهد.
و ... اين مساله نويسنده‌ي اصلي FHN را كمي دلگير كرده است كه آيا FHN را ادامه دهد يا خير. اصل مطلب رو مي‌تونيد اينجا بخونيد.
نظر بعضي‌ها هم در اين بين اين بوده!
ConfOrm looks like lipstick on a pig as far as fluent interfaces go

۱۳۹۰/۰۱/۲۴

بررسي ميزان پوشش آزمون‌هاي واحد به كمك برنامه PartCover


هميشه در حين توسعه‌ي يك برنامه اين سؤالات وجود دارند:
- چند درصد از برنامه تست شده است؟
- براي چه تعدادي از متدهاي موجود آزمون واحد نوشته‌ايم؟
- آيا همين آزمون‌هاي واحد نوشته شده و موجود، كامل هستند و تمام عملكرد‌هاي متدهاي مرتبط را پوشش مي‌دهند؟

اين سؤالات به صورت خلاصه مفهوم Code coverage را در بحث Unit testing ارائه مي‌دهند: براي چه قسمت‌هايي از برنامه آزمون واحد ننوشته‌ايم و ميزان پوشش برنامه توسط آزمون‌هاي واحد موجود تا چه حدي است؟
بررسي اين سؤالات در يك پروژه‌ي كم حجم، ساده بوده و به صورت بازبيني بصري ممكن است. اما در يك پروژه‌ي بزرگ نياز به ابزار دارد. به همين منظور تعدادي برنامه جهت بررسي code coverage مختص پروژه‌هاي دات نتي تابحال توليد شده‌اند كه در ادامه ليست آن‌ها را مشاهده مي‌كنيد:
و ...

تمام اين‌ها تجاري هستند. اما در اين بين برنامه‌ي PartCover سورس باز و رايگان بوده و همچنين مختص به NUnit نيز تهيه شده است. اين برنامه را از اينجا مي‌توانيد دريافت و نصب كنيد. در ادامه نحوه‌ي تنظيم آن‌را بررسي خواهيم كرد:

الف) ايجاد يك پروژه آزمون واحد جديد
جهت توضيح بهتر سه سؤال مطرح شده در ابتداي اين مطلب، بهتر است يك مثال ساده را در اين زمينه مرور نمائيم: (پيشنياز: (+))
يك Solution جديد در VS.NET آغاز شده و سپس دو پروژه جديد از نوع‌هاي كنسول و Class library به آن اضافه شده‌اند:



پروژه كنسول، برنامه اصلي است و در پروژه Class library ، آزمون‌هاي واحد برنامه را خواهيم نوشت.
كلاس اصلي برنامه كنسول به شرح زير است:
namespace TestPartCover
{
public class Foo
{
public int DoFoo(int x, int y)
{
int z = 0;
if ((x > 0) && (y > 0))
{
z = x;
}
return z;
}

public int DoSum(int x)
{
return ++x;
}
}
}
و كلاس آزمون واحد آن در پروژه class library مثلا به صورت زير خواهد بود:
using NUnit.Framework;

namespace TestPartCover.Tests
{
[TestFixture]
public class Tests
{
[Test]
public void TestDoFoo()
{
var result = new Foo().DoFoo(-1, 2);
Assert.That(result == 0);
}
}
}
كه نتيجه‌ي بررسي آن توسط NUnit test runner به شكل زير خواهد بود:



به نظر همه چيز خوب است! اما آيا واقعا اين آزمون كافي است؟!

ب) در ادامه به كمك برنامه‌ي PartCover مي‌خواهيم بررسي كنيم ميزان پوشش آزمون‌هاي واحد نوشته شده تا چه حدي است؟

پس از نصب برنامه، فايل PartCover.Browser.exe را اجرا كرده و سپس از منوي فايل، گزينه‌ي Run Target را انتخاب كنيد تا صفحه‌ي زير ظاهر شود:



توضيحات:
در قسمت executable file آدرس فايل nunit-console.exe را وارد كنيد. اين برنامه چون در حال حاضر براي دات نت 2 كامپايل شده امكان بارگذاري dll هاي دات نت 4 را ندارد. به همين منظور فايل nunit-console.exe.config را باز كرده و تنظيمات زير را به آن اعمال كنيد (مهم!):
<configuration>
<startup>
<supportedRuntime version="v4.0.30319" />
</startup>

و همچنين
<runtime>
<loadFromRemoteSources enabled="true" />

در ادامه مقابل working directory‌ ، آدرس پوشه bin پروژه unit test را تنظيم كنيد.
در اين حالت working arguments به صورت زير خواهند بود (در غيراينصورت بايد مسير كامل را وارد نمائيد):
TestPartCover.Tests.dll /framework=4.0.30319 /noshadow

نام dll‌ وارد شده همان فايل class library توليدي است. آرگومان بعدي مشخص مي‌كند كه قصد داريم يك پروژه‌ي دات نت 4 را توسط NUnit بررسي كنيم (اگر ذكر نشود پيش فرض آن دات نت 2 خواهد بود و نمي‌تواند اسمبلي‌هاي دات نت 4 را بارگذاري كند). منظور از noshadow اين است كه NUnit‌ مجاز به توليد shadow copies از اسمبلي‌هاي مورد آزمايش نيست. به اين صورت برنامه‌ي PartCover مي‌تواند بر اساس StackTrace نهايي، سورس متناظر با قسمت‌هاي مختلف را نمايش دهد.
اكنون نوبت به تنظيم Rules آن است كه يك سري RegEx هستند؛ به عبارتي چه اسمبلي‌هايي آزمايش شوند و كدام‌ها خير:
+[TestPartCover]*
-[nunit*]*
-[log4net*]*

همانطور كه ملاحظه مي‌كنيد در اينجا از اسمبلي‌هاي NUnit و log4net صرفنظر شده است و تنها اسمبلي TestPartCover (همان برنامه كنسول، نه اسمبلي برنامه آزمون واحد) بررسي خواهد گرديد.
اكنون بر روي دكمه Save در اين صفحه كليك كرده و فايل نهايي را ذخيره كنيد (بعدا توسط دكمه Load در همين صفحه قابل بارگذاري خواهد بود). حاصل بايد به صورت زير باشد:
<PartCoverSettings>
<Target>D:\Prog\Libs\NUnit\bin\net-2.0\nunit-console.exe</Target>
<TargetWorkDir>D:\Prog\1390\TestPartCover\TestPartCover.Tests\bin\Debug</TargetWorkDir>
<TargetArgs>TestPartCover.Tests.dll /framework=4.0.30319 /noshadow</TargetArgs>
<Rule>+[TestPartCover]*</Rule>
<Rule>-[nunit*]*</Rule>
<Rule>-[log4net*]*</Rule>
</PartCoverSettings>

براي شروع به بررسي، بر روي دكمه Start كليك نمائيد. پس از مدتي، نتيجه به صورت زير خواهد بود:



بله! آزمون واحد تهيه شده تنها 39 درصد اسمبلي TestPartCover را پوشش داده است. مواردي كه با صفر درصد مشخص شده‌اند، يعني فاقد آزمون واحد هستند و نكته مهم‌تر پوشش 91 درصدي متد DoFoo است. براي اينكه علت را مشاهده كنيد از منوي View ، گزينه‌ي Coverage detail را انتخاب كنيد تا تصوير زير نمايان شود:



قسمت‌ نارنجي در اينجا به معناي عدم پوشش آن در متد TestDoFoo تهيه شده است. تنها قسمت‌هاي سبز را توانسته‌ايم پوشش دهيم و براي بررسي تمام شرط‌هاي اين متد نياز به آزمون‌هاي واحد بيشتري مي‌باشد.

روش نهايي كار نيز به همين صورت است. ابتدا آزمون واحد تهيه مي‌شود. سپس ميزان پوشش آن بررسي شده و در ادامه سعي خواهيم كرد تا اين درصد را افزايش دهيم.

۱۳۹۰/۰۱/۲۳

آشنايي با NuGet - قسمت دوم


قسمت قبل از ديد يك مصرف كننده بود؛ اين قسمت جهت توسعه‌ دهنده‌ها تهيه شده است. كساني كه قصد دارند تا بسته‌هاي NuGet ايي از كارشان تهيه كنند. مراحل اينكار به شرح زير است:

الف) براي اين منظور نياز است تا برنامه‌ي‌ خط فرمان NuGet.exe معرفي شده در قسمت قبل را ابتدا دريافت كنيد : (+)

ب) براي بسته نرم افزاري خود يك پوشه جديد درست كنيد. سپس فرمان nuget.exe spec را در اين پوشه صادر نمائيد. بلافاصله فايلي به نام Package.nuspec تشكيل خواهد شد:
D:\Prog\1389\CodePlex\slpdatepicker\SlPDatePickerNuGet>NuGet.exe spec
Created 'Package.nuspec' successfully.

فايل Package.nuspec، يك فايل XML ساده است. آن‌را با يك اديتور متني باز كرده و تغييرات لازم را اعمال نمائيد. براي مثال من جهت پروژه Silverlight 4 Persian DatePicker ، محتويات آن‌را به صورت زير تغيير داده‌ام:

<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>Silverlight.4.Persian.DatePicker</id>
<version>1.0</version>
<authors>Vahid Nasiri</authors>
<owners>Vahid Nasiri</owners>
<licenseUrl>http://slpdatepicker.codeplex.com/license</licenseUrl>
<projectUrl>http://slpdatepicker.codeplex.com/</projectUrl>
<iconUrl>https://slpdatepicker.svn.codeplex.com/svn/SilverlightPersianDatePicker/Views/Images/date.png</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Silverlight 4 Persian DatePicker Control</description>
<tags>Silverlight WPF Persian DatePicker</tags>
</metadata>
<files>
<file src="..\SilverlightPersianDatePicker\Bin\Release\*.dll" target="lib" />
<file src="..\SilverlightPersianDatePicker\Bin\Release\*.pdb" target="lib" />
<file src="..\SilverlightPersianDatePicker\Bin\Release\*.xml" target="lib" />
</files>
</package>

همانطور كه ملاحظه مي‌كنيد يك سري اطلاعات عمومي از پروژه مورد نظر درخواست شده است؛ براي مثال آدرس آيكن آن چيست يا كجا مي‌توان آن‌را يافت؟ مجوز استفاده از آن چيست و مواردي از اين دست. به كمك تگ files هم فايل‌هاي كتابخانه در اينجا لحاظ شده‌اند. فايل آيكن معرفي شده بايد در اندازه‌ي 32*32 و با فرمت png باشد. بايد دقت داشت كه در سايت nuget.org ، بسته شما بر اساس id ذكر شده معرفي خواهد شد و آدرسي بر اين اساس تشكيل مي‌گردد. بنابراين از فاصله يا موارد مشكل ساز در اين بين استفاده نكنيد.

در مورد نحوه‌ي ايجاد قدم به قدم يك پروژه جديد در سايت كدپلكس مي‌توان به اين مطلب مراجعه نمود: (+)

ج) اكنون نوبت به تهيه بسته نهايي مي‌رسد. براي اين منظور دستور زير را در خط فرمان صادر كنيد:
NuGet.exe pack Package.nuspec
پس از چند لحظه فايل Silverlight.4.Persian.DatePicker.1.0.nupkg جهت ارائه عمومي توليد خواهد شد.

د) قبل از اينكه اين فايل نهايي را در سايت nuget.org آپلود كنيم، مي‌توان مشخصات آن‌را به صورت محلي نيز يكبار مرور كرد. براي اين منظور در VS.NET به منوي Tools گزينه‌ي Options مراجعه كرده و در قسمت package manager ، آدرس پوشه بسته مورد نظر را وارد كنيد. براي مثال:



اكنون اگر كنسول پاورشل توضيح داده شده در قسمت قبل را باز نمائيد، منبع جديد اضافه شده مشخص است يا مي‌توان توسط دستور ذيل از آن كوئري گرفت:
get-package -remote -filter silverlight



و يا اگر همانند توضيحات قبل به صفحه‌ي ديالوگ add library package reference‌ مراجعه كنيم، مشخصات كامل بسته به همراه منبع محلي بايد قابل مشاهده باشند:



ه) پس از بررسي محلي بسته مورد نظر، اكنون نوبت به ارائه عمومي آن مي‌باشد. براي اين منظور ابتدا بايد در سايت nuget.org ثبت نام كرد : (+). اگر آدرس ايميل شما را نپذيرفت، از مرورگر IE استفاده كنيد!
پس از ثبت نام تنها كافي است به قسمت contribute سايت مراجعه كرده و فايل بسته نهايي را در آنجا آپلود كرد. به اين صورت بسته نهايي در سايت پديدار خواهد شد :‌(+)
همچنين بلافاصله در قسمت گالري آنلاين صفحه add library package reference نيز قابل دسترسي خواهد بود.


در آينده جهت توزيع به روز رساني‌هاي جديد، همين مراحل بايد تكرار شوند. البته در نظر داشته باشيد كه version ذكر شده در فايل Package.nuspec را بايد حتما تغيير داد تا بسته‌ها از يكديگر متمايز شوند. امكان اتوماسيون اين توزيع نيز وجود دارد. همان فايل nuget.exe ، امكان ارسال بسته نهايي را به سايت nuget.org نيز دارد:
nuget push name.nupkg key
در اينجا key مخصوص به خود را مي‌توان در صفحه‌ي http://nuget.org/Contribute/MyAccount مشاهده و استفاده نمود.

اگر علاقمند به مشاهده جزئيات بيشتري از اين پروسه هستيد، مي‌توان به سايت رسمي آن مراجعه كرد: (+)

۱۳۹۰/۰۱/۲۱

آشنايي با NuGet - قسمت اول


NuGet چيست؟

روش متداول استفاده از كتابخانه‌هاي موجود دات نتي در Visual studio‌ عموما به اين صورت است: مراجعه به سايت مربوطه، دريافت بسته مورد نظر، باز كردن آن و سپس افزودن ارجاعي به اسمبلي‌هاي آن كتابخانه. در اين حالت زمانيكه نسخه‌ي جديدي از كتابخانه‌ي مورد استفاده ارائه ‌شود (و عموما تا مدت‌ها شايد از آن بي‌اطلاع باشيم) تمام اين مراحل بايد از ابتدا تكرار شوند و همينطور الي آخر.
براي رفع اين نقيصه، تيم ASP.NET، افزونه‌اي سورس باز و رايگان را به نام NuGet جهت VS.Net 2010 طراحي كرده‌اند كه كار مديريت بسته‌هاي كتابخانه‌هاي مورد استفاده را بسيار ساده كرده است. امكانات اين افزونه پس از نصب، در دو حالت استفاده از رابط گرافيكي كاربري آن و يا با استفاده از خط فرمان PowerShell ويندوز در دسترس خواهد بود. اين افزونه در زمان بارگذاري، با مراجعه به فيد سايت مركزي خود، ليست بسته‌هاي مهيا را در اختيار علاقمندان قرار مي‌دهد. درب اين سايت مركزي به روي تمام توسعه‌ دهنده‌ها جهت افزودن بسته‌هاي خود باز است.
و ... فراگيري كار با NuGet براي تمام برنامه نويسان دات نت لازم و ضروري است! از اين جهت كه پيغام "اين بسته تنها براي NuGet عرضه شده است" كم كم در حال متداول شدن مي‌باشد و ديگر سايت‌هاي مرتبط، لينك مستقيمي را جهت دريافت كتابخانه‌هاي خود ارائه نمي‌دهند. حتي خبر به روز شدن محصولات خود را هم شايد ديگر به صورت منظم ارائه ندهند؛ زيرا NuGet كار مديريت آن‌ها را به عهده خواهد داشت.


دريافت و نصب NuGet

NuGet را حداقل به سه طريق مي‌توان دريافت و نصب كرد:
الف) با مراجعه به سايت CodePlex : (+)
ب) دريافت آن از سايت گالري‌هاي آن : (+)


ج) با استفاده از امكانات VS.NET

هر سه روش فوق به دريافت و نصب فايل NuGet.Tools.vsix منتهي مي‌شوند. براي مثال در روش (ج) بايد به منوي Tools و گزينه‌ي Extension Manager مراجعه كنيد. سپس برگه‌ي Online Gallery را گشوده و اندكي صبر كنيد تا اطلاعات آن دريافت و نمايش داده شود. سپس NuGet را در Search box بالاي صفحه نوشته و NuGet Package manager ظاهر شده را انتخاب و نصب كنيد.



نحوه استفاده از NuGet

فرض كنيد يك پروژه جديد ASP.NET را ايجاد كرده‌ايد و نياز است تا كتابخانه‌ي ELMAH به آن اضافه شود. روش انجام اينكار را به كمك NuGet در ادامه بررسي خواهيم كرد (كمتر از يك دقيقه زمان خواهد برد):

الف) با كمك امكانات رابط گرافيكي كاربر آن
ساده‌ترين روش استفاده از NuGet ، كليك راست بر روي پوشه References در Solution explorer و سپس انتخاب گزينه‌ي Add Library Package Reference مي‌باشد:



در صفحه‌ي باز شده، برگه‌ي Online را باز كنيد و مدتي صبر نمائيد تا اطلاعات لازم دريافت گردد (در زمان نگارش اين مطلب، 1135 بسته در اين مخزن موجود است):



سپس در جعبه‌ي جستجوي سمت راست بالاي صفحه، نام كتابخانه‌ي مورد نظر را نوشته و اندكي صبر كنيد تا اطلاعات آن نمايش داده شود:



اكنون با كليك بر روي دكمه Install ، بسته مرتبط با اين كتابخانه دريافت شده و سپس به صورت خودكار ارجاعي به آن نيز افزوده خواهد شد. همچنين تنظيمات مرتبط با فايل Config برنامه هم اضافه مي‌شوند.

روش ديگر ظاهر كردن اين صفحه، مراجعه به منوي Tools و گزينه‌ي Library Package Manager مي‌باشد:



جهت دريافت به روز رساني‌هاي بسته‌هاي نصب شده تنها كافي است به برگه‌ي Updates اين صفحه مراجعه كرده و موارد ليست شده را نصب نمائيم:



نكته: NuGet در SharpDevelop 4.1 به بعد هم پشتيباني مي‌شود:




ب) با استفاده از امكانات خط فرمان PowerShell ويندوز
براي استفاده از امكانات پاورشل ويندوز نياز است تا پاورشل نگارش 2 بر روي سيستم شما نصب باشد (نياز به Windows XP with Service Pack 3 به بعد دارد). سپس به منوي Tools ، قسمت Library Package Manager ، گزينه‌ي Package Manager Console آن جهت فعال سازي كنسول پاور شل در VS.NET مراجعه نمائيد:


نكته: در تصوير فوق پس از نوشتن el ، دكمه tab فشرده شده است. در اين حالت منوي پكيج‌هاي مهياي شروع شده با el، از سايت مركزي NuGet ظاهر گرديده است.

فرامين مهمي كه در اينجا در دسترس هستند شامل: List-Package ، Uninstall-Package ، Update-Package و Get-Package مي‌باشند. براي مثال اگر قصد جستجو در بين بسته‌هاي موجود را داشته باشيد Get-Package بسيار مفيد است:



براي مثال جهت يافتن بسته‌هاي مرتبط با wpf و silverlight به صورت زير مي‌توان عمل كرد:
PM> get-package -remote -filter wpf
PM> get-package -remote -filter silverlight

نكته: روش ديگر جستجو در بين بسته‌هاي مهيا، مراجعه به سايت گالري آن است : (+) . در اينجا دستور پاورشل نصب هر بسته‌ي يافت شده نيز نمايش داده مي‌شود.


ج) استفاده از برنامه NuGet.exe
برنامه NuGet.exe از سايت CodePlex قابل دريافت است. اين روش هم جهت علاقمندان به خط فرمان تدارك ديده شده است!
پس از دريافت آن فرض كنيد مي‌خواهيم تمام بسته‌هاي شروع شده با nhi را ليست كنيم. براي اين منظور دستور خط فرمان ذيل را صادر كنيد:
D:\Test>nuget list nhi
سپس براي دريافت مثلا NHibernate تنها كافي است دستور زير اجرا شود:
D:\Test>nuget install NHibernate

به اين صورت كتابخانه NHibernate ‌به همراه تمام وابستگي‌هاي آن دريافت خواهد شد.

به روز رساني خودكار NuGet
براي به روز رساني برنامه nuget.exe دستور زير را مي‌توان صادر نمود:
D:\Test>NuGet.exe u
و يا جهت فعال سازي به روز رساني‌هاي خودكار افزونه‌ها در VS.NET به منوي زير مراجعه كنيد:
Tools | Options, then Environment | Extension Manager and click "Automatically check for updates to installed extensions."





ادامه دارد ...

۱۳۹۰/۰۱/۱۸

يكي كردن اسمبلي‌ها با استفاده از Eazfuscator


نسخه جديد برنامه Eazfuscator به همراه دو قابليت جالب يكي كردن و همچنين مدفون نمودن اسمبلي‌ها ارائه شده است:

يكي كردن چند اسمبلي با هم
Eazfuscator براي يكي كردن اسمبلي‌ها از برنامه معروف ILmerge استفاده مي‌كند با اين تفاوت كه ديگر نيازي نيست تا پارامترهاي آن‌را تنظيم كرد و بسياري از مسايل را به صورت خودكار مديريت مي‌كند.
جهت فعال كردن اين قابليت، يكي از روش‌هاي كار به صورت زير است:
فايلي به نام ObfuscationSettings.cs را به پروژه خود اضافه كرده، سپس محتويات آن‌را حذف نموده و با چند سطر زير جايگزين و كامپايل كنيد:
using System;
using System.Reflection;

[assembly: Obfuscation(Feature = "merge with file1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "merge with file2.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "merge with file3.dll", Exclude = false)]

همانطور كه ملاحظه مي‌كنيد اين چند سطر حاوي نام اسمبلي‌هايي مي‌باشند كه قرار است با اسمبلي جاري يكي شوند.
سپس اسمبلي جاري را (مي‌خواهد فايل exe باشد يا يك dll ، فرقي نمي‌كند) بر روي Eazfuscator كشيده و رها كنيد. پس از چند لحظه اسمبلي نهايي توليد شده شامل تمام كلاس‌ها و منابع اسمبلي‌هايي خواهد بود كه در فايل ObfuscationSettings.cs ذكر شده‌اند؛ به همراه Obfuscation خودكار آن‌ها.

مدفون كردن اسمبلي‌ها در يك اسمبلي
قابليت ديگر اين برنامه دفن (embedding) چند اسمبلي در اسمبلي نهايي است. براي فعال سازي آن روش كار همانند قبل است با اين تفاوت كه بجاي merge with بايد نوشت embed . براي مثال:
[assembly: Obfuscation(Feature = "embed Common.dll", Exclude = false)]

به اين ترتيب اسمبلي‌هاي ذكر شده پس از رمزنگاري و فشرده شدن به صورت منابع اسمبلي جاري ذخيره خواهند شد. مديريت استفاده از آن‌ها هم خودكار است و نيازي نيست تا كاري در اين مورد صورت گيرد.
براي نمونه برنامه معروف LINQPad از همين روش استفاده مي‌كند و لازم به ذكر است كه ... هنوز كه هنوز است هيچ ك.ر.ك. كارسازي براي فعال سازي قسمت intellisense آن كه رايگان نيست ارائه نشده و تمام وصله‌هاي جديد ارائه شده كار نمي‌كنند ...

تفاوت مدفون كردن با يكي كردن چيست؟
در حالت يكي كردن اسمبلي‌ها، سربار اوليه بارگذاري برنامه همانند روش مدفون سازي وجود ندارد. اما اين سربار آنقدر ناچيز است كه كسي آن‌را احساس نخواهد كرد. مورد ديگر، عدم پشتيباني از روش مدفون سازي در ساير سكوهاي كاري مانند ويندوز فون، Compact Framework و غيره است. اما بايد درنظر داشت كه براي مثال ILMerge روي اسمبلي‌هاي داراي XAML كار نمي‌كند (مطابق مستندات رسمي آن). بنابراين هميشه نمي‌توان از روش يكي سازي استفاده كرد و محدوديت‌هاي خاص خودش را دارد.
در كل روش مدفون سازي به دليل Obfuscation ، فشرده سازي و رمزنگاري همزمان، امنيت بيشتري را نسبت به حالت Obfuscation تنها ارائه مي‌دهد (حداقل شخص "علاقمند" به مطالعه اين نوع اسمبلي‌ها بايد از چند لايه رد شود و تجربه برنامه LINQPad ثابت كرده كه اين روش در مقياس كلان (در انظار عمومي هزاران علاقمند) بسيار موفق بوده است).

۱۳۹۰/۰۱/۱۷

شايعاتي در مورد نسخه‌ي بعدي ASP.NET Webforms


مدتي قبل مطلبي تحت عنوان "What’s coming in the next version of ASP.NET Webforms" منتشر شد (كه نويسنده آن دقيقا مشخص نيست اين اطلاعات را از كجا آورده و همچنين تكذيبيه‌اي هم جايي در مورد آن صادر نشد ...)؛ بنابراين خلاصه‌اي از آن‌را با هم مرور خواهيم كرد:

اخيرا تمام توجه تيم ASP.NET معطوف نسخه‌ي MVC آن شده است؛ هر چند هنوز تعداد قابل توجهي از پروژه‌هاي ASP.NET بر اساس Webforms تهيه شده‌اند يا مي‌شوند. همچنين برخلاف مطالب منتشره در انجمن‌ها يا بلاگ‌هاي مرتبط، تيم ASP.NET ، نگارش Webforms را فراموش نكرده و حتي نگارش 4 آن نيز تعدادي از قابليت‌هاي MVC مانند URL Routing، حجم كمتر ViewState و كنترل بيشتر بر روي HTML نهايي را به همراه داشته است.
به روز رساني‌هاي متوالي MVC (كه اكنون به نگارش 3 رسيده است)، شايد اين تصور را پيش آورده باشد كه ديگر Webforms مرده است! اما مهترين دليل به روز رساني‌هاي دير هنگام نسخه‌ي Webforms ، يكي بودن اسمبلي‌هاي آن با مجموعه‌ي اصلي دات نت فريم ورك است (برخلاف نسخه‌ي MVC كه به صورت افزونه‌اي براي اين مجموعه ارائه شده است).

نسخه‌ي بعدي Webforms (حداقل) شامل تازه‌ها و پيشرفت‌هاي زير خواهد بود:

MVC ModelBinders
در نسخه‌ي MVC مفهومي به نام Model binders وجود دارد. كار آن مقدار دهي مدل برنامه به صورت خودكار بر اساس اطلاعات وارد شده توسط كاربر در رابط كاربري برنامه است. براي مثال در Webforms داريم employee.Name = txtName.Text . به اين معنا كه مقدر Text يك جعبه‌ي متني به نام txtName را به خاصيت Name شيء employee نسبت بده. اينكار (انقياد اطلاعات رابط كاربر به مدل برنامه) با وجود Model binders در نسخه‌ي MVC به صورت خودكار انجام مي‌شود. اين مورد دو مزيت عمده را به همراه خواهد داشت: الف) سادگي و حجم كمتر كد ب) امكان تهيه ساده‌تر unit test جهت قسمت‌هاي مختلف برنامه (چون ديگر به txtName گره نخواهد خورد).
امكانات Model binders ، گفته شده (مطابق مرجع فوق!) كه قرار است جزئي از نگارش بعدي Webforms باشد ... (اميدوارم!)

بهبودهاي حاصل شده در اعتبار سنجي
نسخه‌ي بعدي Webforms شامل پيشرفت‌هاي اعتبارسنجي نسخه‌ي MVC نيز خواهد بود. به اين معنا كه امكان كنارگذاشتن كنترل‌هاي اعتبار سنجي Webforms و استفاده يكپارچه از امكانات jQuery فراهم خواهد شد (به اين صورت ديگر شما محدود به يك سري كنترل از پيش تعيين شده نخواهيد بود و امكان دسترسي به كوهي از افزونه‌هاي اعتبار سنجي jQuery را خواهيد داشت).


CSS Sprites
CSS Sprites كه در نگارش بعدي Webforms پشتيباني خواهد شد (+)، تكنيكي است جهت كاهش تعداد رفت و برگشت‌هاي به سرور با ارائه‌ي يك فايل حاوي تمام تصاوير قرار گرفته شده در يك شبكه يا گريد. به اين صورت بجاي دها يا صدها رفت و برگشت به سرور جهت دريافت تصاوير يك صفحه، تنها يك رفت و برگشت انجام خواهد شد.

۱۳۹۰/۰۱/۱۵

بررسي امنيتي، حين استفاده از jQuery Ajax


چندين نمونه استفاده از jQuery Ajax در ASP.NET Webforms را در اين سايت مي‌توانيد پيدا كنيد؛ براي مثال:

سؤالي كه در تمام اين موارد حائز اهميت است اين مورد مي‌باشد كه "از كجا متوجه شوم وب سرويس مورد استفاده واقعا توسط اسكريپت سايت جاري فراخواني شده و نه توسط يك برنامه‌ي خارجي؟"

در اينجا مي‌توان از سورس‌هاي ASP.NET MVC كمك گرفت : (+). همان متد IsAjaxRequest را در ASP.NET Webforms هم مي‌شود استفاده كرد:

public static bool IsAjaxRequest(this HttpRequestBase request)
{
if (request == null)
{
throw new ArgumentNullException("request");
}

return (request["X-Requested-With"] == "XMLHttpRequest") ||
((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
}

حاصل IsAjaxRequest بايد در ابتداي تمام درخواست‌هاي رسيده بررسي شود. البته بايد دقت داشت كه اين بررسي را به آساني مي‌توان دور زد (چون بر اساس هدرهاي رسيده است)، اما باز هم بهتر از هيچ نوع نظارتي مي‌باشد.

۱۳۹۰/۰۱/۱۴

تازه‌هاي سرويس پك يك VS 2010 - پشتيباني از HTML5 و CSS3


يكي ديگر از قابليت‌هاي جديدي كه پس از نصب سرويس پك يك VS 2010 در اختيار علاقمندان خواهد بود، پشتيباني از HTML5 و CSS3 است.
ابتدا بايد آن‌را فعال كرد. براي اين منظور به مسير ذيل مراجعه كنيد:
Tools -> Option -> Text Editor -> HTML -> Validation


و يا اينكار را از طريق نوار ابزار HTML Source Editing نيز مي‌توان انجام داد:


به اين صورت Intellisense ويرايشگر VS.NET امكان شناسايي و كار ساده‌تر با عناصر HTML 5 را نيز فراهم كرده؛ همچنين استفاده از مواردي مانند موارد ذيل هم مجاز و بدون مشكل خواهد بود:
<input type="email" runat="server" />
<asp:TextBox type="datetime" runat="server" ID="txtDateTime" />

در مورد CSS3 ...
اگر به منوها مراجعه كنيد حتي پس از نصب SP1 نيز به ظاهر خبري از آن نيست! به نظر مدخل رجيستري آن فراموش شده و بايد به صورت دستي اينكار صورت گيرد (+):
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Packages\{A764E895-518D-11d2-9A89-00C04F79EFC3}\Schemas
From there add a Key: Schema 5
Add two string values:
Keyname: File
Value: css30.xml

Keyname: Friendly Name

Value: CSS 3.0

و يا افزونه‌ي CSS 3 Intellisense Schema نيز چنين امكاني را فراهم مي‌سازد (+).
علاوه بر اين، سرويس پك يك برنامه Expression Web نيز قابليت‌هاي ذكر شده را به همراه دارد (+).

قابليت جديد بلاگر؛ ديدهاي پويا


بلاگر اخيرا قابليتي رو به وبلاگ‌هاي خود تحت عنوان ديدهاي پويا اضافه كرده كه به صورت زير قابل دسترسي است:

ادعاهاي مرورگرهاي جديد رو در مورد سرعت پردازش جاوا اسكريپت اينجا به وضوح مي‌توان بررسي كرد. براي مثال سرعت و خصوصا CPU usage فايرفاكس 4 و IE 9 را با آدرس‌هاي فوق آزمايش كنيد.

ماخذ: (+)

۱۳۹۰/۰۱/۱۳

تازه‌هاي سرويس پك يك VS 2010 - حالت جديد كامپايل پروژه‌هاي VB


يكي از مشكلاتي كه استفاده از VB.NET به همراه دارد عدم ارائه VB Runtime assembly در سكوهاي كاري مختلف است؛ براي مثال جهت Windows Phone 7 و XNA. به همين جهت استفاده از اين زبان و امكانات آن در سكوهاي كاري ياد شده با مشكل روبرو بوده و سرويس پك يك VS 2010 با ارائه حالت ويژه‌اي از كامپايل، امكان قرار دادن اسمبلي ياد شده در فايل اجرايي نهايي را ميسر كرده است. براي اين منظور تنها كافي است سطر ذيل به فايل vbproj اضافه گردد:
<VBRuntime>Embed</VBRuntime>
يا بايد به دستورات خط فرمان كامپايل پروژه، سوئيچ زير اضافه شود:
/vbruntime*
بديهي است اين مورد تنها جهت سكوهاي كاري كه به همراه VB Runtime assembly ارائه نشده‌اند مفيد است (و حتي لازم نيست تغييرات فوق را به صورت دستي اعمال كنيد؛ زيرا پروژه‌هاي جديد VS 2010 SP1 مخصوص سكوهاي كاري ياد شده به صورت خودكار اين تغييرات را اعمال خواهند كرد).

ماخذ: (+)

اندكي به روز رساني


ليست RSS وبلاگ‌هاي IT‌ ايراني (خروجي از گوگل‌ريدر براي دوستي كه ايميل زده بود ...) و همچنين فايل خلاصه وبلاگ را به روز كردم كه از طريق منوي سمت راست صفحه قسمت گزيده‌ها، قابل دريافت هستند ( + و + ).


۱۳۹۰/۰۱/۱۲

تازه‌هاي سرويس پك يك VS 2010 ؛ يكپارچگي با IIS Express


در مورد تنظيمات دستي IIS Express كه يك نسخه‌ي سبك IIS 7.5 قابل اجرا بر روي ويندوز XP نيز مي‌باشد، پيشتر در اين سايت مطلبي را مطالعه كرده‌ايد (+). اكنون كه سرويس پك يك VS 2010 ارائه شده (+)، ديگر نيازي به آن تنظيمات دستي نبوده و امكان استفاده يكپارچه و خودكار از اين نسخه‌ي ساده شده IIS 7.5 به شرح زير وجود دارد:

ابتدا نياز است تا هر دو مورد سرويس پك يك VS 2010 و همچنين IIS Express به صورت جداگانه نصب شوند. سپس:

الف) ابتدا از منوي Tools‌ ، گزينه‌ي Options را انتخاب كنيد. در صفحه‌ي باز شده در قسمت Projects and solutions ذيل گزينه‌ي Web projects نياز است تا يكبار مجوز استفاده از IIS express صادر شود:



ب) اكنون بر روي نام پروژه در Solution explorer موجود در Visual studio كليك راست كرده و گزينه‌ي Use IIS Express را انتخاب نمائيد:



به اين صورت تنظيمات لازم به صورت خودكار اعمال خواهد گرديد و جهت مشاهده آن‌ها مي‌توان به خواص پروژه، برگه‌ي Web مراجعه كرد:



نكته مهم:
نسخه‌ي RTM ويژوال استوديوي 2010 تنظيمات فوق را كه در تصوير ملاحظه مي‌كنيد، ندارد. به عبارتي پس از اعمال تغييرات فوق بايد دقت داشت سايريني كه قرار است از پروژه‌ي شما استفاده كنند نيز بايد پيشنيازهاي ذكر شده را رعايت نمايند و يا جهت توزيع سورس مي‌توان مجددا بر روي نام پروژه كليك راست كرده و اينبار گزينه‌ي Use Visual Studio Development Server قديمي را انتخاب كرد.