• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
انجمن ها > انجمن کامپیوتر > صفحه اول بحث
لطفا در سایت شناسائی شوید!
کامپیوتر (بازدید: 8575)
پنج شنبه 3/4/1389 - 15:18 -0 تشکر 207065
مطالب برنامه نویسی

با سلام
برای این که مطالب ها از هم جدا نشوند و انجمن کامپیوتر شلوغ نشود ، لطفاً مطالب و مشکلات و مقالات مربوط به برنامه نویسی در این پست درج کنید و فقط مسائل جدید را در صفحه اصلی انجمن درج کنید.

در صورت امکان از هر یک از پست ها خوشتون اومد + سبز را بزنید .

با تشکر  Reza Godarzi

 

جمعه 4/4/1389 - 16:11 - 0 تشکر 207281

چگونه می توان در محیط گرافیك زبان

چگونه می توان در محیط گرافیك زبان c یك شكل پیچیده را حركت داد؟




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

در ابتدای كار یك متغیر از نوع int تعریف كنید كه اندازه شكل محاسبه شود و در آن قرار گیرد. یك متغیر نیز از نوع *void تعریف كنید كه در واقع بافری است كه رنگ پیكسل های مستطیل در آن به ترتیب قرار می گیرند تا در موقع لزوم به همان ترتیب چاپ شوند:



int size;

void* buffer;


حال می بایست اندازه مستطیل را با تابع imagesize محاسبه و در متغیر size بریزید:



size=imagesize(x1,y1,x2,y2);


كه پارامتر های آن به ترتیب مختصات گوشه بالای سمت چپ مستطیل و گوشه پایین سمت راست آن می باشند.

حال حافظه ای را با تابع malloc به اندازه size به buffer اختصاص دهید:



buffer=malloc(size);


الگوی این تابع در سر فایل alloc.h قرار دارد.(الگوی سایر توابع گفته شده در graphics.h می باشد.)

حال نوبت به خواندن پیكسلهای مستطیل می باشد. این كار را با تابع getimage انجام دهید كه پیكسلها را خوانده و در بافر قرار می دهد:



getimage(x1,y1,x2,y2,buffer);


كار ما برای خواندن مستطیل به پایان رسیده است . فقط كافیست بافر خوانده شده را با تابع putimage در نقطه دلخواه چاپ كنیم :



putimage(x,y,buffer,COPY_PUT);


دو پارامتر اول این تابع مختصات نقطه مقصد می باشند .(گوشه بالای سمت چپ مستطیل در مقصد) پارامتر دوم بافر محتوی شكل و پارامتر سوم تعیین كننده نوع چاپ شدن شكل می باشد كه دارای حالات زیر است :



Constant Value Meaning
----------------------------------------------------------------------------------------------------------
COPY_PUT 0 Copies source bitmap onto screen
XOR_PUT 1 Exclusive ORs source image with that already onscreen
OR_PUT 2 Inclusive ORs image with that already onscreen
AND_PUT 3 ANDs image with that already onscreen
NOT_PUT 4 Copy the inverse of the source


دقت كنید كه در پایان برنامه حتما حافظه گرفته شده با دستور malloc را آزاد كنید:



free(buffer);


توجه كنید كه شكل لزوما یك مستطیل نیست بلكه برای ذخیره سازی شكل در حافظه یك مستطیل فرضی دور شكل در نظر گرفته می شود . برای مثال میتوانید كد زیر را كپی كرده و در محیط TC اجرا كنید :




#include
#include
#include
int main(){
int driver=DETECT,mode=0,size,column,row,horiz,vert;
void* buffer;
initgraph(&driver,&mode,"c:\tc\bgi");
setcolor(LIGHTBLUE);
rectangle(2,2,200,40);
setfillstyle(SOLID_FILL,BLUE);
floodfill(100,20,LIGHTBLUE);
settextstyle(SMALL_FONT,HORIZ_DIR,7);
setcolor(WHITE);
outtextxy(12,10,"www.PooyeshR.com");
rectangle(0,0,600,400);
size=imagesize(1,1,201,41);
buffer=malloc(size);
getimage(1,1,201,41,buffer);
column=1;
row=1;
horiz=1;
vert=1;
while(!bioskey(1)){
putimage(column,row,buffer,COPY_PUT);
column+=vert;
row+=horiz;
if(column==399 || column==1)
vert=-vert;
if(row==359 || row==1)
horiz=-horiz;
}
free(buffer);
closegraph();
restorecrtmode();
return 0;
}

جمعه 4/4/1389 - 16:15 - 0 تشکر 207282

آموزش HTML
مخصوص وبلاگ نویسان
برای اینکه تگها رو درست ببینید حتما این نوشته رو در نوت پد کپی کنید و در حالت چپ به راست آن را مشاهده کنید
گذاشتن لینک:
برای قرار داد لینک در وبلاگ (یا هر جای دیگری) باید از تگ a استفاده کرده که به صورت زیر خواهد بود.
<a href="URL">Name</a>
به جای URL باید آدرس صفحه ای که میخواهید به آن لینک دهید استفاده کنید و به جای Name نامی است که شما آنرا نوشته تا بازدیدکننده با کلیک بروی این نوشته به صفحه مورد نظر منتقل شود. :
حال اگر بخواهید این لینک در صفحه ای جدید باز شود می توانید از کد زیر استفاده کنید:
<a target="_blank" href="URL">Name</a>
برای لینک ایمیل می توانید از تگ زیر استفاده کنید:
<A href="mailto:E-mail Address">Name</a>

گذاشتن عکس و لوگو:
شما عکسی رو بروی انترنت دارید و میخواهید آنرا در وبلاگ قرار دهید. می توانید با کلیک راست بروی عکس به گزینه Properties رفته و آدرس عکس رو گرفته و در کد زیر قرار دهید:
<img border="0" src="آدرس عکس">
و اگر بخواهید برای عکس خود طول و عرضی, و شرحی بنویسید می توانید از تگ زیر استفاده کنید:
<img src="آدرس عکس" width=عرض عکس HEIGHT=طول عکس BORDER=0 ALT="شرح عکس">
برای مثال:
حال اگر بخواهید بروی عکس خود لینک بگذارید می توانید از تگ زیر استفاده کنید.:
<a href="URL"><img border="0" src="آدرس عکس"></a>

قرار دادن لوگو در وبلاگ:

قرار دادن لوگو هم مانند عکس می باشد. حال اگر بخواهید به خواننده این اختیار را بدهید که به سادگی به وبلاگ شما بلینکند شما می توانید تگهای لوگوی خود را درون کادری قرار دهید. برای اینکار می توانید از تگ زیر استفاده کنید.
<input name="هر نامی که دوست دارید" size="اندازه کادر" value="متن تگها">
اگر بخواهید برای این کادری که گذاشته اید استایلی مشخص کنید می توانید از کد زیر استفاده کنید:

<input name="for logo" size="اندازه کادر" class="mbx7-fsp" value="نوشته ها و کدها">
برای مثال:
<input type="text" name="T1" size="20" class="mbx8-fsp">

اگه نباشه جاش خالی می مونه

در محیط وب، صفحات اچتمل با کمک پیوندها به یکدیگر متصل میشوند. اصطلاح ابرمتن(Hyper
Text) در مقابل متن خطی قرار دارد. در یک متن معمولی خواندن به شکل خطی و از ابتدا به انتها
میباشد و در مقابل در یک متن مختلط با کمک پیوندها میتوان از یک متن به هر صفحه دیگر در وب
متصل شد.این کار با کمک عنصری معلوم الحال! به نامA یاAnchor میسر میگردد.
تگ Anchor و شناسه href
اگه نباشه جاش خالی می مونه

توضیحاتی در مورد تگهایی که در زیر گذاشتم مینویسم کسانی که دوست دارند تغییراتی در وبلاگشون بدهند اول در یک ویرایشگر مثل نوت پد انجام بدهند بعد تغییراتشونو در قالب اعمال کنند.

[<br>] [<p></p>] [<center></center>] [<pre></pre>]
[<h1></h1>] [<hr>] [<div></div>] [<span></span>]
[<marquee></marquee>] [<--!...-->] [<bdo></bdo>]

تگهای متن را میتوان به دو دسته تقسیم کرد، تگهای اولیه که بیشتر وظیفه خط بندی، پاراگراف بندی و یا تنظیمات در ارتباط با متن را به عهده دارند و تگهایی که شکل و آرایش حروف را کنترل میکنند که به آنها formatting می گویند. بهتر است که Notepad یا هر برنامه ویرایشگر متن را که دارید باز کنید و هر کدام از این تگها را امتحان کنید تا کاربرد آنها در ذهن شما جای گیرد.

<br>
برای خط بندی از این تگ استفاده میشود و متن بعد از آن به یک خط پایین تر منتقل میشود که نیازی به تگ پایان دهنده هم ندارد.
مثال
<p></p>
پاراگراف بندی متن را به عهده دارد و فاصله بیشتری را نسبت به <br> بین خطوط ایجاد میکند. این تگ دارای خصوصیت align= " " میباشد که محل قرارگیری پاراگراف را در یک سطر کنترل میکند و با کلمات "left", "center", "right", "justify"مقداردهی میشود. مثال
<p align="left">...</p>
<center></center>
همانطور که از اسمش پیداست متن بین این دو تگ در وسط یک سطر قرار خواهد گرفت، البته این تگ را برای عناصر دیگر وب نیز میتوان بکار برد.مثال
<pre></pre>
مرورگرها فاصله هر کلمه را در حد استاندارد نشان میدهند و اگر شما بخواهید که یک متن با فاصله های زیادی نمایش داده شود یعنی آنطور که میخواهید نشان داده شود از این تگ استفاده میکنید.مثال
<h1></h1>
به این تگHeading می گویند و برای مشخص کردن سرفصلها و تیترها بکار میرود. این تگ از عدد یک تا شش درجه بندی دارد که عدد یک بزرگترین حد و شش کوچکترین حد حروف را نمایش میدهند. در ضمن دارای خصوصیت " "=align میباشند و با left, center , right مقداردهی میشود.مثال
<hr>
این تگ روی خود متن کاری صورت نمیدهد و فقط با ترسیم یک خط افقی آنها را از هم جدا میکند که دارای خصوصیات زیر میباشد.
width=" "طول خط را کنترل میکند که هم با عدد در مقیاس پیکسل و هم با درصد میتوان مقدار دهی کرد.
align=" " که محل قرار گیری خط در یک سطر را کنترل میکند.
color=" "رنگ خط که میتوانید اسم رنگ یا کد هگز رنگ را بنویسید.
size=" " این خصوصیت ضخامت خط را تعیین میکند که هرچه عدد بزرگتر باشد ، ضخامت بیشتر است. بصورت پیش فرض خط دارای سایه میباشد و اگر خصوصیت noshade را به تگ اضافه کنید دیگر سایه را نشان نمیدهد.
<div></div>
این تگ کاربرد فراوانی برای مدل دادن به متن دارد و مانند تگ <br> آن قسمت از متن را جدا میکند وبه خط بعد منتقل میکند . خصوصیت class="mbx7-fsp" در این تگ توانایی اعمال یک الگوی خاص در آن قسمت از متن را میدهد. بطور مثال هر گاه کاربر نشانگر موس را روی آن متن برد ، نوشته های ما خط دار شود، البته هر نوع Style که تعریف شود همان را بکار میبرد.
<span></span>
این تگ هم مانند تگ بالا میباشد با این تفاوت که مخصوص یک کلمه یا حتی یک حرف میباشد چون مانند div متن را از بقیه جدا نمیکند و دارای خصوصیت class="mbx7-fsp" میباشد که بر فرض هنگام قرار گرفتن موس روی یک کلمه زمینه آن رنگی شود. مثال

<marquee></marquee>
متن بین این دو تگ متحرک خواهد شد و دارای خصوصیات زیر میباشد، البته این تگ ممکن است در همه مرورگرها عمل نکند ولی در مرورگر اینترنت اکسپلورر (IE) مشکلی برای نمایش ندارد. خصوصیات این تگ عبارتند از :
align=" "محل قرار گرفتن متن را تعیین میکند که با کلمات top, middle, bottom مقدار دهی میشود.
behavior=" "این خصوصیت نحوه حرکت متن را کنترل میکند که آنرا برابر با scroll اگر قرار دهیم، متن بصورت متناوب از یکطرف صفحه وارد و از طرف دیگر خارج میشود و اگر برابر با alternate قرار دهیم ، متن از صفحه خارج نمیشود و در عرض مرورگر حرکت میکند، همچنین اگر برابر با slide باشد ، متن از یکطرف وارد صفحه شده و در طرف دیگرمیایستد.
bgcolor=" " رنگ زمینه آن تگ را مشخص میکند که یا نام رنگ یا کد هگز آنرا مینویسید.
direction=" "جهت ورود متن به صفحه را کنترل میکند و با کلمات left, right, top, down که از چپ ، راست، بالا و پایین میتواند وارد شود.
height=" "ارتفاع کادر marquee را به عدد در مقیاس پیکسل یا به درصد تعیین میکند.
hspace=" " حاشیه چپ و راست را کم وزیاد میکند.
loop=" "تعداد چرخش متن را کنترل میکند.
scrolldelay=" " سرعت حرکت متن را تعیین میکند.
vspace=" " حاشیه بالا و پایین متن را مشخص میکند.
width=" " عرض کادر را کنترل میکند.
<-- !.....-->
از این تگ برای افزودن نظریه یا هر نوشته دیگری که نمیخواهید در مرورگر نمایش داده شود و یا عملی را انجام دهد استفاده میکنید که بجای نقطه چین هر متنی را میتوانید وارد کنید .
<bdo></bdo>
این تگ فقط مخصوص مشخص کردن متن ازطرف چپ یا راست که دارای خصوصیت dir=” “ میباشد و با ltr یعنی از چپ به راست و rtl یعنی از راست به چپ مقدار دهی میشود.

جمعه 4/4/1389 - 16:16 - 0 تشکر 207283

مقدمه ای HTML
در این درس با ویژگیهای فایلهای HTML یا اچتمل و نحوه ایجاد یک فایل ساده و نمایش آن در صفحه مرورگرتان آشنا خواهید شد.
یک فایل HTML چیست؟
HTML برگرفته از حروف اول Hyper Text Markup Language
میباشد. یک فایل HTML فایلی از نوع text میباشد که متشکل از markup tag ها میباشد.
مرورگر یا Browser از روی markup tag ها می فهمد که چگونه باید صفحه را نمایش بدهد.
یک فایل HTML باید دارای انشعاب htm و یا html باشدو با هر ادیتور ساده ای قابل ایجاد است.
وظیفه اصلی تگ های اچتمل ( markup tags ) بیان چگونگی نمایش اطلاعات میباشد.
میخواهید که یک فایل اچتمل بسازید؟

اگر از ویندوز استفاده میکنید، Notepad را باز کرده و متن زیر را در آن تایپ کنید:


Title of page


This is my first html page. This text is bold



سپس فایل را با نام مثلا test.html ذخیره کنید.
توضیح مثال بالا

اولین تگ مثال بالا تگ میباشد. از روی این تگ، مرورگر نوع متن یعنی اچتمل بودنش را یافته و از روی انتهای متن اچتمل را میبابد.

