۱۳۸۸/۰۲/۱۰

محدود كردن دسترسي به اس كيوال سرور بر اساس IP


عموما محدود كردن دسترسي بر اساس IP بهتر است بر اساس راه حل‌هايي مانند فايروال، IPSec و يا RRAS IP Filter صورت گيرد كه جزو بهينه‌ترين و امن‌ترين راه حل‌هاي ممكن هستند.
در ادامه قصد داريم اين محدوديت را با استفاده از امكانات خود اس كيوال سرور انجام دهيم (بلاك كردن كاربران بر اساس IP هاي غيرمجاز). مواردي كه در ادامه ذكر خواهند شد در مورد اس كيوال سرور 2005 ، سرويس پك 2 به بعد و يا اس كيوال سرور 2008 صادق است.
اس كيوال سرور اين قابليت را دارد كه مي‌توان بر روي كليه لاگين‌هاي صورت گرفته در سطح سرور تريگر تعريف كرد. به اين صورت مي‌توان تمامي لاگين‌ها را براي مثال لاگ كرد (جهت بررسي مسايل امنيتي) و يا مي‌توان هر لاگيني را كه صلاح ندانستيم rollback نمائيم (ايجاد محدوديت روي لاگين در سطح سرور).

لاگ كردن كليه لاگين‌هاي صورت گرفته به سرور

ايجاد جدولي براي ذخيره سازي اطلاعات لاگين‌ها:

USE [master]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Logging](
[id] [int] IDENTITY(1,1) NOT NULL,
[LogonTime] [datetime] NULL,
[LoginName] [nvarchar](max) NULL,
[ClientHost] [varchar](50) NULL,
[LoginType] [varchar](100) NULL,
[AppName] [nvarchar](500) NULL,
[FullLog] [xml] NULL,
CONSTRAINT [PK_IP_Log] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Logging] ADD CONSTRAINT [DF_IP_Log_LogonTime] DEFAULT (getdate()) FOR [LogonTime]
GO

در ادامه يك تريگر لاگين را جهت ذخيره سازي اطلاعات كليه لاگين‌ها به سرور ايجاد مي‌نمائيم:
USE [master]
GO

CREATE TRIGGER LogonTrigger
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @data XML
SET @data = EVENTDATA()

INSERT INTO [Logging]
(
[LoginName],
[ClientHost],
[LoginType],
[AppName],
[FullLog]
)
VALUES
(
@data.value('(/EVENT_INSTANCE/LoginName)[1]', 'nvarchar(max)'),
@data.value('(/EVENT_INSTANCE/ClientHost)[1]', 'varchar(50)'),
@data.value('(/EVENT_INSTANCE/LoginType)[1]', 'varchar(100)'),
APP_NAME(),
@data
)
END
اكنون براي مثال از آخرين 100 لاگين انجام شده، به صورت زير مي‌توان گزارشگيري كرد:

SELECT TOP 100 * FROM [master].[dbo].[Logging] ORDER BY id desc
و بديهي است در تريگر فوق مي‌توان روي هر كدام از آيتم‌هاي دريافتي مانند ClientHost و غيره فيلتر ايجاد كرد و تنها موارد مورد نظر را ثبت نمود.

محدود كردن كاربران بر اساس IP

ClientHost ايي كه در رخ‌داد لاگين فوق بازگشت داده مي‌شود همان IP كاربر راه دور است. براي فيلتر كردن IP هاي غيرمجاز، ابتدا در ديتابيس مستر يك جدول براي ذخيره سازي IP هاي مجاز ايجاد مي‌كنيم و IP هاي كليه كلاينت‌هاي معتبر خود را در آن وارد مي‌كنيم:

