
در فریم ورک .NET 2 به بعد فضا نام System.IO.Ports اضافه گردید این فضا نام دارای کلاسی با عنوان Serial Port می باشد که از این می توان برای دسترسی به پورت سریال و ارسال و دریافت اطلاعات از طریق این پورت انجام داد.
برای شروع باید فضا نام بالا را فراخوانی کنیم برای این کار از using استفاده می کنیم .
1 |
using System.IO.Ports; |
برای اینکه از طریق پورت سریال بتوانیم داده ارسال و دریافت کنیم باید پورت مورد نظر را open یا باز کنیم.پورت سریال دارای پارامترهایی می باشد که نرخ و سرعت تبادل اطلاعات رو ست می کند . پس قبل از باز کردن یک پورت باید مقدار پارامترها را تعیین کنیم این پارامترها عبارت است از
خوب بر اساس توضیحات داده شده مقادیر بالا را مقداردهی و پورت را با دستور زیر باز می کنیم.
01 |
//ایجاد یک آبجکت از serial port |
02 |
SerialPort ccom = new SerialPort(); |
03 |
//اگر پورت قبلا باز باشد آن را ببندد |
04 |
if (ccom.IsOpen == true) ccom.Close(); |
05 |
//مقدار دهی پارامتر ها |
06 |
ccom.BaudRate = 9600; |
07 |
ccom.DataBits = 8; |
08 |
ccom.Parity = (Parity)Enum.Parse(typeof(Parity), "None"); |
09 |
ccom.StopBits = (StopBits)Enum.Parse(typeof(StopBits), "One"); |
10 |
ccom.PortName = "COM1"; |
11 |
//باز کردن پورت |
12 |
ccom.Open(); |
برای آگاهی از پورت های سریال در سیستم می توان از دستور GetPortNames() برای این منظور استفاده کرد.
1 |
foreach (string s in SerialPort.GetPortNames()) |
2 |
Console.WriteLine(s); |
برای انجام عمل فرستادن اطلاعات به پورت از دستور Write برای این منظور استفاده می کنیم. این دستور اطلاعات را به دو صورت Text و Byte ارسال می کند به نمونه مثال های زیر توجه کنید.
1 |
//ارسال به صورت Text |
2 |
string msg = "Hello"; |
3 |
ccom.Write(msg); |
4 |
//ارسال به صورت Byte |
5 |
ccom.Write(new byte[] { 0x0A, 0xE2, 0xFF }, 0, 3); |
البته برای انتقال اطلاعات به صورت Byte بهتر است از روش پایین استفاده کنیم.یک تابع با نام HexToByte می نویسیم که مقدار را از Hex به Byte تبدیل می کند بعد از انجام عمل تبدیل آن را ارسال می کنیم.
01 |
private byte[] HexToByte(string msg) |
02 |
{ |
03 |
msg = msg.Replace(" ", ""); |
04 |
byte[] comBuffer = new byte[msg.Length / 2]; |
05 |
for (int i = 0; i < msg.Length; i += 2) |
06 |
comBuffer[i / 2] = (byte)Convert.ToByte(msg.Substring(i, 2), 16); |
07 |
return comBuffer; |
08 |
} |
09 |
|
10 |
|
11 |
|
12 |
|
13 |
ccom.Write(newmsg, 0, newmsg.Length); |
دراینجا برنامه ای را برای شما می گذارم که این برنامه درای یک کلاس با نام CommunicationManager.cs می باشد که شامل توابعی برای ارسال و دریافت اطلاعات از پورت سریال می باشد.این برنامه می تواند راهنمای خوبی برای شما باشد.
لینک دریافت فایل SerialPortCommunication
همانطور که می دانید از پورت سریال در ساخت واسط بین کامپیوتر و مدارات الکترونیکی کاربردی زیادی دارد که شاید دلیل آن سهولت کار با این پورت می باشد.
DB9 Male (Pin Side) DB9 Female (Pin Side)
DB9 Female (Solder Side) DB9 Male (Solder Side)
————- ————-
\ 1 2 3 4 5 / \ ۵ ۴ ۳ ۲ ۱ /
\ ۶ ۷ ۸ ۹ / \ ۹ ۸ ۷ ۶ /
——— ———
DB9 Female to DB9 Female Null-Modem Wiring
2 | 3 | 7 | 8 | 6&1| 5 | 4
—- —- —- —- —- —- —-
3 | 2 | 8 | 7 | 4 | 5 | 6&1
9-pin 25-pin Assignment From PC
—— —— ————————- ————
Shield 1 Case Ground Gnd
1 8 DCD (Data Carrier Detect) Input
2 3 RX (Receive Data) Input
3 2 TX (Transmit Data) Output
4 20 DTR (Data Terminal Ready) Output
5 7 GND (Signal Ground) Gnd
6 6 DSR (Data Set Ready) Input
7 4 RTS (Request To Send) Output
8 5 CTS (Clear To Send) Input
9 22 RI (Ring Indicator) Input
نحوه ارتباط به این صورت خواهد بود که پین RX کامپیوتر به پین TX مدار پین RX مدار به پین TX کامپیوتر وصل خواهد شد.
برای اطلاعات بیشتر می توانید به این آدرس مراجعه کنید.
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
method ، روش استفاده شده به منظور ارسال داده در پروتکل HTTP را مشخص می نمايد . به منظور ارسال داده از روش های متفاوتی استفاده می گردد . روش های GET و POST دو نمونه متدوال در اين زمينه میباشند.
متد GET : در اين روش داده موجود بر روی يک فرم که قرار است برای سرويس دهنده ارسال شود ، به انتهای URL و به شکل " نام / مقدار" ، اضافه می گردد. متد GET، گزينه پيش فرض در خصوص نحوه ارسال اطلاعات يک فرم می باشد .
در روش GET، پارامترها را به کمک query string که مستقيما در انتهاي URL اضافه شده اند، به سرور مي فرستيم.
query string به قطعه متني که پس از علامت "?" آمده باشد ميگويند.
sitename =4sou?
اولين بخش از زوج "نام / مقدار" ، نشاندهنده "نام" و دومين بخش مقدار مورد نظر به منظور ذخيره سازی را نشان می دهد. نام و مقدار متناظر با آن به صورت اتوماتيک از يک عنصر موجود بر روی فرم نظير يک textbox ويا checkbox ، اخذ می گردند. نام کنترل استفاده شده بر روی فرم ، نام استفاده شده در متد GET بوده و محتوياتی را که کاربر در کنترل مورد نظر درج و يا انتخاب می نمايد، مقدار موردنظر را مشخص می نمايد . در مثال فوق ، 'sitename' ، نام مورد نظر بوده و '4sou' ، مقدار مرتبط با آن است . مرورگر در زمان ارسال صفحه برای سرويس دهنده ، اطلاعات فوق را به صورت اتوماتيک به URL اضافه می نمايد:
http://www.4sou.ir/testpage.aspx?sitename =4sou
امکان استفاده بيش از يک زوج نام /مقدار بهمراه يک URL وجود خواهد داشت . در چنين مواردی هر زوج توسط علامت "&" ( ampersand ) ، از يکديگر جدا می گردند .
http://www.4sou.ir/testpage.aspx?sitename =4sou&webmaster=TEST
بخش اضافه شده به URL را query string می گويند . GET تنها روش موجود به منظور ارسال داده بين سرويس گيرنده و سرويس دهنده نمی باشد و در اين رابطه از متد POST نيز استفاده می گردد.
متد POST : يکی از معايب ارسال داده با استفاده از query string ، به ماهيت ارسال اطلاعات برمی گردد . درصورتی که ضرورتی و يا علاقه ای به نمايش داده ارسالی در آدرس URL را نداشته باشيم، می توان از متد POST استفاده نمود . عملکرد روش فوق تا اندازه ای شبيه متد GET بوده و تنها تفاوت اساسی بين آنان به ارسال داده در بدنه HTTP Request برمی گردد ( نه به عنوان بخشی همراه URL ) . سياست فوق ، ايمنی بسيار بالائی را نسبت به متد GET ارائه نمی نمايد و ما صرفا" داده ارسالی را در URL مشاهده نمی نمائيم . متد POST ، همچنين امکان ارسال حجم بيشتری از اطلاعات را فراهم می نمايد. برخی از سرويس دهندگان وب دارای محدوديت حجم متن ارسالی همراه يک URL می باشند. متد POST ، دارای چنين محدوديتی نمی باشد.
Reflector نام نرم افزاری است که توسط آن می توانید برنامه های نوشته شده به زبان های NET. (ویژوال بیسیک ، #C ، …) را Decompile کنید . به طور کلی برنامه های نوشته شده به زبان دات نت پس از کامپایل به کد هایی به نام IL تبدیل می شن . از این رو توسط ابزار های خاصی مانند Reflector ، Fox ، Dis sharp میشه فایل های اجرایی ایجاد شده رو Decompile کرد . به عبارت ساده تر تا حدود %70 به کد اولیه برنامه دسترسی پیدا کرد . در واقع میشه گفت این قضیه معنای کد اجرایی (exe) رو تا حدودی نقض می کنه . برای روشن تر شدن موضوع یک مثال مطرح می کنم :
کد زیر رو در نظر بگیرید . کد رو به زبان #C ودر محیط Visual Studio می نویسیم .
private void Form1_Load(object sender, EventArgs e)
{
int a, b;
int c = 0;
string outx = "";
a = 8;
b = 4;
c = a + b;
outx = Convert.ToString(c);
MessageBox.Show(outx);
}
پس از کامپایل کد و تبدیل به فایل اجرایی اون رو توسط نرم افزار رفلکتور ، DeCompile می کنیم و نتایج رو مشاهده می کنیم :
private void Form1_Load(object sender, EventArgs e)
{
int num3 = 0;
int num = 8;
int num2 = 4;
num3 = num + num2;
MessageBox.Show(Convert.ToString(num3));
}
همونطور که مشاهده می کنید تنها شکل ظاهری کد ها تغییر کرد . برای مثال ما در کد اصلی برای تبدیل مقدار int به string از یک متغیر کمکی استفاده کردیم در صورتی که کد Decompile شده به صورت خلاصه تری در اومده.
--------------------------------------------------------------------------------
و اما راه حل جلوگیری از این مشکل چیه ؟
توصیه من استفاده از نرم افزاری به نام Smart Assembly هست . با استفاده از این obfuscator قدرتمند می تونید تا مقدار زیادی کدتون رو مبهم کنید . به طوری که حتی در مواردی Decompile کردن اون هم کاری غیر ممکن خواهد بود .
نتایج مبهم کردن فایل اجرایی توسط نرم افزار Smart Assembly به شرح زیر است :
——– اطلاعات دریافت شده توسط نرم افزار رفلکتور : Module contains unkown meta-data stream
——– حجم فایل اجرایی قبل از عملیات مبهم سازی : 8 کیلوبایت
——– حجم فایل اجرایی بعد از انجام عملیات مبهم سازی : 132 کیلوبایت
طی سال های گذشته توسعه دهندگان وب از سمت توسعه ساختار وب سایت های بر پایه ی Table به سمت طراحی وب سایت هایی بر پایه ی Div حرکت کرده اند . عجب ! حتماً میگید چه کاره خوبی ! اما صبر کنید. آیا توسعه دهندگان میدونند دلیلشون برای اینکار چیه و اصلاً چطور باید اینکار رو انجام بدن؟ اغلب به نظر میرسه ملت دارن از جهنمی به اسم Table دور میشن فقط برای اینکه به جهنم جدیدی به اسم Div وارد بشن.
در این مقاله در مورد مشکلات معمول در طراحی ساختار صفحات وب صبحت میکنیم . اول با یکسری مثال میخوایم ببینیم Table و Div چه کوفتی هستند اصلاً ؟ بعدش ببینیم چجوری یه کد تمیز و خوانا بنویسیم و در آخر مشخص کنیم انتظار میره کدوم یکی از این قابلیت ها در آینده بیشتر مورد استفاده قرار بگیرن! پس خواهش میکنم در این سفر از جهنم تا بهشت با ما همراه باشید.
جهنم Table
وقتی وب سایت شما برای اهداف طراحی از جداول استفاده میکنه شما در جهنمی به اسم table هستید. Table ها به طور کلی باعث افزایش پیچیدگی ، سخت تر شدن نگهداری ، کاهش انعطاف پذیری برای انطباق با رسانه های مختلف(مثل دستگاه های موبایل و غیره) و طراحی عناصر مختلف در صفحات وب میشن.
MAMA یک موتور جستجو از نرم افزار Opera هست که در صفحات وب میخزه و نتایجی رو با شرح ساختار صفحات ارائه میده. اگر به کلید های جستجوی MAMA توجه کنیم متوجه میشیم که عنصر Table در 80 درصد ساختار صفحات وب وجود داره.
در این خصوص اگه ساده بخوام توضیح بدم : Table برای نگهداری داده های جدولی (مثل لیست کالاهای یک انبار) استفاده میشه نه برای اهداف طراحی و ایجاد ساختار صفحات وب.
سهولت استفاده
استفاده از جداول برای طراحی ساختار، کاملاً بصری و قابل درکه . ما روزانه داده های جدولی زیادی می بینیم و مفهمومش رو به خوبی میشناسیم. از طرفی وجود صفات جدولی ، یادگیری رو نسبتاً ساده میکنه چون دیگه توسعه دهنده مجبور نیست از یک StyleSheet جداگانه استفاده کنه. اما در Div هیچ صفت آماده ای وجود نداره و توسعه دهنده مجبوره در زمان طراحی ، Style های جدیدی رو ایجاد کنه. در Table ها وقتی محتوا خیلی طولانی باشند خط شکسته نمیشه . مثل Div ستون ها زیر ستون های دیگه فشرده نمیشن و در کل باعث میشه احساس کنید Table ها امن و بدون دردسر تر هستن.
نگهداشت پذیری
Table دارای تگ های متفاوتی هست. خود تگ table به عنوان یک روپوش استفاده میشه. Tr برای ایجاد سطر ها و Td برای ایجاد ستون ها استفاده میشن. تگ های thead و tbody برای اهداف ساختاری استفاده نمیشند چون به محتوا خاصیت معنایی میدن. برای خوانایی بیشتر معمولاً هر تگ با رعایت تو گذاری (Tab) در یک خط نوشته میشه. ضمناً باید توجه داشت که خواص colspan و rowspan کد رو پیچیده تر هم میکنن.
|
1
2
3
4
5
6
7
8
9
10
11
12
13 |
<table cellpadding="0" cellspacing="0" border="0"> <tr> <td colspan="3" height="120px">....td> tr> <tr> <td valign="top">...td> <td valign="top">...td> <td valign="top">...td> tr> <tr> <td colspan="3">...td> tr> table> |
|
1
2
3
4
5 |
|
همونطور که در مثال بالا میبینیم ، کدهای بیشتری برای قالبی که با Table ایجاد شده نسبت به Div نوشته شده. حالا فرض كنيد همچنان كه كد بزرگتر ميشه اين تفاوت در اندازه، ثابت باقي بمونه . در ساختاری بر پایه Div هم میشه بی خیال menu div شد و در عوض از یک لیست نا مرتب (ul) به عنوان ظرف استفاده کرد.
جداول باعث میشن نتونید یک کد تمیز بنویسید و تا زمانی که بحث نگهداری داده های جدولی (مثلاً لیست اجناس یک انبار) مطرح نباشه ، استفاده از اونها برای طراحی صفحات هیچ معنایی نداره . مشکل دیگه Table ها اینه که باعث میشن جداسازی طراحی از محتوا سخت بشه. با توجه به نتایج MAMA ، خواص border ، width ، cellpadding و cellspacing در 90% از صفحاتی که از Table استفاده کرده بودند وجود داشته و این یعنی به جای اینکه خواص و استایل ها در style sheet ها قرار بگیرند ، مستقیماً در صفحه Html نوشته شده اند.
کدهای اضافی طراحی رو کند میکنن و باعث افزایش هزینه های نگهداری میشن. ضمناً در آینده باعث میشه درک کد شما برای دیگران و حتی خودتون سخت بشه. به یاد داشته باشید برای تعدادی خطوطی که یک برنامه نویس در طول ساعت میتونه بنویسه محدودیت وجود داره.
هرچی تعداد خطوط کد شما بیشتر بشه معنیش اینه که فایل بزرگتری هم خواهید داشت و متعاقباً زمان بیشتری برای بارگزاری صفحه نیازه. همچنین یک کد بزرگ نسبت به یک کد کم حجم ، باگ های بیشتری خواهد داشت. از طرفی توسعه دهندگان همیشه باید رسانه های جدید رو هم مد نظر داشته باشن. مثل دستگاه موبایل که معمولاً پهنای باند پایینی دارن.
انعطاف پذیری با رسانه ها
در یک جهان ایده آل، از یک نشانه گذاری مشابه برای همه چاپگر ها استفاده میشه. استفاده از جداول برای ساختار صفحات، کمترین انعطاف پذیری رو داره. کاربران شما ممکنه بخوان جدول های کناری رو به بالای صفحه منتقل کنن و یا مثلاً یک نمای چاپ، از سند در اختیار داشته باشند که در صورت استفاده از جداول، نتایج برای چاپ شدن، به صفحات اضافی جداگانه ای نیاز خواهند داشت و بر خلاف صفحات مبتنی بر Div که طراحی رو از محتوا جدا میکنن، استفاده از جداول برای اهداف طراحی، یعنی بالا رفتن هزینه توسعه و نگهداری کد.
نویسنده : Geir Wavik – گردآوری و ترجمه : مهران رسا
متن اصلی توسط Joker:
اطلاعات فایلهای rar یا zip یا 7zip یا … همگی بر اساس پسورد رمز میشوند نه اینکه پسورد جائی ذخیره بشود ، در واقع پسورد هیچکجا ذخیره نمیشود ، اطلاعات با یک رمز کد میشوند ، به عبارت دیگه کل فایل را شما باید کلمه رمز بدونید :) ، و اگه شما هر رمز دیگه ای هم بزنید اطلاعات دیکود میشوند منتها چون رمزاصلی نبوده اطلاعات اشتباه باز میشوند. میشه گفت رمزنگاری یک طرفه محسوب میشوند – راهی جز روش سعی و خطای پسوردها ندارد.
همونطور که توضیحات بالا مشخص هست کرک کردن پسورد فایل های rar با دستکاری شروط برنامه غیر امکان هست . به عبارت ساده تر امنیت فایل ها winrar صرفاً با یک شرط ساده برای بررسی کلمه عبور تامین نمیشه لذا تنها راه دور زدن کلمه عبور فایل های فشرده rar روش سعی و خطا خواهد بود .
برای روشن تر شدن این قضیه و اینکه با روش های رمزگذاری این چنینی آشنا بشید کد زیر رو آماده کردم ، که در ادامه به شرح قسمت های مختلف اون می پردازیم:
Function Encode(FileAddress As String, Pass As String)
On Error Resume Next
Randomize Timer
StrX = Space(FileLen(FileAddress))
Open FileAddress For Binary As #1
Get #1, , StrX
Close #1
R = Int(Rnd * 5) + 1
PublicN = "[" & Chr(5) & R & Chr(5) & "]"
If Len(Pass) > 1 Then
For j = 1 To Len(Pass) Step 2
Part = Mid(Pass, j, 2)
StrX = Replace(StrX, Chr(R + j), "[" & Chr(2) & Coder(Part) & Chr(2) & "]")
Next j
Else
Exit Function
End If
Open FileAddress For Output As #1
Print #1, StrX
Print #1, PublicN
Close #1
End Function
Public Function Coder(St As String) As String
For i = 1 To Len(St)
s = s & Chr(Asc(Mid(St, i, 1)) + R)
Next i
Coder = s
End Function
-
توضیحات تابع بالا : همونطور که مشاهده می کنید تابع دارای 2 پارامتر ورودی با عنواین : آدرس فایل و کلمه عبور هست . خوشبختانه در خصوص دسترسی به محتویات متنی فایل ، VB زیاد به پرو پای ما نمی پیچه . در هر صورت با توجه به آنچه در بالا مشاهده می کنید ، محتویات متنی فایل مورد نظرمون رو استخراج کرده و عملیات رمزگذاری رو شروع می کنیم . به طور دلخواه کلمه عبوری ورودی رو به بخش های دو کاراکتری تقسیم بندی کرده و جایگزین رشته کاراکترهای حاصل از کد اسکی جمع اعداد تصادفی (R) و شمارنده (J) می کنیم . و البته کاراکترهای کلمه عبور رو برای قشنگی هم که شده در بین [+کاراکتر اسکی 2+] قرار میدیم . خوب تمام کارهای گفته شده چه فایده ای دارند ؟ در واقع نکته اصلی تمامی موارد گفته شده در همین یک خط خلاصه میشه . با استفاده از اینکار کلمه عبور رو به نقاط مختلف فایل و به صورت کد شده (استفاده از تابع Coder) تزریق می کنیم . پس به طور حتم برای بازگرداندن فایل به حالت اولیه فقط و فقط کلمه عبور اولیه قابل استفاده خواهد بود . قطعاً اگر در ذهنتون تابع Decode رو تصور کنین متوجه میشین که در این روش شرط (if) معنا نداره . در صورتی که فکر می کنید عکس این موضوع صحت داره می تونید دست به کار شده و کلمه عبور فایل رمزگذاری شده توسط الگوریتم بالا رو کشف کنید !
در نهایت توجه داشته باشید که روش بالا صرفاً برای بیان کلیات روش ذکر شده ، مورد استفاده قرار گرفت .
دریافت فایل اجرایی رمزگذاری شده توسط الگوریتم بالا
یک ORM است که تحت پلت فرم دات نت مایکروسافت کار میکند ، و یک FrameWork را برای کار راحتتر و با پیچیدگی کمتر با database پیشنهاد میکند. در این مدل فیلدهای Database به آبجکتهای معادلی، برای استفاده در محیط دات نت تبدیل (map) میشوند . و با این کار برنامهنویسان از پیچیدگیهای ارتباطی DataBase ای خلاص میشوند.
NH (NHibernate) یک نرمافزار کدباز ( OpenSource ) رایگان است. و قسمتی از java ORMapper Hibernate است که کدی در قالب XML از موجودیتها (Entity) و روابط (Relation) ارائه میکند. و به صورت اتوماتیک برای ذخیره و بازیابی Data ها کد Sql تولید میکند، و شما میتوانید با متادیتاهای (meta data) ذخیره شده در source code کار کنید.
توانایی اصلی «ان هایبرنیت» در map کردن table های DataBase به کلاسهای .NET است.
ان.هایبرنیت همچنین DataQuery و امکان بازیابی (retrieval) را فراهم میکند ، کدهای SQL تولید میکند و طراح را از هندل کردن دستی DataBase نسبت به تبدیلات آن و نگهداری Application های Sql ، راحت میکند.
NH ، ماندگاری مناسبی را برای طرح قدیمی CLR (Compiler Language Runtime) فراهم میکند. و آبجکتهای کلاس شما مجبور نیستند مدل برنامه نویسی محدود کنندهای را دنبال کنند.
مزیت مهم استفاده از NHibernate این است که میتوان برای بانک اطلاعاتی به صورت Object Oriented (OO ) کد نوشت. یعنی عملا DtaBase یک Object است که از آن در قالب Data ی map شده استفاده میکنیم.
در صورت استفاده کردن از DataSet به جای NH برنامه سرعت بیشتری دارد؛ اما برای نوشتن کد باید کد Sql بنویسیم، پس درگیر پیچیدگیهای کار با Sql در محیط .NET خواهیم شد. درضمن اگر قرار به عوض کردن نوع DataBase باشد ، اگر framework ای هم از قبل برای راحتی کار درست کرده باشیم، به صورت کامل باید تغییر کند و دوباره نوشته شود. اما در صورت استفاده از NHibernate در صورت تمایل به تغییر DataBase فقط و فقط در تعریف نام DataBase باید تجدید نظر کرد و تمام تغییرات وابسته به database با تغییر پایگاه داده نهایی خودبخود تغییر میکنند و ان هایبرنیت آنها را برای ما ایجاد میکند.
1. Natural programming model : بدین معنا که NHibernate ، OO را پشتیبانی میکند . یعنی ارثبری (Inheritance) ، چندریختی (Polymorphism) ، ترکیب (Composition) ، Collection در .NET که شامل Generic collection ها هم میشود .
2. Native .net : API های NHibernate بر مبنای زبانهای .NET و استانداردهای آن ایجاد شده است .
3. Support for fine-grained object models : پشتیبانی از مدلهای آبجکتی، از طریق مدلهای مختلف غنی شده از مپینگها، برای Collection ها و Object های وابسته .
4. No build time byte code enhancement : در روند بیلد شدن، پردازش بر اساس بایتکدها و ایحاد کدهای اضافی وحود ندارد . در حقیقت در زمان بیلد شدن هیچ بهبودی در بایتکدها داده نمیشود .
5. The query options : از بدست آوردن آبجکتهای دیتابیس گرفته تا بدست آوردن خروجیهای آنها . به هر دوی این مسائل میپردازد .
6. Custom SQL : تصحیح کامل SQL که NHibernate باید برای آبحکتهایش از آنها استفاده کند .
7. Support for “conversations” : ان.هایبرنیت از ماندگاری بالای مفاهیم ، سوا و سرهمبندی آبحکتها پشتیبانی میکند و همچنین از optimistic locking به صورت خودکار مراقبت میکند .
8. Free/open source : ان هاببرنیت، تحت مجوز LGPL (Lesser GNU Public License) است و سورس پروژه ان.هایبرنیت را از سایت SourceForge از اینجا می توانید دانلود کنید .
فایل web.config همانطور که از اسم آن پیداست یک فایل پیکربندی برای یک پروژه ASP.net میباشد .در هر پروژه ASP.net یک فایل web.config وجود دارد که امکان پیکربندی پروژه را فراهم میسازد .
فایل web.config چیست؟
فایل web.config همانطور که از اسم آن پیداست یک فایل پیکربندی برای یک پروژه ASP.net میباشد .در هر پروژه ASP.net یک فایل web.config وجود دارد که امکان پیکربندی پروژه را فراهم میسازد . البته امکان اینکه چند فایل web.config در یک پروژه وجود داشته باشد نیست . در انتهای این مقاله بعد از معرفی کلی این فایل به طرز استفاده از چند فایل در یک پروژه ASP.net میپردازیم.فایل web.config یک فایل از نوع xml بوده و تمامی تگ های داخل این فایل دارای معنی بوده لازم به ذکر است که این فایل نسبت به کوچک و بزرگ بودن حروف حساس است .
فایل machine.config چیست؟
همانطور که از یک فایل web.config برای پیکربندی یک پروژه ASP.net استفاده میشود از فایل machine.config برای پیکربندی پروژه های ASP.net که در یک کامپیوتر خاص اجرا میشوند استفاده میشود.بدین معنی که پیکربندی های که در یک فایل machine.config قرار دارد تمام پروژه های ASP.net که در آن کامپیوتر قرار دارند را تحت تاثیر قرار میدهد . معمولا فایل machine.config را تغییر نمیدهند و برای هر پروژه جداگانه و با استفاده از فایل های web.config پیکربندی را بطور جداگانه انجام میدهند.
چه چیزی در فایل web.config قرار میگیرد؟
تعداد زیادی تنطیمات مهم هستند که در یک فایل web.config قرار میگیرند . در زیر به ذکر چهار مورد از مهمترین تنظیماتی که میتواند در یک فایل web.config میواند قرار بگیرد اکتفا میکنیم:
1-Database Connections
یکی از مهمترین چیزهائی که در یک فایل web.config قرار میگیرد اطلاعات مربوط به connection string میباشد. دلیل قرار دادن یک connection string در یک فایل web.config زمانی مشخص میشود که قرار باشد که جای database خود را تغییر دهیم . در این حالت فقط کافی است که اطلاعات مربوط به connection string را در فایل web.config تغییر دهیم در صورتیکه اگر اطلاعات مربوط به connection string را در خود application قرار دهیم برای تغییر database باید تعداد زیادی از فایل های موجود در پروژه را تغییر دهیم و این کار زمانگیری است و بعلاوه ویژگی قابل حمل بودن یک برنامه را فوق العاده پائین می آورد . البته من زیاد با قرار دادن اطلاعات مهمی چون connectionstring به صورت خام زیاد موافق نیستم . اگر از این روش استفاده میکنید من توصیه میکنم که اطلاعات مربوط به connection string را رمز کرده و مقدار رمز شده را در فایل web.config قرار دهید . البته لازم به ذکر است که در رمز کردن از Hashing استفاده نکنید دلیلش رو اگه نمیدونید برید و مقاله قبلی که در مورد hashing هست رو یه مطالعه ای بکنید.در مثال زیر نحوه قرار دادن اطلاعات مربوط به یک Connection string را میبینیم:
appSettings>
configuratrion>
همانطور که دیدید قراردادن اطلاعات مربوط به connection string در یک فایل web.config بسیار آسان است connection string با استفاده از key که در اینجا ConnectionString میباشد مورد ارجاء قرار میگیرد و value مشخص کننده مقدار این key میباشد. دستیابی به این key ها در یک Application بسیار آسان است .
برای دستیابی به key در یک application به شکل زیر عمل میکنیم:
Using System.Configuration;
String connection_string = ( string ) ConfigurationSettings.Appsettings[“ConnectionString”];
2-Session States
Session در یک پروژه ASP.net بسیار مهم است . همانطور که میدانید پروتکل HTTP یک پروتکل StateLess میباشد به این معنی که بصورت اتوماتیک امکان تشخیص اینکه رشته ای از تقاضاها به سمت یک سایت همگی از سوی یک کامپیوتر صورت میگیرد یا اینکه یک مرورگر در حال مشاهده یک سایت هست یا نه وجود ندارد . برای رفع این دو مشکل فوق و در اصطلاح برای State نگه داشتن یک سایت از Session States استفاده میشود .ASP.net برای ذخیره کردن Session از روش های مختلفی استفاده میکند . به طور پیش فرض ASP.net ، session ها را در همان پردازش مربوط به سایت ذخیره سازی میکند .همچنین شما برای ذخیره سازی session ها علاوه بر روش پیش فرض میتوانید از دو روش زیر استفاده کنید . ناگفته نماند که مشخص کردن نحوه ذخیره سازی یک Session در فایل Web.config مشخص میشود.روش های ذخیره سازی را در زیر می بینید:
1-Session State Server
استفاده از این روش برای ذخیره سازی Session ها دارای دو سود مناسب است . اول اینکه به این دلیل که پروسس های مربوط به Session و Application یکی نیستند چنانچه Application به قول معروف Crash کند هیچ آسیبی متوجه Session ها نخواهد بود چون دو پردازش مجزا هستند . دومین سود این است که امکان اشتراک در میان یک کامپیوتر چند پردازنده میسر میباشد. برای مشخص کردن اینکه نحوه ذخیره سازی Session به صورت State Server باشد لازم است در فایل web.config تغییرات زیر را اعمال کنیم:
در زیر توضیحی مختصر راجع به پارامترهای بالا را ذکر میکنم:
Mode : درواقع حالت ذخیره سازی است که میتواند یکی از دو مقدار StateServer یا SqlServer باشد در اینجا چون میخواهیم از روش StateServer استفاده کنیم مقدار Mode را مساوی StateServer قرار میدهیم.
stateConnectionString :connection string که از آن برای مشخص کردن موقعیت State Service استفاده میشود .
sqlConnectionString :connection string مربوط به SqlServer میباشد که البته برای State Server لازم نیست ولی برای حالت SqlServer لازم است چون در این نوع از ذخیره سازی از SqlServer استفاده میشود.
Cookieless : در صورت تمایل برای نگه داشتن مقدار Session در سمت Client بعد از قطع اتصال بین سایت و Client میتوان مقدار این گزینه را False کرد ولی من که این کار را مفید نمیبینم پس با True کردن این مقدار اجازه ذخیره شدن اطلاعات مربوط بهSession را ندهید .
Timeout: در واقع این item طول عمر یک Session را بر حسب دقیقه بیان میکند .
البته این تگ item های دیگری هم دارد که من توضیح نمیدم ولی حتما قبل از استفاده از Session ها یه نگاهی به این گزینه ها بکنید به طور مثال یکی از گزینه هائی که نگفتم در مورد رمز کردن اطلاعات داخل Sessionو نگه داشتن این اطلاعات در کامپیوتر Client میباشد.
2-SqlServer
انتخاب دوم برای ذخیره سازی Session ها SqlServer 2000 میباشد . برای ذخیرهسازی اطلاعات مربوط به یک Session با استفاده از SqlServer مراحل زیر را دنبال کنید:
1- با استفاده از ابزا Query Analyser اسکریپت InstallSqlSate.sql را اجرا کرده تا DataBase مورد نیاز برای ذخیره سازی Session در SqlServer ایجاد شود . لازم به ذکر است که فایل InstallSqlState.sqlدر مسیر زیر است:
systemroot\Microsoft.NET\Framework\versionNumber
2- در مرحله دوم لازم است تا تنظیمات لازم را به مانند آنچه در StateServer انجام دادیم ، انجام دهیم .
برای این کار لازم است تا تغییرات زیر را در فایل web.config انجام دهیم:
البته اطلاعات دیگر را به مانند آنچه در State Server دیدید قرار دهید.
SqlServer امکان به اشتراک گذاشتن اطلاعات مربوط به یک Session را بین چند سایت یا حتی چند Server ممکن میسازد ولی تنها ایراد این روش در این است که SqlServer نسبت به Session State کندتر است و از این لحاظ بهتر است که از StateServer استفاده کنیم .
3-Error Handling
Error handling یکی از قسمت های خیلی مهم در هر پروژه تحت وب میباشد . امکان رخ دادن هر نوع Error وجود دارد بنابراین بایستی راهی را برای مقابله با این error ها در نظر بگیریم . ASP.net با استفاده از فایل Web.config به ما این امکان را میدهد که Error ها را کنترل کنیم .
بطور مثال برای کنترل error 404 به شکل زیر عمل میکنیم :
customErrors>
چند خط کد فوق برای این است که در هنگام رخدادن error 404 که مربوط به یافت نشدن صفحه است بجای نمایش این error به صفحه notfound.asp برود . چنانچه Mode=””Off باشد در این صورت در هنگامی که یک Error رخ دهد همان error برای کاربران نهائی نمایش داده میشود .
4-security(authentication)
یکی از جنبه های مهم هر برنامه تحت وب امنیت آن است . ASP.net امکانات مناسبی را در زمینه امنیت ایجاد کرده است که میتوانیم بر حسب نیاز از این امکانات استفاده کنیم .یکی از امکاناتی که .net در زمینه امنیت ارائه داده است اعتبارسنجی کاربران است که از سه طریق این عمل ممکن میشود:
1-Windows Authentcation
Windows authentication به شما این امکان را میدهد تا از اکانت های کاربران در ویندوز استفاده کنید . این سرویس از IIS استفاده میکند . و بعد از اعتبارسنجی کاربران اطلاعات کاربری تائید شده را برای کد برنامه شما ارساال می کند . اگر شما مایل به این هستید که بدانید کدام کاربر ویندوز از برنامه های ASP.net استفاده میکند با استفاده از Property زیر میتوانید این اطلاعات را بدست آورید :
User.Identify.Name;
این Property کلمه کاربری(username) کاربر فعلی را در خود دارد .
2-Passport Authentication
این نوع از اعتبارسنجی کاربران برای اعتبارسنجی از سرویس Passport محصول شرکت Microsoft استفاده میکند . برای استفاده از این سرویس میبایستی این سرویس را خریداری کنید .
3-Forms Authentication
این نوع از اعتبارسنجی کاربران برای اعتبارسنجی از Form های Login که در بیشتر سایت ها میبینیم استفاده میکنند . این نوع از اعتبارسنجی به واقع بیشترین استفاده را در میان سه نوع اعتبار سنجی دارد .بارها شده در سایت هائی رفته و اجازه مشاهده یک سری از صفحات فقط در صورت Login کردن به شما داده میشود در واقع در چنین سایت هائی از Forms Authentication استفاده میشود . این مبحث بسیار گسترده است و نیاز به یک آموزش کامل در مورد اعتبار سنجی کاربران از طریق Forms Authentication وجود دارد ان شاء الله در آینده نزدیک در این مورد بیشتر صحبت خواهیم کرد در انتهای این قسمت قطعه کد لازم برای اعتبار سنجی کاربران به روش Forms authentication را میاوریم:
استفاده از چند فایل web.config در یک برنامه ASP.net:
امکان استفاده از چند فایل Web.config در یک برنامه ASP.net میسر میباشد . در واقع چنانچه در داخل یک شاخه از یک برنامه تحت وب یا به عبارت ساده تر یک سایت یک فایل web.config قرار دهیم شرایطی که در این فایل مشخص میشود بر مشخصات و شرایطی که در فایل web.config شاخه اصلی سایت است ارجعیت دارد و چنانچه پیکربندی در فایل web.config شاخه اصلی وجود داشته باشد که درآن فایل دوم نباشد این پیکربندی برای آن زیر شاخه نیز صادق است .در نتها لازم به ذکر است که محدوده دید یک فایل web.config در همان شاخه و تمام زیر شاجه هائی است که در آن شاخه که خود فایل قرار دارد میباشد .بنابراین شرایطی که در فایل web.config که در شاخه اصلی یک سایت قرار دارد برای تمام فایل ها و زیر شاخه های آن صادق است .
شاید براتون پیش اومده باشه که تو حالت تمپلت گریدویو یا لیست ویو و غیره بخواهید بر اساس مقدار یک فیلد شرط خاصی رو اعمال کنید و فقط مقدار فیلد رو نشون ندید می تونید از کد زیر استفاده کنید :
Equals(Eval("number"),"110") ? "images/no.png" : "images/yes.png"
مثلا من این دستور رو به خصوصیت imageurl شی image بایندش کردم و اگه مقدار فیلد number برابر 110 بود عکس اول و اگه هر چیزی به غیره اون بود عکس دوم نمایش داده میشه
طبیعت مهندسین نرم افزار سازندگی است. آزمایش نیازمند این است که توسعه دهنده نکات اولیه صحت نرم افزار را صرف نظر کند و برتناقض ایجاد شده در نتیجه تشخیص خطا غلبه نماید
Beizer این وضعیت را اینگونه بیان می کند :
نکته غیره قابل باوری وجود دارد که اگر در برنامه نویسی به خوبی در نظر گرفته شود، خطایی برای یافتن وجود نخواهد داشت. اگر امکان تمرکز واقعی وجود داشته باشد، اگر همه از برنامه نویسی ساخت یافته ، طراحی بالا به پائین و جداول تصمیم گیری استفاده کنند ، اگر ابزار صحیح در اختیار داشته باشیم ، خطائی نیز وجود نخواهد داشت ، خطا ها وجود دارند چون آنچه انجام می دهیم کاملاً درست نیست و اگر این کارها درست انجام نشود در مورد آن گناهکار هستیم .
بنابراین ، آزمایش و طراحی ابزار آزمایش ، پذیرش شکست است که به تدریج به گناه پذیرفته شده تبدیل می شود. و انجام آزمایش تنبیهی است برای این خطاها، تنبیه برای چه ؟ برای انسان بودن ؟ گناه برای چه ؟ برای شکست در رسیدن به تکامل؟ برای تشخیص ندادن بین آنچه یک برنامه نویس فکر می کند و آنچه بیان می کند؟ برای شکست در برقراری ارتباط تله پاتی ؟ برای حل مشکلات ارتباطات انسانی که به وجود می آیند ... برای چهارده قرن؟
آیا آزمایش احساس گناه است؟آیا آزمایش واقعا مخرب است ؟ پاسخ به این سوالات خیر است به هر حال هدف از آزمایش چیزی است متفاوت ، از آنچه انتظار می رود.
منبع : کتاب مهندسی نرم افزار - نوشته راجر پرسمن
سلام،
هر وقت Visual studio.Net رو اجرا می کنید، اگر در پنجره ی New Project گزینه ی VisualBasic رو انتخاب کنید، حتما متوجه گزینه های مختلف موجود در اون شدید. در واقع چندین نوع پروژه هست که شما طبق خواسته تون می تونید یکی رو انتخاب کنید.
برنامه های کنسول (Console Application) یکی از اونهاست. برنامه های کنسول فقط دارای خروجی متنی هستند. نتیجه یک برنامه کنسول در پنجره دستور (Command Window) به نمایش در میاد که بهش پنجره کنسول هم میگن. همون صفحاتی که شبیه سیستم Dos هست و در اون خبری از واسط های گرافیکی و فرم و دکمه و ... نیست!
خوب؛ وقتی که این گزینه رو از پنجره New Project انتخاب کردید، یک صفحه ویرایش کد به نام Module1.VB باز میشه که باید کد برنامه تون رو در بین اعلان مدول تایپ کنید . به مثال توجه کنید :
مثال :
1: Module Module1
2: Sub Main()
3: Dim Number As Integer
4: Console.Write("Enter Number :")
5: Number = Console.ReadLine()
6: Console.WriteLine("Your Number is : {0}", Number)
7: Console.ReadLine()
8: End Sub
9: End Module
خطوط 1و2و8و9 توسط خود VB.Net به طور پیش فرض و آماده در صفحه ویرایشگر ایجاد میشه. در خط 3 یک متغیر از نوع Integer تعریف شده. توجه کنید که دستور Write در خط 4 به عنوان متد Console استفاده شده. استفاده از Console. قبل از هر یک از متدهای مربوطه الزامیه.
البته حتما با Readline() هم آشنا هستید. این خط باعث میشه ورودی کاربر (که در اینجا یک عدد صحیح هست) در متغیر انتسابی ریخته بشه.
خط 6 کمی توضیح لازم داره. باید بدونید تمامی متون داخل " " به طور مستقیم در خروجی چاپ میشه. غیر از اعدادی که داخل براکت { } هست. منظور از {0} یعنی اولین متغیری که بعد از " " بیاد در خروجی چاپ بشه. اعداد 1 و 2 و . . . نشاندهنده متغیرهای بعدی هست.
خط 7 هم باعث میشه که قبل از بسته شدن پنجره کنسول شما بتونید خروجی تون رو مشاهده کنید. با زدن کلید Enter پنجره بسته میشه.
شکل زیر خروجی این برنامه ی ساده رو نشون میده.
قبل از بررسي تفاوت بين كلاسها بين C++ و C# ابتدا خاصيت هاي عمومي يك كلاس را بررسي كرده سپس به بررسي تفاوت بين اين دو زبان قدرتمند خواهيم پرداخت.
تعريف. كلاس در حالت ساده مجموعه اي از خواص(attributes) و روش ها (methodes) است كه در رابطه با هم هدف مشتركي را دنبال مي كنند و خدماتي را ارائه مي كنند. البته اين تعريف در حد يك تعريف علمي مي باشد ولي ذكر اين نكته ضروري است كه اكثر تعاريف در شي گرايي در طبيعت وجود دارد و در ساده ترين حالت براي تعريف يك كلاس مي توان از تعريف انسان استفاده كرد كه اين بحث در اين مقاله نمي گنجد. در هر حال ما به تعريف فوق اكتفا كرده و بحث را ادامه مي دهيم.
خواص ها و روش ها كه در تعريف كلاس ارائه شد مي تواند نحوه دسترسي متفاوتي مانند public و private و protected داشته باشد كه براي برنامه نويسان C++ نيازي به توضيح نيست.
تفاوت در تعريف يك كلاس:
چنانچه در مقاله لايه ها در C# نيز اشاره شد يك كلاس در يك برنامه C# در داخل يك لايه تعريف خواهد شد(اجباري نيست). تعريف يك كلاس در C# تفاوتهايي با C++ دارد كه سعي خواهيم كرد اين تفاوت ها را با چند مثال توضيح دهيم.
فرض كنيد كلاس زير در C++ تعريف شده است كه اين كلاس را به يك كلاس C# تبديل خواهيم كرد.
// Test.h
class CTest{
private:
int m_at1;
int f1();
public:
float m_at2;
int f2();
CTest();
~CTest();
};
// Test.cpp
#include "test.h"
CTest::CTest(){
m_at1 = 0;
m_at2 = 0.0;
}
CTest::~CTest(){
// cout << "destructor call";
}
int CTest::f1(){
return m_at1;
}
int CTest::f2(){
return m_at1+(int)m_at2;
}
تفاوت اول:
بر خلاف C++ در C# تعريف و نحوه عملكرد يك تابع يا Method در خود تعريف كلاس قرار داده مي شود. در C++ غالبا تعريف كلاس در فايل .h و بدنه توابع در فايل .cpp قرار مي گرفت. البته ذكر اين نكته ضروري است كه مي توان همين عمل را در .h نيز قرار داد ولي در يك برنامه بزرگ اين عمل كنترل برنامه را از دست برنامه نويس خارج كرده و همچنين مشكلات ديگري را براي برنامه نويسان ايجاد مي كند كه برنامه نويسان C++ با اين مشكلات آشنا هستند.
تفاوت دوم:
بر خلاف C++ در C# يك دسته از متغييرها را نمي توان بصورت public يا private و ... تعريف كرد و براي هر متغيير بايد نحوه دسترسي به آن نيز مشخص شود.
تفاوت سوم:
بر خلاف C++ در C# تابع destructor وجود ندارد و خود C# مسئول از بين بردن يك شي مي باشد كه اين از بين بردن با توجه به محدوده تعريف اين شي انجام مي شود. البته تعريف destructor وجود دارد ولي نمي توان destructor را فراخواني كرد . در C++ فراخواني Destructor با استفاده از عملگر delete قابل انجام بود ولي چون C# مديريت object ها را خود بعهده مي گيرد شي ايجاد شده نميتواند توسط برنامه خراب شود. اين مطلب در مقالات بعدي مورد بررسي قرار خواهد گرفت.
با توجه به تفاوتهاي ذكر شده مي توان اين كلاس را به صورت زير براي يك كلاس C# ارائه كرد.
// Test.cs
using System;
namespace NS
{
publicclass CTest
{
privateint m_at1;
public float m_at2;
privateint f1()
{
return m_at1;
}
public int f2()
{
return m_at1+(int)m_at2;
}
public CTest()
{
m_at1 = 0;
m_at2 = 0.0f;
}
~Test()
{
// Console.WriteLine("destructor call");
}
}
}
ايجاد يك كلاس در ++ و #
در موقع استفاده از يك كلاس اگر از default constructor براي ايجاد يك كلاس استفاده مي شود در C# بايد constructor بصورت void فراخواني شود ( مانند توابع void معمولي)
به مثال زير دقت كنيد.
// C++ code
CTest *a;
a = new CTest;
// C# Code
CTest a;
a = new CTest();
ذكر اين نكته ضروري است كه در C# وقتي كلاسي تعريف مي شود در واقع اشاره گر به آن كلاس معرفي مي شود بنابراين با تعريف CTest a كلاسي از CTest ايجاد نمي شود و فقط يك اشاره گر از CTest تعريف مي شود و براي ايجاد يك كلاس استفاده از عملگر new اجباري است.
ولي در C++ تعريف CTest a به منزله ايجاد يك كلاس و فراخواني Default Constructor مي باشد.