متن بین تگ و تگ اطلاعات شناسنامه ای یا "Header information" متن اچتمل بوده و نمایش داده نخواهند شد. در این مثال با کمک تگهای و <title/> تیتر صفحه که در این مثال عبارت "Title of page" میباشد در بالای مرورگر نمایش داده خواهد شد.<br/>متن بین تگ <body> و انتهای آن یعنی تگ <body/> تنها اطلاعاتی است که توسط مرورگرنمایش داده خواهند شد.<br/>متن بین تگ <b> و انتهای آن یعنی تگ <b/> بصورت Bold و یا توپر نمایش داده خواهند شد.<br/>هیچگاه بدون اینکه بدانید کاربرد یک تگ چیست آنرا بکار نبرید. </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl03_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:20 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207285</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> آموزش DHTML <br /> ) یک رابط برنامه نویسی برای سندهای XML و Html است . با استفاده از اینترفیس فوق، نحوه دستیابی و انجام پردازش های لازم در رابطه با سند های XML و Html فراهم می گردد . برنامه نویسان با استفاده از DOM ، قادر به ایجاد یک سند ،حرکت در طول ساختار سند، افزودن ، اصلاح و یا حذف المان های یک سند XML و یا Html می باشند . DOM توسط کنسرسیوم وب استاندارد و بمنظور استفاده از طریق زبان های برنامه نویسی متعددی طراحی شده است . <br /> گره ها <br /> برنامه ای با نام پارسر، امکان استقرار یک سند XML در حافظه را فراهم می نماید . پس از استقرار سند در حافظه ، اطلاعات مربوطه بکمک DOM ، قابل بازیابی و پردازش خواهد بود . DOM ، یک نمایش شبه درختی از یک سند XML را ایجاد می نماید . المان Document ، دارای بالاترین سطح در درخت ایجاد شده است . المان فوق ، دارای یک و یا چندین فرزند است . یک اینترفیس گره ، امکان خواندن و یا نوشتن المان های خاصی در ساختار درختواره ای یک سند XML را میسر می نماید .با استفاده از خصلت ChildNodes مربوط به المان Document و بکارگیری یک حلقه تکرار می توان هر یک از گره ها را انتخاب و در ادامه عملیات مورد نظر در رابطه با آن را انجام داد . پارسر شرکت ماکروسافت (MSXML) ، دارای توابع متفاوت بمنظور حرکت در طول درخت، دستیابی به گره ها بهمراه خصلت مربوطه، درج و حذف گره ها و تبدیل ساختار درختی به شکل اولیه XML است . در حال حاضر، سیزده نوع متفاوت گره توسط پارسرشرکت ماکروسافت، حمایت می گردد . جدول زیر متداولترین نوع گره ها را نشان می دهد . <br /> مثال <br /> نوع گره <br /> <!DOCTYPE food SYSTEM "food.dtd"><br /> Document type <br /> <?xml version="1.0"?><br /> Processing instruction <br /> <drink type="tea">Irani</drink><br /> Element <br /> type="tea"<br /> Attribute <br /> Irani<br /> Text <br /> <br /> استفاده از پارسر <br /> بمنظور خواندن، ویرایش و یا ایجاد و پردازش یک سند XML ، می بایست از یک پارسر استفاده کرد . پارسر شرکت ماکروسافت، یک عنصر مبتنی بر COM بوده که بهمراه IE نسخه پنج ، ارائه شده است . پس از نصب مرورگر فوق، امکان استفاده از پارسر فراهم می گردد . پارسر MSXML ، دارای امکانات متعدد برنامه نویسی بمنظور استفاده توسط زبانهای زیر است :<br /> حمایت از جاوااسکریپت VBScript Perl جاوا و ++ C <br /> حمایت از استاندارد کنسرسیوم وب و XML DOM <br /> حمایت از DTD و معتبر سازی <br /> مثال : نحوه ایجاد شی Document ، با استفاده جاوااسکریپت ، VBscript و ASP در جدول زیر نشان داده شده است :<br /> مثال <br /> تکنولوژی <br /> <br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> Javascript <br /> set xmlDoc = CreateObject("Microsoft.XMLDOM")<br /> VBscript <br /> set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")<br /> ASP <br /> استقرار یک سند XML در حافظه <br /> کدهای زیر نحوه استقرار یک سند XML با نام Test.xml در حافظه را نشان می دهد :<br /> استقرار یک سند XML در حافظه <br /> <br /> <script language="JavaScript"><br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("Test.xml")<br /> // ....... پردازش های لازم <br /> </script><br /> <br /> <br /> <br /> اولین خط در اسکریپت های فوق ، یک نمونه از پارسر XML شرکت ماکروسافت را ایجاد می نماید . در دومین خط ، به پارسر اعلام می گردد منتظر دریافت کامل سند XML بوده قبل از اینکه پردازش خود را آغاز نماید . در سومین خط ، به پارسر اعلام شده است که یک سند XML با نام Test.xml را در حافظه مستقر نماید .<br /> استقرار متن XML در پارسر <br /> کدهای زیر، نحوه استقرار یک رشته متن را در پارسر XML نشان می دهد . در مثال فوق از متد LoadXML در مقابل متد load استفاده شده است . از متد loadXML بمنظور استقرار یک رشته متن در پارسر استفاده می گردد . <br /> استقرار یک رشته متن XML در حافظه <br /> <script language="JavaScript"><br /> var text="<note>"<br /> text=text+"<to>Ali</to><from>Reza</from>"<br /> text=text+"<heading>Reminder</heading>"<br /> text=text+"<body>Don"t forget me this weekend!</body>"<br /> text=text+"</note>"<br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.loadXML(text)<br /> // ....... پردازش های لازم<br /> </script><br /> <br /> شی ParseError <br /> خطای مربوط به فایل : با استفاده از شی ParseError ، می توان از کد ، متن خطاء و حتی شماره خطی که خطاء در آن اتفاق افتاده است ، آگاهی یافت . در برنامه زیر پارسر، سعی در استقرار سندی XML در حافظه نموده که وجود خارجی ندارد . پس از تشخیص خطاء ، برخی از خصلت های مربوط به خطاء در خروجی نمایش داده خواهد شد . <br /> تشخیص خطاء و استفاده از شی ParseError در رابطه با وجود یک فایل <br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("Test1.xml")<br /> document.write("<br>Error Code: ")<br /> document.write(xmlDoc.parseError.errorCode)<br /> document.write("<br>Error Reason: ")<br /> document.write(xmlDoc.parseError.reason)<br /> document.write("<br>Error Line: ")<br /> document.write(xmlDoc.parseError.line)<br /> <br /> خطای مربوط به XML . فرض کنید یک سند XML که "خوش شکل " نمی باشد، توسط پارسر خوانده شود . کدهای زیر نحوه تشخیص و برخورد با خطاء را نشان می دهد :<br /> تشخیص خطاء و استفاده از شی ParseError در رابطه با سند "خوش شکل "<br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("note_error.xml")<br /> document.write("<br>Error Code: ")<br /> document.write(xmlDoc.parseError.errorCode)<br /> document.write("<br>Error Reason: ")<br /> document.write(xmlDoc.parseError.reason)<br /> document.write("<br>Error Line: ")<br /> document.write(xmlDoc.parseError.line)<br /> <br /> خصلت های ParseError <br /> عملکرد<br /> خصلت <br /> کد خطای بوجود آمده ، برگردانده می شود . <br /> errorCode <br /> علت خطای بوجود آمده ،برگردانده می شود . <br /> reason <br /> شماره خط خطای بوجود آمده ، برگردانده می شود <br /> line <br /> محل بروز خطاء در خط مربوطه را برمی گرداند .<br /> linePos <br /> رشته ای که شامل خط مربوط به خطای بوجود آمده است، برگردانده می شود <br /> srcText <br /> url مربوط به سند مستقر سده در حافظه ، بر گردانده می شود . <br /> url <br /> محل بروز خطاء در فایل مربوطه، برگردانده می شود . <br /> filePos <br /> <br /> حرکت در طول درخت <br /> یکی از متداولترین روش های بازیابی المان های یک سند XML ، حرکت در طول درخت ( از گره ای به گره دیگر ) و استخراج مقدار متن ذخیره شده بهمراه هر یک از المان ها است . کدهای نوشته شده زیر ، امکان حرکت در طول یک درخت XML را فراهم و در ادامه هر یک از المان های سند XML ، در خروجی نمایش داده می شوند ( کدها با استفاده از VBScript نوشته شده اند ) .<br /> حرکت در طول درخت و نمایش المان های یک سند XML <br /> set xmlDoc=CreateObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("note.xml")<br /> for each x in xmlDoc.documentElement.childNodes<br /> document.write(x.nodename)<br /> document.write(": ")<br /> document.write(x.text)<br /> next<br /> ایجاد محتویات مبتنی بر Html برای یک سند XML <br /> یکی از مهمترین قابلیت های XML ، تمایز و تفکیک سندهای Html از داده های مربوطه است . با استفاده از یک پارسر XML ، موجود در مرورگرها ، یک صفحه وب قادر به ایجاد محتویاتی پویا است . در این زمینه می توان از پتانسیل های جاوااسکریپت بمنظور تولید و ارائه محتویات پویا نیز استفاده کرد . در همین راستا ، امکان استفاده از ASP برا ی ایجاد محتویات پویا با تاکید بر نقش سرویس دهنده وب نیز وجود دارد . برنامه زیر ، داده های موجود در یک سند XML را خوانده و آنها را با فرمت Html در خروجی نمایش خواهد داد . <br /> نمایش داده های موجود در یک سند XML با استفاده از جاوااسکریپت <br /> <br /> <br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("note.xml")<br /> nodes = xmlDoc.documentElement.childNodes<br /> to.innerText = nodes.item(0).text<br /> from.innerText = nodes.item(1).text<br /> header.innerText = nodes.item(2).text<br /> body.innerText = nodes.item(3).text<br /> <br /> دستیابی به المان ها از طریق نام <br /> رنامه زیر داده های موجود در یک سند XML را خوانده و آنها را با فرمت Html در خروجی نمایش خواهد داد . <br /> دستیابی به المان ها د ر یک سند XML از طریق نام و بکمک جاوااسکریپت <br /> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")<br /> xmlDoc.async="false"<br /> xmlDoc.load("note.xml")<br /> document.write(xmlDoc.getElementsByTagName("from") .item(0).text)<br /> <br /> <br /> تقریبا تمام كسانی كه با طراحی صفحات وب و یا HTML سروكار دارند باCSS (Cascading Style Sheets) آشنایی دارند. با استفاده از CSS نحوه نمایش اطلاعات درون صفحه وب مشخص میشود. با استفاده از CSS تعیین نحوه نمایش اطلاعات بسیار راحتتر ازHTML است. همچنین انجام بعضی از انواع قالب بندی هایی كه با CSS امكان پذیر است با دستورات HTML امكان پذیر نیست. <br /> یكی از امكانات جالبی كه CSS در اختیار ما میگذارد خصوصیتی بنام Filter میباشد. كه بوسیله آن میتوان به تصاویر و متنهای درون صفحه وب افكتهای متفاوتی را اضافه كرد. بطور مثال شما قادر خواهید بود درون یك صفحه وب یك متن سایه دار داشته باشید بدون اینكه از عكس بجای متن استفاده كنید. كه این خود باعث میشود كه ویرایش كردن متن مورد نظر شما نیز به راحتی صورت گیرد، چون دیگر شما با یك سری تصاویر كار ندارید، بلكه متن مورد نظر خود را به راحتی ویرایش میكنید. همچنین شما قادر خواهید بود كه شفافیت یك عكس را كم كنید یا آن را وارونه كنید. اینها فقط چند نمونه از امكانات خصوصیت Filter در CSS بود. در ادامه امكانات و نحوه استفاده از خصوصیت Filter را بیان خواهیم كرد. <br /> <br /> باید دقت داشت كه برای كار كردن ----- ها همیشه باید خصوصیت wtihd را برای تگ مورد نظر تنظیم كنید. در غیر این صورت این ----- ها از كار خواهند افتاد.<br /> برای اضافه كردن ----- ها از تگDIV استفاده شده است. برای راحتی كار با نوشتن دستورات زیر خصوصیت width برای تگ DIV تنظیم شده است. توجه داشته باشید كه این دستورات باید در قسمت head صفحه وب و قبل از تگ نوشته شود. <br /> < style> <br /> < !-- <br /> div{width:100%;}<br /> --> <br /> < /style> <br /> <br /> همچنین برای اضافه كردن ----- ها از روش زیر استفاده شده است.<br /> ----- مورد نظر"><br /> محتویاتی كه قرار است ----- بر روی آن اعمال شود<br /> این محتویات میتواند هرچیزی باشد مثلا متن یا تصویر<br /> <br /> بطور مثال<br /> < div style="filter: alpha(opacity=30);"><br /> < img src="images/art11361.jpg" width="100" height="100"><br /> < /div><br /> <br /> برای مشخص شدن خصوصیتهای مختلف دستورfilter و نتایج استفاده از هركدام از جدول زیر استفاده شده است.<br /> در جدول زیر سعی شده دستورات مربوط به خصوصیت filter با تنظیمات مختلف نشان داده شود. همچنین این كدها به عنوان نمونه هستند و خود شما با تغییر هركدام از پارامترها میتوانید جلوه های متفاوتی را ایجاد كنید.<br /> در قسمت مربوط به توضیحات هم سعی شده پارامترهای اصلی هركدام از ----- ها را بطور مختصرمعرفی شود.<br /> <br /> filter: alpha(opacity=30); alpha : با این ----- میتوان میزان نمایان بودن یك تصویر را مشخص نمود<br /> opacity : مقدارد نمایان شدن تصویر را مشخص مكند كه مقداری بین 0 تا 100 را می پذیرد. <br /> <br /> filter:alpha(opacity=0, finishopacity=100, style=1, startx=0, starty=0, finishx=100, finishy=100); در این قسمت تمام پارامترهای خصوصیت alpha نشان داده شده است. كه با استفاده از این پارامترها میتوان میزان نمایش داده شدن یك شكل را از كم به زیاد تعیین نمود.<br /> filter:alpha(opacity=100, finishopacity=10, style=2, startx=0, starty=0, finishx=100, finishy=100); این مثال با همان پارامترهایی كه در مثال قبل آمده بود بیان شده و فقط مقادیر پارامترهایی كه بصورت رنگی در آمده اند تغییر كرده اند.<br /> همچنین پاراتر style میتواند مقادیری بین 0 تا 3 داشته باشد. <br /> filter:blur(add=false, direction=90, strength=7); با این ----- میتوان تصویر را محو كرد.<br /> direction : زاویه محو شدن شكل<br /> strength: میزان تاثیراین ----- <br /> filter:blur(add=true, direction=90, strength=7); add : این پارامتر مشخص میكند كه آیا تصویر اولیه نیز با تصویر ایجاد شده جدید تركیب شود یا خیر <br /> filter:fliph; چرخش بصورت افقی <br /> filter:flipv; چرخش بصورت عمودی <br /> filter:gray; ایجاد جلوه سیاه و سفید <br /> filter:xray; ابتدا شكل را سیاه و سفید و سپس میزان رنگها و روشنایی را معكوس میكند. <br /> filter:invert; میزان رنگها و روشنایی را معكوس میكند. <br /> Test mask picture<br /> filter: mask(color=#ffffff); این ----- به این صورت عمل میكند كه محتویات مورد نظر را با یك رنگ خواص به صورت شفاف در میآورد در اینجا عكس مورد نظر به عنوان زمینه (backgroung) تعیین شده و با تنظیم رنگ با رنگ زمینه دلخواه (در اینجا سفید) در اصل ما رنگ متن را با یك تصویر پر كرده ایم. <br /> Glow<br /> filter:glow(color=#0099CC, strength=4); ایجاد حالت روشنایی با رنگ و میزان دلخواه در اطراف متن مورد نظر <br /> <br /> Blur<br /> filter:blur; همان ----- blur اما بدون پارامتر <br /> <br /> Shadow<br /> filter:shadow(color=#999999, direction=135); ایجاد جلوه سایه با رنگ و زاویه دلخواه <br /> Drop Shadow<br /> filter:dropshadow(color=#999999, offx=3, offy=3, positive=true); نمایش سایه یك متن با رنگ دلخواه در موقعیت دلخواه <br /> Wave<br /> filter:wave(strength=3); ایجاد جلوه موجی شكل به اندازه دلخواه <br /> Flip H<br /> filter: fliph(); چرخش بصورت افقی <br /> <br /> Flip V<br /> filter: flipv(); چرخش بصورت عمودی <br /> <br /> <br /> دقت داشته باشید كه برای مشاهده جلوه های بیان شده به مرورگر Internet Explorer 4.0 یا بالاتر از آن نیاز است. <br /> <br /> در این یادداشت می خواهم چگونگی ساخت منوهای Drop Down را آموزش بدهم. البته منظورم کادرهای Drop Down که با تگ <select> درست می شوند نیست! شاید تا به حال سایتهایی را دیده باشید که هنگامی که بر روی متنی کلیک می کنید، در زیر آن یک ناحیه ای نمایان می شود که در آن نوشته و یا عکسی می باشد. اگر به Windows Explorer نگاهی بیاندازید، منظورم را متوجه می شود. در آن پنجره به My Computer نگاه کنید. در کنار آن یک علامت مثبت است که با کلیک بر روی آن گزینه، علامت مثبت به علامت منفی و سپس هارد دیسک درایوها و CD-ROMها در زیر آن به نمایش در می آیند. این کار هم توسط یک کد جاوااسکریپت در وب امکان پذیر است. به یاد داشته باشید که برای آن عکسها، من از نامهای p.gif (برای علامت مثبت) و n.gif (برای علامت منفی) استفاده کرده ام. بقیه روش کار به صورت زیر است:<br /> ابتدا کد جاوااسکریپت زیر را در قسمت Head صفحه (یعنی در بین تگهای </head> و <head>) کپی نمایید.<br /> <br /> <br /> <script language="javascript"><br /> <!--<br /> <br /> var ns6 = (!document.all && document.getElementById);<br /> var ie4 = (document.all);<br /> var ns4 = (document.layers);<br /> var openImg = "http://blog.mojtaba.net/images/p.gif";<br /> var closeImg = "http://blog.mojtaba.net/images/n.gif";<br /> <br /> function showLayer(layerName) {<br /> <br /> var layerImageName = layerName + "Image"<br /> if (ns6) {<br /> if ( document.getElementById(layerName).style.display == "" ) {<br /> document.getElementById(layerName).style.display = "none";<br /> document.getElementById(layerImageName).src = openImg;<br /> } else {<br /> document.getElementById(layerName).style.display = "";<br /> document.getElementById(layerImageName).src = closeImg;<br /> }<br /> } else if (ie4) {<br /> if ( document.all[layerName].style.display == "" ) {<br /> document.all[layerName].style.display = "none";<br /> document.all[layerImageName].src = openImg;<br /> } else {<br /> document.all[layerName].style.display = "";<br /> document.all[layerImageName].src = closeImg;<br /> }<br /> } else if (ns4) {<br /> if ( document.layers[layerName].display == "" ) {<br /> document.layers[layerName].display == "none";<br /> document.layers[layerImageItem].src == openImg;<br /> } else {<br /> document.layers[layerName].display == ""; <br /> document.layers[layerImageItem].src == closeImg;<br /> }<br /> }<br /> }<br /> <br /> //--><br /> </script><br /> <br /> پس از انجام این کار، یک لایه به وسیله تگ <div> می سازیم و به آن نامی را اختصاص می دهیم.<br /> <div id="other"><br /> <br /> </div><br /> <br /> <br /> همان طور که مشاهده می کنید، من به این لایه، نام other را اختصاص دادم. حال برای این که این لایه از صفحه ناپدید شود، می بایست به وسیله CSS، و خاصیت display آن را مخفی کنیم. برای این کار کد زیر را به لایه خود اضافه کنید.<br /> <br /> style="display: none"<br /> یعنی باید کد شما، چیزی شبیه به کد زیر شود.<br /> <br /> <div id="other" style="display: none"><br /> </div><br /> پس از آنکه کار مخفی کردن لایه به اتمام رسید، نوبت به لینکی می رسد که این لایه را نمایش دهد و یا آن را مخفی کند. همان طور که می دانید، لینکها در HTML توسط تگ <a> ساخته می شوند. پس من هم به وسیله این تگ، لینکی همانند لینک زیر را می سازم.<br /> <br /> <a href="javascript:void(showLayer("other"));">Other& lt;/a><br /> <br /> <br /> <br /> همان طور که مشاهده می کنید، کلمه ای که درون پرانتزهای showLayer نوشته شده است، دقیقا همان نامی است که به لایه مورد نظر خود اختصاص داده ایم. پس اگر خواستید نام آن لایه را عوض کنید، فراموش نکنید که اینجا رو هم عوض کنید.<br /> تا به اینجای کار تقریبا تمامی کارها انجام شده است. فقط تنها مسئله ای که می ماند، آن شکلهای مثبت و منفی است. برای وارد کردن یک عکس درون صفحه وب، از تگ <img> استفاده می کنیم.<br /> <br /> <img id="otherImage" border="0" width="9" height="9" src="http://blog.mojtaba.net/images/p.gif"><br /> <br /> تنها نکته ای که در اینجا حائز اهمیت است آن است که مقدار خاصیت ID برای این عکس، برابر نام همان لایه+Image می باشد. یعنی اگر نام لایه را hidden انتخاب می کردید، نام این عکس را باید به صورت hiddenImage می نوشتید.<br /> نکته دیگری که آن را مهم می دانم به شما بگویم، آن است که بهتر است این عکسهای مثبت و منفی را، در هنگام بارگذاری صفحه، لود کنید. اکثر افرادی که به وسیله این روش، این نوع منوهای Drop Down را می سازند، انجام این کار آخری را فراموش می کنند. این کار باعث می شود هنگامی که کاربر بر روی آن لینک کلیک می کند، بلافاصله علامت مثبت به علامت منفی تبدیل شود. در غیر این صورت، کاربر باید منتظر لود شدن علامت منفی شود. ولی اگر همزمان با لود شدن صفحه، علامت منفی را هم در حافظه پنهانی لود کنید، همچین مشکلی پیش نمی آید. در حقیقت، این یکی از اصول طراحی عکسهای Rollover به وسیله جاوااسکریپت است. با انجام این کار، عکسهای Rollover جذابیت بیشتری پیدا می کنند. چرا که کاربر دیگر منتظر لود شدن عکس Hover نمی نشیند و همین که نشانه گر ماوس را بر روی عکس می برد، عکس Hover را مشاهده می کند.<br /> برای لود کردن عکسهای مورد نظر همزمان با لود شدن صفحه، از کد جاوااسکریپت زیر استفاده می کنیم.<br /> label = new Image(h,w)<br /> label.src = "path"<br /> <br /> این ساختار کلی کد می باشد. کد مورد نظر ما به صورت زیر در می آید.<br /> <br /> p = new Image(9,9)<br /> p.src = "http://blog.mojtaba.net/images/p.gif"<br /> n = new Image(9,9)<br /> n.src = "http://blog.mojtaba.net/images/n.gif"<br /> <br /> در زیر کد نهایی را مشاهده می کنید (من تگهای <html> و <head> و <body> رو هم نوشتم)...<br /> <br /> <br /> <br /> <html><br /> <br /> <head><br /> <title>Drop Down Menu</title><br /> <script language="javascript"><br /> <!--<br /> <br /> var ns6 = (!document.all && document.getElementById);<br /> var ie4 = (document.all);<br /> var ns4 = (document.layers);<br /> var openImg = "http://blog.mojtaba.net/images/p.gif";<br /> var closeImg = "http://blog.mojtaba.net/images/n.gif";<br /> <br /> function showLayer(layerName) {<br /> <br /> var layerImageName = layerName + "Image"<br /> if (ns6) {<br /> if ( document.getElementById(layerName).style.display == "" ) {<br /> document.getElementById(layerName).style.display = "none";<br /> document.getElementById(layerImageName).src = openImg;<br /> } else {<br /> document.getElementById(layerName).style.display = "";<br /> document.getElementById(layerImageName).src = closeImg;<br /> }<br /> } else if (ie4) {<br /> if ( document.all[layerName].style.display == "" ) {<br /> document.all[layerName].style.display = "none";<br /> document.all[layerImageName].src = openImg;<br /> } else {<br /> document.all[layerName].style.display = "";<br /> document.all[layerImageName].src = closeImg;<br /> }<br /> } else if (ns4) {<br /> if ( document.layers[layerName].display == "" ) {<br /> document.layers[layerName].display == "none";<br /> document.layers[layerImageItem].src == openImg;<br /> } else {<br /> document.layers[layerName].display == ""; <br /> document.layers[layerImageItem].src == closeImg;<br /> }<br /> }<br /> }<br /> <br /> p = new Image(9,9)<br /> p.src = "http://blog.mojtaba.net/images/p.gif"<br /> n = new Image(9,9)<br /> n.src = "http://blog.mojtaba.net/images/n.gif"<br /> <br /> //--><br /> </script><br /> </head><br /> <br /> <body><br /> <a href="javascript:void(showLayer("other"));"><br /> <img id="otherImage" border="0" width="9" height="9" src="http://blog.mojtaba.net/images/p.gif"> Other</a><br /> <div id="other" style="display: none"><br /> <p>Paragraph 1</p><br /> <p>Paragraph 2</p><br /> <p>Paragraph 3</p><br /> </div><br /> </body><br /> <br /> </html><br /> <br /> <br /> <br /> فقط به یاد داشته باشید که در هنگام استفاده از این کد، عکسهای p.gif و n.gif را درون هاست خود کپی کنید و به جای استفاده از آدرسهای [url]http://blog.mojtaba.net/images/p.gif[/url] و [url]http://blog.mojtaba.net/images/n.gif[/url] از آدرسهای درون هاست خود استفاده کنید. چرا که Bandwidth من محدودیت داره... <br /> <br /> حتما تا به حال در حین گشت زنی در اینترنت، با منوهایی برخورد کرده اید که هنگامی که ماوس بر روی آنها قرار می گیرد، رنگ آنها عوض می شود. به این حالت اصطلاحا Rollover می گویند. این کار هم به وسیله جاوااسکریپت و هم به وسیله CSS انجام می شود. اگر بخواهید به وسیله جاوااسکریپت این کار را انجام دهید، کمی وقتتان گرفته خواهد شد. اما به وسیله CSS، انجام این کار مثل آب خوردن است!<br /> در زیر کد HTML نهایی (و نه کد CSS) را مشاهده می کنید.<br /> <br /> <br /> <br /> <div id="navigation"><br /> <a href="#">Main Page</a><br /> <a href="#">Articles</a><br /> <a href="#">Tutorials</a><br /> <a href="#">Download</a><br /> <a href="#">Contact Me</a><br /> </div><br /> <br /> <br /> <br /> این کد، تنها شما را به مقصود نهایی نمی رساند. مرحله اصلی در نوشتن کد CSS آن است. کد CSS را در زیر مشاهده می کنید (فراموش نکنید که برای استفاده از کد زیر، می بایست آن را در بین دو تگ </style> و <style type="text/css"> و در قسمت Head صفحه (یعنی بین تگهای </head> و <head>) قرار دهید. همچنین می توانید از یک فایل CSS خارجی نیز استفاده کنید.)<br /> <br /> <br /> #navigation {<br /> text-align: center;<br /> font-family: tahoma;<br /> font-size: 9pt;<br /> }<br /> <br /> #navigation a {<br /> display: block;<br /> padding: 5;<br /> color: #ffffff;<br /> width: 200px;<br /> text-decoration: none;<br /> background-color: #006699;<br /> border: 1px solid #003366;<br /> margin-top: 2;<br /> margin-bottom: 2;<br /> }<br /> <br /> #navigation a:hover {<br /> color: #000000;<br /> background-color: #99cc00;<br /> border: 1px solid #003366;<br /> }<br /> <br /> <br /> همچنین اگر می خواهید منو را به صورت افقی (Horizontal) داشته باشید، می توانید خاصیت display: block را حذف کنید. این خاصیت سبب می شود تا المنتهای <a> به صورت Block-Level و نه Inline ظاهر شوند. بقیه کد هم که تقریبا برای CSSکارها خوانا می باشد. اما اگر جایی برای شما نامفهوم بود، بهم بگید تا توضیحش بدم... من این کد را در سه مرورگر Opera 7, Netscape 7 و IE 6 تست کردم، خوشبختانه هر سه مرورگر به طور کامل از این کد پشتیبانی می کنند...<br /> </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl04_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:21 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207286</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> آموزش PHP <br/>اینم از لینك:<br/><br/>http://home.ripway.com/2004-12/213935/php.PDF </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl05_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:23 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207287</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> مقایسه اجمالی ۴ زبان J#.net ،c++.net ،vb.net و C#.net <br /> در این مقاله به بررسی و مقایسه اجمالی ۴ زبان J#.NET ،C++.NET ،VB.NET و C#.NET پرداخته میشود که این مقایسات به کمک مثال بیان میشود. این مقاله برای افرادی که قصد آموختن یکی از این زبانها را دارند بسیار مفید و کارآمد میباشد. <br /> <br /> فقط شرمنده كه در بعضی از دستورها جای ; و . عوض شده --------------------------------------------------------------------------------<br /> تعریف متغیرها<br /> <br /> [VB.NET]<br /> Dim x As Integer<br /> Public x As Integer = 10<br /> <br /> [J#.NET]<br /> int x;<br /> int x = 10;<br /> <br /> [C++.NET]<br /> int x;<br /> int x = 10;<br /> <br /> [C#.NET]<br /> int x;<br /> int x = 10;<br /> <br /> نوشتن توضیحات در برنامه <br /> <br /> [VB.NET]<br /> " comment<br /> x = 1 " comment<br /> Rem comment <br /> <br /> [J#.NET]<br /> // comment<br /> /* multiline <br /> comment */<br /> /**<br /> Class Documentation<br /> */<br /> <br /> [C++.NET]<br /> // comment<br /> /* multiline<br /> comment */<br /> <br /> [C#.NET]<br /> // comment<br /> /* multiline<br /> comment */<br /> <br /> <br /> انتساب<br /> <br /> [VB.NET]<br /> nVal = 7<br /> <br /> [J#.NET]<br /> nVal = 7;<br /> <br /> [C++.NET]<br /> nVal = 7;<br /> <br /> [C#.NET]<br /> nVal = 7;<br /> <br /> دستورات شرطی<br /> <br /> [VB.NET]<br /> If nCnt <= nMax Then<br /> nTotal += nCnt " Same as nTotal = nTotal + nCnt.<br /> nCnt += 1 " Same as nCnt = nCnt + 1.<br /> Else<br /> nTotal += nCnt<br /> nCnt -= 1 <br /> End If<br /> <br /> [J#.NET]<br /> if (nCnt <= nMax){<br /> nTotal += nCnt;<br /> nCnt++;<br /> }<br /> <br /> [C++.NET]<br /> if(nCnt < nMax) {<br /> nTotal += nCnt;<br /> nCnt++;<br /> }<br /> else {<br /> nTotal += nCnt;<br /> nCnt--; <br /> };<br /> <br /> [C#.NET]<br /> if (nCnt <= nMax)<br /> {<br /> nTotal += nCnt;<br /> nCnt++;<br /> }<br /> else<br /> {<br /> nTotal +=nCnt;<br /> nCnt--;<br /> } <br /> دستورات انتخابی<br /> <br /> [VB.NET]<br /> Select Case n<br /> Case 0<br /> MsgBox ("Zero") <br /> "VB.NET exits the Select at the end of a Case<br /> Case 1<br /> MsgBox ("One")<br /> Case 2 <br /> MsgBox ("Two")<br /> Case Else<br /> MsgBox ("Default")<br /> End Select<br /> <br /> [J#.NET]<br /> switch(n) {<br /> case 0:<br /> System.out.println("Zero\n");<br /> break;<br /> case 1:<br /> System.out.println("One\n");<br /> break;<br /> default:<br /> System.out.println("?\n");<br /> }<br /> <br /> [C++.NET]<br /> switch(n) {<br /> case 0:<br /> printf("Zero\n");<br /> break;<br /> case 1:<br /> printf("One\n");<br /> break;<br /> case 2:<br /> printf("Two\n");<br /> break;<br /> default:<br /> printf("?\n");}<br /> <br /> [C#.NET]<br /> switch(n) <br /> {<br /> case 0:<br /> Console.WriteLine("Zero");<br /> break;<br /> case 1:<br /> Console.WriteLine("One");<br /> break;<br /> case 2:<br /> Console.WriteLine("Two");<br /> break;<br /> default:<br /> Console.WriteLine("?");<br /> } <br /> <br /> حلقه For<br /> <br /> [VB.NET]<br /> For n = 1 To 10 <br /> MsgBox("The number is " & n)<br /> Next<br /> <br /> For Each prop In obj<br /> prop = 42<br /> Next prop<br /> <br /> [J#.NET]<br /> for(n=1; n<11;n++)<br /> System.out.println("The number is " + n);<br /> <br /> [C++.NET]<br /> for(int n=1; n<11; n++)<br /> printf("%d\n",n);<br /> <br /> [C#.NET]<br /> for (int i = 1; i <= 10; i++) <br /> Console.WriteLine("The number is {0}", i);<br /> foreach(prop current in obj)<br /> {<br /> current=42;<br /> } <br /> <br /> حلقه While<br /> <br /> [VB.NET]<br /> While n < 100 " Test at start of loop.<br /> n += 1 " Same as n = n + 1.<br /> End While <br /> <br /> [J#.NET]<br /> while (n < 100)<br /> n++;<br /> <br /> [C++.NET]<br /> while(int n < 100)<br /> n++;<br /> <br /> [C#.NET]<br /> while (n < 100)<br /> n++; <br /> <br /> انتقال پارامترها با مقدار<br /> <br /> [VB.NET]<br /> Public Sub ABC(ByVal y As Long) <br /> ...<br /> End Sub<br /> ABC(x) <br /> ABC((x))<br /> <br /> آرگومان y با مقدارش منتقل میشود. اگر زیربرنامه ی ABC مقدار y را تغییر دهد این تغییرات تاثیری بر روی x نخواهد داشت.<br /> شما میتوانید پارامترها را مجبور کنید که با مقدار منتقل شوند بدون توجه به چگونگی تعریف آنها. این کار را می توانید با گذاشتن یک جفت پرانتز () دیگر انجام دهید.<br /> <br /> [J#.NET] <br /> اشیاء همواره با آدرس و انواع داده ی اولیه همیشه با مقدار منتقل میشوند.<br /> <br /> [C++.NET]<br /> MyMethod(i,j);<br /> <br /> [C#.NET] <br /> توجه کنید که هیچ راهی برای انتقال انواع مرجع (اشیاء) منحصرا از طریق مقدار وجود ندارد.<br /> <br /> یک متد تعریف شده:<br /> <br /> <br /> void ABC(int x)<br /> {<br /> ...<br /> } <br /> و فراخوانی این متد :<br /> <br /> ABC(i); <br /> <br /> انتقال پارامترها با آدرس<br /> <br /> [VB.NET]<br /> Public Sub ABC(ByRef y As Long)<br /> End Sub<br /> <br /> ABC(x) <br /> <br /> پارامتر y به صورت ByRef (با آدرس) شده است. اگر ABC مقدار y را تغییر دهد این تغییرات روی x نیز صورت میگیرد.<br /> <br /> <br /> <br /> [J#.NET] <br /> [C++.NET] <br /> پروتوتایپ تابع ABC که شامل اشاره گری به یک عدد است.<br /> <br /> int ABC(long *py);<br /> ABC(&VAR); <br /> پروتوتایپ تابع ABC که شامل ارجاعی به یک عدد است.<br /> <br /> int ABC(long &y);<br /> ABC(VAR); <br /> [C#.NET] <br /> همنچنین توجه داشته باشید که متد #C میتواند مانند ++C شامل اشاره گر باشد. برای مثال این متد:<br /> <br /> void ABC(ref int x)<br /> {<br /> ...<br /> }<br /> ABC(ref i); <br /> <br /> مدیریت استثنائات ساخت یافته<br /> <br /> [VB.NET]<br /> Try<br /> If x = 0 Then<br /> Throw New Exception("x equals zero")<br /> Else<br /> Throw New Exception("x does not equal zero")<br /> End If<br /> Catch err As System.Exception<br /> MsgBox("Error: " & Err.Description)<br /> Finally<br /> MsgBox("Executing finally block.")<br /> End Try<br /> <br /> [J#.NET]<br /> try{<br /> if (x == 0)<br /> throw new Exception ("x equals zero");<br /> else<br /> throw new Exception ("x does not equal zero");<br /> }<br /> catch (Exception err){<br /> if (err.getMessage() == "x equals zero")<br /> System.out.println(err.getMessage());<br /> //Handle Error Here<br /> }<br /> <br /> [C++.NET]<br /> __try{<br /> if (x == 0)<br /> throw new Exception ("x equals zero");<br /> else<br /> throw new Exception ("x does not equal zero");<br /> }<br /> __catch(Exception e)<br /> {<br /> Console.WriteLine("Caught Exception"); <br /> }<br /> __finally<br /> {<br /> Console.WriteLine("Executing finally block");<br /> }<br /> <br /> [C#.NET]<br /> // try-catch-finally<br /> try<br /> {<br /> if (x == 0)<br /> throw new System.Exception ("x equals zero");<br /> else<br /> throw new System.Exception ("x does not equal zero");<br /> }<br /> catch (System.Exception err)<br /> {<br /> System.Console.WriteLine(err.Message);<br /> }<br /> finally<br /> {<br /> System.Console.WriteLine("executing finally block");<br /> } <br /> <br /> رهاسازی ارجاعات اشیاء<br /> <br /> [VB.NET]<br /> o = Nothing<br /> <br /> [J#.NET]<br /> stringVar = null;<br /> <br /> [C++.NET]<br /> <br /> [C#.NET]<br /> o = null; </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl06_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:23 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207288</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> بهترین راه یادگیری Asp.net <br /> به نظر من به تعداد انسانها، راه برای یادگیری ASP.NET هست! شوخی نمی کنم، جدی می گویم. به نظر من هر شخصی روش یادگیری خودش را دارد. فرقی هم نمی کند که بخواهید ASP.NET یاد بگیرید یا آشپزی یا هر چیز دیگری. شما همانطور که اگر بخواهید آشپزی یاد بگیرید ممکن است از کتاب، کلاس، سعی و خطا، تجربه و حتی از وب استفاده کنید، برای ASP.NET و اصولا هر چیز دیگری هم ممکن است از همین ابزار و راهها استفاده کنید.<br /> <br /> چیزی که من می خواهم بگویم توضیح واضحات است. اما چون خیلی ها سوال می کنند ناچارم اشاره ای به این موضوع داشته باشم. به نظر من بیشتر، افراد مبتدی و تازه کار هستند که نیاز دارند که پاسخ این سوال را بدانند چون کسانی که به نوعی ASP.NET را یاد گرفته اند یا با آن آشنا هستند خود می دانند که چه کار باید بکنند و چگونه یاد بگیرند.<br /> <br /> کتاب <br /> <br /> خیلی از افراد سوال می کنند که مثلا کدام کتاب خوب است؟ به عقیده من برای یک فرد تازه کار که می خواهد با الفبای کار آشنا شود، هر کتابی در زمینه آموزش مقدماتی و کلیات ASP.NET خوب و مفید است. حتی بسیاری از کتابهای تخصصی هم فصلهای اولیه خود را به آموزش و مرور مقدمات ASP.NET تخصیص می دهند. پس دنبال کتاب خاصی نباشید. اولین کتابی را که بدست آوردید بنشینید و بخوانید. بالاخره هر کتابی هر چند سطح پائین هم که باشد آنقدر مطلب دارد که یک تازه کار را برای مدتها به خود مشغول کند.<br /> <br /> حرفه‎ای ترها هم که خود می دانند دنبال چه هستند و چه کتابی به کارشان می خورد. دقت داشته باشید که متاسفانه سطح کتابها جهت استفاده حرفه‎ای ها بسیار پائین است به گونه‎ای که آنها معمولاً کتاب مورد نظر خود را نمی توانند پیدا نمی کنند. لابد نویسندگان فکر می کنند که حرفه‎ای ها نیازی به کتاب ندارند و آنقدر توانا هستند که یا خودشان فکر کنند یا مطلب شان را در وب پیدا کنند. چیزی که بحث بخش بعدی این مقاله است.<br /> <br /> به هرحال آنقدر در کتابهای آموزشی ASP.NET در مورد فرم های وب و نحوه استفاده از ADO.NET برای ارتباط با بانک اطلاعاتی و XML گفته اند که هیچگاه در مورد چگونگی طراحی ساختار و لایه های خود برنامه یا سایت چیزی گفته نشده است. مقوله ای که بدون آن معماری را می ماند که آجر و سنگ و سیمان دارد اما نقشه ندارد.<br /> <br /> <br /> سایتهای آموزشی <br /> <br /> ابزار بعدی، استفاده از سایتهای آموزشی موجود در وب هست. باور کنید که برخی مطالب ذکر شده در سایتهای آموزشی را هیچ وقت در هیچ کتابی نخواهید یافت و اصولا آنها هیچوقت چاپ نمی شوند. بخصوص زمانی که دارید وارد قلمرو حرفه ای می شوید. با بکارگیری گوگل، این گونه سایتها هیچوقت برای شما مخفی یا ناشناخته نمی مانند. به شرطی که در انتخاب کلید واژه‎ی جستجوی خود دقت کنید. <br /> <br /> سایتی مثل W3Schools و بخش آموزش سریع یا QuickStart مایکروسافت می توانند منابع خوبی از جنس دوره های آموزشی باشند. اما انتظار نداشته باشید که در دیگر سایتهای آموزشی/مقاله‎ای ASP.NET بتوانید دوره های منظم و مرحله به مرحله‎ی کلاسیک و جزوه ای پیدا کنید. بیشتر سایتها پر هستند از مقاله های رنگارنگ و متنوع که لزوما وحدت موضوعی نداشته و صرفاً برحسب نیاز خود برنامه نویسان تهیه شده اند. من اینگونه سایتها و مطالب را برای دوران پس از مقدماتی توصیه می کنم.<br /> <br /> بیشتر این سایتها دارای خبرنامه الکترونیکی رایگان می باشند. با عضویت در آنها و دریافت مرتب تیتر مطالب شان، آنها را زیر نظر بگیرید و اگر مقاله‎ای داشتند که به کار شما می خورد، به سراغش رفته و استفاده کنید. این مساله سبب می شود که شما مجبور نباشید که همواره به آن سایتها سر بزنید یا همه مطالب شان را بخوانید و یا احتمالا مقاله‎ی مفیدی را از دست بدهید. از این رو ست که همواره بر داشتن خبرنامه‎ی الکترونیکی برای سایتها و عضویت افراد در آنها تاکید شده است. خوشبختانه سایت IranASP.NET هم از همان روزهای آغازین این مهم را سرلوحه کار خود قرار داده است. دقت داشته باشید که شما هر چه جلوتر بروید و حرفه‎ای تر شوید، وقت کمتری برای مطالعه و یادگیری خواهید داشت. بخصوص اگر به حدی برسید که درگیر یک کار یا پروژه هم بشوید!<br /> <br /> <br /> کلاس <br /> <br /> کلاس های آموزشی هم می توانند مفید باشند. به گونه ای که در مدت زمان کوتاهی سرنخ مطالب جدیدی را به شما می دهند و گاهاً ممکن است مطلبی را مطرح کنند که شما هیچ وقت در حالت خودآموزی به آن برخورد نکنید. به کلاسهای آموزشی صرفا به عنوان نقطه شروع نگاه کنید و نه چیز دیگر. هیچ کلاسی نمی تواند ادعا کند که شما را یک ماهه یا بیشتر به یک برنامه نویس حرفه ای وب تبدیل می کند که اگر ادعا کرد خود معیار خوبی است جهت میزان صداقت گردانندگان آن کلاس و سطح آن. <br /> <br /> معمولاً شما نمی توانید قبل از تشکیل یک کلاس به میزان مفید بودن آن برای یادگیریتان پی ببرید. هر چقدر هم از گردانندگان آن سوال کنید، آنها آنقدر کلمات فنی و قلمبه سلمبه بلد هستند که شما فکر کنید بیسواد مطلق هستید. نمی گویم که همه‎ی کلاس ها اینگونه هستند و یا اینکه شما بدون تحقیق و بررسی به هر کلاسی بروید. اما می گویم که اندکی هم ریسک پذیر باشید چون ممکن است از هزینه و وقت تان آنگونه که انتظار داشته باشید در پایان کلاس بهره نبرده باشید. این را کاریش نمی توان کرد و از ملزومات کار است که البته اشکالی هم ندارد و همین مساله خود برای شما نکته‎ی آموزشی خواهد شد اگرچه در زمینه ASP.NET هم نباشد!<br /> <br /> از دیگر فواید کلاس می توان به امکان پیدا کردن دوست و یا همکار و مهم تر از همه پروژه اشاره نمود. خیلی از همکارهای کاری و پروژه ای می تواند از درون همین کلاس ها رقم بخورد چه برای دانشجویان چه برای شخص مدرس!<br /> <br /> <br /> زبان زبان زبان<br /> <br /> بله، زبان البته از نوع انگلیسی آنقدر مهم است که سه بار در عنوان این بخش تکرار شود. این را من برای شما که فارسی زبان هستید می گویم. شما نمی توانید یک برنامه نویس وب باشید اما زبان انگلیسی بخصوص در زمینه خواندن یا همان Reading را بلد نباشید. چون شما نمی توانید همه مطالب خود که هیچ بلکه حتی کسری از آن را هم به زبانی غیر از انگلیسی پیدا کنید.<br /> <br /> شما برای خواندن و یادگیری به زبان نیاز دارید. همه‎ی کتابها انگلیسی هستند و آنهایی هم که مثلاً ترجمه فارسی شده اند را خیلی جدی نگیرید. آنها بیشتر بدرد ناشرشان می خورد و کمی هم مترجم شان و نه شما. شما باید اصطلاحات را به شکل انگلیسی شان یاد بگیرید و نه ترجمه های من در آوردی و عجیب و غریب فارسی. کتابهای فارسی در این زمینه را اغلب کسانی ترجمه می کنند که به نوعی ماشین ترجمه هستند و حتی ممکن است ندانند که آنچه را ترجمه کرده اند به چه دردی می خورد.<br /> <br /> خوشبختانه مطالب فنی کامپیوتری نمی توانند دارای متون پیچیده و سخت انگلیسی باشند. عمده‎ی کلمات که اسامی خاص و اصطلاحات فنی هستند و بقیه هم افعال و کلمات ساده و معمولی زبان می باشند. پس شما قرار نیست که نمایشنامه‎ی شکسپیر را بخوانید.<br /> <br /> همچنین شما برای برنامه نویسی تان و انتخاب اسامی متغیرها، کلاس ها و متدهای مورد نیازتان باید بتوانید اسامی با مسمایی را انتخاب کنید. شما باید بتوانید شرح یا کامنتی هر چند کوچک در لابلای خطوط برنامه تان بنویسید تا کد برنامه شما به یک غول دست نیافتنی تبدیل نشود. شما باید بتوانید خیلی از برنامه های از پیش نوشته شده را بخوانید و بفهمید. معنا و مفهموم اسامی انتخاب شده برای کلاس ها و متدها از دید زندگی روزمره به فهم بیشتر شما از آن برنامه کمک می کند. همه‎ی اینها با دانستن زبان انگلیسی میسر است.<br /> <br /> پس لطفاً قبل از یاد گرفتن ASP.NET و یا اینکه چگونه باید از ADO.NET استفاده کرد از زبان خود مطمئن شوید. اگر ضعیف هستید اول آن را تقویت کنید و بعداً بیائید.<br /> <br /> <br /> پیش نیاز <br /> <br /> توجه داشته باشید که جهت یادگیری ASP.NET که یک تکنولوژی جهت ساخت برنامه های تحت وب است و نه یک زبان برنامه نویسی، شما به پیش نیازهای زیاد و متنوعی نیاز دارید. باز تکرار می کنم که ASP.NET تکنولوژی است نه زبان برنامه نویسی. مفاهیم و مسائل زیادی جهت به کارگیری این تکنولوژی مورد نیاز است. بدون تسلط و نه صرفاً اطلاع از آنها شما نمی توانید ASP.NET را یاد بگیرید. مواردی که به ذهنم می رسد را در زیر فهرست وار به اطلاع شما رسانده ام. اگرچه ممکن است لیست کاملی نباشد ولی حداقل مهم ترها را دارد.<br /> <br /> - شما باید یک برنامه نویس کامپیوتر باشید.<br /> - شما باید بر مفاهیم شئ گرایی مسلط باشید.<br /> - شما باید یکی از زبانهای خانواده ++C یا Visual Basic را بدانید.<br /> - شما باید بانک اطلاعاتی و زبان SQL را بدانید.<br /> - شما باید مفاهیم وب و برنامه نویسی وب را بدانید.<br /> - شما باید کار با محیط های Visual را بدانید.<br /> - شما باید IIS را بشناسید و فرق وب سایت و Virtual Directory و تنظیمات آن را بدانید.<br /> - شما باید یک ویندوز-سرور کار خوب باشید.<br /> - کمی هم شناخت و ذوق هنری در طراحی صفحات و گرافیک وب داشته باشید.<br /> - ...<br /> - شما باید عاشق مایکروسافت باشید!<br /> <br /> <br /> بهترین راه یادگیری ASP.NET <br /> <br /> حالا می خواهم به اصل سوال پاسخ دهم. شما دارید از یک فوت کوزه گری نه چندان مخفی مطلع می شوید. راه های مختلف را گفتم اما حالا می خواهم بهترین آن را بگویم. بهترین راه یادگیری ASP.NET چیست؟ <br /> <br /> پاسخ: کار<br /> <br /> شما از موارد فوق تنها می توانید مقدمات را یاد بگیرید یا اینکه گوش و چشم تان را با واژه هایی آشنا کنید. برای ملکه شدن دانسته هایتان و حرفه‎ای بودن تان باید کار کنید. یعنی اینکه باید برنامه بنویسید. باید درگیر کار یا پروژه ای شوید. باید زور بزنید و درگیر باشید. باید نیازمند باشید. اگر از سر سیری یا صرفاً برای پُز دادن دنبال چیزی هستید مطمئن باشید چیزی یاد نمی گیرید مگر به اندازه همان پُز دادن.<br /> <br /> شما نیاز دارید که همه چیز را حتی مقدمات را هم عملاً و شخصاً تجربه کنید. این می توانید از طریق تعریف پروژه های من درآوردی شخصی باشد یا یک کار تجاری واقعی. شما باید در حین کار شلاق بخورید تا فولاد آبدیده شوید! هیچ چیز بجز یک کار جدی و واقعی نمی تواند به شما چیز یاد بدهد. این چیزی است که خود من به شخصه تجربه کرده ام. در این چند سال کتاب و سایتهای فراوانی را خواندم و مقالات زیادی را نوشتم اما هیچ یک به اندازه‎ی یک پروژه جدی سنگین به من آموزش نداد. بعبارت دیگر همه آن خواندنها لازم هستند ولی کافی نیستند. دوباره دقت کنید: لازم هستند. بیهوده نیستند. اما کافی هم نیستند.<br /> <br /> جهت یادگرفتن ASP.NET شما باید پرحوصله، وقت دار، سمج، فعال، علاقه مند و پیگیر باشید. </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl07_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:24 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207289</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> Unicode چیست؟<br/>حتما این روزها کلمه Unicode بارها به گوشتان خورده و یا در وب سایت ها و برنامه های کاربردی جدید آن را دیده اید و میخواهید بدانید که Unicode چیست. همینطور که حتما میدانید کامپیوتر فقط با عدد و رقم سرکار دارد و تمام اطلاعات نوشتاری,صوتی و تصویری نهایتا بصوت اعداد و ارقام در کامپیوتر ذخیره و پردازش میشوند <br/>خوب حالا ما برای اینکه بتوانیم اطلاعات نوشتاری خودمان را برای کامپیوتر قابل فهم کنیم مجبوریم تا به هر حرف از حروف الفبا, یک کد عددی اختصاص بدهیم. از این رو صدها نوع سیستم کد گذاری به وجود آمده و برای زبانهای مختلف سیستم های مختلف معرفی شده.این مسئله در مورد زبان رسمی ایران یعنی فارسی هم صادق بود و تازه هر شرکت نرم افزاری ایرانی هم یک سیستم کد گذاری مخصوص خودش را داشت و دارد و هیچ وقت یک سیستم کد گذاری استاندارد برای زبان فارسی بوجود نیامد که همه برنامه نویسها از آن استفاده کنند.این مسئله در مورد زبان های دیگر هم وجود داشت.تا اینکه بالاخره Unicode معرفی شد.یونی کد نه یک نوع فونت خاص است نه یک برنامه خاص بلکه یک استاندارد کد گذاری برای حروف الفباست مانند ANSI. یونی کد به همه ی حروف اعداد یکتایی مستقل از محیط سیستم عامل و برنامه و زبان اختصاص میدهد.این سیستم میتواند تمام حروف زبانهای مختلف زنده امروز دنیا را در خودش جای دهد و به هر کدام از این حروف کد یکتایی اختصاص دهد. بکار گیری Unicode در وب سایت ها و برنامه های Clint -Server میتواند بسیار مفید باشد و ما نگران این نیستیم که کاربران وب سایت از چه سیستم عامل و از چه مرورگر اینترنتی استفاده میکنند فقط باید از استاندارد Unicode پشتیبانی کند.امروزه بسیاری از شرکتهای پیشتاز دنیای کامپیوتر این استاندارد را پذیرفته اند و تقریبا تمامی برنامه های کاربردی جدید از این سیستم کد گذاری حمایت میکنند مثلا از سیستم عامل Windows me به بعد یعنی Windows 2000,windows xp و windows server.net تماما بر مبنای Unicode بنا شده اند و سیستم عامل های دیگر مثل MacOs و Solaris و چندین سیستم عامل دیگر هم از Unicode حمایت میکنند.برنامه کاربردی نیز مانند Office2000وOffice Xp بطور کامل از این استاندارد پشتیبانی میکنند. و شما میتوانید با استفاده از Front Page Xp یا Front Page 2000 یا Visual Studio.net صفحات وب فارسی ایجاد کنید. برای گسترش و ترویج استاندارد Unicode یک کنسر سیوم ایجاد شده است. در حال حاضر این سازمان نسخه جدید Unicode را یعنی Unicode 3.2.0 را منتشر کرده است. استفاده از Unicode در حال افزایش است و برنامه ها و وب سایت های آینده تماما از این استاندارد استفاده خواهند کرد.این مسئله برای ما فارسی زبانها نیز موقعیت مناسب ایجاد کرده و میتوانیم در عرصه اینترنت مطالب خود را به زبان فارسی بدون استفاده از روش های مثل ایجادفایلهای تصویری از متن و قرار دادن آن درصفحه وب و یا استفاده از کدگذاری زبانهای دیگر مانند زبان تازی(عربی) عرضه کنیم.این مسئله فرایند ایجاد وب سایت ها و برنامه های فارسی را بسیار آسان تر و کم هزینه تر کرده. این وب سایت هم(RastiSoft) از Unicode برای پیاده سازی زبان فارسی استفاده کرده و برای نمونه شما در صفحه تماس باما میبینید که بدون نیاز به دریافت برنامه خاصی مثلا یک اپلت جاوا یا یک ActiveX , براحتی می توانید مطلب خود را به زبان فارسی تایپ کنید. بنابراین اگر قصد دارید که یک وب سایت و یا یک وب لاگ فارسی شخصی ایجاد کنید پیشنهاد میکنم که حتما از استاندارد Unicode استفاده کنید. </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl08_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 16:26 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207290</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> Md5 <br/>این الگوریتم یک رشته با طول متفاوت را به عنوان ورودی می‌گیرد و یک "خلاصه پیام MD5" یا "اثر انگشت" با طول 128 بیت می سازد.<br/>در این روش اینکه دو پیام مختلف دارای یک "خلاصه پیام" باشند یا اینکه یک رشته از روی یک "خلاصه پیام" ساخته شود غیر ممکن می باشد. این الگوریتم برای امضاهای دیجیتال مناسب است، جایی که احتیاج به خلاصه کردن یک فایل بزرگ در یک رشتهء امن و فشرده، قبل از کد کردن آن متن، در سیستم های کدینگ، با کلید های خصوصی و عمومی آن سیستم مانند RSA (Rivest Shamir Adelman) الگوریتم MD5 برای داشتن سرعت بالا در ماشین های 32 بیتی طراحی شده است در عین حال احتیاجی به جانشینی ها در جداول بزرگ ندارد. این الگوریتم را با کدهای بسیار کمی می توان نوشت.<br/>الگوریتم MD5 توسعه ای از الگوریتم MD4 می باشد با این تفاوت که MD5 کمی کندتر از MD4 عمل می کند اما در طراحی آن بسیار محافظه کارانه عمل شده است.<br/>MD5 به این دلیل طراحی شد که حس کردند MD4 به عنوان سرعت بالایی که داشت پذیرفته شده و از امنیت بالایی در شرایط بحرانی برخوردار نمی باشد. MD4 برای سرعت بالا طراحی شده ولی احتمال شکست آن در رمز کردنی موفق وجود دارد. MD5 کمی در سرعت کند شده با این تفاوت که بیشترین امنیت را داراست. این الگوریتم حاصل تاثیر دادن نظرات تعدادی از استفاده کنندگان MD4 به همراه مقادیری تغییر در ساختار الگوریتم برای افزایش سرعت و قدرت آن می باشد. الگوریتم MD5 در این مکان عومی قرارگرفته تا از آن استفاده و در صورت امکان استاندارد شود.<br/><br/><br/><br/><br/><br/><br/><br/><br/>شرایط و نکات لازم<br/>در این متن منظور از « کلمه» تعداد 32 بیت و «بایت» تعداد 8 بیت داده می باشد. یک صف از بیت ها دارای خصوصیات طبیعی یک صف از بایتها می باشند که هر گروه هشت تایی متوالی از بیتها یک بایت را تشکیل می دهند که پرارزش ترین بیت در ابتدا قرار دارد. یک صف از بایت ها دقیقا مشابه یک صف 32 بیتی از کلمات پردازش می شود. جایی که گروهی 4 تایی از توالی بایتها پردازش می شوند، کم ارزش ترین بایت اولین بایت می باشد.<br/><br/><br/>اجازه بدهید از x_i بجای xi (x اندیس i ) استفاده کنیم و اگر مقدار اندیس یک عبارت محاسباتی بود آن را در {} محدود می کنیم، مانند: x_{i-1} . همچنین از ^ به عنوان علامت توان استفاده می کنیم، پس x^i یعنیx به توان i .<br/>اجازه بدهید از علامت «+» برای اضافه کردن دو کلمه به هم استفاده کنیم. از x<<<5 به عنوان عملگر چرخش بیتی در کلمات استفاده می شود کهx به اندازه 5 بیت به چپ چرخش می کند.<br/><br/><br/>از not (x) به عنوان عملگر نقیض بیتی، از X v Y به عنوان عملگر فصل (or) و از X xor Y به عنوان عملگر exclusive or و از XY به عنوان عملگر عطف (and) استفاده می کنیم.<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>توضیحات الگوریتم MD5<br/>فرض کنید ما b بیت پیام به عنوان ورودی داریم و تصمیم داریم خلاصه پیام آن را بدست آوریم. b در اینجا یک عدد نا منفی و صحیح است، b می تواند مقدار صفر داشته باشد و هیچ محدودیتی برای مضرب هشت بودن آن نیست و به هر اندازه می تواند بزرگ باشد. فرض کنید بیت های این پیام را بشود به صورت زیر نوشت:<br/>m0m1...mb − 1-<br/>برای آوردن خلاصه پیام 5 مرحله زیر را انجام می دهیم:<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>اضافه کردن بیتهای نرم کننده:<br/><br/>طول پیام مورد نظر به 448 به پیمانه 512 توسعه پیدا می کند به این معنی که اگر به طول پیام 64 بیت اضافه شود، طولش مضربی از 512 خواهد بود. عمل توسعه دادن همیشه اجرا می شود مگر اینکه طول پیام به صورت 448 به پیمانه 512 باشد.<br/>عمل توسعه پیام یا نرم کردن آن به صورت زیر انجام می شود:<br/>یک بیت [1] سپس تعدادی بیت [0] به پیام اضافه می شود.اضافه شدن بیت های 0 تا زمانی که طول رشته به 448 بر پایه 512 برسد، ادامه پیدا می کند. در این عمل حداقل یک بیت و حداکثر 512 بیت اضافه خواهد شد.<br/><br/><br/><br/><br/><br/><br/><br/>افزایش طول:<br/><br/>یک نمایش 64 بیتی از b بیت پیام اولیه به آخر نتیجه گام قبل اضافه می شود. در بدترین حالت، b بزرگتر از 64 بیت خواهد بود. در این حالت فقط 64 بیت کم ارزش b استفاده خواهد شد.<br/>هم اکنون طول پیام بدست آمده دقیقا معادل مضربی از 512 خواهد بود. مشابه اینکه بگوییم، این پیام طولی معادل مضربی از16 کلمه دارد اجازه بدهید M[0…N-1] را نمایانگر کلمات پیام بدست آمده بدانیم. (N مضربی از 16 می باشد.)<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>تعیین بافر برای MD:<br/><br/>برای محاسبه خلاصه پیام یک بافر 4 کلمه ای (A,B,C,D) استفاده می شود. هر کدام از A، B، Cو D یک ثبات 32 بیتی می باشند. این ثبات ها مطابق جدول زیر مقدار دهی می شوند ( بایتهای کم ارزش در ابتدا قرار دارند )<br/>wordA:01234567-<br/>wordB:89abcdef-<br/>wordC:fedcba98-<br/>wordD:76543210-<br/><br/><br/>پردازش پیام در بلاک های 16 کلمه ای:<br/><br/>در ابتدا 4 تابع کمکی تعریف می کنیم که هر کدام به عنوان ورودی سه کلمهء 32 بیتی می گیرد و برای خروجی یک کلمهء 32 بیتی تولید می کند.<br/><br/><br/>F(X,Y,Z) = XYvnot(X)Z-<br/>G(X,Y,Z) = XZvYnot(Z)-<br/>H(X,Y,Z) = XxorYxorZ-<br/>I(X,Y,Z) = Yxor(Xvnot(Z))-<br/><br/><br/>در هر موقعیت بیتی، F به عنوان شرط عمل می کند: اگر X آنگاه Y در غیر این صورت Z. تابع F می توانست طوری تعریف شود که به جای استفاده از v از + استفاده کند چون XY و not(X) هرگز یک هایی در موقعیت بیتی یکسان نخواهد داشت. جالب است به یاد داشته باشید که اگر بیت های X، Y و Z مستقل و غیر مرتبط باشند، هر بیت از F(X, Y, Z) مستقل و غیر مرتبط خواهد بود.<br/><br/><br/><br/>توابع G، H و I شبیه تابع F هستند، به طوری که آنها در "توازی بیتی" کار می کنند تا خروجی شان را از بیت های X، Y و Z تولید کنند. در چنین روشی اگر بیت های متناظر X، Y و Z مستقل و غیر مرتبط باشند، آنگاه هر بیت از G(X, Y, Z)، H(X, Y, Z) و I(X, Y, Z) مستقل و غیر مرتبط خواهند بود.<br/><br/><br/><br/><br/>توجه داشته باشید که تابع H، تابع XOR یا توازن بیتی از ورودی هایش است. این گام از یک جدول 64 عنصری T[1…64] ساخته شده از یک تابع مثلثاتی، استفاده می کند. اجازه دهید T[i]، I-امین عنصر جدول را مشخص می کند که برابر است با قسمت صحیح حاصلضرب 4294967296 در abs(sin(i))، به طوری که I به رادیان باشد.<br/><br/><br/><br/>کارهای زیر را انجام می دهید:<br/><br/>کد:<br/>/* Process each 16-word block. */<br/> For i = 0 to N/16-1 do<br/><br/> /* Copy block i into X. */<br/> For j = 0 to 15 do<br/> Set X[j] to M[i*16+j].<br/> end /* of loop on j */<br/><br/> /* Save A as AA, B as BB, C as CC, and D as DD. */<br/> AA = A<br/> BB = B<br/> CC = C<br/> DD = D<br/><br/> /* Round 1. */<br/> /* Let [abcd k s i] denote the operation<br/> a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */<br/> /* Do the following 16 operations. */<br/> [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]<br/> [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]<br/> [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]<br/> [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]<br/><br/> /* Round 2. */<br/> /* Let [abcd k s i] denote the operation<br/> a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */<br/> /* Do the following 16 operations. */<br/> [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]<br/> [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]<br/> [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]<br/> [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]<br/><br/> /* Round 3. */<br/> /* Let [abcd k s t] denote the operation<br/> a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */<br/> /* Do the following 16 operations. */<br/> [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]<br/> [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]<br/> [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]<br/> [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]<br/><br/> /* Round 4. */<br/> /* Let [abcd k s t] denote the operation<br/> a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */<br/> /* Do the following 16 operations. */<br/> [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]<br/> [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]<br/> [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]<br/> [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]<br/><br/> /* Then perform the following additions. (That is increment each<br/> of the four registers by the value it had before this block<br/> was started.) */<br/> A = A + AA<br/> B = B + BB<br/> C = C + CC<br/> D = D + DD<br/><br/> end /* of loop on i */<br/><br/><br/>خروجی:<br/><br/>خلاصه پیامی که به عنوان خروجی تولید می شود و عبارت است از A، B، C و D، که ما با کم ارزش ترین بیت A شروع می کنیم و به با ارزش ترین بیت D خاتمه می دهیم. این تعریف MD5 را کامل می کند.<br/><br/>نتیجه<br/><br/><br/>الگوریتم خلاصه پیام MD5 به سادگی قابل اجرا می باشد و یک "اثر انگشت" یا "خلاصه پیام" از پیام با طول اختیاری تولید می کند. گمان برده می شود که امکان مواجه شدن با دو پیام که خلاصه پیام مشابهی دارند از رتبهء 64^2 و برای هر پیامی که به آن یک خلاصه پیام داده شده است از رتبهء 128^2 می باشد.<br/><br/><br/><br/><br/>الگوریتم MD5 برای نقاط ضعف به دقت بررسی شده است. به هر حال این الگوریتم نسبتا جدید است و تحلیل امنیتی بیشتری را طلب می کند، مشابه طرح های مشابه در این رده. </p> </div> </div> </div> <div class="forum_post_row"> <div class="forum_cel_1"> <div class="forum_post_usertumb"> <img id="ctl100_ctl00_ViewPostList1_lstPost_ctl09_imgAvatar" src="http://img.tebyan.net/Avatar/17.jpg" style="border-width:1px;border-style:solid;" /> </div> <div class="forum_postowner_username"> <span><a class="Col3" href="http://www.tebyan.net/index.aspx?pid=191553&c=Profile/View&wallid=rezapoohpooh"> Reza Godarzi</a></span> </div> <div class="forum_post_qty"> <a href="newindex.aspx?pid=17259&userid=259584"><span> 189</span><span> بحث </span></a> </div> </div> <div class="forum_cel_2"> <div class="post_startdate"> <span> جمعه 4/4/1389 - 17:46 </span>-<span class="thanks_count"> 0 </span><span class="inforesult"> <span class="thanks_count_close"></span><span class="thanks_count_names"></span> </span> <span>تشکر </span><span class="post_hidden_id"> 207302</span> </div> <div style="display: block; height: 10px"> </div> <div class="forum_post_summary"> <p> طراحی نرم‌افزارهای قابل اطمینان <br/><br/><br/>اشاره :<br/><br/>كامپیوترها روز به روز بیشتر در زندگی ما دخیل می‌شوند. امروزه خطوط هوایی، عملیات بانكی، ارتباطات تجاری، سیستم‌های تولید و فروش و بسیاری بخش‌های حیاتی دیگر جامعه به كامپیوترها متكی شده‌اند. در چنین شرایطی خطا در نرم‌افزار می‌تواند نتایج فاجعه‌باری به بار بیاورد. بیشتر مشكلات عمده یك نرم‌افزار ریشه در اولین قدم ساخت آن، یعنی طراحی، دارد. برای پیشگیری از چنین مشكلاتی ابزارهای تحلیلی قدرتمندی ارائه شده‌اند كه مهندسان نرم‌افزار می‌توانند به كمك آن‌ها از قابل اطمینان بودنِ نرم‌افزارهایشان مطمئن شوند.<br/><br/><br/>‌منبع: ساینتیفیك‌امریكن‌<br/><br/>ضعف طراحی‌<br/>افتتاح فرودگاه دنور در یازده سال پیش نمونه‌ای درخشان از معماری و فناوری‌های پیشرفته بود. سیستم خودكار توزیع و كنترل‌بار، گل سر سبد High-Tech در این فرودگاه بود. این سیستم، قرار بود مطلقاً بدون دخالت نیروی انسانی، بسته‌ها و چمدان‌ها را در طول 26 مایل مسیر‌های انتقال، جابه‌جا و توزیع كند و بار‌ها را به‌سرعت، به‌راحتی و با اطمینان به هواپیما‌ها یا به‌دست مسافران برساند. ولی مشكلات نرم‌افزاری دائماً این سیستم را از كار می‌انداخت و نهایتاً موجب تأخیر شانزده ماهه در افتتاح فرودگاه و صرف میلیون‌ها دلار هزینه اضافه شد. به‌رغم اصلاحات بی‌شمار، این سیستم هیچ‌گاه نتوانست با اطمینان عمل كند تا این‌كه بالاخره در تابستان گذشته مدیران فرودگاه تصمیم گرفتند آن را به كلی كنار بگذارند و دوباره از سیستم سنتی توزیع بار استفاده كنند. شركتBAE Automated Systems، طراح سیستم توزیع بار خودكار، منحل شد و United Airlines مشتری اصلی این سیستم به مرز ورشكستگی كشیده شد.<br/><br/>طراحی‌ ضعیف نرم‌افزار هر روز خشم میلیون‌ها كاربر را برمی‌انگیزد و هزینه‌های بالایی به آن‌ها و به شركت‌ها تحمیل می‌كند. مثال‌هایی چون فرودگاه دنور كم نیستند. سازمان درآمدهای داخلی ایالا‌ت متحده در سال 1997 پروژه‌ای چهارمیلیارددلاری برای مدرن كردن فرایندهای كاری خود اجرا كرد كه با شكست روبه‌رو شد.<br/><br/>به دنبال آن پروژه‌ای هشت میلیارد دلاری برای بهبود سیستم قبلی انجام شد كه به همان اندازه پروژه اولی دردسرساز شد. اداره آگاهی فدرال (FBI) هم در سال 2005 سیستم 170 میلیون دلاری مدیریت الكترونیك پرونده‌ها را كنار گذاشت.<br/><br/>اداره هوانوردی فدرال هنوز هم با پروژه بی‌فرجام و پرهزینه نوسازی سیستم‌های قدیمی كنترل ترافیك هوایی دست‌وپنجه نرم می‌كند.<br/><br/>علت چنین شكست‌های عظیمی این است كه اشتباهات طراحی خیلی دیر آشكار می‌شوند. فقط وقتی كه برنامه‌نویسان نوشتن كد برنامه را شروع می‌كنند، متوجه ناكارآمدی و مشكلات طراحی‌ خود می‌شوند. گاهی مشكلات نرم‌افزاری به خاطر یك ناسازگاری یا فراموشكاری فاحش رخ می‌دهند، ولی در اكثر موارد ضعف و ابهام در طراحی كلی و ابتدایی نرم‌افزار باعث بروز مشكل می‌شود. البته همانطور كه كد برنامه با افزودن تدریجی اصلاحات بزرگ‌تر می‌شود، یك ساختار طراحی مبسوط و پر جزئیات هم برای آن به وجود می‌آید.<br/><br/>البته چنین طرحی پر از موارد خاص، نقاط ضعف، و فاقد اصول یكدست و منسجم است؛ درست مثل ساختمان سازی، در نرم‌افزار هم اگر پی و بنیاد یك نرم‌افزار ضعیف و ناپایدار باشد، ساختاری نیز كه روی آن بنا می‌شود، ناپایدار خواهد بود.<br/><br/><br/><br/>توسعه‌دهندگان و مدیرانی كه نرم‌افزارهایشان با شكست‌های عمومی و بزرگ روبه‌رو شده است، می‌توانند در دفاع از خود بگویند، ما از شیوه‌های استاندارد و جا افتاده این صنعت استفاده كردیم؛ و متأسفانه حق هم دارند! توسعه‌دهندگان به ندرت طرح‌های خود را با دقت و به تفصیل مشخص می‌كنند و آن‌ها را برای داشتن ویژگی‌های مطلوب، تحلیل و بررسی می‌نمایند، ولی در دنیای امروز كه كامپیوترها هواپیماها را هدایت می‌كنند، ماشین‌ها و قطارها را می‌رانند، بخش عمده‌ای از امور مالی را به عهده دارند، و دستگاه‌های تولید و تجارت را می‌گردانند، نیاز مبرمی به افزایش قابلیت اطمینان نرم‌افزارها احساس می‌شود.<br/><br/>در این میان، نسل جدیدی از ابزارهای طراحی نرم‌افزار در حال ظهور هستند. موتور تحلیل در این ابزارها از نظر روش كار شبیه ابزارهایی است كه مهندسان برای بررسی طراحی سخت‌افزار كامپیوتر به كار می‌برند. توسعه‌دهنده با استفاده از یك زبان كدگذاری سطح بالا نرم‌افزار را مدل‌سازی می‌كند و بعد با استفاده از یك ابزار دیگر میلیاردها حالت مختلف اجرای سیستم را بررسی می‌نماید و به دنبال حالت‌‌های غیر عادی می‌گردد كه می‌تواند موجب رفتار نامطلوب در سیستم شود.<br/><br/>این فرایند كوچك‌ترین خطاهای طراحی را حتی قبل از این‌كه نرم‌افزار كدنویسی شود، مشخص می‌كند و از آن مهم‌تر، حاصل آن طراحی‌ای دقیق، مستحكم و جامع است كه تمام وضعیت‌های متصور برای آن بررسی شده است. یك نمونه از این ابزارها، Alloy است كه من (دانیل جكسون، نویسنده مقاله) به همراه تیم تحقیقاتیم ساخته‌ایم/ Alloy (كه به صورت رایگان روی وب در دسترس است) توانایی‌های خود را در انواع كاربردها نظیر نرم‌افزارهای هوا - فضا، سیستم‌های تلفن، سیستم‌های رمزنگاری، و حتی طراحی ماشین‌هایی كه در درمان سرطان به كار گرفته می‌شوند، نشان داده است.<br/><br/>تقریباً تمام مشكلات مهم یك نرم‌افزار را می‌توان در خطاهای مفهومی‌ای كه قبل از شروع برنامه‌نویسی آن رخ داده است، ریشه‌یابی كرد. ‌Alloy و سایر ابزارهای آزمون طراحی مشابه آن، بر حاصل تحقیقاتی كه در یك ربع قرن برای اثبات درست بودن برنامه‌ها به كمك ریاضیات صورت گرفته‌اند، مبتنی هستند.<br/><br/>اما این ابزارها به جای این‌كه این قضیه را دستی حل كنند، از ابزارهای منطقی خودكار بهره می‌گیرند كه طرح نرم‌افزار را به عنوان یك معمای عظیم در نظر می‌گیرد كه باید حل شود. این ابزارهای تحلیلگر، روی طرح یك نرم‌افزار كار می‌كنند و نه كد آن. بنابراین، تضمین نمی‌كنند كه یك نرم‌افزار با مشكل مواجه نشود. اما این‌ها نخستین ابزارهای عملی‌ای هستند كه مهندسان نرم‌افزار می‌توانند به كمكشان مطمئن شوند كه طراحی یك نرم‌افزار مستحكم و فاقد خطاهای مفهومی است و بنابراین پایه‌ای قوی است كه می‌توان روی آن یك سیستم نرم‌افزاری مطمئن و قابل اطمینان را بنا نهاد.<br/><br/>ارزیابی طراحی‌ها<br/><br/>نرم‌افزار بد، مشكل نوظهوری نیست. هشدارها درباره بحران نرم‌افزاری سابقه‌ای از دهه 1960 دارد و با گسترش استفاده از كامپیوتر در جامعه، این هشدارها فقط شدیدتر شده‌اند.<br/><br/>امروزه معمولاً تمام نرم‌افزارها از طریق تست‌ كردن، دیباگ و بهینه می‌شوند. مهندسان نرم‌افزار برنامه را با مجموعه وسیعی از مقادیر ورودی تست می‌كنند تا مطمئن شوند كه به خوبی عمل می‌كند. این شیوه عده زیادی از خطاهای كوچك را آشكار می‌كند، ولی نمی‌تواند خطاهای اساسی موجود در طراحی اولیه نرم‌افزار را مشخص كند. به زبان دیگر، خانه از پای بست ویران است، خواجه در بند نقش ایوان است.<br/><br/>نكته بدتر این‌كه، خود اصلاح باگ‌ها در مرحله تست نرم‌افزار، اغلب موجب بروز مشكلات طراحی می‌شوند. همان‌طور كه برنامه‌نویسان كدها را دیباگ می‌كنند و قابلیت‌های جدیدی به آن‌ها می‌افزایند، بدون استثنا به پیچیدگی‌های برنامه افزوده می‌شود و امكان بروز مشكلات و ناكارآمدی در عملكرد برنامه بیشتر می‌شود.<br/><br/>این وضعیت یاد‌آور نظریه غلط بطلمیوسی در باب حركت سیارات است كه در یونان باستان ارائه شد. طبق نظر بطلمیوس، هر یك از سیارات بر مدار دایره‌ای حركت می‌كردند كه مركز آن بر محیط دایره دیگری قرار داشت. در قرون وسطی مشاهدات نشان داد كه برخی پیش‌بینی‌های این نظریه اشتباه بوده‌اند و دانشمندان آن زمان سعی كردند با افزودن دوایر دیگری به دوایر موجود، نظریه را اصلاح كنند.<br/><br/>اما این اصلاحات جزئی در طی قرون نتوانست مشكلات این نظریه را حل كند؛ چراكه مفاهیم بنیادی و اولیه‌ای كه این نظریه بر آن‌ها استوار بود، اشتباهات فاحشی داشتند.<br/><br/><br/>به همین ترتیب، نرم‌افزاری كه از اول بد طراحی شده باشد، به‌رغم زمان و پول زیادی كه صرف بهبود آن می‌شود، به تدریج پیچیده‌تر می‌شود و قابلیت اطمینان آن كمتر می‌گردد. امروزه روشن شده است كه مشكلات جدی یك سیستم نرم‌افزاری، از خطاهای برنامه‌نویسی ناشی نمی‌شوند. تقریباً تمام مشكلات عمده یك نرم‌افزار را می‌توان در خطاهای مفهومی‌ای كه قبل از شروع برنامه‌نویسی آن رخ داده است، ریشه‌یابی كرد. صرف كمی زمان و هزینه برای تحلیل و مدل كردن در مراحل اولیه تعیین نیاز‌ها، ویژگی‌ها و طراحی یك نرم‌‌افزار، در مقابل هزینه‌هایی كه باید برای بررسی تمام كدها بپردازیم، بسیار ناچیز است، ولی سود حاصل از آن بسیار زیاد است. تمركز روی طراحی در ابتدای كار، جلوی بسیار از دردسرهای آینده را می‌گیرد.<br/><br/>ظهور ابزارهای طراحی نرم‌افزار به این دلیل با كندی مواجه بوده است كه نرم‌افزار تابع قوانین فیزیكی نیست. برنامه‌های كامپیوتری اساساً همانند اشیایی ریاضی هستند كه مقادیر آن‌ها با بیت‌ها ساخته می‌شوند. به همین دلیل، برنامه‌های نرم‌افزاری اشیایی گسسته (مانند ذرات) هستند، نه پیوسته. یك مهندس مكانیك می‌تواند یك قطعه را تحت تنش یك نیروی بزرگ تست كند و نتیجه بگیرد كه اگر این تنش را تحمل كرد، می‌تواند نیروهای كوچك‌تر را هم تحمل كند. وقتی یك شی تابع قوانین و اصولِ (اكثرا پیوسته) فیزیكی است، تغییر كوچكی در یك كمیت معمولاً تغییر كوچكی در كمیت دیگری را برای آن به دنبال خواهد داشت، اما متأسفانه چنین قوانین كلی و سر راستی در جهان نرم‌افزار وجود ندارد و كسی نمی‌تواند از آزمون‌ها و مشاهدات موجود، نتیجه‌گیری مستقیم و قطعی داشته باشد. اگر بخشی از نرم‌افزار به درستی كار می‌كند، هیچ ربطی به نحوه كار بخش دیگری مشابه آن ندارد. دو بخش نرم‌افزار، اشیای گسسته و جدا از هم هستند.<br/><br/>در اولین روزهای ظهور علوم كامپیوتر، محققان امیدوار بودند برنامه‌نویسان هم بتوانند درست همان‌طور كه ریاضیدانان درستیِ قضیه‌هایشان را اثبات می‌كنند، درستی كدهایی را كه نوشته‌اند اثبات كنند. در آن زمان هیچ راهی برای خودكار‌سازی بررسی مراحل بی‌شمار این‌كار وجود نداشت و متخصصان مجبور بودند بخش اعظم كار را به صورت دستی انجام دهند؛ جز برای برنامه‌هایی كه از لحاظ پیچیدگی نسبتاً معمولی و از لحاظ اهمیت بسیار حیاتی بودند: مثلاً در الگوریتمی برای كنترل خطوط راه‌آهن، چنین روش‌های دشوار و دقیقی غیرعملی می‌نمود.<br/>در سال‌های اخیر محققان روش‌ كاملاً متفاوتی ابداع كرده‌اند كه از توانایی پردازنده‌های قوی امروزی برای آزمون تمام سناریو‌های ممكن بهره می‌گیرد.<br/><br/>این روش كه به آن چك‌كردن مدل (Model Checking) می‌گویند، در حال حاضر به طور گسترده برای بررسی طراحی مدارهای مجتمع به كار گرفته می‌شود. ایده این روش این است كه هر سلسله از وضعیت‌های ممكنی را كه یك سیستم در عمل ممكن است با آن روبه‌رو شود بررسی كنیم و مطمئن شویم كه هیچ یك از آن‌ها منجر به شكست سیستم نخواهد شد. منظور از وضعیت (State)، شرایط سیستم در هر زمان مشخص است. برای یك میكروچیپ تعداد وضعیت‌هایی كه باید بررسی شود، اغلب بسیار بزرگ است؛ چیزی حدود 10 به توان 100 یا بیشتر! بررسی وضعیت‌ها برای یك نرم‌افزار بسیار دشوارتر است. اما تكنیك‌های هوشمندانه‌ای بركدگذاری وجود دارد كه به كمك آن‌ها می‌توان مجموعه‌های بزرگی از وضعیت‌های یك نرم‌افزار را به طور خیلی فشرده بیان كرد. با استفاده از این تكنیك‌ها می‌توان این مجموعه‌های بزرگ را به طور همزمان بررسی كرد و به این ترتیب تمام وضعیت‌های ممكن یك نرم‌افزار را آزمایش كرد.<br/><br/>متأسفانه مدل فوق به تنهایی نمی‌تواند از عهده بررسی وضعیت‌هایی با ساختارهای پیچیده برآید. درحالی كه طراحی‌های نرم‌افزار اكثراً چنین ویژگی‌ای دارند. من و همكارانم شیوه‌ای ابداع كرده‌ایم كه از همان ایده بهره می‌گیرد، ولی سازوكار متفاوتی را به كار می‌بندد. شیوه ما هم مثل مدل checking تمام سناریو‌های ممكن برای یك سیستم را در نظر می‌گیرد. البته واقعیت این است كه برای این‌كه مسئله در حدود متناهی قرار بگیرد، مجبوریم مرزهایی برای آن در نظر بگیریم؛ چراكه نرم‌افزار همانند سخت‌افزار تابع محدودیت‌های فیزیكی نیست. با این حال تكنیك ما، برخلاف مدل چكینگ، سناریوهای مختلف را یكی یكی تا انتها بررسی نمی‌كند، بلكه سناریوی بد (سناریویی كه منجر به شكست خواهد شد) را جست وجو می‌كند. شیوه كار به این صورت است كه برنامه به صورت خودكار و بدون هیچ ترتیب مشخصی وضعیت‌های مختلف را یكی یكی كنار هم می‌گذارد تا نهایتاً به سناریویی برسد كه منجر به شكست سیستم خواهد شد.<br/><br/>این فرایند را تاحدی می‌توان با یك بازوی روباتیك مقایسه كرد كه قطعات مختلف یك پازل تصویری را كنار هم می‌چیند تا نهایتاً تصویر كامل به دست آید. اگر تصویر به دست آمده یك سناریوی بد را نشان دهد، Alloy به هدفش رسیده است. به این ترتیب Alloy تحلیل طراحی را مانند معمایی در نظر می‌گیرد كه باید حل شود. بعضی از نرم‌افزارهای دیگر مدل چكینگ كه اخیرا ساخته شده‌اند هم از چنین شیوه‌ای استفاده می‌كنند.<br/><br/>راه‌حل، یك پازل است!<br/><br/>برای این‌كه بفهمید Alloy چطور معمای طراحی نرم‌افزار را حل می‌كند، بد نیست به یك معمای قدیمی اشاره كنیم: یك كشاورز به بازار می‌رود و یك روباه، یك غاز، و یك كیسه ذرت می‌خرد. در راه برگشت به خانه، باید با قایق از یك رودخانه رد شود، ولی قایق در هر بار فقط می‌تواند او و فقط یكی از خریدهایش را ببرد. مشكل اینجاست كه اگر او نباشد، روباه غاز را می‌خورد و غاز ذرت را. حالا كشاورز چطور خرید‌هایش را سالم به آن طرف رودخانه ببرد؟<br/><br/>در این نوع معماها هدف یافتن سناریویی است كه با مجموعه‌ای از قیدها سازگار باشد. روش ما انسان‌ها برای حل اینگونه معماها این است كه مجموعه‌ای از مراحل را در ذهن خود تصور می‌كنیم: كشاورز اول غاز را می‌برد. بعد برمی‌گردد و روباه را می‌برد و این‌بار در برگشت غاز را با خود برمی‌گرداند. بعد غاز را می‌گذارد و ذرت را می‌برد و نهایتاً برمی‌گردد و غاز را می‌برد. با بررسی این‌كه آیا هر یك از مراحل با قیدها مطابقت دارد، ما مطمئن می‌شویم كه معما درست حل شده است.<br/><br/>در یك طراحی موفق نرم‌افزار هم، چنین قیدهایی وجود دارد، اگرچه بسیار پیچیده‌تر هستند. هدف یك ابزار بررسی طراحی این است كه مثال‌های نقض برای طراحی پیدا كند: یعنی راه حل‌هایی برای معما كه با همه قید‌های خوب مطابقت دارند (بنابراین وقتی برنامه اجرا می‌شود، می‌توانند اتفاق بیفتند) و علاوه بر آن حداقل با یك قید بد هم سازگارند (بنابراین می‌توانند منجر به نتیجه‌ای نامطلوب شوند).<br/><br/>هرگاه یك مثال نقض به این ترتیب پیدا شود، نشان‌دهنده خطا در طراحی است. بنابراین، اگرچه ابزارِ معماحل كن از پیدا كردن راه حل معمای كشاورز خوشحال می‌شود، جواب معمای طراحی نرم‌افزار خبر شادی‌بخشی نیست. چون نشان می‌دهد كه یك سناریوی نامطلوب وجود دارد و طراحی نرم‌افزار ایراد دارد.<br/><br/>در عمل، مثال‌ نقض ممكن است خودش مستقیماً به یك مشكل منجر نشود، بلكه ممكن است نشان دهد كه طراح از اول نتایج غیرقابل قبول را خوب مشخص نكرده است و ویژگی‌های آن‌ها را به درستی تعیین ننموده است. به هرحال، در هردو صورت چیزی باید اصلاح شود؛ یا خود طراحی، یا پیش‌فرض‌ها و انتظارات طراح.<br/><br/>هدف این است كه هریك از وضعیت‌هایی را كه نرم‌افزار ممكن است داشته باشد، شبیه‌سازی كنیم تا مطمئن شویم كه هیچ یك منجر به شكست نخواهد شد.<br/><br/><br/><br/>دشواری اصلی در جست‌وجو برای مثال‌های نقض این است كه تعداد سناریوهای بالقوه حتی در طراحی نرم‌افزاری با پیچیدگی متوسط، غالباً بسیار زیاد است، ولی فقط كسر بسیار كوچكی از این سناریوها مثال نقض هستند. فرض كنید می‌خواهید برنامه‌ریزی كنید كه در یك مهمانی عروسی چه كسی كنار چه كسی بنشیند. اگر همه حاضران با هم دوست باشند، راه حل چندان دشوار نیست.<br/><br/>اما اگر مثلاً چند نفر از آن‌ها قبلاً با هم دوست بوده‌اند و حالا با هم قهرند، نباید آن ها را كنار هم نشاند و این مسئله را سخت‌تر می‌كند. حالا تصور كنید كه مهمانی عروسی مال رومئو و ژولیت است.(1) اگر فقط بیست صندلی داشته باشیم و هریك از ده نفر مهمان بتواند آزادانه روی هر صندلی كه خواست بنشیند، تعداد تركیب‌های ممكن برابر 10 به توان 20 حالت خواهد بود. یك كامپیوتر حتی اگر بتواند در هر ثانیه یك میلیارد سناریو را بررسی كند، باز به سه‌هزار سال وقت برای بررسی همه حالت‌ها نیاز دارد.<br/><br/>در دهه 1980، محققان ریاضیات مسائلی از این دست را تحت عنوان كلاس خاصی از مسائل طبقه‌بندی كردند كه در بدترین حالت برای حل آن‌ها باید تمام حالت‌‌های ممكن را تك تك بررسی كرد، ولی در دهه گذشته با ابداع استراتژی‌ها و الگوریتم‌های جدید جست‌وجو و افزایش روزافزون قدرت محاسباتی، محققان ابزارهایی به اسم SAT solver (حل‌كننده SAT) ساخته‌اند كه می‌توانند چنین مسئله‌هایی را نسبتاً به آسانی حل كنند.(2) در حال حاضر انواع مختلفی از SAT solverها به صورت رایگان در دسترس هستند كه می‌توانند مسائلی با میلیون‌ها قید را حل كنند.<br/><br/>اهمیت انتزاعی عمل كردن‌<br/>Alloy (آلیاژ) همان‌طور كه از نامش پیداست، از تركیب دو عنصر برای كمك به قوی‌تر كردن طراحی نرم‌افزار بهره می‌گیرد. یكی از آن‌ها زبان جدیدی است كه به كمك آن می‌توان ساختار و رفتار نرم‌افزار را توضیح داد. دیگری تحلیلگر خودكاری است كه با استفاده از یك SAT solver تمام سناریوهای ممكن را بررسی می‌كند.<br/>اولین مرحله در استفاده از Alloy، ساختن یك مدل از طرح نرم‌افزار است.<br/><br/>منظور از مدل یك طرح ابتدایی یا فلوچارت‌هایی نیست كه معمولاً مهندسان نرم‌‌افزار به كار می‌گیرند، بلكه منظور یك مدل دقیق است كه به تفصیل، تمام اجزا نرم‌افزار را شرح می‌دهد و رفتارهای آن‌ها را اعم از مطلوب و نامطلوب مشخص می‌كند. طراح نرم‌افزار ابتدا تعریفی از تمام اشیای مختلف موجود در طرح می‌نویسد و بعد این اشیا را در مجموعه‌های ریاضی دسته‌بندی می‌كند. مجموعه، یعنی دسته‌ای از اشیا كه ساختار و رفتار مشابه دارند (مثلاً همه از خانواده كاپولت هستند) و با روابط ریاضی به هم مرتبطند (مثلاً رابطه‌ بین مهمان‌هایی كه می‌توانند كنار‌هم بنشینند.)<br/><br/>پس از آن، واقعیت‌ها (fact) بیان می‌شوند كه مجموعه‌ها و رابطه‌ها را محدود می‌كنند. در طراحی نرم‌افزار واقعیت‌ها شامل مكانیسم‌های سیستم نرم‌افزاری و فرض‌هایی درباره دیگر اجزا است (مثلاً گزاره‌هایی درباره رفتار احتمالی كاربران سیستم). بعضی از این واقعیت‌ها فرض‌های واضحی هستند (مثلاً این‌كه هیچ كس نمی‌تواند هم كاپولت و هم مونتاگو باشد و این‌كه هر مهمان دقیقاً در كنار دو مهمان دیگر خواهد نشست) و بعضی از آن‌ها از خود طراحی ناشی می‌شوند؛ برای نمونه در مثال ما، این قانون كه هر میز، جز میز بالا‌ی مجلس، باید فقط به اعضای یك خانواده اختصاص داشته باشد.<br/><br/>نهایتاً، حكم‌ها (assertion) قرار می‌گیرند كه قیدهایی هستند كه از واقعیت‌ها ناشی می‌شوند.به عنون نمونه در مثال ما، جز رومئو و ژولیت، هیچ كاپولتی نباید كنار یك مونتاگو بنشیند. حكم‌ها می‌گویند كه سیستم هرگز نمی‌تواند دچار بعضی وضعیت‌های نامطلوب شود و سلسله‌های مشخصی از رویدادهای بد، هرگز نمی‌توانند اتفاق بیفتند.<br/><br/>بخش تحلیلگر Alloy برای یافتن مثال‌های نقض از یك SAT solver استفاده می‌كند. مثال‌های نقض سناریوهای احتمالی در یك سیستم نرم‌افزاری هستند كه طراحی سیستم اجازه رخ دادن آن‌ها را می‌دهد، ولی نمی‌توانند آزمون درستی (sanity check) را پشت سر بگذارند. آزمون درستی با نوشتن حكم‌هایی كه اگر طراحی مدل درست باشد، مقدار آن‌ها درست (True) می‌شود، انجام می‌شود. به زبان دیگر، این ابزار سعی می‌كند شرایطی را پدید آورد كه با واقعیت‌ها مطابقت دارند، ولی حداقل یك حكم بیان شده را زیر پا می‌گذارند. مثلاً در مثال ما، ممكن است ترتیبی برای نشستن افراد پیدا كند كه طی آن در میز بالا‌ی مجلس یك كاپولت (غیر از ژولیت) كنار یك مونتاگو (غیر از رومئو) بنشیند. برای این‌كه جلوی رخ دادن چنین سناریویی را بگیریم، می‌توانیم در طرح نرم‌افزارمان یك واقعیت جدید اضافه كنیم: فقط رومئو و ژولیت پشت میز بالا‌ی مجلس می‌نشینند. حالا دیگر Alloy نمی‌تواند مثال نقضی پیدا كند.<br/><br/>به كمك Alloy مشكلات جدی موجود در بعضی از طرح‌های نرم‌افزاری موجود مشخص شده است. مشخص كردن مجموعه‌ها، رابطه‌ها، واقعیت‌ها، و حكم‌ها به اتفاق، یك انتزاع می‌سازد كه یك طرح نرم‌افزاری را دقیقاً شرح می‌دهد. نوشتن تمام این‌ها با دقت و به تفصیل موجب آشكار شدن ایرادات طراحی می‌شود و مهندسان مجبور می‌شوند درباره این‌كه چه انتزاعی (abstraction) مناسب‌تر است، بیشتر فكر كنند. اساس بسیاری از سیستم‌های نامطمئن و بیش از حد پیچیده به انتخاب انتزاعی غلط باز می‌گردد.<br/><br/>در مقابل، اگر دقت كنیم، می‌بینیم كه سیستم‌هایی كه در آن‌ها نرم‌افزار بر اساس یك انتزاعی ساده و قوی ساخته شده است، نه تنها قوی‌ترند، بلكه حتی استفاده از آن‌ها هم ساده‌تر است. مثلا ًe-Ticketing را در نظر بگیرید كه چطور مسافرت‌های هوایی را راحت‌تر كرده است یا كد جهانی كالا (UPC) كه چطور موجب سهولت فروش شده است، یا تلفن‌های معاف از مالیات با پیش‌شماره هشتصد كه تله‌كنفرانس را ساده‌تر ساخته‌اند. در تمام این نوآوری‌ها شاهد تحولی در انتزاعی هستیم كه نرم‌افزار بر اساس آن ساخته شده است.<br/><br/>قابلیت اطمینان نرم‌افزارها در آینده‌<br/>در حال حاضر ابزارهایی مثل Alloy بیشتر در تحقیقات و سیستم‌های صنعتی فوق پیشرفته به كار گرفته می‌شوند. این فناوری برای بررسی معماری‌های جدید در سیستم‌های سوییچینگ تلفن، برای طراحی پردازنده‌های به كار رفته در صنعت هوانوردی و سیستم‌های ایمن در مقابل حمله هكرها، و برای وضع سیاست‌‌های كنترل دسترسی در شبكه‌های ارتباطاتی به كار گرفته شده است.<br/><br/>همچنین با استفاده از این فناوری برخی مكانیسم‌های نرم‌افزاری مهم و پر استفاده را نیز بررسی كردیم؛ برای مثال، پروتكل‌هایی كه برای یافتن چاپگرها در شبكه به كار می‌روند یا ابزارهایی برای همزمان‌سازی فایل‌ها بین كامپیوترهای مختلف.<br/><br/>علاوه بر این، Alloy برخی مشكلات جدی‌ در طراحی نرم‌افزارهای موجود را نیز آشكار كرده است. از جمله یك پروتكل مهم مدیریتی كه می‌بایست بر اساس عضویت در گروه‌ها، قوانین دسترسی مخصوصی را اعمال می‌كرد، ولی ممكن بود به اعضای سابق یك گروه كه باید دسترسی آن‌ها منع می‌شد نیز مجوز بدهد. قابل‌توجه است كه بسیاری از برنامه‌نویسانی كه از Alloy استفاده كردند، از تعداد خطاهای طراحی‌ای كه این ابزار حتی در ساده‌ترین برنامه‌های آن‌ها پیدا كرد، شگفت زده شدند.<br/><br/>ابزارهایی مثل Alloy به احتمال زیاد در آینده به طور گسترده‌تری در صنعت به كار گرفته خواهند شد. با بهبود SAT solver‌های به كار رفته در این ابزارها، آن‌ها می‌توانند سیستم‌های بزرگ‌تر را بهتر و سریع‌تر بررسی كنند. در عین حال نسل جدید طراحان نرم‌افزار كه با این روش‌ها آشنایی دارند، از آن‌ها در كار خود استفاده خواهند كرد. در حال حاضر استفاده از مدلینگ رو به گسترش است؛ به‌ویژه از سوی مدیرانی كه دوست دارند برای توصیف یك نرم‌افزار چیزی بیشتر از كد برنامه آن را ببینند.<br/><br/>به هر حال روزی خواهد رسید كه نرم‌افزار چنان در تار و پود زندگی روزمره ما رسوخ كند كه جامعه دیگر پذیرای نرم‌افزار بد نباشد. در نتیجه دولت‌ها از هم اكنون باید به فكر وضع استانداردها، مقررات و مجوزهایی باشند كه استفاده از تكنیك‌های پیشرفته و ساخت نرم‌افزارهای با كیفیت را الزام‌آور سازند. بالاخره روزی تمام سیستم‌های نرم‌افزاری واقعاً قابل اعتماد، قابل پیش بینی و سهل‌الاستفاده خواهند بود و این ویژگی‌ها را از همان اولین قدم، یعنی مرحله طراحی خواهند داشت.<br/><br/>پی‌نوشت‌:<br/>1- رومئو و ژولیت از دو خانواده به اسم كاپولت‌ها و مونتاگوها بودند كه با هم اختلا‌ف داشتند.<br/>2- SAT از اصطلاح satisfiability (انجام‌پذیری) در منطق گزاره‌ای گرفته شده است. </p> </div> </div> </div> </div> </div> </div> <script type="text/javascript"> $(document).ready(function () { $("a[href='#top']").click(function () { $("html, body").animate({ scrollTop: 0 }, "slow"); return false; }); function getQueryParameterByName(name) { name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); name = name.toLowerCase(); var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var href = window.location.search.toLowerCase(); var results = regex.exec(href); if (results == null) return ""; else return decodeURIComponent(results[1].replace(/\+/g, " ")); } $("#drp_jumper").val("newindex.aspx?pid=17258&forumID=" + getQueryParameterByName('forumID')); }); </script> <div class="gotoforum"> <span>برو به انجمن</span> <select onchange="window.open(this.options[this.selectedIndex].value,'_top')" style="height: 20px" id="drp_jumper"> <option value='newindex.aspx?pid=17258&forumID=996'>آموزش الکترونیکی</option> <option value='newindex.aspx?pid=17258&forumID=1001'>آموزش بورس</option> <option value='newindex.aspx?pid=17258&forumID=470'>اجتماعي</option> <option value='newindex.aspx?pid=17258&forumID=468'>ادب و هنر</option> <option value='newindex.aspx?pid=17258&forumID=452'>ادبيـــات</option> <option value='newindex.aspx?pid=17258&forumID=456'>ارتباطات و فن آوری اطلاعات</option> <option value='newindex.aspx?pid=17258&forumID=1018'>امر به معروف؛نهی از منکر</option> <option value='newindex.aspx?pid=17258&forumID=968'>امور تربیتی</option> <option value='newindex.aspx?pid=17258&forumID=888'>انگليسي</option> <option value='newindex.aspx?pid=17258&forumID=988'>ایران سرای من</option> <option value='newindex.aspx?pid=17258&forumID=965'>برق </option> <option value='newindex.aspx?pid=17258&forumID=1000'>بورس</option> <option value='newindex.aspx?pid=17258&forumID=723'>بهداشت و سلامت</option> <option value='newindex.aspx?pid=17258&forumID=985'>پاسخ به شبهات </option> <option value='newindex.aspx?pid=17258&forumID=987'>پژوهش های دانش آموزی </option> <option value='newindex.aspx?pid=17258&forumID=460'>تجارت و بازرگاني</option> <option value='newindex.aspx?pid=17258&forumID=457'>تعلیم و تربیت</option> <option value='newindex.aspx?pid=17258&forumID=997'>جراحان</option> <option value='newindex.aspx?pid=17258&forumID=461'>حوزه علميه</option> <option value='newindex.aspx?pid=17258&forumID=459'>خانواده</option> <option value='newindex.aspx?pid=17258&forumID=966'>خراسان</option> <option value='newindex.aspx?pid=17258&forumID=964'>خودرو</option> <option value='newindex.aspx?pid=17258&forumID=469'>دانش آموزی</option> <option value='newindex.aspx?pid=17258&forumID=467'>دانش و فن آوری</option> <option value='newindex.aspx?pid=17258&forumID=957'>دانشجویی</option> <option value='newindex.aspx?pid=17258&forumID=962'>دانلود</option> <option value='newindex.aspx?pid=17258&forumID=465'>روانشناسي</option> <option value='newindex.aspx?pid=17258&forumID=722'>زن ریحانه آفرینش</option> <option value='newindex.aspx?pid=17258&forumID=721'>سياسي</option> <option value='newindex.aspx?pid=17258&forumID=454'>سينما و تلویزیون</option> <option value='newindex.aspx?pid=17258&forumID=984'>شمال</option> <option value='newindex.aspx?pid=17258&forumID=466'>صندلی داغ</option> <option value='newindex.aspx?pid=17258&forumID=725'>طنز و سرگرمی</option> <option value='newindex.aspx?pid=17258&forumID=976'>عکس و عکاسي</option> <option value='newindex.aspx?pid=17258&forumID=961'>عمومی</option> <option value='newindex.aspx?pid=17258&forumID=458'>فرهنگ پایداری</option> <option value='newindex.aspx?pid=17258&forumID=455'>قرآن و عترت</option> <option value='newindex.aspx?pid=17258&forumID=464'>کارآفرینی</option> <option value='newindex.aspx?pid=17258&forumID=994'>کامپیوتر</option> <option value='newindex.aspx?pid=17258&forumID=982'>کتاب و کتابخوانی</option> <option value='newindex.aspx?pid=17258&forumID=975'>گرافیک</option> <option value='newindex.aspx?pid=17258&forumID=981'>مدیریت</option> <option value='newindex.aspx?pid=17258&forumID=451'>معارف</option> <option value='newindex.aspx?pid=17258&forumID=999'>مقاومت اسلامی</option> <option value='newindex.aspx?pid=17258&forumID=949'>مکانیک</option> <option value='newindex.aspx?pid=17258&forumID=983'>موبایل</option> <option value='newindex.aspx?pid=17258&forumID=969'>مهدویت</option> <option value='newindex.aspx?pid=17258&forumID=887'>نجوم</option> <option value='newindex.aspx?pid=17258&forumID=958'>نصف جهان</option> <option value='newindex.aspx?pid=17258&forumID=991'>وبلاگ نویسان </option> <option value='newindex.aspx?pid=17258&forumID=453'>ورزش و تندرستی</option> </select> <div style="float:left"><a href="#top" style="color:White;font-size:20px;padding-left:5px;display:block;margin-top:-4px">▲</a></div> </div> </div> </div> </div> <div id="ctl100_pnlLeftPanel" class="lefttpanel"> <style> @media only screen and (min-width:780px) { .NativeAds{width:205px;float:left;padding:5px} } @media only screen and (max-width:780px) { .NativeAds{width:100%} } </style> <script id="nativeAds" type="text/x-jQuery-tmpl"> <div id="${Link}"></div> </script> <div id="GeneralDivLeft"> <div id="ctl100_ctl01_ctl00_pnlRandom" style="display:none"> <div class="LeftPanelBox"> <div class="LPBRA"> </div> <div class="LPBCA"> </div> <div class="LPBLA"> </div> <div class="LPBMA"> <ul> <li> <a href='/Advertisement/RedirectNew.aspx?advID=28772&link=http%3a%2f%2fbashgah.tebyan.net%2fnewindex.aspx%3fpid%3d123436' target="_blank"> <img alt="کاربران برتر" width="160px" height="60px" src="http://img.tebyan.net/mainParts/persian/services/Advertisement/2015/2/3/New_28772.jpg"/> </a> </li> <li> <a href='/Advertisement/RedirectNew.aspx?advID=27022&link=http%3a%2f%2fbashgah.tebyan.net%2fnewindex.aspx%3fpid%3d240165' target="_blank"> <img alt="می‌تکانم خانه را چون زلزله!" width="160px" height="60px" src="http://img.tebyan.net/mainParts/persian/services/Advertisement/2014/2/24/New_27022.jpg"/> </a> </li> <li> <a href='/Advertisement/RedirectNew.aspx?advID=23644&link=http%3a%2f%2fdownload.tebyan.net' target="_blank"> <img alt="بهترين‌ها را از تبيان دانلود كنيد" width="160px" height="60px" src="http://img.tebyan.net/mainParts/persian/services/Advertisement/2012/10/28/New_23644.jpg"/> </a> </li> <li> <a href='/Advertisement/RedirectNew.aspx?advID=3231&link=http%3a%2f%2fwww.tebyan.net%2findex.aspx%3fpid%3d935' target="_blank"> <img alt="ثبت مطالب روزانه" width="160px" height="60px" src="http://img.tebyan.net/mainParts/persian/services/Advertisement/old/adv_231.jpg"/> </a> </li> </ul> </div> <div class="LPBBR"> </div> <div class="LPBBC"> </div> <div class="LPBBL"> </div> </div> </div> <div id="ctl100_ctl01_ctl03_pnl1"> <div class="LeftPanelBox"> <div class="LPBR"> </div> <div class="LPBC"> دسترسی‌های سریع </div> <div class="LPBL"> </div> <div class="LPBMJ"> <ul> <li style="min-height: 10px; min-width:100px"><span class="BB" style="float: right"></span><a href='http://anjoman.tebyan.net/index.aspx?pid=17257&threadID=246954'> اساسنامه انجمن‌ها </a></li> <li style="min-height: 10px; min-width:100px"><span class="BB" style="float: right"></span><a href='http://anjoman.tebyan.net/index.aspx?pid=46548'> جستجوی پیشرفته </a></li> <li style="min-height: 10px; min-width:100px"><span class="BB" style="float: right"></span><a href='http://anjoman.tebyan.net/index.aspx?pid=44575'> مشخصات من </a></li> <li style="min-height: 10px; min-width:100px"><span class="BB" style="float: right"></span><a href='http://anjoman.tebyan.net/index.aspx?pid=17353'> مباحث من </a></li> <li style="min-height: 10px; min-width:100px"><span class="BB" style="float: right"></span><a href='http://anjoman.tebyan.net/index.aspx?pid=17354'> پاسخ‌های من </a></li> </ul> </div> <div class="LPBBR"> </div> <div class="LPBBC"> </div> <div class="LPBBL"> </div> </div> </div> <div class="LeftPanelBox"> <div class="LPBR"> </div> <div class="LPBC"> انجمن فعال در هفته گذشته</div> <div class="LPBL"> </div> <div class="LPBM"> <ul> </ul> </div> <div class="LPBBR"> </div> <div class="LPBBC"> </div> <div class="LPBBL"> </div> </div> <div class="LeftPanelBox"> <div class="LPBR"> </div> <div class="LPBC"> مدیر فعال در هفته گذشته</div> <div class="LPBL"> </div> <div class="LPBM"> <ul> </ul> </div> <div class="LPBBR"> </div> <div class="LPBBC"> </div> <div class="LPBBL"> </div> </div> <div class="LeftPanelBox"> <div class="LPBR"></div> <div class="LPBC">آخرین مطالب</div> <div class="LPBL"></div> <div class="LPBMJ"> <ul> <li style="text-align:justify"> <div><img style="width:40px; height:40px" src='http://Img.Tebyan.net/small/1393/06/65160179199219232245401351854623467605622.jpg' /></div> <a title='آلبوم تصاویر بازدید از کلیسای جلفای اصفهان' href='/index.aspx?pid=283668'> آلبوم تصاویر بازدید از کلیسای جلفای... </a><br /> آلبوم تصاویر بازدید اعضای انجمن نصف جهان از کلیسای جلفای اصفهان. </li> <li class="T" style="text-align:justify"> <div><img style="width:40px; height:40px" src='http://Img.Tebyan.net/small/1393/06/51810010023622621218220420913520981152250207.jpg' /></div> <a title='بازدید از زیباترین کلیسای جلفای اصفهان' href='/index.aspx?pid=283666'> بازدید از زیباترین کلیسای جلفای اصفهان </a> <br /> جمعی از کاربران انجمن نصف جهان، در روز 27 مردادماه با همکاری دفتر تبیان اصفهان، بازدیدی را از کلیسای وانک، به عمل آورده‌اند. این کلیسا، یکی از کلیساهای تاریخی اصفهان به شمار می‌رود. </li> <li style="text-align:justify"> <div><img style="width:40px; height:40px" src='http://Img.Tebyan.net/small/1392/04/1803481618084237931945092569014914648.gif' /></div> <a title='اعضای انجمن در خانه شهید بهشتی' href='/index.aspx?pid=267668'> اعضای انجمن در خانه شهید بهشتی </a><br /> خانه پدری آیت الله دکتر بهشتی در اصفهان، امروزه به نام موزه و خانه فرهنگ شهید نام‌گذاری شده است. اعضای انجمن نصف جهان، در بازدید دیگر خود، قدم به خانه شهید بهشتی گذاشته‌اند. </li> <li class="T" style="text-align:justify"> <div><img style="width:40px; height:40px" src='http://Img.Tebyan.net/small/1392/05/995943147105116154327121553711731991442.jpg' /></div> <a title='اطلاعیه برندگان جشنواره انجمن‌ها' href='/index.aspx?pid=262332'> اطلاعیه برندگان جشنواره انجمن‌ها </a> <br /> پس از دو ماه رقابت فشرده بین کاربران فعال انجمن‌ها، جشنواره تابستان 92 با برگزاری 5 مسابقه متنوع در تاریخ 15 مهرماه به پایان رسید و هم‌اینک، زمان اعلام برندگان نهایی این مسابقات فرارسیده است. </li> <li style="text-align:justify"> <div><img style="width:40px; height:40px" src='http://Img.Tebyan.net/small/1392/08/170117137148203818870145647251717480104.jpg' /></div> <a title='نصف جهانی‌ها در مقبره علامه مجلسی' href='/index.aspx?pid=261286'> نصف جهانی‌ها در مقبره علامه مجلسی </a><br /> اعضای انجمن نصف جهان، در یك گردهمایی دیگر، از آرامگاه علامه مجلسی و میدان احیا شده‌ی امام علی (ع) اصفهان، بازدیدی را به عمل آوردند. </li> </ul> </div> <div class="LPBBR"></div> <div class="LPBBC"></div> <div class="LPBBL"></div> </div> </div> <script type="text/javascript"> CrossGet("https://api.tebyan.net/api/Advertisment/GetCollection", {MenuPartID:493, MenuID:0, ArticleID:0, PanelID:5, Width:180, Height:1}, function (data) { if(data !=null && data.length>0) { for(var i in data) { var adv = $('<li class="ItemSua"><a href="'+data[i].Link+'" title="'+data[i].Title+'" target="_blank">'+data[i].Title+'</a></li>'); $('.js_webgardi').append(adv); } } else{$('.js_webgardi').hide();} }, null, false); function addTebyanAds(BoxIDAds, obj) { if (obj.length) { CrossGet("https://api.tebyan.net/api/TemplatePageBox/GetBoxesPlus?BoxIDs=" + BoxIDAds, {}, function (data) { if (data !== null) { for (var i = 0; i < data.length; i++) { if (data[i].Items.length > 0) { obj.append('<div id='+data[i].Items[0].Link+'></div>'); } } $("#Context").append(obj.detach()); $.getScript("https://src.tebyan.net/gen/js/plugin/stickysidebarii/StickySidebar.js", function () { obj.theiaStickySidebar({ additionalMarginTop: 0, updateSidebarHeight: false }); }); } }, null, false); } } addTebyanAds(BoxIDAds, $(".js_NativeAds")); </script> </div> </div> </div> </div> <div class="footer footerMV"> <div class="countvisitors"> <div class="insidecv"> <div class="maintitleicv">تعدادبازدیدکنندگان</div> <div> <div> <div class="titleicv">تاکنون</div> <div class="js_CountVisite numberscv"></div> </div> </div> <div> <div> <div class="titleicv">اکنون</div> <div class="js_OnlineUserCount numberscv"></div> </div> </div> </div> </div> <div class="linksf"> <ul class="insidelf"> <li><a href="https://www.tebyan.net/index.aspx?pid=264456">روابط عمومی</a></li> <li>-</li> <li><a href="https://www.tebyan.net/index.aspx">صفحه اصلی</a></li> <li>-</li> <li><a href="https://www.tebyan.net/index.aspx?pid=18359">نقشه سایت</a></li> <li>-</li> <li><a href="https://www.tebyan.net/index.aspx?pid=5108">درباره ما</a></li> <li>-</li> <li><a href="https://www.tebyan.net/index.aspx?pid=5114">ارتباط با ما</a></li> <li>-</li> <li><a href="https://www.tebyan.net/rss/rss.htm"><img src="https://img.tebyan.net/Ts/rss.gif" /></a></li> </ul> </div> <div class="copyright"> Copyright © 2012 . All right reserved </div> <div class="centerfooterimage"></div> </div> <link type="text/css" rel="stylesheet" href="https://src.tebyan.net/gen/css/ShowPopupAdver.css?seed=1397-03-10" /> <link type="text/css" rel="stylesheet" href="https://src.tebyan.net/gen/css/rtl/ShowPopupAdver.css?seed=13-06-2017" /> <script type="text/javascript"> function ClosePopupAdv() { $(".js_PopupAdvClass").fadeOut(500); } $(function () { $("body").delegate('.js_PopupAdvClass_close', 'click', function () { ClosePopupAdv(); }); $('body').click(function (e) { if (!$(e.target).closest('.js_ShyPopupAdv').length) ClosePopupAdv(); }); }); function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } function createCookie(name, value, days) { if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); var expires = "; expires=" + date.toGMTString(); } else { var expires = ""; } document.cookie = name + "=" + value + expires + ";domain=.tebyan.net;path=/"; } function ShowPopup() { var AdsHtml = ''; CrossGet("https://api.tebyan.net/api/Advertisment/GetGetPopupAdver_ADV?MenuPartID=493&MenuID=576&ArticleID=17257", {}, function (data) { if (data != null) { if ($.isEmptyObject(getCookie("AdvCookie_" + data.AdvertisementID))) { AdsHtml = '<div id="ScriptDiv" class="js_PopupAdvClass js_ShyPopupAdv PopupAdvClass" style="display: none;">' + '<div class="PopupAdvClass_head">' + //'<span class="js_PopupAdvClass_headtitle PopupAdvClass_headtitle">' + data.Title + '</span>' + '<span class="js_PopupAdvClass_close PopupAdvClass_close"> × </span>' + '</div>' + '<span class="js_lblpopub lblpopub"><a href="http://www.tebyan.net/Advertisement/RedirectNew.aspx?advID=' + data.AdvertisementID + "&link=" + data.Link + '" target="_blank">' + data.LastHtmlSource + '</a></span>' + '</div>'; $('body').append(AdsHtml); $(".js_PopupAdvClass").show(function () { { var name = "AdvCookie_" + data.AdvertisementID; createCookie(name, data.AdvertisementID, 1); } }); } } }, null, false); } //var time = new Date().getHours(); //if (time >= 0 && time <= 6) if (1 != 4 && 1 != 1) { ShowPopup(); } </script> <div> <input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="63A21F34" /> </div></form> </div> <script> let MobileStructerAds = '<div class="h_iframe-sabavision_responsive_ads" id="sabavision_responsive_fixed_428">' + '<div onclick="document.getElementById("sabavision_responsive_fixed_428").parentNode.removeChild(document.getElementById("sabavision_responsive_fixed_428"));" style="background-color: red;z-index: 9999;position: absolute;font-size: 25px;right: -10px;top: -16px;border-radius: 100%;width: 35px;height: 30px;text-align: center;color: #fff;padding-bottom: 5px;font-family: Tahoma;">x</div>' + '<span style="display: block;padding-top: 13%"></span>' + '<iframe frameborder="0" src="https://api.sabavision.com/pox/?w=468&h=60&id=59&responsive=yes" scrolling="No"></iframe>' + '</div>'; let SabaMobileAds = function () { $("body").append(MobileStructerAds); function removeElement(element) { element && element.parentNode && element.parentNode.removeChild(element); } if (!(navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i) || navigator.userAgent.match(/Windows Phone/i))) { removeElement(document.getElementById('sabavision_responsive_fixed_428')); } }; </script> <script type="text/javascript" src="https://src.tebyan.net/proj/teb/js/maincommon/ArticleScriptPack.js?seed=2024/04/19-22:59:24"></script> <script type="text/javascript"> _atrk_opts = { atrk_acct: "DtGht1FYxz20cv", domain: "tebyan.com", dynamic: true }; (function () { var as = document.createElement('script'); as.type = 'text/javascript'; as.async = true; as.src = "https://certify-js.alexametrics.com/atrk.js"; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(as, s); })(); </script> <noscript> <img src="https://certify.alexametrics.com/atrk.gif?account=DtGht1FYxz20cv" style="display:none" height="1" width="1" alt="" /> </noscript> <script> var SwitchImg1 = 'false'; var IsIran = true; (function (h, o, t, j, a, r) { h.hj = h.hj || function () { (h.hj.q = h.hj.q || []).push(arguments) }; h._hjSettings = { hjid: 1624629, hjsv: 6 }; a = o.getElementsByTagName('head')[0]; r = o.createElement('script'); r.async = 1; r.src = t + h._hjSettings.hjid + j + h._hjSettings.hjsv; a.appendChild(r); })(window, document, 'https://static.hotjar.com/c/hotjar-', '.js?sv='); </script> <script type="text/javascript"> function log() { } $(document).ready(function () { $('a[href*="/index.aspx"]').each(function () { $(this).attr('href', $(this).attr('href').replace(/\/index.aspx/gi, '/newindex.aspx')); }); $('a[href$=".html"]').each(function () { if ($(this).attr('href').match(/.*\/[0-9]{1,}.html/gi)) $(this).attr('href', $(this).attr('href').replace(/.*\/(.*?).html/gi, '/newindex.aspx?pid=$1')); }); $('a[href^="index.aspx"]').each(function () { $(this).attr('href', $(this).attr('href').replace(/index.aspx/gi, '/newindex.aspx')); }); }); </script> <script type="text/javascript"> if (document.location.hostname != 'localhost') { try { (function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); ga('create', 'UA-1063144-1', 'auto'); ga('require', 'linkid'); ga('send', 'pageview'); } catch (err) { } } </script> </div> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Organization", "url": "http://www.tebyan.net", "logo": "http://www.tebyan.net/tebyan.png", "contactPoint" : [{ "@type" : "ContactPoint", "telephone" : "+98-021-81200000", "contactType" : "customer service", "areaServed" :"IR", "availableLanguage" : [ "English","العربیة","اردو","فارسی","کوردی","Türkçe","Русский","Français" ] }] } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "WebSite", "url": "http://www.tebyan.net", "potentialAction": { "@type": "SearchAction", "target": "http://www.tebyan.net/newindex.aspx?pid=19608&keyword={search_term_string}", "query-input": "required name=search_term_string" } } </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "WebSite", "name": "tebyan", "alternateName": "موسسه فرهنگی و اطلاع رسانی تبیان", "url": "http://www.tebyan.net" } </script> </body> </html>