USE [master]
GO
CREATE TABLE [IP_RESTRICTION](
[ValidIP] [varchar](15) NOT NULL,
CONSTRAINT [PK_IP_RESTRICTION] PRIMARY KEY CLUSTERED
(
[ValidIP] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

سپس تريگر لاگين ما براي منع كاربران غيرمجاز بر اساس IP ، به صورت زير خواهد بود:

USE [master]
GO

CREATE TRIGGER [LOGIN_IP_RESTRICTION]

ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @host NVARCHAR(255);
SET @host = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]', 'nvarchar(max)');

IF (
NOT EXISTS(
SELECT *
FROM MASTER.dbo.IP_RESTRICTION
WHERE ValidIP = @host
)
)
BEGIN
ROLLBACK;
END
END;
اخطار مهم!
تريگر فوق خطرناك است! ممكن است خودتان هم ديگر نتوانيد لاگين كنيد!! (حتي با اكانت ادمين)
بنابراين قبل از لاگين حتما IP لوكال و يا ClientHost لوكال را هم وارد كنيد.
اگر گير افتاديد به صورت زير مي‌شود رفع مشكل كرد:
تنها حالتي كه تريگر لاگين را فعال نمي‌كند Dedicated Administrator Connection است يا DAC هم به آن گفته مي‌شود. به صورت پيش فرض براي ايجاد اين اتصال اختصاصي بايد به كامپيوتري كه اس كيوال سرور بر روي آن نصب است به صورت لوكال لاگين كرد و سپس در خط فرمان دستور زير را صادر كنيد (حرف A آن بايد بزرگ باشد):

C:\>sqlcmd -A -d master -q "insert into IP_RESTRICTION(validip) values('<local machine>')"
به اين صورت local machine به جدول IP هاي مجاز اضافه شده و مي‌توانيد لاگين كنيد!
اين نوع تريگرها در قسمت server objects در management studio ظاهر مي‌شوند.

۱۳۸۸/۰۲/۰۸

استفاده از Google Analytics API در دات نت فريم ورك


بالاخره گوگل كار تهيه API مخصوص ابزار Analytics خود را به پايان رساند و اكنون برنامه نويس‌ها مي‌توانند همانند ساير سرويس‌هاي گوگل از اين ابزار گزارشگيري نمايند.
خلاصه كاربردي اين API ، دو صفحه تعاريف پروتكل (+) و ريز مواردي (+) است كه مي‌توان گزارشگيري نمود.
هنوز كتابخانه google-gdata جهت استفاده از اين API به روز رساني نشده است؛ بنابراين در اين مقاله سعي خواهيم كرد نحوه كار با اين API را از صفر بازنويسي كنيم.
مطابق صفحه تعاريف پروتكل، سه روش اعتبارسنجي جهت دريافت اطلاعات API معرفي شده است كه در اينجا از روش ClientLogin كه مرسوم‌تر است استفاده خواهيم كرد.
مطابق مثالي كه در آن صفحه قرار دارد، اطلاعاتي شبيه به اطلاعات زير را بايد ارسال و دريافت كنيم:

POST /accounts/ClientLogin HTTP/1.1
User-Agent: curl/7.15.1 (i486-pc-linux-gnu) libcurl/7.15.1
OpenSSL/0.9.8a zlib/1.2.3 libidn/0.5.18
Host: www.google.com
Accept: */*
Content-Length: 103
Content-Type: application/x-www-form-urlencoded
accountType=GOOGLE&Email=userName@google.com&Passwd=myPasswrd&source=curl-tester-1.0&service=analytics

HTTP/1.1 200 OK
Content-Type: text/plain
Cache-control: no-cache
Pragma: no-cache
Date: Mon, 02 Jun 2008 22:08:51 GMT
Content-Length: 497
SID=DQ...
LSID=DQAA...
Auth=DQAAAG8...
در دات نت فريم ورك، اين‌كار را به صورت زير مي‌توان انجام داد:
        string getSecurityToken()
{
if (string.IsNullOrEmpty(Email))
throw new NullReferenceException("Email is required!");

if (string.IsNullOrEmpty(Password))
throw new NullReferenceException("Password is required!");

WebRequest request = WebRequest.Create("https://www.google.com/accounts/ClientLogin");
request.Method = "POST";

string postData = "accountType=GOOGLE&Email=" + Email + "&Passwd=" + Password + "&service=analytics&source=vahid-testapp-1.0";
byte[] byteArray = Encoding.ASCII.GetBytes(postData);

request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

using (Stream dataSt = request.GetRequestStream())
{
dataSt.Write(byteArray, 0, byteArray.Length);
}

string auth = string.Empty;
using (WebResponse response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd().Trim();
string[] tokens = responseFromServer.Split('\n');
foreach (string token in tokens)
{
if (token.StartsWith("SID="))
continue;

if (token.StartsWith("LSID="))
continue;

if (token.StartsWith("Auth="))
{
auth = token.Substring(5);
}
else
{
throw new AuthenticationException("Error authenticating Google user " + Email);
}
}
}
}
}

return auth;

}

همانطور كه ملاحظه مي‌كنيد به آدرس https://www.google.com/accounts/ClientLogin ، اطلاعات postData با متد POST ارسال شده (دقيقا مطابق توضيحات گوگل) و سپس از پاسخ دريافتي، مقدار نشانه Auth را جدا نموده و در ادامه عمليات استفاده خواهيم كرد. وجود اين نشانه در پاسخ دريافتي به معناي موفقيت آميز بودن اعتبار سنجي ما است و مقدار آن در طول كل عمليات بايد نگهداري شده و مورد استفاده مجدد قرار گيرد.
سپس مطابق ادامه توضيحات API گوگل بايد ليست پروفايل‌هايي را كه ايجاد كرده‌ايم پيدا نمائيم:

string getAvailableProfiles(string authToken)
{
return fetchPage("https://www.google.com/analytics/feeds/accounts/default", authToken);
}

متد fetchPage را از پيوست اين مقاله مي‌توانيد دريافت نمائيد. خروجي يك فايل xml است كه با انواع و اقسام روش‌هاي موجود قابل آناليز است، از كتابخانه‌هاي XML دات نت گرفته تا Linq to xml و يا روش serialization كه من روش آخر را ترجيح مي‌دهم.
مرحله بعد، ساخت URL زير و دريافت مجدد اطلاعات مربوطه است:
            string url = string.Format("https://www.google.com/analytics/feeds/data?ids={0}&metrics=ga:pageviews&start-date={1}&end-date={2}", id, from, to);
return fetchPage(url, auth);
و سپس آناليز اطلاعات xml دريافتي، جهت استخراج تعداد بار مشاهده صفحات يا pageviews استفاده شده در اين مثال. ليست كامل مواردي كه قابل گزارشگيري است، در صفحه Dimensions & Metrics Reference گوگل ذكر شده است.

فايل‌هاي كلاس‌هاي مورد استفاده را از اينجا دريافت نمائيد.‌

مثالي در مورد نحوه استفاده از آن:
            CGoogleAnalytics cga = new CGoogleAnalytics
{
Email = "username@gmail.com",
Password = "password",
From = DateTime.Now.Subtract(TimeSpan.FromDays(1)),
To = DateTime.Now.Subtract(TimeSpan.FromDays(1))
};
List<CGoogleAnalytics.SitePagePreviews> pagePreviews =
cga.GetTotalNumberOfPageViews();

foreach (var list in pagePreviews)
{
//string site = list.Site;
//int pw = list.PagePreviews;
}

۱۳۸۸/۰۲/۰۷

sp_send_dbmail و ارسال ايميل فارسي


نكته‌ي كوچكي در مورد ارسال ايميل فارسي توسط رويه ذخيره شده سيستمي sp_send_dbmail اس كيوال سرور وجود دارد كه شبيه به insert داده‌هاي فارسي در ديتابيسي است كه پس از ثبت، به صورت ؟؟؟ ذخيره مي‌شوند. (اين مورد با تنظيم collation تقريبا قابل حل است)
اگر هنگام ثبت، collation عربي يا فارسي (در اس كيوال سرور 2008) انتخاب شود، مشكلي در ثبت نخواهد بود.
اگر به collation اهميت نمي‌دهيد بايد اس كيوال سرور را مجبور كرد كه داده را يونيكد ذخيره كند و اينكار با اضافه كردن يك N به ابتداي رشته صورت مي‌گيرد و همچنين انتخاب نوع داده‌هاي n دار مانند nvarchar و امثال آن (n در اينجا به معناي national و اجبار آن مي‌باشد):

Insert into tblTest(f1,f2) values(1,N'متن فارسي')
دقيقا همين نكته هم درباره‌ي ارسال ايميل از طريق اس كيوال سرور صادق است. اگر N به ابتداي رشته اضافه نشود، رشته ارسالي را با فرمت ANSI ارسال مي‌كند و داده‌هاي يونيكد متن تخريب خواهند شد؛ مثلا چيزي شبيه به حالت زير:

<div align="center"><table border="1" width="95%" dir="rtl" cellspacing="0" cellpadding="0" style="font-family: Tahoma; font-size: 8pt" bordercolor="#660066"><tr><td bgcolor="#FFF9FF"><blockquote><p align="justify"><br>????? ????? ?<br>???? ???? ? ????? ?????? ??? ?? ????? ????? ?????. ???? ??? ???? ???? ????? ????? ????? ????? ????? ??? ??? ???? ???? ?????? ? ???? ?? ????? ???? ???? ??? ????? ??????.<br>???? ??? ????? ???? ?? ?????? ???? ????? ?????? ????? ? ?? ???? ???????? ????? ???? ???? ???? ?????? ???? ???? ??? ?? ????? ????.</blockquote></td></tr></table></div>
اين مشكل به صورت زير قابل حل است:

DECLARE @msg NVARCHAR(max)
SET @msg=N'متن فارسي'
براي ردگيري وضعيت ايميل‌هاي ارسالي هم مي‌توان از كوئري‌هاي زير استفاده نمود:

SELECT * from sysmail_allitems
SELECT * from sysmail_faileditems
SELECT * from sysmail_event_log

۱۳۸۸/۰۲/۰۶

كش كردن اطلاعات غير پويا در ASP.Net - قسمت دوم


قسمت قبل به IIS7‌ اختصاص داشت كه شايد براي خيلي‌ها كاربرد نداشته باشد خصوصا اينكه برنامه نويس‌ها ترجيح مي‌دهند به روش‌هايي روي بياورند كه كمتر نياز به دخالت مدير سرور داشته باشد؛ يا زمانيكه سايت شما بر روي يك هاست اينترنتي قرار گرفته است عملا شايد دسترسي خاصي به تنظيمات IIS نداشته باشيد (مگر اينكه يك هاست اختصاصي را تهيه كنيد).
براي IIS6 و ماقبل از آن و حتي بعد از آن!، حداقل دو روش براي كش كردن اطلاعات استاتيك وجود دارد:

الف) استفاده از web resources معرفي شده در ASP.Net 2.0 به بعد
در مورد نحوه‌ي تعريف و بكارگيري web resources مي‌توان به مقاله "تبديل پلاگين‌هاي jQuery‌ به كنترل‌هاي ASP.Net" رجوع كرد.


همانطور كه در شكل فوق نيز ملاحظه مي‌كنيد، هدر مربوط به مدت زمان منقضي شدن كش سمت كلاينت يك web resource توسط موتور ASP.Net به صورت خودكار به سال 2010 تنظيم شده است و اين مقدار خالي نيست.

ب) افزودن اين هدر به صورت دستي

براي اين منظور بايد در نحوه‌ي ارائه فايل‌هاي استاتيك دخالت كنيم و اين‌كار را با استفاده از يك generic handler مي‌توان انجام داد.


كد اين generic handler مي‌تواند به صورت زير باشد:

using System;
using System.IO;
using System.Web;
using System.Web.Services;
using System.Reflection;

namespace test1
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class cache : IHttpHandler
{

private static void cacheIt(TimeSpan duration)
{
HttpCachePolicy cache = HttpContext.Current.Response.Cache;

FieldInfo maxAgeField = cache.GetType().GetField("_maxAge", BindingFlags.Instance | BindingFlags.NonPublic);
maxAgeField.SetValue(cache, duration);

cache.SetCacheability(HttpCacheability.Public);
cache.SetExpires(DateTime.Now.Add(duration));
cache.SetMaxAge(duration);
cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
}

public void ProcessRequest(HttpContext context)
{
string file = context.Request.QueryString["file"];
if (string.IsNullOrEmpty(file))
{
return;
}

string contetType = context.Request.QueryString["contetType"];
if (string.IsNullOrEmpty(contetType))
{
return;
}

context.Response.Write(File.ReadAllText(context.Server.MapPath(file)));

//Set the content type
context.Response.ContentType = contetType;

// Cache the resource for 30 Days
cacheIt(TimeSpan.FromDays(30));
}

public bool IsReusable
{
get
{
return false;
}
}
}
}
توضيحات:
اين generic handler دو كوئري استرينگ را دريافت مي‌كند؛ file جهت دريافت نام فايل و contetType جهت مشخص سازي نوع محتوايي كه بايد سرو شود؛ مثلا جاوا اسكريپت يا استايل شيت و امثال آن. سپس زمانيكه محتوا را Response.Write مي‌كند، هدر مربوط به كش شدن آن‌را نيز به 30 روز تنظيم مي‌نمايد.
تابع مربوط به كش كردن اطلاعات از مقاله ASP.NET Ajax Under-the-hood Secrets استخراج شد.

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

<link type="text/css" href="cache.ashx?v=1&file=site.css&contetType=text/css" rel="Stylesheet" />
هر زمانيكه كه فايل site.css درخواست مي‌شود، بايد از فيلتر ما عبور كند و سپس ارائه گردد. در اين حين، هدر مربوط به مدت زمان كش شدن سمت كلاينت به آن اضافه مي‌شود. از كوئري استرينگ مربوط v هم جهت به روز رساني‌هاي بعدي استفاده مي‌شود تا اگر تغييري را اعمال كرديم، كلاينت حتما با توجه به آدرس جديد، محتويات جديد را يكبار ديگر دريافت كند. (مرورگر آدرس‌هاي مشابه را در صورتيكه هدر مربوط به كش شدن آن‌ها تنظيم شده باشد، از كش خواهد خواند و كاري به آخرين تغييرات شما در سرور ندارد)

روش استفاده در مورد فايل‌هاي JS
<script type="text/javascript" src="cache.ashx?v=1&file=js/jquery-1.3.2.min.js&contetType=application/x-javascript"></script>
اكنون اگر سايت را مجددا با افزونه YSlow بررسي كنيم، مي‌توان اين هدر جديد را مشاهده كرد:



۱۳۸۸/۰۲/۰۵

خواندني‌هاي 5 ارديبهشت


  • - پيش نمايش MySQL 5.4 توسط شركت سان ارائه شد. اين شركت مدعي است كه response times آن 90 درصد نسبت به نگارش قبلي سريعتر شده (+ و +)
  • - سايت GeoCities بسته شد. سايت Google pages هم قرار است تا يكي دو ماه ديگر بسته شود (به عبارت ديگر شكل و شمايل اين وبلاگ در آن تاريخ كلا به هم خواهد ريخت چون فايل‌هاي سايت را در آن‌جا هاست كرده‌ام ... به دريا هم كه برويم ...)

۱۳۸۸/۰۲/۰۴

كش كردن اطلاعات غير پويا در ASP.Net - قسمت اول


در مورد افزونه YSlow افزونه Firebug فايرفاكس پيشتر صحبت شد. اين افزونه پس از آناليز يك سايت، پيشنهاداتي را نيز جهت بهبود سرعت، ارائه مي‌دهد.





همانطور كه در شكل بالا مشخص است، عناصري مانند css و js ، قسمت expires اشان (تاريخ منقضي شدن كش آن‌ها در سمت كلاينت) خالي است و پيشنهاد داده كه به هر كدام از اين عناصر، هدر مخصوص مشخص سازي مدت زمان كش شدن در سمت كلاينت اضافه شود.
ASP.Net در مورد كش كردن اطلاعات صفحات پويا به اندازه‌ي كافي امكانات در اختيار برنامه نويس قرار مي‌دهد اما در مورد اضافه كردن اين هدر جهت يك فايل css غير پويا شايد نتوان مطلب خاصي را يافت.
در IIS7 امكانات ويژه‌اي براي اين منظور در نظر گرفته شده كه نحوه استفاده از آن در ASP.Net به صورت زير است:
فايل وب كانفيگ سايت را باز كرده و به قسمت system.webServer چند سطر زير را اضافه كنيد:

<staticContent>
<clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
</staticContent>

اين مورد فقط مختص به IIS7 است و بر روي نگارش‌هاي پايين‌تر كار نمي‌كند.
با اين كار، تاريخ منقضي شدن هر آنچه كه توسط موتور ASP.net سرو نمي‌شود به سال 2020 تنظيم خواهد شد. (كليه محتواي غيرپوياي سايت، اعم از تصاوير، فايلهاي css ، js و غيره)
پس از اين تنظيم مجددا YSlow را اجرا كرده و Performance Grade ايي را كه نمايش مي‌دهد بررسي نمائيد.

بديهي است اگر يكي از فايل‌هاي css يا js شما تغيير كند، كلاينت، اطلاعات جديدي را تا سال 2020 دريافت نمي‌كند. براي حل اين مشكل يك كوئري استرينگ ساده به انتهاي لينك مربوط به css‌ يا js‌ خود اضافه كنيد تا URL جديد با URL قبلي آن يكسان نباشد (اين كوئري استرينگ تاثيري روي محتواي ايستاي ما ندارد). به اين صورت اين آدرس جديد، مجددا دريافت شده و تا سال 2020 كش خواهد شد.

نكته:
اعمال تنظيم فوق، در IIS7 ويندوز سرور 2008 مجاز است؛ اما در IIS7 ويندوز ويستا قفل شده است و قابل override نيست. براي تغيير آن، فايل زير را پيدا كنيد:
open %systemroot%\System32\inetsrv\config\applicationHost.config
و در آن سطر
<section name="staticContent" overrideModeDefault="Deny" />
را به صورت زير تغيير دهيد تا مجاز به اعمال تغييرات شويد:
<section name="staticContent" overrideModeDefault="Allow" />
در قسمت بعد در مورد نگارش‌هاي پايين‌تر IIS توضيح داده خواهد شد.


مآخذ:
YSlow: Add expires header to images in IIS 7
IIS7: How to set cache control for static content?

۱۳۸۸/۰۲/۰۳

كنترل FileUpload داخل ASP.Net Ajax UpdatePanel


كنترل FileUpload زمانيكه داخل Ajax UpdatePanel قرار گيرد كار نمي‌كند و خاصيت Hasfile آن در اين حالت هميشه false بر مي‌گرداند، زيرا اين كنترل براي كار كردن نياز به post back كامل دارد. براي معرفي اين post back داخل update panel ، بايد يك تريگر به نام postbacktrigger را افزود و سپس ControlID آن‌را مساوي كنترلي قرار داد كه جهت ارسال فايل به سرور مشخص كرده‌ايم.
يك مثال:
<asp:UpdatePanel runat="server" id="UpdatePanel1">
<ContentTemplate>
<asp:FileUpload runat="server" id="FileUpload1" />
<asp:Button runat="server" id="btnSubmit" Text="Upload" />
</ContentTemplate>
<Triggers>
<asp:postbacktrigger ControlID="btnSubmit" />
</Triggers>
</asp:UpdatePanel>
اين تريگر عمليات post back‌ را سبب خواهد شد و اكنون عمليات ارسال فايل به سرور صحيح كار خواهد كرد.


۱۳۸۸/۰۲/۰۱

مقايسه ساختاري دو ديتابيس SQL Server


يكي از مواردي كه در محيط كاري زياد پيش مي‌آيد بحث همگام نبودن ديتابيس توسعه با ديتابيس كاري است.
منظور از ديتابيس توسعه، همان ديتابيسي است كه براي برنامه نويسي و آزمايش از آن استفاده مي‌شود و ديتابيس كاري هم مشخص است (براي مثال بر روي يك سرور در اينترانت داخلي يك شركت و يا بر روي يك سرور اينترنتي قرار دارد). عادت‌هاي مختلفي هم اين‌جا ممكن است وجود داشته باشد، براي مثال تغييرات جديد بر روي ديتابيس كاري اعمال شود و سپس فراموش شود كه همان‌ها نيز بايد به ديتابيس توسعه هم اعمال شوند تا در تغييرات بعدي براي آزمايش دچار مشكل نشويم و برعكس. بعد از يك مدت هم تبديل به كابوس مي‌شود؛ نمي‌دانيم الان ديتابيس كاري جديدتر است يا ديتابيس توسعه؛ و يا اينكه كلا دو ديتابيس مفروض چه تفاوت‌هاي ساختاري با هم دارند (بديهي است بحث ديتا در اينجا در درجه‌ي اول اهميت قرار ندارد). فرصت اين هم وجود ندارد كه تك تك جداول، ويووها، رويه‌هاي ذخيره شده و خلاصه تمامي اشياء مرتبط را بررسي كنيم كه چه اختلافي با هم دارند. اينجا مستندات هم كمكي نخواهند كرد چون صحبت از يك جدول با 5 فيلد در ميان نيست كه موارد را سريع و به صورت دستي تطابق دهيم. همچنين اين مشكل عموما زماني رخ مي‌دهد كه يكي از دو طرف در حال حاضر مستندات كامل و به روزي ندارد. اكنون چه بايد كرد؟
اولين فكري كه به ذهن خطور مي‌كند مراجعه به ابزارهاي جانبي است (مثلا Red Gate's SQL Compare چند صد دلاري) غافل از اينكه خود Visual studio 2008 (نگارش‌هاي تيمي و ديتابيسي) اين قابليت را نيز ارائه مي‌دهد (شكل زير).


پس از انتخاب new schema comparison ، در صفحه‌اي كه ظاهر مي‌شود، بر روي new connection كليك كرده و ديتابيس‌هاي مبداء و مقصد را جهت مقايسه ساختاري انتخاب نمائيد و سپس بر روي دكمه Ok كليك كنيد.


اگر اس كيوال سرور 2008 را نصب كرده باشيد، با پيغام زير روبرو خواهيد شد:


براي رفع اين مشكل بايد بسته به روز رساني زير را نصب كرد تا اين نگارش نيز پشتيباني شود:

(براي نصب حتما بايد SP1 مربوط به VS.Net 2008 پيشتر نصب شده باشد)

پس از كليك بر روي دكمه Ok، كار آناليز دو ديتابيس شروع شده و تفاوت‌ها گزارش داده مي‌شوند:


همچنين جهت سهولت كار، اسكريپت T-SQL ايي را نيز به نام schema update script توليد مي‌كند كه با اجراي آن به سادگي كار به روز رساني ديتابيس مقصد صورت خواهد گرفت.


در پايان يا مي‌توان اسكريپت توليد شده را ذخيره كرد و در زماني دلخواه اجرا و اعمال نمود و يا مي‌توان بلافاصله بر روي دكمه write updates كه در نوار ابزار ظاهر شده است كليك كرد تا ديتابيس مقصد از لحاظ ساختاري با ديتابيس مبداء يكي شود.



۱۳۸۸/۰۱/۳۱

اس كيوال سرور 2008 و عملگرهاي C مانند


اگر با زبان C و مشتقات آن آشنايي داشته باشيد، حتما با عملگرهاي تركيبي آن‌ها كه جهت خلاصه نويسي بكار مي‌روند، نيز كار كرده‌ايد. براي مثال:

int i =5;
i += 15; // i = i + 15;

اس كيوال سرور 2008 نيز از اينگونه عملگرها پشتيباني به عمل مي‌آورد. براي نمونه:
DECLARE @x1 int = 27;
SET @x1 += 2 ;
SELECT @x1 AS Added_2;
در دستورات T-SQL فوق دو نكته قابل توجه است:
الف) امكان تعريف و مقدار دهي همزمان يك متغير (مقدار دهي همزمان با تعريف، تا قبل از اس كيوال سرور 2008 پشتيباني نمي‌شد)
ب) امكان استفاده از عملگرهاي C مانند در عبارات T-SQL

ليست اين عملگرهاي جديد به شرح زير است:
+= (Add EQUALS) (Transact-SQL)
-= (Subtract EQUALS) (Transact-SQL)
*= (Multiply EQUALS) (Transact-SQL)
/= (Divide EQUALS) (Transact-SQL)
%= (Modulo EQUALS) (Transact-SQL)
&= (Bitwise AND EQUALS) (Transact-SQL)
^= (Bitwise Exclusive OR EQUALS) (Transact-SQL)
|= (Bitwise OR EQUALS) (Transact-SQL)

۱۳۸۸/۰۱/۲۹

چگونه بررسي كنيم smtp server مورد نظر ما كار مي‌كند؟


گاهي براي عيب يابي عدم ارسال ايميل نياز هست بررسي كنيم آيا smtp server مورد نظر جواب مي‌دهد؟ آيا در شبكه به آن دسترسي داريم؟ يا براي مثال آيا ISP ما اين عمليات را بلاك نكرده است؟

مثال الف) بررسي دسترسي به gmail
در خط فرمان تايپ كنيد، telnet و سپس دكمه enter را فشار دهيد.
در ادامه سطر زير را وارد نمائيد و enter كنيد:
open smtp.gmail.com 587
اگر پيغام زير را براي مدتي طولاني دريافت كرديد، يعني به ميل سرور گوگل دسترسي نداريد و به هر علتي بلاك شده است:
Connecting To smtp.gmail.com...
در غيراينصورت يا يك صفحه مشكي خالي را دريافت خواهيد كرد و يا يك پيغام معمولي؛ پس از آن مجددا در خط فرمان وارد كنيد helo و سپس enter (دقت كنيد helo يك l دارد اينجا).
صفحه زير را بايد مشاهده نمائيد:



مثال ب) بررسي دسترسي به ميل سرور لوكال
همانند مثال قبل است فقط قسمت open آن به شكل زير تغيير خواهد كرد:
open localhost 25
و يا
open 127.0.0.1 25

۱۳۸۸/۰۱/۲۸

آشنايي با ويژگي DebuggerDisplay در VS.Net


كلاس ساده زير را در نظر بگيريد:

using System.Collections.Generic;

namespace testWinForms87
{
class CDbgDisplay
{
public struct Person
{
public string Name;
public int Id;
}

public static List<Person> GetData()
{
List<Person> data = new List<Person>();
for (int i = 0; i < 40; i++)
data.Add(new Person { Name = "P" + i, Id = i });
return data;
}
}

}
فرض كنيد مي‌خواهيم هنگام فراخواني متد GetData بر روي data يك break point قرار دهيم تا بتوان محتواي آن‌را در VS.Net مشاهده كرد (شكل زير).


همانطور كه مشاهده مي‌كنيد، خروجي پيش فرض آنچنان دلپذير نيست. به ازاي هر كدام از 40 موردي كه در اين ليست قرار دارد، يكبار بايد آن آيتم مورد نظر را انتخاب كرد، بر روي علامت + كنار آن كليك نمود و سپس محتواي آن‌را مشاهده كرد.
براي سفارشي سازي خروجي ديباگر ويژوال استوديو مي‌توان از ويژگي DebuggerDisplay استفاده كرد. سطر زير را به بالاي ساختار person اضافه كنيد:
[DebuggerDisplay("Name:{Name},Id={Id}")]

اكنون يكبار ديگر بر روي data يك break point قرار داده و نتيجه را ملاحظه نمائيد (شكل زير):


بهتر شد؛ نه؟!
در اينجا يك رشته را با محتواي فيلدهاي ساختار Person ايجاد كرديم و سپس خروجي پيش فرض ديباگر VS.Net را با آن جايگزين نموديم. ويژوال استوديو محتواي عبارت داخل {} را با مقدار آن فيلد جايگزين خواهد كرد.

۱۳۸۸/۰۱/۲۷

خواندني‌هاي 27 فروردين


  • اولين محصول نگارش 2010 مايكروسافت براي دريافت، exchange server 2010 beta (ميل سرور)
مطابق سايت رسمي فوق اينطور به نظر ميرسه كه مايكروسافت قصد جدا سازي برنامه‌ها و مفهوم Office Web applications را از SharePoint دارد (هر چند مانند سابق توانايي يكپارچگي بي‌نظيري بين آفيس و شپرپوينت وجود خواهد داشت)
ساير اولين سري محصولات 2010 ، شامل Microsoft Office 2010 ، Microsoft Visio 2010 و Microsoft Project 2010 خواهند بود.
  • ليستي از 70+145 برگه مرجعه (+ و +)
  • مجموعه انتشارات مايكروسافت 25 امين سالگرد تاسيس خود را جشن مي‌گيرد. به همين منظور دو كتاب زير را به رايگان براي دريافت قرار داده‌اند:

عنواني رو كه براش انتخاب كردن جالب است "the world's most advanced open source database"

۱۳۸۸/۰۱/۲۶

ليست شماره نگارش‌هاي دات نت فريم ورك تا اين تاريخ


از زمانيكه دات نت فريم ورك ارائه شده (حدودا 8 سال يا بيشتر اگر بتاي آن‌را هم به حساب بياوريم به سال 2000 بر مي‌گردد)، نگارش‌هاي متفاوتي تا به امروز در اختيار عموم قرار گرفته اند.
جدول زير اين موارد را تا اين تاريخ ليست كرده و شماره نگارش دقيق آن‌ها را نيز بر مي‌شمارد:

.NET version

Actual version

3.5 SP1

3.5.30729.1

3.5

3.5.21022.8

3.0 SP2

3.0.4506.2152

3.0 SP1

3.0.4506.648

3.0

3.0.4506.30

2.0 SP2

2.0.50727.3053

2.0 SP1

2.0.50727.1433

2.0

2.0.50727.42

1.1 SP1

1.1.4322.2032

1.1 SP1 (in 32 bit version of Windows 2003)

1.1.4322.2300

1.1

1.1.4322.573

1.0 SP3

1.0.3705.6018

1.0 SP2

1.0.3705.288

1.0 SP1

1.0.3705.209

1.0

1.0.3705.0


براي بدست آوردن شماره نگارش‌هاي نصب شده بر روي يك كامپيوتر متاسفانه راه ساده‌‌اي وجود ندارد. امكاناتي هم كه خود دات نت فريم ورك به صورت ذاتي ارائه مي‌دهد به صورت زير است:

class NetVersion
{
public static string Version
{
get
{
return Environment.Version + "\n" +
Environment.OSVersion;
}
}
}

كه خروجي آن فقط آخرين نگارش CLR را شامل مي‌شود.
براي مثال روي ويندوز اكس پي سرويس پك 3 با دات نت فريم ورك سه و نيم، سرويس پك يك خواهيم داشت:
2.0.50727.3053
Microsoft Windows NT 5.1.2600 Service Pack 3
كه عدد نگارش ارائه شده با دات نت فريم ورك 2 سرويس پك 2 تطابق دارد. به عبارت ديگر آخرين نگارش CLR هنوز همان 2 است و موارد ديگر (مثل wf و wcf و ...) فقط يك سري افزونه براي اين هسته به شمار مي‌روند.
خوبي اين روش هم اين است كه اگر در يك هاست اينترنتي قصد داشتيد شماره نگارش دات نت فريم ورك سرور را بررسي كنيد، بدون مشكل پاسخ خواهد داد. براي مثال اگر به دات نت فريم ورك 2 سرويس پك 2 رسيديد، يعني دات نت فريم ورك سه و نيم، سرويس پك يك حتما روي سرور نصب است، چون اين دو با هم ارائه شده‌اند و به صورت مجزا ارائه نشده‌اند.

براي بدست‌ آوردن ليست دات نت فريم ورك‌هاي مختلف بايد به رجيستري ويندوز مراجعه كرد. مسيرهاي:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\User Agent\Post Platform


اين روش يا حتي ليست كردن فولدرهاي نصب شد در مسير C:\WINDOWS\Microsoft.NET\Framework نيز شماره نگارش كامل را ارائه نمي‌دهند. تنها راه باقيمانده مراجعه به فايل mscorlib.dll هر پوشه و بررسي نگارش آن است:



اينكار را با برنامه نويسي به صورت زير مي‌توان انجام داد:

public static string MscorlibVersion
{
get
{
//using System.Diagnostics;
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(
Environment.GetEnvironmentVariable("windir") +
@"\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll");
return myFileVersionInfo.ProductVersion;
}
}

۱۳۸۸/۰۱/۲۵

يافتن ليست اسمبلي‌هاي ارجاعي


اگر برنامه‌ي شما براي مثال با SMO مربوط به اس كيوال سرور 2008 كامپايل شود، روي سروري با SQL Server 2005 كار نخواهد كرد و پيغام مي‌دهد كه نگارش 10 اسمبلي Microsoft.SqlServer.Management.Sdk.Sfc يافت نشد.
يك راه حل آن، نصب Microsoft SQL Server 2008 Management Objects بر روي سرور است، يا راه حل دوم، پيدا كردن اسمبلي‌هايي كه برنامه به آن‌ها ارجاع دارد و كپي كردن آن‌ها كنار فايل اجرايي برنامه در سرور. (درست كردن يك برنامه پرتابل دات نتي، يا نسبتا پرتابل!)
براي اين منظور كلاس زير تهيه شده است كه مسير فايل اجرايي يا dll يك پروژه را دريافت كرده و ليست تمام ارجاعات به آن‌را به صورت بازگشتي پيدا مي‌كند. (البته در قسمت يافتن مسير اسمبلي‌ها، اسمبلي‌هاي سيستمي كه با خود دات نت فريم ورك نصب مي‌شوند، حذف شده است)

using System.Collections.Generic;
using System.Reflection;
using System.IO;

namespace App
{
class CFindRef
{
#region Fields (2)

/// <summary>
/// ليستي جهت نگهداري نام اسمبلي‌ها
/// </summary>
private readonly List<string> _assemblies = new List<string>();
/// <summary>
/// ليستي جهت نگهداري مسير اسمبلي‌ها
/// </summary>
private readonly List<string> _filePath = new List<string>();

#endregion Fields

#region Constructors (1)

/// <summary>
/// سازنده كلاس
/// </summary>
/// <param name="fileName">مسير اوليه اسمبلي مورد نظر</param>
public CFindRef(string fileName)
{
ListReferences(fileName);
}

#endregion Constructors

#region Properties (2)

/// <summary>
/// ليست مسير اسمبلي‌هايي كه به آن‌ها ارجاعي وجود دارد منهاي موارد سيستمي
/// </summary>
public List<string> ReferencedFiles
{
get
{
_filePath.Sort();
return _filePath;
}
}

/// <summary>
/// ليست كامل اسمبلي‌هايي كه اسمبلي ما به آن‌ها وابسته است
/// </summary>
public List<string> ReferencedNames
{
get
{
_assemblies.Sort();
return _assemblies;
}
}

#endregion Properties

#region Methods (1)

// Private Methods (1)

/// <summary>
/// متدي بازگشتي جهت يافتن ليست ارجاعات
/// </summary>
/// <param name="path">مسير يا نام اسمبلي</param>
private void ListReferences(string path)
{
//آيا تكراري است؟
if (_assemblies.Contains(path))
return;

Assembly asm;
// آيا فايل است يا نام كامل اسمبلي
if (File.Exists(path))
{
// load the assembly from a path
asm = Assembly.LoadFrom(path);
}
else
{
// سعي در بارگذاري اسمبلي
try
{
asm = Assembly.Load(path);
}
catch
{
asm = null; //جاي بهبود دارد
}
}

if (asm == null) return;

// افزودن به ليست نام‌ها
_assemblies.Add(path);
string asmLocation = asm.Location;
//حذف موارد سيستمي از ليست مسير فايل‌ها
if (asmLocation != null && !asmLocation.Contains("\\System.")
&& !asmLocation.Contains("\\mscorlib"))
_filePath.Add(asmLocation);

// پيدا كردن ارجاع‌ها
AssemblyName[] imports = asm.GetReferencedAssemblies();
// iterate
foreach (AssemblyName asmName in imports)
{
// فراخواني بازگشتي جهت يافتن تمامي ارجاعات
ListReferences(asmName.FullName);
}
}

#endregion Methods
}
}

مثالي در مورد نحوه‌ي استفاده از آن:

CFindRef cfr = new CFindRef(@"C:\App\test.exe");
foreach (var asmRef in cfr.ReferencedFiles)
{
textBox1.Text += asmRef + Environment.NewLine;
//Application.DoEvents();
}
براي نمونه، برنامه‌اي كه از SMO‌ مربوط به اس كيوال سرور 2008 استفاده مي‌كند، اين ليست ارجاعات را دارد:

C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Dmf\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Dmf.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Management.Sdk.Sfc\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Management.Sdk.Sfc.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.ServiceBrokerEnum\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ServiceBrokerEnum.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.SqlClrProvider\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlClrProvider.dll
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.SqlEnum\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlEnum.dll
با كپي كردن همين فايل‌ها كنار فايل اجرايي برنامه‌اي كه قرار است روي سروري با SQL Server 2005 كار كند، مشكل برطرف مي‌شود و برنامه بدون مشكل كار خواهد كرد.

برنامه آماده هم در اين زمينه موجود است، براي مثال CheckAsm
مشاهده سايت

نظر سنجي


لطفا در نظر سنجي قرار داده شده در ستون سمت راست صفحه شركت نمائيد.

كدام روش را بيشتر مي‌پسنديد؟
روش قبل از عيد، بيشتر مقاله و كمتر اخبار تازه‌ها.
يا روش بعد از عيد، بيشتر اخبار و كمتر مقاله.

با سپاس


۱۳۸۸/۰۱/۲۴

Getting Started with Windows SharePoint Services 3.0


كتابچه‌ي رايگان 60 صفحه‌اي از مايكروسافت در مورد SharePoint Services 3.0 با محتواي زير:

Microsoft Corporation - Published: March 2009

Introduction to Getting Started with Windows SharePoint Services 3.0 technology
What's new for IT professionals in Windows SharePoint Services 3.0
Administration model enhancements
New and improved compliance features and capabilities
New and improved operational tools and capabilities
Improved support for network configuration
Extensibility enhancements
For further reading: Evaluation guide for Windows SharePoint Services 3.0 technology
Determine hardware and software requirements
About hardware and software requirements
Stand-alone installation
Server farm installation
Plan browser support
About browser support
Levels of browser support
Feature-specific compatibility listed by Web browser
Install Windows SharePoint Services 3.0 on a stand-alone computer
Hardware and software requirements
Configure the server as a Web server
Install and configure Windows SharePoint Services 3.0 with Windows Internal Database
Post-installation steps
Deploy in a simple server farm
Deployment overview
Deploy and configure the server infrastructure
Perform additional configuration tasks
Create a site collection and a SharePoint site
Roadmap to Windows SharePoint Services 3.0 content
Windows SharePoint Services 3.0 content by audience
Windows SharePoint Services 3.0 IT professional content by stage of the IT life cycle


دريافت

۱۳۸۸/۰۱/۲۳

خواندني‌هاي 23 فروردين


SubSonic يكي ديگر از ORM هاي تهيه شده براي دات نت فريم ورك است كه توسط يكي از اعضاي مايكروسافت هدايت مي‌شود. اين پروژه سورس باز و رايگان است.

گردآوري جالبي است؛ قابل توجه دوستاني كه با php و سرورهاي لينوكسي كار مي‌كنند.

همانطور كه مطلع هستيد نگارش نهايي SP1 مربوط به SQL Server 2008 مدتي است كه ارائه شده است و يكي از قابليت‌هاي آن Slipstreaming نصب آن است (من ترجمه‌اش مي‌كنم "نصب ممزوج"). منظور از آن هم اين است كه تمام پچ‌هاي قبلي را مي‌شود با نصاب ابتدايي يكي كرد. (بنابراين نصب ممزوج معادل بدي نيست، "داير كردن فرو رفتني" هم به فرهنگستان پيشنهاد مي‌شود :) )
براي مثال در SQL server 2005 شما مجبور هستيد كه ابتدا نگارش RTM آن‌را نصب كنيد و بعد آخرين سرويس پك ارائه شده را، اما در حالت پشتيباني از نصب ممزوج، مي‌شود فايل‌هاي سرويس پك را مستقيما بر روي فايل‌هاي نصاب اوليه بازنويسي كرد و به اين صورت با نصب آن، به يكباره SQL Server 2008 SP1 را خواهيد داشت و ديگر نيازي به reboot هاي مكرر و توقف و راه اندازي سرويس‌هاي گوناگون ويندوز نيست (اين مساله در يك سرور حائز اهميت است).

۱۳۸۸/۰۱/۲۲

خواندني‌هاي 22 فروردين


سايت iplocationtools بانك اطلاعاتي موقعيت مكاني IP هاي خود را كه ماهيانه نيز به روز خواهد شد، به رايگان براي دريافت قرار داده است. فرمت تعاريف جداول و عبارت insert آن مطابق دستورات بانك اطلاعاتي MySQL است.
تنها بازيگر شاخص يازده سال قبل در زمينه توسعه برنامه‌هاي مبتني بر QT ، برنامه KDevelop بوده است. اين وضعيت با ارائه Qt Creator‌ بهبود يافته است ...
  • شركت Red gate كه پيشتر برنامه‌ي معروف Reflector را در جهت اهداف تبليغاتي خود تصاحب كرده بود، اكنون در ادامه‌ي همين سياست، كتاب Illustrated C# 2008 را نيز به رايگان ارائه داده است.
  • سايت DelphiFeeds.com با طراحي جديد خود چند روزي است كه متحول شده است. سايتي شبيه به سايت مهندس خودمان كه بعد از عيد معلوم نيست چه بلايي سرش آمده است و جاي خالي آن احساس مي‌شود، هر چند سايت IDevCenter نيز همين كار را به صورت تخصصي‌تري ارائه مي‌دهد.
  • Microsoft MED-V 1.0 در جهت توسعه‌ي اهداف مجازي سازي مايكروسافت ارائه شد.

۱۳۸۸/۰۱/۲۱

خواندني‌هاي 21 فروردين


Velocity راه حل جامع caching مايكروسافت براي ASP.Net است كه جزئي از دات نت فريم ورك 4 خواهد بود.


پروژه سورس بازي است كه از بسياري از ماژول‌هاي جديد دات نت فريم ورك استفاده مي‌كند و نكته‌ي جالب نگارش جديد آن مهاجرت از MS Ajax به jQuery Ajax است (قسمت اجكس آن كلا از صفر بر اساس jQuery بازنويسي شده است).

  • چك ليستي كه پيش از برپايي يك وب سايت بايد بررسي شود.
البته اين چك ليست، عمومي است و صرفنظر از تكنولوژي بكار گرفته شده در مورد تمامي سايت‌ها صادق است.

ExtJs هم يكي ديگر از فريم ورك‌هاي جاوا اسكريپتي است كه با jQuery قابل قياس است.

  • دمويي در مورد ويندوز Azure و سرويس‌هاي مبتني بر آن

۱۳۸۸/۰۱/۲۰

ReSharper 4.5


نگارش نهايي ReSharper 4.5 ارائه شد. ارتقاء به اين نگارش از نگارش‌هاي قبلي آن رايگان است و با همان مجوز پيشين كار مي‌كند.
  • تمركز اين نگارش بر روي ميزان مصرف حافظه كمتر و كارآيي بيشتر است (نسبت به نگارش قبلي آن، در آزمايشي كه انجام دادم حدود 300 مگ مصرف حافظه كمتري دارد كه قابل توجه است).
  • سرعت باز شدن پروژه‌هاي بزرگ در آن به شدت بهبود يافته
  • اضافه شدن اخطارهاي در سطح پروژه. براي مثال آيا فيلد عمومي كه تعريف كرده‌ايد اصلا جايي استفاده شده است؟
  • پشتيباني از VB9 در مورد مباحث پيشرفته Refactoring .
  • اضافه شدن بررسي اصول نامگذاري متدها ، كلاس‌ها، متغيرها و غيره به صورت خودكار
و ...


سرويس پك يك SQL Server 2008


نگارش نهايي سرويس پك يك SQL Server 2008 ارائه شد. (به بيان ديگر اكنون مي‌توانيد با خيال راحت از آن در محيط كاري استفاده كنيد!)

اين به روز رساني به همراه Report Builder 2.0 و Feature Pack 2009 نيز مي‌باشد.


۱۳۸۸/۰۱/۱۹

خواندني‌هاي 19 فروردين


- ويديوي رايگان آموزشي در مورد جنبه‌هاي مختلف LINQ to Entities (دريافت، ماخذ)

- Mono و پشتيباني از SIMD يا Single Instruction Multiple Data
برنامه نويسي موازي تنها به برنامه نويسي چند ريسماني و چند هسته‌اي خلاصه نمي‌شود. بلكه استفاده از توانايي‌هاي پيشرفته در پروسسورهاي مدرن امروزي Intel و AMD نيز توانايي قابل توجهي را در اين عرصه ارائه مي‌دهند. بسياري از برنامه‌هاي نوشته شده به زبان‌هاي C و CPP از SIMD جهت بالا بردن سرعت پردازشي استفاده مي‌كنند ( براي مثال بالا بردن سرعت كار با ماتريس‌ها و بردارها يا بهينه سازي حلقه‌ها) و كامپايلرهاي آن‌ها نيز در اين زمينه امكانات ويژه‌اي را ارائه ‌مي‌نمايند. اما زبان‌هاي بر پايه دات نت راه ساده‌اي را براي استفاده از اين توانايي ندارند.
با ارائه مونو 2.2 (شماره نگارش‌هاي مونو (دات نت لينوكسي) با شماره نگارش‌هاي دات نت فريم ورك مايكروسافت همخواني ندارد و مستقل هستند)، اين سناريو تغيير كرده است و فضاي نام Mono.Simd ارائه شده است. به اين صورت مي‌توان از توانايي‌هاي SIMD (تنها SSE3 و قسمتي از SSE4 پشتيباني مي‌شود) در برنامه‌هاي دات نت استفاده نمود (كه بيشتر بر روي عمليات سريع بر روي ماتريس‌ها و بردارها متمركز شده است).
جهت اطلاعات بيشتر مي‌توان به دمويي در اينباره رجوع كرد. دريافت
ماخذ

- كارت‌هاي مرجع دات نت
سايت Dzone اخيرا در تكميل برگه‌هاي مرجع پيشين خود، برگه‌هاي مرجع ASP.Net را نيز ارائه كرده است.
Core ASP.NET
براي دريافت نياز به ثبت نام است و سپس درخواست لينك دانلود كه به آدرس ايميل شما ارسال خواهد شد.

۱۳۸۸/۰۱/۱۸

بررسي صحت پشتيبان‌هاي تهيه شده در SQL Server


اولين و اساسي‌ترين قدم در نگهداري يك سيستم مبتني بر داده، تهيه پشتيبان‌هاي منظم و همچنين قابل اطمينان مي‌باشد.
دستور T-SQL زير بدون ري‌استور كردن يك فايل بك آپ اس كيوال سرور، سعي در تعيين اعتبار آن مي‌كند:
RESTORE VERIFYONLY
FROM DISK = 'C:\SQL_Backup\Test1'
WITH FILE = 1,
LOADHISTORY
اين دستور وضعيت كامل بودن پشتيبان و همچنين قابل خواندن بودن اطلاعات آن‌را برسي مي‌كند و در صورت سالم بودن بك آپ، پيغام زير را نمايش خواهد داد:

The backup set on file 1 is valid.
عموما عمليات تهيه پشتيبان در يك مكان مشخص در سرور صورت مي‌گيرد (خصوصا اگر يك job مختص به آن تعريف شده باشد كه اين‌كار را به صورت خودكار انجام دهد). بنابراين مي‌توان عمليات اعتبار سنجي فوق را مكانيزه كرد. اسكريپت زير مسير آخرين بك آپ‌هاي گرفته شده در سرور را بر مي‌گرداند:
SELECT DISTINCT physical_device_name
FROM msdb.dbo.backupmediafamily
ORDER BY
physical_device_name
اكنون مي‌توان مسير‌هاي فوق را در يك cursor جهت بررسي صحت تك تك موارد استفاده نمود:

DECLARE @path NVARCHAR(1000),
@msg NVARCHAR(MAX),
@NewLine CHAR(2),
@sql NVARCHAR(2000)

SET @NewLine = CHAR(13) + CHAR(10)
SET @msg = ''

DECLARE DATABASES_CURSOR CURSOR
FOR
SELECT DISTINCT physical_device_name
FROM msdb.dbo.backupmediafamily
ORDER BY
physical_device_name

OPEN DATABASES_CURSOR

FETCH NEXT FROM DATABASES_CURSOR INTO @path

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Verifying: ' + @path
SET @sql = 'RESTORE VERIFYONLY FROM DISK = ''' + @path
+ ''' WITH FILE = 1, LOADHISTORY'

EXEC sp_executesql @sql
IF @@ERROR <> 0
BEGIN
SET @msg = @msg + 'Failed to verify: ' + @path + @NewLine
END

FETCH NEXT FROM DATABASES_CURSOR INTO @path
END

CLOSE DATABASES_CURSOR
DEALLOCATE DATABASES_CURSOR

IF @msg <> ''
BEGIN
PRINT @msg
-- send email
EXECUTE msdb.dbo.sp_send_dbmail
@recipients = 'nasiri@site.net', -- Change This
@copy_recipients = 'Administrator@site.net', -- Change This
@Subject = 'backup verification info.',
@Body = @msg
,@importance = 'High'

END

اسكريپت فوق بر روي تمامي مسيرهاي ثبت شده موجود كه در آن‌ها پيشتر پشتيبان تهيه شده است، دستور RESTORE VERIFYONLY را اجرا مي‌كند و در آخر اگر پيغامي حاصل شد، يعني مشكلي پديد آمده و ايميلي را به اشخاص مورد نظر ارسال مي‌كند.
مي‌توان بر روي اين اسكريپت يك job تهيه كرد كه هر روز پس از تهيه بك آپ خودكار، كار بررسي صحت عمليات را نيز انجام دهد.

۱۳۸۸/۰۱/۱۷

خواندني‌هاي 17 فروردين

  • - نقشه‌اي شبيه به نقشه‌هاي مترو!



  • - Ubuntu پرتابل! (قابل اجرا به صورت يك برنامه ويندوزي)




  • - MSXML 4.0 Service Pack 3 كه اخيرا ارائه شده.

  • -ديدگاه مايكروسافت در مورد سال 2019 اكنون در قالب سيلورلايت به همراه سورس كد




۱۳۸۸/۰۱/۱۶

مثال‌هايي در مورد استفاده از SQL Server 2005 Reporting Services

SQL Server 2005 Reporting Services راه حلي مبتني بر سرور جهت گزارشگيري‌هاي جامع با قابليت ارائه گزارش‌هاي paper-based ، ad hoc و Web-based است. (جهت آشنايي بيشتر مي‌توان به مقاله "SQL Server Reporting Service چیست؟" آقاي رمضاني مراجعه كرد)

اخيرا مجموعه‌اي مثال در مورد كار با Reporting Services ارائه شده است كه از آدرس زير قابل دريافت است:

اين مجموعه شامل 7 بسته آموزشي و مثال‌هاي مرتبط مي‌باشد:

SQL Server 2005 Integration Services Log Reports
SQL Server 2005 Report Pack for Microsoft Dynamics Axapta 3.0
SQL Server 2005 Report Pack for Microsoft Dynamics Navision 4.0
SQL Server 2005 Report Pack for Microsoft Dynamics Great Plains 8.0
SQL Server 2005 Report Pack for Microsoft Dynamics Great Plains 9.0
SQL Server 2005 Report Pack for Microsoft Internet Information Services (IIS)
SQL Server 2005 Report Pack for Financial Reporting


۱۳۸۸/۰۱/۱۵

نگارش نهايي MBUnit 3 ارائه شد


MBUnit كه يكي ديگر از فريم ورك‌هاي آزمايش واحد يا unit testing دات نت به شمار مي‌رود، نگارش 3 بتا آن از سال 2007 شروع شده و اخيرا نگارش نهايي 3 آن ارائه گرديده است.


جهت مشاهده‌ي جزئيات آخرين تغييرات اعمال شده در نگارش جديد آن، MbUnit v3.0.6 Update 1 مي‌توان به وبلاگ يكي از اعضاي اصلي تيم مراجعه نمود.

Added support for TestDriven.Net category filters.
Added support for more powerful inclusion/exclusion test filter expressions.
Fixed ReSharper v3.1, v4.0 and v4.1 hangs.
Increased NCover v1.5.8 timeout.
Adopted new assembly version numbering scheme

MBUnit از جهات بسياري از NUnit پيشرفته‌تر است براي مثال در هنگام انجام آزمايشات واحد بر روي يك ديتابيس، به صورت خودكار امكان حذف ركوردهاي آزمايشي را داشته و كار به حالت اول بازگردان وضعيت ديتابيس را انجام مي‌دهد.
همچنين نگارش 3 آن كار يكپارچه شدن با ReSharper را هم انجام مي‌دهد كه پيشتر به صورت پيش فرض مهيا نبود و اين مورد يكي از دلايل مهم استفاده گسترده از NUnit به شمار مي‌رفت.

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

۱۳۸۸/۰۱/۱۴

آموزش مديريت و كاربري شيرپوينت 2007

اگر ماتريكس بر روي ويندوز XP اجرا مي‌شد ...!






دريافت

Expression Blend WPF Tutorial


دنبال يك سري ويديوي آموزشي Expression blend بودم كه آدرس زير را پيدا كردم:


امكان مشاهده‌ي رايگان آن‌ها موجود است، همچنين اگر برنامه‌ي internet download manager را نصب كنيد، هنگام گشودن هر صفحه، يك آيكون ذخيره سازي ويديوي مورد نظر نيز ظاهر مي‌شود كه به اين صورت مي‌توان تمام ويديوها را دانلود كرد.


۱۳۸۸/۰۱/۱۳

ليست تازه‌هاي IIS 7.5


IIS 7.5 كه به همراه ويندوز سرور 2008 R2 ارائه مي‌شود شامل تازه‌هاي زير است:

  • بيش از 50 مورد cmdlet جديد مخصوص Powershell جهت مديريت IIS
  • افزونه‌هاي جديد مديريتي: Database Manager (مديريت اس كيوال سرور از درون IIS و كنسول آن)، Configuration Editor (توليد خودكار اسكريپت‌هاي مديريتي جهت اتوماسيون امور مرتبط)، IIS Reports و Request Filtering .
  • پشتيباني از One-click publishing موجود در Visual Studio 10
  • Web Deployment Tool يا همان MS Deploy سابق جهت مديريت بهتر برنامه‌هاي وب.
  • امكان رديابي تغييرات در كانفيگ وب سرور
  • گزارشگيري بهتر از وضعيت كارآيي سرور
  • ساپورت دات نت جهت Server Core معرفي شده در ويندوز سرور 2008
  • WebDav كه پيشتر به صورت يك افزونه‌ي آن معرفي شده بود، اكنون جزئي از IIS 7.5 است.
  • يكپارچگي با URLScan 3.0 جهت بالا بردن امنيت وب سرور.
  • FTP server services : با كنسول مديريتي IIS يكپارچه شده است با بهبودهايي در نحوه‌ي تنظيم كردن و رديابي آن.

جهت مطالعه بيشتر در مورد تازه‌هاي ويندوز سرور 2008 نگارش R2 مي‌توان به مقالات زير رجوع كرد:
Windows Server 2008 R2 new features - the complete list - Part 1: Virtualization
Windows Server 2008 R2 new features - the complete list - Part 2: Active Directory
Windows Server 2008 R2 new features - the complete list - Part 3: IIS 7.5 and Performance
Windows Server 2008 R2 new features - the complete list - Part 4: Administration

۱۳۸۸/۰۱/۱۲

مقايسه توانايي پردازش CSS توسط مرورگرهاي مختلف

برنامه نويسي امن به زبان C


اگر سخنان بزرگان برنامه نويسي را مطالعه كرده باشيد، يكي از موارد اين بود:
" هيچگاه از gets و sprintf استفاده نكنيد، در غير اينصورت شياطين به زودي به سراغ شما خواهند آمد! (FreeBSD Secure Programming Guidelines) "
به عبارت ديگر استفاده از توابع كتابخانه‌هاي استاندارد زبان C ، بدون ملاحظات لازم (يا همان برنامه نويسي كلاسيك به زبان C )، منشاء بسياري از حملات Buffer overrun است، زيرا اكثر اين توابع اندازه‌ي بافر يا رشته‌ي ورودي را بررسي نمي‌كنند.
براي رفع اين مشكلات كه هنوز كه هنوز است قرباني مي‌گيرد! ، The Safe C Library پديد آمده است. اين كتابخانه بر اساس استاندارد ISO TR24731 تهيه گرديده و در آن يك سري توابع مكمل، جهت بالا بردن امنيت‌ برنامه‌هاي تهيه شده به زبان C مطابق استاندارد ISO/IEC 9899:1999 معرفي شده است.

براي مثال مطابق استاندارد ISO/IEC JTC1 SC22 WG14 N1172 ، تابع نا امن memcpy با تابع امن زير بايد جايگزين شود:
errno_t  memcpy_s(void *dest, rsize_t dmax, const void *src, rsize_t smax)

مستندات آن‌را در فايل safe_lib_html.tar پس از دريافت كتابخانه مي‌توانيد مشاهده نمائيد.

همچنين اخيرا به عنوان مكمل اين مجموعه، يك كتابخانه‌ي رياضي امن نيز تهيه شده است.

پ.ن.
شبيه به همين مورد در اينترفيس پلاگين‌هاي IDA-Pro در نگارش‌هاي اخير آن اعمال شده است و برنامه نويس را وادار مي‌كند كه از نمونه‌هاي معادل امن در آن محيط استفاده كند.
//pro.h
// We forbid using dangerous functions in IDA Pro
#ifndef USE_DANGEROUS_FUNCTIONS
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x560 || __BORLANDC__ >= 0x580) // for BCB5 (YH)
#include <stdio.h>
#endif
#undef strcpy
#define strcpy dont_use_strcpy // use qstrncpy
#define stpcpy dont_use_stpcpy // use qstpncpy
#define strncpy dont_use_strncpy // use qstrncpy
#define strcat dont_use_strcat // use qstrncat
#define strncat dont_use_strncat // use qstrncat
#define gets dont_use_gets // use fgets
#define sprintf dont_use_sprintf // use qsnprintf
#define snprintf dont_use_snprintf // use qsnprintf
#define wsprintfA dont_use_wsprintf // use qsnprintf
#endif
براي مطالعه بيشتر: The Safe C Library

مرجع سريع VSTT


مرجع سريع Visual Studio Team Test 2008 (يكي از ويژگي‌هاي Visual Studio Team System 2008 ) را در طي 83 صفحه مي‌توانيد از آدرس زير دريافت نمائيد. بسياري از سؤالات شما در مورد آزمايشات واحد و امثال آن در اين راهنماي سريع توضيح داده شده‌اند.

اين مجموعه موارد زير را شامل مي‌شود:
SETUP CONSIDERATIONS
WEB TEST CONSIDERATIONS
WEB SERVICE TEST CONSIDERATIONS
UNIT TEST CONSIDERATIONS
LOAD TEST CONSIDERATIONS
LOAD TEST RIG CONSIDERATION
PERFORMANCE DATA COLLECTION AND USAGE
LOAD TEST RESULTS STORE INFORMATION
TEST CUSTOMIZATION
ITEMS CHANGED OR FIXED IN VSTS 2008 SP1
GENERAL COMMANDS AND TRICKS