Qt یک فریم ورک مولتی پلتفرم برای توسعه نرم افزار می باشد که اکثرا برای ایجاد برنامه هایی با رابط کاربری (GUI) مورد استفاده قرار می گیرد . اما پس از نسخه ۴ امکان ایجاد برنامه های متنی نیز فراهم شده است . بیشترین استفاده از کیوتی در رابط گرافیکی KDE بوده است که یکی از مهمترین محیط های گرافیکی لینوکس می باشد . نرم افزار های بسیاری چون Opera, Google Earth, Skype, Qtopia و ... نیز توسط این ابزار ایجاد گردیده اند . این ابزار توسط یک شرکت نروژی به نام Trolltech ایجاد گردیده و با سرعت بسیاری در حال توسعه می باشد .
زبان برنامه نویسی در Qt بصورت پیش فرض ++C می باشد . تقریبا این ابزار را می توان با محیط ++VC مقایسه نمود . اما امکان برنامه نویسی با زبانهای دیگر چون پایتون ، رابی ، PHP ، پرل ، پاسکال و حتی #C و جاوا نیز در Qt فراهم می باشد ! همانطور که گفته شد کیوتی تقریبا در اکثر سیستم عامل های موجود چون لینوکس ، ویندوز ، مک و سیستم های خاصی چون PDA ها و Smartphone ها قابل اجراست .
Qt از موتوری درونی و خاص خود برای ایجاد اشیا و پنجره ها استفاده می کند . بنابراین امکان اجرا بر روی چندین سیستم عامل و نیز استفاده از اشایی پیشرفته براحتی ممکن می باشد . در عین حال کیوتی در هر سیستم عامل برنامه هایی درست همانند ظاهر همان سیستم عامل یا اصطلاحا محلی (native) تولید می کند .
کیوتی اسمی کلی هست و شامل تمام ابزار و کتابخانه ها و طراح می شود . در حقیقت محیط و فریم ورک Qt شامل قسمت های مختلفی می باشد . هسته اصلی و داخلی آن شامل کتابخانه هایی بسیار گسترده در اکثرا زمینه های موجود چون پایگاه داده ، شبکه ، سیستم فایل ، اینترنت و ... می باشد . همچنین کیوتی شامل طراحی (Designer) گرافیکی و بسیار قدرتمند و ساده می باشد که برنامه نویسی و ایجاد پنجره ها را بسیار آسان و سریع قابل پیاده سازی می کند .
اگر از آن دسته افرادى هستيد كه به دنبال آينده و كسب و كارى پر از انرژى و خلاقيت هستند و اگر شديداً از انجام كارهاى روتين و كارمند بانك بودن تنفر داريد(!) و اگر دوست داريد كسب و كارى را برگزينيد كه بدون شك در سال هاى آينده بازار پررونقى داشته باشد، حتماً به برنامه نويسى به عنوان يك شانس مهم توجه داشته باشيد.
همواره وقتى به صدر رده بندى پول دارترين مردان دنيا نگاه مي كرديم عادت كرده بوديم نام كسى جز بيل گيتس را نبينيم!
برنامه نويس نوجوان و جسور آنقدر در كار خودش پشتكار به خرج مى داد كه گاهى وقت ها به خاطر دستكارى زياد در كامپيوتر دبيرستان شان تهديد به اخراج مى شد و بعد از ورود به دانشگاه هاروارد، طولى نيانجاميد كه دانست آنجا هم نمي تواند يك برنامه نويس ماورايى را ارضا كند، پس به سمت بازار كار رفت و مايكروسافت را با همكلاسى سابقش (استيو بالمر) تاسيس كرد و شبانه روز در آنجا مشغول برنامه نويسى شد و حتى هفته ها خانه نمى رفت تا مايكروسافت، مايكروسافت شد و بيل جوان به بيل گيتس معروف و موفق تبديل شد!
سرگذشت بيل گيتس هميشه مي تواند بهترين
الگو براى موفقيت برنامه نويسان جوان وآماتور باشد و در نگاهى كلي تر شايد
الگويى براى همه جويندگان جوان موفقيت!
البته جز او، برنامه نويسان معروف ديگرى هم بودند كه مي توانستند در حد و اندازه هاى او به شهرت و دارايى برسند.
استيو جابز مديرعامل Apple که بسياري، دستاوردهاى Apple را مديون تخيل و نوآورى او مي دانند و يا چارلز سيمونى خالق نرم افزار Office كه كمى جستجو در دست آوردها و دارايي هايش هر انساني را به برنامه نويس شدن تهييج خواهد کرد!
موسسان Google معروف، لرى پيچ و سرگى برين ، نيز در واقع مهم ترين كارشان برنامه نويسى هسته اصلى موتور جستجوى Google بود و آنها را نيز مى توان برنامه نويسان جسور و موفقى دانست كه با پشتكار، يك پروژه دانشجويي دانشگاه استنفورد را به يك غول اينترنتى تبديل كردند.
و البته از اين دست برنامه نويسان موفق، كم نيست و جالب اينكه بسيارى از آنها همگام با موفقيت در برنامه نويسى در زمينه هاى ديگر از جمله تجارت، مديريت، خلاقيت، فضانوردى و غيره نيز موفق ظاهر شده اند.
برنامه نويسى را مي توان شغل قرن بيست و يكم ناميد. شغلى كه
سراسر تخيل، نوآورى، ايده پردازى، تحقيق، خلاقيت و پشتكار را شامل مي شود.
حال، با اين تعاريف، شايد دهان خيلي ها آب افتاده باشد كه از همين امروز
سراغ برنامه نويسى بروند تا آينده شغلى خود را حسابى تضمين كنند. اما
برنامه نويسى شايد در ظاهر شيك و با كلاس باشد اما در باطن گاو نر مي خواهد
و مرد عمل(!)
قصد ندارم تازه كارها را (البته اگر بشود خودم را كهنه كار ناميد) از اين شغل هراسان كنم اما با بررسى چند توضيح ساده بر ما عيان مي شود كه برنامه نويسى بعد از كار كردن در معدن يكى از مشكل ترين و در عين حال، پيچيده ترين مشاغل است!!
پس از توضيحات بيشتر به چند جمله كوتاه توجه كنيد :
• برنامه نويسى كه پشتكار نداشته باشد، هيچ وقت نخواهد توانست از پس خطاهاى پى در پى بر آيد و ميدان را خالى خواهد كرد، پس هيچ گاه به موفقيت نخواهد رسيد.
• برنامه نويسى كه به روز نباشد، با دانش پايه و آكادميك قبلي اش بدون شك پس از مدتى اندك متوقف خواهد شد.
• هيچ برنامه نويسى به صرف داشتن ليسانس يا فوق ليسانس سر كار نخواهد رفت!
• بسيارى از برنامه نويسان موفق پس از مدتى درخشش سمت هاي کلان مديريتي را در اکثر شرکت هاي IT صاحب مي شوند و اين خود گوياى اهميت شغلى آنهاست.
• گرو ه ها و برنامه نويسان كد باز پس از اينكه ما ه ها وقت خود را روى يك پروژه صرف مي كنند تا آن را به محصولى درخور و ارزشمند تبديل كنند، در پايان، نتيجه تمامى تلاش خود را به صورت كاملاً رايگان در اختيار ديگران قرار مي دهند!
• بسيارى از برنامه نويسان، پس از مدتى به علت ركود خلاقيت و دانش روز، کار خود را از دست مي دهند.
در جملات مطروحه، در مي يابيم برنامه نويسى شغلى خاص و در عين حال، متفاوت از مشاغل عادى است كه به صورت روزمره با آن سر و كار داريم.
يک بار در کتاب عادت هاي ميليون دلاري(Million Dollar Habits) برايان تريسى خواندم براى موفقيت در هر زمينه اى از صنعت گرفته تا دانش و هنر و تجارت شما بايد حداقل بين 5 تا 7 سال وقت خود را به صورت برنامه ريزى شده و مستمر صرف كنيد تا به حد کارشناسي (Expert) دست پيدا کنيد.
با توجه به تجربيات خودم نيز، اين زمان بسيار معقول و درعين حال دست يافتنى مي باشد و غالب اساتيد خودم نيز بعد از گذراندن حداقل اين زمان به جايگاه و درآمد ايده آل خود دست پيدا كرده اند.
متاسفانه، معمولاً افراد در مواجهه با علوم كامپيوتر و علي الخصوص برنامه نويسى بسيار عجول هستند و شايد رونق كتاب هاى آموزشى تحت عنوان هاى آموزش برنامه نويسى در 24 ساعت و غيره از همين جا نشات گرفته است. پتر نورويج يكى از مدرسان معروف علوم كامپيوتر در همين مورد، جملات معروفى دارد:
« مردم خيلي عجله دارند كه در مورد كامپيوترها چيز ياد بگيرند خيال هم مي کنند كه يادگيري كامپيوتر خيلي آسان تر از يادگيري مسائل ديگر است. وگرنه هيچ كتابي در مورد بتهوون، يا فيزيك كوانتوم يا حتي تربيت سگ، در چند روز وجود ندارد»
براى اينكه ما بتوانيم يك برنامه نويس موفق شويم و به درآمد بالا دست پيدا كنيم، بايد بدانيم كه با خواندن چند كتاب و مقايسه و بررسى چند نمونه كد نمي شود ظرف چند ماه به يك برنامه نويس موفق كه درآمد خوبى هم دارد و صاحب شغل و پست مطمئن در شرکت در خوري هم هست تبديل شد.
يك برنامه نويس موفق هميشه بايد خود را عقب بداند و در كسب تجربيات ديگران و تكنيك هاى روز كوشا باشد. از زبان و به نقل قول بسيارى از برنامه نويسان حرفه اى شنيده و خوانده ام كه به روزترين و سريع ترين دانش و كسب و كار دنيا برنامه نويسى است. پس يك برنامه نويس موفق هيچ گاه نبايد به داشته هاى هر چند پربارش قره شود و از تكاپوى روزانه باز ايستد.
يك مشكل ديگر كه غالباً برنامه نويسان نوجوان و يا كم تجربه تر را درگير مي کند، اين است كه آنها بعد از اينكه در توسعه يك نر مافزار، وب سايت و غيره به خطايي برخورد كردند، پس از چند بار تلاش و كوشش از كوره درمي روند و عطاى موفقيت را به لقايش مي بخشند و كلاً يا پروژه را بي خيال مي شوند يا در صورت امكان، بخش مورد نظر را از پروژه حذف مي كنند و غالباً فكر مي كنند گذاشتن زمان هاى بسيار براى حل يك مشكل اتلاف وقت است، در صورتي كه به نظر من نتيجه شكست تا هميشه در ذهن شما خواهد ماند و در روند و زمان كلى انجام پروژه باز هم تاثير خود را خواهد گذاشت.
نكته عملى اينكه يك برنامه نويس براى موفقيت بايد حداقل روزانه بيش از يك ساعت از وقت خود را در وب براى جستجو در مورد تازه هاى زمينه تخصصى خود صرف كند.
يك فرق نامحسوس ديگر كه بين برنامه نويسى حرفه اى و موفق با شكست خوردگان اين راه وجود دارد اين است كه دسته موفق معمولاً از خلاقيت و نوآورى زيادى در كارشان استفاده مي كنند و اين در حالى است كه دسته ديگر با آنكه شايد از بار دانش بيشترى نيز برخوردار باشند، اما به دليل نداشتن تفكر خلاقانه هيچ وقت نمي توانند نمونه محصولات جديدتر، متنوع تر و با كيفيت ترى خلق كنند.
بسيارى از برنامه نويسان از حل مسائل الگو ريتمى و رياضيات گريزانند و احساس مي كنند حل مسائل رياضى و الگوريتمى هيچ كمكى به پيشرفت و كسب درآمد بيشتر آنها در آينده نخواهد كرد اما نبايد فراموش كنيم كه يكى از مهم ترين صفات يك برنامه نويس موفق توانايى او در حل مسئله مي باشد و در واقع، اگر برنامه نويسى از حل مسائل گريزان باشد، عملاً نمي توان نام برنامه نويس بر او گذاشت.
البته براى فرا گرفتن تمامى اين تكنيك ها يك كليد اصلى و ساده وجود دارد و آن چيزى نيست جز علاقه! اگر سعى كنيد با علاقه كد بزنيد، مطمئن باشيد هيچ گاه دغدغه سختي هاى بالا را نخواهيد داشت. به برنامه نويسي علاقه داشته باشيد. اطمينان حاصل كنيد كه آن قدر از برنامه نويسي لذت مي بريد كه حاضر باشيد 10 سال از عمرتان را صرفش كنيد.
در پايان، مي توان گفت عليرغم اينكه برنامه نويسى يك شغل پر درآمد، خلاقانه، پر تنوع و باثباتى است اما نبايد فراموش كرد در اين عرصه تنها كسانى موفق هستند كه تكنيك هاى مطروحه را خوب كسب كرده و به كار گيرند و الباقى متاسفانه در كمال صرف هزينه هاى مالى و زمانى بسيار بايد به داشتن شغل هاى نامربوط و غيرمستقيم و يا پست هاى پايين تر بسنده كنند.
يک نکته مهم که در زمان استفاده از NET Framework. بايد به آن توجه داشت آن است که فضانام (namespace يا نامکده) ها در ساختمان برنامه کاربردی قرار دارند. فضانام يک طرح نامگذاری منطقی برای گروه بندی کلاس های مرتبط است. اين طرح مانع از آن می شود تا کلاس هايی که برای متدها و خصوصيات از يک شناسه يکسان استفاده می کنند تداخل داشته باشند.
مثلا
NET Framework. برای گروه بندی تايپ ها به مقوله های منطقی عملکرد، از قبيل
چارچوب برنامه کاربردی ASP.NET، از يک طرح نامگذاری سلسله مراتبی استفاده
می کند. ابزارهای طراحی از فضانام ها با هدف تسهيل مرور و ارجاع تايپ ها در
برنامه بهره برداری می کنند. مثلا فرض کنيد در حال نوشتن کد زير هستيد:
Public Class NewClass
[Procedures and Functions]
End Class
Public Class NewClass
[Procedures and Functions]
End Class
اين کد به خطا منجر می شود چون کامپايلر راهی برای تشخيص
کلاس ها از يکديگر ندارد. برای غلبه بر اين مشکل می توان از يک فضانام
استفاده کرد که اجازه می دهد دو کلاس همنام در صفحه با هم وجود داشته
باشند. قطعه برنامه زير تعريف اين دو کلاس در فضانام های منحصر بفرد را
نشان می دهد:
Namespace One
Public Class NewClass
[Procedures and Functions]
End Class
End Namespace
Namespace Two
Public Class NewClass
[Procedures and Functions]
End Class
End Namespace
در اين کد برخوردی بين دو کلاس با نام NewClass وجود ندارد
چون هر کدام در يک فضانام جداگانه قرار داده شده است. کلاس اول را می توان
با استفاده از ترکيب One.NewClass صدا زد، حال آنکه کلاس دوم را می توان با
استفاده از ترکيب Two.NewClass صدا زد.
شما می توانيد در فضانام های خود از يک ساختار سلسله مراتبی استفاده کنيد.
قرار دادن اشياء مشابه تحت زيرعنوانها در يک فضانام مشترک تشخيص هدف فضانام
را آسانتر می کند، و در عين حال باعث می شود برنامه به مراتب شئ گراتر
شود.
برای توضيح فضانام می توان ساختار فايل و دايرکتوری (کشو، فولدر) در يک
کامپيوتر را در نظر گرفت. در اين مثال کلاس ها به مثابه فايل ها و فضانام
ها مانند دايرکتوری ها هستند. بديهی است همانگونه که می توانيم
دايرکتوريهای تو در تو داشته باشيم، فضانام ها هم در حاليکه کلاس ها را در
خود جای داده اند می توانند بصورت تو در تو باشند.
فضانام ها در ساخت برنامه های کاربردی ASP.NET نقش مهمی ايفا می کنند.
خوشبختانه لازم نيست برای همه اشيايی که می توانند به وسيله صفحات ASP.NET
مورد استفاده قرار بگيرند سيستم طبقه بندی فضانام ايجاد کنيد. مايکروسافت
اين مساله را برای شما حل کرده است. دو فضانام ريشه، و فضانامهای فرزند
آنها را می توان وارد صفحات ASP.NET خود کرد. اولی System ناميده می شود، و
دومی Microsoft نام دارد. اين فضانامها با جزئيات بيشتر در ادامه مورد بحث
قرار گرفته اند.
فضانام System
فضانام System فضانام اصلی برای ساخت ASP.NET و همه برنامه های کاربردی
ديگر مبتنی بر NET Framework. است. هر چيزی که در برنامه کاربردی شما قابل
انجام باشد از طريق فضانام System کنترل می شود. به عنوان مثال کنترل
آرايه، عمليات رياضی، و تبديل نوع داده ها از طريق فضانام System و
فضانامهای فرزند آن اداره می شوند. ۹ فضانام پيش فرض (فضانام System و ۸
فرزند آن) وجود دارند که به صورت خودکار به صفحات ASP.NET اضافه می شوند:
System
System.ComponentModel.Design
System.Data
System.Drawing
System.Web.SessionState
System.Web
System.Web.UI
System.Web.UI.WebControls
System.Web.UI.HTMLControls
هشت فضانام (بجز فضانام System) در زمان ساخت Visual
Studio.NET يا VS.NET بطور خودکار به صفحات ASP.NET وارد می شوند. اين
فضانام ها در زير به اختصار شرح داده شده اند.
• System.ComponentModel.Design: دربرگيرنده کلاس هايی است که می توان از
آنها برای طراحی پشتيبانی سفارشی اجزا و زمان طراحی و دسترسی به سرويس های
تامين شده توسط معماری NET Framework. استفاده کرد.
• System.Data: امکان دسترسی به کلاس ها و رابطهايی را فراهم می کند که
معماری ADO.NET را برای دسترسی به داده های عمومی تشکيل می دهند.
• System.Drawing: دربرگيرنده کلاس ها و رابطهايی است که عملکرد گرافيکی
اوليه را تامين می کنند. فضانام System.Drawing نيز از طريق فضانام
System.Drawing.Drawing2D و System.Drawing.Imaging عملکرد پيشرفته تری
فراهم می کند.
• System.Web: کلاس ها و رابطهايی تامين می کند که ارتباط مرورگر/سرويس
دهنده را امکان پذير می کنند. اين فضانام دربرگيرنده کلاس HTTPRequest
(فراهم کننده اطلاعات وسيعی درباره درخواست HTTP جاری)، کلاس HTTPResponse
(فراهم آورنده امکان دسترسی به فرآيندها و يوتيليتی های سمت سرويس دهنده)
است.
• System.Web.SessionState: فراهم کننده کلاس ها و متدهايی برای مديريت وضعيت جلسات کاری می باشد.
• System.Web.UI: فراهم کننده کلاس ها و رابطهايی برای رابط واسط کاربر
برنامه کاربردی ASP.NET است که موجب می شوند برنامه کاربردی با سطوح مختلف
صفحه، ارتباط برقرار کند. کلاس اصلی اين فضانام، کلاس Page می باشد که
دربرگيرنده همه خصوصيتها، متدها، و سازنده های صفحه است. اشياء اصلی Active
Server Page زير خصوصيتهايی در کلاس Page هستند: Application ،Response
،Request ،Server و Session.
• System.Web.UI.HTMLControls: کلاس هايی برای عناصر HTML استاندارد، شامل
فرم ها، کنترل های ورودی، آنکور، جداول، قسمتهای متنی، و غيره فراهم می
کند. اين کنترلها همانند تگهای عادی HTML هستند با اين تفاوت که داری دو
صفت runat="server" و id="controlname" می باشند.
• System.Web.UI.HTMLControls: برای کنترلهای سرويس دهنده ای که شبيه
کنترلهای HTML هستند ولی انعطاف پذيری بيشتر و عملکرد پيچيده تری دارند
کلاس هايی را تامين می کند.
برخی فضانام های مهم و پرکاربرد ديگر به شرح زير می باشند.
• System.IO: دربرگيرنده رابطها و کلاس هايی است که امکان خواندن و نوشتن
همگام و غيرهمگام فايل ها و جريانهای داده را فراهم می کنند.
• System.Data.OleDb: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی به يک منبع داده از طريق ADO را فراهم می کند.
• System.Data.SqlClient: امکان دسترسی به کلاس ها و رابطهای مخصوص دسترسی
به داده های خاص Microsoft SQL Server از طريق ADO را فراهم می کند.
• System.Web.Security: امکان دسترسی به کلاسها و رابطهای مخصوص امنيت
برنامه کاربردی ASP.NET را فراهم می کند. دستيابی به رمزنگاری، مجوزها، و
تنظيمات خط مشی برنامه کاربردی در اين فضانام قرار می گيرند.
• System.XML: امکان دسترسی به کلاسها و رابطهای مخصوص پردازش اسناد XML را فراهم می کند.
فضانام Microsoft
علاوه بر فضانام System که در چارچوب NET. يافت می شود، مايکروسافت چند
فضانام اضافه کرده است که برای زبان برنامه سازی ای که می خواهيد از آن در
برنامه کاربردی خود استفاده کنيد عملکرد لازم را تامين می کنند. ممکن است
شما بصورت مستقيم با اين فضانام کاری نداشته باشيد.
• Microsoft.VisualBasic: اين فضانام محتوی CLR يا زمان اجرای Visual
Basic.NET است. از اين زمان اجرا با زبان Visual Basic.NET استفاده می شود.
اين فضانام همچنين دربرگيرنده کلاس هايی است که از کامپايل و توليد کد با
استفاده از زبان ويژوال بيسيک پشتيبانی می کنند.
• Microsoft.CSharp: اين فضای نام دربرگيرنده کلاس هايی است که از کامپايل و توليد کد با استفاده از زبان #C پشتيبانی می کنند.
• Microsoft.JScript: اين فضای نام دربرگيرنده کلاس هايی است که از کامپايل
و توليد کد با استفاده از زبان JScript پشتيبانی می کنند.
• Microsoft.Win32: کلاسها و رابطهای مورد نياز برای کار با کليدها و hiveهای رجيستری را تامين می کند.
با وجود آنکه فضانام ها از قبل تامين می شوند، می توانيد برای استفاده از
برنامه کاربردی ASP.NET فضانام های خود را ايجاد کنيد. برای هر کلاس ايجاد
شده توسط سازنده يک فضانام توليد می شود.
استفاده از فضانام ها در صفحات ASP.NET
دو راه برای افزودن فضانام به برنامه کاربردی ASP.NET وجود دارد. از شبه
دستور (Directive) صفحه Import@ برای صفحات ASPX و از کلمه کليدی Imports
برای افزودن فضانام به برنامه codebehind مربوطه در ويژوال بيسيک استفاده
می شود و برای زبان #C از دستور using استفاده می گردد. قطعه برنامه زير
ترکيب نحوی برای افزودن فضانام System.Web.UI.WebControls به صفحه ASP.NET
شما است.
<%@ Import namespace = "System.Web.UI.WebControls" % >
همين فضانام را در قسمت codebehind بصورت زير به برنامه اضافه می کنيم.
Imports System.Web.UI.WebControls (vb.net )
using System.Web.UI.WebControls; (C#)
( به تفاوت Import و Imports دقت کنيد )
در صورتيکه می خواهيد چند فضانام را به صفحه ASP.NET خود و
يا صفحه codebehind اضافه کنيد بايد هرکدام را جداگانه اضافه کنيد. بعنوان
مثال، برای افزودن فضانام System.Web.UI.HTMLControls به صفحات با فضانام
های موجود، درست بعد از آخرين عبارت مهم به خط بعد برويد و Imports
System.Web.UI.HTMLControls را اضافه کنيد. به محض آنکه .Imports System را
تايپ کنيد، VS.NET فهرستی از فضانام ها را ظاهر می کند، و می توانيد به
سادگی فضانام مورد نظر را با ماوس برگزينيد. امتياز اين فهرست آن است که
مجبور نيستيد همه فضانام های NET. را از حفظ بدانيد، بلکه می توانيد به
آسانی از فهرست انتخاب کنيد. اين ويژگی با عنوان Intellisense شناخته می
شود. برای صفحات ASP.NET از اين ترکيب استفاده کنيد:
< %@ Import namespace = "System.Web.UI.WebControls" % >
< %@ Import namespace = "System.Web.UI.HTMLControls" % >
< %@ Import namespace = "namespace name" % >
...
برای صفحات codebehind ويژوال بيسيک از اين ترکيب استفاده کنيد:
Imports System.Web.UI.WebControls
Imports System.Web.UI.HTMLControls
Imports namespace
هوش مصنوعی Artificial Intelligence تکنیکی برای خلق کردن ماشینهای است که قادر به فکر کردن بدون نیاز به انسان ها می باشند. یک ماشین تنها در صورتی به عنوان یک AI شناخته میشود که از یکسری قابلتهای خاص برخودار باشد. یکی از این قابلیتها داشتن شناخت از وجود خود و یا sentient بودن است.
این
بدین معناست که ماشین از وجود خود آگاه باشد. هر انسان به طور طبیعی از
حضور و وجود خود آگاه است اما هنوز مدرکی دال بر sentient بودن حیوانات در
دست نیست. تا کنون ماشینی که توانایی درک از خود را داشته باشد خلق نشده
است اگر چه یک گروه از دانشمندانی که در حال انجام یکسری ازمایشات بر روی
رباتهای زنده ((living robots ای که به گونه ای طراحی شده بوده اند که به
طور مستقل فکر کنند، بوده اند ادعا کرده اند که یکی از ربات های آنها به
نام گک (Gaak ) تلاش کرده است تا از محل زندگی خود فرار کند.
این ربات که در آزمایش “survival of the fittest” (زنده ماندن قویتر ها) شرکت داشته، سعی کرده تا از یکی از مبارزات روزانه اش بگریزد. گک ابتدا در کنار یک دیواره شروع به حرکت کرده و سپس پس از یافتن یک حفره به بیرون خزیده است اما هنگام فرار در یکی از اتوبانهای نزدیک محل آزمایش توسط یک اتومبیل از بین رفته است. اگرچه این حادثه میتواند نشانگر هوشمند بودن این ربات باشد اما دلیل قاطعی برای اثبات این موضوع نیست.
آزمایشی برای تشخیص هوشمند بودن ربات ها:
“turning test” نام آزمون بین المللی است که توسط آن هوشمند بودن یک ماشین مورد آزمایش قرار میگیرد. این آزمون بعد از Alan Turning، نابغه ریاضی که برای اولین بار این روش را پیشنهاد کرد اینگونه نام گرفت. در این تست 2 نفر (ََA و B ) در یک اتاق در بسته نشسته و نفر سوم (C ) در خارج از اتاق قرار میگیرد. نفر اول A سعی میکند تا نفر سوم را در مورد جنسیت خود (ربات یا انسان بودن) گمراه کند، در حالی که نفر دوم B تلاش میکند تا به نفر سوم C برای شناختن جنسیت نفر اول یاری دهد. ترنینگ پیشنهاد کرد که جای نفر اول با ماشین تعویض شود. در صورتی که آن ماشین بتواند همواره نفر سوم را مانند یک انسان فریب دهد آن ماشین احتمالاً هوشمند است.
AI های متخصص:
این نمونه از نرم افزارها برای انجام یکسری کارهای تخصصی طراحی شده اند و به طبع از قابلیتهای بالایی نیز برخودار میباشند. اینگونه برنامه ها معمولاً به یک بانک اطلاعاتی بسیار وسیع مجهز میباشند که آنها را قادر به پاسخگویی به سوالات کاربران میسازد. در حقیقت این برنامه ها برای رشته هایی مانند پزشکی، مهندسی و... طراحی شده اند و وظیفه آنها ذخیره سازی اطلاعات مفیدی است که به خاطر سپردن آنها توسط انسان بسار دشوار میباشد، اگرچه اینگونه برنامه ها از یک اشکال پایه ای رنج میبرند. تا زمانی که سوال مطرح شده توسط کاربر در محدوده اطاعات ذخیره شده در آنهاست هیچ مشکلی پیش نخواهد امد اما ظعف آنها هنگامی پدیدار میشود که سوال مطرح شده کمی خارج از حوزه اطلاعاتی آنها قرار گیرد که در این صورت اینگونه برنامه ها به کلی از پاسخ گویی به سوال درمانده خواهند بود. این ناتوانی از آنجا ناشی میشود که این دسته از برنامه ها توانایی generalization یا عمومیت دادن را ندارند.
منظور از generalization و یا عمومیت دادن چیست؟
منظور از generalization توانایی خلق کردن اطلاعات جدید بر اساس اطلاعات قدیمی است. تمامی انسان ها از این توانایی برخوردار هستند اگرچه ماشین ها به طور کامل و همانند انسان چنین توانایی را ندارند. برای درک بهتر موضوع به این مثال ساده توجه کنید: جان در یک کمپانی کار میکند. در محل کار او کابلهایی وجود دارد که توسط یکسری اشکال خواص علامت گذاری شده اند و نشانگر این موضوع هستند که این کابل ها حامل برق میباشند. جان در محل دیگری یکسری کابل با علائم مشابه را مشاهده میکند و نتیجه میگیرد که این کابل ها نیز حاوی جریان برق هستند.
Neutral nets چیست؟
Neutral nets مدل ریاضی مغز میباشد که در حقیقت همانند مغز موجودات زنده عمل میکند اما بر خلاف سایر AI ها بر مبنای منطق طراحی نشده است. مبنای ساختاری Neutral nets در حقیقت گروهی از neurones (سلول های عصبی) ها هستند که با هم در ارتباط میباشند و دارای بار ریاضی هستند. این گونه سیستم ها قادر به یادگیری از تجربیات خود هستند و این باعث میشود که آنها تا حدودی از توانایی generalize کردن برخوردار شوند و این یکی از مزایای این گونه سیستم ها میباشد. Neutral nets دی کنار مزایایی که دارد از معایبی نیز برهستند. برای مثال برای آماده کردن آنها به کار و وقت بسیار زیادی نیاز است زیرا اینگونه سیستم ها قبل از به کار گرفته شدن باید آموزش داده شوند. آنها از برخی جهات به کودکان شباهت دارند و هر مطلب باید چندین بار برای آنها تکرار شود تا آن را بیاموزند.
AI در بازی ها:
AI در بازیهای کامپیوتری معمولاً در نقش دشمن و یا متحدین شما ظاهر میشود. در برخی موارد طراحان بازی ترجیح میدهند تا بیشتر بر روی بالا بردن گرافیک بازی سرمایه گذاری کنند تا AI و این موضوع باعث میشود که بازیکنان خبره به راحتی AI را شکست دهند و یا در برخی موارد از آنجایی که AI به کدهای اصلی بازی دسترسی دارد با تقلب بازی را برده و موجب عصبانیت کاربر می شود.
.net Assembly توانائی ذخیره سازی منابع اضافه شده به برنامه ها ، از قبیل اطلاعات متنی و تصاویر مورد نیاز برنامه را دارد .
در حالت عادی ما به تصاویر یا متن های مورد نیازمان از طریق فایل های روی
هارد دیسک دسترسی داریم ، اما گاهی اوقات نیاز دارید که برنامه از منابع
خارجی که درون خودش ذخیره کرده استفاده کند. در این صورت شما هنگام توزیع
برنامه دیگر نگرانی درباره مسیر فایل های مورد نیاز آن که هنگام نصب برنامه
از کاربر درخواست می شود را ندارید.
حال طریقه استفاده از .net Assembly را شرح می دهیم:
ابتدا مراحل زیر را صورت دهید.
۱- یک پروژه جدید ایجاد کنید.
۲- در Solution Explorer بر روی نام پروژه کلیک راست کرده و سپس روی گزینه Add Existing Item کلیک کنید.
۳- در پنجره Open نوع فایل را به All Files تغییر دهید.
۴- پس از انتخاب فایل ها روی آنها کلیک راست کرده و Properties را انتخاب کنید.
همانطور که می بینید مقدار اولیه خصوصیت Build Action مربوط به فایل ، Content میباشد که باید به Embedded Resource تغییر کند.
حال فایل های انتخابی شما بخشی از .Net Assembly هستند.
فراخوانی و نحوه استفاده از فایل های اضافه شده :
فرض می کنیم که شما یک تصویر با نام ۱/bmp و یک فایل متنی با نام Test.txt
را به برنامه وارد کرده اید.ما این دو فایل را در رویداد Form_Load
فراخوانی و نمایش می دهیم.
ابتدا System.IO را در برنامه Import کنید:
یک باگ نرم افزاری اصطلاحی است برای توصیف یک خطا، عیب، اشتباه، خرابی یا نقص در یک برنامه کامپیوتری که باعث ایجاد نتایج غیر منتظره یا نا درست در برنامه ها می شود. علت بسیاری از باگ ها در نرم افزارها، اشتباهات برنامه نویسان در هنگام نوشتن سورس کد نرم افزارهاست. در یک برنامه بزرگ، اشتباه در فاز طراحی نیز می تواند باعث ایجاد باگ های جبران ناپذیر شود.
باگ هایی که باعث ایجاد نتایج اشتباه در خروجی نرم افزار می شوند، از بدترین نوع باگ ها هستند. نرم افزاری که خروجی اشتباه تولید کند به درد کاربر نمی خورد و کسی از آن استفاده نخواهد کرد. برخی باگ ها بر روی کاکرد برنامه تاثیر می گذارند و ممکن است باعث کرش کردن برنامه شوند. بعضی از باگ ها، اشکالات امنیتی هستند و ممکن است باعث دسترسی افراد غیر مجاز به اطلاعات حساس سیستم شوند. در این میان باگ هایی نیز وجود دارند که تا مدت ها مخفی می مانند و بر روی کارکرد برنامه تاثیرات منفی می گذارند.
وجود داشتن باگ در نرم افزارها کاملاً طبیعی است. از آن جا که هیچ کدام از ساخته های بشر کامل و بی نقص نیستند، نرم افزار نیز از این قاعده خارج نیست. یک باگ می تواند هنگام شناسایی نیازمندی های سیستم نرم افزاری توسط یک تیم نرم افزاری ایجاد شود. اگر نیازمندی های یک سیستم به درستی تشخیص داده نشوند، طراحی نرم افزار اشکال خواهد داشت، و در نتیجه کدنویسی ما نقص خواهد داشت. به جز برنامه نویسان و طراحان سیستم، کاربران سیستم نیز می توانند با ورود داده های اشتباه به سیستم باعث ایجاد باگ در سیستم نرم افزاری شوند. اینجاست که اعتبار سنجی داده های ورودی کاربر اهمیت زیادی پیدا می کند.
برای جلوگیری از ایجاد باگ در سیستم های نرم افزاری در فازهای مختلف ایجاد سیستم از روش های استانداردی استفاده می کنند. با استفاده از روش های استاندارد و معروف مهندسی نرم افزار و جمع آوری درست نیازهای سیستم، تحلیل و طراحی بر اساس آن می توان باگ های احتمالی را به حداقل رساند. در هنگام برنامه نویسی بسیاری از خطاها هنگام کامپایل کردن برنامه رفع می شوند. اکثر باگ های مربوط به برنامه نویسی، خطاهای منطقی هستند که کامپایلرها توانایی تشخیص آن ها را ندارند. امروزه پلت فرم ها و زبان های برنامه نویسی پرکاربرد امکانات خوبی برای شناسایی و هندل کردن خطاهای برنامه نویسی به ما ارائه می کنند. بلاک های کنترل خطا و استثناها، ابزارهای خطایابی، کنترل نوع داده ها و شناسایی خطاهای زمان اجرا در یک زبان برنامه نویسی باعث ایجاد کمترین باگ در یک نرم افزار می شوند.
برای شناسایی باگ ها معمولاً قبل از ارائه نسخه عمومی یک نرم افزار، نسخه های آلفا و بتا را منتشر می کنند. این نسخه های آزمایشی در اکثر اوقات راه خوبی برای پیدا کردن باگ های جدید در یک نرم افزار است. کاربران از نسخه های آزمایشی استفاده می کنند و اشکالات برنامه را گزارش می کنند. معمولاً تیم های نرم افزاری برای این کار از نرم افزار های مدیریت باگ یا Bug Tracking و Issue Tracking استفاده می کنند تا عملیات ثبت باگ های جدید، بحث در مورد آن ها و رفع آن ها را مدیریت کنند. از این نرم افزارها می توان به Bugzilla، BugTracker.NET، JIRA و OTRS اشاره کرد.
دیباگ کردن یک روش مرسوم و پرکاربرد برای یافتن باگ ها و از بین بردن آن هاست. دیباگ به پروسه خطایابی در یک نرم افزار گفته می شود که قسمت عمده ای از زمان تست نرم افزار را به خود اختصاص می دهد. در اکثر مواقع برنامه نویسان بیشتر زمان خود را در حال دیباگ کردن کد خود هستند تا اینکه کد جدید بنویسند! ابزارهای دیباگر در محیط های توسعه با امکان اجرای خط به خط کد، مشاهده مقادیر متغیرها در زمان اجرا و مطالعه رفتار برنامه به برنامه نویسان برای پیدا کردن باگ ها و درست کردن آن ها کمک زیادی می کنند. حتی با وجود ابزارهای دبیاگر خوب، پیدا کردن بعضی باگ ها کار واقعاً سختی است. ممکن است پس از انتشار نسخه عمومی برنامه باگ های جدیدی توسط کاربران پیدا شوند، که در این مواقع برنامه نویسان با انتشار یک Patch سعی می کنند باگ های شناسایی شده را اصلاح کنند.
به زبان ساده ، برنامه نویسی پدافندی (که با نام برنامه نویسی تدافعی نیز شاخته می شود) به این معناست که خروجی ما همیشه منفی (False) است مگر اینکه خلافش ثابت شود ! در واقع در برنامه نویسی تدافعی همیشه تمرکز بر خروجی منفی است. هنگامیکه در حال توسعه برنامه های خود هستید ، باید برنامه نویسی تدافعی ، اعتبارسنجی ورودی ها ، بررسی برای خطاهای خارج از محدوده و مواردی از این دست را در نظر بگیرید. این نگرش حتی باید به مواردی مانند عبارت های if نیز گسترش یابد. برای فهم بهتر برنامه نویسی تدافعی مطلب را با ذکر یک مثال باز می کنیم.
قطعه کدهای ۱و ۲ که در زیر نمایش داده شده اند را در نظر بگیرید :
قطعه کد ۱ : یک عبارت If ساده
if (model.ValidationStatus == ValidationStatus.Invalid)
return false;
else
return true;
قطعه کد ۲ : یک عبارت If ساده دیگر
if (model.ValidationStatus == ValidationStatus.Valid)
return true;
else
return false;
کدامیک از عبارت های فوق امن تر است ؟ آیا آنها مشابه هم هستند ؟ چه اتفاقی روی می دهد اگر ValidationStatus دارای سه وضعیت : Valid ، Invalid و Unknown باشد؟ درقطعه کد ۱ اگر ValidationStatus برابر با Unknown باشد آنگاه True بازگشت داده خواهد شد. و این بدین معناست که کد شما تلقی خواهد کرد که آبجکت معتبر (Valid) است. گرچه در قطعه کد ۲ کد به طور خاص برای Valid بودن بررسی می شود و خروجی پیش فرض آن منفی است ، و بنابراین قطعه کد دوم امن تر است.
به نقل از وب سایت آراد حقی
مؤسسه SANS با همکاری CWE ، لیستی از خطرناک ترین خطاهای نرم افزاری ـ ناشی از عدم رعیت اصول برنامه نویسی امن ـ را منتشر و بروز می کند. در حال حاضر، نگارش دوم این لیست در دسترس است. این بیست و پنج مورد در سه دسته زیر طبقه بندی شده اند:
این لیست با به همراه رفرنس ها با توضیحات کامل ارائه شده است.
یکی از مباحث اساسی دروس ساختمان داده ها و اصول طراحی
الگوریتم ، یافتن الگوریتم هایی برای مرتب سازی اعدادی بهم ریخته ای است که
در یک آرایه پشت سر هم قرار گرفته اند. تا کنون الگوریتم های مختلفی برای
اینکار ایجاد شده است که در این مقاله با چند تا از این الگوریتم ها آشنا
میشوید. همچنین مرتبه پیچیدگی هر الگوریتم (میزان زمانی که از CPU برای اجرای هر الگوریتم می گیرد) را ذکر خواهیم کرد.
الگوریتم مرتب سازی انتخابی (Selection Sort ): در این روش، برنامه کوچکترین مقدار را یافته و آنرا در اولین خانه ی آرایه قرار می دهد. حال که کوچکترین عضو یافت شده است، برنامه به سراغ یافتن دومین عنصر کوچک در میان اعداد باقی مانده که از 2 تا n هستند می رود و دومین عدد کوچک را در خانه دوم قرار میدهد. حال به سراغ سومین عدد کوچک می رود و این رویه را تا یافتن آخر عدد و قرار دادن آن در جای خودش تکرار میکند. با توجه به اینکه برنامه باید n عدد را n بار با هم مقایسه کند مرتبه ی پیچیدگی این الگوریتم O (n2) است.
مرتب سازی حبابی (Bubble Sort ): در این روش هر عنصر با عنصر بعدی اش مقایسه میشود. در صورتی که عنصر دومی کوچکتر از عنصر اولی باشد، جای دو عنصر با هم عوض میشود. برنامه به کارش ادامه میدهد و عناصر دوم و سوم را با هم مقایسه میکند و این کار را تا اخر آرایه ادامه میدهد. دوباره الگوریتم ، پویش را از اول آرایه شروع میکند و مراحل قبل را تکرار میکند و این مراحل آنقدر تکرار میشوند تا آرایه کاملا مرتب شده باشد. مرتبه ی پیچیدگی این الگوریتم O(n2) است.
مرتب سازی درجی (Insertion Sort ): در این روش عنصر اول و دوم با هم مقایسه شده و در صورت نیاز مرتب میشوند و سپس سومین عنصر با عناصر اول و دوم مقایسه میشود. در صورتی که عنصر سوم از اولی کوچکتر باشد به جای اولین عنصر می نشیند و عناصر قبلی به سمت راست هل داده میشوند. اگر عنصر سوم از اولی بزرگتر و از دومی کوچکتر باشد، بین آنها درج میشود و عنصر دوم به بعد یکی به سمت راست هل داده میشود. (پس در این روش همیشه عناصر ِ قبل از عنصری که میخواهیم مرتبش کنیم، مرتب هشتند.) این روال برای بقیه عناصر نیز اجرا میشود و هر عنصر در جای خودش قرار می گیرد تا تمام عناصر مرتب شوند. مرتبه ی پیچیدگی این الگوریتم O (n2) است.
مرتب سازی سریع(Quick Sort ) : در این الگوریتم یک عنصر را بعنوان محور (pilot ) مرتب سازی انتخاب میکنیم. و تمام عناصر کوچکتر از آن را به سمت چپ آن برده و عناصر بزرگتر را به سمت راست اش میبریم. حالا بخش چپ خودش یک بخش جدید است که با الگوریتمی که گفتیم آنرا مرتب میکنیم و سمت راست را نیز همینطور. یعنی در سمت چپی ها دوباره یک عنصر را بعنوان pilot در نظر میگیریم و عناصر کوچکتر از pilot را به سمت چپ آن و عناصر بزرگتر از pilot این قسمت را ، به سمت راست pilot می بریم. دوباره الگوریتم را روی یک چهارم های به وجود آمده اجرا میکنیم و اینکار را آنقدر ادامه میدهیم تا کل آرایه مرتب شود. مرتبه پیچیدگی این الگوریتم در بدترین حالت O (n2) است. اما در حال نرمال O (n log n) است که کمترین مرتبه پیچیدگی برای مرتب سازی اعداد به حساب می آید.
مرتب سازی ادغام (Merge Sort ): این الگوریتم به روش بازگشتی (Recursive ) عمل میکند و آرایه را به چند آرایه ی دو عنصری تقسیم میکند و آنها را مرتب میکند. سپس آرایه های کوچک را دوبهدو با هم ادغام میکند تا آرایه های مرتب 4 عنصری ایجاد شوند و بعد آرایه های 8 عنصری و به همین ترتیب پیش می رود تا آرایه اصلی بصورت مرتب شده ظاهر شود. مرتبه پیچیدگی این الگوریتم O(n log n) است.
مرتب سازی هرمی (Heap Sort ): در این روش، برنامه از کل آرایه ی داده شده یک درخت MaxHeap می سازد. (درخت مکس هیپ درختی دودویی و کامل است که مقدار ذخیره شده در هر گره ، بزرگتر و یا مساوی مقدار ذخیره شده در گره فرزندانش است) سپس مقدار ماگزیمم را از درخت حذف میکند و آنرا در انتهای آرایه میگذارد و دوباره از بقیه اعداد یک درخت maxHeap میسازد و باز روش مذکور را روی آن نیز اعمال میکند تا دومین عدد بزرگ یافت شود. در این روش آرایه از آخر به اول مرتب میشود. مرتبه پیچیدگی این الگوریتم O (n log n) است.
روش هایی وجود دارند که حداقل مرتبه ی پیچیدگی هر الگوریتم را با روابطی اثبات میکنند. بطور مثال برای الگوریتم های مرتب سازی ، میزان O (n Log n) حداقل است و کمتر از این میزان ممکن نیست و همانطور که میدانیم الگوریتم های ادغام و هرمی و سریع هر سه با همین میزان پیچیدگی مرتب سازی را انجام میدهند. بنابراین الگوریتمی نمیتوان نوشت که سریعتر از این حالت عمل کند و الگوریتم های مینیمم پیچیدگی در این زمینه ،قبلا کشف و ایجاد شده اند . اما مواردی هستند مانند ضرب دو ماتریس n در n که مرتبه ی پیچیدگی شان O(n3) است و روش های جدیدی مانند روش استراسن آنرا به O(n2.81) کاهش داده است. طبق روشهای اثبات شده امکان کمتر شدن این میزان وجود دارد. اما هنوز الگوریتمی که هزینه ی پیچیدگی کمتری از الگوریتم استراسن داشته باشد کشف نشده است. بنابراین هنوز شما میتوانید وقت خود را روی کاهش مرتبه ی پیچیدگی این الگوریتم و یافتن الگوریتم بهینه تر بگذارید.
وقتی صحبت از کد native می کنیم مگر منظورمون همون کدهای صفر و یک قابل درک واسه کامپوتر نیست؟ پس آیا هنگام اجرای چنین کدهایی بازم باید کامپایلر روی سیستم هدف نصب باشه ؟ و اگر کد صفر و یک هست دیگه چه فرقی داره سیستم عامل چیه؟
اینکه می گیم بعضی از زبانها مثل C# یا جاوا مستقل از پلتفرم هستند آیا به این معنی هستش که کامپایلر اونا روی هر سیستمی نصب می شه ؟؟
آیا این همون بستگی داشتن Runtime هستش؟؟
و در آخر اینکه کد بایتهای جاوا , کد های IL ماکروسافت و کدهای Native همه در فایلی با پسوند exe هستن. پس چطور سیستم عامل متوجه تفاوت اونا میشه؟؟
پاسخ ها:
native در لغت به معنی بومی هست که در هر جا معانی خود را دارد.
وقتی در مورد برنامه نویسی در سطح سیستم عامل صحبت می شود معمولا native به کد هایی می گویند که خود سیستم عامل بر مبنای آن پیاده سازی شده است و بالاترین performance یا کارآیی را برای ارتباط با سخت افزار نسبت به سایر روش ها دارد.(به این مورد platform-specific native APIs می گویند)
ولی در بحث مستقل از پلتفرم ، بله به کد صفر و یک که زبان ماشین می نامند و آن را native machine language در سیستم مورد نظر نیز می گویند که به دلیل حضور معماری سخت افزاری مختلف و پردازنده های مختلف با هم متفاوت هستند، پس نباید native در این مورد را با مورد قبل اشتباه بگیرید.
کدهای EXE درست هست که به زبان ماشین تبدیل می شود ولی وابسته به پلتفرم یا همان سیستم عامل هست، چرا که بسیاری از کارها برای سهولت در توسعه به صورت run-time از طریق کتابخانه های آن سیستم عامل و یا مثلا در ویندوز از dll های مختص به ویندوز فراهم می شود (که به طور معمول آن ها هم به زبان ماشین ترجمه شده اند) و ضمنا بهینه سازی ها بر روی کدها را نیز نباید فراموش کرد و اینکه هر فایلی با پسوند EXE قرار نیست دارای یک محتویات مشخص باشد و حتما روی ویندوز اجرا شود، مانند فایل های EXE ساخته شده برای گوشی های ویندوز موبایل و CE که در ویندوز دسکتاب اجرا نمی شوند. به همین دلایل هست که در سایر سیستم عامل ها و دستگاه ها فرمت های اجرایی مختلفی و مختص آن وجود دارد.
در مورد کد های مدیریت شده ، .Net Framework شامل دو جزء اصلی هست:
1- common language runtime یا همان CLR
.NET Framework class library - 2
CLR بخشی هست که اعمالی مثل مدیریت حافظه ، اجرای کد ها و thread ها ، حفظ امنیت کدها و کامپایل آن ها و سایر سرویس های سیستمی را انجام می دهد.
class library همان بخش اصلی .Net برای تولید نرم افزار ها با رابط گرافیکی کاربری (GUI) ، نوشتن برنامه های کنسول ، XML ، ASP.NET و غیره هست.
وقتی گفته می شود کدهای مدیریت شده مستقل از پلتفرم هست یعنی اینکه هر جایی که CLR وجود داشته باشد امکان اجرای آن وجود دارد، به این شکل:
ابتدا آن ها باید به زبان میانی مایکروسافت (MSIL) کامپایل شوند و سپس در هنگام اجرا از طریق کامپایلر JIT / just-in-time به کد های Native سیستمی ترجمه شوند که کدهایی مختص CPU هستند و از آنجایی که CLR از طریق کامپایلر JIT همه پردازنده ها را پشتیبانی و پیاده سازی کرده است پس می توانید برنامه هایی بنویسید که در همه کامپیوترها با ساختار معماری مختلف اجرا شود.
اما این موضوع مهمی است که تا کنون درهمین حد تبلیغاتی باقی مانده است، چرا که اگر در کدهای مدیریت شده از API های Native سیستم عامل یا کتابخانه های مختص آن سیستم عامل استفاده کنید (از جمله class library .NET که چاره ای نیست و باید از آن ها استفاده کرد) لذا برنامه مدیریت شده فقط در همان سیستم عامل قابل اجرا شدن می باشد و تنها راهی که وجود دارد این است که همه شرکت ها یک لیسانس از مایکروسافت با هزینه های بسیار بالا برای کتابخانه های .Net دریافت کنند تا برنامه های نوشته شده در ویندوز که از همان class library استفاده کرده است بتواند در سایر کامپایلرها نیز اجرا و یا کامپایل شود که تا کنون شرکتی این کار را نکرده است و فقط برخی از شرکت ها به شبیه سازی آن اقدام کرده اند.
توجه کنید که CLR و C# استاندارد جهانی هستند و نیاز به خرید ندارند و هر کسی با دریافت استاندارد ها، می تواند کامپایلر آن را پیاده سازی کند ویا حتی زبان خود را نیز مبتنی بر CLR ارائه کند تا از قابلیت های دات نت بهره مند شود. پس بخش مشکل ساز، بخش class library می باشد که تا کنون مختص ویندوز بوده است.
در مورد Java هم وضع تقریبا به همین شکل هست اما با آزادی بیشتر، یعنی اینکه کدهای شما به کدهای میانی (کد بایت) تبدیل می شوند و هر جا که java Runtime یا مثلا ماشین مجازی جاوا وجود داشته باشد برنامه شما می تواند اجرا شود چون که کدهای میانی شما در حین اجرا باید خط به خط به زبان قابل فهم سیستم ترجمه و تفسیر شوند.
در مورد C و ++C هم به همین شکل که اگر همانند کدهای مدیریت شده از API های Native سیستم عامل استفاده نکنند، با طراحی کامپایلر آن به عنوان یک زبان مستقل از پلتفرم هستند، اما با یک تفاوت اساسی نسبت به سایر زبان ها:
این تفاوت که از همان ابتدا استاندارد و دردسترس همگان بودند و وابسته به کتابخانه های تغییر پذیر مثل کتابخانه های .NET نیز نبودند، لذا با توجه به محبوبیت آن ها با حضور کتابخانه های Cross-platform می توان از API های Native هر سیستم عامل به دلیل ثبات بالای آن ها و البته با درجه اعتماد بالایی استفاده کرد.
پس با توجه به این مطالب در حال حاضر Java و ++C را می توان پرکاربردترین و مهم ترین ابزار مستقل از پلتفرم مطرح کرد، آن هم به دلیل حضور چشمگیر در سایر ابزارها و پلتفرم های نرم افزاری و سخت افزاری.
هر چند که در این بین نباید از سایر زبان ها از جمله python غفلت کرد که مسیری همانند این دو زبان را در پیش دارند.
به نقل از: barnamenevis
Managed
class Ta
{
private:
int a;
}
__gc class Ta
{
private:
int a;
}
نمی دونم چرا ؟ ولی خیلی وقتها شده روی یه مسئله برنامه نویسی که گیر کردم وقتی قبل خواب تو تختم بهش فکر می کنم و کمی تحلیل خیلی ساده راه حلش رو پیدا می کنم شاید موقع خواب آدم تمرکز بیشتری داره !!! امتحان کنید
Visual Studio Just In Time Debugger is a good tool but it becomes very irritating when it crashes other application.
To disable it, here is the procedure
1. On the Tools menu, click Options.
2. In the Options dialog box, select the Debugging folder.
3. In the Debugging folder, select the Just-In-Time page.
4. In the Enable Just-In-Time debugging of these types of code box, select or clear the relevant program types: Managed, Native, or Script.
To disable Just-In-Time debugging, once it has been enabled, you must be running with Administrator privileges. Enabling Just-In-Time debugging sets a registry key, and Administrator privileges are required to change that key.(If you are using Windows Vista, right click on Visual Studio and click run as an administrator for running it)
5. Click OK.

#include
#include
#include
#define MAX 20
int set[MAX];
int flag[MAX];
int n=5;
int subset(int m);
int main()
{
cout<<"enter "<
cin>>set[i];
flag[i]=0;
}
subset(0);
return 0;
}
int subset(int m)
{
if (m==n)
{
for (int j=0 ; j < n ; j++)
{
if (flag[j]==0)
cout<
cout<<"\n";
return 0;
}
flag[m]=1;
subset(m+1);
flag[m]=0;
subset(m+1);
}
اسم این روش رو خودم انتخاب کردم و معنی و مفهوم آن این است که :
وقتی تو یه سایت کاربر می خواد وارد یه قسمت بشه که فقط کاربرای لوگین کرده می تونین به اون صفحه دسترسی داشته باشن شما به دستوری مثل response.redirect (login.aspx) کاربر رو به صفحه لوگین منتقل می کنید ولی بعد از اینکه کاربر لوگین کرد به صفحه قبلی بر می گرده ؟
برای اینکه این کار انجام بشه شما تو اون صفحه ای که نیازمند لوگین کردنه اسم صفحه رو هم با روش QueryString به صفحه login پاس می دین یعنی به جای دستور :
response.redirect("login.aspx");
دستور زیر رو می نویسید :
response.redirect("login.aspx?refer=order.aspx");
و تو صفحه لوگین چک می کنید که اگه متغییر refer پر باشه بعد از لوگین کردن به اون صفحه برگرده یعنی به شکل زیر :
if (Request.QueryString["refer"] != null)
{
Response.Redirect(Request.QueryString["refer"].ToString());
}
else
{
Response.Redirect("Default.aspx");
}
Janus نام یكی دیگر از Component هایی است كه به منظور استفادهی راحتتر از قابلیتهای دات نت برای برنامه نویسان تهیه و ساخته شده است.
این كامپوننت برای برنامه نویسی در حالت WinForm میباشد كه امكانات و تواناییهای بسیار زیادی را در این حیطه به شما خواهد داد.
حتماً تا به حال با Office 2007 ماكروسافت كار كردید، یا حداقل محیط اون رو دیدید، این قضیه برای برنامه نویسان خیلی دوست داشتنی است كه بتونند، برنامههای ویندوز بیس خودشونو با Style آفیس 2007 ماكروسافت طراحی كنند.
این كامپوننت این امكان رو به سادگی برای شما فراهم میكنه، شما به وسیلهی Janus میتونید بدون دردسر، Application هایی با ظواهری بسیار زیبا داشته باشید. در ضمن اكثر ابزارهای این Component از Style های Office 2007 ، Office 2003 ، Office XP ، VS2005 پشتیبانی میكنه.
از دیگر ابزارهای این كامپوننت موارد زیر میباشد.
Janus GridEX for .NET
Janus Schedule for .NET
Janus ButtonBar for .NET
Janus ExplorerBar for .NET
Janus Timeline for .NET
Janus Ribbon Control
Janus UI Bars – Menus, ToolBars, Panels and Tab controls
موارد ذكر شده در بالا تمامی امكانات این كامپوننت ارزشمند نیستند، بلكه فقط تعدادی از ابزارهایی هستند كه منحصراً Janus بر روی آنها دقت و توجه خاصی داشته است، به قول معروف اونها رو Highlight كرده. این كامپوننت تقریباً اكثر كامپوننتهای لازم را جهت طراحی یك Application تحت ویندوز خواهد داشت، مثل دكمه، دراپدان منو، تكست باگس یا دیگر موارد دیگر. . .
Janus GridEX
همونطور كه ار اسمش پیداست، این ابزار امكانات یك Grid رو به شما خواهد داد با اضافهی بسیاری دیگر از قابلیتهای مورد نیاز در این مورد، در ضمن پشتیبانی از انواع Style ها و رنگبندیها برای زیباتر شدن هرچه بیشتر Grid.
Janus ButtonBar
ButtonBar ابزاری است كه شبیه منوی Outlook ماكروسافت میباشد كه بیشتر در كنارههای صفحه به كار میرود، بیشتر از این ابزار در برنامههایی كه تعداد زیادی منو دارند استفاده میشود، به كمك این ابزار شما دسترسی كاربران را به تمامی نقاط نرمافزار خود به راحتی فراهم میآورید و همه چیز دمه دست كاربر خواهد بود.
Janus ExplorerBar
ExplorerBar نیز چیزی شبیه به ButtonBar است با این تفاوت كه از نظر شكل ظاهری كمی با ButtonBar فرق میكند و همچنین موارد كاربرد دیگری هم دارد
Janus Ribbon Control
این همان ریبون Office 2007 میباشد كه میتونید در شكلها اون رو مشاهده كنید، یك Office 2007 بدون هیچ كمی و كاستیای. با این ریبون برنامهی شما كم نظیر خواهد شد.
Janus UI Bars
نیز مجموعهای از منو، تولبار، پنل و تب كنترل است (Menus, ToolBars, Panels and Tab controls) كه تمامی این ابزارها با ساختاری زیبا و كاربردی آسان، برنامه نویسی را برای شما لذت بخش خواهند كرد.
اين كامپوننت بر روی VS2005 نصب و آزمايش گرديده و مشكلی نداشته است، براي اطلاع از ديگر جزئيات و اطلاعات كاملتر به سايت اين شركت مراجعه نماييد.
قابل توجه برنامه نويسان حرفهای:
شما ميتوانيد بدون نصب اين كامپوننت نيز، از آن استقاده نماييد. از طريق Register كردن فايلهاي DLL كه داخل بسته، به عنوان Patch معرفي شده است، با اضافه كردن دستی اين DLL ها داخل ToolBox ويژوآل استاديو، تمامي قابليتهای اين كامپوننت رو خواهيد داشت.
بررسي ها سبب شده است که بيشتر از گذشته به موفقيت فايل هاي Adobs PDF اذغان کنيم. يکي از مزيت هاي کلي اين نوع فايل ها اين است که تقريبا هر نوع داده اي را مي توان بدون نگراني از تغيير آن ها، درون اين فايل ها قرار داد. همچنين محتويات اين فايل ها توسط هر کسي که برنامه Acrobat Reader را داشته باشد، به راحتي قابل دسترسي است. اما استفاده از اين روش هميشه هم نمي تواند مشکل گشاي شما باشد، به طور مثال وقتي حجم اين نوع فايل ها بي اندازه زياد مي شود، ديگر استفاده و انتقال آن ها کار آساني نخواهد بود و اين امر وقتي دردسر سازتر مي شود که شما بايد فايل PDF خود را بدون از دست دادن کيفيت محتواي آن ها، به فرد مورد نظر يا رايانه مقصد انتقال دهيد. تا او بتواند به راحتي از فايل شما استفاده کند. ساخت فايل PDF با برنامه هاي گوناگوني ميسر است. بيشتر برنامه هاي نشر روميزي و برنامه هاي گرافيکي و برخي برنامه هاي پردازشگر متون، مي توانند اين نوع فايل را بسازند. اما اگر برنامه اي که هم اکنون از آن استفاده مي کنيد. به طور عادي قادر به ساخت آن ها نيست، مي توانيد با تهيه برنامه Acrobat Reader اين فايل ها را به راحتي بسازيد. با هر نرم افزاري که فايل PDF را مي سازيد، بايد به سه مورد اندازه فايل، کيفيت و قابليت فشرده سازي توجه کنيد تا بتوانيد بهترين PDF را بسازيد. در اين مقاله نه روش مختلف را براي بهينه سازي اين فايل ها به شما معرفي خواهيم کرد.
انتخاب يک Preset
اگر شما با مفاهيمي از قبيل، وضوح تصوير، تغيير حجم تصوير در هنگام تبديل نوع آن، و فشرده سازي آشنا باشيد. خواهيد توانست با انتخاب يک Preset مناسب در برنامه خود يک فايل بهينه ايجاد کنيد، مثلا برنامه Adobe In Desingn هفت خروجي Preset را از صفحه نمايش تا انتشار به شما معرفي مي کند.
انتخاب نوع خروجي PDF
يک مسئله مهم و حساس در اسناد عکس دار، تنظيم درست وضوح تصوير است که در کيفيت و حجم فايل PDF تاثير به سزايي دارد. شما بايد بدانيد که خروجي نهايي فايل PDF شما به چه صورت خواهد بود، آيا تنها قرار است که کاربر آن را در صفحه نمايش ببينيد يا بايد آن را چاپ کند. صفحات رايانه ها، اغلب تصاوير با وضوح 72dpi را خوب نشان مي دهند و اين وضوح حجم زيادي را نيز اشغال نمي کند. ولي در مقايسه با آن ها، چاپگرها خروجي اي برابر 300dpi يا بالاتر دارند. که اگر اسناد عکس دار خود را با همان وضوح 72dpi چاپ کنيم، تصاوير به صورت نقطه به نقطه و غيرشفاف چاپ خواهند شد. اگر هم وضوح تصوير را تا 300dpi بالا مي بريد، مقدار قابل توجهي به حجم فايل شما افزوده مي گردد. اگر فايل PDF شما براي استفاده در صفحه نمايش ساخته مي شود. قبل از آن که اقدام به پخش آن کنيد، بهتر است آن ها را چاپ و کيفيت آن ها را ارزيابي کنيد. اگر واقعا به کيفيت بالاي چاپ احتياج داريد، بهتر است که دو نسخه از يک PDF تهيه کنيد، يکي براي صفحه نمايش که حجم کمتري دارد و ديگري براي چاپ که حجم بيشتر و کيفيت بهتري دارد.
تنها يک بار فشرده کنيد!
فشرده کردن تصويرها در فايل هاي حاوي تصاوير، مي تواند کمک خوبي براي شما باشد تا اين که حجم فايل را کم کنيد. اين امکان وجود دارد که هر يک از خروجي هاي برنامه ساخت محتويات ( Content Cretion Program ) را فشرده کنيد يا بعدا داخل خود Acrobat آن ها را فشرده نماييد. اگر شما در دو مرحله تصويرتان را فشرده کنيد، با اين که ترفند خوبي براي کاستن حجم فايل به نظر مي رسد، ولي اين کار سبب مي شود فايل شما افت کيفيت قابل ملاحظه اي پيدا کند. بنابراين بهتر است فايل خود را تنها در توليد PDF نهايي فشرده کنيد. بهترين راه هم براي توليد فايل توليد فايل نهايي استفاده از ابزارهاي معمولي خود برنامه ساخت محتويات است که مي توان از آن استفاده کرد و يا خود Acrobat يا بدون فشرده سازي از برنامه ساخت محتويات PDF تان بگيريد و بعد در نهايت در Acrobat آن را فشرده کنيد.
استفاده از تصاوير خاکستري
استفاده از تصاوير طيف خاکستري به جاي تصاوير رنگي مي تواند تا 25 درصد از حجم فايل شما را کم کند.
استفاده از رنگ هاي RGB براي صفحه نمايش
اگر مطمئن هستيد که خروجي فايل شما تنها صفحه نمايش است، از رنگ هاي RGB استفاده کنيد. اين کار باعث مي شود برخلاف رنگ هاي CMYK . تقريبا 50 درصد از حجم فايل شما کاسته شود.
پيدا کردن عوامل افزايش حجم
Acrobats PDF Optimizer مي تواند براي شما يک « Space Audit » انجام دهد که در نهايت ليستي از تمام اجزاي سازنده فايلتان با مقدار حجم آن ها و درصد اشغال فضاي آن ها را روبه روي خود، خواهيد ديد. بنابراين مي توانيد اجزايي که فضاي بيشتري را اشغال کرده اند شناسايي کنيد. به بخش Advaced\PDF Optimizer برويد. روي کليد «Audit Space » کليک کنيد. براي اين که به صورت دستي فايل خود را کوچک کنيد، اينجا محل خوبي خواهد بود.
بهره گيري از فونت هاي رايج
در متون فايل هاي PDF ، غالبا از فونت هايي استفاده مي شود که مي توانند فضاي زيادي را اشغال کنند. شما مي توانيد آن ها را با فونت هاي مناسب عوض کنيد و به ازاي هر فونت 40 کيلوبايت از حجم فايل بکاهيد. اما اگر کامپيوتر مقصد فونت انتخابي شما را نداشته باشد، Acrobat از يک جايگزين براي آن استفاده خواهد کرد که علاوه بر اين که در مواردي نتيجه مطلوب نخواهد داشت، ممکن است باعث تغيير ناخواسته يا تحريف PDF شما نيز بشود. پيشنهاد مي شود از فونت هاي رايجي مثل Arial و Times Roman استفاده کنيد تا با خيال آسوده تري PDF خود را انتشار دهيد.
سازگاري را فراموش نکنيد
در Adobe ابزارهاي پيشرفته تري براي کم کردن حجم فايل ها وجود دارد که در هر نسخه از Adobe اين ابزارها بهينه تر شده اند و مي توانند مقدار بيشتري از حجم فايل را کم کنند، اما نکته قابل توجه اين است که کاربران PDF شما همواره بايد از آخرين نسخه هاي اين نرم افزار استفاده کنند تا بتوانند به آن مراجعه کنند، آماده کنيد. اگر با پيش فرض هاي خود برنامه Acrobat به ساخت فايل PDF اقدام کنيد، ممکن است در نهايت سندي براي شما ساخته شود که تمام کاربران نتوانند آن را بخوانند و در استفاده از بخشي آن دچار مشکل شوند.
فشرده سازي فايل هاي چند رسانه اي
اگر مي خواهيد فايل صوتي يا ويدئويي را درون فايل PDF جاگذاري کنيد، لازم است آن ها را با بيشترين حالت فشرده سازي قابل انجام (در حالت Streaming ) کوچک کنيد. اين کار با نرم افزارهايي مثل Quick Time يا Microsoft Windows Media قابل انجام است. در فايل هاي صوتي سخنراني مي توانيد سرعت رمزگذاري را تا 84Kbps پايين بياوريد و افت کيفيت قابل ملاحظه اي را هم احساس نکنيد. البته اين کار باعث کاهش زياد حجم فايل صوتي خواهد شد. در حالي که فايل هاي موسيقي حداقل به سرعت 69Kbps براي داشتن کمترين کيفيت نياز دارند. فايل هاي ويدئويي نيز با سرعت 300 تا 400Kbps رمزنگاري مي شوند که در اين حالت شما وضوح 320x240 را خواهيد داشت. اما کم تر از 200Kbps کيفيت تصوير افت قابل ملاحظه اي خواهد داشت. با اين که شما با اين روش ها مي توانيد از مقدار حجم اين فايل ها بکاهيد، در نهايت با اضافه کردن آن ها به فايل PDF ، باعث افزايش زياد حجم آن خواهيد شد. استفاده از روش هاي ارائه شده، شما را به سمتي هدايت خواهد کرد که بتوانيد در نهايت يک فايل PDF خوب و با کيفيت و در حجمي کم به کاربر خود انتقال دهيد که در هنگام استفاده از اين فايل ها با هيچ مشکلي مواجه نشود.
تا حالا شده به برنامه ای برخورد كنید و مثلا ببینید كه از كنترل هایی استفاده كرده كه خیلی كارا و زیبا هستند. حتما به این فكر می افتید كه چطور میشه این كنترل ها را بدست آورد. یك مجموعه بسیار زیبا و كارا جهت برنامه های كاربردی كنترل های janus هستند و معروفترین آنها gridx است كه یك data grid بسیار پیشرفته با امكان گروه بندی بر روی هر فیلد در حین اجرای برنامه می باشد كه كار برنامه نویسی را بسیار آسان كرده است. همچنین امكان فیلتر گذاری خودكار در حین اجرای برنامه توسط كاربر یكی دیگر از مزایای آن هست و دیگر لازم نیست كه برنامه نویس جهت جستجوی یك ركورد كدهای مختلفی رو برنامه نویسی كند. این كنترل های زیبا را می توانید از اینجا دانلود كنید.
نمونه ای از فرمی كه دارای جدول janus هست را در شكل زیر می بینید. قسمت خاكستری همان محلی است كه برای گروه بندی كردن اطلاعات كاربر می تواند فیلد مورد نظر خود را به آن ناحیه با موس بكشد.
در شكل زیر یك فرم را مشاهده می كنیم كه از اكثر این كنترل ها استفاده كرده است همانطور كه می بینید فرم شبیه به برنامه office 2007 می باشد كه شما می توانید الگوهای مختلف دیگری را نیز جهت برنامه انتخاب كنید
برای ارسال gridex جانوس به چاپ می تونید از روش زیر استفاده كنید
در ابتدا كنترلهای زیر را در فرم خود اضافه كنید
PrintPreviewDialog
GridEXPrintDocument
خوب حالا خاصیت gridex كنترل GridEXPrintDocument را برابر با gridex موجود در فرم می كنیم
خاصیت document كنترل PrintPreviewDialog را برابر با GridEXPrintDocument می كنیم
هر جا كه خواستیم چاپ را نمایش دهیم از كد زیر اسفاده می كنیم
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog
به طور معمول نسل های جديد زبان های برنامه نويسی به اين دليل متولد می شوند که زبان های قديمی تر دارای امکانات محدود بودند و يا قدرت استفاده از تکنولوژی های فعلی را به صورت مطلوب و ساده ندارند.
مهمترين نيازی که به عنوان آخرين تکنولوژی وجود دارد، برنامه نويسی در محيط اينترنت است. اينترنت در مدت تقريبا ۸ سال جای خود را به عنوان يکی از مهمترين وسايل ارتباطی برای کارهای روزمره و تجارت باز کرده است. سيستم های برنامه نويسی قديمی تر امکان برنامه نويسی برای اينترنت را فراهم کرده بودند اما هر کدام دارای اشکالات بزرگی هستند، برای مثال تکنولوژی COM اولين بار در ويندوز به کار گرفته شد. در سال ۱۹۷۰ نيز سيستم هايی برای Unix نوشته شده بودند، جاوا نيز در اصل برای ابزارهای الکترونيکی بود و نه برای اينترنت.
سپس برای اولين بار يک سيستم جامع برای برنامه نويسی تحت اينترنت ايجاد شد. اين سيستم -NET. از مراحل سطح پايين که به زبان ماشين می باشد تا بالاترين سطح که برنامه نويسی ويژوال آن می باشد برای استفاده در اينترنت طراحی شده است. البتهNET. فقط برای اينترنت نيست و با استفاده از آن می توان برنامه های کامل تحت Client نيز ايجاد کرد، اما بزرگترين مزيت آن دربرابر سيستم های ديگر امکانات اينترنت آن است.
برای اينکه مزايای استفاده ازNET. را بهتر متوجه بشويم بهتر است در ابتدا معايب سيستم های پيشين را ذکر کنيم. شرکت مايکروسافت تا قبل از سال ۱۹۹۵ به برنامه نويسی در محيط های Client و Server می پرداخت، اما از آن سال به بعد توجه بيشتری به مساله برنامه نويسی در اينترنت کرد. مايکروسافت COM و +COM را ايجاد کرد و آنها را در ويژوال استوديوی ۶ به کار گرفت. در سال ۱۹۹۹ حدود ۵۰ در صد از بزرگترين سايتهای تجارت الکترونيکی از محصولات مايکروسافت استفاده می کردند. اما هنوز هم مشکلات بزرگی در سيستم های مايکروسافت وجود داشت که يکی از آنها دشواری نوشتن برنامه در اينترنت با محصولات مايکروسافت بود. شرکت مايکروسافت برای راحتی کار برنامه نويس ها ASP يا Active Server Page را ايجاد کرد. با اينکه اين يک قدم بزرگ بود و کارها را بسيار ساده کرد ولی هنوز از برنامه نويسی شی گرا پشتيبانی نمی کرد. همچنين در ويژوال استوديوی ۶ قسمتی برای Internet Application ايجاد شده بود و در آنها امکان ساختن Web Class وجود داشت ولی هيچ وقت به عنوان يک ابزار کار آمد برای برنامه نويسی وب درنظر گرفته نشد.
مدل برنامه نويسی DNA
مايکروسافت يک مدل برنامه نويسی به نام Distributed interNet Application دارد که بر پايه برنامه نويسی n-tier و COM بنا نهاده شده است. مدل DNA از سه بخش اساسی تشکيل شده است.
بخش اول به نام Presentation tire معروف است. در اين بخش رابط تصويری کاربر وجود دارد و خود نيز به دو نوع Internet Browser و Win 32 GUI تقسيم می شود که هر کدام مشکلات خاص خود را دارند. در مدلی که از Win32 GUI يا همان نرم افزارهای معمولی استفاده می شود دو مشکل بزرگ وجود دارد ؛ دشواری بروز رسانی نرم افزار و ديگری DLL Hell که در ادامه توضيح داده خواهد شد. در نوع دوم مشکلاتی از قبيل نبود امکانات برنامه نويسی کافی در محيط مرورگر، نبود رابط قوی با کاربر، نبودن مرورگر های يکسان و… وجود دارد. همچنين هميشه يک اتصال به اينترنت يا اينترانت لازم است. در اين نوع از برنامه نويسی می توان از Java Applet ها يا ActiveX استفاده کرد ولی مرورگر بايد امکان استفاده از آن را داشته باشد، مخصوصا ً هنگام استفاده از ActiveX که بايد فقط از IE استفاده کرد.
بخش دوم که Middle tier نام دارد، مکانی است که اطلاعات و قوانين تجاری در آن وجود دارد. منظور از قوانين ، متد ها و اجزائی هستند که اعمال کاربران را کنترل می کنند. مهمترين و آسان ترين زبان برای نوشتن اين اجزا از DNA ويژوال بيسيک است. برنامه نويسی که بخواهد در اين رده برنامه بنويسد بايد آشنايی کاملی با COM و پروتکل های رايج داشته، همچنين بايد مهارت کافی در استفاده از ADO و ADSI داشته باشد. مشخص است که يک اشتباه در اين لايه باعث بروز خطا و نقص در کل سيستم می شود.
بخش سوم يا Data tier مکانی است که اطلاعات سازمان در آن ذخيره می شود. معمولا ً در اين قسمت از بانکهای پيشرفته رابطه ای مانند SQL Server و Oracle استفاده می کنند.
محدوديت های COM
همانطور که ديديد مهمترين قسمت در DNA همان COM است که در جای جای آن استفاده می شود. در اينجا برخی معايب COM ذکر می شود : ( در ابتدای متن ذکر شد که برای درک نياز بهNET. بايد ابتدا معايب سيستم های قديمی را بشناسيم )
DLL Hell: اگر کوچکترين تغييری در يک COM ايجاد شود، ديگر برنامه هايی که از ورژن قبلی استفاده می کردند قادر به فعال ساختن نسخه جديد نيستند. هنگامی که در ويندوز، يک COM نصب شود برايش در رجيستری يک GUID ثبت می شود که اطلاعات آن COM را در خود ذخيره می کند. اگر يک برنامه از نسخه اول يک COM استفاده کند و بعد از مدتی شما تغييراتی در نسخه اول بدهيد و بخواهيد آن را دوباره در سيستم نصب کنيد ويندوز به شما پيغام خطا می دهد چون ورژن آن تکراری است، اگر هم آن را به ورژن دوم ارتقا دهيد نرم افزار قبلی هنوز به دنبال نسخه اول می گردد. اين امر باعث می شود که شما مجبور شويد يکبار ديگر کل برنامه را کامپايل کرده و در کامپيوترتان نصب کنيد.
کمبود در وراثت: در نسخه های COM که در حال حاضرهستند چيزی به نام وراثتی که در ++C وجود دارد نمی باشد، بلکه وراثت تنها در واسط يک COM می باشد، استفاده از آن هم چندان کمکی به برنامه نويسی نمی کند.
برخی محدوديت های برنامه نويسی اينترنتی در مدل DNA
۱- وجود دو محيط برنامه نويسی برای اينترنت و Client
نقصان در نوشتن برنامه هايی با رابط گرافيکی خوب که در اينترنت کار می کردند کاملا ً مشهود است، نمونه بارز آن اختلاف در برنامه نويسی در ويژوال بيسيک و ASP است. ويژوال بيسيک با رابط گرافيکی کاملا ً سطح بالا و ASP تقريبا ً رابط گرافيکی ندارد. همين امر باعث می شد که يک برنامه نويس مجبور باشد طيف وسيعی از تکنيک ها و زبان ها را فرابگيرد تا بتواند برنامه ساده ای در اينترنت بنويسد.
۲- نبودن حالت های ذخيره اطلاعات رابط گرافيکی در صفحه های اينترنتی
نمونه اين حالت زمانی است که در يک textbox متنی وجود داشته باشد. در برنامه های Win32 GUI متن داخل textbox تا زمانی که کاربر يا برنامه آن را تغيير نداده بر جای خود وجود دارد. اما در محيط اينترنت و نوع ASP با هر بار refresh کردن صفحه کل اطلاعات ازبين می رود. البته اين مشکل با استفاده از شئ های Request و Response تقريبا ً قابل حل است ولی احتياج به برنامه نويسی برای هر تکه از صفحه ASP دارد.
۳- نداشتن Event Handler در محيط برنامه نويسی اينترنت
يکی از مهمترين ابزاری که در برنامه نويسی Win32 GUI وجود دارد استفاده از Event ها است. با تکنولوژی که در حال حاضر وجود دارد تنها راه رسيدن به اين مهم استفاده از ActiveX است که به علت مسايل امنيتی در بيش از ۹۵ در صد مواقع توسط کاربر استفاده از آن رد می شود.
معايب استفاده از API
API ها توابعی هستند که از ويندوز نسخه ۱ تا امروز در برنامه نويسی کاربرد داشته و دارند. مهمترين کاری که اين توابع انجام می دهند انجام کارهای سخت و سطح پايين سيستمی است که احتياج به برنامه نويسی زيادی دارند و يا حتی امکان ايجاد آن با زبان هايی مثل ويژوال بيسيک نيست. اما هر API از هر نسخه ويندوز تا نسخه ديگر آن می تواند دچار تغييرات بشود. برای مثال برنامه ای که در ويندوز ۹۸ نوشته شده باشد می تواند در ويندوز ۹۵ اجرا نشود. همچنين هم اکنون ابزارهای جديدی به بازار آمده است که برای آنها نيز می توان برنامه نويسی کرد، مانند تلفن های سيار، کيوسک تلفن، دستگاه های کامپيوتری جيبی و غيره. در اين نوع دستگاه ها ديگر ويندوز به مفهومی که در حال حاضر وجود دارد قابل اجرا نيست و در نتيجه API هم وجود ندارد. لازم به ذکر است که ويندوز CE برای دستگاه های مذکور می باشد ولی قابليت های آن با ويندوزهای ديگر تفاوت زيادی دارد.
خلاصه از کتاب Professional VB.NET از Wrox
با استفاده از این کدها شما میتوانید فایلهای متنی رو بدون تصاویر پرینت بگیرید
|
private void printToolStripButton_Click(object sender, EventArgs e) { try { op = new OpenFileDialog(); op.ShowDialog(); //MessageBox.Show(op.FileName); filePath = op.FileName; streamToPrint = new System.IO.StreamReader(filePath); printFont = new System.Drawing.Font("Tahoma", 8); System.Drawing.Printing.PrintDocument PD = new System.Drawing.Printing.PrintDocument(); PD.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PD_PrintPage); PD.Print(); try { } finally { streamToPrint.Close(); } } catch (System.Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message, "Error"); } }
private void PD_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { float linesPerPage = 0; float yPos = 0; int count = 0; float leftMargin = e.MarginBounds.Left; float topMargin = e.MarginBounds.Top; String line = null; // Number Of Lines linesPerPage = e.MarginBounds.Height; printFont.GetHeight(e.Graphics);
// Printing Each line while (count < linesPerPage && ((line = streamToPrint.ReadLine()) != null)) { yPos = topMargin + (count * printFont.GetHeight(e.Graphics)); e.Graphics.DrawString(line, printFont, System.Drawing.Brushes.Black, leftMargin, topMargin, new StringFormat()); count++; } // If More Line Exist if (line != null) { e.HasMorePages = true; } else { e.HasMorePages = false; } } |
در موارد زیادی پیش می آد که لازم باشه کاربر فقط عدد رو تو یک تکست باکس وارد کنه ، برای این کار روشهای زیادی وجود داره اما یکی از آسونترین راهها و البته نه بهترین راه ، استفاده از تابع TryParse است که در دات نت 2 وجود داره
البته راههای سریعتر و با بازده بهتری وجود داره که به دلیل راحت تر بودن این راه این راه رو برای شما آوردم
برای این کار در رویداد KeyPress تکست باکس مورد نظر کد زیر را وارد کنید
private void InputNumber_KeyPress(object sender, KeyPressEventArgs e)
{
int isNumber = 0;
e.Handled = !int.TryParse(e.KeyChar.ToString(), out isNumber);
}
این برنامه با C#.Net 2.0 نوشته شده ،امیدوارم مورد استفاده شما باشه!
توی این برنامه سه متغیر سراسری تعریف شده به ترتیب برای:
try
{op = new OpenFileDialog();
op.ShowDialog();
//MessageBox.Show(op.FileName);
filePath = op.FileName;
streamToPrint = new System.IO.StreamReader(filePath);
printFont = new System.Drawing.Font("Tahoma", 8);
System.Drawing.Printing.PrintDocument PD = new System.Drawing.Printing.PrintDocument();
PD.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PD_PrintPage);
PD.Print();
try
{
}
finally
{
streamToPrint.Close();
}}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, "Error");
}
}
void PD_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
float linesPerPage = 0;
float yPos = 0;
int count = 0;
float leftMargin = e.MarginBounds.Left;
float topMargin = e.MarginBounds.Top;
String line = null;
// Number Of Lines
linesPerPage = e.MarginBounds.Height;
printFont.GetHeight(e.Graphics);
// Printing Each line
while (count < linesPerPage && ((line = streamToPrint.ReadLine()) != null))
{yPos = topMargin + (count * printFont.GetHeight(e.Graphics));
e.Graphics.DrawString(line, printFont, System.Drawing.Brushes.Black, leftMargin, topMargin, new StringFormat());
count++;}
// If More Line Exist
if (line != null)
{e.HasMorePages = true;
}
else
{e.HasMorePages = false;
}
{
مراحل کار اینطوریه که بعد از انتخاب،فایل توسط یه StreamReader خط به خط خونده می شه و توسط یه Print Document پرینت میشه
اگه تعداد خطوط فایل زیاد باشه توی چند صفحه فایل مورد نظر پرینت میشه.
برای تعیین زبان فارسی به عنوان پیش فرض در فرم ها در صورتی که زبان فارسی بر روی سیستم عامل نصب باشد کافی است در form load از کد زیر استفاده نماییم
|
private void Form1_Load(object sender, EventArgs e) |
bool searchtextfile(string fileadd, string regMatch)
{
bool find = false;
StreamReader testTxt = new StreamReader(fileadd);
string allRead = testTxt.ReadToEnd();
testTxt.Close();
if (Regex.IsMatch(allRead, regMatch))
{
find = true;
}
else
{
find = false;
}
}
Get Frequence of word in string
int GetFreq(string word)
{
string st = null;
st = 'StringThatContainWord';
int start = 0, count = 0, curr = 0;
int last = st.LastIndexOf(word);
do
{
curr = st.IndexOf(word, start);
if (curr != -1)
{
count++;
start = curr + 1;
}
}
while (last != curr);
return count;
}
فرض کنیم کسی در سایت شما ثبت نام کرد. نام کاربری ان test میابشد شما میخواهید برای ان یک صفحه داشته باشید . مانند test.aspx این صفحه واقعا وجود ندارد ولی زمانی که این کاربر این صفحه را درخواست میکند این url ساخته بشه و مثلا مشخصات ان را نمایش بدهد. اگر منظور مشا این است که با یک روش ساده انجام میشود ولی اگر چیز دیگری است لطفا کامل توضیح بدهید
برای این کار در فایل global.asax یک تابع وجود دارد
فرض کنید بخواهید مقدار فیلد شماره درس را در جدول Course تغییر دهید یا حذف کنید . ممکن است این مقدار در جدول Grade وجود داشته باشد . در این صورت ، اگر مقدار شماره درس در جدول course تغییر کند یا حذف شود ، اطلاعات جدول Grade که این شماره درس را دارند ، به رکوردهای نا معتبر تبدیل خواهند شد . به عنوان مثال دیگر ، فرض کنید شماره درسی را در جدول grade وارد کنید ، ولی این شماره درس در جدول Course موجود نیست . برای جلوگیری از این این مشکلات می توانید از تریگر ها استفاده کنید .ترگر ها ، نوع خاصی از رویه های ذخیره شده اند که در هنگام تغییر داده های جدول برای محافظت از طراحی بانک اطلاعاتی فعال می شوند و از ورود داده های نا معتبر جلوگیری می کنند.
دو تفاوت بین ترگر ها و رویه های ذخیره شده :
۱- تریگر ها فاقد پارامتر هستند . ولی رویه های ذخیره شده می توانند پارامتر داشته باشد .
۲- تریگر ها در هنگام تغییر داده های جدول فعال می شوند ، ولی رویه های ذخیره های ذخیره شده حتما باید فراخوانی شوند تا اجرا گردند.
هر جدول می تواند حداکثر ۳ تریگر داشته باشد که عبارتند از :
o تریگر در هنگام اضافه کردن رکورد (Insert )
o تریگر در هنگام به روز رسانی رکورد ( Update )
o تریگر در هنگام حذف رکورد ( Delete )
به طور پیش فرض ، کلیه تریگر های جدول پس از تغییرات جدول فعال می شوند . این تریگر ها AFTER نام دارند . تریگر های دیگری نیز وجود دارند که INSTEAD OF نامیده می شوند و به جای تغییر در داده های مورد نظر ، باعث فعال سازی خودشان می شوند . در SQL SERVER تریگر ها از دو جدول Inserted و Deleted استفاده می کنند . این جداول مضابه ساختار جدول پایه ای است که تریگر ، برای آن جدول ایجاد شده است. اگر کوردی به جدول اضافه کنید ، این رکورد علاوه بر این که در جدول پایه اضافه می شوند ، در جدول Inserted نیز اصافه خواهند شد . اگر رکوردی را در جدول پایه تغییر دهید ، این رکورد از جدول پایه حذف به جدول Deleted اضافه خواهد شد . رکورد جدید به جدول پایه و جدول Inserted اضافه می شود.
نکته : تریگر ها ، توابع بسیار خوبی برای استفاده هستند و جامعیت بانک اطلاعاتی را بررسی می کنند ، اما موجب افزایش I/O می گردند.
ایجاد تریگر ها در SQL Server
- CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
} ]
sql_statement [ ...n ]
}
}
trigger_name :
نام تریگر را مشخص می کنند
ON { table | view }:
جدول یا دیدگاهی که تریگر برای ان ایجاد می شود را مشخص می کند که می تواند یک از جداول بانک یا دیدگه ها باشد.
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
{ FOR | AFTER | INSTEAD OF } :
مشخص می کند که تریگر در چه زمانی اجر شود قبل از عمل ، بعد از عمل یا به جای عمل ..
{ [ INSERT ] [ , ] [ UPDATE ] } :
مشخص می کند که برای کدام عمل اصلی اعمال شود که می تواند مقادیر (INSERT , UPDATE , DELETE) باشد اما قسمت اول
sql_statement [ ...n ] :
مجموعه دستوراتی که باید انجام شود را نگه می دارد
مثال :
ایجاد تریگری به نام tr_delete که در هنگام حذف رکوردی از جدول type فعال شود.
Create Trigger tr_delete
ON type
FOR DELETE AS
Raiserror('%d record delete ' ,0,1,@@rowcount)
ایجاد تریگری برای به نام tr_delete1 که به جای عملیات delete جدول type فعال می شود.
Create Trigger tr_delete1
On type
INSTEAD OF delete AS
Delete from temp where id=@@identity
ایجاد تریگری به نام tr_InUp که در هنگام اضافه کردن و یا ویرایش رکورد فعال می شود.
Create Trigger tr_InUp
ON type
FOR INSERT , UPDATE
AS
Raiserror('%d redord inserted or updateted',0,1,@@rowcount)
تغییر تریگر در بانک اطلاعاتی SQL Server
برای این منظور از دستور ALTER TRIGGER استفاده کنید.
ALTER TRIGGER trigger_name
ON ( table | view )
[ WITH ENCRYPTION ]
{
{ ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
sql_statement [ ...n ]
}
یا
{ ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] }
[ NOT FOR REPLICATION ]
AS
{ IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ ...n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ ...n ]
}
sql_statement [ ...n ]
}
}
trigger_name :
نام تریگر را مشخص می کنند.
ON { table | view }:
جدول یا دیدگاهی که تریگر برای ان ایجاد می شود را مشخص می کند که می تواند یک از جداول بانک یا دیدگه ها باشد.
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
{ FOR | AFTER | INSTEAD OF } :
مشخص می کند که تریگر در چه زمانی اجر شود قبل از عمل ، بعد از عمل یا به جای عمل ..
{ [ INSERT ] [ , ] [ UPDATE ] } :
مشخص می کند که برای کدام عمل اصلی اعمال شود که می تواند مقادیر (INSERT , UPDATE , DELETE) باشد اما قسمت اول
sql_statement [ ...n ] :
مثال : دستوراتی که عملکرد تریگر tr_delete را تغییر میدهد به طوری که رکوردی را از جدول student حذف کرده و پیغامی به کاربر نمایش می دهد.
Alter Trigger tr_delete
On Student
FOR DELETE
AS
PRINT ('record deleted')
حذف تریگر :
برای این منظور از دستور DROP TRIGGER استفاده کنید.
DROP TRIGGER { trigger}[,…n]
Trigger…n : تریگر هایی هستند که باید حذف شوند
مثال : دستوراتی که تریگر tr_delete tr_InUp, را حذف می کند.
DROP TRIGGER tr_delete , tr_InUp
یکی از مسائل مهم امنیتی در پروژه های بزرگ مبتنی بر وب کد کردن اطلاعات حساس کاربران می باشد. این اطلاعات می تواند شامل کلمه عبور و یا شماره کارت اعتباری آنها باشد.
حتما" در سایت های بزرگی مانند یاهو مشاهده کردید که در بخش درخواست کلمه عبور به هیچ عنوان امکان ارسال کلمه عبور قدیمی شما وجود ندارد. دلیل این مطلب آنست که تمامی کلمات عبور کاربران توسط الگوریتم های کدگذاری یک طرفه، رمزنگاری شده اند، به شکلی که حتی اگر کسی دسترسی تمام به بانک اطلاعاتی پیدا کند توان استفاده از حساب کاربران سایت را ندارد.
در این مقاله به کمک الگوریتم MD5 کلاسی تهیه می کنیم که یک رشته را بعنوان ورودی دریافت و یک رشته با طول 16 را بصورت کد شده تحویل ما دهد. از این کلاس می توانیم بعنوان بخشی از سطح امنیتی در پروژه هایمان استفاده کنیم.
MD5 :
یک الگوریتم کار آمد رمز سازی است که در بسیاری از زبانهای برنامه نویسی دیگر نیز وجود دارد. MD5 عضوی با نام ComputeHash دارد که یک تابع Hash یا (Hash function) است.
توابع Hash یا (Hash functions) یک binary string با طول دلخواه را به یک binary string با طول کوتاه و ثابت تبدیل می کند، و این خاصیت را دارد که هرگز برای دو ورودی مجزا یک خروجی یکسان وجود نخواهد داشت (به عبارت دیگر توابع Hash تضمین میکنند که هر ورودی خروجی منحصر به فردی را داشته باشد).
برای ساخت کلاس فوق الذکر احتیاج به اضافه کردن دو فضا نام داریم که عبارتند از :
| using System.Text; using System.Security.Cryptography; |
ساخت تابع رمز ساز :
| public static byte[] computeMD5Hash(string InputString) { byte[] MDH = new byte[16]; UTF8Encoding encoder = new UTF8Encoding(); MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); MDH = md5Hasher.ComputeHash(encoder.GetBytes(InputString)); return MDH; } |
شما کد کامل این کلاس را می توانید از قسمت دریافت کد در انتهای همین مقاله دریافت کنید.
نحوه استفاده از این کلاس :
برای استفاده از این کلاس در پروژه های خود، کافیست فایل ClsCrypt.cs را به پوشه App_code منتقل سازید و در هر قسمت از سطوح برنامه که احتیاج به کدگذاری داشتید از دستور زیر استفاده کنید :
| ClsCrypt.computeMD5Hash(TextBox1.Text); |
توجه داشته باشید از آنجایی که computeMD5Hash بصورت static تعریف شده است احتیاجی به ایجاد ClsCrypt در برنامه نیست.
همچنین در صروتی که برای کد کردن اطلاعات کاربران (مانند کلمه عبور) از این تکنیک استفاده می کنید ، زمان اعتبار سنجی نیز مقدار وارد شده توسط کاربر را ، بویسله روشی که توضیح داده شد کد کرده و سپس با مقدار ذخیره شده در بانک اطلاعات مقایسه کنید.
نکته :
از آنجایی که کلاس فوق الذکر تمام رشته های ورودی (با هر طولی) را در نهایت به یک رشته کد شده با طول 16 تبدیل می کند پیشنهاد می کنیم فیلد موزد نظر در بانک اطلاعاتی از نوع Binary با طول 16 انتخاب شود
در اين مقاله سعی دارم که نحوه نوشتن در XML و خواندن از آن را شرح دهم. برای مثال ما يك وبلاگ داريم که اطلاعات را از بانک اطلاعاتی Access می خواند. ولی من برای اينکه همين اطلاعات را در يک فايل XML هم داشته باشم اين کد را به Load صفحه اضافه کردم:
Dim DS As New DataSet()
Dim strConnect As New OleDbConnection(ConfigurationSettings.AppSettings(“datasource”))
Dim objSQLAdapter As New OleDbDataAdapter(“SELECT * from blog order by id DESC”, strConnect)
objSQLAdapter.Fill(DS, “blog”)
Dim doc As XmlDataDocument = New XmlDataDocument(DS)
Dim writer As XmlTextWriter = New XmlTextWriter(“D:\www\weblog\weblog.xml”, Nothnig)
writer.Formatting = Formatting.Indented
doc.Save(writer)
در اين کد با استفاده از شئ DataSet، اطلاعات را از جدول مورد نظر بانک اطلاعاتی خود می خوانيم و آن را در يک فايل XML به نام weblog.xml ذخيره می کنيم. اگر اين کد را اجرا کنيم يک فايل XML ايجاد می شود و هر وقت صفحه اول اجرا شود فايل XML رونويسی می شود.
اما حالا يک فايل XML داريم و می خواهيم از آن استفاده کنيم. مخصوصا استفاده از XML برای سايت های خبری يا وبلاگ ها بسيار مناسب است. مثلا فرض کنيد که می خواهيم خبرهای موجود در يک سايت ديگر که به شکل XML ارائه می شوند (مانند RSS) را در سايت خودمان نمايش دهيم. برای اين کار ابتدا يک فايل ASPX ايجاد کنيد و اين کد را در قسمت Design يا همان HTML آن بنويسيد.
تاريخ :<%# DataBinder.Eval(Container.DataItem, “news_date”) %>
عنوان : <%# DataBinder.Eval(Container.DataItem, news_title”) %>
<%# DataBinder.Eval(Container.DataItem, “news_body”) %>
ما در اينجا يک کنترل DataList ايجاد کرديم و مقادير مورد نظر را در آن نوشتيم. حالا کدی که در Load اين صفحه بايد بنويسيم به اين شکل خواهد بود:
Dim ds As New DataSet()
ds.ReadXml(“d:\www\weblog\weblog.xml”, XmlReadMode.Auto)
theDataList.DataSource = ds
theDataList.DataBind()
اگر اين صفحه را اجرا کنيد تمام فيلدهای XML در اين فايل ASP.NET نمايش داده خواهد شد. در مثال بالا از يک فايل XML موجود بر روی ديسک استفاده شده است حال آنکه می توانيم بجای اين آدرس محلی از يک آدرس موجود در وب که همان آدرس سايت مورد نظر است استفاده کنيم. مثلا اگر بخواهيد اخبار سايت مورد نظر را در سايت خود نمايش دهيد کافی است اينگونه عمل کنيد: :
Dim ds As New DataSet()
ds.ReadXml(“http://www.website.com/weblog.xml”,XmlReadMode.Auto)
theDataList.DataSource = ds
theDataList.DataBind
منبع : aspcode.ir
مديريت وضعيت صفحات در فرم های وب ( State Management )
گزينه های Client-Based
Dim strColor as String
strColor = CStr(ViewState("color"))
http://www.contoso.com/listwidgets.aspx?category=basic&price=100
گزينه های Server-Based
دستور delete جهت حذف اطلاعات (یا به عبارت درست تر، داده ها) از یک جدول استفاده می شود.
دستور truncate که دستوری غیر استاندارد می باشد جهت حذف تمامی داده های موجود در جدول استفاده می شود
کد:
کد:
قبل از هر چیز باید خاصیت allow drop تکست باکس ها را true کنید
کد:
مطالب مرجع و تخصصی در زمینه سیستم عامل ویژه دانشجویان و محققین علوم کامپیوتری
فهرست اصلي
فهرست موضوعی
لینکستان
دانشجویان کامپیوتر دانشگاه آزاد
جامعه برنامه نویسان ایران
انجمن تخصصی ASP.NET
انجمن برنامه نویسی NET.
شبکه اجتماعی متخصصان
باشگاه مهندسان ایران
مرجع متخصصین ایران
مرکز توسعه نرم افزار
انجمن تخصصی فلش
باشگاه طراحان ایران
ادوبی فلش پلتفرم
کامپوننت و ابزارها
سورس و راهنما
آموزش فلش
آخرين نوشته ها
درباره سیستم عامل
ارتباط با پورت سریال در C#
addon domain در plesk
استیو جابز هم رفت!
آخرین رکورد بازبینی شده
مشکل نصب SQL Server 2005
سمینار درگاه پرداخت آنلاین
تفاوت متد های get و post
امنیت فایل های اجرایی NET.
نکاتی که در برنامه نویسی باید/میتوانند رعایت شوند
Tableدر برابر Div
سخنان طلایی برنامه نویسان بزرگ
رمزگذاری فایلها
کارگاه آموزش سیستم حروفچینی لاتک و زی پرشین
کتاب آموزش لاتک Latex
مقایسه دستورات DELETE و TRUNCATE
با Cloudflare امنیت و سرعت سایت خود را افزایش دهید
کتاب آموزش برنامه نویسی اسمبلی
چیست؟ nhibernate
معرفي فايل Web.Config
Eval شرطی
واکشی تعداد رکوردهای تمام جدولهای دیتابیس
واکشی نام تمام جدولهای دیتابیس
طرح روی جلد کتاب سیستم عامل سیلبر شاتس
کتاب برنامه نویسی و زبان اسمبلی - پیتر ایبل
کتاب آموزش ActionScript 3.0
حقیقت آزمایش !
افزونه های Reflector
جایگزین Reflector
sem چیست ؟
DESIGNED BY